Skip to content

feat(spine): ship the ESTATE-BOARD and unblock JSON in the SPDX gate - #810

Merged
hyperpolymath merged 1 commit into
mainfrom
spine/estate-board-2026-09-15
Sep 15, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
spine/estate-board-2026-09-15

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Ships the ESTATE-BOARD — the read half of the propagation spine, and the closure
deliverable under owner ruling CICD-R-W1. Zero writes to any repo other than this one.

What the board answers

One page, one row per repo, for the question that started this campaign: which of 441 repos
are actually gated, actually reporting, and actually pinned to something that exists.
Every
cell carries its horizon and its measurement date.

Measured at origin/HEAD, whole population, every file parsed — not sampled:

repos on the board 441
workflow files 6,551
unsound workflow files 60
unpinned reusable refs 15 (canonicalised from 46 raw refs across 9 repos)
repos with no local checkout 8
residue ledger rows PENDING 69 = 60 unsound files + 9 unpinned-reusable repos

The soundness test is the two-limb one, never parseability: a workflow is healthy iff jobs is
a non-empty map and a trigger key is present. Parseability is not the test — a YAML file
whose jobs: has been swallowed into a multi-line name scalar parses perfectly and is
completely inert.

⚠ Behaviour change to a gate

This PR changes the behaviour of .githooks/validate-spdx.sh: it drops *.json from
is_source_file.
That is a deliberate behaviour change to a gate, made under owner ruling
CICD-R-W6, and it is called out here rather than buried in the diff.

The rule was unsatisfiable by construction. The test is

head -10 "$file" | grep -qE '^# SPDX-License-Identifier:'

and JSON has no # comment syntax, so no JSON file can ever satisfy it.

