Skip to content

chore(fork): absorb upstream through de251fc29 (#6) - #45

Closed
lukemaj wants to merge 17 commits into
absorb-base/de251fc29from
chore/6-absorb-upstream
Closed

lukemaj wants to merge 17 commits into
absorb-base/de251fc29from
chore/6-absorb-upstream

Conversation

@lukemaj

@lukemaj lukemaj commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Absorbs upstream pingdotgg/t3code main through de251fc29 into the fork stack (#6). This body is the absorption record (see the Routine in docs/fork.md).

This PR lands by --force-with-lease after human approval, not by merge. Its base is absorb-base/de251fc29, a branch at upstream de251fc29, so the diff is only the fork stack and CI runs. GitHub runs no pull_request workflows while a PR conflicts with its base, and against main it did. After approval:

git push --force-with-lease=main:096e9c0064d83be350b2280308ccbf1598b03661 origin chore/6-absorb-upstream:main
git push origin --delete absorb-base/de251fc29

Record

  • Range: base b2b43bef73447c483ceae486890cb79f01c369cb, target de251fc2971a884cb5b1305ba4daf309dc8cccb0, 128 upstream commits.
  • Candidate: 8518d0d86cdf432c371441909e996fcef0b3e9f9, the same 17 fork commits replayed. No commit was added, so the stack is 17 of the 20 allowed.
  • Conflicts per upstream file (each resolved in the fork commit that hit it):
  • Adaptations without a conflict (each folded into the fork commit that owns the lines):
  • Overlap decisions: all 278 report rows (98 upstream commits) are decided in the comments below.
    • Adopt upstream and delete ours: none. No upstream commit provides a fork capability, so the patch set did not shrink this time.
    • #11846 (per-thread auto-settle switch) is a manual opt-out and does not replace the automatic Sidebar: show a parent thread as working while its child threads work #31 guard. Its threadAutoSettleOptOut capability merged beside our issues and issueLinks capabilities.
    • #13572 (agents working banner) covers provider-native background agents only, so our sidebar child-working state stays.
    • #13516 (sidebar Back) already covers /pull-requests, which also hosts our Issues view. No fork edit needed.
    • #13060 (shell commands from chat) merged beside our Issue/PR link handling in ChatMarkdown.tsx.
    • #13691 and #13765: merge both, as above.
    • Every other row is keyword-only or an unrelated auto-merge: keep ours.
  • Time: fetch, rebase and the three conflicts took about 2 minutes. The first candidate took about 34 minutes from worktree creation to push, including adaptations, the report review and five proof runs. Review fixes took about 30 more, so about 64 minutes in total.
  • Proof:
    • scripts/fork-rebase.sh --proof on 72ba8f658 passed in 590s: fork check, install, typecheck, lint 0 errors, 18,240 tests passed in 14 packages (70 skipped, 0 failed), fmt.
    • The review fixes after it passed locally on d7ee6ae1d: reactor tests 60/60, fork-maintenance tests 12/12, server typecheck, vp lint 0 errors (code identical to abcb2a517), vp fmt --check, scripts/fork-check.sh OK.
    • CI on 8518d0d86: all jobs pass (Check, Test, Test Server 1-3, Fork Stack Model, Rust, Release Smoke, mobile checks).
    • Two earlier CI runs failed only in Test, on upstream's packages/client-runtime/src/platform/persistence.test.ts > encodeShellSnapshotForCache. It timed out at vitest's 5000ms default after 7.3s on the GitHub-hosted runner. Upstream ran it in 2.3s on Blacksmith at the same commit.
    • Fix, folded into fork docs(fork): Chromeria install, rebase routine and GitHub-hosted CI #9, which owns the ci.yml edit: the Test step passes --testTimeout=20000. The upstream test is untouched.

Claude Opus 5.5 (1M context) via Claude Code in T3 Code.

🤖 Generated with Claude Code

lukemaj and others added 6 commits September 27, 2026 15:38
Draft for user confirmation (2026-09-25): the fork becomes the user's single
working surface, stays a thin rebasable layer on upstream, runs Model Router
jobs as T3 threads and hosts OpenBot as a UI mode.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Confirmed by the user on 2026-09-25.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name the stable desktop build Chromeria with its own bundle id
(md.toolbox.chromeria), Electron userData directory and icon set, so it
installs and runs beside upstream T3 Code. Threads stay in the shared
T3 home (~/.t3 or T3CODE_HOME).

Desktop builds no longer embed a GitHub update feed, so the updater can
never replace Chromeria with an upstream T3 Code release.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The #12 branding points production web favicons at assets/chromeria/, but
two brand-assets tests still expected the upstream production icons.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…MCP toolkit (#8) (#10)

* spike(server): threads MCP toolkit that spawns and messages child threads (#3)

Adds a threads toolkit (spawn_thread, message_thread, read_thread,
list_child_threads) next to device, preview and pullRequests. A bridge
mirrors each child thread's lifecycle into its parent's activities as the
task.* rows the Agents panel already folds, and can send each finished
turn back to the parent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* spike(web): group child threads in a collapsible Subagents sidebar shelf (#3)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* spike(server): report steer for every provider and refuse messages to a starting child (#3)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* spike(web): hide child threads from the sidebar and open them from the Agents panel (#3)

Replaces the Subagents shelf: child threads are filtered out of the
sidebar, and their Agents panel rows link to the child thread.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(threads): production child threads with Agents panel listing and toolkit guards (#8)

Child threads spawned through the threads MCP toolkit are real T3
threads whose sub.<parent>.<suffix> id carries the parent link, hidden
from both sidebars and listed with status in the parent's Agents panel.

Production hardening over spike/3-threads-toolkit: documented the
id-convention tradeoff against a real parentThreadId (contract,
projector, persistence migration too invasive for this fork), extracted
the steer/new-turn delivery rule, pinned per-driver effort options, and
refused messages to still-starting children with a retryable error.

Built with OpenCode (Muse Spark).

* fix(desktop): run bundle self-check probe under plain Node (#8)

verifyPackagedBundleIsSelfContained spread ambient process.env into
the probe, so a shell with ELECTRON_RUN_AS_NODE=1 leaked the flag into
the validation command and broke the no-Electron-probe invariant the
Windows payload test asserts. Scrub the flag like the neighboring fff
probe curates its own env.

Built with OpenCode (Muse Spark).

* fix(tests): make failing gates hermetic without weakening assertions (#8)

- desktop: run the bundle self-check probe without ELECTRON_RUN_AS_NODE
  so validation does not depend on the orchestrator's ambient runtime flag.
- server: resolve the entrypoint fixture dir, matching the fully-resolved
  module URLs Node reports (macOS symlinks TMPDIR through /private/var).

Built with OpenCode (Muse Spark).

* fix(threads): consume the hot domain-event stream in the threads toolkit (#8)

The toolkit handlers layer builds with the HTTP routes. Acquiring
subscribeDomainEvents at build time failed every route-layer test whose
engine does not implement it (193 server.test.ts cases). Use
streamDomainEvents, as the upstream reactors do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* style: format GLOSSARY.md so vp fmt --check passes (#8)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The sidebar wordmark, setup screen, assistant author heading, link-target
and theme labels, splash screen and boot error still said "T3 Code".
They now read APP_BASE_NAME, whose browser fallback is "Chromeria", and the
T3 glyph renders the Chromeria obelisk icon.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@lukemaj

lukemaj commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor Author

Decided upstream overlap report, part 1 of 2 (from scripts/fork-rebase.sh --dry-run before absorption).

Upstream overlap report

Base: b2b43be

Target: de251fc

Scanned 128 upstream commit(s).

Copy this report into the absorption PR. For EVERY match replace PENDING with one decision and a rationale: keep ours; adopt upstream and delete ours; merge both. Record removed paths or the combined behavior and proof. No matches is not proof of no semantic overlap.

direction

Keep the fork mission and completion criteria explicit.

No matches.

glossary

Keep Chromeria and its product family terminology consistent.

No matches.

branding

Give desktop and web the Chromeria name, icons and independent desktop identity.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/onboarding/WelcomeWizard.tsx; file: apps/web/src/components/sidebar/SidebarChrome.tsx; keyword (files, diff): favicon Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/components/chat/MessagesTimeline.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/chat/MessagesTimeline.tsx; file: apps/web/src/components/onboarding/WelcomeWizard.tsx; keyword (files, diff): favicon Merge both: theme tokens and scale values. WelcomeWizard.tsx conflicted (fork #14): upstream's text-2xl class kept with our APP_BASE_NAME. Other files auto-merged.
66129c6 feat(web): run shell commands from chat in the thread terminal (#13060) file: apps/web/src/components/chat/MessagesTimeline.tsx Keep ours: shell commands from chat is a new link kind; our Issue/PR link interception and branding edits auto-merged beside it.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): branding; keyword (diff): appId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): productName Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
9a91177 fix(web): sidebar Back always returns to the main app (#13516) file: apps/web/src/components/sidebar/SidebarChrome.tsx Keep ours: upstream's isSidebarUtilityPage covers /pull-requests, which also hosts our Issues view, so Back works for Issues without a fork edit. Fork branding and Issues entry in SidebarChrome auto-merged.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): auto-update Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
568c9bc chore: clear Effect language service suggestions (#13536) file: apps/desktop/src/app/DesktopAppIdentity.test.ts; keyword (files, diff): appId; keyword (files, diff): favicon Keep ours: Effect language-service cleanup, auto-merged.
c13f7d9 feat(release): ship a Linux .deb that updates itself (#13575) file: scripts/build-desktop-artifact.test.ts; file: scripts/build-desktop-artifact.ts Keep ours: Linux .deb release path; Chromeria branding in build-desktop-artifact auto-merged.
d10bd13 perf(desktop): cache compiled JavaScript between launches (#13501) file: apps/desktop/package.json; file: apps/desktop/src/app/DesktopEnvironment.ts; file: scripts/build-desktop-artifact.ts Keep ours: compile cache; branding edits in desktop package/env and build script auto-merged.
1c12706 fix(mobile): render assigned project icons in chat list (#12810) keyword (files, diff): favicon Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
7a12aff fix(mobile): scale Android controls with appearance text size (#13356) keyword (diff): branding; keyword (diff): wordmark Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
04c15f3 feat(web): add chat width setting for wide screens (#11594) file: apps/web/src/components/chat/MessagesTimeline.tsx Keep ours: chat width setting auto-merged; does not provide Prism settings.
295d7cb fix(web): queued messages send while their thread is not open (#13764) file: apps/web/src/components/chat/MessagesTimeline.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
ea7d46a fix(build): validate Linux node-pty prebuilds in Windows artifacts (#13867) file: scripts/build-desktop-artifact.test.ts; file: scripts/build-desktop-artifact.ts Keep ours: node-pty validation in build script, auto-merged with branding.
c9a0e8a fix(web): align reasoning arrows with tool calls (#13850) file: apps/web/src/components/chat/MessagesTimeline.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
de251fc fix(web): continue onboarding after incomplete history imports (#13935) file: apps/web/src/components/onboarding/WelcomeWizard.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.

child-threads

Spawn child threads, hide them from sidebars and open them from their parent.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/LegacySidebar.tsx; keyword (files, diff): sidebar Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/components/LegacySidebar.tsx; file: apps/web/src/components/Sidebar.tsx; keyword (files, diff): sidebar Keep ours: theme-token recolor, auto-merged; fork edits untouched.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/AgentsPanel.tsx; file: apps/web/src/components/LegacySidebar.tsx; file: apps/web/src/components/Sidebar.tsx; keyword (diff): subagent; keyword (files, diff): sidebar Keep ours: theme-token recolor, auto-merged; fork edits untouched.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): parentThreadId; keyword (diff): subagent Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): parentThreadId; keyword (diff): subagent Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) file: apps/web/src/components/Sidebar.tsx; keyword (files, diff): sidebar Keep ours: upstream's per-thread auto-settle switch is a manual opt-out; it does not keep a parent active while its hidden child threads work (#31). Its threadAutoSettleOptOut capability auto-merged beside our issues/issueLinks capabilities.
8251c8d fix(web): working and monitoring threads fade in the sidebar again (#13506) file: apps/web/src/components/Sidebar.tsx; keyword (title, files, diff): sidebar Keep ours: fade styling for working rows auto-merged; our child-activity status feeds the same row status.
720490a fix(web): normalize disabled control opacity (#11441) keyword (files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
9a91177 fix(web): sidebar Back always returns to the main app (#13516) keyword (title, files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
fd46510 fix(web): keep sidebar terminal pulses in sync (#12962) file: apps/web/src/components/LegacySidebar.tsx; file: apps/web/src/components/Sidebar.tsx; keyword (title, files, diff): sidebar Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
3e2370f feat(web): add usage page keybinding (#9434) keyword (diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
4f27a84 fix(mcp): preview snapshots fit in the agent's tool output again (#13558) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview tool output changes in McpHttpServer auto-merged beside the threads/prism/issues toolkit registration.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview error text in McpHttpServer auto-merged beside the fork toolkits.
c13f7d9 feat(release): ship a Linux .deb that updates itself (#13575) file: scripts/build-desktop-artifact.ts Keep ours: Linux .deb release path; Chromeria branding in build-desktop-artifact auto-merged.
d10bd13 perf(desktop): cache compiled JavaScript between launches (#13501) file: scripts/build-desktop-artifact.ts Keep ours: compile cache; branding edits in desktop package/env and build script auto-merged.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) keyword (files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
7a12aff fix(mobile): scale Android controls with appearance text size (#13356) keyword (files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1a0c915 fix(terminal): settling a thread closes its idle shells (#13673) keyword (files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ed809f7 fix(web): restore compact provider instance badges (#13700) file: apps/web/src/components/Sidebar.tsx; keyword (files, diff): sidebar Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
525af2d perf(mobile): lighter Home rows away from the viewport (#13702) keyword (diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
eeea71a fix(web): make the empty workspace draggable on desktop (#13713) keyword (diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
5d707bb fix(web): Mod+B bolds on non-Latin layouts (#13409) keyword (diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
92f0af2 Show a focus ring on sidebar thread and draft rows (#13344) file: apps/web/src/components/Sidebar.tsx; keyword (title, files, diff): sidebar Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
daafcc4 feat(web): add keyboard navigation for usage (#10158) keyword (files, diff): sidebar Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6f97b0f perf(clients): sort projects and settled threads without re-parsing dates per comparison (#13759) file: apps/web/src/components/Sidebar.tsx; keyword (files, diff): sidebar Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
393d595 fix(accessibility): correct control announcements and sidebar traversal (#13491) file: apps/web/src/components/Sidebar.tsx; keyword (title, files, diff): sidebar Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
ea7d46a fix(build): validate Linux node-pty prebuilds in Windows artifacts (#13867) file: scripts/build-desktop-artifact.ts Keep ours: node-pty validation in build script, auto-merged with branding.

fork-maintenance

Keep the fork stack small, checked and rebasable on GitHub-hosted CI.

Commit Match evidence Decision and rationale
3412097 feat(server): show and redeem Claude banked resets (#13118) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
cdb26fe fix(antigravity): let Stop end commands that outlived their turn (#13388) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
f3cb2a1 fix(antigravity): keep Windows runtime unpacking under MAX_PATH (#13389) keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): fork; keyword (diff): upstream; keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): fork; keyword (diff): upstream Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d4a3345 fix(desktop): desktop updates reconnect in seconds, not minutes (#12006) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): fork; keyword (diff): upstream Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
46f3c2c feat(web): add iPhone Duo 3D controls (#12813) keyword (diff): rebase; keyword (diff): upstream Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6391be2 fix(server): newer Codex models get T3 Code's instructions again (#13547) keyword (diff): fork; keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
a107f8a fix(clients): a preview app no longer knocks the desktop's own server offline (#13577) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
c13f7d9 feat(release): ship a Linux .deb that updates itself (#13575) file: scripts/build-desktop-artifact.ts; keyword (diff): blacksmith Keep ours: Linux .deb release path; Chromeria branding in build-desktop-artifact auto-merged.
d10bd13 perf(desktop): cache compiled JavaScript between launches (#13501) file: knip.jsonc; file: scripts/build-desktop-artifact.ts; keyword (diff): TMPDIR Keep ours: compile cache; branding edits in desktop package/env and build script auto-merged.
b3de243 fix(dev): one t3.json setup action that works on every OS (#13589) file: knip.jsonc Merge both: knip.jsonc conflicted (fork #24); scripts entry keeps upstream's setup-worktree.ts and our fork-features.mjs.
86054b6 fix(desktop): `t3 app` keeps working after a second desktop app quits (#13585) keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) keyword (diff): upstream Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1a0c915 fix(terminal): settling a thread closes its idle shells (#13673) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
f5bd2fd fix(server): load Cursor keyring with createRequire (#13678) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
4293433 perf(server): avoid rereading unchanged files in review previews (#13395) keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
5660ab5 Remove unused items tracking from Claude adapter state (#13718) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8aa5be2 fix(server): the SQLite WAL file shrinks back after large writes (#13684) keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1dc8cbe feat(observability): write a server heap snapshot on SIGUSR2 (#13694) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ee18e56 feat(observability): record event loop stalls in the server trace (#13697) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
a21b42c fix(server): prune expired replay-protection files from the secrets directory (#13695) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
daafcc4 feat(web): add keyboard navigation for usage (#10158) file: knip.jsonc Keep ours: usage keyboard navigation auto-merged; fork Issues route and knip entry untouched.
99efaea perf(observability): stop writing empty spans on spawns, projected events, and idle polls (#13756) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
95030dc fix(server): background git status fetches no longer fill the disk with failed repacks (#13812) keyword (diff): upstream; keyword (diff): TMPDIR Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ea7d46a fix(build): validate Linux node-pty prebuilds in Windows artifacts (#13867) file: scripts/build-desktop-artifact.ts Keep ours: node-pty validation in build script, auto-merged with branding.
679c34c fix(clients): hide duplicate Cursor Keychain prompts (#13870) keyword (diff): fork Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

thread-scope

Allow explicit same-project supervision while retaining child-only defaults.

Commit Match evidence Decision and rationale
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) keyword (diff): scope Keep ours: theme-token recolor, auto-merged; fork edits untouched.
7cfb498 chore(ci): use GPT 6 Sol Max for check agents (#13473) keyword (files, diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3412097 feat(server): show and redeem Claude banked resets (#13118) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e759847 fix(acp): keep one answer when a running tool reports progress (#13386) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
f3cb2a1 fix(antigravity): keep Windows runtime unpacking under MAX_PATH (#13389) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d4a3345 fix(desktop): desktop updates reconnect in seconds, not minutes (#12006) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
72447f2 feat(grok): offer one-click updates through `grok update` (#13523) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
59abcd6 fix(mobile): make Android subscription usage widgets scrollable (#13474) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
46f3c2c feat(web): add iPhone Duo 3D controls (#12813) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d23eab1 fix(relay): export tunnel cleanup counters to Axiom (#13528) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
91e53e5 fix(server): report the Grok account email so usage limits merge across environments (#12588) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
568c9bc chore: clear Effect language service suggestions (#13536) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ab70c89 fix(clients): sync status no longer flickers when opening running threads (#13551) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6391be2 fix(server): newer Codex models get T3 Code's instructions again (#13547) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
9957349 feat(web): control Android foldables in the Device panel (#13534) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
4f27a84 fix(mcp): preview snapshots fit in the agent's tool output again (#13558) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
99641fd feat(desktop): keep running threads synced in the background (#13554) keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
a107f8a fix(clients): a preview app no longer knocks the desktop's own server offline (#13577) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
20f0ff1 fix(web): keep nested task states out of parent bullets (#11477) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
c13f7d9 feat(release): ship a Linux .deb that updates itself (#13575) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
86054b6 fix(desktop): `t3 app` keeps working after a second desktop app quits (#13585) keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1c12706 fix(mobile): render assigned project icons in chat list (#12810) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d06f0ff fix(sqlite): retry failed statement preparations (#10584) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
fd996d1 feat(observability): honor the standard OTLP endpoint, headers, and protocol variables (#13492) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
2598ce7 feat(desktop): honor the standard OTLP variables in the main process and WSL backends (#13641) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
2a9832b refactor(observability): name each service after its application (#13699) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6530de0 perf(server): pull request sync reads only threads with linked pull requests (#13704) keyword (diff): projectId Keep ours: PR sync reading only threads with linked PRs does not affect Issue links or child activity.
1dc8cbe feat(observability): write a server heap snapshot on SIGUSR2 (#13694) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
574b180 perf(server): shutdown no longer rewrites every stopped session row (#13688) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3b0a495 perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list (#13691) keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ee18e56 feat(observability): record event loop stalls in the server trace (#13697) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
999161e perf(server): stop re-running git for every project each minute (#13689) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1e844a3 fix(editors): stop treating the agy CLI as the Antigravity IDE (#7079) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
dd8332d fix(server): installed editors no longer vanish when discovery is slow (#13669) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
a21b42c fix(server): prune expired replay-protection files from the secrets directory (#13695) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
2679d27 fix(server): let OpenCode generate session titles (#13368) keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
daafcc4 feat(web): add keyboard navigation for usage (#10158) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
99efaea perf(observability): stop writing empty spans on spawns, projected events, and idle polls (#13756) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6f97b0f perf(clients): sort projects and settled threads without re-parsing dates per comparison (#13759) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
294dd12 fix(observability): the renderer trace proxy stops tracing itself (#13761) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1d6f23b perf(server): background sweeps only read threads that can still settle (#13765) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8872666 perf(server): cut idle wakeups from the Connect relay and session reaper (#13774) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
295d7cb fix(web): queued messages send while their thread is not open (#13764) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d6802b4 fix(usage): omit Cursor warning when no login is saved (#13820) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ea7d46a fix(build): validate Linux node-pty prebuilds in Windows artifacts (#13867) keyword (diff): scope Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
de251fc fix(web): continue onboarding after incomplete history imports (#13935) keyword (diff): scope; keyword (diff): projectId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

agents-panel

Separate Prism and direct spawns, nest child threads and navigate parent and siblings.

Commit Match evidence Decision and rationale
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/AgentsPanel.tsx; file: apps/web/src/components/chat/ChatHeader.tsx; keyword (files, diff): AgentsPanel; keyword (files, diff): breadcrumb Keep ours: theme-token recolor, auto-merged; fork edits untouched.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): parentThreadId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): parentThreadId Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
daafcc4 feat(web): add keyboard navigation for usage (#10158) keyword (diff): breadcrumb Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

prism-toolkit

Expose provider capacity and assign scoped thread tools through Prism roles.

Commit Match evidence Decision and rationale
cdb26fe fix(antigravity): let Stop end commands that outlived their turn (#13388) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
46f3c2c feat(web): add iPhone Duo 3D controls (#12813) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0cab7d5 fix(server): Grok accounts with no usage yet no longer vanish from Limits (#12799) keyword (diff): usage limit Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
91e53e5 fix(server): report the Grok account email so usage limits merge across environments (#12588) keyword (title, diff): usage limit Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
568c9bc chore: clear Effect language service suggestions (#13536) file: packages/contracts/src/settings.ts; keyword (diff): usage limit; keyword (diff): resume Keep ours: Effect language-service cleanup, auto-merged.
4f27a84 fix(mcp): preview snapshots fit in the agent's tool output again (#13558) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview tool output changes in McpHttpServer auto-merged beside the threads/prism/issues toolkit registration.
99641fd feat(desktop): keep running threads synced in the background (#13554) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview error text in McpHttpServer auto-merged beside the fork toolkits.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) file: packages/contracts/src/settings.ts; keyword (diff): usage limit; keyword (diff): resume Keep ours: usage history for more providers; it does not provide Prism role preferences or capacity lanes. Settings nav/search auto-merged.
574b180 perf(server): shutdown no longer rewrites every stopped session row (#13688) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
999161e perf(server): stop re-running git for every project each minute (#13689) keyword (diff): capacity Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
04c15f3 feat(web): add chat width setting for wide screens (#11594) file: packages/contracts/src/settings.ts Keep ours: chat width setting auto-merged; does not provide Prism settings.
dd8332d fix(server): installed editors no longer vanish when discovery is slow (#13669) keyword (diff): capacity Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
dab9561 fix(mobile): keep composer within folded screen after resume (#13310) keyword (title, diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1d6f23b perf(server): background sweeps only read threads that can still settle (#13765) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8872666 perf(server): cut idle wakeups from the Connect relay and session reaper (#13774) keyword (diff): resume Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

prism-settings

Configure role preferences and show provider usage and capacity in Settings.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
315fcca fix(web): web colors come from theme tokens (#13371) keyword (files, diff): usage; keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/settings/SettingsSidebarNav.tsx; keyword (files, diff): usage; keyword (files, diff): settings Keep ours: theme-token recolor, auto-merged; fork edits untouched.
ffb5fcc fix(server): keep Codex's reset answer when the re-probe fails (#13363) keyword (diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3412097 feat(server): show and redeem Claude banked resets (#13118) keyword (files, diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
f3cb2a1 fix(antigravity): keep Windows runtime unpacking under MAX_PATH (#13389) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
720490a fix(web): normalize disabled control opacity (#11441) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
9a91177 fix(web): sidebar Back always returns to the main app (#13516) keyword (diff): usage; keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d4a3345 fix(desktop): desktop updates reconnect in seconds, not minutes (#12006) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
72447f2 feat(grok): offer one-click updates through `grok update` (#13523) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
59abcd6 fix(mobile): make Android subscription usage widgets scrollable (#13474) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0cab7d5 fix(server): Grok accounts with no usage yet no longer vanish from Limits (#12799) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
91e53e5 fix(server): report the Grok account email so usage limits merge across environments (#12588) keyword (title, files, diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3e2370f feat(web): add usage page keybinding (#9434) keyword (title, files, diff): usage; keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
568c9bc chore: clear Effect language service suggestions (#13536) keyword (files, diff): usage; keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
6391be2 fix(server): newer Codex models get T3 Code's instructions again (#13547) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
9957349 feat(web): control Android foldables in the Device panel (#13534) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e3e7cc3 fix(usage): price Claude fast-mode requests at the fast rate (#13599) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1c12706 fix(mobile): render assigned project icons in chat list (#12810) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) file: apps/web/src/components/settings/SettingsSidebarNav.tsx; file: apps/web/src/components/settings/settingsSearch.ts; keyword (title, files, diff): usage; keyword (files, diff): settings Keep ours: usage history for more providers; it does not provide Prism role preferences or capacity lanes. Settings nav/search auto-merged.
7a12aff fix(mobile): scale Android controls with appearance text size (#13356) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
fd996d1 feat(observability): honor the standard OTLP endpoint, headers, and protocol variables (#13492) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
2598ce7 feat(desktop): honor the standard OTLP variables in the main process and WSL backends (#13641) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ed809f7 fix(web): restore compact provider instance badges (#13700) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
aade3a6 fix(usage): price Cursor cache savings by base model (#13731) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
2a9832b refactor(observability): name each service after its application (#13699) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
574b180 perf(server): shutdown no longer rewrites every stopped session row (#13688) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
b2577d6 fix(client): slow servers finish loading the thread list instead of loading it twice (#13683) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ee18e56 feat(observability): record event loop stalls in the server trace (#13697) keyword (diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
999161e perf(server): stop re-running git for every project each minute (#13689) keyword (diff): capacity Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
94c4216 fix(usage): hide the Cursor keychain prompt when Cursor isn't set up (#13714) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
04c15f3 feat(web): add chat width setting for wide screens (#11594) file: apps/web/src/components/settings/settingsSearch.ts; keyword (files, diff): settings Keep ours: chat width setting auto-merged; does not provide Prism settings.
dd8332d fix(server): installed editors no longer vanish when discovery is slow (#13669) keyword (diff): capacity Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
a21b42c fix(server): prune expired replay-protection files from the secrets directory (#13695) keyword (diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
daafcc4 feat(web): add keyboard navigation for usage (#10158) keyword (title, files, diff): usage; keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
295d7cb fix(web): queued messages send while their thread is not open (#13764) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
393d595 fix(accessibility): correct control announcements and sidebar traversal (#13491) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
10bb59b fix(usage): tolerate newer provider variants (#10076) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d6802b4 fix(usage): omit Cursor warning when no login is saved (#13820) keyword (title, files, diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3dae78f fix(usage): identify client version mismatches (#8208) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d110f98 test(usage): assert contract mismatch details (#13861) keyword (title, files, diff): usage Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
679c34c fix(clients): hide duplicate Cursor Keychain prompts (#13870) keyword (files, diff): usage; keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
74ee515 feat(observability): honor OTEL_*_EXPORTER=none per signal (#13736) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ab09917 fix(web): environment status tooltip resizes when the status changes (#13845) keyword (files, diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
de251fc fix(web): continue onboarding after incomplete history imports (#13935) keyword (diff): settings Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

sidebar-child-working

Show a parent thread as working, and keep it active, while its hidden child threads work.

Commit Match evidence Decision and rationale
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/components/Sidebar.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/Sidebar.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) file: apps/web/src/components/Sidebar.tsx; keyword (title, diff): auto-settle Keep ours: upstream's per-thread auto-settle switch is a manual opt-out; it does not keep a parent active while its hidden child threads work (#31). Its threadAutoSettleOptOut capability auto-merged beside our issues/issueLinks capabilities.
8251c8d fix(web): working and monitoring threads fade in the sidebar again (#13506) file: apps/web/src/components/Sidebar.tsx; keyword (title, diff): Working Keep ours: fade styling for working rows auto-merged; our child-activity status feeds the same row status.
fd46510 fix(web): keep sidebar terminal pulses in sync (#12962) file: apps/web/src/components/Sidebar.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
568c9bc chore: clear Effect language service suggestions (#13536) file: apps/server/src/orchestration/ThreadSettlementReactor.ts Keep ours: Effect language-service cleanup, auto-merged.
df9826f feat(web): agents working banner links to the Agents panel (#13572) keyword (title): Working; keyword (title): agents working Keep ours: the banner links provider-native background agents to the Agents panel; fork child threads do not set the parent's backgroundLiveness, so it does not replace the sidebar child-working state.
b3de243 fix(dev): one t3.json setup action that works on every OS (#13589) keyword (diff): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
86054b6 fix(desktop): `t3 app` keeps working after a second desktop app quits (#13585) keyword (title): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
e5a46d6 feat(usage): read cursor, opencode, and antigravity history (#10409) keyword (diff): auto-settle Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
4293433 perf(server): avoid rereading unchanged files in review previews (#13395) keyword (diff): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
ed809f7 fix(web): restore compact provider instance badges (#13700) file: apps/web/src/components/Sidebar.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
6530de0 perf(server): pull request sync reads only threads with linked pull requests (#13704) keyword (diff): backgroundLiveness Keep ours: PR sync reading only threads with linked PRs does not affect Issue links or child activity.
3b0a495 perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list (#13691) file: apps/server/src/orchestration/ThreadSettlementReactor.test.ts; file: apps/server/src/orchestration/ThreadSettlementReactor.ts; keyword (diff): backgroundLiveness Merge both: ThreadSettlementReactor.ts conflicted (fork #31 in #37). Upstream's one-thread read kept; it holds no child threads, so the guard reads every thread (settled children included) only after a settle time is resolved and before dispatch, once per sweep. The turn-end path pays nothing extra, keeping #13691's gain. Test 'a settled child thread's background work keeps its parent active' fails without that read (checked by mutation). Corrected after review.
94c4216 fix(usage): hide the Cursor keychain prompt when Cursor isn't set up (#13714) keyword (diff): Working Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
92f0af2 Show a focus ring on sidebar thread and draft rows (#13344) file: apps/web/src/components/Sidebar.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
6f97b0f perf(clients): sort projects and settled threads without re-parsing dates per comparison (#13759) file: apps/web/src/components/Sidebar.tsx; keyword (diff): auto-settle Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
1d6f23b perf(server): background sweeps only read threads that can still settle (#13765) file: apps/server/src/orchestration/ThreadSettlementReactor.test.ts; keyword (diff): backgroundLiveness Merge both: the background sweep's unsettled-only read hides settled children, and a manually settled child can still have background work. The full sweep filters with the threads it read, and the settle-time read of every thread (once per sweep, only when something would settle) catches settled children. Covered by the same test. Corrected after review: the earlier rationale wrongly said background children are always unsettled.
393d595 fix(accessibility): correct control announcements and sidebar traversal (#13491) file: apps/web/src/components/Sidebar.tsx; keyword (diff): Working Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.

@lukemaj

lukemaj commented Sep 27, 2026

Copy link
Copy Markdown
Contributor Author

Decided upstream overlap report, part 2 of 2 (from scripts/fork-rebase.sh --dry-run before absorption).

issues-browse

List GitHub Issues of all project repositories beside PRs, with filters, parent tree and a side panel.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/CommandPalette.tsx; file: apps/web/src/components/sidebar/SidebarChrome.tsx Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/routes/_chat.pull-requests.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
3412097 feat(server): show and redeem Claude banked resets (#13118) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
9a91177 fix(web): sidebar Back always returns to the main app (#13516) file: apps/web/src/components/sidebar/SidebarChrome.tsx Keep ours: upstream's isSidebarUtilityPage covers /pull-requests, which also hosts our Issues view, so Back works for Issues without a fork edit. Fork branding and Issues entry in SidebarChrome auto-merged.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
3e2370f feat(web): add usage page keybinding (#9434) file: apps/web/src/components/CommandPalette.tsx; keyword (diff): command palette Keep ours: usage keybinding in CommandPalette auto-merged beside the fork Issues palette items.
568c9bc chore: clear Effect language service suggestions (#13536) file: apps/server/src/pullRequest/GitHubPullRequestCli.ts; file: apps/server/src/ws.ts; keyword (diff): issues Keep ours: Effect language-service cleanup, auto-merged.
fc46b8c ci(relay): add a forced manual relay deploy (#13550) keyword (diff): issues Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
1dc8cbe feat(observability): write a server heap snapshot on SIGUSR2 (#13694) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
ee18e56 feat(observability): record event loop stalls in the server trace (#13697) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
999161e perf(server): stop re-running git for every project each minute (#13689) file: apps/server/src/ws.ts Keep ours: ws.ts git refresh change auto-merged beside the fork RPC handlers.
a21b42c fix(server): prune expired replay-protection files from the secrets directory (#13695) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
daafcc4 feat(web): add keyboard navigation for usage (#10158) file: apps/web/src/routes/_chat.pull-requests.tsx; keyword (diff): command palette Keep ours: usage keyboard navigation auto-merged; fork Issues route and knip entry untouched.
294dd12 fix(observability): the renderer trace proxy stops tracing itself (#13761) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.

issues-links

Link GitHub Issues to threads, show them beside PRs and start a linked thread from an Issue.

Commit Match evidence Decision and rationale
cb1a3f3 fix(web): show repository names on linked pull requests (#13061) keyword (files, diff): ThreadPullRequestsPanel; keyword (title): Linked pull requests Keep ours: repository names on linked PRs; our Issue links panel sits beside the PR panel, auto-merged.
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/CommandPalette.tsx Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/ChatView.tsx; file: apps/web/src/components/RightPanelTabs.tsx; keyword (files, diff): ThreadPullRequestsPanel Keep ours: theme-token recolor, auto-merged; fork edits untouched.
3412097 feat(server): show and redeem Claude banked resets (#13118) file: apps/server/src/server.ts; keyword (diff): capabilities Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
66129c6 feat(web): run shell commands from chat in the thread terminal (#13060) file: apps/web/src/components/ChatView.tsx Keep ours: shell commands from chat is a new link kind; our Issue/PR link interception and branding edits auto-merged beside it.
567783e fix(codex): the protocol generator runs again on Effect rc.115 (#13480) keyword (diff): capabilities Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
d5d4874 feat(codex): require Codex 0.156 and regenerate its protocol (#13481) keyword (diff): capabilities Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
0109670 feat(threads): add per-thread auto-settle switch (#11846) file: apps/server/src/environment/ServerEnvironment.ts; file: packages/contracts/src/environment.ts; keyword (diff): capabilities Keep ours: upstream's per-thread auto-settle switch is a manual opt-out; it does not keep a parent active while its hidden child threads work (#31). Its threadAutoSettleOptOut capability auto-merged beside our issues/issueLinks capabilities.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
72447f2 feat(grok): offer one-click updates through `grok update` (#13523) keyword (diff): capabilities Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3e2370f feat(web): add usage page keybinding (#9434) file: apps/web/src/components/CommandPalette.tsx Keep ours: usage keybinding in CommandPalette auto-merged beside the fork Issues palette items.
568c9bc chore: clear Effect language service suggestions (#13536) file: apps/server/src/environment/ServerEnvironment.ts; file: apps/server/src/ws.ts; keyword (diff): capabilities Keep ours: Effect language-service cleanup, auto-merged.
6391be2 fix(server): newer Codex models get T3 Code's instructions again (#13547) keyword (diff): capabilities Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
4f27a84 fix(mcp): preview snapshots fit in the agent's tool output again (#13558) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview tool output changes in McpHttpServer auto-merged beside the threads/prism/issues toolkit registration.
0c84b42 fix(web): paste after clicking away from the composer lands in it again (#13553) file: apps/web/src/components/ChatView.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
1e192b2 fix(mcp): preview errors tell agents what to do instead (#13559) file: apps/server/src/mcp/McpHttpServer.ts Keep ours: preview error text in McpHttpServer auto-merged beside the fork toolkits.
df9826f feat(web): agents working banner links to the Agents panel (#13572) file: apps/web/src/components/ChatView.tsx Keep ours: the banner links provider-native background agents to the Agents panel; fork child threads do not set the parent's backgroundLiveness, so it does not replace the sidebar child-working state.
a107f8a fix(clients): a preview app no longer knocks the desktop's own server offline (#13577) keyword (diff): capabilities Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
13d6b30 fix(web): new worktree threads no longer say "checkout" during setup (#13590) file: apps/web/src/components/ChatView.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
6530de0 perf(server): pull request sync reads only threads with linked pull requests (#13704) keyword (title): Linked pull requests Keep ours: PR sync reading only threads with linked PRs does not affect Issue links or child activity.
1dc8cbe feat(observability): write a server heap snapshot on SIGUSR2 (#13694) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
6989856 perf(web): hidden terminal drawers no longer keep full thread history in memory (#13686) file: apps/web/src/components/ChatView.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
ee18e56 feat(observability): record event loop stalls in the server trace (#13697) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
999161e perf(server): stop re-running git for every project each minute (#13689) file: apps/server/src/ws.ts Keep ours: ws.ts git refresh change auto-merged beside the fork RPC handlers.
04c15f3 feat(web): add chat width setting for wide screens (#11594) file: apps/web/src/components/ChatView.tsx Keep ours: chat width setting auto-merged; does not provide Prism settings.
a21b42c fix(server): prune expired replay-protection files from the secrets directory (#13695) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
294dd12 fix(observability): the renderer trace proxy stops tracing itself (#13761) file: apps/server/src/server.ts Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
295d7cb fix(web): queued messages send while their thread is not open (#13764) file: apps/web/src/components/ChatView.tsx; keyword (diff): capabilities Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.
dd582de fix(web): stop mistaking offline servers for updates (#13083) file: apps/web/src/components/ChatView.tsx Keep ours: auto-merged; upstream change is unrelated to the fork edit in this file.

issues-status

Compute each Issue's status from GitHub, links and thread activity; group and filter the Issues view by it and wire linked threads and Start thread.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/CommandPalette.tsx; file: apps/web/src/components/sidebar/SidebarChrome.tsx Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/routes/_chat.pull-requests.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
0109670 feat(threads): add per-thread auto-settle switch (#11846) file: apps/server/src/environment/ServerEnvironment.ts; file: packages/contracts/src/environment.ts Keep ours: upstream's per-thread auto-settle switch is a manual opt-out; it does not keep a parent active while its hidden child threads work (#31). Its threadAutoSettleOptOut capability auto-merged beside our issues/issueLinks capabilities.
9a91177 fix(web): sidebar Back always returns to the main app (#13516) file: apps/web/src/components/sidebar/SidebarChrome.tsx Keep ours: upstream's isSidebarUtilityPage covers /pull-requests, which also hosts our Issues view, so Back works for Issues without a fork edit. Fork branding and Issues entry in SidebarChrome auto-merged.
8d7b5e9 fix(connect): remove tunnels after hosts go offline (#9386) keyword (diff): statuses Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
3e2370f feat(web): add usage page keybinding (#9434) file: apps/web/src/components/CommandPalette.tsx Keep ours: usage keybinding in CommandPalette auto-merged beside the fork Issues palette items.
568c9bc chore: clear Effect language service suggestions (#13536) file: apps/server/src/environment/ServerEnvironment.ts Keep ours: Effect language-service cleanup, auto-merged.
daafcc4 feat(web): add keyboard navigation for usage (#10158) file: apps/web/src/routes/_chat.pull-requests.tsx Keep ours: usage keyboard navigation auto-merged; fork Issues route and knip entry untouched.
8872666 perf(server): cut idle wakeups from the Connect relay and session reaper (#13774) keyword (diff): statuses Keep ours: keyword-only match; the commit does not change this feature's behavior or files.
295d7cb fix(web): queued messages send while their thread is not open (#13764) keyword (diff): blockedBy Keep ours: keyword-only match; the commit does not change this feature's behavior or files.

issues-open-links

Open GitHub /issues/N links and an Issue's pull requests in the app: the PR panel for pull requests, the Issues panel for Issues, the browser otherwise.

Commit Match evidence Decision and rationale
80fc23a lint/unknown and static (#13366) file: apps/web/src/components/ChatMarkdown.tsx Keep ours: mechanical lint cleanup, auto-merged around the fork edits.
315fcca fix(web): web colors come from theme tokens (#13371) file: apps/web/src/components/ChatMarkdown.tsx Keep ours: theme-token recolor, auto-merged; fork edits untouched.
f26ee08 fix(web): appearance classes use theme tokens and scale values (#13397) file: apps/web/src/components/ChatMarkdown.tsx; keyword (files, diff): PullRequestLinkPreview Keep ours: theme-token recolor, auto-merged; fork edits untouched.
66129c6 feat(web): run shell commands from chat in the thread terminal (#13060) file: apps/web/src/components/ChatMarkdown.tsx Keep ours: shell commands from chat is a new link kind; our Issue/PR link interception and branding edits auto-merged beside it.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 27, 2026
@lukemaj

lukemaj commented Sep 27, 2026

Copy link
Copy Markdown
Contributor Author

Independent review: 72ba8f658d155a1edd87be68489718ed80dd9c39

Verdict: changes requested. The rebase itself is faithful. It drops nothing, duplicates nothing, and the capability flags, theme tokens and TS4058 fix are correct. Two things block landing: no CI has run on this candidate, and the settlement merge gives back most of upstream #13691's gain on its hot path.

Method: git range-diff b2b43bef7..096e9c006 de251fc29..72ba8f658, plus reading upstream #13691, #13765 and #11846, the decider and projector settle paths, and childThreadActivity.ts. No tests were run and no worktree was created.

Findings

  1. Medium (landing gate): CI never ran on this PR. GitHub reports mergeable: CONFLICTING. GitHub does not fire pull_request workflows for a PR that conflicts with its base, so ci.yml and fork.yml (Check, Test, Fork Stack Model) have no runs on 72ba8f658. Only PR Size and PR Vouch ran, because they use pull_request_target. The Fork maintenance: commit stack on upstream, rebase routine and CI #6 handoff says "Fork CI on PR chore(fork): absorb upstream through de251fc29 (#6) #45 is still running"; it is not running. The same gap will recur on any absorption that conflicts with the old main, and docs/fork.md:152 ("Open a PR to main for CI and review") assumes CI will run.
    Fix: push a branch at de251fc29 (for example absorb-base/de251fc29) and retarget chore(fork): absorb upstream through de251fc29 (#6) #45's base to it. The PR then contains only the 18 stack commits, merges cleanly, and CI runs. Restore the base to main before landing, or leave it, since landing is by --force-with-lease. Update the routine in docs/fork.md to match.

  2. Medium (performance): apps/server/src/orchestration/ThreadSettlementReactor.ts:105-115. The extra getShellSnapshot({ unsettledOnly: true }) runs whenever the single thread passes isAutoSettlementCandidate. That check is cheap: not archived, no override, idle, no pending requests, no background liveness. Per-thread sweeps are enqueued on every non-running thread.session-set (every turn end) and on PR link and sync events. At turn end the thread is idle, so it is almost always a candidate. Auto-settle is on by default (sidebarAutoSettleOnMerge defaults to true, and sidebarAutoSettleAfterDays has a default). So by default every turn end on every thread reads the full unsettled shell snapshot (projects, threads, sessions, latest turns and PR rows). That is the read #13691 removed. Upstream's own per-thread test needed Queue.clear(fixture.snapshotReads) (test :478) because the extra read fires in upstream's ordinary scenario. The PR body and the Fork maintenance: commit stack on upstream, rebase routine and CI #6 handoff say the guard reads "only when that thread would actually settle" and that "upstream's perf win holds in the common case". Neither is true of the code. It is still cheaper than the pre-rebase fork, which read the full unfiltered snapshot, but it regresses against upstream on a hot path.
    Fix, with no new upstream-file edit: on the one-thread path, skip the guard when building candidates. Inside settleThread, after resolveAutoSettlementAt returns a non-null settledAt and before engine.dispatch, read the unsettled threads and return early if childThreadActivityByParent(...) has the thread. The read then happens only when a thread would really settle. That is rare, and it is what the PR text already claims. Keep the up-front filter for the full sweep, where snapshot.threads is already loaded. The existing new test still covers it. Drop the Queue.clear accommodation if the ordinary test no longer needs it.

  3. Low (correctness, from upstream #13765): the guard no longer sees settled children. Full sweeps and the new per-thread read both use unsettledOnly, so a child with settled_at set or settled_override = 'settled' is invisible to childThreadActivityByParent. Starting a session and approval or input requests unsettle a thread (decider.ts, thread.session.set and thread.activity.append). Background liveness does not unsettle it, and a manual settle does not block on it (settle blocks only on a starting or running session, pending requests, or a queued turn). Scenario: a child is manually settled while its provider-native background work is still working or monitoring. Before the rebase that child kept the parent active. Now the parent can auto-settle, while the web sidebar, which reads all shells, still shows child activity. The report row for #13765 ("working, waiting or background children are unsettled, so the guard still sees them") is therefore inaccurate for the background case.
    Fix: accept the edge and correct the rationale in the report and the absorption log, or keep the guard's read unfiltered on the rare settle-decision path from finding 2, where the cost no longer matters.

  4. Low (docs): docs/fork.md:200-227, the absorption log entry. The log format (docs/fork.md:197-198) requires "proof" in the entry, but the entry points to the PR instead. :216 says the guard reads "when the one thread would settle", which does not match the code (see finding 2). The entry's time ("2 minutes ... 6 minutes", the rest "recorded on the absorption PR") is also less complete than the PR's own figure of about 34 minutes.
    Fix: add the proof line (scripts/fork-rebase.sh --proof on the final head, 590s, fork check, install, typecheck, lint, 18,240 tests and fmt all passing) and the total time. Make the wording match whichever behaviour finding 2 lands on.

Checked, no finding

  • Range-diff: 17 to 17 commits, matched one to one, with a new commit 18. Commits 1–5, 7, 8, 10, 11, 14, 16 and 17 are identical. The changed commits (6, 9, 12, 13, 15) differ only in the three conflicts, the 14 token swaps, the return type, formatter reflow and upstream context drift (useCanGoBack dropped by #13516, useEscapeToGoBack added, threadAutoSettleOptOut context). Both the old and new stacks touch the same 156 files, so no fork change was lost or duplicated.
  • Conflicts: WelcomeWizard (text-2xl with APP_BASE_NAME) and knip (setup-worktree.ts with fork-features.mjs) are correct. The ThreadSettlementReactor guard still holds on both paths. Its per-thread read happens after snapshotSequence, so the race window is no wider than before, and the decider still refuses to auto-settle a starting or running thread.
  • Tokens: all 14 swaps use the mapping upstream #13371 and #13397 applied to the same arbitrary values: .65rem to text-3xs (exact), 11px to text-2xs (exact), .7rem to text-2xs (0.2px smaller), 13px plus leading-[1.45] to text-xs leading-normal (1px smaller, as upstream chose), emerald-600 to success-foreground (now has a dark variant), and amber-500 to warning/30 with warning-surface. All tokens exist in apps/web/src/index.css at the base. Visual deltas are small and match upstream's own choices.
  • TS4058: ReturnType<typeof planScopedSettingsPatch> is exact because the function is not generic.
  • Capabilities: threadAutoSettleOptOut, issues and issueLinks are all set in ServerEnvironment.ts:238-243, and all three are optional keys in packages/contracts/src/environment.ts.
  • Overlap: "adopt upstream: none" is sound. #11846 is a manual opt-out, #13572 covers provider-native background agents, and no upstream commit adds child threads, Issues, Prism or branding. The upstream titles in the range show no replacement.
  • Fork-check invariants (reproduced from git objects, since CI did not run): 18 commits against a limit of 20, no merges, and all 55 modified upstream paths are allowlisted. fork-features.mjs check passes with 14 features; the allowlist and feature map are unchanged from main. Pre-existing and not from this PR: three allowlist entries (apps/server/src/mcp/toolkits/threads/{childThreads.test.ts,handlers.ts,tools.ts}) are fork-new files, so they are dead entries.

Reviewer: Claude Opus 5.5 (1M context) via Claude Code in T3 Code. Review only; nothing was edited or pushed.

@lukemaj
lukemaj changed the base branch from main to absorb-base/de251fc29 September 27, 2026 15:38
@lukemaj
lukemaj force-pushed the chore/6-absorb-upstream branch from 72ba8f6 to abcb2a5 Compare September 27, 2026 15:38
@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 27, 2026
@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 13.5 KiB — 15.1 KiB ✅
Codex Thread snapshot wire — 7.1 KiB — 7.3 KiB ✅
Codex Live turn WebSocket wire — 6.5 KiB — 7.8 KiB ✅
Codex Live turn WebSocket decoded — 56.3 KiB — 66.4 KiB ✅
Codex Live turn messages — 10 — 21 ✅
Claude Total thread wire — 13.5 KiB — 15.1 KiB ✅
Claude Thread snapshot wire — 7.1 KiB — 7.3 KiB ✅
Claude Live turn WebSocket wire — 6.5 KiB — 7.8 KiB ✅
Claude Live turn WebSocket decoded — 57.1 KiB — 66.4 KiB ✅
Claude Live turn messages — 10 — 21 ✅

Baseline: unavailable · PR result: 8518d0d · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 113.9 KiB
  • Claude decoded thread snapshot: 114.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@lukemaj
lukemaj force-pushed the chore/6-absorb-upstream branch from abcb2a5 to d7ee6ae Compare September 27, 2026 15:44
lukemaj and others added 11 commits September 27, 2026 17:52
* docs(fork): rebase routine, stack check and fork CI

Fork stays a small topic-commit stack on upstream main: docs/fork.md
describes the model, scripts/fork-rebase.sh absorbs upstream updates with
per-file conflict reports and proof-gated pushes, scripts/fork-check.sh
enforces the model, and .github/workflows/fork.yml runs it on every PR.
No upstream-owned files are modified.

Refs #6

* fix(fork): fork-rebase listing must survive head closing the pipe

* test(fork): focused tests for the rebase routine safety rules

fork-check.sh and fork-rebase.sh are driven against throwaway git
fixtures: new-file pass, unallowlisted-edit fail, allowlist pass,
merge-commit fail, missing-doc fail, no-proof push refusal and
no-main push refusal.

Refs #6

* docs(fork): list maintenance tests and fix formatter whitespace

Refs #6

* fix(fork): run proof in a subshell cleared of ELECTRON_RUN_AS_NODE

* docs(fork): Chromeria install, squash-plus-absorption model and GitHub-hosted CI

Document building, installing and updating the Chromeria desktop app,
land absorptions on main with --force-with-lease after proof, allowlist
every fork edit of upstream files, remap the PR and main CI workflows
from Blacksmith to GitHub-hosted runners, and run the routine's proof in
a host-neutral environment.

Refs #6.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* ci(fork): check the PR head, not GitHub's merge ref

Refs #6.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(fork): allowlist the #14 web branding edits

Refs #6.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(server): remove unused threads toolkit export

* fix(web): provide branding in bundled dev fixture

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
) (#18)

* feat(web): Prism spawns, collapsed child tree and parent breadcrumb (#17)

The Agents panel now separates threads Model Router (Prism) started for
this thread from the thread's own spawns, grouped by job with status and
route. Router threads are recognized from the [model-router job ...] tag
in their first message, read once per thread and cached. Rows with child
threads show a collapsed chevron with the child count that reveals
compact nested rows. A child thread's header shows the parent title as a
link plus a menu to switch between siblings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): keep Agents tree internals unexported for knip (#17)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ovider snapshot (#22)

* feat(contracts): Prism role kits and provider snapshot schema (#19)

Role kits (instructions, runtime mode, skills, thread-tool scope) and
ordered model preferences for the six Prism roles, stored as the
project-scoped server setting prismRoles, with a per-role patch. Adds the
GET /api/prism/snapshot response schema for the router.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(server): Prism MCP toolkit, spawn_thread(role) and provider snapshot endpoint (#19)

Adds prism_submit, prism_status, prism_questions and prism_answer, which
run the installed Model Router CLI with the calling thread as the T3
planner and a server URL plus an orchestration-scoped token supplied by
the server. spawn_thread takes a Prism role, applies its kit and first
eligible preferred model, and each role's thread-tool scope is enforced.
GET /api/prism/snapshot returns providers, models, usage windows with
resetsAt and the role kits resolved for a project. OpenCode usage now
refreshes on the provider health interval.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore: drop unused Prism exports flagged by knip (#19)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(contracts): Prism model lists per role and lane (#19)

Each role keeps an ordered list of {instanceId, model, effort} per lane
(easy, medium, hard): the first entry is the primary choice, the rest are
fallbacks, and one model at another effort is its own entry. Adds
PrismLane (default medium) and per-lane patching. The snapshot carries
the same structure through PrismRoleKits.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(server): pick role models by lane in spawn_thread and prism_submit (#19)

spawn_thread takes an optional lane (default medium) and walks that
role's lane list, primary first then fallbacks. prism_submit takes
easy, medium or hard and maps them onto the installed router's
small, default and hard lanes. PRISM_LANES stays module-local for knip;
PrismLane.literals lists the lanes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* wip: add Prism role preferences and capacity settings (#21)

* wip: edit easy medium and hard lanes for every Prism role

* wip: derive Prism lanes from the exported schema

* wip: serialize Prism saves through the settings snapshot

* wip: retain Prism save guard across scope navigation
* feat(fork): map fork features and report upstream overlap

* fix(fork): register report entry point and validate feature ids

* docs(fork): point edit guidance to the feature map
…ker (#26) (#35)

* feat(contracts): single model lists outside Worker, Retry and Escalation switchable (#26)

Only the worker keeps easy/medium/hard lists; every other role has one
ordered list under models, and a saved per-lane list keeps its medium
entry as that list. Retry (correction) and Escalation (recovery) gain
enabled. The snapshot still repeats each single list in every lane until
toolboxmd/model-router#127 reads single lists. spawn_thread accepts retry
and escalation next to the old names.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(web): Prism settings in the Providers layout with autosave (#26)

A role list (icon, name, description, toggle) and a detail pane with one
ordered model list per role, reorderable by drag or arrows and saved on
every change. Only Worker shows easy/medium/hard tabs. Retry and
Escalation can be switched off; Dispatcher, Worker and Reviewer show
locked on with the reason. Planner is no longer on the page. The Agents
panel shows each Prism job as a heading without a status dot.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): show locked Prism roles with a lock and keep model rows on one line (#26)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore(web): drop unused applyPrismRoleUpdate export flagged by knip (#26)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Upstream main is now 113 commits past the fork base, so the
`--depth 100` fetch no longer contains the merge base and
fork-check.sh exited 1 silently under set -e. Fetch upstream main with
full history but no blobs, and print a clear error when the merge base
cannot be found.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d status (#25) (#37)

* feat(web): show parent threads as working while child threads work (#31) (#33)

* feat(web): show parent threads as working while child threads work (#31)

Child threads are hidden from the sidebar, so their work never reached the
parent row. A shared pure helper derives descendant child-thread activity
from thread shells; the sidebar row feeds it through the existing status
resolvers (Working pill and timer with "· N agents", child approvals as
the parent's approval), and the auto-settle sweep keeps such parents
active like threads with live background work.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(fork): record PR for sidebar-child-working (#31)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): surface child input, time from the earliest child (#31)

Review fixes: a child waiting on user input now shows the parent's
awaiting-input state, and children waiting on input or with any background
work (monitoring included) keep the parent from auto-settling. An idle
parent's Working timer starts at its earliest working child, and the
"· N agents" count sits outside the aria-hidden timer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(web): browse GitHub Issues next to PRs (#27) (#32)

* feat(web): browse GitHub Issues next to PRs (#27)

The Pull Requests page gains a PRs/Issues toggle (`view=issues`) and the
sidebar an Issues icon. Issues from every GitHub repository of the user's
projects are read live through `gh` (one GraphQL search per host page,
within the existing GraphQL budget and rate-limit handling), merged across
connected environments, and shown as Open, Done or Not planned. Search,
sort, repository/label/milestone/parent filters, a parent tree that marks
sub-Issues outside the user's projects, and a side panel with body,
comments, comment, close and reopen. The command palette searches the
listed Issues while the page is open.

No storage: upstream tables, migrations and events are unchanged. Upstream
edits are allowlisted and mapped under the `issues-browse` feature.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(fork): map the Issues browse PR (#27)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): surface Issues list failures and address review (#27)

- Show a failed server or "Load more" page with Retry above the rows that
  stay, and stop offering "Load more" while it failed.
- Toasts for comment and close/reopen carry GitHub's reason.
- Locked Issues keep the comment box (GitHub has no viewerCanComment); a
  note explains and GitHub's refusal is shown.
- Count non-GitHub repositories once by host and repository across
  worktrees, pages and servers.
- Palette Issues group follows Actions and appears only once typed.
- Remove unused scoreIssueMatch and knip-flagged exports; table tests for
  issueStateOf and issueSearchQuery; typecheck fix in the live suite.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(server): link GitHub Issues to threads (#28) (#34)

* feat(server): link GitHub Issues to threads (#28)

Store only non-derivable Issue links in the fork-owned
fork_thread_issue_links table (created by the fork, outside upstream
migrations and the event log). Derive branch links from conventional
<type>/<number>-<slug> branches and closing-reference links from the
thread's linked pull requests (real gh) or, for Issues, from the closing
pull requests the caller already read.

Expose issueLinks.* RPCs (for thread, batched threads for Issues, link,
unlink, change push) behind an issueLinks capability,
link_issue/unlink_issue/list_thread_issues MCP tools, an Issues section
in the "Linked PRs and Issues" panel, and a start-thread-from-Issue
action that opens a draft in the matching project, prefills it and links
it at once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(server): keep retried threads' Issue links and refresh on batched changes

- Prune deleted threads' links only once deleted over a week ago: a failed
  first-send bootstrap deletes a thread and the retry re-creates its id.
- Deliver change pushes to the client one batch at a time and match a
  batch if any change names the thread or Issue.
- Render the Issues section only where the server advertises issueLinks.
- Enable and rename the command palette entry for the linked surface.
- Cover caller-supplied closing references in CI with real rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(web): computed Issue status with grouping and filters (#29) (#36)

* feat(web): computed Issue status with grouping and filters (#29)

Each Issue gets one status from the #25 table, first match wins: GitHub
state and close reason, open native blockers, closing pull requests
(open, draft) with the trusted `review/independent` mark on their head,
task-branch links, and whether a linked thread or any descendant child
thread works now.

The Issues page read gains blockers, closing pull requests with head SHA
and the review mark in the same per-page GraphQL query (cost 2 -> 3 per
100 rows); marks count only when the query's viewer posted them. The
view groups by status with Done and Not planned collapsed, adds Status
and Linked filters, shows linked threads on rows, wires Start thread on
rows and the side panel, and opens the side panel from a thread's linked
Issue through the `issue` search parameter.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): count thread-linked PRs, trust marks across servers, drafts pause (#29)

Review fixes for PR #36:

- A PR into a non-default branch makes no closing reference, so the
  Issue's PRs are now its closing PRs plus the open PRs linked to its
  linked threads, deduped by repository and number. Each host's first
  search page reads those thread-linked PRs as `resource(url:)` aliases in
  the same GraphQL request (cost stays 3 per 100 rows with 50 aliases; a
  missing PR answers null instead of failing the page), and
  `threadsForIssues` returns each thread's PR keys.
- Threads are looked up on every server that keeps Issue links, and a
  review mark is trusted when any server that listed the Issue runs as
  its poster; the server now returns the mark's creator and its viewer.
- An open draft PR with nobody working reads as Paused; merged PRs keep
  not counting while the Issue is open.
- The status table moves to contracts so the live suite checks it too.
- The Issues view subscribes to a working-thread key atom instead of all
  thread shells, and a row's Start thread waits and ignores repeat clicks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(server): read only PRs of Issue-linked threads, also without a search (#29)

Re-review fixes for PR #36:

- Thread-linked pull request candidates now come from threads that link
  to an Issue (a stored, non-dismissed link or a task branch), through a
  new `IssueLinks.pullRequestsOfIssueThreads`. Last-synced snapshot state
  no longer filters them: the same GraphQL read returns GitHub's state.
  The 50 cap stays as a bound and logs when it truncates.
- A server whose repositories a filter excludes still reads its
  candidates and viewer in a small aliases-only request.
- While one row starts a thread, every row's Start button is disabled.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): close Issues integration gaps (#25) (#38)

* fix(web): close Issues integration gaps (#25)

- Servers advertise an `issues` capability; the Issues list, the sidebar
  Issues icon, the palette's "Open issues" action and the PRs/Issues
  switch use only servers that have it, so upstream and older servers no
  longer answer `issues.list` with an unknown-tag error.
- The side panel shows the Issue's linked threads (open one) and its
  closing and thread-linked pull requests (open on GitHub), read for the
  one Issue, so it works when opened from a thread's link too. The Issue
  detail read now carries closing pull requests.
- The command palette finds threads by linked Issue: `#N`,
  `owner/repo#N` or an Issue URL asks `threadsForIssues` on servers with
  Issue links, debounced and bounded to 20 repositories per server.
- Start thread prefers a project on a server that keeps Issue links.
- User docs cover linking by hand, unlinking and the MCP tools.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): find closing-reference threads from the palette (#25)

Review fixes for PR #38:

- The palette's Issue lookup sends the Issue's closing pull requests:
  from the loaded Issues list entry, else, for `owner/repo#N` or a URL,
  from one debounced Issue read on a server that lists Issues. A bare
  `#N` the list does not hold finds stored and branch links only; the
  user docs say so.
- An `issue=` link without a usable `selectedEnvironmentId` resolves to
  a server that lists Issues, one keeping Issue links first, and never
  to a server without `issues.*`.
- The detail read's mapping moves to `issueDetailOf`, with a CI test
  decoding a fixture with one closing pull request and one null node.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(web): open PRs from Issues and chat links in the app (#40)

The Issue side panel's pull requests opened GitHub, and GitHub `/issues/N`
links in chat (including `#N` autolinks, which GitHub numbers together with
pull requests) opened GitHub or nothing. Pull request links inside an Issue
body updated the PR panel while the Issues view stayed in front.

- Issue panel PR rows open through the existing change request opener, with
  a separate "Open on GitHub" button.
- A new on-click resolver reads N as a pull request, then as an Issue, and
  opens the PR panel, the Issues side panel, or the browser. Nothing is read
  on render; every failed read falls through to the browser.
- The PR opener leaves the Issues view when it navigates the PR page.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): address review of Issue and PR link opening (#40)

- On the web, when the click's user activation lapsed during the reads, the
  browser fallback shows a toast with an "Open on GitHub" action instead of
  a window.open the popup blocker would swallow.
- Leaving the Issues view to open a pull request pushes a history entry, so
  Back returns to the Issue.
- A repeat click while a link is being read joins that read.
- The user guide says the fallback follows the "Open links in" setting.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): ask for a fresh click only when the fallback opens a web tab (#40)

The "Open on GitHub" toast now appears only when the fallback would open a
new browser tab on the web after the click's activation lapsed, not when
"Open links in" sends the link to the in-app browser or on desktop.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(web): Issues filters use the PR Filters menu (#42)

The Issues toolbar had its own State dropdown, a sort button labelled with
the current sort and one long Filters list. It now uses the pull request
list's Sort button, Filters trigger and per-filter submenus. Project, Labels
and Parent search like the Author filter.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): keep active Issue filters visible and test filter search (#42)

Milestone and Parent keep an active value listed after the loaded rows stop
carrying it. The Filters count includes State like PR mode, and Clear filters
resets State too. The searched submenu option logic moves into a pure helper
with unit tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@lukemaj
lukemaj force-pushed the chore/6-absorb-upstream branch from d7ee6ae to 8518d0d Compare September 27, 2026 15:52
@lukemaj

lukemaj commented Sep 27, 2026

Copy link
Copy Markdown
Contributor Author

Independent re-review: 8518d0d86cdf432c371441909e996fcef0b3e9f9

Verdict: approve. The four earlier findings are resolved. Scope: git range-diff de251fc29..72ba8f658 de251fc29..8518d0d86, diffs only, no worktree.

Resolved

  1. CI. The PR base is now absorb-base/de251fc29, which points at de251fc2971a exactly. GitHub reports the PR as MERGEABLE. Check, Test, Test Server 1–3, Rust, Release Smoke, Fork Stack Model and mobile static analysis all pass on 8518d0d86. Native fingerprint diff passed at 15:52. A rerun that started at 16:00 was still in progress when I checked.
  2. Settlement performance. ThreadSettlementReactor.ts now filters candidates with the child activity from the threads the sweep already read. The per-thread path adds nothing for an ordinary turn end. The guard's read (getShellSnapshot(), wrapped in Effect.cached so it runs at most once per sweep) happens only after resolveAutoSettlementAt returns a settle time, just before dispatch. It covers both the inactivity path and the PR lookup path because both go through settleThread. If the read fails, the catch in settleThread skips the thread, so the failure mode is "don't settle". Upstream's per-thread test is unchanged again, with the Queue.clear removed.
  3. Settled children. The guard's read is unfiltered, so a settled child with background work is counted. The new test covers both the full sweep and the one-thread path: the sweep read returns only the parent through the getShellSnapshot override, the unfiltered read holds the settled sub.parent.watcher with monitoring, and the parent never settles.
  4. Docs. The Absorption log section and commit are gone, and nothing else in the tree refers to them. The Routine now publishes absorb-base/<sha>, opens the PR against it, explains why, and notes that fork-check.sh takes its base from upstream/main (true: it uses git merge-base HEAD upstream/main). It also says to delete the base branch after landing and names the PR description plus the fork-maintenance Issue as the record.

Other checks. The stack is 17 commits. Commits 1–6 are identical, and 8–11, 13, 14, 16 and 17 differ only in patch ID. The ci.yml change appends --testTimeout=20000 to the fork's Test step. ci.yml is already a fork-edited, allowlisted file, and the Test job passed with the flag.

Low, non-blocking notes

  • a. Upstream hardening partly undone. ThreadSettlementReactor.ts (the Effect.cached(snapshots.getShellSnapshot()...) read) makes every settle decision depend on the full read. That read hydrates settled threads' PR rows, which upstream #13765 deliberately kept sweeps from depending on; its test shows a corrupt settled row failing getShellSnapshot(). If a settled row goes bad, auto-settle stops, logging "automatic thread settlement skipped" each time. Before the rebase the fork read the full snapshot on every sweep, so this is no worse than the old fork, but it gives back part of upstream's hardening. The same read serves the clients' thread list, so a bad row would show up there first.
  • b. Repeat full reads for a held parent. A parent held active only by a settled child's background work resolves a settle time on every minute sweep, and on its own session events. Each of those sweeps then pays one full read. This lasts only while that work runs, and the cost matches what the old fork paid on every sweep.
  • c. Test gap. The test harness no longer counts unfiltered reads (snapshotReads only records unsettledOnly reads), so no test would catch an unconditional full read coming back on the per-thread path. A counter asserted at zero in upstream's per-thread test would pin the performance property.

Reviewer: Claude Opus 5.5 (1M context) via Claude Code in T3 Code. Review only; nothing was edited or pushed.

@lukemaj

lukemaj commented Sep 27, 2026

Copy link
Copy Markdown
Contributor Author

Landed on main by force-with-lease (096e9c0 -> 8518d0d), approved by the user. Closing: this PR was for CI and review only.

@lukemaj lukemaj closed this Sep 27, 2026
@lukemaj
lukemaj deleted the chore/6-absorb-upstream branch September 27, 2026 16:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant