ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne
, '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

ci: fix amicode-release UI gate check for the unconditional layout memo - #81

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check
Jul 28, 2026
Merged

ci: fix amicode-release UI gate check for the unconditional layout memo#81
jack-champagne merged 1 commit into
local/amicodefrom
jack/fix-release-gate-check

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Release blocker

ead3274d3 ("lock down appearance settings; force v2 layout", 2026-07-24 — afterv1.17.3-amicode.9) changed settings.tsx to:

newLayoutDesigns: createMemo(()=>true)

That minifies to newLayoutDesigns:Z(()=>!0). The gate check greps for the old channel-gated shape newLayoutDesigns,<VAR>), finds nothing, and exits 1.

Any release cut from current mainline fails the Gate check step and never publishes. Found while building the branch for #73 locally:

$ VAR=$(grep -aoh 'newLayoutDesigns,[A-Za-z$_]\{1,8\})' "$BIN" | ...)
VAR=
FAIL: pattern not found

The change itself is good — the setting no longer depends on the build channel at all, so the original failure mode (channel latest/prod defaults it OFF) is structurally gone. Only the check needs to catch up.

Fix

Accept the new unconditional shape, keep the legacy channel-gated shape as a fallback in case the setting is ever rewired to the channel default, and still fail loudly on genuine drift.

Also fixes two latent set -e bugs that made this check exit silently rather than report:

  1. grep -aq '…' && { echo FAIL; exit 1; } — under set -e a non-matching grep in an AND-list aborts the whole step with no message.
  2. VAR=$(grep … | head … | sed …) — under set -o pipefail a no-match grep aborts the assignment. This is pre-existing: it means the existing "FAIL: gate pattern not found" diagnostic could never actually print. The step just died with no explanation, which is exactly what happened above.

Verification

Extracted check() from the workflow and ran it against four binaries:

casebinaryrcoutput
1current build (shape A, ON)0OK: gate hardcoded ON (unconditional memo)
2shipping vendored binary (legacy shape B, ON)0OK: gate ON (zG=!0)
3build patched to (()=>!1)1FAIL: unconditional memo is OFF (=>!1)
4build with the symbol renamed away1FAIL: gate pattern not found … (minifier drift? update this check)

Case 2 confirms the legacy path still works; cases 3 and 4 confirm it fails for the right reasons with a usable message.

Note

This is independent of #73 (the provider/model port) — it blocks releases either way and should land first.

ead3274 ("lock down appearance settings; force v2 layout") changed
settings.tsx to `newLayoutDesigns: createMemo(() => true)`. That minifies
to `newLayoutDesigns:<F>(()=>!0)`, so the gate check's grep for the old
channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and the step
exits 1 — blocking any release cut from current mainline.
Accepts the new unconditional shape, keeps the legacy channel-gated shape
as a fallback, and still fails loudly on real drift.
Also fixes two latent set -e bugs that made the check exit silently
instead of reporting: a `grep && { ... }` AND-list, and a `VAR=$(grep|...)`
assignment that aborts under pipefail when grep does not match — the
latter meant the existing "gate pattern not found" message could never fire.
Verified against four cases: current build (shape A on), the shipping
vendored binary (legacy shape B on), a binary patched to =>!1, and a
binary with the pattern removed. Correct rc and a diagnostic in each.
@jack-champagne
jack-champagneforce-pushed the jack/fix-release-gate-check branch from 570545a to fc7be4aCompareJuly 28, 2026 22:47
@jack-champagne
jack-champagne merged commit 08b1b0a into local/amicodeJul 28, 2026
1 of 4 checks passed
jack-champagne added a commit to harmoniqs/amicode that referenced this pull request Jul 29, 2026
opencode ead3274d3 changed settings.tsx to
`newLayoutDesigns: createMemo(() => true)` — unconditional, no channel
dependency. That minifies to `newLayoutDesigns:Z(()=>!0)`, so the grep for
the old channel-gated shape `newLayoutDesigns,<VAR>)` finds nothing and
vsix-gate reds on any binary from amicode.10 onward.
Accept the new shape, keep the legacy channel-gated one as a fallback, and
still fail closed on a genuine gate-OFF build.
Also fixes the silent-failure bug: under `set -euo pipefail` the non-matching
grep aborted the script before its own "pattern not found" diagnostic could
print, so the job failed with no explanation.
Mirrors harmoniqs/opencode#81, which fixed the same two bugs in the fork's
release workflow.
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.

1 participant

@jack-champagne