Skip to content

feat(devx): a symbol-anchor corpus over scripts/** refuses line citations in gate headers, and the free ones are migrated (#15765) - #15806

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-15765-scripts-symbol-anchor-corpus
Sep 5, 2026
Merged

feat(devx): a symbol-anchor corpus over scripts/** refuses line citations in gate headers, and the free ones are migrated (#15765)#15806
baozhoutao merged 3 commits into
mainfrom
claude/issue-15765-scripts-symbol-anchor-corpus

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Part of #15765 — two files another lane's live PR holds still carry a citation, so this does not close the card. See Held below.

scripts/** was outside every symbol-anchor corpus, in both directions: a path:NNN there was neither resolved nor refused. This registers the second defineCorpus over scripts/** .mjs comment prose and migrates the free citations. ⛔ No second resolver — the grammar, the extractor and the resolution rule are still the one copy in scripts/symbol-anchors.mjs.


1. The measurement the card said a fix owes first

the extractor was written for prose in .md, and whether it reads a // or /* */ comment block cleanly is not established by this card. That is the measurement a fix owes first.

It reads comment blocks perfectly, and that half needed no change. extractAnchors is line-based and knows nothing about syntax, so comment prose is read exactly as an ADR paragraph is. Fed one real gate header (scripts/check-react-page-adapter-contract.mjs) unmodified, on the merge base:

anchors=15 lineAnchors=11
  [anchor]  L126 "`packages/client/src/index.ts#PaginatedResult`"   commentish=true
  [anchor]  L144 "`scripts/symbol-anchors.mjs#ANCHOR_GRAMMAR`"      commentish=true
  [line]    L133 "packages/client/src/index.ts:310"                 commentish=true
  [line]    L134 "`:392`"                                           commentish=true
  ...
  [line]    L1038 "content/docs/other.mdx:1"                        commentish=FALSE
  [line]    L1053 "p.ts:2"                                          commentish=FALSE
  [line]    L1053 "p.ts:3"                                          commentish=FALSE

The defect is the other half: it also reads the CODE. Those commentish=false rows are the gate's own self-test fixtures — string literals like 'p.ts:2' and 'content/docs/other.mdx:1', written to provoke that gate's own line-reporting. A raw .mjs corpus would red a gate for testing itself. Measured over the 216 tracked scripts/** .mjs files: 251 live citations raw, 128 through comment prose — 123 of the raw count are code.

So the extractor change is one thing and only one: a per-corpus doc projection, scripts/symbol-anchors.mjs#commentProse. It asks scripts/js-comment-mask.mjs#scanSource the same question every source-scanning gate asks it and projects the answer the other way round from maskComments — that one keeps code and blanks prose; a doc corpus wants the prose. It blanks, never deletes (scripts/js-comment-mask.mjs#blank), so a finding's line number is still the line the author opens. ⛔ Not a private stripper: check-comment-mask-adoption exists precisely to stop a ninth copy.

Pinned in symbol-anchors --self-test, one fixture per comment form and the negatives, with a control:

case expectation
// … packages/a/line.ts:11 read
/* … packages/a/block.ts:22 */ read
docblock * … packages/a/doc.ts:33 read
docblock `packages/a/doc.ts#realThing` symbol anchor extracted, not only the rot
const fixture = 'packages/a/string.ts:44' not a doc citation
const tpl = `packages/a/template.ts:55` not a doc citation
the same source unprojected both fixtures ARE read — the control that makes the two negatives mean something
the docblock citation's reported line === 5, and the line count is unchanged

Battery floor raised 51 → 63.

2. The census, with its instrument stated

Three instruments give three answers on the same tree (5315098df), and the instrument is the reading:

n instrument
251 raw extractAnchors over the whole file — counts a gate's own fixtures
128 through commentProse — comment prose only
32 …and the cited path names a tracked filewhat this gate judges, across 15 files

The card said 27 across 14 files, triage 22 with a coarser regex; neither binds. The third row reproduces the card's instrument to within one citation — requiring the path to be directory-qualified as well gives 28 across 14 files, exactly the card's shape. This gate does not add that extra rule, because a tracked file is a tracked file and AGENTS.md:126 is the same defect as content/docs/…:240.

