Skip to content

vectors: the conformance vector corpus, ledger v1 (#15) - #72

Open
dhh1128 wants to merge 7 commits into
Nicholas-Keystate:mainfrom
dhh1128:vectors/ledger-v1
Open

vectors: the conformance vector corpus, ledger v1 (#15)#72
dhh1128 wants to merge 7 commits into
Nicholas-Keystate:mainfrom
dhh1128:vectors/ledger-v1

Conversation

@dhh1128

@dhh1128 dhh1128 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Builds the conformance vector corpus that roadmap item 4 of #1 implies and #15 specifies. No ratified bytes are altered, and nothing here touches spec/. Adds vectors/, one tool, and one CI step.

Relates to #15, #14 and #57.

What this is

A vector is an input shape and an expected result, published so anyone can run any implementation against it. The corpus is not a test suite: a test suite belongs to an engine and moves when the engine moves. The consequence that matters is direction of travel — a disagreement about an expected value here is a finding against the specification, not a bug report against an engine.

49 vectors across 12 families. Every station obligation assigned by §17 of the ratified edition and by the rulings of the record and supplements 2 and 3 carries at least one, plus the ordering discriminators #15 names in its own text.

Why the coverage check exists

tools/verify_vectors.py fails the build when a listed obligation has no vector. That is the pressure the corpus is for. The canonical-selection contradiction (#2) survived a full gauntlet round and the census gate because no fixture exercised an empty-subcode collision — the vector that decides it is four lines long and nobody had written it. V-R03-02 is now that vector.

The tool proves the ledger's integrity, never an engine's conformance. It checks that the ledger parses and is well typed, that ids are unique and well formed, that every source it cites is present and still matches its pinned SHA-256, that every assigned obligation is covered, that held vectors name their hold, and that no entry claims byte grade while the encoding is unratified.

The grade discipline

R5, as corrected by supplement 1 C-1, makes the conformance predicate semantic until the carriage encoding ratifies. So every expected value is stated over the full payload — finding value, self-convicted kind, grounds in canonical order, typed requirement set including species, refusal grounds with the seal kind named per §9's three-kind discipline, cited law head, corpus identity carrying the admission set.

The ledger carries grade_discipline.byte_grade_available: false, and the verifier enforces it. When the encoding round (#57) lands, the flag flips and the expected values gain a byte form by construction rather than by revision — which is R5's convergence argument made operational instead of asserted.

What is held, and why

Two entries. The two-track equivalence pair waits on R19, which waits on #55 and #56. The rotation-covenant families recorded as ripened in S3-9 wait on the recovery-branch exception grammar — the one ruling supplement 3 names as owed, since a covenant must not convict the medium's lawful cure and the exception must itself be committed law.

Scope

Every vector derives from ratified 4.1 bytes and from rulings, both of which are in this repository. None cites the 4.2 candidate, which is assembled elsewhere; vectors that need to cite it can be written when it can be cited. And no vector presumes external recognition — an enacted genus reservation consumed as committed evidence is testable, recognition by an external steward is not.

verify_kernel.py 6/6, verify_vectors.py 13/13, census PASS at the ratified digest.

Forty-nine vectors, one per discriminating record the ratified edition
and the rulings assign, with the input shape and the expected result
stated at the grade the law can currently carry. Section 17's five
families, the record's eight station-bearing rulings, supplement 2's
six, and supplement 3's five, plus the ordering discriminators finding
Nicholas-Keystate#15 names - including the empty-subcode collision that survived a full
gauntlet round and the census gate because nobody wrote it.

Every expected value is semantic-grade under R5 as clarified by
supplement 1 C-1, since the carriage encoding has not ratified. The
ledger pins every source it derives from by digest, and
tools/verify_vectors.py checks that the pins still match the bytes,
that every assigned station obligation carries at least one vector,
that held vectors name their hold, and that no entry claims byte grade
before the encoding round lands. The coverage check is the point: a
ruling that assigns a discriminating record and never gets one is how
the canonical-selection contradiction survived 4.1.

Two vectors are held - the two-track equivalence pair on R19, and the
rotation-covenant families on the recovery-seam ruling supplement 3
names as owed.

The verifier runs in CI alongside the kernel and census checks.

Signed-off-by: Daniel Hardman <daniel.hardman@gmail.com>
dhh1128 added 2 commits August 7, 2026 17:35
…supplement 4

The edition of record changed under the ledger. The edition-owed family
moves from 4.1's section 17 to 4.2's section 18, whose boundary family
R15 extended with designation and membership; every ruling-owed entry
gains the ratified site where its ruled text now lives, or the fact that
the ratified edition does not yet carry it. Eight entries are in that
second state, all from supplement 3, and the README says so rather than
letting a reader assume the corpus binds to 4.2 throughout.

Eleven vectors are new. Section 19's gate three had no predecessor site
at all, so its equivalence, must-reject and vanilla-passthrough families
enter as a compact-form family. Supplement 4's two errata owe three
station vectors: the cardinality-3 circuit was already here as V-R10-01,
while the duplicity-pair and circuit-shaped payload pair are new, and the
empty-subcode boundary needed a new entry rather than the one already
present - V-R03-02 tests two tied defeats, and the erratum's boundary is
the sole defeat with an empty subcode, which is where the two readings
part company.

Sources now pin both editions and all four supplements. 60 vectors,
13 families, 25 obligations covered, verifier green.

Signed-off-by: Daniel Hardman <daniel.hardman@gmail.com>
@dhh1128

dhh1128 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

Re-anchored to the ratified edition — 73fb1ed. The ledger was drafted against 4.1 and the edition of record changed under it, so this is the reconciliation you said would come next.

The edition-owed family moved. It was assigned by 4.1's §17 and is now carried and extended by §18, whose boundary family R15 grew by three must-rejects — underivable designation or membership, the eloquent stranger, and a membership rule yielding a proper subset without a refusal. The first two were already in the corpus under R15; the third is new as V-S18-01.

Section 19 had no predecessor site at all, so gate three's three families enter as a new compact-form family: the equivalence pair over both presentation orders, five must-rejects (bundle tamper, forged group identity where reassembly does not cure, digest-preimage confusion in both directions, unseated ilk, route isolation), and the vanilla-passthrough vector at gate grade — a warranted heavyweight envelope through an ungoverned KERI node, where compatibility is a gate rather than a hope.

Supplement 4's three owed vectors. One was already here: V-R10-01, the cardinality-3 circuit. Two are new. V-E41-02 is the discriminating one — it fails an engine that rejects a circuit-shaped payload on the strength of the payload bullet's pair wording, which is exactly what E4-1 says the wording confers no licence to do. And V-E42-01 is new rather than a relabel: V-R03-02 tests two tied defeats where one subcode is empty, while the erratum's boundary is the sole defeat with an empty subcode, which is the case where 'orders last' and 'lexicographic minimum' actually part company.

One thing the ledger now states plainly. Every ruling-owed entry carries a ratified_site, and for eight of them it reads 'not carried' — the S3-3 aggregate-membership and presentation-form vectors, S3-4's unseated warrantor, S3-5's charter floor and authentication grade, and S3-7's typed observation reports. Those rulings are on the record and the ratified edition does not yet execute them, so those vectors test a successor obligation rather than the edition. An implementer running the corpus against 4.2 today should expect them to have nothing to bind to, and the README says so rather than letting the count imply otherwise.

60 vectors, 13 families, 25 obligations covered. Verifier 13/13, kernel 6/6.

Separately, and not part of this PR: while checking whether this corpus duplicated tools/census-42.py I found it cannot run from a clean checkout, and filed that as #76.

@Nicholas-Keystate

Copy link
Copy Markdown
Owner

The hold on V-S39-01 is released: supplement 5 is on main (reviews/ruling-record-supplement-5-2026-08-07.md, sha256 02d7f4a3…, commit 67b72e5) — the recovery-branch exception grammar your hold named as its gate is ruled whole.

What the ledger can now consume:

  • The two-branch covenant form (S5-1): C.ordinary + C.recovery with three committed conditions — (a) medium-geometry admission (lawful superseding recovery per KEL bytes: occupied-position attachment, pre-rotated signature, open window, delegator anchor where delegated), (b) committed declaration (evidence-of-record or open committed demand), (c) regrounding within H committed positions. Bridge standing is a typed pending — pending(under-recovery, H) — and the conviction fires at failure-to-reground, never at the lawful cure.
  • The seam vector family (S5-7, seven + the delegated pair): ordinary±seal; lawful recovery → pending; recovery-claim from current keys → defeated at (a) on geometry; regrounded within H → affirmed; horizon starved → defeated(failure-to-reground); declaration absent → defeated at (b); authorized transfer → admitted / unauthorized → refused fail-loud. The pending-typed middle discriminates hardest — neither a lenient nor a strict engine gets it right without the two-branch reading.
  • Grade note: all expected values remain semantic-grade per your ledger's discipline; the transfer-pair vectors design against the upstream xfr shape and stay held-on-substrate (the R19 posture) — a different hold than the one just released, worth a distinct hold reason in the ledger.

Also in the supplement, relevant to the corpus: the recourse stack is recorded with the ruling (S5-6), including the deferred both-lawful race (R6 machinery — with the asymmetry note that branch (c) gives exactly one claimant a far bank), and supplement 4's three vectors (antinomy pair/circuit payloads, empty-subcode boundary) are owed to the station alongside these. If you want to extend the ledger yourself, S5-7 is written to be consumed directly; otherwise I'll draft the entries against your schema on the next pass.

dhh1128 added 2 commits August 8, 2026 02:38
# Conflicts:
#	.github/workflows/verify.yml
The ledger said corpus and meant register. An entry recorded that a
vector was owed and sketched the shape of the case; it did not state the
case. That gap is now visible rather than papered over: entries carry a
concrete case where one has been written, the README says what an entry
without one is, and the verifier's closing line reports both counts.

A case is concrete at the semantic layer, which is the only layer that
exists before the carriage encoding ratifies. The fixture convention
fixes the symbols - a law head, a position, a bundle given as its spans,
a clause whose class names the defeater class - so two implementers
building one case build the same case, and the symbols become
self-addressing identifiers when the encoding lands with nothing else
about the case changing.

Supplement 5 ruled the recovery seam whole and named itself the release
condition for the families S3-9 held. Its nine arrive as cases: the seam
family of seven, from an ordinary event with its seal through a bridge
whose horizon closes unregrounded, and the delegated pair. The
supplement stated them as input-to-expected-value pairs already, which
is the form the rest of the ledger is being moved toward.

Nine older entries gain cases too, chosen because they decide live
findings or carry supplement 4's errata. Fifty-one remain sketches, and
the ratchet is forward-only: new obligations from supplement 4 onward
must arrive as cases, and the older ones are worth writing deliberately
against the ruling that assigned them rather than in one guessing pass.

Also resolves the verify.yml conflict with main, keeping the 4.2 census
gate and replay steps alongside the ledger check.

Signed-off-by: Daniel Hardman <daniel.hardman@gmail.com>
@dhh1128

dhh1128 commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

Updated for supplement 5, and the format problem is being fixed — e44a5a9. Conflict with main resolved (both 4.2 gate steps kept alongside the ledger check).

The honest correction first. This file said corpus and meant register. An entry recorded that a vector was owed and described the shape of the case; it did not state the case. input was a class of inputs, expect was the rule restated. Two implementers reading one entry would have built two different cases, which is the property a vector exists to eliminate.

Entries now carry a case where one has been written, and the README says plainly what an entry without one is. The verifier's closing line reports both counts: 18 of 69 state a case, 51 are still sketches. That gap is now machine-visible rather than implied away by a total.

A case is concrete without bytes. No serialization exists until the encoding ratifies, so nothing here can be byte-level — but that constrains the form and doesn't excuse prose. The fixture convention fixes the symbols (L1 a law head, p14 a position, E1 a bundle given as its spans, C-merit-01 a clause whose class names the defeater class it produces), so two implementers building one case build the same case, and the symbols become self-addressing identifiers when the encoding lands with nothing else changing. V-E42-01 now reads: one defeat available, class merit, citation C-merit-01, empty subcode, no other defeat at that rank and identifier → defeated, citing that defeat.

Supplement 5's nine are in, as cases. S5-7 names itself the release condition for the families S3-9 held, so V-S39-01's hold is discharged and its content is stated at V-S5A-01V-S5A-07 and V-S5B-01/02 — ordinary event with seal → affirmed; without → defeated at C.ordinary; lawful recovery with declaration → pending under-recovery carrying the horizon; recovery claimed from current keys → defeated at (a); regrounded within H → affirmed at the regrounding; horizon closed unregrounded → defeated for failure-to-reground; declaration absent → defeated at (b); authorized transfer → admitted and judged as an enactment; unauthorized transfer → refused, fail-loud. The supplement stated them as pairs already; the ledger just gives each one its given and its then.

The ratchet is forward-only. Vectors owed by supplements 4 and 5 must arrive as cases or the build fails. The 51 older sketches are not retrofitted in one pass, because that would produce 51 guesses — each is worth writing against the ruling that assigned it.

69 vectors, 14 families, 26 obligations covered. verify_vectors 14/14, verify_kernel 7/7, census-42 green, replay green.

@Nicholas-Keystate

Copy link
Copy Markdown
Owner

The arc families, stated as cases — ten entries in the v3 convention, ready to integrate. These discharge the vector debts of supplement 3's S3-9 (the eighth and ninth composition items it records as ripened: conditional seating, the watcher-invocation law, identifier-as-office, governed vacancy) plus one vintage vector from keripy #1544. All are successor obligations — the ratified edition does not carry the eighth/ninth item text — so every entry takes "predecessor_site": "not carried" per the README's discipline, and all are semantic-grade. Fixture symbols extend yours: G1 a governed domain, Q1 its custodial quorum (3-of-5), W1 a chartered watcher, X1 an unchartered courier, K1 an exhibit-grade conviction package (signed act + covenant SAID + contradiction derivable), O1 an enumerated caretaker power set.

The ten cases (JSON, your schema)
[
 {"id":"V-S39-W01","family":"conviction",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (general-invocation law)"},
  "input":"case: X1, holding no charter of any kind, presents K1 against G1: G1's own signed act at p22, the covenant SAID it violates, contradiction derivable by any fold from the two committed inputs.",
  "expect":"Convicted. K1 self-authenticates; the courier's identity contributes nothing and is not evaluated. A fold that weighs X1's standing before consuming K1 does not conform.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-W02","family":"refusal",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (general-invocation law)"},
  "input":"case: W1, chartered as an obligated looker in G1's founding law, presents a package at p23 missing the covenant citation — assertion without the committed clause it claims is violated.",
  "expect":"Refused, fail-loud: defective package, grounds named. The charter confers obligation to look, never evidentiary weight. A fold that admits the package on W1's charter does not conform.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-W03","family":"boundary",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (obligated lookers invoked only generally)"},
  "input":"case: a proposed clause C-obs-01 for G1's law reading: breach findings are admissible only when presented by watcher W1.",
  "expect":"Rejected at admission: the clause names a specific watcher as a required source, which ranks frames and creates a capture surface. Watcher obligations commit specifically; invocation is general — any bearer of a valid package.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-V01","family":"transition",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (governed vacancy; occupancy carries taint)"},
  "input":"case: G1's occupant convicted at p30 (K1 consumed, standing defeated). At p31 the deposed occupant, still holding the keys, signs a further governance act.",
  "expect":"The p31 act is defeated on ground evaporation: the voice was deposed at p30 and position ordering is committed. Acts at p29 and before stand and bind the office.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-V02","family":"transition",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (caretaker law, committed at birth)"},
  "input":"case: during the vacancy opened at p30, caretaker Q1 performs an act inside O1 (its birth-committed enumerated powers): renewing G1's witness configuration.",
  "expect":"Affirmed, attributed to the caretaker role within the vacancy, never to a new occupancy.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-V03","family":"transition",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (caretaker law)"},
  "input":"case: during the same vacancy Q1 signs an act outside O1: amending a covenant clause of G1's founding law.",
  "expect":"Defeated: caretaker beyond enumerated scope. The vacancy clauses bound the provisional voice; legislation awaits an occupant.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-O01","family":"covenant",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (office-succession; ceremony + freshness covenant)"},
  "input":"case: G1's rotation at p40 reveals keys matching the n-digests committed at p12 by quorum ceremony. Between p12 and p40, quorum member 3 rotated her own AID at a committed position; the freshness clause requires re-derivation of n within N events of any member rotation, and no re-derivation occurred.",
  "expect":"Convicted under the freshness covenant: medium-valid rotation, committed digests match, and the covenant still fires — the vector that proves the covenant sees what the medium cannot.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-O02","family":"transition",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (capture-succession, the C-succ clause)"},
  "input":"case: following the conviction at p30, Q1 convenes per C-succ, incepts successor G1-prime citing K1 and the succession clause, with 3-of-5 member signatures at committed positions.",
  "expect":"Affirmed: lawful succession on cited ground. G1-prime inherits the office's obligations from lawful epochs; the poisoned occupancy's taint does not travel.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-S39-O03","family":"conviction",
  "owed_by":{"source":"supplement-3","ruling":"S3-9 (the coup vector)"},
  "input":"case: Q1 members 1 and 2 (below threshold) incept a claimed successor at p28 — BEFORE any conviction exists — citing a manufactured package K2 whose contradiction does not derive from committed bytes.",
  "expect":"The coup convicts itself: premature succession citing underivable ground is exhibit-grade breach by its own signatures. K2's defect is checkable by any fold; the incepting members' acts become K-grade evidence against them.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"},
 {"id":"V-M44-01","family":"boundary",
  "owed_by":{"source":"supplement-3 + keripy #1544","ruling":"S3-9 (conditional seating: dip-anchored covenant) / the pre-fix vintage"},
  "input":"case: a delegated AID presents itself as born-governed: its founding-law referent names a seating covenant that its dip SHOULD anchor, but the dip event's seal list is empty — the signature of the pre-#1544 keripy vintage, where delegated inception silently dropped data= seals.",
  "expect":"The born-governed claim is refused, fail-loud: no knot at inception, no birth-conditioning — adopted-grade at best, and the fold says which. A fold that infers the seal from the referent's naming of it does not conform.",
  "grade":"semantic","status":"case","predecessor_site":"not carried"}
]

Three notes. (1) The ratchet is honored — these arrive as cases, not sketches; every input is one buildable situation in the fixture convention. (2) Family fit: I've used your existing families (conviction/refusal/boundary/transition/covenant); if covenant should absorb the V-S39-O entries wholesale, your call — the family taxonomy is yours. (3) The join, lightly: our side maintains a claim registry over the ratified edition (320 records; first public artifact of the identity-geometry work); its evaluation-point census found sixteen places the edition is held on standing rather than check, and these ten target the successor-obligation region of that list. When both artifacts are on main, a two-way join (your owed_by and our record ids) makes coverage a computed property — no schema change on your side needed now.

These are yours to integrate, amend, or re-family — the corpus is your artifact and the entries are offered in that spirit.

Ten cases drafted by the ratifying authority on PR Nicholas-Keystate#72, mapped into the
ledger's schema rather than pasted: status to the ledger's enum, the
not-carried fact to ratified_site where it belongs, and each situation
converted from prose into a case with its given and its then, substance
preserved. They discharge the vector debts of supplement 3's eighth and
ninth composition items - conditional seating, the watcher-invocation
law, identifier-as-office, governed vacancy - plus one from the keripy
vintage #1544 repaired. Each carries contributed_by.

The fixture convention gains their symbols: a governed domain, a
custodial quorum, a chartered watcher, an unchartered courier, an
exhibit-grade conviction package, a caretaker's enumerated powers. The
id pattern widens to admit a sub-series letter rather than renaming ids
already cited in review.

Two holds corrected. The delegated transfer pair is not specifiable: it
designs against the shape xfr is expected to take, which is roadmap-only
at the pinned checkout, so it is held on the substrate - a different
hold from the recovery-seam hold supplement 5 released. And R19 is
unruled rather than held: it fell between the sittings, so no ruling
waits on feasibility to be applied. The ledger had implied otherwise.

Family stays as filed, across three families for the three
office-succession cases: owed_by records the ruling, so a family that
repeated it would stop being useful for finding anything.

79 vectors, 28 with cases, 51 sketches.

Signed-off-by: Daniel Hardman <daniel.hardman@gmail.com>
@dhh1128

dhh1128 commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

All ten integrated — 656d56a. Mapped rather than pasted, since three fields didn't line up: status: "case" became specifiable (the enum is specifiable/held, and carrying a case is what the case field says), predecessor_site: "not carried" moved to ratified_site, where the ledger records what the ratified edition does or doesn't carry — predecessor_site means the 4.1 origin span. And each situation moved from prose in input into a case with its given and its then, substance preserved verbatim in meaning. Every one carries contributed_by.

The fixture convention now carries your symbols. The id pattern widened to admit the sub-series letter rather than renaming ids you'd already cited — W for the watcher law, V for vacancy, O for office.

On family: keeping your split, and here's the rule I'd apply going forward. File by what the case discriminates, never by what produced it, because owed_by already records the ruling and a family that repeats provenance stops being useful for finding anything. So the three office-succession cases stay in three families — one exercises a covenant firing where the medium sees nothing, one lawful succession, one self-conviction. That's written into the README so the next contributor doesn't have to ask.

Both corrections applied. The delegated transfer pair is no longer specifiable — held on the substrate, with the reason stated as a distinct hold from the recovery-seam one supplement 5 released. And R19: the ledger had it as held on #55/#56, which implied a ruling existed and was waiting on feasibility. Per the correction on #36 it is unruled — appended the day the record drafted, fallen between the sittings — so the hold reason now says that. That error was mine and it had been sitting in the corpus since the first version.

79 vectors, 14 families, 3 held on two distinct grounds. 28 state a case, 51 are still sketches, and the verifier prints both counts every run.

On the join: nothing needed from this side. When the claim registry lands, owed_by plus the entry ids give you the key without a schema change here.

verify_vectors 14/14, verify_kernel 7/7, census-42 green, replay green.

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.

2 participants