Skip to content

Record the M3.13g delivery and the next slice - #224

Merged
kaikisegfault merged 2 commits into
mainfrom
docs/m3-13g-closeout
Sep 1, 2026
Merged

Record the M3.13g delivery and the next slice#224
kaikisegfault merged 2 commits into
mainfrom
docs/m3-13g-closeout

Conversation

@kaikisegfault

Copy link
Copy Markdown
Owner

Pure Markdown. docs/project/current-state.md only, so the focused metadata
path is the required verification.

What it records

M3.13g completed the structural stack. Every layer between a signed
version-seven transaction and a consensus engine now exists, and the handoff no
longer names the adapter as the missing piece — the phase section, the "What
works now" list, and the gap section are updated together so they agree.

The delivery note records the finding rather than the code. The slice's one
real design question was answered by reading CometBFT v0.39.4 rather than by
choosing: it replays an already-committed height against a mock application
built from its own saved response, saying in the source that it will not call
Commit twice for one block on the real app. The note keeps why inventing a
reconciliation would have been worse than useless, so a later session does not
build one.

The next action is the fixture rather than the adapter, and its shape is
written down before the slice starts:

  • the version-one integration builds expectations from a Python model that
    constructs signed transfers; version seven has no such builder, because only
    the C++ trace constructs its transactions;
  • so the recorded blocks' raw inputs are in no accepted vector file;
  • and emitting them is not sufficient on its own — those blocks hold two and
    four transactions each, a root commits to the whole block, and broadcasting
    through a mempool does not put four transactions into one block in a chosen
    order;
  • the likely answer, a scenario recorded for the run at one transaction per
    block through the verifier's own --emit, is stated with the alternative and
    the reason it loses.

Also recorded

  • Two durable notes in the shape of the existing ones: what the Go adapter looks
    like now, including the two things not to "simplify", and the scratch-module
    check that type-checks and runs the whole internal/localapp package locally
    in under a second while bridge and nodeconfig can only be verified on the
    hosted matrix.
  • The four-validator devnet's version-seven dependency, against requirement 13:
    its genesis and the -protocol-version its supervisor passes each bridge have
    to move in one slice, because a genesis that says one thing while the bridges
    say another fails at InitChain.
  • The founder-decision gate result for M3.13g — nine decisions enumerated, every
    one delegated — and the note that one of them was settled by reading the
    engine rather than by choosing.
  • A duplicated uptime-schedule paragraph in the gap section folded into one.
    Both said the same thing about the same nullptr.

Verification

git diff --check main HEAD clean. No line in the diff exceeds 81 columns,
which is the file's existing width.

M3.13g completed the structural stack: every layer between a signed
version-seven transaction and a consensus engine now exists, and the
handoff says so rather than still naming the adapter as the missing piece.

**The delivery note records the finding rather than the code.** The slice's
one real design question — what an adapter does when a consensus engine
replays a block the application has already committed — was answered by
reading CometBFT v0.39.4 rather than by choosing: it replays exactly that
case against a mock application built from its own saved response, and
says in the source that it will not call Commit twice on the real app. The
handoff keeps why a reconciliation would have been worse than useless, so
a later session does not build one.

**The next action is now the fixture rather than the adapter**, and its
shape is written down before the slice starts. The version-one integration
test builds its expectations from a Python model that constructs signed
transfers; version seven has no such builder, because only the C++ trace
constructs its transactions. Emitting the recorded blocks' raw inputs is
the obvious step and is not sufficient on its own: those blocks hold two
and four transactions each, a root commits to the whole block, and
broadcasting through a mempool does not put four transactions into one
block in a chosen order. The likely answer — a scenario recorded for the
run, one transaction per block, emitted through the verifier's own
`--emit` — is stated with the alternative and the reason it loses.

Two durable notes are added in the same shape as the existing ones: what
the Go adapter looks like now, including the two things not to "simplify",
and the scratch-module check that type-checks and runs the whole
`internal/localapp` package locally in under a second while `bridge` and
`nodeconfig` can only be verified on the hosted matrix.

The four-validator devnet's version-seven dependency is recorded against
requirement 13 rather than left to be rediscovered: its genesis and the
`-protocol-version` its supervisor passes each bridge have to move in one
slice, because a genesis that says one thing while the bridges say another
fails at `InitChain`.