What the corpus declines to judge, and why it is a scope call rather than a softening. judgeUntrackedLineAnchors: false leaves 96 citations unjudged: 66 bare filenames inside census tables (engine.ts at some line — an abbreviation no resolver can bind to one of this tree's several files of that name), 22 continuations inheriting no path, 11 directory-qualified illustrations or sibling-repo paths, 1 tilde form. They are seen and counted (unresolvableLineCitation, asserted in the self-test so "declined" is told apart from "blind spot") and recorded as a follow-up — exactly as docs/adr/** recorded its 1,056 bare paths. This gate cannot tell their author how to fix them, and a gate whose only remedy is "stop writing that" is the permanently-red gate this repo retired. checkBarePaths: false on the same evidence: judging every bare path span here produces 1,617 findings.

3. Migrated — 31 of the 32, and 12 of them are now checked symbol anchors

Symbol anchors, which the gate resolves on every run:

file was now
scripts/audits/14423-databaseloader-cost-probe.mjs database-loader.ts:936, :1062 #readTypeRows, #list
scripts/audits/14423-unbound-declarations-before-count.mjs plugin.ts:2475 #runGovernanceInventory
scripts/check-tenant-audit-census.mjs check-system-context-census.mjs:77-84 #UNENFORCED_TEXT_COUNTS
scripts/measure-durability-swallow-family.mjs db-job-adapter.ts:139 #cancel
scripts/pm/dispatch-gates.mjs check-test-completeness.mjs:576, measure-position-name-fold-census.mjs:689, workspace-enumerator.mjs:328 #selfTest ×3
scripts/pm/dispatch-gates.mjs build-docs.ts:61, build-skill-references.ts:35 #SRC_DIR, #SPEC_SRC
scripts/symbol-anchors.mjs engine.ts#registerApp, #installPackage (absent) this module's own #extractAnchors, #defineCorpus

plugin.ts:2475 was already 21 lines offrunGovernanceInventory is declared at 2496 today. The card's argument reproduced on a second instance, found by the gate rather than by a reader.

File-level anchors with the number kept beside them as data — every digit preserved, the anchor form dropped. These are dated census rows and rot records, not pointers; rewriting them to a live-looking file:NNN is what made them lie in the first place:

scripts/check-agent-test-spelling.mjs (5) · scripts/check-doc-anchors.mjs (4) · scripts/check-org-identifier.mjs (4) · scripts/check-overlay-whitelist-table.mjs (2) · scripts/check-init-service-contract.mjs · scripts/check-published-list-mirrors.mjs · scripts/docs-audit/check-docs-transcript-drift.mjs · scripts/eslint-fatal-guard.mjs · scripts/pm/check-half-states.mjs (2) · scripts/pm/dispatch-gates.mjs

Path-shaped placeholders rewritten to the angle-bracket words ANCHOR_GRAMMAR already uses for exactly this reason — an illustration written as a real-looking path is read by a resolver as an anchor into a file the tree does not have: scripts/symbol-anchors.mjs, scripts/check-platform-checklist.mjs, scripts/check-published-readme-links.mjs, scripts/check-turbo-task-graph.mjs.

4. Held — the follow-up the PM files

⛔ Not touched. Each carries a dated allowance row naming the PR that lifts it. The row is not an exemption: the finding is still produced, still printed (), still counted — it just does not fail the build while a reviewed PR is open on that file.

file citation held by why also non-trivial
scripts/check-react-page-adapter-contract.mjs packages/client/src/index.ts:310 PR #15770 (#15599) its own paragraph declares every number in it a DATED ROT RECORD that must not be repaired — the repair is to name the file and keep the numbers as data
scripts/check-adr-0087-registration.mjs path/to/file.ts#Symbol placeholder PR #15724 (#15627) one line, but the file is a governed draft awaiting a human merge

The row is exact in both directions and the self-test holds it there — a stale row reds until it is deleted. Demonstrated against the live tree, not only against a fixture (leg 3 below).

5. Verification

Exit codes captured before any pipe. Verdict lines quoted as the gate printed them.

The corpus, before → after. docs/adr/** is byte-identical, which is the point — the core gained options that default to today's behaviour:

✅ check-adr-symbol-anchors: 1925 anchors across 135 records resolve — 189 symbol (170 declaration, 19 literal), 1721 file-level, 15 cross-repo, 6 exempt, 2 continuation. 0 line anchors survive.
✅ check-adr-symbol-anchors --self-test: every finding class provoked, healthy anchors silent, population live, wiring pinned (1925 live anchors)
✅ symbol-anchors --self-test: grammar, both resolution classes, comment/substring rejection, every ⛔ line-number spelling, exemption scoping and corpus registration verified

The new corpus's own line:

✅ check-scripts-symbol-anchors: 2694 anchors across 217 scripts resolve — 21 symbol (21 declaration, 0 literal), 2672 file-level, 0 cross-repo, 1 exempt, 2 continuation. 0 line anchors on tracked targets survive (99 citations name no tracked file and are not judged; 2 dated allowance finding(s)).
✅ check-scripts-symbol-anchors --self-test: every finding class provoked, comment-prose projection wired, declined shapes counted not missed, allowance rows exact both ways, population live (2694 live anchors)

21 symbol anchors, up from 9 on the base — the 12 the migration added are checked from now on.

Ablation — every leg proved on disk before it was believed, restored by git checkout HEAD -- ABSPATH and verified by blob hash and an empty git diff HEAD, never by an exit code. trap … EXIT INT TERM throughout.

Leg 1 — the card's claim, reproduced. Plant scripts/eslint-stack-headroom.mjs:212 back into a migrated header (ON-DISK PROOF: planted-form count=1 migrated-form count=0):

[the ONLY corpus before this PR] check-adr-symbol-anchors exit=0
  ✅ check-adr-symbol-anchors: 1925 anchors … 0 line anchors survive.
  mentions the planted citation? 0        <- NEITHER RESOLVED NOR REFUSED
[the new corpus] check-scripts-symbol-anchors exit=1
  ❌ check-scripts-symbol-anchors: 1 finding(s) across 217 scripts.
  [line-anchor] scripts/eslint-fatal-guard.mjs:147  scripts/eslint-stack-headroom.mjs:212
      a line number is not an anchor form — cite the symbol … or drop to a file-level anchor
RESTORED-OK scripts/eslint-fatal-guard.mjs  blob=4dbd3f0b9de792bb24fd38aa7d27b528b5b06bc5  (git diff HEAD empty)
[restored] exit=0  ✅ … 0 line anchors on tracked targets survive

Leg 2 — the projection is load-bearing. Delete docProjection: commentProse (ON-DISK PROOF: remaining=0) → exit 1, 39 findings fabricated out of gates' own string fixtures, e.g. check-init-service-contract.mjs:119 and :797 both citing the same fixture. Restored → green.

Leg 3 — the allowance row is exact. Migrate the citation the held row names → the sweep goes green with 1 allowance finding instead of 2, and the self-test reds:

❌ check-scripts-symbol-anchors --self-test: the allowance for `scripts/check-react-page-adapter-contract.mjs` is STALE — that file carries no judged finding any more. Delete the row; it has been lifted.
RESTORED-OK scripts/check-react-page-adapter-contract.mjs blob=469cf6f2df02723e93c0557276c990be30507042 (git diff HEAD empty)

Comment-only, proved mechanically. Running each gate before/after across two checkouts was tried and is confounded three ways — some gates echo the tree path, this PR adds a file that file-counting gates count, and a gate with absent deps prints its own absolute path. The sound instrument is the projection: stripComments both revisions, drop whitespace-only lines, compare. 16 of the 18 .mjs files this branch edits are CODE IDENTICAL (same sha256 of the executable text, different prose). The two that are not are declared:

  • scripts/symbol-anchors.mjs — the extractor change itself.
  • scripts/pm/dispatch-gates.mjs — its six citations are comment-only; the one executable change is the residue-ledger reason string, prose that happens to live in a string literal, updated to name both corpus registrations instead of one.

⚠️ maskComments is the wrong projection for this question and was tried first: it blanks to spaces to preserve offsets, so rewording a comment to a different length changes the space count and every file reads as "code moved". The bug was in the instrument.

Runtime corroboration, one worktree and one variable (run at HEAD, revert only the migrated files to the merge base, run again, restore — ON-DISK PROOF: 6 of 6 differ, RESTORED-OK: git diff HEAD empty):

IDENTICAL  exit 0/0  scripts/check-agent-test-spelling.mjs        plain + self
IDENTICAL  exit 0/0  scripts/check-platform-checklist.mjs         plain + self
IDENTICAL  exit 0/0  scripts/check-published-list-mirrors.mjs     plain + self
IDENTICAL  exit 0/0  scripts/check-turbo-task-graph.mjs           plain + self
IDENTICAL  exit 0/0  scripts/eslint-fatal-guard.mjs               plain + self
IDENTICAL  exit 3/3  scripts/docs-audit/check-docs-transcript-drift.mjs plain (self 0/0)

Wiring. check-self-test-wiredevery one of the 174 script(s) CI runs that ship a --self-test has that self-test run by CI — and check-step-collectors405 run: steps across 31 workflow(s); 4 step(s) run 2+ independent self-tests, all of them through a collector — both green with the new gate's collector entry and its separate production sweep. The sweep is a separate step deliberately: a production run inside the collector block re-invokes the stub that harness plants and the count comes out 4/3.

Other gates, dispatch-gates --changed --commands --repo objectstack-ai/objectstack (exit 0, 73 commands): see the comment below for the full run table.

Changeset: none, skip-changeset. AGENTS.md, verbatim: "A bug fix in a released package takes a patch changeset — never none, and ⛔ never skip-changeset: that label is for a diff that publishes nothing from any released package." This diff is scripts/**, .github/workflows/lint.yml and one script entry in the private root package.json ("private": true). Nothing publishes.

pnpm check:nul-bytesOK (scanned 7626 text file(s) … no raw ASCII control bytes); and an independent sweep of the diff for non-NUL control bytes, grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', exit 1 (no matches).

check-governed-merges --test on the final file list: ✅ NOT governed0 of 29 path(s) hit the register (5 surfaces, repo-agnostic).

6. Follow-ups this leaves, stated rather than dropped

  1. The two held files above, once docs(devx): check-react-page-adapter-contract names its class by shape, not by the records spelling, and re-anchors its citation (#15599) #15770 and feat(devx): accept a dotted member path in ADR-0087 type-surface-only references #15724 land — each is one comment-only edit plus deleting its allowance row.
  2. The 96 unjudged citations (66 bare filenames, 22 continuations, 11 illustrations, 1 tilde). A real defect class, deliberately outside this card, recorded the same way docs/adr/** recorded its 1,056 bare paths.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

… tracked-target line-citation scope

The extractor already reads comment prose exactly as it reads an ADR
paragraph; what it also reads is the CODE around it, so a raw `.mjs`
corpus judges a gate's own self-test fixtures. `commentProse` projects a
JavaScript-shaped source down to its comment characters through the
shared `js-comment-mask` scanner, blanking rather than deleting so line
numbers survive.

`defineCorpus` grows two options, both defaulting to today's behaviour:
`docProjection` (refused loudly when present but not callable) and
`judgeUntrackedLineAnchors`, the same scope call `checkBarePaths` makes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…e free citations

Second `defineCorpus` registration over `scripts/**` `.mjs` comment prose,
so a cross-file `path:NNN` naming a tracked file is REFUSED under the
existing ANCHOR_GRAMMAR and symbol/file-level anchors resolve. 31 of the
32 judged citations are migrated; two files another lane's live PR holds
carry a dated allowance row that the self-test forces to be deleted the
day the citation goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 5, 2026
@github-actions github-actions Bot added size/l ci/cd dependencies Pull requests that update a dependency file labels Sep 5, 2026
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json fc20f7bda4e7ac984a9935a4af4857c2a23dd1e7packageMentionDocs.

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Gate family run — node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack, exit 0

Derived at cb8737723 against merge base fa8575996 of origin/main — 21 paths, 73 commands. Exit codes captured before any pipe; every line below is the verdict line the gate itself printed.

⚠️ Three instrument notes, because each bit once here and a reader should not have to rediscover them:

  • An earlier pass of this table matched output files by a loose slug and reported 68 verdicts over a sweep that had only run 19 commands — it was silently reading another command's output. The table below maps each command to its own file by an exact spelling and reports anything unmatched as not-run rather than borrowing.
  • pnpm check:pm-dispatch-gates first came back ELIFECYCLE after 1,370 consecutive lines and no failure text. That was this sweep's own 240s cap, not a verdict — the shape MODULE_NOT_FOUND/cap-kill shares with a red. Re-run uncapped on its own PID it reaches ✓ dispatch-gates self-test: 1478 cases pass.
  • yaml, typescript and github-slugger were fetched at their lockfile-pinned versions into this worktree's node_modules so the gates that declare them could actually run. Without that, ten more families would have read PREREQUISITE NOT MET and been reported unmeasured — which is honest but weaker, and check-step-collectors in particular drives the very lint.yml collector block this PR edits.

MEASURED here: 63 · ⊘ NOT MEASURED in this box: 10 · not run here: 0

Reached a verdict

  • node packages/lint/scripts/check-reference-carrier-shape.mjs
    • check-reference-carrier-shape: OK — 5982 file(s) scanned, 583 reference site(s).
  • node packages/lint/scripts/check-reference-carrier-shape.mjs --self-test
    • ✅ self-test: flags an object / array / numeric carrier at a field-def position in all
  • node scripts/check-aggregator-roster.mjs
    • ✓ check-aggregator-roster: 3 aggregator(s) across 2 workflow(s); roster == needs: in both directions, and all 3 required-context aggregate(s) dec
  • node scripts/check-aggregator-roster.mjs --self-test
    • ✓ check-aggregator-roster --self-test: 45 assertions (baseline + a dropped member and a phantom needs: entry for each of the 3 required aggregato
  • node scripts/check-ci-filter-parity.mjs
    • OK: all 149 declared cross-package glob(s) (102 unique) are covered by core or crosspkg, every crosspkg entry still covers one, and the `te
  • node scripts/check-closing-keyword-parity.mjs
    • check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar acro
  • node scripts/check-closing-keyword-parity.mjs --self-test
    • ✓ check-closing-keyword-parity --self-test: 24 assertions, 5 mutations of the shipped parsers each driven to red.
  • node scripts/check-declaration-mirrors.mjs
    • OK: 4 hand-written declaration(s) agree with their modules on name, kind and required arity.
  • node scripts/check-declaration-mirrors.mjs --self-test
    • (no verdict line)
  • node scripts/check-merged-branch-reaper-outcome.mjs
    • check-merged-branch-reaper-outcome: OK (72 assertions over 11 scenarios, driving the 9847-char classifier extracted from .github/workflows/merged
  • node scripts/check-merged-branch-reaper-outcome.mjs --self-test
    • ✓ check-merged-branch-reaper-outcome --self-test: 92 assertions, 14 mutations of the shipped script each driven to red.
  • node scripts/check-position-name-fold-loaders.mjs
    • ✓ check-position-name-fold-loaders: packages/metadata/src/fixtures/hotcrm-17.1-built-permissions.artifact.json
  • node scripts/check-position-name-fold-loaders.mjs --self-test
    • check-position-name-fold-loaders --self-test
  • node scripts/check-published-list-mirrors.mjs
    • OK: 1 published list mirror(s) match their constants line for line.
  • node scripts/check-published-list-mirrors.mjs --self-test
    • (no verdict line)
  • node scripts/check-scripts-symbol-anchors.mjs
    • ✅ check-scripts-symbol-anchors: 2694 anchors across 217 scripts resolve — 21 symbol (21 declaration, 0 literal), 2672 file-level, 0 cross-repo, 1
  • node scripts/check-scripts-symbol-anchors.mjs --self-test
    • ✅ check-scripts-symbol-anchors --self-test: every finding class provoked, comment-prose projection wired, declined shapes counted not missed, all
  • node scripts/check-self-test-wired.mjs
    • ✓ check-self-test-wired: every one of the 174 script(s) CI runs that ship a --self-test has that self-test run by CI.
  • node scripts/check-self-test-wired.mjs --self-test
    • check-self-test-wired --self-test: 4 live ledger row(s) verified, plus the comment mask, the right boundary, alias resolution and both audit dire
  • node scripts/check-self-test-workflow-commands.mjs
    • ✓ check-self-test-workflow-commands: no self-test CI runs prints a line the Actions runner would parse as a workflow command.
  • node scripts/check-self-test-workflow-commands.mjs --self-test
    • check-self-test-workflow-commands --self-test: both measured parse rules pinned (legacy form anywhere in a line, current form only at line start)
  • node scripts/check-step-collectors.mjs
    • ✓ check-step-collectors: 405 run: steps across 31 workflow(s); 4 step(s) run 2+ independent self-tests, all of them through a collector.
  • node scripts/check-step-collectors.mjs --self-test
    • ✓ check-step-collectors --self-test: 151 assertions, 4 live block(s) driven under a real bash -e.
  • node scripts/check-tenant-audit-census.mjs
    • ✓ check-tenant-audit-census: OK -- 219 write call sites certified (147 decidable; 9 tenancy-enabled sites PROVABLY carry no tenant context, 32 mo
  • node scripts/check-tenant-audit-census.mjs --self-test
    • ✓ tenant-audit-census self-test: 18 cases pass (an as const context, an elevated SPREAD, an unresolvable spread refusing to answer false, an
  • node scripts/check-whole-set-label-write.mjs
    • ✓ check-whole-set-label-write: 0 violations — 270 file(s) over 3 root(s) · 11 raw mention(s) · 11 in comments/prose (cleared) · 0 in EXECUTABLE c
  • node scripts/check-whole-set-label-write.mjs --self-test
    • ✓ check-whole-set-label-write --self-test: all cases pass (24 fixture trees + 5 refusals + 1 allowlist hatch)
  • node scripts/docs-audit/check-affected-docs.mjs
    • ✓ affected-docs self-test: 582 cases pass.
  • node scripts/docs-audit/check-drift-comment.mjs
    • ✓ check-drift-comment: 56 cases pass across 5 fixture diff(s).
  • node scripts/pm/bare-root-worklist.mjs --self-test
    • OK self-test: 78 live row(s), 57 unreachable as spelled, 46 recorded verdict(s) — none stale, none missing, none contradicted (12 row(s) whose g
  • node scripts/pm/ci-failure.mjs --self-test
    • OK self-test: supersession keeps the newest per name and reports the drops; the four measured
  • node scripts/symbol-anchors.mjs --self-test
    • ✅ symbol-anchors --self-test: grammar, both resolution classes, comment/substring rejection, every ⛔ line-number spelling, exemption scoping and
  • pnpm check:agent-test-spelling
    • ✓ check-agent-test-spelling --self-test: all cases pass
  • pnpm check:bash32-floor
    • check-bash32-floor --self-test
  • pnpm check:cli-command-ids
    • ✓ check-cli-command-ids self-test: 39 cases pass (the id derivation covers files, topic indexes and bare topic dirs and drops test sidecars; a kn
  • pnpm check:cli-examples-parity
    • ✓ check-cli-examples-parity self-test: 49 cases pass (normalisation of prompts, comments and alignment; the string-literal examples reader and it
  • pnpm check:cross-package-test-inputs
    • OK: 27 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.
  • pnpm check:declared-population-live
    • check-declared-population-live --self-test: 16 assertion(s) passed.
  • pnpm check:doc-anchors
    • ✅ check-doc-anchors --self-test: slug parity, custom ids, duplicate counters, extraction discrimination and both finding classes verified (307 li
  • pnpm check:driver-memory-census
    • OK self-test: classifies every module-binding form (import / export-from / dynamic import / import-type / require / vi.mock) as a DECLARATION an
  • pnpm check:entry-guard
    • ✓ check-entry-guard self-test: 54 cases pass — all 11 measured spellings rejected (the template-interpolation one included), canonical form and m
  • pnpm check:init-service-contract
    • ✓ self-test: 19 cases
  • pnpm check:merge-driver
    • ✓ .gitattributes ↔ regen-artifacts.mjs agree on 18 path(s)
  • pnpm check:node-version
    • check-node-version: OK (36 setup-node step(s) across 31 workflow(s), all on Node 22).
  • pnpm check:nul-bytes
    • ✓ check-nul-bytes --self-test: 75 assertions over a temp git repo (real scan() path)
  • pnpm check:org-identifier
    • ✓ check-org-identifier self-test: 31 cases pass.
  • pnpm check:overlay-whitelist-table
    • ✓ check-overlay-whitelist-table self-test: positive control reproduces the 4 known divergences (leg 1: flow, permission, position; leg 2: transla
  • pnpm check:parse-guard
    • ✓ check:parse-guard self-test: 46 cases pass (every spelling of all three parser entry points is caught, their checked replacements are not, pros
  • pnpm check:pm-dispatch-gates
    • ✓ dispatch-gates self-test: 1478 cases pass.
  • pnpm check:pnpm-acquisition
    • check-pnpm-acquisition --self-test: 12 cases pass (real fixture roots through the real scan()).
  • pnpm check:pnpm-filter-targets
    • ✓ pnpm-filter-targets --self-test: 54 assertions over 79 real workspace packages (match rule pinned against measured pnpm behaviour; preflight ob
  • pnpm check:published-readme-links
    • ✓ check:published-readme-links --self-test — extraction discrimination (fence, code span,
  • pnpm check:ratchet-remedy-authority
    • OK self-test: the lexer holds, messages are bounded, both offer word orders and path-named registries are reached, declaration registries are no
  • pnpm check:refd-timer-probe
    • ✓ check-refd-timer-probe self-test: 11 cases pass, negative controls included.
  • pnpm check:required-contexts
    • ✓ check-required-contexts --self-test: 153 assertions (rename ablations across both workflows + matrix/continue-on-error/trigger shapes + the sha
  • pnpm check:shard-attestation
  • pnpm check:stall-guard-budget
    • ✓ check-stall-guard-budget --self-test: 61 assertions over real fixture trees on disk (real run() path) -- both violation tiers driven red, the g
  • pnpm check:stall-guard-headroom
    • (no verdict line)
  • pnpm check:swallow-census-controls
  • pnpm check:turbo-task-graph
    • OK: check-turbo-task-graph --self-test — all cases passed.
  • pnpm check:type-check-coverage
    • ✓ check:type-check-coverage --self-test — 55 semantic case(s) + 75 observation case(s) + 45 re-measure case(s) + 28 built-closure case(s) + 19 au
  • pnpm check:watch-hint-literal
    • ✓ check-watch-hint-literal self-test: 57 cases pass -- 8 computed spellings rejected, the statement-scoped search proved against runtime and comm
  • pnpm check:workflow-status-functions
    • ✓ check-workflow-status-functions --self-test: 34 assertions over temp fixture roots (real scan() path)

⊘ NOT MEASURED in this box, by name — CI runs each

  • node scripts/check-comment-mask-corpus.mjs — deps/build absent in this box
  • node scripts/check-partof-closing-keyword.mjs — no PR context outside CI (wiring, not a verdict)
  • node scripts/check-required-contexts.mjs --verify-required-set — no GITHUB_TOKEN; exit 2 classifies the ENVIRONMENT, not the tree
  • pnpm check:docs-transcript-drift — deps/build absent in this box
  • pnpm check:dual-build-cjs-loads — deps/build absent in this box
  • pnpm check:partof-closing-keyword — no PR context outside CI (wiring, not a verdict)
  • pnpm check:pm-half-states — deps/build absent in this box
  • pnpm check:query-options-erasure — deps/build absent in this box
  • pnpm check:slot-lookup — deps/build absent in this box
  • pnpm check:type-check-debt — deps/build absent in this box

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — PR #15806 (head cb8737723, 21 files, +683/−53; Part of #15765) reviewed against the GitHub three-dot diff, not the report.

Measure-first answered the card's unpriced step the other way round: the extractor reads //, /* */ and docblock prose cleanly — its defect is that it ALSO reads code, so a raw .mjs corpus would judge each gate's own string fixtures (251 raw vs 128 comment-prose citations). The one extractor change is a per-corpus doc projection (symbol-anchors.mjs#commentProse, routed through the shared js-comment-mask scanner, blanking so line numbers survive); check-scripts-symbol-anchors.mjs is a second defineCorpus registration in the ADR gate's thin shape, wired as check:scripts-symbol-anchors in root package.json and lint.yml. 31 of 32 judged citations migrated (12 into symbol anchors the gate resolves every run; the rest file-level with digits kept as data), two files under other PRs carry dated allowance rows exact in both directions (leg 3 reds the moment a held citation goes). Comment-only proof: 16 of 18 .mjs code-identical under stripComments; the two exceptions are the extractor and one residue-ledger reason STRING in dispatch-gates.mjs (read from the diff: the string now names both registrations — not a behaviour change).

Measured by this seat (detached probe of the branch, plain node): check-scripts-symbol-anchors → EXIT=0 ✅ … 2694 anchors across 217 scripts resolve — 21 symbol … 0 line anchors on tracked targets survive (99 citations name no tracked file and are not judged; 2 dated allowance finding(s)); its --self-test → EXIT=0; check-adr-symbol-anchors → EXIT=0, byte-identical to main's line (1925 anchors across 135 records … 0 line anchors survive); symbol-anchors --self-test → EXIT=0; git merge-tree --write-tree clean against origin/main, armed #15808 and #15796, and the other seats' #15392 / #15331; governed test per the report 0 of 21 … NOT governed. NOT MEASURED here: @typescript-eslint/parser / built-dist gates by name.

Serial note: scripts/pm/dispatch-gates.mjs is also #15761's live hot file (its dev was dispatched minutes after this one and the seat post did not yet list it) — this PR's change there is comment migration plus one string; #15761's dev is told to merge origin/main after this lands. measure-durability-swallow-family.mjs overlaps armed #15808 on disjoint comment lines (merge-tree clean).

Follow-up the card keeps open (Part of): the two held rows — check-react-page-adapter-contract.mjs (its holder #15770 has since LANDED; the paragraph declares its numbers a dated rot record, so the follow-up decides exemption vs migration) and check-adr-0087-registration.mjs (governed #15724). Dev-filed #15809 (96 line citations naming no tracked file) is triage's.

Flip + arm when both required jobs report success on cb8737723.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 5, 2026 09:04
@baozhoutao
baozhoutao enabled auto-merge September 5, 2026 09:04
@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Flipped ready + auto-merge enabled (09:04Z, method: MERGE). Required jobs on cb8737723: Lint & Repo Gates = success, TypeScript Type Check = success; git merge-tree --write-tree origin/main <branch> → EXIT=0 against the current main. Watched; on landing #15765 stays open (Part of) for the two held-file rows.


Generated by Claude Code

@baozhoutao
baozhoutao added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit b237592 Sep 5, 2026
41 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-15765-scripts-symbol-anchor-corpus branch September 5, 2026 09:52
baozhoutao pushed a commit that referenced this pull request Sep 5, 2026
…re its held allowance row (#15765)

The `scripts/**` symbol-anchor corpus (#15806) landed with two dated
`HELD_FILE_ALLOWANCES` rows for files live PRs held. PR #15770 landed, so the
row for `scripts/check-react-page-adapter-contract.mjs` is free — and an
allowance nobody retires is an exemption wearing a date.

The four dated readings in that gate's rot-record paragraph are now stated as
DATA — a small table with the file and the line number in separate cells —
never in `path:NNN` anchor form. The NUMBERS ARE NOT REPAIRED OR REPOINTED:
they are readings taken on a date, the paragraph's argument is unchanged, and
its ⛔ line still declares every number a record rather than a pointer. The one
substantive addition is that the paragraph no longer claims nothing resolves
citations in `scripts/**` — since #15806 something does, which is why the
anchor spelling had to go.

The self-test battery floor moves 34 → 30 because four of its cases are
registered PER allowance row; the reason is recorded next to the number so a
later reader cannot mistake the drop for cases that stopped running.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 6, 2026
…st carriers

`check-durability-degradation-log-level` (23), `symbol-anchors` (15),
`doc-line-anchors` (11) and `pr-labels` (8) carried more than half the
citations that name no tracked file, and each shape gets the repair its own
kind admits:

- DATED CENSUS ROWS name the file as a file-level anchor and keep the number
  beside it as data, losing no digit — the `#15806` method. The durability
  gate's two seam tables gain a `try line` column of their own, and `objectql
  engine.ts` / `metadata-protocol protocol.ts` become the full tracked paths
  the gate's own output actually prints. One of them binds tighter still:
  `packages/objectql/src/engine.ts#cascadeDeleteRelations` is now a resolved
  symbol anchor.
- ILLUSTRATIONS take the angle-bracket placeholder spelling `ANCHOR_GRAMMAR`
  already uses. `symbol-anchors.mjs` and `doc-line-anchors.mjs` are the two
  files that DEFINE what a line citation looks like, so every example in them
  was a citation of its own; they now exhibit the shape without writing one,
  and say why in a ⚠️ line so a later author does not "fix" it back.
- THIRD-PARTY SOURCES (`codelytv/pr-size-labeler`, `actions/labeler`) name the
  repo, the file and the pinned line as prose. No in-repo resolver could ever
  check them, and a pinned upstream line is provenance rather than a pointer.

⛔ No number is repaired or repointed anywhere in this commit: every digit that
was in an anchor is still on the page, as data.

Corpus reading: 96 → 39 unresolvable citations.

Part of #15809.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vbw3RPgdtqesx4azk9SbW8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd dependencies Pull requests that update a dependency file size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants