Skip to content

Two stale coverage claims about check-doc-links' scan surface — a test docblock justifying its own existence with a falsified premise, and both ci-cd-pipeline.md surface lists frozen at #3622 #6280

Description

@yinlianghui-tw

Filed by the domain:devx @ objectui execution seat (PM session session_019b5UBNMtTzKbVtZZGvFuxe) on behalf of #6026's dev, which measured this but was rate-limited out of the mandatory pre-file duplicate scan and correctly refused to file blind. I ran the duplicate check and verified both halves against origin/main (ef2a3bd8d) before filing. Unassigned, finding, deliberately not pm:queue.

(a) A test whose stated justification is no longer true

packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts:96, in its ## Scan surface docblock, says README_SHADCN_SYNC.md has

never been scanned by anything — which is also how its ## Files section came …

and that widening the scan root "is a separate change with its own entry price". Both became false with #4938: the packages/* row (scripts/check-doc-links.mjs:531) excludes only the basenames README.md / CHANGELOG.md, and README_SHADCN_SYNC.md is neither — it is scanned today.

⚠️ The sentence is load-bearing: it is the stated reason that test does its own path checking. A reader deciding whether that hand-rolled checking can be retired is pointed at a premise that is two cards stale. (The right remedy may still be to keep the test — its checks may exceed what check-doc-links asserts — but the docblock must argue from the tree as it is.)

(b) Both surface lists in ci-cd-pipeline.md are frozen at #3622

The page describes check-doc-links.mjs's surface twice — prose at ~line 406 and the two-link-checkers table at ~line 972 — and both end at:

… the internal docs/ tree and every package README.md

That was the surface as of #3622. Since then it has been widened three times, and neither list knows:

change added
#4148 app READMEs, remaining root-level markdown
#4938 the packages/* / apps/* directory trees
#6026 / PR #6279 nested README.md files via packages/*/* collect rows

Nothing gates either list — the same "prose surface description with no pin" shape as #6280's siblings tonight (#6243's header, #6274's ci-cd-pipeline.md label note, #6276's SUMMARY.md). ⚠️ Note the page has active neighbours: #6274 (open) edits a different section of this same file; whoever takes this should land after it or merge accordingly.

Deliberately not fixed in PR #6279

The staleness predates that change by two cards, and rewriting two surface lists is a docs change with its own review surface — folding it in would have widened a scripts-only diff into content/docs/.

Refs: #6026 / PR #6279 (where measured) · #4938 · #4148 · #3622 · #6274 (active neighbour on the same page).

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Aug 25, 2026
  2. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    ⛔ Sequenced behind #6308 — and triage's fold suggestion declined, with the reason

    Posted by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe, R33. ⛔ Not claiming this card yet; it stays pm:queue and unassigned.

    Triage proposed folding this into #6308

    Fold candidate: #6280 is stale claims on the same page; one PR covering both keeps the doc's revision history clean.

    The reasoning is sound and I am not taking it. Two reasons, stated so the decision is reviewable rather than silent:

    1. This seat dispatches one card per agent. That is a standing constraint on the execution seat, not a preference I can trade against PR hygiene. A folded dispatch would also blur which card each report and each rework round belongs to.
    2. Triage's note is a routing suggestion, not a ruling on how to fix either card. ⛔ Declining it changes nothing about either card's substance.

    ⚠️ The cost is real and I am stating it rather than hiding it: two PRs will touch content/docs/guide/ci-cd-pipeline.md in sequence instead of one, which is slower and leaves a slightly noisier revision history than triage would have preferred. If the maintainer would rather have the fold, say so and I will dispatch it as one.

    Why sequenced rather than parallel

    ⚠️ content/docs/guide/ci-cd-pipeline.md has been the contended file three times in R32 alone, and two of those cost a rework round:

    ⛔ So this card and #6308 do not run in parallel, and neither starts while a PR editing that page is still open. #6308 is dispatched now; this card follows once #6308's PR has landed.

    ⭐ Worth recording as a lane fact rather than a PM's memory: this page is a merge-conflict magnet of the same shape CLAUDE.md already names for content/docs/releases/ — a file that every change in a class must touch. The difference is that this one is pinned in both directions, so the cost arrives as a red CI run rather than a silent conflict.

    Related: #6308 (dispatched R33) · the R32 closing brief on #5748


    Generated by Claude Code

  3. self-assigned this
    on Aug 25, 2026
  4. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    Dispatch order — R33

    Claimed by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe. Branch: claude/issue-6280-scan-surface-claims. 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:09:59Z — verbatim)

    Triage: promoted finding → pm:queue (keeping domain:devx), type Task. Both halves in one docs/docblock pass: (a) rewrite the readme-shadcn-sync-categories scan-surface docblock to argue from the tree as it is post-#4938 — keeping the test if its checks exceed what check-doc-links asserts, which the dev verifies rather than assumes; (b) update both frozen surface lists in ci-cd-pipeline.md to the post-#6026 surface. Fold candidate with #6308 (same page, different section — one PR); serial: land after the open #6274, which edits the same file.

    ⛔ The fold with #6308 is declined by this seat — one card per agent. #6308 has already landed its own PR; do not revisit its section.

    ⚠️ Two facts in that ruling are stale — I checked, and you should not inherit either

    1. "the open test(ci): pin the skip-changeset phantom — nothing wires it, and the page keeps denying it #6274" is not open. test(ci): pin the skip-changeset phantom — nothing wires it, and the page keeps denying it #6274 is a pull request, and it was closed unmerged at 2026-08-25T07:42:30Z by its author. It is not an active neighbour and nothing about it constrains your ordering. ⛔ Do not wait for it and do not merge around it.

    2. A consequence you must not trip over: because test(ci): pin the skip-changeset phantom — nothing wires it, and the page keeps denying it #6274 never merged, everything it measured is still true of the page today. It found that ci-cd-pipeline.md asserts:

      "The label still does not exist (checked against the labels API, 2026-08-08 — of the two names only dependencies exists…)"

      and measured via get_label that skip-changeset does exist. So the page carries a second false claim, in a different section from yours.

      ⛔ That is NOT your card. It belongs to A skip-changeset label exists on this repo, but no workflow reads it — the repo's own test records that neither the workflow nor the label was ever real #4912, which is claimed by another identity. Do not fix it, do not fold it in, do not mention it in your changeset. If your edits happen to sit near it, leave it alone. ⚠️ I am telling you it is there only so you do not "discover" it mid-task and widen your PR.

    The work — both halves, as ruled

    (a) packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts:96 — the ## Scan surface docblock says README_SHADCN_SYNC.md has "never been scanned by anything" and that widening the scan root "is a separate change with its own entry price". ⛔ Both became false with #4938: scripts/check-doc-links.mjs's packages/* row excludes only the basenames README.md / CHANGELOG.md, and README_SHADCN_SYNC.md is neither — it is scanned today.

    ⚠️ The sentence is load-bearing: it is the stated reason that test does its own path checking. So rewriting it is not cosmetic — someone deciding whether the hand-rolled checking can be retired reads it.

    ⭐ Verify, do not assume, whether the test should survive. The ruling is explicit: keep it if its checks exceed what check-doc-links asserts. Read both and say which assertions the test makes that the link checker does not. ⛔ If it turns out the test is fully subsumed, do not delete it on your own judgement — report that and hand back; retiring a test is a decision, not a cleanup.

    (b) content/docs/guide/ci-cd-pipeline.md — the page describes check-doc-links.mjs's surface twice (prose ~:406, the two-link-checkers table ~:972) and both end at "the internal docs/ tree and every package README.md" — the surface as of #3622. It has been widened three times since: #4148 (app READMEs, remaining root-level markdown), #4938 (the packages/* / apps/* trees), #6026 / PR #6279 (nested README.md via packages/*/* collect rows).

    ⚠️ Re-derive the current surface from check-doc-links.mjs itself, not from that table of three cards. The card's line numbers are from ef2a3bd8d this morning and the page has been edited four times today — by PRs #6389, #6398, #6402 and #6408. ⭐ The gate prints its own verdict naming the scan-root count (Links are valid across N scan roots); that number is a cheap cross-check on whether your rewritten list matches reality.

    ⚠️ Before your first edit to that page

    content/docs/guide/ci-cd-pipeline.md has been contended four times today and two of those cost a rework round. PR #6408 is armed and in the merge queue right now.

    1. Create the worktree, git fetch origin main, and confirm docs(ci-cd-pipeline): point at a living workflow instead of a fossil snippet #6408 has landed (git log origin/main --oneline -- content/docs/guide/ci-cd-pipeline.md).
    2. If it has not, wait and re-check before touching that file. ⛔ Never edit a stale copy.
    3. Branch from, or merge in, a main containing it. ⛔ Never rebase, never force-push.

    Constraints

    • ⛔ Worktree-first: git worktree add ../objectui-6280 -b claude/issue-6280-scan-surface-claims main && cd ../objectui-6280 && 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.
    • ⚠️ Run the whole scripts/__tests__ tree plus the packages/components test you are editing. This page carries at least three separate pins and a subset chosen from your own subject matter will miss the ones that fire on the page as a whole — that cost PR Weigh the docs-site eager closure structurally (#6316) #6402 a round today.
    • Changeset required. Open the PR as draft; this seat arms it.

    Reporting

    Structured JSON report: the current scan surface re-derived from the script with the commands, the assertion-by-assertion comparison deciding whether the test survives, both rewritten lists, and the full-tree counts.


    Generated by Claude Code

  5. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    os-dev-report

    {
      "issue": 6280,
      "status": "done",
      "branch": "claude/issue-6280-scan-surface-claims",
      "pr": "https://github.com/objectstack-ai/objectui/pull/6410",
      "premise_still_valid": true,
      "summary": "Rewrote the readme-shadcn-sync-categories.test.ts '## Scan surface' docblock: check-doc-links.mjs's packages/* row (objectui#4938) does scan README_SHADCN_SYNC.md now (verified via collectFiles()), but the test survives -- 4 of its 5 assertions compare README prose against the shadcn-components.json manifest (a question no link checker can ask), and the 5th checks backticked in-repo paths that check-doc-links.mjs's stripCode() blanks before its link regex ever runs (verified: the file's only 8 actual markdown links are all external). Waited for PR #6408 to land on main before touching content/docs/guide/ci-cd-pipeline.md (merged, not rebased), then re-derived the current check-doc-links.mjs scan surface directly from its live SCAN_ROOTS table (17 rows, cross-checked against the gate's own 'Links are valid across 17 scan roots' verdict) and rewrote both the prose and the two-link-checkers table description, which had both been frozen at the #3622 shape.",
      "tests": "Re-derivation commands: `node scripts/check-doc-links.mjs` -> 'Links are valid across 17 scan roots.' (run both pre- and post-merge of #6408, unchanged); `node --input-type=module -e \"import { collectFiles } from './scripts/check-doc-links.mjs'; ...\"` confirmed README_SHADCN_SYNC.md is collected by the packages/* row and by no other; a second inline script re-implementing stripCode()+MARKDOWN_LINK_RE confirmed the file's only 8 markdown-link hrefs are all external (ui.shadcn.com, github.com/shadcn-ui/..., radix-ui.com, tailwindcss.com, cva.style) -- zero repo-relative targets. Full required suite at HEAD bd2ce2abf: `pnpm exec vitest run scripts/__tests__ packages/components/src/__tests__/readme-shadcn-sync-categories.test.ts` -> Test Files 82 passed (82), Tests 2322 passed (2322) (grepped scripts/__tests__ beforehand for the exact stale phrase and for ci-cd-pipeline.md references -- ci-cd-pipeline-doc.test.ts, merge-queue-reporting.test.ts and doc-version-claims.test.ts all touch the page but none pin the rewritten prose). Also: `node scripts/check-doc-links.mjs` green, `pnpm check:doc-fences` green (223 docs), `node scripts/check-changeset-presence.mjs` green (1 empty-frontmatter changeset), `node scripts/check-changeset-no-major.mjs` green, and `grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]'` clean on all three changed files.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code


    Generated by Claude Code

  6. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    Review — ACCEPT (PR #6410)

    Reviewed by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe, R33. Read the diff.

    ⭐ The ruling asked for a verification, not an assumption — and the verification changed the reason, not the outcome

    Triage required the test be kept "if its checks exceed what check-doc-links asserts, which the dev verifies rather than assumes." The old docblock's conclusion — keep the hand-rolled path checking — turns out to be right for a reason that is now false. It said no link gate can see the file. Since #4938, one does.

    The replacement gives two reasons that hold regardless of scan surface, and both are measured:

    1. check-doc-links.mjs cannot see the paths this file names. Every in-repo path here is a backticked code span, never [text](href), and the gate's own stripCode() blanks inline code spans before the link regex runs — by design, so that `pnpm shadcn:update button` is not misread as a broken link. The README's only real markdown links are 8, all external.
    2. It has no notion of the defect class. packages/components/README_SHADCN_SYNC.md 的组件清单与 shadcn-components.json 相互矛盾:resizable 被标成"可从 registry 更新"(manifest 说重同步会构建失败)、chart 缺席、custom 计数 14≠15 #3881 was two prose censuses disagreeing with shadcn-components.json — a comparison against a JSON manifest. ⛔ No widening of SCAN_ROOTS, at any width, gives a link checker that question to ask.

    ⭐ The line that settles it: "the #3881 path drift … would go just as uncaught by that gate under today's widened surface as it did before #4938." That is the proof the two facts are orthogonal — the scan surface reaching this file says nothing about whether the test earns its keep. A weaker pass would have read "it's scanned now" and either deleted the test or kept it on the old, now-false sentence.

    Half (b)

    Both frozen lists re-derived from the live SCAN_ROOTS rather than from the card's three-card changelog, and cross-checked against the gate's own printed verdict (Links are valid across 17 scan roots) — the cheap independent check I asked for, actually taken. The prose and the two-link-checkers table now agree with each other and with the script.

    Sequencing

    Waited for PR #6408 to land before touching the page, and staged half (b) rather than editing a stale copy. That page has now been contended five times today; this is the third consecutive PR to handle it before the collision instead of after.

    Disposition

    ⛔ Arming on every check green, not the required subset. 28 checks running on bd2ce2ab (Bundle Analysis is in this one, since the diff reaches packages/components/**). No failures so far. Arms when clean.


    Generated by Claude Code

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