Skip to content

Two upstream capabilities the 2026-09-02 sync deliberately left unaddressed #130

Description

@radroid

Both surfaced in the seam review for #128 / PR #129 and were kept out of that PR on purpose: neither is a fork behaviour the sync broke, and each needs a design decision plus a new seam row, which does not belong in a rebase.

1. The server advertises a desktop update button the fork's builds can never honour

Upstream pingdotgg#6554 (b2f25d390, landed 2026-09-01) added a server→desktop remote update path. ServerEnvironment.ts advertises it as:

const desktopAppUpdate =
  serverSelfUpdate === "desktop-managed" && serverConfig.desktopTelemetryControlFd !== undefined;

Nothing in that predicate asks whether the electron-updater feed is actually enabled. Coil desktop builds ship with T3CODE_DESKTOP_UPDATE_REPOSITORY: "disabled" and no packaged app-update.yml, so DesktopUpdates reports {enabled: false, status: "disabled"} — and the coil server still advertises capabilities.desktopAppUpdate: true.

ChatView reads that flag through supportsDesktopAppUpdate(serverConfig) and both renders a <ServerUpdateAction desktopAppUpdate> button on the version-skew banner and suppresses the serverUpdateGuidance description that previously told the user how to update by hand. nextRemoteDesktopUpdateStep then terminates immediately with "Automatic updates are disabled on this machine."

Net effect on a version-skewed remote Mac: the working manual instructions are replaced by a button that can only fail. The real coil update path is the fork's own update toast.

Why it is not a one-liner. T3CODE_DESKTOP_UPDATE_REPOSITORY is consumed at build time by scripts/build-desktop-artifact.ts; it is not visible to the running server process, so there is no existing signal to gate on. Options: have the desktop app report updater status over the control fd, probe for the absent app-update.yml, or wire DesktopRemoteUpdates to the fork's update delivery so the button becomes real. The last is the only one that makes the feature work rather than hiding it.

2. The needs-input notification row is the only unsearchable row in Settings → General

Upstream pingdotgg#8831 turned settingsSearch.ts into a per-setting catalog with searchableSetting(id) as the mandatory way to name a row, "so the catalog and the rendered settings cannot drift apart". SETTINGS_SEARCH_ITEMS grew 39 → 54 in this range, and the commit retro-fitted the General rows that were still plain strings.

The fork's <SettingsRow title="Notify when an agent needs input" …> sits immediately above {...searchableSetting("provider-update-checks")} and carries neither the spread nor a catalog entry. Search or the command palette for "notification" / "needs input" and every neighbouring row deep-links to its anchor; the fork's returns nothing and has no id to scroll to.

The gap predates the merge-base — this range is what made it the only one left in that section. Closing it costs one entry in SETTINGS_SEARCH_ITEMS and a spread on the row, i.e. one new seam row in settingsSearch.ts. The alternative is to accept it and say so in the ledger, which is where it stands today.

Activity

  1. github-actions commented on Sep 2, 2026

    @github-actions

    Automated daily upstream sync could not complete.

    Result: conflict
    Recovery tag: coil/last-good-20260902-122221
    Run: https://github.com/radroid/t3code/actions/runs/33629430089

    status JSON
    {
      "kind": "daily",
      "result": "conflict",
      "upstream_range": "70cd258d8 fix(web): prevent two-digit list markers from being clipped (#9101)\nf14f41b89 fix(web): preserve composer draft during worktree setup (#9197)\n7e9d5a7ef fix(mobile): prevent message and composer overlap (#9195)\n5b7d72aad feat(updates): continue active threads across server restarts (#9167)\n14f15cfed fix(server): stop titling linked PR threads from local git history (#9191)\ndd6879ffe fix(pull-requests): reuse github api reads (#9176)\n9e646ad84 fix(connect): refresh relay credentials before expiry (#9178)\na19f01fc1 feat(web): make context window indicator opt-in (#9190)\n6ff537f03 fix(web): remove projects with archived threads (#8798)\na81a52afb fix(server): allow local-only worktree bases (#8751)\na56b0cd71 fix(server): allow large Azure DevOps PR lists (#8572)\n4116db980 fix(server): bound OpenCode version probes (#8750)\nd2042d288 fix(web): avoid stale file writes on close (#8630)\n7a8df3338 fix(desktop): skip cached monitor compiler check (#9184)\n827345a07 fix(web): model info button opens its details on click (#9177)\n5392c9bb9 fix(models): restore sticky new-thread selections (#9164)\n535c83dea fix(web): copying a code block no longer copies triple backticks (#8448)\nf9d1c65d4 chore: bump vendored GhosttyKit and update terminal integration (#9155)\n0681d8549 fix(pull-requests): expand code tab diffs by default (#9174)\n80a14b658 fix(server): discover project skills for Codex and OpenCode (#8778)\n082358f9e fix(desktop): check artifact build prerequisites (#8975)\n43bafd467 fix(web): open PR toast actions in app (#9006)\n8339508f5 fix(chat): align failed task progress test (#9172)\nc15735dd8 fix(chat): replace failed tools with thinking (#9165)\n133db22fa feat(web): copy the full error report from the error page (#9166)\nb520120cf fix(chat): improve tool group summaries and scrolling (#9106)\ndb4bf9497 chore: remove unused code and brittle tests (#9150)\nb8262b412 fix(desktop): hold-to-quit no longer gets stuck (#9141)\ncde12790d fix(contracts): accept legacy pull request checkout results (#8238)\na1a2bb1cd fix(web): label keybinding condition removal actions (#8664)\ne9db39ce0 fix(web): align composer notices and stash (#8890)\n",
      "upstream_head": "70cd258d8aac43ea57494527b00bf36de3efa6c0\n",
      "conflicted_files": "apps/web/src/components/settings/SettingsPanels.tsx \n",
      "culprit_commits": "5b7d72aad feat(updates): continue active threads across server restarts (#9167)\na19f01fc1 feat(web): make context window indicator opt-in (#9190)\n",
      "failing_step": "\n",
      "dropped_patches": "\n",
      "patch_manifest": "93c1e67b8 docs(coil): re-baseline the seam ledger against the 2026-09-02 merge-base\ndcf49a1c1 fix(mobile): Return no longer submits while dictation freezes the composer\n3bdf109e2 fix(coil): report the DPoP failure reason on the auto-resume route\n88d5e2421 fix(coil): a server auto-settle must not destroy an armed auto-resume\n5ac7b67f4 fix(web): the queue path counts file attachments, not just images\naab748d91 fix(coil): re-home the outbox idle gate upstream deleted with canSettle\n55ef32cd2 fix(coil): drop the pre-rename fork-seam import the rebase left behind\n50f65243a chore(deps): regenerate the lockfile against the 2026-09-02 upstream tree\nd96d6da07 test(coil): wait for the collided arm to be destroyed instead of looking once\nd029a8377 fix(coil): stop the fork's boot reconcile from swallowing upstream's orphan pass\nd9defcd55 docs(coil): re-baseline the seam ledger against the 2026-08-27 merge-base\nd6ba8b8e6 test(coil): provide the services upstream's orphaned-session reconcile now needs\ne7b51fbd1 docs(coil): Loops \u2014 design, prototypes and implementation plan (#42, #38 residue) (#120)\n178ed120f fix(coil): a turn that died inside the closed window isn't advancement (#121)\n8ebb3b3ba docs(coil): repoint the ledger at the final merge-base\naa9d1eff8 docs(coil): re-baseline the seam ledger against the 2026-08-17 merge-base\na216210a8 test(web): reconcile upstream's new running-send assertion with the fork's steer label\n9fcf81f4b test(coil): carry the app rename onto upstream's new DMG title assertion\n096d2cc53 fix(coil): migrate the update toast off the native title tooltip\n094d0abde docs(coil): fix seam-ledger rows the #71 rename left pointing at t3x names (#116)\na4a5098fd fix(coil): the verify gate must not require Bun-runtime imports the shipped app cannot reach (#107)\n470816d96 fix(coil): verify every packaged layer, and fail on layers the gate cannot see (#102) (#106)\n9bdd817b2 docs(coil): re-measure the seam ledger on the landing branch\nc6ad39389 fix(coil): drop a stray blank seam line the rebase left in ThreadComposer\ne49d1369d fix(web): surface enqueue failures as a toast, not the maskable error banner\n2aad2f7a1 docs(coil): re-baseline the seam ledger against the 2026-08-14 merge-base\n40b271d32 fix(server): name why a clone failed, and which provider it was\nf616ba3aa fix(coil): stop shipping upstream's update feed, which we never actually disabled\nf659ea8dd fix(coil): restore the release, and make two of its checks capable of failing\n51ee891dc fix(coil): publish a canonical Latest release, and re-arm retention\n723f95941 docs(coil): design a canonical Latest release for the fork\nf751f0a01 fix(coil): tell the truth about the one macOS prompt an update raises\ne0e8e22ff perf(coil): halve the desktop release bundle (#53)\n0602eef1c docs(coil): re-baseline the ledger for the sidebar wordmark row\nf404119d0 feat(coil): finish the app rename at the surfaces that name the app (#71)\n4c57838a2 docs(coil): repoint two ledger citations at the paths #71 moved\n324f88ca5 refactor(coil): retire the local desktop autobuild\n02ca4fd19 fix(coil): reach the renamed relay through a service binding (#71)\n81e6ec966 fix(coil): make --rotate emit the CI secret commands itself (#71)\n9b440b7b5 fix(coil): finish the certificate rotation and list all 47 rows in the ledger (#71)\n82db9038e chore(coil): re-record the designated requirement after the certificate rotation\nf02d7775d fix(coil): compute the build-counter offset in bash, not in an expression (#71)\ndd33f974b fix(coil): repoint the last references to moved files (#71)\nc181de9be style(coil): format the files this rename touched (#71)\neafe55a81 docs(coil): re-baseline the seam ledger and correct the runbooks (#71)\n490939a7e fix(coil): carry PRs #78 and #84 across the rename (#71)\n9426bcb8d feat(coil): move the relay, keeping the old hostname alive as a proxy (#71)\nbd8c6a5c3 feat(coil): cut the sync automation over to coil names (#71)\ne18120a1c feat(coil): move the release identity, offsetting the counter so clients keep updating (#71)\naa5bf5c8b feat(coil): rename the app to T3 Coil, with its own bundle id and certificate (#71)\neaad55239 refactor(coil): move the fork's directories and symbols off t3x (#71)\n893ff9dc5 docs(coil): design the t3x -> coil rename around its four silent failures (#71)\nc2533809c fix(deps): clear the sharp and @hono/node-server advisories by re-resolution (#58) (#87)\n08935e020 feat(coil): put the real install steps on the download page, from one source (#72)\n827de80bb feat(coil): a real link-preview card for shared URLs\n3daf58858 fix(t3x): push the sync as a workflow-scoped token, and escalate when it fails\n5e118ecff fix(web): steering-path leftovers from the queue transition (#40 A1-A4)\n182ad760f fix(t3x): stop a user message destroying a pending auto-resume\na1c46bd3e docs(t3x): note that the trusted certificate is listed twice, and why that is fine\nb8cc26aa0 docs(t3x): correct the runbook's seam claim \u2014 the bundle id spends one upstream line\n0d0ebe586 fix(t3x): pin the designated requirement the fork's identity produces (#70)\n328f1019b fix(t3x): give the fork its own bundle id, so it stops sharing TCC rows with upstream (#70)\nbf92b7233 fix(t3x): sign the macOS build with a stable identity so permission grants survive updates (#70)\n2c0f32452 fix(web): an edit saved during dispatch no longer disappears (#40 A5)\n725504c3f fix(t3x): derive and verify the autobuild agent's PATH, and correct the runbook interval (#41)\n0fe7bc1cc fix(t3x): the Windows transient-crash retry could never fire; classify on the code vp prints (#47)\n5bee268de docs(worklog): write down how the skill actually gets installed (#65)\n016ea5563 fix(worklog): satisfy the repo lint rules the suite files were breaking (#65)\n4f94baa1d fix(worklog): correct the numbers the report is built on (#65)\n008928a62 feat(t3x): add the /worklog daily work-log skill (#65)\ncd6f1f36e fix(t3x): widen the release retry window past the observed 403 duration\n893ad60a1 fix(coil): stop the deploy verify step failing on Cloudflare bot mitigation\naf2534c40 fix(coil): put pnpm on PATH in the homepage deploy workflow\n80748b329 docs(coil): fix the stale deploy-workflow pointer, note the secret is set\n774c9df70 docs(coil): recapture the hero evidence with all five marks restored\nded043a1b fix(coil): bring the hero marks back on mobile as an in-flow row\nf5cabcb34 docs(coil): recapture mobile evidence after the collision fix\n9d756e319 fix(coil): stop the hero marks colliding with mobile content, equalise stacked buttons\ne53c48179 docs(coil): recapture the homepage evidence against coil.curlycloud.dev\n37321372d feat(coil): reposition the homepage as Coil, a personal fork\n85b86b0ee docs(coil): design for repositioning the homepage as Coil\n4e539d250 docs(t3x): capture homepage screenshots and a scroll-through for review\n5c3870bf4 ci(t3x): pin the deploy wrangler exactly, not to a floating major\n182f4a486 docs(t3x): record the fork homepage on the seam ledger and sync runbook\n5bdd84744 ci(t3x): auto-deploy the homepage to Cloudflare on push to main\nba2d98d96 feat(t3x): deploy the homepage as a Cloudflare assets-only Worker\nc3ec63073 feat(t3x): serve downloads from the fork's update-relay manifest and wire the sync strip\nadf27f0c6 feat(t3x): rebrand the homepage copy, chrome, and fork graph\na2d0ae73b feat(t3x): strip upstream-only social proof, store links, and legal pages\n76ad5dea4 feat(t3x): seed the fork homepage from apps/marketing\ne9f00552c docs(t3x): record before/after capture for the capsule anchor fix (#67)\n4603f8fc2 fix(t3x): anchor the auto-resume capsule to the composer's measured box (#67)\n36ba50786 fix(t3x): retry the relay notify, and surface DO failures as readable 503s (#66)\n23513e207 docs(t3x): re-baseline the seam ledger against upstream v0.0.33\n2a1a3f79e docs(t3x): record the mobile sendLabel mirror on the ledger\nfc0eee80c docs(t3x): re-baseline the seam ledger against the follow-up merge-base\nd58ae9beb docs(t3x): re-baseline the seam ledger against the 2026-08-08 merge-base\ne69815aa5 test(t3x): retime the tolerant-budget tests to upstream's new retry ladder\n1b5441ea4 fix(t3x): drop the settings imports upstream stopped needing\nb2ce816fa fix(t3x): give the crash-recovery test the registries upstream added\n7722197b0 docs(t3x): archive the Loop Watch design before its branch is deleted\n784d3956a fix(t3x): put ~/.cargo/bin on the autobuild agent's PATH\nfdf56bdf3 fix(t3x): track the composer's top edge so banners cannot cover the capsule\n494487d35 fix(t3x): align the auto-resume capsule with the composer's right edge\n10f7b7ee6 fix(t3x): put the auto-resume capsule back above the composer\n1ff98e2ff fix(t3x): pin the countdown width, spring the toggle, move the capsule top-right\n973d24faa fix(t3x): make auto-resume teardown re-armable so StrictMode cannot kill it\na01ec0bc9 feat(t3x): rebuild the auto-resume capsule and cover it with tests\n29a6184ea chore(t3x): stop Dependabot re-failing on advisories it cannot fix\n026aed705 fix(t3x): stop a transient 403 from discarding a whole release build\n74c84f5a9 feat(t3x): verify the install actually happened, and offer to report it when it did not\n91ed27b9b fix(t3x): stop calling the Windows update a restart\n93b80b151 Update toast: changelog-forward design, and a restart that waits for you (#55)\n806e0a991 chore(deps): dedupe nanoid onto 3.3.17, closing the two alerts the sweep reopened\nf5698400d chore(deps): clear 56 of the 62 open transitive advisories in the root lockfile\n32ebd2ba9 chore(deps): bump electron to 41.10.3, and stop Dependabot on the vendored subtrees\n714eeb958 docs(t3x): put the manual-install commands on the release page\n8c938cd75 fix(t3x): follow the 302 on GitHub release asset downloads\nb4f3f490e fix(t3x): actually serialise the release bundle build\n5d3b7a747 fix(t3x): scope ensure:electron, and refuse updates without a release counter\nefb8a3cd8 fix(t3x): wait for the condition in the auto-resume reactor tests\nd0d02ee46 Update delivery: CI builds, relay pushes, the app offers a restart (#51)\n2582dd80c ci(t3x): raise the hook timeout alongside the test timeout\n6ea10d01a docs(t3x): remeasure the seam ledger against the 2026-08-02 merge-base\n80bc45a68 fix(t3x): adapt the crash-recovery startup test to upstream's new startup internals\n9a77588e8 fix(web): keep the queue's reorder controls usable, and leave a dispatch trail (#35)\n02a319561 feat(web): steer a running turn instead of queuing behind it (#35)\n79d22ad8d feat(web): make the thread outbox read as composer chrome, and let it be reordered (#35)\n5c0cfb247 docs(t3x): point the self-reference rule at the renamed Claude doc\ndcfae811d docs(t3x): follow upstream's rename of the Claude provider doc\nb2788da81 docs(t3x): remeasure the seam ledger against the 2026-07-30 merge-base\n14c6881f2 fix(web): apply upstream's detail-loading send gate to the queue path\n7aae0fffe fix(t3x): apply the sync test-timeout to every gate, not just fork CI (#32)\n88c4d40f6 ci(t3x): raise the test timeout for the fork's slower runners\n07b47c887 docs(t3x): replace the fictional seam ledger with a measured one\n9b989f8f3 docs(providers): fix the broken Claude multi-account recipe\nf902e2874 test(t3x): move fork settings coverage out of the upstream test file\n58af852ea feat(t3x): auto-build from origin/main in a dedicated worktree\n4966a1ada fix(client-runtime): reset tolerant reconnect budget across a network drop\nef37a56b7 fix(web): address Web Push review findings (reactor priming, VAPID recovery, cleanup)\neea7b3003 feat(web): closed-tab Web Push notifications (SW + PWA + server VAPID push)\n457d74453 fix(connection): tolerate a slow-but-alive local backend + heap headroom\na3d905aa6 feat(web): queue messages while a chat is running (thread outbox)\nbe6d1bc6c ci(t3x): add fork-runnable PR/main verify gate (t3x-ci.yml)\n0c23c8218 docs(t3x): document how to land a sync PR (force-update, not merge button)\n119004b4d fix(t3x): resolve pre-existing typecheck/lint red on fork test files\n9e76a5a09 fix(t3x): pin sync escalation gh calls to the fork (GH_REPO)\n9d1cac221 feat(t3x): on-demand agent to resolve escalated upstream-sync conflicts\nc1adbf894 fix(t3x): make sync escalation always open the t3x-sync issue\nc6f088711 fix(mobile): iOS Shift+Return inserts a newline instead of submitting\ne71c27a15 feat(mobile): queue/send from the keyboard Return key\n2f77ca86c chore(t3x): auto-build on a 12h cadence, not every main commit\n84f48c373 fix(notifications): final-review fixes \u2014 web notification guard, desktop coalescing, draft-route suppression\n46e22b5ad feat(web): needs-input notification setting and web permission UX\n14ba12bcd feat(web): notification coordinator with platform shim and click-to-navigate\n49e609a7a feat(desktop): native OS notification IPC with click-to-reveal activation\n054e5c34e feat(web): add pure needs-attention tracker and suppression logic\n493031d5d feat(contracts): add notifyOnNeedsInput setting and DesktopBridge notification surface\n73367f042 fix(server): reconcile crash-frozen `running` turns to interrupted on boot\n7cc4584e7 test(server): cover non-spawn `--version` failure mapping to available\ndba50ece0 fix(server): treat slow `az --version` as present, not missing\n17c57ba12 fix(t3x): don't cancel auto-resume as thread-advanced when the limited turn settles\n5d557693f fix(t3x): auto-build fixes found running it for real\n5711c002c docs(t3x): correct which .app a default auto-build replaces\n1ec058e32 fix(t3x): resolve adversarial-review findings in auto-build\n087b2fd72 fix(t3x): resolve auto-build review findings\ne421ff7ae fix(t3x): strip trailing newline from auto-build status JSON values\na275df4d8 feat(t3x): auto-build & install the desktop app on change\n1479003f6 fix(t3x): prototype-chain threadId corrupted the auto-resume state file\nb9f7ea9f4 test(t3x): route-level tests for /api/t3x/auto-resume\n27a55fa6a docs(t3x): record the auto-resume UI seams\nc7fe4e0c4 feat(t3x): per-thread auto-resume overlay in the thread view\na18803800 feat(t3x): authenticated /api/t3x/auto-resume route\n17c2b5e67 feat(t3x): per-thread auto-resume switch (server state + gating)\n5b7da2e29 docs(t3x): design + plan for per-thread auto-resume UI (floating card)\n4e1cd986b docs(t3x): plan for auto-build + install desktop app on change\n4754c52c9 fix(t3x): resolve third-pass verified review findings\n8c9269687 docs(t3x): align auto-resume spec with final implementation\nb7c6f3e9b fix(t3x): resolve adversarial-review findings across auto-resume + sync\nbb391fb78 feat(t3x): usage-limit auto-resume reactor (Project B)\n9a8dcce4b docs/ci(t3x): incorporate adversarial review findings\n847203a0c feat(t3x): fork setup + daily upstream sync + weekly verify (Project A)\n37a5effc1 docs(t3x): add fork-sync and usage-limit auto-resume design specs\n",
      "detail": "rebase aborted; working tree restored\n"
    }

    ▶ To fix: comment @claude resolve on this issue (or run the coil sync resolve (agent) workflow). An agent replays the rebase, resolves the conflicts, runs typecheck/lint/test, and opens a PR for review — nothing is pushed to main. Runbook: docs/coil/sync-agent-runbook.md.

  2. removed
    coil-syncUpstream sync needs a human/agent
    on Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions