chore(upstream): land the onboarding, project defaults and Android lanes together - #467
Merged
Conversation
Project settings move under Settings -> Projects with machine and project scopes. Machine defaults cover model, workspace, automatic pull, agent browser access and actions; a project override wins until reset. Pylon adaptations: keep project icon compatibility guards, rollback-aware startup tests and MCP fence/lifecycle tests; provide the orchestration projection infrastructure to ProviderService because rollback admission builds it before orchestration (otherwise project browser overrides could never resolve a thread's project); treat the machine default model like a project default for mobile unavailable-provider remediation; drop the provider-setup link that depends on unported upstream #9348. The WelcomeWizard hunk is deferred until onboarding lands. Adopted from 9f40b2f563c662b43887b11ff99c466fe871c1af (#9754) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Web and desktop can opt into Auto balance under Settings -> Connections. New drafts in projects grouped across machines pick a connected machine by whole-host CPU and memory, weighted by per-machine preference; a manual machine, branch or worktree choice pins the draft. Mobile keeps manual routing. Pylon adaptations: candidate machines use Pylon's shared provider admission rule (getProviderAdmissionUnavailableReason), so balancing never routes to a machine whose provider is disabled, not installed, signed out, unavailable or not ready (covers Prime and Antigravity); the capacity strip and provider banner fall back to the machine default model like the composer does; the section heading drops its description to match Pylon's settings layout (upstream #10415 hunk for this file). Adopted from 420fd76f60433fe05b8d2c76f4fbde430dc49968 (#9895)
(cherry picked from commit 2d6a3799978659e349faf8ff4297098ffb782ebb)
(cherry picked from commit efeac144289d0f64bcfe3b9274c616499893be91)
…570) (cherry picked from commit c8ec7df12415140c6413372f53e3be4fe2e959f8)
Auto balance shows how many machines need an update and updates the supported ones together, with per-machine progress, retry and manual instructions from the existing update flow. Pylon adaptation: the batch and single desktop-update confirmations say Pylon instead of T3 Code. Adopted from 15193df9fb915837f7215909a7d741789db0a273 (#10596)
Pull requests remember the last allowed merge method, a project can set its own default in its settings, and the merge menu closes after a choice. Pylon adaptations: only the new client-settings key was spliced into Pylon's settings schema (Pylon keeps contextWindowIndicatorEnabled and its own plan-mode and composer keys); Pylon's server-projected PR tracking is untouched. Settings search now also finds project names, icons and the merge method under Settings -> Projects. Adopted from 7d9aaf6a7eb22d5e85b0e3b21686cc437fe68576 (#8088)
Adopted from 09aac71563c66a4f65f6fbe701aa9596cb677767 (#5362) Pylon adaptations: - Keep ProviderSessionDirectory's commit guard and exact removal beside the new insert-ignore option and imported transcript records. - Build the import invariant on Pylon's open-request scan, and treat Pylon's PR tracking, manual Active placement, rollback status and handoff parent as modifications that block a re-import. - Keep Pylon's RPC consts private and its hub reset credit, Prime managed binding and commit-guard tests; convert the directory tests to it.effect so they execute. - Register provider secrets through Pylon's provider instance compare-and-set in the terminal environment tests, and prove imported history survives Pylon's rollback revision compare-and-set. - Keep Pylon's screencast recording, preview fallback and markdown link handling while failed settings reads reject instead of opening a browser; Pylon's link-opening tests cover that rejection. (cherry picked from commit 09aac71563c66a4f65f6fbe701aa9596cb677767)
Adopted from d92dca74eb7b7c6068619752f5b9a55c0e36f352 (#10184) Pylon adaptation: the regression tests drive Pylon's resolveComposerInstanceSelection, which replaced upstream's resolveComposerProviderSelection in the composer. (cherry picked from commit d92dca74eb7b7c6068619752f5b9a55c0e36f352)
Adopted from 82689782eee0f0cf27d5601e1d533381587b64f8 (#10129) Pylon adaptation: the hosted prerequisites copy names Pylon and Pylon Connect. (cherry picked from commit 82689782eee0f0cf27d5601e1d533381587b64f8)
…402) Adopted from c2c4185e175daea86f8fd6336fd8839a81cc616e (#10402) (cherry picked from commit c2c4185e175daea86f8fd6336fd8839a81cc616e)
Adopted from ec36176e4f25fac7e3c380f6a4b646116e4ccf3d (#10432) (cherry picked from commit ec36176e4f25fac7e3c380f6a4b646116e4ccf3d)
Adopted from 95f9b14f873c7b119f0ffb6dbd194c7063293aa2 (#10430) The lockfile was regenerated from Pylon's with vp i for the new stream-json and stream-chain server dependencies. (cherry picked from commit 95f9b14f873c7b119f0ffb6dbd194c7063293aa2)
Adopted from f729e8fd837e4d6de86781351c3aee5a4ea19ab3 (#10465) Pylon adaptations: - The Add provider dialog adopts the shared WizardPanel while keeping Pylon's multiple-instance blocking and Prime guidance. - Imported projects keep resolving a default model from their computer's providers until shared project defaults (#9754) land. - The first-run recovery screen uses the shared refresh icon Pylon already adopted from #9561 and names Pylon. - The wizard header renders PylonMark with the Pylon name instead of T3's wordmark, and its dialog title, Connect section and pairing hints name Pylon and Pylon Connect; `npx t3` commands stay as compatibility names. (cherry picked from commit f729e8fd837e4d6de86781351c3aee5a4ea19ab3)
Onboarding listed every directory Claude Code or Codex had ever run in as one flat list of paths, with everything from the last 30 days preselected. On my machine that was 270 rows and 80 preselected. Most of them were Codex scratch folders, worktrees, and one-off questions. I wanted two or three projects and had no fast way to get there. The scanner now reads each candidate's `.git/config` directly, so the client can group clones by origin and show the GitHub `owner/name`. Linked worktrees, Codex scratch directories under `~/Documents/Codex`, `~/Downloads`, and temp roots are no longer offered. Folders that are not git repositories collapse under "Other folders". The default selection requires a git repository with at least three threads. Select all and Select none sit above the list, and each row shows the source icons, thread count, and last activity. On the same machine this drops the list to 162 rows and the default selection to 16. Mobile has no project import step, so there is no mobile change. Adopted from 8b2838e0e8a73d3fa6476940445c372e47b99db4 (#10493) (cherry picked from commit 8b2838e0e8a73d3fa6476940445c372e47b99db4)
…t (#10547) Adopted from 62fbbe08aa854fcbd8044cd971a45a54edafcb98 (#10547) (cherry picked from commit 62fbbe08aa854fcbd8044cd971a45a54edafcb98)
…wizard for Pylon Pylon adaptations for the onboarding sources: - Project import skips transcripts from worktrees under Pylon runtime homes (`.pylon-code/worktrees`, including channel homes such as `.pylon-code-nightly`) alongside T3 Code's `.t3/worktrees`. - docs/user/welcome-wizard.md is written for Pylon, keeps `npx t3` commands as compatibility names, and points other providers, including Prime Agent and Antigravity, at Settings → Providers. - The relay target test names Pylon Connect.
…not drift ProjectFavicon takes one project prop, so the saved title, favicon path and icon override travel together on every surface. Pylon adaptations: the new-thread project picker (DraftHeroHeadline) now passes the project group instead of its display name; the pull request project filter keeps Pylon's saved-title field so a duplicate project whose list label gains a server or path suffix still shows the sidebar's icon. Adopted from eb115063634c416c6362cc407f8572cb0c136ddf (#10714)
knip rejects the unused export; upstream's frozen head keeps serverWelcomeStateChanges module-private as well.
…a newer value Saved client settings no longer fail closed on schema decode errors. Pylon and T3 Code share the browser storage key when served from the same origin, and T3 Code now writes `confirmQuit` as "hold" | "direct" | "double-click"; a strict decode replaced the whole app with "Could not read settings". - Settings are decoded one value at a time: readable values load, values this build cannot decode fall back to their defaults, and a document that is not settings JSON reads as no saved settings. Storage and file access failures still reject so hydration can retry. - Writes leave an undecoded stored value in place until that setting changes, so an automatic write such as onboarding completion does not overwrite it. - Desktop reads the settings file the same way, and an unreadable file keeps the default hold-to-quit instead of quitting on one press.
Setup opened a terminal with `claude auth login` even though Pylon's provider sign-in dialog already signs Claude Code in through server.startProviderLogin, without terminal access, with subscription, Console or SSO choices and email prefill. Claude Code's signed-out state now opens that dialog. Installs and `codex login` keep the setup terminal because Pylon has no terminal-free Codex login.
Finished setup had no way back in to add computers or import more projects. The command palette now offers Set up computers and import projects, which opens /welcome.
The scanner was built inside each connection's RPC layer, so concurrent clients each held their own import read lock and memory budget. The websocket route now builds it once, like the pull request service.
Import reads up to 4 GiB per project and per conversation file, streams past large tool output, and caps kept history at 32 MiB per conversation. The doc also covers Claude Code sign-in, reopening setup from the command palette, and an existing install with no projects or threads; the scan candidate contract comment names Pylon.
The composer said "Auto balance" while send was refused with "Choose a machine to continue" whenever a finished check chose no machine: no eligible candidates, or every candidate stale, saturated or excluded. resolveLoadBalancingStatus treats a finished check with no chosen machine as unavailable, while a chosen machine still being saved to the draft reads as balanced. Follow-up to 2d6a3799978659e349faf8ff4297098ffb782ebb (#10407)
Prime Agent browser access now lives in Settings -> Projects, and new threads take the project default model, then the machine default, then the remembered selection. Follow-up to 9f40b2f563c662b43887b11ff99c466fe871c1af (#9754)
(cherry picked from commit 9eb4d71681dc7d002082db2f8b4bacf7614412f4)
SecureStore keeps connection credentials in the iOS Keychain. Declare the bundle-scoped access group explicitly so pairing does not fail with a missing entitlement. The group uses $(AppIdentifierPrefix), which Xcode resolves from the signing team, so Pylon still pins no Apple team or T3 identifier. Adopted from 02443335b155e46248f96d80e037603abc742a61 (#3665)
Co-authored-by: Pixel Perfect <me@pixp.cc> (cherry picked from commit 579266caa89238611ddb974ffebe9968c6a6e5d5)
Co-authored-by: Pixel Perfect <me@pixp.cc> (cherry picked from commit 4664c572a78231611491f63f677f0e007ebaab03)
…0859) (cherry picked from commit 1862686f9e42bf1d77e7f2ad03e24d7b0c7908f1)
…10416) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> (cherry picked from commit 6c583620ff7ad3235b135af7107c0543467eecfa)
The Pylon scheme made one deep-link assertion exceed ktlint's 100-column limit.
…them Android builds without Firebase config and devices whose APNs or FCM token lookup failed still registered with the relay, so Settings showed Device Notifications and Ongoing Agent Activity as on while nothing could arrive. The app now publishes whether Android push is configured, keeps both switches off with an honest subtitle when it is not, and reads a switch as on only once the relay accepts a registration that carries a push token. Also signs the Keychain access group with the bundle ID the build actually uses, makes the Mobile clients page and sign-in prompt name Android's ongoing activity, documents the relay rollback hazard, and links the new notification docs from the index.
…ng' into upstream/2026-09-10-integration-1 # Conflicts: # .agents/upstream-review.md
…defaults' into upstream/2026-09-10-integration-1 # Conflicts: # .agents/upstream-review.md # packages/contracts/src/settings.test.ts
Shared project defaults (#9754, landed in #455) made the machine default model apply to every project without its own model. The welcome wizard (#459) still stamped a concrete model on each imported project, which would override that default forever. Create imported projects with no model, as upstream does at 6c583620ff. Adopted from 9f40b2f563c662b43887b11ff99c466fe871c1af (#9754).
…id' into upstream/2026-09-10-integration-1 # Conflicts: # .agents/upstream-review.md # apps/mobile/src/features/threads/thread-list-v2-items.tsx # pnpm-lock.yaml
#459 added getImportedAgentSessionSources to the projection query and a bootstrap test that predates #455's machine default model, while #455 added a browser-access projection stub and parametrized the bootstrap test over existing projects. Give the stub the new method, provide server settings to the onboarding test, and expect bootstrapProjectCreated only when the project was actually created.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
This was referenced Sep 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lands three reviewed upstream lane PRs together so CI runs once on the combined code, instead of rebasing each one after every merge. Each lane had already passed its own CI and an adversarial review with fixes. The individual PRs keep their full descriptions, source tables and review history, and GitHub marks them merged when this lands, because their exact reviewed heads are merged here unchanged.
757316267ca8af4b0b2ca951170c3d65e95da68ab26a13187bb114fae550c9437a83fe3845d97e4a0b1bdf0edce6164d5b11ad42f9ddf0c3b5f4a3a3Tracking issue #414, frozen upstream head
6c583620ff7ad3235b135af7107c0543467eecfa.What this branch adds beyond the three merges
packages/contracts/src/settings.test.ts: both newdescribeblocks kept.thread-list-v2-items.tsx: imports from both sides kept.pnpm-lock.yaml: taken frompylon, regenerated withvp i, then checked withvp i --frozen-lockfile. The only new package is feat(mobile): add Android agent notifications and Material You theming #456's@material/material-color-utilities. The Effect-dependent lockfile keys change because feat(mobile): keep new-task drafts and queued sends visible #460's patch hash changed.fix(web): let imported projects inherit the machine default model. This is #9754'sWelcomeWizard.tsxhunk, which feat(settings): share project defaults, balance new threads across machines, and default PR merge methods #455 could not apply before the wizard existed. Imported projects are created withdefaultModelSelection: null, as upstream is at the frozen head. Otherwise the model the wizard stamped on each project would override the new machine default forever.test(mobile): restore the relay rejection cookie assertion. feat(mobile): add Android agent notifications and Material You theming #456 dropped this assertion because Effect beta.103 readgetSetCookie()without a guard. feat(mobile): keep new-task drafts and queued sends visible #460 carried upstream #10851's patch fix, so the assertion passes again.test(server): reconcile onboarding and project-defaults startup tests. Three cross-lane collisions that neither lane's CI could see:getImportedAgentSessionSources.bootstrapProjectCreated === trueassertion into feat(settings): share project defaults, balance new threads across machines, and default PR merge methods #455's test cases that use an existing project; it now expects!existing.Verification on this branch
@t3tools/contracts,@t3tools/shared,@t3tools/client-runtime,t3,@t3tools/web,@t3tools/desktop,@t3tools/mobileandt3code-relay. Each run was checked by exit code and error count.Merged by Claude Opus 5 in Claude Code.
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.