sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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

sync: absorb the 113-commit upstream range three daily syncs could not (#117) - #119

Merged
radroid merged 0 commit into
mainfrom
coil/sync-20260817
Aug 17, 2026
Merged

sync: absorb the 113-commit upstream range three daily syncs could not (#117)#119
radroid merged 0 commit into
mainfrom
coil/sync-20260817

Conversation

@radroid

Copy link
Copy Markdown
Owner

Closes#117. Absorbs the 113-commit upstream range that three consecutive daily syncs (08-15, 08-16, 08-17) could not, and replays all 166 fork patches on top of cd096b9ad.

Important

Do not use the GitHub merge button. This is the fork's patch series rebased onto new upstream, so main is not an ancestor of it and GitHub reports it CONFLICTING. That is expected and is not a defect in this branch. Land it by force-updating main:

git fetch origin
OLD_MAIN=$(git rev-parse origin/main)# save: needed to rebase in-flight branches
git push --force-with-lease origin origin/coil/sync-20260817:main

Rollback point is coil/last-good-20260817-083055 (verified == the pre-sync origin/main). If you'd rather have a genuinely button-mergeable PR, say so and I'll re-shape this as a merge commit instead — the tree would be identical.

Why the automation kept failing

Each daily run stops at the first conflict and escalates. Two different ones were in the way, so fixing either alone would not have unblocked it:

DayConflicted fileUpstream culprit
08-15apps/desktop/src/ipc/DesktopIpcHandlers.ts57a299a7 open remote environments over SSH (pingdotgg#6572)
08-16, 08-17apps/server/src/sourceControl/SourceControlProviderDiscovery.tsd715c2e56 raise the discovery probe budget (pingdotgg#6223)

Six conflicts surfaced in total across the replay. The three interesting ones:

1. Upstream independently fixed half of fork issue #4 — and did it better.d715c2e56 added a per-spec probeTimeoutMs with az at 20s; the fork carried a global 15s CLI_PROBE_TIMEOUT_MS. The fork's constant is deleted and the timeout ceded entirely to upstream. What upstream still does not do is the behavioural half — classifying only VcsProcessSpawnError as "missing", so a slow-but-present CLI stays available and the auth probe still runs — so that is all the fork keeps. Seam: +20/-8 → +12/-5.

2. The stale-hoist hazard on ComposerPrimaryActions.tsx is retired. Upstream 7afa184a9 (pingdotgg#4781) hoisted its inline send button to a const — the exact hoist the fork had been carrying since #35, and the one the ledger has flagged since 08-08 as able to silently revert an upstream restyle, because a copy cannot conflict. The two copies turned out byte-identical apart from one aria-label branch, so the fork's copy is deleted and upstream's kept. The fork's queue/steer branch was then folded into upstream's new bottom dispatch rather than left as the early return it used to be — as an early return it would have pre-empted upstream's whole mobile path and silently reverted pingdotgg#4781. Seam: +128/-55 → +74/-5; the -55 → -5 is the real signal, the fork now extends upstream's dispatch instead of displacing it.

3. manifest.webmanifest became an add/add seam. Upstream now ships its own. Upstream's has no name/short_name/description and no maskable icon — an installable PWA needs all four, which is what Web Push (#23) rides on — so the fork's fields are unioned onto upstream's, dropping the fork's duplicate apple-touch-icon.

Adapting to upstream, beyond the conflicts

Four commits sit on top of the replayed series:

The checks CI cannot do

  • Logic mirrors re-checked. The steer allowlist has no capability flag behind it — if upstream changed an adapter to stop steering, nothing fails, and the fork would keep sending mid-turn into a provider that drops it. All four allowlisted drivers still steer (three still covered by upstream's own "steers a running turn..." tests, Grok still reuses ctx.activeTurnId), and grep -rn 'turn/steer' apps/server is still empty, so the deliberate Codex exclusion holds. The mobile send-label mirror also still matches — upstream's only mobile composer commit this range was theming.
  • Parallel path reviewed, nothing ported.apps/coil-home/ is a copy of apps/marketing/, so it drifts without ever conflicting. Both upstream marketing commits were checked and deliberately skipped: the Mac-chip detection (fix(marketing): detect Mac chip on homepage download button pingdotgg/t3code#4197) has nothing to choose between, since the release matrix builds only darwin-arm64 and win32-x64; and the Grok-mark mobile fix (fix(marketing): keep Grok mark clear of mobile hero copy pingdotgg/t3code#4542) repositions absolutely-positioned marks the fork already replaced with an in-flow row, so porting it would regress the fork's own fix.
  • Lockfile untouched. Upstream changed no dependency in this range — its only manifest edit adds two exports entries to packages/shared/package.json. pnpm-lock.yaml is byte-identical to pre-sync main, so the dependency sweep is intact and no regeneration was needed. (This is the step that destroyed the sweep on 08-08.)

Verification

  • vp run typecheckexit 0, 17/17 packages.
  • vp run lintexit 0, no error-level findings.
  • vp run test --testTimeout=120000 --hookTimeout=120000one fully green run (2708 passed | 7 skipped, exit 0).
  • Patch integrity: 166/166 fork patches replayed, subject-for-subject identical to pre-sync main. Nothing dropped, nothing absorbed.

Two caveats, both honest:

  1. Later full-suite runs each hit one intermittently failing test — composerInlineTokens (a < 1000ms wall-clock assertion) and nativeReviewDiffHighlighter. Both are upstream-owned, untouched by the fork, and pass 3/3 in isolation; they fail only under full-suite parallel load on this machine. CI is the arbiter.
  2. build-desktop-artifact's cross-arch Windows probe test fails locally for an environment reason, not a code one: the probe does {...process.env}, and this machine's shell has ELECTRON_RUN_AS_NODE=1 because the agent runs inside Electron-as-Node. Verified by control run — pristine upstream code fails it identically here — and it passes with the variable unset. It will pass in CI.

Not included

#118 (auto-resume never armed) is open and unrelated to the sync; it is untouched here.

@radroid

Copy link
Copy Markdown
OwnerAuthor

CI is greenrun 32052894658: Typecheck ✅ Lint ✅ Test ✅.

That settles both caveats in the description. Neither of the intermittently-failing tests (composerInlineTokens, nativeReviewDiffHighlighter) failed on CI, and neither did the build-desktop-artifact cross-arch probe test — confirming all three were local environment artifacts (parallel-load contention, and this machine's ambient ELECTRON_RUN_AS_NODE=1) rather than anything this branch changed.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1a471a64-016a-4afb-a024-f7b5c6541362

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit f6355f0 into mainAug 17, 2026
2 checks passed
@radroid
radroid deleted the coil/sync-20260817 branch August 27, 2026 16:14
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