neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Affiant is a deterministic evidence layer for .NET: field-level provenance, sworn affidavits, and a human review gate between your LLM and your database.
Developer toolsJavaScriptGitHub @SakwalaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The Affiant rulebook: wire schemas, numbered invariants and conformance fixtures every implementation pins by tag
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
The rulebook for Affiant: the wire format, the numbered invariants and the conformance fixtures that every Affiant implementation — in any language — must satisfy.
Implement Affiant in your language → — how a new implementation, in any language and under its own name, becomes a conforming one.Read the full README ↗The rulebook for Affiant: the wire format, the numbered invariants and the conformance fixtures that every Affiant implementation — in any language — must satisfy.
Implement Affiant in your language → — how a new implementation, in any language and under its own name, becomes a conforming one.
Affiant turns every database write an LLM agent proposes into an Affidavit: a per-field evidence record (the value, the previous value, where each value came from, how confident) filed in a Docket and shown as an Evidence Card that a person approves, amends or rejects before the host writes. A Standing Order is a policy verdict that approves a write with no person present.
This repository holds no runtime code. It holds:
schemas/ — JSON Schema for the wire format: the designed protocol in schemas/0.1.0/ (the Affidavit, the field, provenance and bindings, the Docket entry, the attestation, the envelopes, the registries), and the frozen 0.0.1-seed description of the shipped .NET wire beside itINVARIANTS.md — the numbered, testable rules an implementation must enforceconformance/ — the fixtures, the runner specification, the driver contract and the parity-manifest format, and from v0.2.0 the adapter fixtures and the adapter claims lint that check the three rules about an adapter's seamschemas/, INVARIANTS.md and the whole of conformance/ — the fixtures, the runner specification, the driver contract and the parity-manifest format — are tagged v0.2.0, and both drivers have published a parity manifest here at that tag, both with an empty failing set: the TypeScript reference implementation's, over all 80 documents — the 68 of the conformance section and the 12 of the adapter one, which it is the only implementation to run — and the .NET implementation's, now at NuGet package 1.0.0-beta.3.1, over the 68, declaring no adapter and so running none of the adapter section.
Versions are git tags. Each implementation pins a tag and bumps it in its own pull request; a parity manifest records, per implementation, which fixtures it does not yet pass — in public, checked in CI.
| Tag | What it carries |
|---|---|
v0.1.0 | INVARIANTS.md v0.1, the 0.1.0 schemas, the conformance suite (56 fixtures, 7 canonical byte vectors), a parity manifest and a published run per implementation |
v0.1.1 | the seven canonical byte vectors regenerated from v0.1-shaped inputs; the lint validates every vector's record against the Affidavit schema |
v0.1.2 | SR-1 states what the canonical form is taken over; two pinned hashes move; GT-4 gains the entry-id derivation |
v0.1.3 | PV-3 states who establishes presence — the implementation, from the utterance; five fixtures authored here, one amended; 68 documents |
v0.2.0 | The adapter fixture section (12 documents), ADAPTER-RUNNER.md, the adapter claims lint for CV-5 and its self-test corpus, adapters[] on the parity manifest, and the DK-4 and DK-1 sentences. CV-2, CV-3 and CV-5 stop being exempt. No wire schema under schemas/0.1.0/, no canonical vector and no existing conformance fixture changes; fixture.schema.json and parity/MANIFEST.schema.json, which describe the formats rather than the wire, do |
v0.3.0 | The 0.3.0 schemas: the requirement recorded as an object, MultiParty approval records the status folds from, decision.by, typed executionDetail, compositeRef withdrawn. Thirteen fixtures authored here from the first running host's cases. Three refusal codes appended to the registry. Fixtures read by the TypeScript driver at the pre-release commit 247948c, 99 of 99, published in Sakwala/affiant-ts as typescript-v0.3.json and moving here with the pin |
v0.4.0 | The 0.4.0 schemas: withdrawn on the entry's status and the withdraw decision kind, in docket-entry.schema.json, decision-result.schema.json and notification.schema.json; no new refusal code. Ten fixtures authored here for the withdrawal transition (the ten decide/ ids containing withdraw), every one on the negative oracle's fourth table, plus three v0.4/ wire documents; two canonicalHash values re-derived at (#52). Fixtures read by the TypeScript driver at #52's merge commit , 109 of 109, published in as and moving here with the pin |
| Language | Repository | Status |
|---|---|---|
| .NET | Sakwala/affiant | shipped — ten NuGet packages at v1.0.0-beta.3.1. Conformant: 68 of 68 fixtures at v0.2.0, read 2026-09-16, with an empty failing set in conformance/parity/dotnet-v0.2.json and the run beside it at conformance/results/dotnet-1.0.0-beta.3.1/. It declares no adapter to this rulebook — "adapters": [] — so it runs none of the adapter section, which is what conformance/DRIVER.md §7 asks of an implementation that declares none. The v0.1.3 reading stays published at conformance/parity/dotnet-v0.1.json |
| TypeScript | Sakwala/affiant-ts | building in public — the reference implementation. Conformant: 109 of 109 documents at v0.4.1, read 2026-09-29, on Node, Bun and workerd, with an empty failing set in conformance/parity/typescript-v0.4.json and the run beside it at conformance/results/typescript-0.1.0-alpha.10/ — the 97 of the conformance section and the 12 of the adapter one, which it is the only implementation to run, shipping and declaring @affiant/adapter-ai-sdk. The reading is main at 0.1.0-alpha.10, which npm carries under the alpha dist-tag; latest has not moved to it. The , and readings stay published at , and |
2026-10-01 — v0.5.1: a read tool's throw, a failure after the filing, and what a rule may consume. Text and one fixture: AF-5 (a read tool's throw is a tool-error with the implementation's own message), GT-7 (a failure after the filing leaves the entry filed and names it), PV-2 (a computation-ref's inputs); no schema, vector or hash change; the tag goes on the merge commit.
2026-09-30 — v0.5.0: the conversation draft, finalised from the first host's run. The text stays as the pre-release wrote it and gains three amendments: the id-material serializes args as given (GT-4), a refusal's message carries no proposed value (AF-5), a port may consult the draft it holds (GT-7); two fixtures added; no schema or hash change; the tag goes on the merge commit.
2026-09-30 — the v0.5 pre-release's two canonicalHash values re-derived at 0.5.0. decide/amend-recompute and
sequence-a/approve-round-trip expect the hash of a document the implementation produces; the canonical form carries
protocolVersion (SR-1, SR-4), so once the conformance section reads 0.5.0 the values derived at 0.4.0 cannot match.
Re-derived from the reference implementation at this pre-release, on Node, Bun and workerd alike; no other fixture changes.
2026-09-30 — v0.5.0-pre.2: the source of a filing turn's values; which turns draft. Text only: GT-7 states that the graded values are the host's inference port's report (which may consult the conversation's earlier user turns handed to it), never the model's tool arguments, and that any non-filing turn may draft; no schema, fixture or hash change; pre-release, no tag yet.
2026-09-30 — v0.5.0-pre: the conversation draft, designed from a running host's multi-turn capture. A value a person stated in an earlier message keeps its Conversation tag and binding when the model carries it into a later proposal: GT-7 (the gate's draft entry point and port), the carry-over clause in PV-3, messageId on the utterance-span binding (PV-2), schemas/0.5.0/; no existing document or canonical hash changes; pre-release, no tag yet.
2026-09-29 — v0.4.1: DK-1 amended from the first host's run of the withdrawal transition. The v0.4.0 text said no host had run it; Orrery's cancel route has now (its unit W-90, 2026-09-29, test pool; production follows its deploy) and confirmed DK-1 as written; three sentences added (the resubmit code, the shape of , the suite case as a refusal); no schema, vector or fixture change; the TypeScript packages pin it: , , , read 109 of 109 ().
The first adapter has arrived, and with it the rules v0.2 owed it. conformance/fixtures/adapter/ carries twelve model-free, network-free documents for CV-2's fail-closed call site and CV-3's delegation clause, in a manifest section an implementation runs once for every adapter it ships and declares — and runs none of, declaring adapters: [], where it ships none (conformance/ADAPTER-RUNNER.md, conformance/DRIVER.md §7). CV-5 is a lint rather than a fixture, because no fixture can observe a statement about documentation and packaging: conformance/lint/adapter-claims.mjs reads an adapter package's declared durability claims and its README against the runtime's published dist-tags (conformance/ADAPTER-CLAIMS.md), and this repository's CI runs it against a corpus of its own on every push, because a lint cited as a rule's coverage and never executed is not coverage. The three exemptions that read until: "0.2.0" are gone.
Next: the items now reserved for v0.3 and later — the PROV-O attestation export, MultiParty and referral semantics, the queued-inference fixture for AZ-6, and PV-2's binding promoted from SHOULD to MUST. Follow progress in Discussions and the Affiant roadmap.
Apache-2.0 — see LICENSE.
0.4.052e1a3dSakwala/affiant-tstypescript-v0.4.jsonv0.4.1 | DK-1 amended from the first host's run of the withdrawal transition (Orrery, 2026-09-29): a resubmit of a non-expired entry is refused decision-not-pending; decision.by is an identifier; the withdrawn-resubmit suite case is a refusal. Text only — no schema, vector or fixture change; 109 documents |
v0.5.0-pre | The 0.5.0 schemas: messageId on the utterance-span binding, the draft record; GT-7, the conversation draft; pre-release, no tag yet; pre.2 is text only: where a filing turn's values come from, which turns draft |
v0.5.0 | The 0.5.0 text finalised from the first host's run of the conversation draft: the id-material serializes args as given (GT-4), a refusal's message carries no proposed value (AF-5), a port may consult the draft it holds (GT-7); two fixtures added (gate/draft-from-a-question-turn, gate/id-material-args-serialize-as-given); no schema change; tag on the merge commit |
v0.5.1 | The 0.5.1 text amends v0.5.0 from the first host's next run: a read tool's throw is a tool-error with a message the implementation writes (AF-5), a failure after the filing leaves the entry filed and names it (GT-7), a computation-ref's inputs are the Affidavit's own fields or turn.utterance and turn.at, any other name a caller error (PV-2); one fixture added (gate/computed-inputs-turn-and-field); no schema or vector change |
v0.1.3v0.2.0v0.3.0by@affiant/[email protected]@affiant/[email protected]@affiant/[email protected]conformance/parity/typescript-v0.4.json2026-09-28 — v0.4.0: the withdrawal text finalised on the implementation's evidence. The schemas and the fixtures are unchanged from v0.4.0-pre.1 beyond the two canonicalHash values re-derived at 0.4.0 (#52); INVARIANTS.md changed in its status line, DK-1's withdrawal paragraph and Checked by line, and its changelog — by names the withdrawing principal, or the member a relay asserted for it (AZ-3); the two suite cases are named as the core's own, and one clause narrows from "returned" to "left". No host has run the transition at this version — the first host's cancel route is queued, and its evidence, when it comes, is the next amendment. No reading moves here yet: conformance/parity/ holds no typescript-v0.4.json and conformance/results/ no typescript-0.1.0-alpha run at a v0.4 ref; the TypeScript packages that carry this text (@affiant/[email protected], @affiant/[email protected], @affiant/[email protected]) pin #52's merge commit 52e1a3d and read 109 of 109. The .NET reading is queued (Sakwala/affiant#153).
2026-09-28 — the v0.4 pre-release's two canonicalHash values re-derived at 0.4.0. decide/amend-recompute and
sequence-a/approve-round-trip expect the hash of a document the implementation produces; the canonical form carries
protocolVersion (SR-1, SR-4), so the values derived at 0.3.0 cannot match once the conformance section reads
0.4.0. Re-derived from the reference implementation at this pre-release; no other fixture changes. A produced
document's hash moves with the section's protocolVersion from now on.
2026-09-28 — the withdrawal transition designed from the first host's evidence (issue #48), on branch v0.4,
pre-release.
2026-09-28 — v0.3.0: the native MultiParty text finalised from the running host's evidence. The
schemas, INVARIANTS.md and the fixtures are unchanged from v0.3.0-pre.1; AZ-4's Why, fold and Source
sentences state what the first host's native unit proved (Orrery W-86, 2026-09-28). No reading moves here yet:
conformance/parity/ holds no typescript-v0.3.json and conformance/results/ no typescript-0.1.0-alpha.6;
the TypeScript packages that carry this text (@affiant/[email protected], @affiant/[email protected])
still pin the pre-release commit 247948c. The .NET implementation's v0.3.0 reading is queued.
2026-09-16 — both readings move to v0.2.0, and the adapter section is read for the first time by a published run. Sakwala/affiant-ts's reading is conformance/parity/typescript-v0.2.json, with the run at conformance/results/typescript-0.1.0-alpha.2/: @affiant/core at 0.1.0-alpha.2, 80 of 80, empty failing set, asserted identical on Node, Bun and workerd (RT-1). It is the union PARITY.md asks for — the 68 documents of the conformance section and the 12 of the adapter section, run once against @affiant/adapter-ai-sdk at 0.1.0-alpha.0, the adapter those documents were authored with, resolving ai 7.0.101. adapters[] names it and carries claimsLint: "pass" from conformance/lint/adapter-claims.mjs, which runs in that repository's own CI because CV-5's check needs the npm registry. 0.1.0-alpha.2 went to npm the same day, under the alpha dist-tag and with a provenance attestation; latest and alpha both point at it.
2026-09-16 — the .NET reading moves to v0.2.0, and states adapters: [] (conformance/parity/dotnet-v0.2.json, with the run beside it at conformance/results/dotnet-1.0.0-beta.3.1/). Sakwala/affiant re-pinned and re-ran: 68 of 68, empty failing set, on net10.0 at Unicode 16.0 — the same 68 documents it read at v0.1.3, because v0.2.0 changed no wire shape, no schema, no vector and no conformance fixture. What changed in its manifest is what the tag asks of one: adapters: [], the positive statement that this implementation declares no adapter to the rulebook and therefore runs none of the adapter section (conformance/DRIVER.md §7), and eight inherited exemptions instead of eleven, CV-2, CV-3 and CV-5 having been lifted here when the first adapter arrived. The v0.1 readings stay published: each is a claim about the ref it was made against.
2026-09-15 — v0.2.0: the first adapter, and the three coverage rules it was owed. The tag was cut once a driver had run the documents from these files and published what it found, which is the same rule every other section was held to. Twelve documents in conformance/fixtures/adapter/: nine for CV-2 — a write tool called with an explicit turn context files pending; the same call with no context is refused wireup-invalid, files nothing and hands the framework nothing; a second call with no context on a set whose first call succeeded is refused the same way, which is what catches a seam that cached the first context; a malformed context is refused as a missing one is, and so is one that is a complete turn context in the wrong shape, which pins that the value is passed through rather than repaired; a gate that cannot be reached makes a write throw and a read throw; a read with a context reaches the host's own function and returns what it answered; and a read with no context is refused before that function runs — and three for CV-3 — the model-facing output of a filing carries an entry id and field names and no sworn value anywhere in its text, the Docket row read back with nothing from the framework in hand still carries the Affidavit, and a framework approval artefact replayed at the seam changes nothing and is told to nobody. The format is conformance/ADAPTER-RUNNER.md: a conformance fixture with two step kinds of its own, adapter-build and adapter-call, and matchers over the call's outcome, the Docket afterwards and what the framework was handed — a separate schema variant from a conformance fixture, so neither can state the other's keys. CV-5 is a lint, not a fixture, with a corpus of its own that this repository's CI runs. Two sentences were added to rules the store work found silent: DK-4 on the retention boundary, DK-1 on recording a fact once. The remaining "Reserved for v0.2 and later" items moved to "Reserved for v0.3 and later" — none has an adapter dependency, and holding the fixtures for work nobody has scheduled would have been the alternative. No wire schema under schemas/0.1.0/, no canonical vector and no existing conformance fixture changed.
2026-09-09 — both readings move to v0.1.3, over 68 documents (conformance/parity/dotnet-v0.1.json, conformance/parity/typescript-v0.1.json). Each implementation landed the presence change and re-pinned, and each driver's own run is the evidence its manifest names. .NET at 1.0.0-beta.3.1 — ten NuGet packages, published 2026-09-09 — reads 68 of 68, empty failing set, on net10.0 at Unicode 16.0. Its negative oracle is the same suite run against the published 1.0.0-beta.3: 62 passed, 3 failed, 3 errored of 68, and every one of the five fixtures conformance/ORACLE.md lists against that release did not pass. TypeScript reads 68 of 68, empty failing set, asserted identical on Node, Bun and workerd (RT-1), with each runtime's Unicode version measured by probe rather than declared — 17.0 on Node and Bun, 16.0 on workerd. Its manifest names 0.1.0-alpha.1, which is Sakwala/affiant-ts main: the npm tarballs that day carried 0.1.0-alpha.0, which predates the presence change. No fixture, schema, vector or rule text changed here, so no tag is cut — v0.1.3 still names the suite both runs read.
2026-09-08 — v0.1.3: PV-3 says who establishes presence — the implementation, from the utterance. The rule's parenthetical read "the value is literally present in the utterance; with an utterance-span binding when the inference port supplies offsets", which left the grade in the inference port's hands. No shipped port asks a model for presence at all, so both implementations fell through to Inferred and every value a person typed in chat was sworn "AI suggested" on the Evidence Card (Sakwala/affiant#123). PV-3 now states the condition itself: the implementation finds the value text in the unmodified turn — ordinal, folding ASCII case and nothing else, with neighbours that are absent or are none of a letter, a mark, a decimal digit or connector punctuation — grades Conversation on a hit and Inferred otherwise, and binds a hit to { offset, length, hash } over the utterance's own substring. The port's presence and utteranceSpan become hints verified the same way: a literal the text does not confirm is Inferred, and a value the text does carry is Conversation even where the port said nothing. A caller with no utterance in hand keeps the port's report, and no port is asked to change.
The comparison is pinned so two implementations fold alike without depending on a runtime's Unicode data, which no two of them share — ASCII case only, no culture, no normalisation — the neighbour test covers letters, marks, decimal digits and connector punctuation, a number's value text is SR-1's canonical rendering rather than the port's raw token, a port-supplied span verifies only where it is itself a hit and carries integer-valued coordinates, no hit begins or ends inside a surrogate pair, and a value a field cannot carry — null, an object, an array, the empty string, a non-finite number — is nothing the port reported at all.
conformance/RUNNER.md and conformance/fixture.schema.json make both hints optional and say what they are; conformance/lint/lint.mjs runs the finder over every fixture's own utterance and checks every proposed inferred field's expectations against it — the grade, bound, and the span where one is pinned. Five fixtures arrive with the amendment, authored here rather than promoted, because neither implementation had the behaviour to copy. Four are its negative oracle against 1.0.0-beta.3 (conformance/ORACLE.md): gate/inference-presence-computed-from-the-utterance, gate/inference-port-literal-unconfirmed, gate/inference-port-span-fails-the-boundary and gate/inference-case-folds-and-the-digest-is-the-utterances. The fifth, gate/inference-empty-value-is-nothing-reported, pins the other half of the rule — a value that is null, an object, an array or the empty string is nothing reported, so nothing is merged and the field stays Empty — and is on no oracle list, because 1.0.0-beta.3 already skips an empty value and passes it.
Three things changed beyond the rule. The fixture schema, twice: presence left the required keys, and fieldMatcher gained an optional utteranceSpan so a fixture can pin a binding's offset, length and digest — nothing in the suite could state that before, which is why "the first hit wins" and "the digest is the utterance's own bytes" had no coverage. And one existing fixture: sequence-a/picker-external-binding scripted presence: "literal" with no span over an utterance that carries Active, so from v0.1.3 its status is bound to the span it was read from, and it joins the beta.3 oracle list. And the parity manifest's runtimes[] gained a unicodeVersion — optional in the schema, required by the lint of every manifest read at v0.1.3 or later — because the neighbour test reads its categories from a runtime's own Unicode database and two runtimes need not carry the same one. No wire shape and no canonical vector changed.
The suite is 68 documents from here. Both published runs read at v0.1.2, where it was 63, and both are expected to fail the four oracle fixtures and the amended one until each implementation lands the change; on the fifth the two shipped implementations already differ — .NET skips a port's empty value and passes it, the TypeScript core admits it as Inferred and does not; the parity manifests move when they re-pin, and the tag and the "current tag" lines move with the release commit.
2026-09-05 — the .NET run is republished at v0.1.2, package 1.0.0-beta.3 (conformance/parity/dotnet-v0.1.json, conformance/results/dotnet-1.0.0-beta.3/). The .NET packages at 1.0.0-beta.3 (release; ten packages on NuGet.org), against the vendored v0.1.2 suite: 63 of 63, empty failing set. Both implementations now read at the current tag with an empty failing set. The negative-oracle assertion names one release, 1.0.0-beta.1, and reports itself skipped against this one, so this run carries no ORACLE-RUN.md. conformance/results/dotnet-1.0.0-beta.1/ stays published unchanged — a published run is evidence of what happened at that ref.
2026-09-04 — the TypeScript run is republished at v0.1.2 (conformance/parity/typescript-v0.1.json, conformance/results/typescript-0.1.0-alpha.0/). @affiant/core at 0.1.0-alpha.0, against the vendored v0.1.2 suite: 63 of 63, empty failing set, asserted identical on Node, Bun and workerd (RT-1). The set of ids and the failing set are unchanged from v0.1.1; what changed is the two documents' pinned canonicalHash and the implementation's runtime canonical form, which now includes protocolVersion and so produces the same bytes for a record as its own wire writer does. The .NET manifest and run still read at v0.1.1 and move when that implementation re-pins.
2026-09-04 — v0.1.2 is tagged: SR-1 states what the canonical form is taken over, and two pinned hashes move. The
form is over the Affidavit as schemas/0.1.0/affidavit.schema.json defines
it — protocolVersion included, alongside conversationTurn and createdAt. The Evidence Card envelope's
presentation is not in it: allowedValues, pattern, warnings and requiresConfirmation are a host's rendering
of a proposal rather than its sworn substance, and a rendering decision inside a hash a grant is checked against would
let restyling an input invalidate a grant minted over evidence that did not change. The seven canonical vectors already
stated both halves — every one's expectedBytesUtf8 carries protocolVersion, and none carries a presentation key — so
no vector, schema or wire changed here.
What was wrong was the reference implementation's runtime form, not this text. Its Affidavit model omitted
protocolVersion and its wire writer added it on the way out, so the bytes a Docket row's canonicalHash was taken
over — the bytes a host's execution grant binds to — were not the bytes of the same record on a card. Two declarative
fixtures pinned a hash produced by that path and are re-promoted from the corrected reference:
sequence-a/approve-round-trip
776b7b40…6837275 → 2ce4c4af…840eca9 and
decide/amend-recompute
8d1579d7…4ecff6a → d389401d…3bd3402. The corrected bytes are the previous bytes with one key inserted. Those two
values are the only ones that moved.
An earlier draft of this amendment said the opposite — that protocolVersion was envelope-only and absent from the
canonical form — and was not made, because the vectors refuse it. This entry replaces that note. The same commit's
GT-4 amendment stands unchanged: GT-4 already said entry ids are "derived deterministically from the tenant, the
conversation, the tool and the canonical form of the operation and its arguments", and a Derivation paragraph states
exactly what that means — the canonical-JSON material (tenantId, conversationId, toolName, operation, args,
and supersedes present only on a resubmission), the SHA-256 digest over its UTF-8 bytes, and the RFC 9562 UUIDv8
layout — matching the reference implementation's deriveEntryId (Sakwala/affiant-ts
packages/core/src/gate/pipeline.ts), and why the id's material is not the Affidavit's own canonical form (SR-1): the
id must be fixed before inference runs, and inference is not deterministic.
2026-09-04 — both runs republished at v0.1.1 (conformance/parity/, conformance/results/). The TypeScript reference implementation is unchanged: 63 of 63, empty failing set, on Node, Bun and workerd. The .NET reading moves from 3 of 63 to 0 of 63, and no code changed on either side — the three canonical vectors it passed at v0.1.0 were being measured against a record schemas/0.1.0/affidavit.schema.json refuses, two of them against no record at all. Its driver's own canonicaliser still reproduces the pinned bytes and digest for six of the seven regenerated vectors, at the first attempt and unedited; what it cannot do is hold the shape, which is the 1.0.0-beta.3 model gap the manifest already named. The 63 rows are 53 planned and 10 fenced; none is fixed.
2026-09-04 — v0.1.1 is tagged: the seven canonical byte vectors regenerated, and the lint now validates them against the Affidavit schema. The vectors published at v0.1.0 were promoted from the TypeScript reference implementation before it was aligned to this version's wire, and nothing here checked them afterwards — so every one of their inputs described a seed-shaped record that schemas/0.1.0/affidavit.schema.json refuses: operationType "WriteUpdate", the card's presentation on the fields, warnings and requiresConfirmation on the record, evidence where a tag says note, and no protocolVersion, conversationTurn or createdAt. INVARIANTS.md SR-1 defines the canonical form over the accepted state of the Affidavit as the schema defines it, so those vectors pinned the bytes of a document this protocol does not have. Every byte and every digest moved. A vector that carries amendments now also records amendedInput, the accepted state its bytes are taken over, and conformance/lint/lint.mjs holds both ends of every vector against the Affidavit schema on every push — the check that would have caught this. No rule text and no schema changed: the wire, the 0.1.0 schemas and the 56 declarative fixtures are v0.1.0's, unchanged.
2026-09-04 — v0.1.0 is tagged: INVARIANTS.md v0.1, the 0.1.0 schemas, the conformance suite (56 fixtures, 7 canonical byte vectors), and a parity manifest and published run for each of the two implementations. Two things were settled first, each filed as an issue against this repository and closed by the change that answered it. The promoted fixture sequence-a/typed-inputs-on-the-card stated allowedValues and pattern on expect.card.fields[] — where the reference implementation carried them before it was aligned to this version's wire — and was re-promoted stating expect.card.presentation[], with conformance/RUNNER.md §4.2 and conformance/fixture.schema.json changed in the same commit; that was possible only because no tag existed yet, since a parity manifest cites a fixture by id and one produced against one set of bytes says nothing about another. And schemas/0.1.0/evidence-card-request.schema.json gained an optional hostOperation, so that the host's own verb for an operation has somewhere to travel now that operationType is the protocol's two-valued shape — which is what both affidavit.schema.json and operation.schema.json had been telling a reader all along.
2026-09-04 — the TypeScript run is published (conformance/parity/typescript-v0.1.json, conformance/results/typescript-0.1.0-alpha.0/): the reference implementation at 0.1.0-alpha.0, 63 fixtures run, 63 passed, an empty failing set, asserted in its own CI on Node, Bun and workerd — the failing set must be identical on each (RT-1).
2026-09-04 — the first parity manifest and run are published (conformance/parity/dotnet-v0.1.json, conformance/results/dotnet-1.0.0-beta.1/): the .NET conformance driver run against the shipped packages at 1.0.0-beta.1 — 63 fixtures run, 3 passed, 60 failed, 0 errored, 0 skipped, and all 19 fixtures the negative oracle lists failed. The 60 gaps carry a disposition each: 50 planned, every one for 1.0.0-beta.3, and 10 fenced behind a named host-side workaround. None is fixed, because that value names a release a reader can install. planned is new in the parity format (conformance/PARITY.md) — a gap that is scheduled is not a gap nobody is doing anything about, and the format now has a value for each. Three rows of the negative oracle were corrected by what the run showed rather than the run being tuned to match them (conformance/ORACLE.md).
2026-09-04 — conformance suite v0.1 (conformance/): the reference implementation's 56 declarative fixtures and seven canonical byte vectors promoted unchanged in id and content, the fixture format (conformance/RUNNER.md), the driver contract (conformance/DRIVER.md), the parity-manifest format (conformance/PARITY.md), the negative-oracle list carried as data on every fixture, and a lint that checks rule coverage in both directions — every rule enforced by a fixture that names it back, every rule a fixture names one that exists — and prints the report in CI. Thirty-two of the forty-three rules are checked by a fixture; the other eleven are exempt by name, each with a version and a reason.
2026-09-04 — schemas v0.1 (schemas/0.1.0/, validated fixtures, lint): twenty-one schemas written to INVARIANTS.md, at least one fixture per schema derived from the TypeScript reference implementation's own output, one negative per schema the schema must refuse, and a lint that checks both directions in CI — tagged v0.1.0 with the conformance suite once it lands.
2026-09-04 — INVARIANTS.md v0.1 text: every rule written in full against the TypeScript reference implementation, with the fixture, suite or lint that checks it.
2026-09-04 — INVARIANTS.md skeleton: every decided rule with a permanent id, four rules written in full (the conversation-scope contract, the review-outcome state machine, canonical serialization, money on the wire).
2026-09-04 — seed fixtures and seed schemas derived from the shipped .NET wire, tagged v0.0.1-seed; the fixture lint runs in CI. The wire fixtures are hand-authored examples whose key sets are asserted against the shipped serializer, not captures.
2026-09-04 — opened, empty by design.