Skip to content

chore(fork): integrate upstream v0.1.8-nightly.20261106.4288 - #82

Merged
kylebegeman merged 170 commits into
mainfrom
integrate/v0.1.8-nightly.20261106.4288
Nov 7, 2026
Merged

kylebegeman merged 170 commits into
mainfrom
integrate/v0.1.8-nightly.20261106.4288

Conversation

@kylebegeman

@kylebegeman kylebegeman commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

Merges upstream T3 Code v0.1.8-nightly.20261106.4288 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.8-nightly.20261106.4288, 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.

TonybynMp4 and others added 30 commits November 5, 2026 16:39
…#30453)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…gdotgg#27699)

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

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>
…ingdotgg#24983)

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

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
… iOS (pingdotgg#30139)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
)

Co-authored-by: SAPHID <saphid@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…#31741)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ngdotgg#30397)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…r icon (pingdotgg#29738)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ingdotgg#25847)

Co-authored-by: Tejas Rahane <17571323+trahane@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…7489)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: SAPHID <saphid@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…gg#25484)

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: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… selections (pingdotgg#24990)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…30747)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
github-actions Bot and others added 23 commits November 6, 2026 16:31
… (Typechecking apps/mobile)

Failing check: Typechecking apps/mobile

"Typechecking apps/mobile" failed on one error: `src/features/threads/UsageLimitRecoveryCard.tsx(202,12): error TS2304: Cannot find name 'Button'`. Every other line in the log is a `schemaClassMissingBrand` suggestion, not an error.

Upstream commit c7537d0 ("fix(chat): show one usage-limit recovery notice", pingdotgg#29292) replaced the card's secondary `Button`s with a new local `RecoveryAction` link-style component. It also deleted the `Button` import. The fork's `failed-run-retry` seam still used `<Button label="Retry now" …>`, so it lost its import.

I moved the seam onto upstream's new code: the "Retry now" control now uses upstream's `RecoveryAction`, so it looks like the card's other actions. It sits under the existing `{/* fork: failed-run-retry */}` marker. No upstream lines changed, the file keeps its 4 marked lines, and the docs/fork/seams.tsv row is unchanged. I reran the checks: `(cd apps/mobile && pnpm exec vp run typecheck)` exits 0, `check_seams` exits 0, and lint and format pass on the file.
… (Typechecking apps/server)

Failing check: Typechecking apps/server

"Typechecking apps/server" now passes. Two fork seams didn't carry over onto new upstream code: one surfaced in the original log, and the second appeared once the first was fixed.

**1. `McpHttpServer.ts` (`fork: agent-catalog`).** The original log had one error: `Cannot find name 'refreshed'`. Upstream pingdotgg#30834 split the MCP auth middleware so authentication runs in its own `authenticateRequest` function, outside the tool call. The fork's `hideUnusableTools(response, refreshed)` seam stayed in the outer handler, where `refreshed` no longer exists. I changed the seam to pass `admitted`, the invocation scope that `authenticateRequest` now returns. The tool filter only reads `thread`, `capabilities` and `advertisedCapabilities`. Mode limiting and the `linkedEnvironments` field don't change those, so the filtering is the same as before. The marker is still on the line.

**2. `ws.test.ts` (`fork: file-placement`).** A new upstream test (pingdotgg#29688, "a publish whose push fails still refreshes the new remote") mocks `ManagedProjectFolders` with `namedProjectsRoot`. The fork moved that field to `ProjectPlacement`, so this was a type error, and the test was also missing a `ProjectPlacement` mock. I replaced the line with an empty `ManagedProjectFolders` mock and an empty `ProjectPlacement` mock, matching the other two mocks in the file. Both lines are marked `fork: file-placement`, and I raised that file's minimum in the `docs/fork/seams.tsv` row from 3 to 5.

**Reruns:**
- `apps/server` typecheck: exits 0.
- `check_seams`: passes.
- `sessionToolList.test.ts`: 9 tests pass.
- The new publish test in `ws.test.ts`: passes.

Nothing was committed.
… (Running the fork's tests in apps/mobile)

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

**What failed.** In "Running the fork's tests in apps/mobile", one test failed: `usage limit recovery > retries a limit with no reset time now…` in `apps/mobile/src/features/threads/ThreadRecoveryNotice.test.tsx`. The log shows `ReferenceError: Button is not defined` from `UsageLimitRecoveryCard.tsx:202`.

**Why.** Upstream commit c7537d0 (pingdotgg#29292) replaced the card's `Button`s with a new local `RecoveryAction` built on `Pressable`, and removed the `Button` import. The fork's `failed-run-retry` seam still rendered a `Button`, which caused this error. An earlier session (commit 4856d1c, the mobile typecheck repair) already moved that seam onto `RecoveryAction`. When I reran the test on the current tree it failed for a second reason: the test's `react-native` mock only provides `View`, and it says "No "Pressable" export is defined on the "react-native" mock". So the "Retry now" control can't render in the test.

**What I changed.** The test file is fork-owned, since v0.1.8-nightly.20261106.4275 doesn't have it. I added a `Pressable` stub to its `react-native` mock. The stub renders a `<button>` that passes through `disabled` and `onPress`, the same way the existing `Button` mock does. I didn't change any upstream code or test assertions. `pnpm exec vp test run apps/mobile/src/features/threads/ThreadRecoveryNotice.test.tsx` now passes all 6 tests, and lint and format pass on the file.
… (Running the fork's tests in scripts)

Failing check: Running the fork's tests in scripts

I fixed the failing check, "Running the fork's tests in scripts." Two test files were failing, both fork-owned and both because the code they test had changed. I updated the two test files and nothing else. Both now pass when rerun on their own (87 tests), and the formatter is happy with them.

**`scripts/fork/loom.test.ts` (3 tests):** This one was already broken on main before the merge. Commit a9fa7a8 changed the Loom benchmarks typecheck in `scripts/fork/loom.sh` from `tsc` to `effect-tsgo tsrs`, but the tests still expected `tsc`. I changed those expected values in the three tests to `effect-tsgo tsrs`. I left a `tsc --noEmit` string that is just sample `package.json` content for a test, since it isn't one of the expected calls.

**`scripts/smoke-cli-archive.test.ts` (1 test):** Upstream commit 6577c6b added a new step to `smokeCliArchive`. It now runs `t3 __service-launcher` and expects exit code 1 with "T3CODE_HOME is required" on stderr. The fork's stand-in `t3` script (written for the smoke-port-race seam) didn't handle that argument. It fell through to starting a server on port `NaN` and crashed. I added one line to the stand-in so it answers `__service-launcher` the way the real CLI does. Upstream's smoke code is unchanged.
… (Running the fork's tests in apps/server)

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

I fixed the one failing test in "Running the fork's tests in apps/server". The test was "a failed update keeps service.env matching the old service" in `apps/server/src/cli/up.test.ts`. The other 385 tests passed.

**Why it failed:** upstream commit 40d7d48 (pingdotgg#30480) added this test case. It expects the retry hint to read "Fix that, then run \`t3 up --base-dir …\` again." The hint is built from Loom's own command name, so Loom prints `loom up`. The test next to it already has the same brand seam for this reason: its `pair` hint expects `loom pair` and is marked `fork: brand`.

**What I changed:**
- In `apps/server/src/cli/up.test.ts:224`, the expected text now says `loom up` and the line is marked `// fork: brand`.
- In `docs/fork/seams.tsv`, the minimum marked-line count for that file's `brand` row goes from 1 to 2.

I didn't touch any other upstream code. `pnpm exec vp test run apps/server/src/cli/up.test.ts` now passes all 22 tests, and `check_seams` exits 0.
… (Running the fork's tests in apps/server)

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

The "Running the fork's tests in apps/server" check had four failing tests across three files. They now pass (4 files, 279 tests), `check_seams` exits 0, and lint and format are clean on the touched files. I didn't rerun the rest of the apps/server suite; those files already passed in this round.

**`AgentContextBudget.test.ts`.** The merge left a guessed MCP tool-list byte count in `agentContextBudget.json` instead of a measured one (241896 against a measured 242202). That file is a fork seam (the `-` row in `docs/fork/seams.tsv`), so I set the number to the measured value. No model-facing text changed, so there were no evals to run.

**`CodexTextGeneration.test.ts`, case "signed out, fallback failed".** Upstream pingdotgg#29607 now moves title generation away from a signed-out provider. When no fallback is usable, it still calls the signed-out primary. The fork's `server-weight` seam in `TextGeneration.ts` refuses that call so a CLI that can't log in is never started. The fork's own `TextGeneration.test.ts` covers the same rule, so upstream doesn't do what the seam does, and I kept the seam. I added a branch to the upstream test, marked `fork: server-weight`, for that one case only: it now expects a "Sign in" failure and no calls. The other five cases run unchanged. I added a `server-weight 1` row to `docs/fork/seams.tsv` for the file.

**`storageCleanup.test.ts`, "sweeps on runtime retirement…" (both variants).** Upstream pingdotgg#23901 added this test and counts sweeps by counting snapshot reads, at one read per sweep. A Loom sweep reads the snapshot three times, because the fork's project and Scratch passes each read it once more. The fork's broader event trigger (`project-lifecycle`) also sweeps when a thread is deleted while another cleanup rule is on (here `worktreeAfterDays: 8`), even with `worktreeOnDelete=false`. I kept upstream's checks but measure them per sweep: `sweepReads` is the read count from the startup sweep, and each changed assertion is marked `fork: project-lifecycle`. The deletion assertion now also expects the extra sweep Loom makes. I raised that file's `project-lifecycle` count in `docs/fork/seams.tsv` from 34 to 38.
…nch's own pull request (pingdotgg#29817)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…node of the thread (pingdotgg#31012)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…otgg#31584)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…otgg#31586)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…g#31017)

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

Co-authored-by: Adam Otradovec <du239@creditas.cz>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
…er a restart (pingdotgg#32162)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ing in from the corner (pingdotgg#32141)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… the full width (pingdotgg#32142)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…25988)

Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
… (Typechecking apps/server)

Failing check: Typechecking apps/server

I fixed the failing "Typechecking apps/server" check by changing one fork seam line.

**What failed.** The check log only shows `schemaClassMissingBrand` suggestions, so the real error isn't in it. Rerunning `effect-tsgo` locally exits with code 2 on one error: `apps/server/src/textGeneration/CodexTextGeneration.test.ts:659`, TS2367. It says a comparison against `"signed out, fallback failed"` can never be true.

**Why.** Repair round 3 (`ea0b33640d`) caused it, not upstream. That round added a `fork: server-weight` branch to upstream's preflight test. In the `"signed out, fallback failed"` case, Loom's seam refuses to start a CLI that is signed out, so the branch expects a "Sign in" failure and returns early. Because of that early return, TypeScript drops that case from `primaryState` for the rest of the test. Upstream's unchanged `expect(calls)` ternary below still compares against it, so the typecheck fails.

**What I changed.** On the seam's `if` line I changed the comparison to `(primaryState as string) === "signed out, fallback failed"`, which keeps TypeScript from narrowing `primaryState`. The line is the one under the `fork: server-weight` marker, and upstream's code is untouched. The seam's row count in `docs/fork/seams.tsv` is unchanged. The typecheck now exits 0, the test file passes (24 tests), lint on the file is clean, and `check_seams` exits 0.
The review had one finding, it was correct, and I fixed it with a change to `FORK.md` only.

**Finding: the `restart-continuity` paragraph in `FORK.md` (lines 827–828) describes seams that no longer exist.** I confirmed it against the code. Repair commit 2e1b574 removed `BACKEND_STOP_TIMEOUT` from `DesktopBackendPool.ts` and the marker from `DesktopUpdates.ts`, and it updated `docs/fork/seams.tsv` to match, but not `FORK.md`. At HEAD:
- `DesktopApp.ts:168` and `DesktopUpdates.ts:856` both use upstream's `DesktopBackendManager.BACKEND_QUIT_STOP_TIMEOUT` directly.
- Loom's 15 s grace and the extra stop time for provider cleanup sit inside that constant, with markers, at `DesktopBackendManager.ts:47-55`.
- The only marker left in `DesktopApp.ts` is at line 161, where it exports `stopAllPoolInstances` for the fork's bounded quit test.

**Fix:** I rewrote the two sentences. They now say that the budget is upstream's `BACKEND_QUIT_STOP_TIMEOUT`, and that the quit in `DesktopApp.ts` and the update install in `DesktopUpdates.ts` use it unchanged. They also say that the one `DesktopApp.ts` marker only exports the pool stop for the quit test. I dropped the counts for `DesktopBackendPool.ts (1)` and `DesktopUpdates.ts (1)`, and the remaining `DesktopApp.ts (1)` matches `seams.tsv`. No code changed. The format check on `FORK.md` passes, and `check_seams` printed no errors.
… (Linting upstream files the fork edits)

Failing check: Linting upstream files the fork edits

**What failed:** the "Linting upstream files the fork edits" check stopped on one oxlint error: `Identifier 'Queue' has already been declared` in `apps/server/src/vcs/GitVcsDriverCore.test.ts`.

**Why:** upstream commit bdb8d5d (pingdotgg#32162, background PR discovery) added its own `import * as Queue from "effect/Queue";` to this test file. The fork already had the same import, marked `// fork: source-control-cockpit`. The merge kept both, so `Queue` was imported twice.

**What I changed:** upstream now provides the import, so I dropped the fork's copy and its marker. That leaves 12 `source-control-cockpit` markers in the file instead of 13, so I lowered that row's minimum in `docs/fork/seams.tsv` from 13 to 12. Upstream code is untouched. After the change, `vp lint` on the file and `check_seams` both pass.
@kylebegeman kylebegeman changed the title chore(fork): integrate upstream v0.1.8-nightly.20261106.4288 (in progress) chore(fork): integrate upstream v0.1.8-nightly.20261106.4288 Nov 7, 2026
@kylebegeman
kylebegeman marked this pull request as ready for review November 7, 2026 00:03
The review had one finding, and it holds. I fixed it.

**`apps/server/src/provider/acp/AntigravityAcpSupport.ts:117`**: Upstream pingdotgg#31158 added `antigravityClientInfo()`. On Antigravity 1.5.1 and later it identifies the client as `{ name: "t3-code", title: "T3 Code", … }`. Repair commit `90c1fbf7de` changed the title to `"Loom"` and marked it `fork: brand`. That changed a name we send to a third party, and left it paired with `name: "t3-code"`.

FORK.md (around line 51) says names sent to third parties stay as they are and go on `docs/fork/brand-copy-allowlist.tsv`. The allowlist already does this for the same kind of ACP identity in `packages/provider-muse/src/server/sdk.ts` and for `CODEX_CLIENT_NAME`. So this falls under the "identifiers" the allowlist is meant to hold, and it isn't new product text that should be reworded.

What I changed:
- **The line:** it says `title: "T3 Code"` again, with no marker. The file now matches the upstream tip `32a0531748` exactly.
- **The allowlist:** I added the trimmed line under "Names sent to third parties or written as git identities", in path order.
- **The seam row:** I removed the `AntigravityAcpSupport.ts	brand	1` row from `docs/fork/seams.tsv`.

The neighbouring `AntigravityProvider.ts` brand seam is a different, user-facing line, so I left it alone.

Checks: `check_seams` and `check_brand_copy` pass, all 53 tests in `AntigravityAcpSupport.test.ts` pass, and lint on the file exits clean. I did not commit anything.
@kylebegeman

Copy link
Copy Markdown
Owner Author

Review of the unattended resolution: pass.

  • Round 1, Linting upstream files the fork edits: REPAIRED
  • Round 1, Typechecking apps/server: REPAIRED
    The session changed nothing.
  • Round 1, Running the fork's tests in apps/server: REPAIRED
    The session changed nothing.

After review 1:

Earlier reviews failed; a session fixed their findings:

  • Review 1: FIXED

I found nothing that needs fixing, so this can merge into main without a person.

The branch holds two upstream merges (4275 and 4288), a clean merge of main and 14 repair and review commits. The 4275 merge had 27 conflicted files; the 4288 merge and the main merge had none. I checked each resolution against upstream's diff from the merge base (e136e8e3d4..6577c6b618) and Loom's diff from the same base to main. I also checked every line that removes a fork: marker between main and HEAD; each marker was moved, re-added on upstream's new code, or dropped because upstream now does the same thing.

The spots that looked wrong but hold up:

  • apps/web/src/components/ChatView.tsx: the resolution threw away Loom's whole side of the composer conflict. That's safe because Loom's only change in that block was environmentUnavailable (fleet-connections), and it was reapplied inside upstream's new wrapper.
  • apps/server/src/storageCleanup.ts: worker.requestSweep stands in for upstream's requestSweep because Loom restructured the sweep worker. Upstream's real change, the isLive guard on error events, is kept on top of Loom's wider sweep condition, which already includes worktreeOnDelete. The test edits in ea0b33640d only change the expected read counts to match that existing Loom behaviour.
  • Mobile SecretRequestCard.tsx: the input-hardening props didn't vanish; upstream moved them into the new SecretTextInput. Loom's vault check still runs before saving, through send.
  • apps/server/src/bin.ts → binMain.ts: upstream moved command dispatch into binMain.ts. Loom's runtime-capabilities branch moved with it, and seams.tsv was updated to point there.
  • Desktop restart-continuity (DesktopBackendManager.ts, DesktopBackendPool.ts, DesktopApp.ts, DesktopUpdates.ts): the 15 s grace and the provider-cleanup time now sit inside upstream's BACKEND_QUIT_STOP_TIMEOUT, so Loom's separate BACKEND_STOP_TIMEOUT was removed as a duplicate. FORK.md and seams.tsv were updated to match.
  • docs/user/telemetry.md: Loom's sentence about the browser app not reading the variable was dropped because upstream now says it. Upstream's new relay-diagnostics section is kept, followed by Loom's note that its builds send no traces.
  • Antigravity: 90c1fbf7de changed the client title to "Loom". That would have undone the point of upstream's change, which is to identify as T3 Code to agy. 07de2a1710 restored "T3 Code" and added the line to the brand allowlist.
  • Reworded settings text (3c1cdf844c, 97b3f7a839): these edits were needed. Upstream added a lint rule, max-settings-description-length (fix(web): settings descriptions use the full row and stay two lines pingdotgg/t3code#31826), that limits these descriptions.

The other repair commits stay within what their failing check needed:

  • a duplicate Queue import removed;
  • refreshed renamed to admitted to follow upstream;
  • the ws.test.ts mocks adjusted for Loom's project-placement service;
  • a loom up brand string in a test;
  • the loom.test.ts expectation brought in line with loom.sh, which already runs effect-tsgo;
  • a smoke-test fixture for the new service launcher;
  • a mobile button swapped for upstream's RecoveryAction.

VERDICT: pass

@kylebegeman
kylebegeman merged commit aa9674d into main Nov 7, 2026
@kylebegeman
kylebegeman deleted the integrate/v0.1.8-nightly.20261106.4288 branch November 7, 2026 00:49
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.