Skip to content

0.1.15 — the census names the shared flag set, and its fields are promised

Latest

Choose a tag to compare

@github-actions github-actions released this 09 Sep 06:56
6edc89d

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 × flags is 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:

  • status is "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" with checkedCommands of 0 is a legal state.
  • checkedCommands is the number of declared command paths that were compared. Compared paths the declaration does not name are counted in checkedUndeclared, which is not promised.
  • each finding carries kind, today one of declared-not-accepted, accepted-not-declared, refused-but-enumerated, self-description-not-declared; path, the command path as an array, [] for the root; and subject, 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-disagreement flag, 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 values on a flag and nothing compares it; on a positional it is refused as an unknown key.

0.1.15 (2026-09-09)

Features

  • census: name the shared flag set a recorded batch shows, and promise the census fields a ratchet reads (e0bcc7e)
  • census: the census names the shape magpie had, as a bound with its condition (3facef1)