Control, measured on main: the two .machine_readable/*.json files already committed —
hypatia-baseline.schema.json and scorecard/scorecard.schema.json — carry zero SPDX
headers between them. The rule has never been satisfiable and has never been satisfied.
Removing *.json therefore restores truth rather than weakening a check, and it completes
the repair #804 began, one extension over: that was the staged-mode filter bug; this is the same
defect class in the extension allowlist itself.

Proven red-then-green, not asserted: the validator as it stands on main exits 1,
naming .machine_readable/estate-board.json; with *.json dropped it exits 0. That same
probe also proved the # SPDX-License-Identifier: MPL-2.0 headers added to board.sh,
board.awk and verify-board.sh were both necessary and sufficient.

The verifier, and the fixture that fired

scripts/spine/verify-board.sh is committed alongside the generator and was run:
16 assertions passed, 0 failed, exit 0.

It is not a set of inert assertions. Two things are worth naming:

  • Red-then-green fixture. A known-unsound workflow (ZZ-PLANTED-CONTROL.yml) and a known
    unpinned reusable ref are planted, and the board must classify both correctly and ledger
    them — and both must be absent from the real ledger. Both fired. This satisfies §11.8
    criteria 2 and 5 by measurement rather than by assertion.
  • Independent recount, two instruments. The JSON's own six totals are read with jq; the
    same six figures are recomputed from the TSV with awk. They agree
    (rows=441 wf=6551 unsound=60 unpinned=15 nocheckout=8). The jq-missing branch fails
    rather than skipping, so the JSON half of the verifier cannot pass vacuously.

verify-board.sh uses jq and awk only — no Python, consistent with the estate-wide ban
on tracked .py files. board.sh and verify-board.sh are committed 100755; a suite
committed 100644 passes every local run and dies in CI at exit 126 before one control runs.

Files

File Purpose
docs/ESTATE-BOARD.adoc the board you read
.machine_readable/estate-board.json the same data, machine-readable
.machine_readable/estate-board.tsv one row per repo, 15 columns
.machine_readable/estate-residue-ledger.tsv 69 PENDING rows — the number that goes to zero
scripts/spine/board.sh + board.awk the generator
scripts/spine/verify-board.sh the verifier, 16 assertions
.githooks/validate-spdx.sh the gate change described above

Merge honesty

main carries the Optimus-Branch ruleset with nine rule types, three of which no PR in this
backlog can satisfy
: code_coverage demands minimum_coverage: 95 on a shell/AsciiDoc repo,
required_deployments demands the copilot and github-pages environments, and the required
CodeQL context is emitted only by GitHub default code-scanning setup.
This PR will land by admin bypass, and that is stated as a bypass rather than reported as a
gate passed.

The commit is signed (%G? = G) and was made with no --no-verify — all nine
pre-commit validators passed on their merits.

🤖 Generated with Claude Code

https://claude.ai/code/session_014GEWfbxba7BJaTFRFhCGNF

@coderabbitai

coderabbitai Bot commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 47 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 169353c5-6761-4ff2-9089-3029c55e0313

📥 Commits

Reviewing files that changed from the base of the PR and between 84ae82d and 393b053.

⛔ Files ignored due to path filters (2)
  • .machine_readable/estate-board.tsv is excluded by !**/*.tsv
  • .machine_readable/estate-residue-ledger.tsv is excluded by !**/*.tsv
📒 Files selected for processing (6)
  • .githooks/validate-spdx.sh
  • .machine_readable/estate-board.json
  • docs/ESTATE-BOARD.adoc
  • scripts/spine/board.awk
  • scripts/spine/board.sh
  • scripts/spine/verify-board.sh

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The read half of the estate spine, which this plan has said ships first since
it was written. One page answering the question the CI/CD campaign opened with:
which of 441 live repos are actually gated, actually reporting, and actually
pinned to something that exists.

WHAT LANDS

  docs/ESTATE-BOARD.adoc                        441 repos, one row each
  .machine_readable/estate-board.json           the same, machine-readable
  .machine_readable/estate-board.tsv            the same, joinable
  .machine_readable/estate-residue-ledger.tsv   the repair surface, 85 rows
  scripts/spine/board.sh  board.awk             the generator
  scripts/spine/verify-board.sh                 the verifier

Every cell carries its horizon and its measurement date. Disk-derived columns
aggregate UNION over files and MAX over counts across a repo's local checkouts,
never SUM -- a repo with four checkouts is one repo, not four.

MEASURED, NOT ASSERTED (origin/HEAD, 2026-09-15)

  workflow soundness     8334 OK / 58 UNPARSEABLE / 7 NOJOBS of 8399 = 99.2%
  reusable pin state     1965 pinned / 46 unpinned refs, canonicalising to
                         15 refs across 9 repos
  Actions posture        n=440, zero errors; no repo has an empty
                         patterns_allowed (floor 92); zero repos are
                         verified_allowed:false
  residue ledger         85 rows, 69 PENDING, 16 DO-NOT-TOUCH

The residue is 60 unsound files plus 9 repos with unpinned reusable refs --
roughly 47 repos, not 441. That is the number the next campaign drives to zero.

VERIFIED, NOT MERELY PRESENT

  scripts/spine/verify-board.sh: 16 assertions, all passing, including a
  RED-THEN-GREEN fixture. A deliberately unsound workflow file and a
  deliberately unpinned reusable ref are planted into a copy of the input set;
  both must appear in the fixture ledger with the right class, and both must be
  absent from the real one, BEFORE any "the board finds no X" claim is
  admissible. Soundness is the two-limb test -- a non-empty jobs map AND a
  trigger key -- never parseability, and never CI colour: a broken workflow
  emits no check run, so a destroyed repo scores greener than a healthy one.

  The verifier's JSON half recounts the board's own totals from the TSV with a
  second instrument (jq reads the JSON, awk recounts the TSV) rather than
  trusting the generator's arithmetic.

A BEHAVIOUR CHANGE TO A GATE, STATED AS ONE

  .githooks/validate-spdx.sh drops *.json from is_source_file.

  The test is `head -10 "$file" | grep -qE '^# SPDX-License-Identifier:'`.
  JSON has no '#' comment syntax, so this rule was unsatisfiable by
  construction, and it was never satisfied: both .machine_readable/*.json
  files already on main -- hypatia-baseline.schema.json and
  scorecard/scorecard.schema.json -- carry zero such headers. Removing the
  extension restores truth rather than weakening a check, and it unblocks
  every future commit touching a JSON file in this repo.

  Proven both ways before the change was kept: the validator as it stands on
  main exits 1 on this commit's file list, naming estate-board.json; with
  *.json dropped it exits 0. Same defect class as the staged-mode filter bug
  fixed in #804, one extension over.

  .machine_readable/REGISTRY.a2ml was regenerated to clear build-registry
  drift and is deliberately LEFT UNSTAGED -- staging it is what creates the
  commit deadlock this repo has hit before.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GEWfbxba7BJaTFRFhCGNF
@hyperpolymath
hyperpolymath force-pushed the spine/estate-board-2026-09-15 branch from 9b6eaaa to 393b053 Compare September 15, 2026 12:54
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit b1987eb into main Sep 15, 2026
26 of 30 checks passed
@hyperpolymath
hyperpolymath deleted the spine/estate-board-2026-09-15 branch September 15, 2026 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant