Skip to content

feat: integrate upstream T3 Code improvements into Phoenix - #110

Merged
roughcoder merged 879 commits into
mainfrom
chore/sync-upstream-2026-09-12
Sep 13, 2026
Merged

roughcoder merged 879 commits into
mainfrom
chore/sync-upstream-2026-09-12

Conversation

@roughcoder

@roughcoder roughcoder commented Sep 12, 2026 •

Copy link
Copy Markdown

Phoenix had diverged from upstream across providers, clients and orchestration. This integrates upstream through b1e223e2b0 while preserving Phoenix queues, reports, schedules, provider routing, failover and direct remote connections.

The resulting implementation:

  • Combines provider, composer, device/capture and Android improvements; repairs persistence decoding, stale-turn recovery and durable command admission.
  • Defaults to Attention ordering, switches deliberate rearrangements to Manual, and keeps PR indicators scoped to their owning thread.
  • Corrects usage pricing, unknown-cost presentation, account classification, refresh behavior and model-price editing.
  • Removes Clerk and managed Connect runtime/dependencies. Direct HTTP/Tailscale pairing, bearer/cookie/SSH and proof-bound pairing remain. Historical connection records are preserved as explicitly unsupported; obsolete managed credentials are cleared.
  • Retains reusable native notifications, Live Activity widgets and APNs/FCM utilities. Remote notification delivery remains unavailable without a separately implemented backend; no replacement push service is claimed.
  • Makes releases manual, removes unused deployment/review integrations and marketing, retains the optional web client and repairs the devcontainer. Apple signing/notarization remains supported without Clerk-specific passkey configuration.

Validation at reviewed HEAD aff65bd633:

  • GitHub Check passed knip, formatting/lint, typecheck, hosted-web configuration tests, desktop build and preload verification. Non-server tests, all three server test shards, Rust and Release Smoke passed.
  • Independent Fable review of the final hosted-link/workflow changes is clean: 68 focused web tests and web typecheck passed; all consumers were traced. Earlier independent reviews and fixes covered the broader integration.
  • The obsolete PR-size label job still fails because it executes the base-branch workflow. This PR deletes that workflow at maintainer request.
  • Browser/device acceptance, signed release execution and devcontainer runtime smoke were not performed. Native static analysis and preview builds were skipped. These limits were disclosed before conditional merge authorization.
  • Non-blocking documentation nit: CONTRIBUTING.md still describes automatic size labeling; the workflow itself is deleted.

Implementation and integration: Codex through Phoenix. Independent reviews: Codex Astra, Terra and Sol, plus OpenCode DeepSeek, Grok and Kimi through Phoenix.

t3-code-bot Bot and others added 30 commits September 7, 2026 17:24
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Dara Adedeji <[email protected]>
Co-authored-by: Dara Adedeji <[email protected]>
Co-authored-by: Wout Stiens <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Fable 5.1 <[email protected]>
…surviving consumer

With the managed relay product removed, nothing reads the baked-in relay URL
or relay-client tracing values anymore. Verified against the combined branch:
no T3CODE_RELAY_URL / VITE_T3CODE_RELAY_URL / *RELAY_CLIENT_OTLP* /
VITE_RELAY_OTLP_* consumer remains in apps, packages, or infra.

- scripts/lib/public-config.ts no longer resolves or projects the relay URL
  (T3CODE_RELAY_URL -> VITE_T3CODE_RELAY_URL) or the relay client OTLP tuple
  (T3CODE_RELAY_CLIENT_OTLP_TRACES_* -> VITE_RELAY_OTLP_*). Explicitly set
  values still pass through the env merge for local tooling; general mobile
  OTLP tracing (T3CODE_MOBILE_OTLP_TRACES_* -> EXPO_PUBLIC_OTLP_TRACES_*) is
  unchanged, as are direct endpoint settings. A regression test pins the
  removed projections.
- release.yml drops the relay_url output, the per-job T3CODE_RELAY_URL env,
  and the Vercel --build-env relay arg; public_config validates only the
  explicit hosted-web targets and the npm trusted-publisher gate.
- release-public-config.cjs loses the now-outputless relay validation.
- release.md documents that the release workflow needs no relay/Cloudflare/
  PlanetScale/Axiom configuration.
- release-smoke.ts stops copying infra/relay/package.json: the managed relay
  removal gutted infra/relay to its historical migrations, so the fixture no
  longer has that manifest to version.

Verified: scripts suite 300/300 (includes rewritten public-config tests),
scripts typecheck clean, node --test .github/scripts/release-public-config.test.cjs
passes, and the release-smoke lockfile-less resolution succeeds once the
root's stale @clerk/expo patchedDependencies entry is removed (parent-owned;
simulated in a fixture copy only).

Model: kimi-k3 (OpenCode), Phoenix orchestration child session.
@roughcoder
roughcoder marked this pull request as ready for review September 13, 2026 12:52
@roughcoder
roughcoder merged commit 646ebee into main Sep 13, 2026
16 of 17 checks passed
roughcoder added a commit that referenced this pull request Sep 28, 2026
…llback

Picking another account on a started thread is meant to hand the thread to the
migration flow. Instead every other account is greyed out with "<name> is
unavailable in this thread. Start a new thread to switch providers."

PR #45 removed that lock by nulling lockedProvider in ChatView. The upstream
integration merge d185ed5 (PR #110) resolved ChatView.tsx in favour of its
upstream parent, which never carried #45, so deriveLockedProvider came back and
the lock with it. Only the wiring was lost: ThreadMigrationDialog, the
usage-limit entry point and getStartedThreadModelChangeBlockReason's
cross-instance allowance all survived, and docs/user/switching-accounts.md still
tells users to pick a model from a different account in the picker — so the
shipped build contradicted its own documentation.

Do not restore #45 verbatim. That flag feeds two consumers with different jobs:
ProviderModelPicker, which decides what is selectable, and
resolveComposerProviderSelection, which decides what the composer resolves to.
Nulling both reopens a hole upstream closed in d92dca7 ("resume imported
custom-provider threads", pingdotgg#10184) after #45 was written: without the lock,
compatibleEntries stops being filtered by driver, so a started thread whose
account is disabled or missing from the catalog falls through to any selectable
entry — including another driver. The composer then displays that driver while
resolveNextTurnModelSelection still sends on the thread's own instance, because a
started thread keeps threadModelSelection whenever the requested instance
differs. Displayed provider and running provider disagree.

So unlock only the picker, at its one call site in ChatComposer. The composer's
own resolution keeps the lock, the missing/disabled-instance protection and its
tests stay exactly as upstream left them, and ModelPickerContent gates all
greying on lockedProvider !== null, so a non-null lockedContinuationGroupKey
alone greys nothing.

Mobile was never affected: ThreadComposer opens the migration flow on a
cross-instance pick.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.