docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude
, '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

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path - #7375

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small
Sep 2, 2026
Merged

docs(skills): verify — prescribe the stable Chromium alias instead of the versioned path#7375
os-zhuang merged 1 commit into
mainfrom
claude/issue-14317-skills-internal-small

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#14317 — the objectui half of the internal-small skills flight (one finding). The objectstack half is objectstack-ai/objectstack#14598.

Per-finding record

id落点beforeafter
VFY-C-01.claude/skills/verify/SKILL.md:26-33prescribes the versioned literal /opt/pw-browsers/chromium-1194/chrome-linux/chrome, tells the reader to re-probe with find when the version moves, and leaves the launch snippet holding a placeholder the reader must resolveprescribes the stable alias /opt/pw-browsers/chromium in both the prose and the snippet, and warns against copying the versioned spelling back out of a probe

Why the alias and not the probe. Both sibling repos already prescribe the alias and warn against exactly this spelling: the platform-checklist runner doc calls a dead versioned path copied out of a section "the absence-inference trap", and the dev-agent definition prescribes the alias for executablePath. The versioned literal works today and stops working at the next image bump — and its failure mode is the expensive one, because a missing path reads as "no browser in this container" when the browser is in fact installed, which is the same wrong conclusion the runner doc records someone reaching from a blocked CDN download.

Positive control, measured on this container:/opt/pw-browsers/chromium is a live symlink onto /opt/pw-browsers/chromium-1194/chrome-linux/chrome and is executable. The fix names the same binary by a name that survives.

Line delta: .claude/skills/verify/SKILL.md 44 → 46. This repo prices no ceiling on it — its only skills gate scans the published skills/ root, so this file is unpriced and unguarded (measured during the audit, reported for the corpus record, not acted on here).

Gates

All at head 81e6308, which equals the pushed remote head. Exit codes captured by redirect before any pipe.

commandexitits own verdict
node scripts/check-control-bytes.mjs0OK (scanned 6066 tracked text file(s); skipped 85 binary)
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-shell-escape-residue.mjs0OK (4/4 root(s) resolved … 205 file(s) and 1319 fenced block(s) examined)
node scripts/check-skills-paths.mjs0OK (92/93 stated path(s) resolve across 18 guide file(s); 1 baselined)
node scripts/check-changeset-presence.mjs01 file(s) changed, 0 of them published source of a package the release covers … No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-changeset-no-major.mjs0No changeset declares a major bump.
node scripts/check-governed-queue-guard.mjs --self-test0132 cases pass
node scripts/check-governed-queue-guard.mjs --test .claude/skills/verify/SKILL.md3the governed verdict, not a red: GOVERNED — 1 of 1 path(s) are on a governed surface … Park it as a DRAFT and leave the merge to the maintainer

No changeset, and it is the repo's own gate that says so rather than a judgment call: the path is not published source of any released package, so none is owed. ⛔ No label is requested from this seat.

Governed surface ⇒ this PR stays a draft for human merge; review requests are the dispatching seat's step.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

The headless-driving section prescribed the versioned literal
`/opt/pw-browsers/chromium-NNNN/chrome-linux/chrome` and told the reader to
re-probe when the version moved. Both sibling repos prescribe the stable alias
instead and warn against exactly this spelling: the versioned path stops
existing at the next image bump, and a dead path copied out of a doc then reads
as "no browser here" while the browser is in fact installed. Verified on disk:
the alias is a live symlink onto the versioned build, so the fix is the same
binary by a name that survives.
Both the prose and the launch snippet now name the alias, and the snippet no
longer carries a placeholder the reader has to resolve by probing.
No changeset: the repo's own presence gate reports this path is not published
source of any released package, so none is owed. Governed surface, so the PR
stays a draft for human merge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
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.

3 participants

@os-litant@os-zhuang@claude