Repository navigation
Nothing in the stable column changed meaning, so nothing a CI gate binds to moves.
The census names a shared flag set
When four or more recorded paths in a --recorded-surfaces batch enumerate one identical flag set, the JSON report carries recordedSurfaces.sharedEnumeration as { paths, flags }, two numbers, and the text census prints one line under the readings:
5 of 5 recorded paths enumerate the same 3 flags; if each flag belongs to one verb, up to 15 flag/path pairs are accepted where they do not belong — a declaration says which; acc show how-to-derive-your-surface-from-one-registry
With --declaration supplied the line ends instead with the census below counts the ones that do not, as accepted-not-declared, and the pairs that do not belong are among the accepted-not-declared findings beneath it.
What the field means, for a parser:
paths × flagsis an upper bound, not a finding; only a declaration says which verb owns a flag.- When several groups of paths share different sets, the field reports the group with the largest
paths × flags. A tie goes to the group whose records come first in the batch file. - Below four paths the field is absent, not zero. A path whose unknown-flag rejection named an empty accepted set does not count toward it.
Four census fields are promised
declaration.formatVersion, declaration.status, declaration.checkedCommands and declaration.findings[].{kind,path,subject} join the README's stable column. Renaming one, changing a value of status, or withdrawing a finding kind is now a breaking change. A CI ratchet may bind to them by name:
statusis"checked"when at least one path was compared and"not-checked"when none was. The root counts even when the declaration does not name it, so"checked"withcheckedCommandsof0is a legal state.checkedCommandsis the number of declared command paths that were compared. Compared paths the declaration does not name are counted incheckedUndeclared, which is not promised.- each finding carries
kind, today one ofdeclared-not-accepted,accepted-not-declared,refused-but-enumerated,self-description-not-declared;path, the command path as an array,[]for the root; andsubject, the flag or verb. Withdrawing a kind is a break; adding one is an append within the major, so tolerate a kind you do not know.
The exit code still does not move on the declaration diff. A ratchet reads status == "checked" and an empty findings.
The README's advice for JSON consumers now reads: pin a tag or a commit SHA and accept unknown keys, since fields are added within a major.
Decided, not built
Three asks were decided without code:
- A
--fail-on-disagreementflag, or any exit code that moves on the declaration diff, is not built; it waits for a second adopter to ask. - An alias field in the declaration is not built. List both spellings of a flag in the accepted set your unknown-flag rejection names, and declare both as rows.
- A closed-set comparison is not built. The declaration parser accepts
valueson a flag and nothing compares it; on a positional it is refused as an unknown key.