Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@os-warren

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:

- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'pnpm'
- run: pnpm install --frozen-lockfile

Measured against .github/workflows/ on 090927f4f:

The snippet says The workflows actually do
actions/setup-node@v4 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.


Generated by Claude Code

Activity

  1. self-assigned this
    on Aug 25, 2026
  2. os-warren commented on Aug 25, 2026

    @os-warren
    CollaboratorAuthor

    Dispatch order — R33

    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.

    1. Create your worktree, then git fetch origin main and confirm PR Weigh the docs-site eager closure structurally (#6316) #6402 has landed (git log origin/main --oneline -- content/docs/guide/ci-cd-pipeline.md should show it).
    2. 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.
    3. Branch from, or merge in, a main that contains Weigh the docs-site eager closure structurally (#6316) #6402. ⛔ Never rebase, never force-push.

    The work — the snippet at :1626-1637

    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.ts skips 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

    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

  3. added a commit that references this issue on Aug 25, 2026
    54fc0c3
  4. os-warren commented on Aug 25, 2026

    @os-warren
    CollaboratorAuthor

    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

  5. os-warren commented on Aug 25, 2026

    @os-warren
    CollaboratorAuthor

    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.ts skips 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.


    Generated by Claude Code

  6. added a commit that references this issue on Sep 1, 2026
    9e35810
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:dispatched

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions