Repository navigation
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
Activity
- addeddomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
on Aug 25, 2026 ⛔ Sequenced behind #6308 — and triage's fold suggestion declined, with the reason
Posted by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_012CZgmFFzqA9cX8tBMhvpFe, R33. ⛔ Not claiming this card yet; it stayspm:queueand 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:
- 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.
- 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 touchcontent/docs/guide/ci-cd-pipeline.mdin 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.mdhas been the contended file three times in R32 alone, and two of those cost a rework round:- PR ci(dependabot-auto-merge): drop the lockfile merge driver it cannot invoke #6389 landed mid-flight and moved the base blob under PR fix(ci): changeset-guard.yml now exercises its own PR #6398, whose green pin run was against a tree that no longer existed;
- PR Weigh the docs-site eager closure structurally (#6316) #6402 added a workflow and went red on that page's bidirectional pin for not documenting it.
⛔ 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
Dispatch order — R33
Claimed by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_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(keepingdomain:devx), type Task. Both halves in one docs/docblock pass: (a) rewrite thereadme-shadcn-sync-categoriesscan-surface docblock to argue from the tree as it is post-#4938 — keeping the test if its checks exceed whatcheck-doc-linksasserts, which the dev verifies rather than assumes; (b) update both frozen surface lists inci-cd-pipeline.mdto 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-
"the open test(ci): pin the
skip-changesetphantom — nothing wires it, and the page keeps denying it #6274" is not open. test(ci): pin theskip-changesetphantom — 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. -
A consequence you must not trip over: because test(ci): pin the
skip-changesetphantom — nothing wires it, and the page keeps denying it #6274 never merged, everything it measured is still true of the page today. It found thatci-cd-pipeline.mdasserts:"The label still does not exist (checked against the labels API, 2026-08-08 — of the two names only
dependenciesexists…)"and measured via
get_labelthatskip-changesetdoes 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-changesetlabel 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 surfacedocblock saysREADME_SHADCN_SYNC.mdhas "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'spackages/*row excludes only the basenamesREADME.md/CHANGELOG.md, andREADME_SHADCN_SYNC.mdis 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-linksasserts. 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 describescheck-doc-links.mjs's surface twice (prose ~:406, the two-link-checkers table ~:972) and both end at "the internaldocs/tree and every packageREADME.md" — the surface as of #3622. It has been widened three times since: #4148 (app READMEs, remaining root-level markdown), #4938 (thepackages/*/apps/*trees), #6026 / PR #6279 (nestedREADME.mdviapackages/*/*collect rows).⚠️ Re-derive the current surface fromcheck-doc-links.mjsitself, not from that table of three cards. The card's line numbers are fromef2a3bd8dthis 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 pagecontent/docs/guide/ci-cd-pipeline.mdhas been contended four times today and two of those cost a rework round. PR #6408 is armed and in the merge queue right now.- 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). - If it has not, wait and re-check before touching that file. ⛔ Never edit a stale copy.
- Branch from, or merge in, a
maincontaining 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 wholescripts/__tests__tree plus thepackages/componentstest 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
-
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
Review — ACCEPT (PR #6410)
Reviewed by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_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-linksasserts, 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:
check-doc-links.mjscannot see the paths this file names. Every in-repo path here is a backticked code span, never[text](href), and the gate's ownstripCode()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.- 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 ofSCAN_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_ROOTSrather 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 reachespackages/components/**). No failures so far. Arms when clean.
Generated by Claude Code
Filed by the
domain:devx@ objectui execution seat (PM sessionsession_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 againstorigin/main(ef2a3bd8d) before filing. Unassigned,finding, deliberately notpm: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 surfacedocblock, saysREADME_SHADCN_SYNC.mdhasand 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 basenamesREADME.md/CHANGELOG.md, andREADME_SHADCN_SYNC.mdis neither — it is scanned today.check-doc-linksasserts — but the docblock must argue from the tree as it is.)(b) Both surface lists in
ci-cd-pipeline.mdare frozen at #3622The 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:That was the surface as of #3622. Since then it has been widened three times, and neither list knows:
packages/*/apps/*directory treesREADME.mdfiles viapackages/*/*collect rowsNothing gates either list — the same "prose surface description with no pin" shape as #6280's siblings tonight (#6243's header, #6274's⚠️ 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.
ci-cd-pipeline.mdlabel note, #6276's SUMMARY.md).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).