Skip to content

chore(coil): merge upstream/main d1d15c67f4 (867 commits) - #145

Merged
radroid merged 876 commits into
mainfrom
coil/sync-20260912
Sep 12, 2026
Merged

chore(coil): merge upstream/main d1d15c67f4 (867 commits)#145
radroid merged 876 commits into
mainfrom
coil/sync-20260912

Conversation

@radroid

@radroid radroid commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Fixes #135.

The daily sync failed ten days running on the same conflict set, and the range grew to 867 upstream commits (2026-09-02 → 2026-09-12). This merges upstream/main at d1d15c67f4 into main as one merge commit, followed by eight ordinary commits that repair what the merge could not see.

What was resolved by hand (26 files)

All 26 conflicts were the fork's known seams. Notable resolutions:

  • Generated files regenerated, never merged: pnpm-lock.yaml re-resolved from the fork's pre-sync lock (security sweep verified intact: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0); routeTree.gen.ts from the TanStack generator (+21/-0, exactly the loops route).
  • Docs: upstream rewrote install.md, providers-claude.md, source-control.md in product voice. Took upstream's structure and carried only the fork's distinct facts (coil install banner, "leave the Claude config dir empty", clone-credential notes).
  • Android composer editor: upstream's new chip-deletion onKeyDown/onCreateInputConnection overrides are hand-combined with the fork's Enter-to-submit interception. Both behaviours survive.
  • Mobile send label: the fork's resolveComposerSendLabel mirror is retired; upstream's inline ternary gained a third condition, and the helper's own docstring said it only mirrored that ternary.
  • __root.tsx: the fork's NotificationCoordinator, ThreadOutboxDrain, PushSubscriptionManager, CoilUpdateToast sit inside upstream's new FirstRunGate, alongside upstream's own coordinators.

What the merge could not see (fixed in follow-up commits)

Three read-only review agents walked every seam and every fork import against the range. Findings that broke behaviour without a textual conflict:

  1. Rate-limit detection went dark. Upstream feat(usage): show Codex and Claude subscription limits on a Limits tab pingdotgg/t3code#9507 normalised account.rate-limits.updated into status-less utilisation windows and drops the event when the SDK omits utilization. Auto-resume and the loop supervisor classified the raw SDKRateLimitInfo from it. Both taps now read the runtime.warning the adapter raises for a rejected window (its detail is the raw info). The captured-episode fixture stays verbatim; the replay harness converts it on the way in, and the real-adapter replay test asserts the new route.
  2. Crash recovery clobbered restart continuations. Upstream feat(updates): continue active threads across server restarts pingdotgg/t3code#9167/fix(server): recover opted-in threads after machine restarts pingdotgg/t3code#9803/fix(server): keep interrupted threads resumable after restarts pingdotgg/t3code#10421 continue opted-in threads across restarts by marking the session starting and parking a resume. The fork's reconciler matched starting and settled that turn to interrupted one phase later. It now skips starting, with a test seeding that shape.
  3. Queued messages lost their context. Upstream feat: add inline file previews and attachment chips across surfaces pingdotgg/t3code#11265 moved composer contexts to inline references plus a structured context record and deleted the append*ToPrompt helpers the queue path used. The queue now carries buildMessageContext(...) and the drain sends or legacy-serialises it by server capability, exactly as the immediate send and the mobile outbox do.
  4. Toolchain: Effect rc.112 renamed Schema.TaggedErrorClassSchema.TaggedError (nine fork-only sites); TypeScript 7 retired the tsgo binary (relay typecheck script); apps/coil-home pinned to TS 6 like upstream's apps/marketing.
  5. CI: upstream fix(web): add project settings to legacy sidebar project menu pingdotgg/t3code#10021's libsecret helper hard-fails Linux tests and the desktop build without libsecret-1-dev pkg-config; the three coil workflows on ubuntu-latest now install them. The Windows release installed a Spectre component id upstream found to be a silent no-op; mirrored upstream's block with the exit-code check.
  6. Web push ignores upstream's new per-minute pull-request sync events, which never change whether a thread needs the user.

Verification (local, Apple Silicon)

  • vp run typecheck: green (all 17 packages).
  • vp run lint: green (warnings only, all upstream-owned).
  • Per-package vp test run --testTimeout=120000 --hookTimeout=120000: contracts 409, shared 801, client-runtime 1413, relay 44, mobile 1491, desktop 1436, web 5092 all pass. Server: see the check below.
  • scripts: 389/390; the one failure (build-desktop-artifact.test.ts cross-arch Windows) fails identically on pristine upstream files on an arm64 host, as recorded at the last sync.

After landing

  • gh workflow disable cursor-hygiene-webhook.yml (arrives active; it would forward issue/PR payloads to Cursor once its secrets exist). desktop-macos-preview.yml was disabled today; setup-fork.sh's list now names every inherited workflow.
  • Close [coil-sync] daily sync needs attention (conflict) #135.

Deferred (design decisions, not sync fixes)

  • Upstream's PullRequestSyncReactor bumps thread.updatedAt every minute for a linked review with moving checks; the loop supervisor reads updatedAt as movement, so a loop on a PR-linked thread with running CI may never strike.
  • The web outbox's retry classifier is the pre-fix(mobile): keep pending tasks queued when a send fails in flight pingdotgg/t3code#10245 message-matching version of mobile's; a socket drop mid-request discards the queued message instead of retrying.
  • Whether the fork's CrashRecoveryReconciler is still needed at all now that upstream's provider-session reconcile covers every case but latestTurn.state === "running" && session === null.
  • The SDK bump (0.3.170 → 0.3.260) may make Claude Code hold and self-resume a rate-limited turn; if so, auto-resume's progressing cancel at fire time should defer rather than cancel.

Land with a merge commit (never squash): gh pr merge <n> --merge --subject "chore(coil): merge upstream/main d1d15c67f4 (867 commits)".

Claude Fable 5.1 via Claude Code.

🤖 Generated with Claude Code

maria-rcks and others added 30 commits September 6, 2026 21:36
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…dotgg#10463)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…ccount (pingdotgg#10462)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
… second one (pingdotgg#10440)

Co-authored-by: Claude Code <noreply@anthropic.com>
…ed (pingdotgg#10435)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…dotgg#10019)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…diff fallback (pingdotgg#9828)

Co-authored-by: James <jamescollard2005@gmail.com>
maria-rcks and others added 28 commits September 11, 2026 20:25
…11347)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…1338)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…g#10757)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…11354)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…11019)

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
…ingdotgg#11265)

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Upstream renamed `Schema.TaggedErrorClass` to `Schema.TaggedError` (rc.112) and
moved every workspace from `tsgo` to TypeScript 7's `tsc`, which no longer ships a
`tsgo` binary. Nine fork-only error classes and the update relay's typecheck
script still used the old names.

`apps/coil-home` mirrors `apps/marketing`, which upstream pinned to TypeScript
~6.0.3 because `astro check` cannot load the TypeScript 7 compiler; the same pin
applies here.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream pingdotgg#11265 stopped appending terminal excerpts, review comments and preview
annotations to the prompt text. They now travel as inline references in the text
plus a structured `context` on the turn-start message, and the four `append*`
helpers the queue path used are gone. A queued message built the old way would
compile no longer and, once patched to text only, would ship dangling references.

The queue now does what the immediate send and the mobile outbox do: the enqueue
records `buildMessageContext(...)` beside the text, and the drain sends it when
the server advertises `inlineMessageContext`, or serialises it the legacy way
for older servers. Attachments stay out of the queue as before.

`newCommandId` moved into the outbox module after upstream pingdotgg#9150 deleted the
unused helper from `lib/utils`. The settings-search scope map gained the
`/settings/loops` entry its new `Record<SettingsPath, …>` type requires.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream pingdotgg#9507 normalised `account.rate-limits.updated` into a status-less list
of utilisation windows and drops the event entirely when the SDK omits
`utilization`, so the raw `SDKRateLimitInfo` the auto-resume and loop taps
classified no longer arrives on it. The raw info now rides as the `detail` of
the `runtime.warning` the adapter raises for a rejected window that overage
does not cover, which is exactly the case both taps act on.

Both reactors tap that event instead. The captured-episode fixture stays
verbatim: the replay harness converts its pre-pingdotgg#9507 rows on the way in, and the
adapter drift check lists the retired event type with the reason. The
real-adapter replay test now asserts the rejection reaches the classifier
through the warning.

The web-push reactor also ignores the new pull-request sync events, which
upstream's reactor emits every minute for every linked review and which never
change whether a thread needs the user.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream pingdotgg#9167, pingdotgg#9803 and pingdotgg#10421 continue opted-in threads across server
restarts: the provider-session reconcile phase re-marks such a session
`starting` with no active turn and parks a `sendTurn` that resumes the turn the
projection still shows as running. The fork's crash-recovery pass runs next and
matched `starting`, so it settled that turn to `interrupted`, dropped any queued
turn start, and raced the resume about to land.

Upstream's own pass settles every other `starting` session to `error` first, so
by the time the fork's pass runs `starting` only ever means a continuation in
flight. It is skipped now, with a test seeding that exact shape.

The startup test doubles gained what upstream's new `projects.auto-pull` phase
reads, and the merge's duplicate `projectionSnapshotQuery` binding is gone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…component

Upstream pingdotgg#10021 builds a native browser-secret helper against libsecret; its
test and the desktop artifact build both hard-fail on Linux without the headers.
The fork's CI, weekly full build and daily sync all run on ubuntu-latest, so
each installs them the way upstream's ci.yml does.

The Windows release leg installed `VC.Tools.x86.x64.Spectre`, which upstream
1665d81 found to be a silent no-op; the component is
`VC.Runtimes.x86.x64.Spectre`, and the artifact build now preflights the Spectre
lib directory, so the installer's exit code is checked too.

`setup-fork.sh` lists every inherited workflow that arrives active, including
the new cursor-hygiene webhook, which would forward the fork's issue and PR
payloads to Cursor the moment its secrets were set.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Upstream's new DesktopPreReadyPlatform test asserts the Linux desktop entry
names "T3 Code (Alpha)"; the entry is derived from APP_BASE_NAME, which the
fork renamed (#71), so the fixture follows the rename like its siblings.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The merge resolution dropped upstream's blank line before the new permission
channels and moved upstream's projectionSnapshotQuery binding; both read as a
displaced upstream line on the seam ledger for no behaviour. Restored so the
rows stay +N/-0 and +44/-2 respectively.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
59 files, +2739/-1071 against d1d15c6. Records what the merge could not see
and the reviews did, retires the composerSendLabel mirror, corrects two mirror
rows that named the wrong upstream symbol, and points the loop design docs at
the runtime.warning the rate-limit tap now reads.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@radroid
radroid merged commit 55108cb into main Sep 12, 2026
4 checks passed
@radroid
radroid deleted the coil/sync-20260912 branch September 12, 2026 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[coil-sync] daily sync needs attention (conflict)