The duplicated uptime-schedule paragraph in the gap section is folded into
one. Both said the same thing about the same `nullptr`.
The next-action section said the end-to-end run needs the recorded blocks'
raw inputs emitted into a vector file. That is true and it is not the
obstacle, and building on it would have produced a fixture no chain can
accept.

**Every recorded version-seven transaction is signed with a stand-in.**
`simulation/economy_transition_v7/trace.py` says so outright — no signature
is computed anywhere, a stand-in is an eight-octet counter padded to 64
octets, recorded in an oracle that verifies by exact-match lookup — and
`Signatures` in `tests/kernel/economy_v7_execution_fixture.hpp` issues
byte-identical tokens so the C++ trace reproduces the model's exact
transaction bytes. That is deliberate and right: the model implements no
cryptography and every message-binding claim in the contract stays
testable.

**But `protocol-application-v7` opens its store through
`open_sqlite_ledger_v7`, whose verifier defaults to
`protocol::v7::ed25519_verifier()`.** It would refuse every recorded input
as `invalid_signature`. So the next slice is a fixture slice: a
version-seven fixture that signs for real, which is exactly what version
one has in `tests/differential/cases.py` and `pinned_sodium` and what
version seven has never needed until a real engine had to accept its
bytes.

The Python model turns out to be already parameterized for it —
`execute_block` takes the oracle as an argument and only ever calls
`oracle.verify(public_key, message, signature)`, so a libsodium-backed
class is a drop-in and nothing in the model changes. That is recorded with
the rest, along with why one transaction per block is a requirement rather
than a simplification: a root commits to the whole block, and broadcasting
through a mempool does not put four transactions into one block in a
chosen order.

ADR 0061's owed note is amended in place with the same finding, marked as
established after the ADR was first written, because a reader who acted on
its first wording would have emitted the octets and discovered the
signatures afterwards.
@kaikisegfault

Copy link
Copy Markdown
Owner Author

A correction pushed before merge, and it is the reason this PR is worth reading

The first commit recorded the next slice as "emit the recorded blocks' raw inputs
into a vector file". Checking that claim against the fixtures before merging
found it would have produced a fixture no chain can accept.

Every recorded version-seven transaction is signed with a stand-in.
simulation/economy_transition_v7/trace.py states it outright — no signature is
computed anywhere; a stand-in is an eight-octet counter padded to 64 octets,
recorded in an oracle that verifies by exact-match lookup — and Signatures in
tests/kernel/economy_v7_execution_fixture.hpp issues byte-identical tokens so
the C++ trace reproduces the model's exact transaction bytes. That is a good
decision: the model implements no cryptography and every message-binding claim in
the contract stays testable.

But a real node verifies real signatures. protocol-application-v7 opens its
store through open_sqlite_ledger_v7, whose verifier defaults to
protocol::v7::ed25519_verifier(), so it would refuse every recorded input as
invalid_signature.

So M3.13h is a fixture slice, not a plumbing one: a version-seven fixture that
signs for real, which version one already has in tests/differential/cases.py
and pinned_sodium and version seven has never needed until now. The Python model
turns out to be already parameterized for it — execute_block takes the oracle as
an argument and only ever calls oracle.verify(public_key, message, signature),
so a libsodium-backed class is a drop-in and nothing in the model changes.

ADR 0061's owed note is amended in place with the same finding, marked as
established after the ADR was first written, because a reader acting on its first
wording would have emitted the octets and discovered the signatures afterwards.

Still Markdown only, so the focused metadata path remains the required
verification.

@kaikisegfault

Copy link
Copy Markdown
Owner Author

Verification

Run 33502535967 on head 2ac4ccfsuccess.

Scope classified lightweight, so the focused metadata path ran and the
compiler/sanitizer matrix was correctly skipped: tools/verify_metadata.py and
python3 -m unittest discover -s tests/tools -p '*_test.py'. The diff is
docs/project/current-state.md and docs/decisions/0061-…md only.

git diff --check main HEAD is clean and no added line exceeds 81 columns, which
is the width both files already use.

Merging after the main push run for ecd3fcf reaches a terminal state, so the
workflow's concurrency group does not cancel it — that mistake left a cancelled
run on main's history once before, in M3.11c.

@kaikisegfault
kaikisegfault merged commit 1d04ad1 into main Sep 1, 2026
3 checks passed
@kaikisegfault
kaikisegfault deleted the docs/m3-13g-closeout branch September 1, 2026 11:31
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