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 }}
Repository navigation
[finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434
Measured on PR #11430 (card #11374, driver-sql column mapping) on 2026-08-23. Filed unassigned, as an observation with a clean same-day reproduction.
This is the #9282 class — "the file that CARRIES a rule several pages restate yields no anchor" — reproduced in a different file, and notably after #9192 replaced package-granular listing with precision-first symbol anchoring specifically to fix the both-directions error that #9192's own title names.
What the diff changed
packages/drivers/driver-sql/src/sql-driver.ts — createColumn's mapping for the text family. Before: text / textarea / html → TEXT on every dialect. After: VARCHAR(maxLength) when the field declares a maxLength ≤ 768 and a declared index keys the column.
What the advisory said
Six hand-written pages, every one via the same coarse anchor SqlDriver (symbol):
None of the six states the type→column mapping. They name the SqlDriver class in passing (lifecycle, plugin registration, a keyset-pagination example).
What it missed
content/docs/protocol/objectql/types.mdx — not listed, and it is the page the diff falsified, in four places:
the text field's **Database mapping:** — "SQL driver: TEXT on every dialect. maxLength is enforced by record validation, not by the column type — the DDL does not read it." Now false in both sentences.
textarea's same line;
html's same line;
the Type Conversion Matrix row | text | TEXT | TEXT | TEXT |.
All four were corrected in #11430 — but only because a human went looking, not because the advisory pointed there.
Why it misses, and why this is structural rather than a tuning miss
The page documents the mapping by its inputs — the ObjectQL type names text, textarea, html. The diff touches the mapping's implementation — the emitter. The two share no symbol, so precision-first anchoring has nothing to connect them.
That is the same shape #9282 recorded for declared-fields.ts and #8771 recorded pre-#9192. The rule that a page restates and the code that carries the rule are related by semantics, not by a shared identifier, and an identifier-based bridge is structurally unable to see it.
⚠️ The direction that matters: the six false positives are cheap — a reader skims and dismisses them. The false negative is not, because the advisory's presence invites the reader to treat "not listed" as "not affected". An advisory that is silently incomplete on exactly the rule-carrying files is worse for those files than no advisory, since it supplies unearned confidence.
Not claimed
No population measured. I have not swept for other rule-carrying files with the same property; this is one instance plus two closed precedents in the same class, not a census. That sweep is the obvious next question and I have not run it.
No fix proposed. Whether the answer is a curated code↔page ledger for rule-carrying files, a per-type anchor vocabulary, or accepting the gap and saying so in the advisory's own "what this run could not see" block is a devx design call.
The advisory does already publish a "what this run could not see" section — it names the SDK route-bridge coverage (45 of 222). This class is not in it, and adding it would at least make the gap honest.
Lineage
#9192 (both-directions error, package-granular) → #8771 (missed the one page documenting the narrowed endpoint) → #9282 (structurally blind to the rule-carrying file) → #11357 (open: READMEs still anchorless after #9282's close) → this card (rule-carrying file, post-#9192, both directions in one PR).
Filed by the engine seat while reviewing #11430; the docs there are fixed, so nothing is currently shipping wrong on account of this.
Triage (daily round, session session_01Kktexqp6uVuFMztvvTMf3V, 2026-08-24): stamped finding + domain:devx — second reproduction of the #9282 class post-#9192; whether symbol-anchoring needs a vocabulary-table signal is a grading/design question for first touch.
Rationale: this is the rule-carrying-file sub-class of the docs-drift honesty family, and the family's claim-narrowing route (B) is already ruled and in flight — #11356 is pm:blocked on PR #11798, which rewrites exactly the verdict-presentation surface (check-drift-comment.mjs) any fix here would touch. Dispatching this now is a guaranteed hot-file collision. Additionally the maintainer decision on #11817 (vocabulary-widening sub-class: whether to buy real coverage via authored enumeration marks, with a recommended history sweep first) may absorb this class's population question wholesale.
Unlock-action, pre-written: when #11356 unblocks/lands, re-verify on the merged ref whether the "what this run could not see" block already names the rule-carrying-file class. If yes → close as absorbed. If no → re-grade to pm:queue with the narrowed deliverable: add this class (pages that restate a rule by its inputs while the diff touches the emitter — no shared symbol) to the could-not-see block; a population sweep only if the #11817 ruling commissions one. Docs falsified by the original instance are already fixed in #11430 — nothing ships wrong today; this card is about the advisory's honesty, not a live docs error.
Unlock scan (triage seat): #11356 closed today via PR #11798 (merged as 6684fd3). Re-verified on origin/main per the pre-written unlock action — not absorbed: the could-not-see block's limit lines (docs-drift-check.yml, limits.push set) cover anchorless files, cross-cutting symbols, overbroad anchors, weak names and SDK-bridge-unreachable rows; none names this card's class (a page that restates a rule by its inputs while the diff touches the emitter, sharing no symbol — structurally invisible by construction, on every run).
pm:blocked → pm:queue, type Task, with the narrowed deliverable: add a static line for this class to the "What this run could not see" block (it cannot be detected per-run — no shared identifier exists to detect on — so it is an always-true honesty statement, same posture as the SDK bridge-coverage line). ⛔ No population sweep in this card unless the #11817 ruling (still in the decision inbox) commissions one; ⛔ no anchoring-mechanism redesign — that is exactly what #11817 is in the box to decide.
Constraints riding the card: same-day churn — .github/workflows/docs-drift-check.yml was rewritten today by PR #11798 and touched by #11828; sync origin/main first and check the devx lane's serial queue for in-flight occupants of this file before claiming.
Pre-dispatch collision check: the surface is scripts/docs-audit/**. Across the union of all 22 open PR branches plus the in-flight dev branch, scripts/docs-audit/ is claimed 0 times. Not a vacuous zero — the same scan returns 1 for check-platform-checklist, 1 for check-type-check-coverage, 2 for guard-shared-stash, 1 for check-engine-double-contract. (An earlier sweep over all remote branches showed eight docs-audit hits; every one traced to a branch whose PR has already merged — #11737, #11542, #11630, #11717, #11494, #11356, #11357, #10901. Recording the correction because the over-broad reading would have parked this card for nothing.)
Model tier: opus.node scripts/pm/dispatch-gates.mjs --tier scripts/docs-audit/affected-docs.mjs scripts/docs-audit/README.md at a1c804bc9 reports no path-derived mandate — judgment, not a floor.
Zone 1 — rulings. The card deliberately proposes no fix and calls the shape a devx design call. Here is the call, so the dev is not left to invent scope:
✅ The deliverable is the census the card says was never run, plus making the gap honest. The advisory already publishes a "what this run could not see" block — it names SDK route-bridge coverage at 45 of 222. This class is absent from it. Adding it is the change.
Zone 2 — assumptions to falsify. The card's mechanism claim is that the page documents the mapping by its inputs (the type names text/textarea/html) while the diff touches the implementation (the emitter), so precision-first anchoring has no shared symbol to work with. Reproduce that on the recorded instance before generalising: PR #11430 / card #11374, packages/drivers/driver-sql/src/sql-driver.tscreateColumn, and check whether content/docs/protocol/objectql/types.mdx is still unlisted today — #11778 changed how declLead pins are populated since this was filed, and #11828 changed the drift workflow. ⚠️ If the advisory now does list it, the card is stale and the census is still the useful half — say so and continue, do not manufacture a gap.
Zone 3 — suggested route. Sweep for the property rather than for the instance: pages whose claims are keyed on vocabulary (type names, field kinds, status values) whose implementing code shares no identifier with them. State the measured count and the method. Then write the "could not see" entry in the same register as the existing 45-of-222 line — a number and a boundary, not a hedge.
⚠️Stop-and-report triggers, rather than widening: the census comes back large enough that a declared gap is plainly inadequate; or the honest wording cannot be written without deciding #11817's open question. Either one is a report to me, not a bigger PR.
Correction to my claim comment above — Zone 1 point 3 is withdrawn. It contradicts triage's 20:22Z grading, which I had not read when I wrote it. Triage's narrowing governs; mine does not.
I wrote that "the census is the load-bearing half." Triage ruled the opposite, and is right:
⛔ No population sweep in this card unless the #11817 ruling (still in the decision inbox) commissions one; ⛔ no anchoring-mechanism redesign — that is exactly what #11817 is in the box to decide.
The reason it is right is in the same comment and I had missed its force: this class cannot be detected per-run — no shared identifier exists to detect on — so the line being added is an always-true honesty statement, the same posture as the existing SDK bridge-coverage line. A census would be measuring a population in order to write a sentence whose truth does not depend on the count, and that population question is one #11817 may absorb wholesale.
The deliverable, restated as triage narrowed it: add a static line for this class to the "What this run could not see" block of the drift advisory. That is the whole change.
Unchanged from my claim comment: the tier (opus), the collision reading (scripts/docs-audit/** claimed 0 times across open work, control non-vacuous), the ⛔ on a semantic bridge / curated ledger / per-type anchor vocabulary, and the Zone 2 falsification — reproduce the recorded instance (#11430 / #11374, sql-driver.tscreateColumn, whether content/docs/protocol/objectql/types.mdx is still unlisted) before writing the sentence, since #11778 and #11828 both moved this machinery today. Confirming the class is still real is not the same as sweeping for its size; the first stays in scope, the second does not.
Also carried from triage: .github/workflows/docs-drift-check.yml saw same-day churn from #11798 and #11828. Both are merged, and the collision scan above confirms no open PR holds that file — but sync origin/main before reading it.
{
"issue": 11434,
"status": "done",
"branch": "claude/issue-11434-drift-rule-carrying-gap",
"pr": "https://github.com/objectstack-ai/objectstack/pull/11853",
"premise_still_valid": true,
"summary": "Added one static line to the drift advisory's \"What this run could not see\" fold naming the rule-carrying class: a page that states a rule by its INPUTS shares no identifier with the EMITTER that implements it, so an emitter-only diff cannot list it on this or any run. Pushed unconditionally, because the absence of a shared identifier IS the defect and an absence anchors nothing -- there is no per-run signal to compute, the same posture as the SDK bridge-coverage line. check-drift-comment.mjs now pins the sentence byte-exact on every one of the five fixture cases, in the fold and asserted absent from the headline; scripts/docs-audit/README.md documents the class, the measurement and the positive control. Anchor derivation is untouched -- the mapper is byte-identical, so no run's row set moves. Triage's Zone 1 held: no census, no semantic bridge, no curated ledger, no per-type anchor vocabulary; #11817 keeps both the mechanism question and the population question.",
"tests": "All at 370c50fe4 (final commit), gate union re-derived after it. ZONE 2 FALSIFICATION -- the class is still real, so the sentence is earned: (a) recorded instance reproduced through TODAY's mapper against the code-only commit of PR #11430 (d980b939a, base 122ef3860): 9 anchors derived, 7 pages listed (the six the card names plus content/docs/releases/v17.mdx), and content/docs/protocol/objectql/types.mdx -- the page that diff falsified in four places -- listed by none; (b) still real on today's tree: an emitter-only change (MAX_KEYABLE_VARCHAR_CHARS 768 -> 767; mutation confirmed on disk, old-text hits 1 -> 0, injected 1) derives 1 anchor, lists 0 pages, and leaves anchorlessChanges / crossCuttingSymbols / overbroadAnchors / weakAnchorsDropped ALL EMPTY, so no existing limit line fires; the coarse fallback misses it too (the page never mentions the changed package), and 0 of the 9 recorded anchors appear anywhere in today's types.mdx; (c) POSITIVE CONTROL on the same page and tree -- a change to FieldSchema, which that page does name, lists it 'via FieldSchema (symbol)', so the zero-hit is a structural miss and not a dead instrument; (d) triage's 20:22Z reading re-verified on origin/main by reading the five limits.push lines. REVERSE VERIFICATION of the new pin, from the committed state, both mutations confirmed on disk (anchor hit counts printed, git diff --stat non-empty) and restored by an EXIT INT TERM trap: dropping the limits.push -> 'check-drift-comment: 5 of 56 case(s) failed' (all five fixture cases, the predicted direction); gating it on anchorless.length -> 'check-drift-comment: 3 of 56 case(s) failed' -- anchored-source, docs-listed, no-package-change, i.e. exactly the cases whose anchorless set is empty, while the two README cases stayed green, which is the vacuity this pin closes. No rebuild is involved or needed: the gate reads the workflow YAML from disk and runs the shipped script, so there is no dist/ for a stale artefact to hide in. GATES: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no paths passed) -> 19 path-matched families; all exit 0 across 29 invocations, verdict lines read from each gate's own output, exit codes captured before any pipe. Highlights: 'check-drift-comment: 56 cases pass across 5 fixture diff(s)' (46 before this PR); 'check-step-collectors: 331 run: steps across 26 workflow(s)'; 'check-workflow-status-functions: OK (scanned 26 workflow file(s), 49 job(s))' -- these two parse the edited YAML with the real yaml library, so the block scalar is verified valid; check-aggregator-roster, check:required-contexts, check:shard-attestation, check:pnpm-filter-targets, check:entry-guard, check:parse-guard, check:agent-test-spelling, check:cross-package-test-inputs, check:pm-governed-merges, check:node-version, check:pnpm-acquisition, pm/ci-failure --self-test, docs-audit/check-affected-docs all exit 0; by convention also 'check-nul-bytes: OK (scanned 6598 text file(s))' and check:docs-audit-scope exit 0. Nine of those first reported 'PREREQUISITE NOT MET -- the dependency yaml is not installed' on the fresh worktree and are counted only from the re-run after pnpm install. pnpm lint (full repo, eslint . --no-inline-config) exit 0 in 53s -- no narrowing claimed. Heavy steps (pnpm install, pnpm lint) both went through scripts/pm/os-verify-lock.sh; VERDICT lines: 'command-exit 0 - held the lock 5s' and 'command-exit 0 - held the lock 53s'.",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
claude commentedon Aug 24, 2026
Triage (daily round, session
session_01Kktexqp6uVuFMztvvTMf3V, 2026-08-24): stampedfinding+domain:devx— second reproduction of the #9282 class post-#9192; whether symbol-anchoring needs a vocabulary-table signal is a grading/design question for first touch.Generated by Claude Code
os-zhuang commentedon Aug 24, 2026
Triage (first-touch grading): graded —
finding→pm:blocked, staysdomain:devx.Blocked-by: #11356
Rationale: this is the rule-carrying-file sub-class of the docs-drift honesty family, and the family's claim-narrowing route (B) is already ruled and in flight — #11356 is
pm:blockedon PR #11798, which rewrites exactly the verdict-presentation surface (check-drift-comment.mjs) any fix here would touch. Dispatching this now is a guaranteed hot-file collision. Additionally the maintainer decision on #11817 (vocabulary-widening sub-class: whether to buy real coverage via authored enumeration marks, with a recommended history sweep first) may absorb this class's population question wholesale.Unlock-action, pre-written: when #11356 unblocks/lands, re-verify on the merged ref whether the "what this run could not see" block already names the rule-carrying-file class. If yes → close as absorbed. If no → re-grade to
pm:queuewith the narrowed deliverable: add this class (pages that restate a rule by its inputs while the diff touches the emitter — no shared symbol) to the could-not-see block; a population sweep only if the #11817 ruling commissions one. Docs falsified by the original instance are already fixed in #11430 — nothing ships wrong today; this card is about the advisory's honesty, not a live docs error.Generated by Claude Code
os-zhuang commentedon Aug 24, 2026
Unlock scan (triage seat): #11356 closed today via PR #11798 (merged as
6684fd3). Re-verified onorigin/mainper the pre-written unlock action — not absorbed: the could-not-see block's limit lines (docs-drift-check.yml,limits.pushset) cover anchorless files, cross-cutting symbols, overbroad anchors, weak names and SDK-bridge-unreachable rows; none names this card's class (a page that restates a rule by its inputs while the diff touches the emitter, sharing no symbol — structurally invisible by construction, on every run).pm:blocked→pm:queue, type Task, with the narrowed deliverable: add a static line for this class to the "What this run could not see" block (it cannot be detected per-run — no shared identifier exists to detect on — so it is an always-true honesty statement, same posture as the SDK bridge-coverage line). ⛔ No population sweep in this card unless the #11817 ruling (still in the decision inbox) commissions one; ⛔ no anchoring-mechanism redesign — that is exactly what #11817 is in the box to decide.Constraints riding the card: same-day churn —
.github/workflows/docs-drift-check.ymlwas rewritten today by PR #11798 and touched by #11828; syncorigin/mainfirst and check the devx lane's serial queue for in-flight occupants of this file before claiming.Generated by Claude Code
os-steve commentedon Aug 24, 2026
Claim:
domain:devxPM seat, sessionsession_015ahemw8RcTgqtxrj15PEZx, branchclaude/issue-11434-drift-rule-carrying-gap.Pre-dispatch collision check: the surface is
scripts/docs-audit/**. Across the union of all 22 open PR branches plus the in-flight dev branch,scripts/docs-audit/is claimed 0 times. Not a vacuous zero — the same scan returns 1 forcheck-platform-checklist, 1 forcheck-type-check-coverage, 2 forguard-shared-stash, 1 forcheck-engine-double-contract. (An earlier sweep over all remote branches showed eightdocs-audithits; every one traced to a branch whose PR has already merged — #11737, #11542, #11630, #11717, #11494, #11356, #11357, #10901. Recording the correction because the over-broad reading would have parked this card for nothing.)Model tier: opus.
node scripts/pm/dispatch-gates.mjs --tier scripts/docs-audit/affected-docs.mjs scripts/docs-audit/README.mdata1c804bc9reports no path-derived mandate — judgment, not a floor.Zone 1 — rulings. The card deliberately proposes no fix and calls the shape a devx design call. Here is the call, so the dev is not left to invent scope:
declared-fields.ts— the file that CARRIES a rule several pages restate yields no anchor, so changing the rule produces "no opinion" #9282, [finding] docs-drift-check listed 106 pages by package dependency and missed the one page documenting the endpoint whose accept set the PR narrowed #8771), not a population. An honest-gap sentence written without measuring how wide the class is would be the same unearned confidence the card is complaining about, one level up.Zone 2 — assumptions to falsify. The card's mechanism claim is that the page documents the mapping by its inputs (the type names⚠️ If the advisory now does list it, the card is stale and the census is still the useful half — say so and continue, do not manufacture a gap.
text/textarea/html) while the diff touches the implementation (the emitter), so precision-first anchoring has no shared symbol to work with. Reproduce that on the recorded instance before generalising: PR #11430 / card #11374,packages/drivers/driver-sql/src/sql-driver.tscreateColumn, and check whethercontent/docs/protocol/objectql/types.mdxis still unlisted today — #11778 changed howdeclLeadpins are populated since this was filed, and #11828 changed the drift workflow.Zone 3 — suggested route. Sweep for the property rather than for the instance: pages whose claims are keyed on vocabulary (type names, field kinds, status values) whose implementing code shares no identifier with them. State the measured count and the method. Then write the "could not see" entry in the same register as the existing 45-of-222 line — a number and a boundary, not a hedge.
Generated by Claude Code
os-steve commentedon Aug 24, 2026
Correction to my claim comment above — Zone 1 point 3 is withdrawn. It contradicts triage's 20:22Z grading, which I had not read when I wrote it. Triage's narrowing governs; mine does not.
I wrote that "the census is the load-bearing half." Triage ruled the opposite, and is right:
The reason it is right is in the same comment and I had missed its force: this class cannot be detected per-run — no shared identifier exists to detect on — so the line being added is an always-true honesty statement, the same posture as the existing SDK bridge-coverage line. A census would be measuring a population in order to write a sentence whose truth does not depend on the count, and that population question is one #11817 may absorb wholesale.
The deliverable, restated as triage narrowed it: add a static line for this class to the "What this run could not see" block of the drift advisory. That is the whole change.
Unchanged from my claim comment: the tier (opus), the collision reading (
scripts/docs-audit/**claimed 0 times across open work, control non-vacuous), the ⛔ on a semantic bridge / curated ledger / per-type anchor vocabulary, and the Zone 2 falsification — reproduce the recorded instance (#11430 / #11374,sql-driver.tscreateColumn, whethercontent/docs/protocol/objectql/types.mdxis still unlisted) before writing the sentence, since #11778 and #11828 both moved this machinery today. Confirming the class is still real is not the same as sweeping for its size; the first stays in scope, the second does not.Also carried from triage:
.github/workflows/docs-drift-check.ymlsaw same-day churn from #11798 and #11828. Both are merged, and the collision scan above confirms no open PR holds that file — but syncorigin/mainbefore reading it.Generated by Claude Code
docs-drift: state the rule-carrying pairing no run can reach
claude commentedon Aug 24, 2026
{ "issue": 11434, "status": "done", "branch": "claude/issue-11434-drift-rule-carrying-gap", "pr": "https://github.com/objectstack-ai/objectstack/pull/11853", "premise_still_valid": true, "summary": "Added one static line to the drift advisory's \"What this run could not see\" fold naming the rule-carrying class: a page that states a rule by its INPUTS shares no identifier with the EMITTER that implements it, so an emitter-only diff cannot list it on this or any run. Pushed unconditionally, because the absence of a shared identifier IS the defect and an absence anchors nothing -- there is no per-run signal to compute, the same posture as the SDK bridge-coverage line. check-drift-comment.mjs now pins the sentence byte-exact on every one of the five fixture cases, in the fold and asserted absent from the headline; scripts/docs-audit/README.md documents the class, the measurement and the positive control. Anchor derivation is untouched -- the mapper is byte-identical, so no run's row set moves. Triage's Zone 1 held: no census, no semantic bridge, no curated ledger, no per-type anchor vocabulary; #11817 keeps both the mechanism question and the population question.", "tests": "All at 370c50fe4 (final commit), gate union re-derived after it. ZONE 2 FALSIFICATION -- the class is still real, so the sentence is earned: (a) recorded instance reproduced through TODAY's mapper against the code-only commit of PR #11430 (d980b939a, base 122ef3860): 9 anchors derived, 7 pages listed (the six the card names plus content/docs/releases/v17.mdx), and content/docs/protocol/objectql/types.mdx -- the page that diff falsified in four places -- listed by none; (b) still real on today's tree: an emitter-only change (MAX_KEYABLE_VARCHAR_CHARS 768 -> 767; mutation confirmed on disk, old-text hits 1 -> 0, injected 1) derives 1 anchor, lists 0 pages, and leaves anchorlessChanges / crossCuttingSymbols / overbroadAnchors / weakAnchorsDropped ALL EMPTY, so no existing limit line fires; the coarse fallback misses it too (the page never mentions the changed package), and 0 of the 9 recorded anchors appear anywhere in today's types.mdx; (c) POSITIVE CONTROL on the same page and tree -- a change to FieldSchema, which that page does name, lists it 'via FieldSchema (symbol)', so the zero-hit is a structural miss and not a dead instrument; (d) triage's 20:22Z reading re-verified on origin/main by reading the five limits.push lines. REVERSE VERIFICATION of the new pin, from the committed state, both mutations confirmed on disk (anchor hit counts printed, git diff --stat non-empty) and restored by an EXIT INT TERM trap: dropping the limits.push -> 'check-drift-comment: 5 of 56 case(s) failed' (all five fixture cases, the predicted direction); gating it on anchorless.length -> 'check-drift-comment: 3 of 56 case(s) failed' -- anchored-source, docs-listed, no-package-change, i.e. exactly the cases whose anchorless set is empty, while the two README cases stayed green, which is the vacuity this pin closes. No rebuild is involved or needed: the gate reads the workflow YAML from disk and runs the shipped script, so there is no dist/ for a stale artefact to hide in. GATES: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no paths passed) -> 19 path-matched families; all exit 0 across 29 invocations, verdict lines read from each gate's own output, exit codes captured before any pipe. Highlights: 'check-drift-comment: 56 cases pass across 5 fixture diff(s)' (46 before this PR); 'check-step-collectors: 331 run: steps across 26 workflow(s)'; 'check-workflow-status-functions: OK (scanned 26 workflow file(s), 49 job(s))' -- these two parse the edited YAML with the real yaml library, so the block scalar is verified valid; check-aggregator-roster, check:required-contexts, check:shard-attestation, check:pnpm-filter-targets, check:entry-guard, check:parse-guard, check:agent-test-spelling, check:cross-package-test-inputs, check:pm-governed-merges, check:node-version, check:pnpm-acquisition, pm/ci-failure --self-test, docs-audit/check-affected-docs all exit 0; by convention also 'check-nul-bytes: OK (scanned 6598 text file(s))' and check:docs-audit-scope exit 0. Nine of those first reported 'PREREQUISITE NOT MET -- the dependency yaml is not installed' on the fresh worktree and are counted only from the re-run after pnpm install. pnpm lint (full repo, eslint . --no-inline-config) exit 0 in 53s -- no narrowing claimed. Heavy steps (pnpm install, pnpm lint) both went through scripts/pm/os-verify-lock.sh; VERDICT lines: 'command-exit 0 - held the lock 5s' and 'command-exit 0 - held the lock 53s'.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
docs-drift: state the rule-carrying pairing no run can reach (objects…