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: where-matcher-conformance.baseline.json still says "shape (b) is the sweep still owed" and "every entry here today" — its ledger is empty #9766
"Shape (a) is enforced with an EMPTY ledger; shape (b) is the sweep still owed."
With files: {} the last line is the load-bearing one: it tells a reader that a sweep is outstanding and that this file records what is left of it, when in fact both shapes are now enforced with an empty ledger. A reader reconciling the prose against the state gets the same mismatch #9649 records for the published-README baseline — a claim that was accurate when written and drifted silently as the ledger shrank.
⚠️ Deliberately not dated here: this checkout's git history is truncated (295 commits, beginning at 713ccbc95, 2026-08-16) and the ledger reads files: {} at every commit visible in it. Which PR removed the last entry needs the full history, and the answer may change whether this is "prose that drifted" or "prose that was never reconciled with the sweep that finished".
Why it may be worth a line rather than nothing
Two sibling ledgers already carry exactly the prose an empty shrink-only ledger needs, and they are the model:
durability-degradation.baseline.json — "CURRENTLY EMPTY — the intended steady state, not a dormant file", then five lines on why the entries left and what an entry would mean now.
The two facts a reader of an empty ledger needs, neither of which this file states: that empty is the success state, and that the file must not be deleted — check-where-matcher-conformance.mjs reads it at BASELINE_PATH, and its monotonicity() additionally reads the merge base's copy, so an absent file is not a clean run.
Found while landing #9649 — the same defect class one ledger over. The H3 sweep that card asked for read all twelve JSON ledgers under scripts/ and this is the only other one whose prose disagrees with its current contents. Not touched in that PR: it is scoped to one file's $comment by ruling.
Triage: grading = de-label — finding off; confirmed pm:queue · domain:devx · Task. $comment rewrite to the empty-ledger model prose (durability-degradation / startup-registry-verdict baselines are the models), stating that empty is the success state and the file must not be deleted. S-sized.
File surface I expect to touch: scripts/where-matcher-conformance.baseline.json (the $comment block only — no baseline entries, per ruling 1). Reads only on scripts/check-where-matcher-conformance.mjs and the sibling ledgers under scripts/ for the H4 sweep.
{
"issue": 9766,
"status": "done",
"branch": "claude/issue-9766-where-matcher-baseline-prose",
"pr": "https://github.com/objectstack-ai/objectstack/pull/9795",
"premise_still_valid": true,
"summary": "Rewrote the $comment of scripts/where-matcher-conformance.baseline.json to state the file's CONTRACT instead of its 2026-08-13 state; no baseline ENTRY added, removed or edited (files: {} is byte-identical in the diff). H1 (lead) — THE FILE MUST NOT BE DELETED, measured: the checker guards the load with existsSync(BASELINE_PATH) and, when absent, prints 'check-where-matcher-conformance: missing scripts/where-matcher-conformance.baseline.json' and exit(2) BEFORE the corpus scan — a hard refusal, and note exit 2 is distinct from the exit 1 a real finding takes. Second, weaker reason also now written down: monotonicity() reads the same path out of the merge base via 'git show BASE:PATH'; that read failing is caught and only degrades the run's last line to 'NOT verified: could not read the baseline at the merge base with main' (exit 0), so a delete-and-re-add silently costs the MONOTONIC invariant for that run. Both reasons were undocumented anywhere before this PR. H2 — the shape (a)/(b) vocabulary IS still live, not vestigial: the checker header carries 'Two failure shapes, one criterion' and the four-probe battery is designed around the pair ('Shape (a) fails the second probe, shape (b) fails the first'); judge() attributes a shape per matcher ('early-return (sibling keys discarded)' / 'no combinator branch (combinator read as a field name)'); the self-test pins both attributions by name. What is NOT in the format: the ledger's per-file silent/unjudged counts carry no shape distinction, so 'every entry here today is failure shape (b)' was a claim about the SEEDED SET, never about the schema. The rewrite keeps the vocabulary but as what an entry MAY be. It does not contradict #8662 (read first): a dedicated section says absence means GRADED AND CONFORMING, never 'unscanned' or 'extinct', and names the inverted survivor filter — dropped OUT_OF_SCOPE by the control probe, carrying the no-combinator-branch defect one negation away, pinned as FIXTURE_CAPTURED_NEGATED — as the known residual tracked there. H3 — the $comment is load-bearing to NOTHING: grep -F '$comment' over scripts/, .github/ and packages/qa/ returns exactly one hit and it is prose (a header line in check-engine-double-contract.mjs referring to its OWN baseline's $comment). No self-test asserts it, no doc generator quotes it; the loader reads baseline.files ?? {} and ignores every other key. It is documentation for humans and is now written that way. H4 — swept all twelve JSON ledgers under scripts/; this was the ONLY one with drifted prose, so the 'three more and it is a pattern' threshold for #9747 is NOT met. Detail in tests field. BONUS (answers the card's own open question, which it flagged as needing full history — this checkout is shallow at 300 commits): the GitHub commit API for this path gives exactly two commits. PR #8581 (2026-08-13) seeded it with the pre-existing combinator-blind doubles while fixing the five live shape-(a) instances rather than baselining them; PR #8618 (2026-08-14, the #8582 sweep, 75 files in three batches) ratcheted it to empty. So this is 'prose never reconciled with the sweep that finished' — the ledger emptied the DAY AFTER it was seeded — not 'prose that drifted slowly'. That provenance is now in the file.",
"tests": "Gate union re-run AFTER the final commit, on 6b1c82299 (clean worktree, 0 modified files). Gate list derived from the changed path, not recalled: 'node scripts/pm/dispatch-gates.mjs scripts/where-matcher-conformance.baseline.json' names check:where-matcher and check:cross-package-test-inputs; check:nul-bytes added because any edit owes it. (1) pnpm check:where-matcher -> exit 0: 'OK self-test: separates conjoining, early-returning, combinator-blind and refusing' + 'where-matcher conformance holds: 255 matcher(s) discovered, 255 answer the combinator battery correctly or refuse it loudly (152 refuse). / 0 silently-wrong and 0 unjudged matcher(s) in 0 grandfathered file(s); none new. / baseline key set verified against 11b779e: no files added.' (2) pnpm check:nul-bytes -> exit 0: 'self-test: 75 assertions over a temp git repo' + 'OK (scanned 6244 text file(s) ... no raw ASCII control bytes)'. Plus a manual byte scan of the edited file: grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' -> no hits. (3) pnpm check:cross-package-test-inputs -> exit 0: 'All 33 self-test cases passed. / OK: 12 package(s) read outside themselves, all declared'. H1 ABLATION (no rebuild applies — this gate reads source, not dist): moved the baseline aside, ran 'node scripts/check-where-matcher-conformance.mjs' -> stderr 'check-where-matcher-conformance: missing scripts/where-matcher-conformance.baseline.json', EXIT=2, no scan output at all. Direction predicted and observed: hard refusal, not a red finding and not a clean pass. Restored with 'git checkout HEAD -- <path>'; sha256sum -c OK and git status clean, so the ablation left no residue. Merge-base half verified at the atom: 'git show HEAD:scripts/no-such-baseline.json' exits 128, which is the throw monotonicity() catches to return null. RULING 1 PROOF: 'git diff -U0 <file> | grep -c \"files\"' over added/removed lines = 0 — the entries map is byte-identical; only $comment lines changed (61 insertions, 18 deletions). H4 SWEEP (all twelve ledgers under scripts/, each read and checked against its current contents): where-matcher-conformance = the only STALE one (this card). published-readme-exports (entries: []) already fixed by PR #9764. durability-degradation (entries: []) and startup-registry-verdict (entries: []) already carry correct empty-ledger prose — they are the models the card names. engine-double-contract (135 entries): its 'No entry below carries MEASURED (#8639) any more' claim VERIFIED true — 0 of 135 entries carry it; the 379->435 discovery numbers are explicitly historical. query-options-erasure (17 + 1): its 'nonTest keys ARE the ignores of query-options/no-any-erasure in eslint.config.mjs' claim VERIFIED true by construction — eslint.config.mjs line 318 readFileSync's this very JSON, so the coupling cannot drift (a literal path grep says 0/17 match and is the wrong test); its measurement is dated to branch point e900015cd. durability-read-invention (1 entry) and driver-memory-census (2 ruled + 10 + 5): provenance claims are dated/PR-attributed and coherent with contents. error-status-unpinned (34): carries a 'note' not a $comment; its '--update' instruction VERIFIED to exist in check-error-status-conformance.mjs. slot-lookup, role-word, i18n-coverage: carry NO prose at all — byproduct finding, filed as #9796. Conclusion for #9747: 1 stale, not 3 — the pattern threshold the card set is not met.",
"open_questions": [],
"out_of_scope_findings": [
"filed as #9796: three of the twelve scripts/ ledgers (slot-lookup-baseline.json, role-word-baseline.json, i18n-coverage-baseline.json) carry no contract prose and structurally cannot — every top-level key is a file path to their loaders, so a $comment key is reported by their own stale-entry arm ('baselined file is clean/gone') and their --update regenerators would drop it anyway; includes the adjacent asymmetry that an absent baseline is refused by where-matcher (exit 2) and published-readme, throws in slot-lookup, and is silently read as {} by role-word and i18n-coverage. Unassigned, labelled finding + domain:devx, no pm:queue. NOT fixed here (rule 3), and it names check-slot-lookup-ratchet.mjs which #9700 is working in — read-only, no edit."
]
}
Activity
os-support-ai commentedon Aug 18, 2026
Triage: grading = de-label —
findingoff; confirmedpm:queue·domain:devx· Task.$commentrewrite to the empty-ledger model prose (durability-degradation/startup-registry-verdictbaselines are the models), stating that empty is the success state and the file must not be deleted. S-sized.Generated by Claude Code
os-steve commentedon Aug 18, 2026
Claiming this card.
session_01XqDQYVU5smx29ts9pAErjaclaude/issue-9766-where-matcher-baseline-proseFile surface I expect to touch:
scripts/where-matcher-conformance.baseline.json(the$commentblock only — no baseline entries, per ruling 1). Reads only onscripts/check-where-matcher-conformance.mjsand the sibling ledgers underscripts/for the H4 sweep.Generated by Claude Code
claude commentedon Aug 19, 2026
{ "issue": 9766, "status": "done", "branch": "claude/issue-9766-where-matcher-baseline-prose", "pr": "https://github.com/objectstack-ai/objectstack/pull/9795", "premise_still_valid": true, "summary": "Rewrote the $comment of scripts/where-matcher-conformance.baseline.json to state the file's CONTRACT instead of its 2026-08-13 state; no baseline ENTRY added, removed or edited (files: {} is byte-identical in the diff). H1 (lead) — THE FILE MUST NOT BE DELETED, measured: the checker guards the load with existsSync(BASELINE_PATH) and, when absent, prints 'check-where-matcher-conformance: missing scripts/where-matcher-conformance.baseline.json' and exit(2) BEFORE the corpus scan — a hard refusal, and note exit 2 is distinct from the exit 1 a real finding takes. Second, weaker reason also now written down: monotonicity() reads the same path out of the merge base via 'git show BASE:PATH'; that read failing is caught and only degrades the run's last line to 'NOT verified: could not read the baseline at the merge base with main' (exit 0), so a delete-and-re-add silently costs the MONOTONIC invariant for that run. Both reasons were undocumented anywhere before this PR. H2 — the shape (a)/(b) vocabulary IS still live, not vestigial: the checker header carries 'Two failure shapes, one criterion' and the four-probe battery is designed around the pair ('Shape (a) fails the second probe, shape (b) fails the first'); judge() attributes a shape per matcher ('early-return (sibling keys discarded)' / 'no combinator branch (combinator read as a field name)'); the self-test pins both attributions by name. What is NOT in the format: the ledger's per-file silent/unjudged counts carry no shape distinction, so 'every entry here today is failure shape (b)' was a claim about the SEEDED SET, never about the schema. The rewrite keeps the vocabulary but as what an entry MAY be. It does not contradict #8662 (read first): a dedicated section says absence means GRADED AND CONFORMING, never 'unscanned' or 'extinct', and names the inverted survivor filter — dropped OUT_OF_SCOPE by the control probe, carrying the no-combinator-branch defect one negation away, pinned as FIXTURE_CAPTURED_NEGATED — as the known residual tracked there. H3 — the $comment is load-bearing to NOTHING: grep -F '$comment' over scripts/, .github/ and packages/qa/ returns exactly one hit and it is prose (a header line in check-engine-double-contract.mjs referring to its OWN baseline's $comment). No self-test asserts it, no doc generator quotes it; the loader reads baseline.files ?? {} and ignores every other key. It is documentation for humans and is now written that way. H4 — swept all twelve JSON ledgers under scripts/; this was the ONLY one with drifted prose, so the 'three more and it is a pattern' threshold for #9747 is NOT met. Detail in tests field. BONUS (answers the card's own open question, which it flagged as needing full history — this checkout is shallow at 300 commits): the GitHub commit API for this path gives exactly two commits. PR #8581 (2026-08-13) seeded it with the pre-existing combinator-blind doubles while fixing the five live shape-(a) instances rather than baselining them; PR #8618 (2026-08-14, the #8582 sweep, 75 files in three batches) ratcheted it to empty. So this is 'prose never reconciled with the sweep that finished' — the ledger emptied the DAY AFTER it was seeded — not 'prose that drifted slowly'. That provenance is now in the file.", "tests": "Gate union re-run AFTER the final commit, on 6b1c82299 (clean worktree, 0 modified files). Gate list derived from the changed path, not recalled: 'node scripts/pm/dispatch-gates.mjs scripts/where-matcher-conformance.baseline.json' names check:where-matcher and check:cross-package-test-inputs; check:nul-bytes added because any edit owes it. (1) pnpm check:where-matcher -> exit 0: 'OK self-test: separates conjoining, early-returning, combinator-blind and refusing' + 'where-matcher conformance holds: 255 matcher(s) discovered, 255 answer the combinator battery correctly or refuse it loudly (152 refuse). / 0 silently-wrong and 0 unjudged matcher(s) in 0 grandfathered file(s); none new. / baseline key set verified against 11b779e: no files added.' (2) pnpm check:nul-bytes -> exit 0: 'self-test: 75 assertions over a temp git repo' + 'OK (scanned 6244 text file(s) ... no raw ASCII control bytes)'. Plus a manual byte scan of the edited file: grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' -> no hits. (3) pnpm check:cross-package-test-inputs -> exit 0: 'All 33 self-test cases passed. / OK: 12 package(s) read outside themselves, all declared'. H1 ABLATION (no rebuild applies — this gate reads source, not dist): moved the baseline aside, ran 'node scripts/check-where-matcher-conformance.mjs' -> stderr 'check-where-matcher-conformance: missing scripts/where-matcher-conformance.baseline.json', EXIT=2, no scan output at all. Direction predicted and observed: hard refusal, not a red finding and not a clean pass. Restored with 'git checkout HEAD -- <path>'; sha256sum -c OK and git status clean, so the ablation left no residue. Merge-base half verified at the atom: 'git show HEAD:scripts/no-such-baseline.json' exits 128, which is the throw monotonicity() catches to return null. RULING 1 PROOF: 'git diff -U0 <file> | grep -c \"files\"' over added/removed lines = 0 — the entries map is byte-identical; only $comment lines changed (61 insertions, 18 deletions). H4 SWEEP (all twelve ledgers under scripts/, each read and checked against its current contents): where-matcher-conformance = the only STALE one (this card). published-readme-exports (entries: []) already fixed by PR #9764. durability-degradation (entries: []) and startup-registry-verdict (entries: []) already carry correct empty-ledger prose — they are the models the card names. engine-double-contract (135 entries): its 'No entry below carries MEASURED (#8639) any more' claim VERIFIED true — 0 of 135 entries carry it; the 379->435 discovery numbers are explicitly historical. query-options-erasure (17 + 1): its 'nonTest keys ARE the ignores of query-options/no-any-erasure in eslint.config.mjs' claim VERIFIED true by construction — eslint.config.mjs line 318 readFileSync's this very JSON, so the coupling cannot drift (a literal path grep says 0/17 match and is the wrong test); its measurement is dated to branch point e900015cd. durability-read-invention (1 entry) and driver-memory-census (2 ruled + 10 + 5): provenance claims are dated/PR-attributed and coherent with contents. error-status-unpinned (34): carries a 'note' not a $comment; its '--update' instruction VERIFIED to exist in check-error-status-conformance.mjs. slot-lookup, role-word, i18n-coverage: carry NO prose at all — byproduct finding, filed as #9796. Conclusion for #9747: 1 stale, not 3 — the pattern threshold the card set is not met.", "open_questions": [], "out_of_scope_findings": [ "filed as #9796: three of the twelve scripts/ ledgers (slot-lookup-baseline.json, role-word-baseline.json, i18n-coverage-baseline.json) carry no contract prose and structurally cannot — every top-level key is a file path to their loaders, so a $comment key is reported by their own stale-entry arm ('baselined file is clean/gone') and their --update regenerators would drop it anyway; includes the adjacent asymmetry that an absent baseline is refused by where-matcher (exit 2) and published-readme, throws in slot-lookup, and is silently read as {} by role-word and i18n-coverage. Unassigned, labelled finding + domain:devx, no pm:queue. NOT fixed here (rule 3), and it names check-slot-lookup-ratchet.mjs which #9700 is working in — read-only, no edit." ] }Generated by Claude Code