chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

chore(coil): sync 182 upstream commits (2026-09-02) - #129

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260902
Sep 2, 2026
Merged

chore(coil): sync 182 upstream commits (2026-09-02)#129
radroid merged 0 commit into
mainfrom
coil/sync-20260902

Conversation

@radroid

Copy link
Copy Markdown
Owner

Resolves#128. The daily sync had been failing on a pnpm-lock.yaml conflict, leaving the fork 182 upstream commits behind. This replays the fork's 175 patches onto 941acb4f9 and fixes the four fork behaviours upstream broke along the way.

The rebase

175 of 178 patches replayed. The three that went empty are the historical chore(deps): regenerate the lockfile commits — every intermediate lock conflict resolved to upstream's side, and the lock is regenerated once at the end instead, seeded from the fork's own pre-sync lock so the advisory sweep survives (verified: sharp 0.35.3, nanoid 3.3.17, tar 7.5.22, undici 6.28.0, form-data 4.0.6, hono 4.13.0, ip-address 10.4.0, path-to-regexp 6.3.0, shell-quote 1.10.0, fast-uri 3.1.5, builder-util-runtime 9.7.0).

What a clean rebase would have hidden

Four fork behaviours broke with, at most, one build error between them. Each is its own commit:

  • The outbox drain lost its idle gate.fix(server): settle threads server-side pingdotgg/t3code#8600 moved thread settling server-side and deleted canSettle. The predicate is re-homed in the fork's own outbox module on top of hasQueuedTurnStart, which survived. The repair was the risk, not the break: canSnooze is the obvious substitute and deliberately permits a running session, so it would have dispatched the queued head on top of a live turn — the exact double-send the gate exists to stop.
  • A server timer was destroying armed auto-resumes. The same commit added a one-minute sweep that dispatches thread.auto-settle through thread.settle's decider case, emitting an identical thread.settled with no provenance. threadIsGone() read that as "the user is done here", so a resume armed on Claude's seven-day window was cancelled on day three, logged as reason: "thread-gone" on a thread nobody settled. The existing test asserted the old behaviour and would have kept passing.
  • The Queue button went dead on file attachments.feat(web): attach PDFs, ZIPs, and other files to a turn pingdotgg/t3code#8236 added a second attachment class. The fork's queue path counted only images, so a files-only composer rendered Queue enabled and then did nothing at all when pressed — and text-plus-a-PDF queued the text and destroyed the file with no warning.
  • Return submitted a frozen composer.feat(mobile): add offline iPhone voice input pingdotgg/t3code#8614 added a read-only mode for settling dictation; the fork's Return-submits interception sat above upstream's guard and jumped it.

Also: the fork's auth mirror on /api/coil/auto-resume had drifted a now-optional argument, costing relay clients the DPoP failure reason every other endpoint reports.

Near misses worth recording

Three resolutions would have been silently wrong, and are called out in the ledger:

  • Expo SDK 57 rewrites the exact overrides: lines the fork's advisory block sits between, and rewrites patchedDependencies wholesale. Keep-both would have re-pinned Expo 56 packages onto a 57 tree and named five patch files that no longer exist. Verified afterwards that the block is upstream's plus exactly the 13 fork keys, and that all 17 patch files are present.
  • AppSymbol.tsx conflicted whole-file because fix(mobile): reduce dev-client reload and Metro startup cost pingdotgg/t3code#8694 de-barrelled the Tabler imports to stop Metro registering the entire icon set. The fork's two lines are re-applied as a deep import; the file has zero bare @tabler/icons-react-native imports.
  • Electron — upstream moved to 43.4.1, two majors past the fork's 41.10.3 advisory pin, so the pin is dropped rather than defended. Taking --ours would have run Electron-43-targeted preview code on an Electron 41 runtime, and nothing would have caught it.

Verification

vp run typecheck and vp run lint are clean. The full suite is green except build-desktop-artifact.test.ts > skips the primary native probe for cross-architecture Windows payloads, which fails identically on pristine upstream files — it reads the real host architecture, so targetArch: "arm64" is not cross-arch on Apple Silicon. It passes on x64 CI.

apps/marketing had zero upstream churn, so the apps/coil-home parallel path has nothing to port. No new upstream workflow arrived active.

Seam ledger re-baselined: 53 files, +2609/-981 — same seam set, and the deletion count fell by 63, all of it accounted for.

Landing

This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and the merge button will not work. It lands by force-updating main to the reviewed tip, per docs/coil/sync-agent-runbook.md. Recovery tag: coil/pre-sync-20260902.


Claude Opus 5 (1M context) in Claude Code.

@radroid
radroid merged commit 93c1e67 into mainSep 2, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260902 branch September 2, 2026 04:47
Sign up for freeto 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 rebase needs attention (conflict)

1 participant

@radroid