Skip to content

docs: record the parity authority workflow and its scope gaps - #2584

Merged
ryanbr merged 1 commit into
mainfrom
docs/parity-authority-guidance
Sep 29, 2026
Merged

ryanbr merged 1 commit into
mainfrom
docs/parity-authority-guidance

Conversation

@ryanbr

@ryanbr ryanbr commented Sep 29, 2026

Copy link
Copy Markdown
Owner

AGENTS.md described the gate-trigger gap as entirely open. Half of it is shut as of #2582, so that
paragraph was stale in the direction that matters most: it told the next reader to expect a trap that
has since been partly removed, without saying which half still remains.

docs/CONTRIBUTING.md said nothing about the ledger at all. Checked before writing: zero mentions of
parity_twin_map, refresh-derived, parity_ratchet, parity_ledger or disposition in 701
lines. A contributor's first contact with the ratchet was therefore a red check with no prose
anywhere explaining what it wanted.

AGENTS.md

Past-tenses the old description and records three things: that the repository-acceptance suite, the
one test in that workflow about PRODUCT source rather than about the scanner, now runs on the
unfiltered tools-python leg; that the scanner's own unit tests stay path-filtered deliberately; and
what the remedy explicitly was not, since naming product paths in the filter only moves the trap,
which is the #1691 lesson already written into that same guard test.

docs/CONTRIBUTING.md

A new ### The parity ledger (one-sided declarations) under cross-platform discipline, since the
ledger is the mechanical enforcement of exactly that discipline. Every fact in it was read out of
Tools/parity_ledger.py and Tools/parity_ratchet.py rather than written from memory:

  • the exact scanned roots, as a table
  • --refresh-derived, plus --repair-stale-base for the case where a stale base is not the
    contributor's to absorb, with --migrate-authority marked as a maintainer call and why
  • the three disposition types with their exact key sets, plus the allowed_kinds limit, so people
    learn early that a shared-parity regression or a pair removal cannot be waived at all
  • the two scope gaps, named rather than left to be discovered: Strand/ and StrandiOS/ sit outside
    Swift scope while com/noop/data/** is inside Kotlin scope (Parity ledger scope is asymmetric: Strand/ is out of scope, so Kotlin twins there can never pair #2567), and out_of_scope_twin is
    Kotlin-only with a twin_path regex that cannot match any path under StrandiOS/
  • what CI does not promise here, including the daily schedule and the advice to rebase before
    drawing any conclusion from a green run

Also a TOC entry, and a step 5 in "Add a new metric", which is where contributors most often walk
into this: step 1 lands in a scanned root, and MetricCatalog.swift living in Strand/ against a
Kotlin catalog twin in com/noop/data/** is precisely the asymmetry case.

Verification

  • doc_comment_lint.py, validate_examples.py, check_source_references.py: all pass
  • ACCEPTANCE=1 python3 -m unittest tests.test_parity_governance_acceptance: 50 tests, OK, exit 0
  • branch sits on current origin/main (4a827f908)

Docs only. No product or tooling source is touched.

AGENTS.md carried the gate-trigger gap as a still-open problem. Half of it
is shut now: the repository-acceptance suite, the only test in
parity-governance that reads product source rather than the scanner, runs
on the unfiltered tools-python leg, with a guard test pinning it there.
Past-tense the old description, record what the remedy deliberately was
not, and keep the #1691 lesson attached to it.

docs/CONTRIBUTING.md had nothing on the ledger at all: no scanned roots, no
--refresh-derived, no disposition types. A contributor met it first as a
red check with no way to read what it wanted. Add a section under
cross-platform discipline covering the exact roots, the refresh command,
--repair-stale-base versus the maintainer-only --migrate-authority, and the
three typed dispositions with their exact key sets.

Name the two scope gaps plainly rather than letting people discover them:
Strand/ and StrandiOS/ are outside Swift scope while com/noop/data/** is
inside Kotlin scope (#2567), and out_of_scope_twin is Kotlin-only with a
twin_path pattern that cannot name a file under StrandiOS/.

Also point "Add a new metric" at the new section, since its step 1 lands in
a scanned root and its catalog twin is the exact asymmetry case.
@ryanbr
ryanbr merged commit 49e2237 into main Sep 29, 2026
3 checks passed
@ryanbr
ryanbr deleted the docs/parity-authority-guidance branch September 29, 2026 04:41
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