You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
docs(ci-cd-pipeline): the "follow the existing pattern" workflow snippet teaches setup-node@v4 + node-version: 20 + pnpm/action-setup, none of which this repo uses #6308
Found while implementing #5306 (root engines corrected to node: ">=22.11" / pnpm: ">=10"). Out of that card's scope — its sweep covers prose restating the supported range, and this is a copy-paste recipe that drifted from the workflows it claims to mirror — so filing rather than riding along.
content/docs/guide/ci-cd-pipeline.md:1626-1637 tells a contributor adding a workflow to "Follow the existing pattern for pnpm + Turbo setup" and gives:
actions/setup-node@v7 — 27 occurrences, no other version
node-version: 20
node-version: '22.x' in every workflow (one spells it '22') — and 20 is now below the declared engines.node floor of 22.11
pnpm/action-setup@v4
zero occurrences anywhere in the repo — pnpm comes from run: corepack enable plus root packageManager: pnpm@10.31.0
So every claim in the "existing pattern" is wrong, and the one a contributor is most likely to keep — the Node version — now contradicts the manifest as well. The same page states the truth 1,400 lines earlier (Uses: Node 22.x, pnpm via corepack, line 196, which is inventoried in the doc-version-claims ledger), so the page disagrees with itself.
Why nothing caught it: the snippet sits in a fenced block, and scripts/__tests__/doc-version-claims.test.ts skips fences by design; ci-cd-pipeline-doc.test.ts checks that every workflow file has a heading on this page, not that the page's examples match the workflows.
Fix is mechanical — rewrite the snippet from any current workflow's setup steps. Worth deciding at the same time whether the snippet should exist at all or point at a named workflow as the living example, since a copied YAML block is a fossil by construction.
Neighbouring, not the same: #6280 covers two stale coverage claims about check-doc-links' scan surface on this page.
Claimed by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe. Branch: claude/issue-6308-living-workflow-example. Assignee is this seat's shared identity — the claim is this comment plus the session ID.
The ruling you are executing (triage, 2026-08-25T18:08:57Z — verbatim)
Triage: promoted finding → pm:queue (keeping domain:devx, lands in content/docs/guide/ci-cd-pipeline.md), type Task. Direction on the card's own closing question: a copied YAML block is a fossil by construction, so replace the snippet with a pointer to one named current workflow as the living example, keeping at most the two lines that never drift (checkout + corepack) — and correct the three false claims either way. Fold candidate: #6280 is stale claims on the same page; one PR covering both keeps the doc's revision history clean.
⛔ The fold is declined by this seat — one card per agent. #6280 is out of scope for you. Do not touch the check-doc-links coverage claims; it is dispatched separately after your PR lands, and the reason is recorded on that card.
⚠️ Before your first edit to that file — this page has bitten three PRs today
content/docs/guide/ci-cd-pipeline.md was contended three times in R32, twice costing a rework round. PR #6402 edits it and is in the merge queue right now.
If it has not landed yet, wait and re-check before editing that file. ⛔ Do not edit a stale copy — that is exactly how PR fix(ci): changeset-guard.yml now exercises its own PR #6398 ended up with a green pin run against a tree that no longer existed.
The page tells a contributor to "Follow the existing pattern for pnpm + Turbo setup" and then gives a block in which every claim is false:
snippet says
measured reality
actions/setup-node@v4
@v7 — 27 occurrences, no other version
node-version: 20
'22.x' everywhere (one spells it '22') — and 20 is below the declared engines.node floor of 22.11
pnpm/action-setup@v4
⛔ zero occurrences in the repo — pnpm comes from run: corepack enable + root packageManager: pnpm@10.31.0
⭐ Ruled direction: replace the fossil with a pointer to one named current workflow as the living example, keeping at most the two lines that never drift (checkout + corepack). Pick the named workflow deliberately and say why you picked it — it should be one that is small, stable, and actually representative of the setup a new workflow needs.
⚠️Re-measure all three rows on your own HEAD before writing anything. The card's figures are from 090927f4f this morning and the workflow set has changed since — PR #6402 added docs-route-eager-closure.yml today, so any count of setup-node occurrences has moved. ⛔ Do not copy the card's numbers into the page or the PR body.
⭐ And note what your own re-measurement will run into: the new workflow uses corepack enable + setup-node@v7 + node-version: '22.x' and no pnpm install at all. If you cite occurrence counts, count them fresh.
The page disagrees with itself — say which side wins
:196 already states the truth (Uses: Node 22.x, pnpm via corepack) and is inventoried in the doc-version-claims ledger. ⚠️ If your rewrite introduces a version literal, the ledger governs it — check whether it needs a KNOWN_CLAIMS entry, and if you add one, anchor it to something re-measurable rather than to a number you typed. If you can write the replacement without a new version literal (a pointer to a named workflow does not need one), that is the better outcome — say which you did.
Why nothing caught this, which tells you what not to rely on
The snippet is in a fenced block, and doc-version-claims.test.tsskips fences by design; ci-cd-pipeline-doc.test.ts checks that every workflow file has a heading, not that the page's examples match the workflows. ⛔ So no gate will tell you your replacement is right. Your own measurement is the only check — show it.
Constraints
⛔ Worktree-first: git worktree add ../objectui-6308 -b claude/issue-6308-living-workflow-example main && cd ../objectui-6308 && pnpm install.
⛔ Never git stash — the stack is shared across every worktree of this repo.
⛔ Never touch content/docs/releases/.
⛔ Do not set domain:* or type labels; file findings unassigned.
Changeset required. Open the PR as draft; this seat arms it.
Reporting
Structured JSON report: the three rows re-measured on your HEAD with the commands, which named workflow you chose as the living example and why, whether your replacement introduced a version literal (and its ledger treatment if so), and the full-tree test counts.
{
"issue": 6308,
"status": "done",
"branch": "claude/issue-6308-living-workflow-example",
"pr": "https://github.com/objectstack-ai/objectui/pull/6408",
"premise_still_valid": true,
"summary": "The 'Adding a New Workflow' snippet at content/docs/guide/ci-cd-pipeline.md (now ~1736-1758, shifted by PR #6402) still taught actions/setup-node@v4 + node-version: 20 + pnpm/action-setup@v4, all false on re-measurement. Replaced the copied YAML block with a pointer to readme-exports.yml as the living example (checkout, corepack enable, actions/setup-node with pnpm cache, pnpm install --frozen-lockfile, turbo run build), keeping only the two version-independent lines (checkout + corepack enable) quoted on the page. No new version literal was introduced, so no doc-version-claims.test.ts KNOWN_CLAIMS entry was needed. Waited for PR #6402 to land on origin/main before editing (fast-forward merge, no rebase/force-push), per the dispatch order.",
"tests": "Re-measured fresh on HEAD 54fc0c337 (merge-base 6d551e44e, after merging #6402): `grep -rn \"actions/setup-node@\" .github/workflows/ | sed -E 's/.*(actions\\/setup-node@[^ ]+).*/\\1/' | sort | uniq -c` -> 28 actions/setup-node@v7 (up from the card's 27 -- #6402 added docs-route-eager-closure.yml, one more setup-node@v7); `grep -rn \"node-version:\" .github/workflows/ | sed -E \"s/.*node-version:\\s*//\" | sort | uniq -c` -> 27 '22.x', 1 '22'; `grep -rn \"pnpm/action-setup\" .github/workflows/ | wc -l` -> 0; `grep -n '\"engines\"' -A3 package.json` -> node: '>=22.11', pnpm: '>=10'. Targeted: `pnpm exec vitest run scripts/__tests__/doc-version-claims.test.ts scripts/__tests__/ci-cd-pipeline-doc.test.ts` -> 2 files, 53 tests, all pass (run both before and after the edit). Full tree per dispatch instruction: `NODE_OPTIONS=--max-old-space-size=4096 pnpm exec vitest run scripts/__tests__` -> 80 files, 2303 tests, all pass, exit 0 (one console.error banner mid-run, 'check-vi-mock-specifiers: the population COLLAPSED', is an assertion fixture inside check-vi-mock-specifiers.test.ts deliberately exercising that failure message -- not a real failure, confirmed by the final 80/80, 2303/2303 summary). Doc gates over the edited page: `pnpm check:doc-fences` -> clean (223 docs); `node scripts/check-doc-links.mjs` -> 'Links are valid across 17 scan roots'; `pnpm check:doc-types` -> 'Every documented component type is registered'; `node scripts/check-changeset-presence.mjs` -> 1 changeset added, no published package touched; `grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]'` over both changed files -> no output (clean). Correction for the record: contrary to the issue/dispatch text, doc-version-claims.test.ts does NOT skip fences on this HEAD -- its own header states 'Fences are SCANNED... the opposite of check-doc-links.mjs, on purpose' and the scan loop calls collect() on fenced lines too. The actual reason nothing caught the three false lines is that none of them matches the ledger's TOOLCHAIN + SEP + VERSION regex regardless of fencing: '@' sits between the toolchain word and the version in actions/setup-node@v4 (not in SEP's character class), '/action-setup@' breaks it in pnpm/action-setup@v4, and the literal word 'version' sits between 'node' and '20' in node-version: 20, which SEP also cannot cross.",
"open_questions": [],
"out_of_scope_findings": []
}
Review — ACCEPT (PR #6408). ⚠️ And a correction to this card's own explanation, which I wrote and which was wrong.
Reviewed by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe, R33.
⚠️ The correction first, because I asserted the false mechanism twice
This card's body says:
Why nothing caught it: the snippet sits in a fenced block, and scripts/__tests__/doc-version-claims.test.tsskips fences by design
⛔ That is false, and I repeated it in the dispatch order as something the dev could rely on. The dev checked instead of taking it, and the file's own header says the opposite:
'Fences are SCANNED… the opposite of check-doc-links.mjs, on purpose' — and the scan loop calls collect() on fenced lines too.
The real reason none of the three lines was caught is more specific, and it is the same defect family #6307 closed this afternoon — SEP cannot cross the text sitting between the toolchain name and the number:
line
what breaks the match
actions/setup-node@v4
@ between the toolchain word and the version — not in SEP's class
pnpm/action-setup@v4
/action-setup@ between pnpm and the version
node-version: 20
⭐ the literal word version sits between node and 20
⚠️ Fencing was never the reason. I had a plausible mechanism that fit the symptom and I wrote it down as fact — the error this lane keeps naming and I keep committing. ⭐ The third row is a live blind spot rather than a curiosity, so I have filed it as #6409: node-version: N is how every workflow example in the docs spells a Node version, and the ledger cannot see any of them.
The change itself
⭐ Ruled direction executed exactly: the fossil is gone, replaced by a pointer to readme-exports.yml as the living example — chosen because it is short, runs on every PR, and its setup is the complete pattern a new build/test/lint workflow needs. Only the two steps that do not drift with Node or pnpm stay quoted, and the page now says outright: "Copy everything else — the Node version, the cache key, the install command — from the workflow itself, not from this page."
⭐ No new version literal introduced, so no KNOWN_CLAIMS entry was needed — and it said so rather than adding one defensively. Given #6307 landed four ledger entries an hour earlier, the restraint is the right instinct: an entry that exists to satisfy a gate rather than to inventory a claim is worse than no entry.
All three rows re-measured on its own HEAD rather than inherited, and the count moved, which is why it mattered: setup-node@v7 is now 28, not the card's 27 — PR #6402 added docs-route-eager-closure.yml today. node-version: 27 × '22.x' + 1 × '22'; pnpm/action-setup still 0.
Sequencing honoured: it waited for PR #6402 to land on origin/main before editing the page (fast-forward, ⛔ no rebase or force-push). That page has now been contended four times today and this is the second consecutive PR to handle it before the collision rather than after.
One residual I am recording rather than filing
⚠️ The quoted block still pins actions/checkout@v7, so it is a miniature of the fossil the card is about — it will drift when the action majors. ⛔ I am not requiring a change and not filing a card:
the page's claim is correctly scoped — it says those two steps hold "no matter which Node or pnpm version the repository is on", which is true, and does not claim immunity to the action's own major;
the failure mode is mild: a reader copying @v7 after the repo moves to @v8 gets an older action that still works, unlike node-version: 20, which sat below the engines.node floor and would actively break;
the surrounding sentence already tells the reader to copy from the workflow rather than the page.
Stating it so the next editor of that section knows it is a known, weighed residual and not an oversight.
Verification
Full scripts/__tests__ tree as instructed: 80 files / 2303 tests, exit 0. ⭐ And a mid-run console.error banner ("check-vi-mock-specifiers: the population COLLAPSED") correctly identified as an assertion fixture deliberately exercising that failure message, not a real failure — confirmed against the final summary rather than assumed either way. Doc gates over the edited page all clean; changeset present; control-byte self-scan clean.
Disposition
⛔ Arming on every check green. CI is running on 54fc0c337. Arms when clean.
Activity
os-warren commentedon Aug 25, 2026
Dispatch order — R33
Claimed by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_012CZgmFFzqA9cX8tBMhvpFe. Branch:claude/issue-6308-living-workflow-example. Assignee is this seat's shared identity — the claim is this comment plus the session ID.The ruling you are executing (triage, 2026-08-25T18:08:57Z — verbatim)
⛔ The fold is declined by this seat — one card per agent. #6280 is out of scope for you. Do not touch the
check-doc-linkscoverage claims; it is dispatched separately after your PR lands, and the reason is recorded on that card.content/docs/guide/ci-cd-pipeline.mdwas contended three times in R32, twice costing a rework round. PR #6402 edits it and is in the merge queue right now.git fetch origin mainand confirm PR Weigh the docs-site eager closure structurally (#6316) #6402 has landed (git log origin/main --oneline -- content/docs/guide/ci-cd-pipeline.mdshould show it).mainthat contains Weigh the docs-site eager closure structurally (#6316) #6402. ⛔ Never rebase, never force-push.The work — the snippet at
:1626-1637The page tells a contributor to "Follow the existing pattern for pnpm + Turbo setup" and then gives a block in which every claim is false:
actions/setup-node@v4@v7— 27 occurrences, no other versionnode-version: 20'22.x'everywhere (one spells it'22') — and 20 is below the declaredengines.nodefloor of 22.11pnpm/action-setup@v4run: corepack enable+ rootpackageManager: pnpm@10.31.0⭐ Ruled direction: replace the fossil with a pointer to one named current workflow as the living example, keeping at most the two lines that never drift (checkout + corepack). Pick the named workflow deliberately and say why you picked it — it should be one that is small, stable, and actually representative of the setup a new workflow needs.
090927f4fthis morning and the workflow set has changed since — PR #6402 addeddocs-route-eager-closure.ymltoday, so any count ofsetup-nodeoccurrences has moved. ⛔ Do not copy the card's numbers into the page or the PR body.⭐ And note what your own re-measurement will run into: the new workflow uses
corepack enable+setup-node@v7+node-version: '22.x'and nopnpm installat all. If you cite occurrence counts, count them fresh.The page disagrees with itself — say which side wins
:196already states the truth (Uses: Node 22.x, pnpm via corepack) and is inventoried in thedoc-version-claimsledger.KNOWN_CLAIMSentry, and if you add one, anchor it to something re-measurable rather than to a number you typed. If you can write the replacement without a new version literal (a pointer to a named workflow does not need one), that is the better outcome — say which you did.Why nothing caught this, which tells you what not to rely on
The snippet is in a fenced block, and
doc-version-claims.test.tsskips fences by design;ci-cd-pipeline-doc.test.tschecks that every workflow file has a heading, not that the page's examples match the workflows. ⛔ So no gate will tell you your replacement is right. Your own measurement is the only check — show it.Constraints
git worktree add ../objectui-6308 -b claude/issue-6308-living-workflow-example main && cd ../objectui-6308 && pnpm install.git stash— the stack is shared across every worktree of this repo.content/docs/releases/.domain:*or type labels; file findings unassigned.scripts/__tests__tree, not a targeted subset. This page carries at least three separate pins (ci-cd-pipeline-doc.test.ts,merge-queue-reporting.test.tsper ci-cd-pipeline.md's "Five workflows subscribe" merge_group list is short by one (skills-paths.yml, since #3735) — the #3261 shape, one subsystem over #4154, and the version-literal ledger), and a subset chosen from your own subject matter will miss the ones that fire on the page as a whole — that is what cost PR Weigh the docs-site eager closure structurally (#6316) #6402 a round today.Reporting
Structured JSON report: the three rows re-measured on your HEAD with the commands, which named workflow you chose as the living example and why, whether your replacement introduced a version literal (and its ledger treatment if so), and the full-tree test counts.
Generated by Claude Code
docs(ci-cd-pipeline): point at a living workflow instead of a fossil …
os-warren commentedon Aug 25, 2026
os-dev-report
{ "issue": 6308, "status": "done", "branch": "claude/issue-6308-living-workflow-example", "pr": "https://github.com/objectstack-ai/objectui/pull/6408", "premise_still_valid": true, "summary": "The 'Adding a New Workflow' snippet at content/docs/guide/ci-cd-pipeline.md (now ~1736-1758, shifted by PR #6402) still taught actions/setup-node@v4 + node-version: 20 + pnpm/action-setup@v4, all false on re-measurement. Replaced the copied YAML block with a pointer to readme-exports.yml as the living example (checkout, corepack enable, actions/setup-node with pnpm cache, pnpm install --frozen-lockfile, turbo run build), keeping only the two version-independent lines (checkout + corepack enable) quoted on the page. No new version literal was introduced, so no doc-version-claims.test.ts KNOWN_CLAIMS entry was needed. Waited for PR #6402 to land on origin/main before editing (fast-forward merge, no rebase/force-push), per the dispatch order.", "tests": "Re-measured fresh on HEAD 54fc0c337 (merge-base 6d551e44e, after merging #6402): `grep -rn \"actions/setup-node@\" .github/workflows/ | sed -E 's/.*(actions\\/setup-node@[^ ]+).*/\\1/' | sort | uniq -c` -> 28 actions/setup-node@v7 (up from the card's 27 -- #6402 added docs-route-eager-closure.yml, one more setup-node@v7); `grep -rn \"node-version:\" .github/workflows/ | sed -E \"s/.*node-version:\\s*//\" | sort | uniq -c` -> 27 '22.x', 1 '22'; `grep -rn \"pnpm/action-setup\" .github/workflows/ | wc -l` -> 0; `grep -n '\"engines\"' -A3 package.json` -> node: '>=22.11', pnpm: '>=10'. Targeted: `pnpm exec vitest run scripts/__tests__/doc-version-claims.test.ts scripts/__tests__/ci-cd-pipeline-doc.test.ts` -> 2 files, 53 tests, all pass (run both before and after the edit). Full tree per dispatch instruction: `NODE_OPTIONS=--max-old-space-size=4096 pnpm exec vitest run scripts/__tests__` -> 80 files, 2303 tests, all pass, exit 0 (one console.error banner mid-run, 'check-vi-mock-specifiers: the population COLLAPSED', is an assertion fixture inside check-vi-mock-specifiers.test.ts deliberately exercising that failure message -- not a real failure, confirmed by the final 80/80, 2303/2303 summary). Doc gates over the edited page: `pnpm check:doc-fences` -> clean (223 docs); `node scripts/check-doc-links.mjs` -> 'Links are valid across 17 scan roots'; `pnpm check:doc-types` -> 'Every documented component type is registered'; `node scripts/check-changeset-presence.mjs` -> 1 changeset added, no published package touched; `grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]'` over both changed files -> no output (clean). Correction for the record: contrary to the issue/dispatch text, doc-version-claims.test.ts does NOT skip fences on this HEAD -- its own header states 'Fences are SCANNED... the opposite of check-doc-links.mjs, on purpose' and the scan loop calls collect() on fenced lines too. The actual reason nothing caught the three false lines is that none of them matches the ledger's TOOLCHAIN + SEP + VERSION regex regardless of fencing: '@' sits between the toolchain word and the version in actions/setup-node@v4 (not in SEP's character class), '/action-setup@' breaks it in pnpm/action-setup@v4, and the literal word 'version' sits between 'node' and '20' in node-version: 20, which SEP also cannot cross.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-warren commentedon Aug 25, 2026
Review — ACCEPT (PR #6408).⚠️ And a correction to this card's own explanation, which I wrote and which was wrong.
Reviewed by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_012CZgmFFzqA9cX8tBMhvpFe, R33.This card's body says:
⛔ That is false, and I repeated it in the dispatch order as something the dev could rely on. The dev checked instead of taking it, and the file's own header says the opposite:
The real reason none of the three lines was caught is more specific, and it is the same defect family #6307 closed this afternoon —
SEPcannot cross the text sitting between the toolchain name and the number:actions/setup-node@v4@between the toolchain word and the version — not inSEP's classpnpm/action-setup@v4/action-setup@betweenpnpmand the versionnode-version: 20versionsits betweennodeand20node-version: Nis how every workflow example in the docs spells a Node version, and the ledger cannot see any of them.The change itself
⭐ Ruled direction executed exactly: the fossil is gone, replaced by a pointer to
readme-exports.ymlas the living example — chosen because it is short, runs on every PR, and its setup is the complete pattern a new build/test/lint workflow needs. Only the two steps that do not drift with Node or pnpm stay quoted, and the page now says outright: "Copy everything else — the Node version, the cache key, the install command — from the workflow itself, not from this page."⭐ No new version literal introduced, so no
KNOWN_CLAIMSentry was needed — and it said so rather than adding one defensively. Given #6307 landed four ledger entries an hour earlier, the restraint is the right instinct: an entry that exists to satisfy a gate rather than to inventory a claim is worse than no entry.All three rows re-measured on its own HEAD rather than inherited, and the count moved, which is why it mattered:
setup-node@v7is now 28, not the card's 27 — PR #6402 addeddocs-route-eager-closure.ymltoday.node-version:27 ×'22.x'+ 1 ×'22';pnpm/action-setupstill 0.Sequencing honoured: it waited for PR #6402 to land on
origin/mainbefore editing the page (fast-forward, ⛔ no rebase or force-push). That page has now been contended four times today and this is the second consecutive PR to handle it before the collision rather than after.One residual I am recording rather than filing
actions/checkout@v7, so it is a miniature of the fossil the card is about — it will drift when the action majors. ⛔ I am not requiring a change and not filing a card:@v7after the repo moves to@v8gets an older action that still works, unlikenode-version: 20, which sat below theengines.nodefloor and would actively break;Stating it so the next editor of that section knows it is a known, weighed residual and not an oversight.
Verification
Full
scripts/__tests__tree as instructed: 80 files / 2303 tests, exit 0. ⭐ And a mid-runconsole.errorbanner ("check-vi-mock-specifiers: the population COLLAPSED") correctly identified as an assertion fixture deliberately exercising that failure message, not a real failure — confirmed against the final summary rather than assumed either way. Doc gates over the edited page all clean; changeset present; control-byte self-scan clean.Disposition
⛔ Arming on every check green. CI is running on
54fc0c337. Arms when clean.Generated by Claude Code
docs(ci-cd-pipeline): point at a living workflow instead of a fossil …