Commit 1cc7895
committed
fix(qa): give every expression declaration its own ratchet key
The ADR-0058 D7 expression ledger keyed the ratchet as `file:field`, so two
different declarations of one field name in one file collapsed into a single
`Set` entry: one ledger row classified both, and the ratchet could not notice
it had never asked. 44 declaring positions reduced to 34 keys, with 10 keys
carrying two positions each.
Four of those collapses joined surfaces that are opposites, not near-duplicates
— most sharply `data/field.zod.ts:requiredWhen`, one key over the
server-enforced `FieldSchema` transition gate and the `InlineGridColumnSchema`
cell whose own describe says nothing on the write path reads it. A
declared-but-unwired predicate that says so in its own describe string was
invisible to the ledger built to surface exactly that class.
Discovery now yields one record per declaring POSITION and keys it
`file:Schema.field`, which separates all 44 today. That is a measurement, not a
guarantee — two same-named fields in different inline `z.object` blocks under
one top-level const would still collide — so the load-bearing half is a new
assertion that two positions sharing a key is a hard failure naming both
`file:line`s, rather than a silent merge. It holds for any naming scheme.
Every `covers` entry is re-pointed, and the four genuinely-different collapses
get honest rows: `cel-select-option-visible` (server-enforced on write via
rule-validator, with its proof), `cel-inline-grid-cell` (experimental — the
objectui evaluator is not in this checkout) and `cel-field-group-section`
(fail-closed, which is what separates it from `cel-ui`). Coverage does not
shrink: every position covered before is still covered, now by a row that can
tell the truth about it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D47qPfEWVPmhguWgBZCi5N1 parent c99449a commit 1cc7895
2 files changed
Lines changed: 213 additions & 70 deletions
0 commit comments