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
Found while implementing #7257 (PR #7374). Not claiming or fixing here — filing per Prime Directive #10. Unassigned: nobody is working on this.
Finding
packages/spec/liveness/README.md's "Current state" table states its own counting method in the paragraph directly above it:
The counting method for this table is the gate's own report — check-liveness.mts --json, types.<type>.byStatus — decided in #4488 after two methods spent a release disagreeing. […] the count columns are never hand-edited — regenerate: […]
Run that documented snippet on merged main (f188ed6) and 9 of the 30 rows disagree with it:
Type
README says (live / exp / dead / planned)
--json says
field
59 / 0 / 0 / 0
66 / 0 / 0 / 0
flow
34 / 0 / 5 / 0
34 / 0 / 6 / 0
action
34 / 0 / 2 / 0
41 / 0 / 2 / 0
hook
11 / 0 / 2 / 0
18 / 0 / 2 / 0
page
16 / 0 / 0 / 1
23 / 0 / 0 / 1
view
79 / 0 / 4 / 0
80 / 0 / 6 / 0
webhook
11 / 0 / 0 / 0
19 / 0 / 0 / 0
app
45 / 0 / 9 / 0
46 / 0 / 9 / 1
seed
5 / 0 / 0 / 0
12 / 0 / 0 / 0
The drift is mostly one-directional (the gate now counts more than the table records — seed 5 → 12, webhook 11 → 19, hook 11 → 18), which is what growth in the walked shape looks like when nobody re-ran the snippet. But view and flow also moved in the dead column, and app grew a planned the row does not show — those are verdict-shaped, not just arithmetic.
Why it is a card and not a sed
PR #7374 gates the row set against GOVERNED — a governed type with no row, an orphan row, or a heading count that disagrees now fails CI. It deliberately does not check the count columns, and this issue is the reason that boundary was drawn rather than the two being landed together:
The Notes cells enumerate their own dead sets by hand.view's cell says "level-2 dead residue (userActions.buttons, addRecord.mode/formView, tabs[].order)"; flow's says "dead count = 4 tombstone entries + the kept docs field" and then names them; app's reconciles 9 dead against seven retiredKey tombstones plus two named keys. Regenerating the numbers without re-reading each Note would leave the count column and the prose beside it contradicting each other — a row that says dead 6 next to a sentence enumerating four. That is a worse state than the current one, because the prose is the part a reader believes.
So each drifted row needs its delta explained, not just applied: which keys entered the walked shape, and whether the Note that describes the row's composition is still true. webhook 11 → 19 and seed 5 → 12 are large enough that something structural moved (a container began drilling, or a schema grew a block), and that is worth knowing rather than absorbing.
Regenerate the 9 rows, and for each one read the Note beside it and reconcile the prose with the new numbers — this is the work, and it is per-row evidence review, not bookkeeping.
Step 2 is cheap once step 1 is done; doing it first would just make CI red with no path to green.
Dedup
Searched the three repos before filing. #7257 covers the row set and the heading's completeness claim, and PR #7374 explicitly scopes the count columns out. No open issue or PR names the count drift.
Found while implementing #7257 (PR #7374). Not claiming or fixing here — filing per Prime Directive #10. Unassigned: nobody is working on this.
Finding
packages/spec/liveness/README.md's "Current state" table states its own counting method in the paragraph directly above it:Run that documented snippet on merged
main(f188ed6) and 9 of the 30 rows disagree with it:--jsonsaysfieldflowactionhookpageviewwebhookappseedThe drift is mostly one-directional (the gate now counts more than the table records —
seed5 → 12,webhook11 → 19,hook11 → 18), which is what growth in the walked shape looks like when nobody re-ran the snippet. Butviewandflowalso moved in thedeadcolumn, andappgrew aplannedthe row does not show — those are verdict-shaped, not just arithmetic.Why it is a card and not a
sedPR #7374 gates the row set against
GOVERNED— a governed type with no row, an orphan row, or a heading count that disagrees now fails CI. It deliberately does not check the count columns, and this issue is the reason that boundary was drawn rather than the two being landed together:view's cell says "level-2 dead residue (userActions.buttons, addRecord.mode/formView, tabs[].order)";flow's says "dead count = 4 tombstone entries + the kept docs field" and then names them;app's reconciles 9 dead against sevenretiredKeytombstones plus two named keys. Regenerating the numbers without re-reading each Note would leave the count column and the prose beside it contradicting each other — a row that saysdead 6next to a sentence enumerating four. That is a worse state than the current one, because the prose is the part a reader believes.webhook11 → 19 andseed5 → 12 are large enough that something structural moved (a container began drilling, or a schema grew a block), and that is worth knowing rather than absorbing.api/capability— the table silently fell behind its own registry #7257's own argument and withcheck:strictness-ledger's history (strictness 台账「数字/散文分家」:计数与表头转生成物走 os-regen,Class 判定与依据保持手写 —— 终结「干净合并两边都错」(单日 7 例) #5107 moved that ledger's numbers into a generated artifact precisely because hand-maintained counts merge clean and wrong). But strictness 台账「数字/散文分家」:计数与表头转生成物走 os-regen,Class 判定与依据保持手写 —— 终结「干净合并两边都错」(单日 7 例) #5107 is also the warning: it found the numbers were the file's entire merge-conflict surface. Whether these counts should be checked in place or generated into an artifact carryingmerge=os-regenis a design call this card should make, not assume.Suggested shape (not a ruling)
readme-table.mts(added in PR feat(spec): gate the liveness README's state table against GOVERNED (#7257) #7374, already parsing every row) to compare the count cells againsttypes.<type>.byStatus, or move the columns into a generated artifact per strictness 台账「数字/散文分家」:计数与表头转生成物走 os-regen,Class 判定与依据保持手写 —— 终结「干净合并两边都错」(单日 7 例) #5107's precedent.Step 2 is cheap once step 1 is done; doing it first would just make CI red with no path to green.
Dedup
Searched the three repos before filing. #7257 covers the row set and the heading's completeness claim, and PR #7374 explicitly scopes the count columns out. No open issue or PR names the count drift.