Skip to content

Record the M3.13h delivery and the next slice - #227

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

Record the M3.13h delivery and the next slice#227
kaikisegfault merged 2 commits into
mainfrom
docs/m3-13h-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

A version-seven chain runs. The phase headline, the "What works now" list,
and the gap section are updated together so they agree, and the delivery note
keeps the two things a later session would otherwise have to rediscover:

  • why the slice changed shape before it started. The handoff said to emit the
    recorded blocks' raw inputs into a vector file. Reading
    simulation/economy_transition_v7/trace.py first found the sentence that makes
    that impossible — no signature is computed anywhere — so the slice built a
    fixture that signs for real instead. The note keeps the reason the recorded
    stand-ins are right for a contract fixture beside the reason they are useless
    for a run, so nobody "corrects" them later.
  • the local check that made it affordable, which is the opposite of M3.13g's
    lesson. This machine has libsodium 1.0.18 against the pinned 1.0.22, and a
    scratch copy that relaxes the pin — never committed, and it must stay that way
    — runs the fixture and all six mutation probes against real Ed25519 in under a
    second.

The next slice, and a trap recorded with it

M3.13i: where the uptime schedule comes from. The note establishes first that
it is not plumbing. Every caller passes nullptr and no caller can do otherwise:
a schedule is measured seats for a window, and a node cannot invent one every
other validator reaches, so it has to be data the chain agrees on — and none of
version seven's fourteen kinds carries it
.

That list was enumerated through KIND_SCHEME rather than by reversing a name
table, because the transaction-kind constants collide numerically with the state
entry-kind constants — TRANSFER and SEAT_ENTRY are both 1 — and a first
attempt produced a list that looked right and was not. The trap is recorded
beside the conclusion.

So the slice divides, and what is reserved is narrower than the earlier entry
implied
. The threshold is already settled: kActivityThresholdSeconds is
64,800 seconds, founder-directed and checked against
test-vectors/economy-transition-v3.txt. What the owner has to answer is what a
machine must do to be counted operational toward it — a statement about what a
participant must own and run. Specifying the attested-claim carrier is unblocked
and belongs behind change-protocol; the note says to ask when the reserved
question becomes the nearest dependency, and names the two things the slice must
not do to unblock itself.

Verification

git diff --check main HEAD clean, no added line over 81 columns, and
python3 tools/verify_metadata.py validates 272 internal Markdown links.

A version-seven chain runs. Three contiguous blocks — two registrations
and a confirmed transfer — were driven through a real CometBFT process on
all four presets, with the engine required to report the state root the
independent Python model says each block produces, and the third block
committed by a process that did not execute the first two.

**The delivery note records why the slice changed shape before it
started.** The handoff said to emit the recorded blocks' raw inputs into a
vector file; reading the traces first found the sentence that makes that
impossible, so the slice built a fixture that signs for real instead. The
note keeps the reason the recorded stand-ins are right for a contract
fixture beside the reason they are useless for a run, so nobody
"corrects" them later.

**The local check that made it affordable is written down**, because it is
the opposite of M3.13g's lesson: this machine has libsodium 1.0.18 against
the pinned 1.0.22, and a scratch copy that relaxes the pin — never
committed, and it must stay that way — runs the fixture and all six
mutation probes against real Ed25519 in under a second. Almost none of
this slice needed the hosted matrix to find its bugs.

**The next action is where the uptime schedule comes from, and the note
establishes first that it is not plumbing.** Every caller passes `nullptr`
and no caller can do otherwise: a schedule is measured seats for a window,
and a node cannot invent one that every other validator reaches. So it has
to be data the chain agrees on — and **none of version seven's fourteen
kinds carries it**. The kinds were enumerated through `KIND_SCHEME` rather
than by reversing a name table, because the transaction-kind constants
collide numerically with the entry-kind constants and a first attempt
produced a list that looked right and was not; that trap is recorded.

So the slice divides. Specifying the attested-claim carrier is unblocked
and belongs behind `change-protocol`. What is reserved is narrower than
the earlier entry implied: the threshold is already settled at 64,800
seconds, founder-directed and checked against an accepted vector, so what
the owner must answer is what a machine has to do to be counted
operational toward it — a statement about what a participant must own and
run. The note says to ask when that becomes the nearest dependency, and
names the two things the slice must not do to unblock itself.
The next-action entry said the slice must "specify the attested-claim
carrier" and that a founder answer about the resource commitment would
become its nearest dependency. Reading
`docs/specifications/uptime-measurement-v1.md` before writing that would
have been better: it is accepted, 599 lines, and it already settles the
design.

**The slot grid and its correspondence to the founder-directed 24-, 18-,
and 6-hour figures, the two evidence sources and the mapping of the
constitution's five "fully operational" components onto them, challenge
selection and its response deadline, the conjunctive no-partial-credit
credit rule, the dispute window and how far a dispute may reach,
finalisation by expiry, record completeness, and the 100,000-seat storage
bound are all specified.** `simulation/uptime_measurement/` executes it,
`test-vectors/uptime-measurement-v1.txt` records it, and a registered
verifier checks it.

**And the reserved part is scoped out of it by name.** The
specification's own "explicitly not in scope" list puts *the content of a
challenge* — the concrete resource commitment — in the Founder Node and
resource-network milestone and treats the answer as an abstract predicate.
So the slice is not blocked on a founder answer at all, which the earlier
entry got wrong in the direction that would have stopped work.

What is missing is the *second* item on that same list: the numeric
consensus receipt codes and transaction encodings for a C++ transition.
The entry now names the three things that follow — kinds that carry the
duty report, the challenge response, and the dispute; the binding from
`cycle_uptime_record` to the `UptimeSchedule` the assignment prologue
reads; and a C++ kernel, because the pipeline is Python and nothing
consensus-critical may stay there.

The two prohibitions are restated against the corrected picture: do not
invent a challenge's content, because the accepted specification
deliberately has none, and do not make the schedule a proposer's opinion.
@kaikisegfault

Copy link
Copy Markdown
Owner Author

A correction pushed before merge

The first commit's next-action entry said M3.13i must "specify the attested-claim
carrier", and that a founder answer about the concrete resource commitment would
become its nearest dependency. Reading
docs/specifications/uptime-measurement-v1.md before writing that would have been
better. It is accepted, 599 lines, and it already settles the design: the slot
grid and its correspondence to the founder-directed 24-, 18-, and 6-hour figures;
the two evidence sources and the mapping of the constitution's five "fully
operational" components onto them; challenge selection and its response deadline;
the conjunctive no-partial-credit slot credit rule; the dispute window and how far
a dispute may reach; finalisation by expiry; record completeness; and the
100,000-seat storage bound. simulation/uptime_measurement/ executes it,
test-vectors/uptime-measurement-v1.txt records it, and a registered verifier
checks it.

And the reserved part is scoped out of it by name. The specification's own
"explicitly not in scope" list puts the content of a challenge — what a node
must hold, compute, or serve to answer one — in the Founder Node and
resource-network milestone, and treats the answer as an abstract predicate. So the
slice is not blocked on a founder answer at all, which the earlier entry got
wrong in the direction that would have stopped work.

What is missing is the second item on that same list: "the numeric consensus
receipt codes and transaction encodings for a C++ transition, which are
requirement 5." The entry now names the three things that follow:

  • kinds that carry the pipeline on-chain — the duty report, the challenge
    response, and the dispute — which is a new transition version rather than an
    edit;
  • the binding from cycle_uptime_record to the UptimeSchedule the assignment
    prologue reads, with no second derivation of either;
  • a C++ kernel, because the pipeline is Python and nothing consensus-critical may
    stay there.

The conclusion that survived the correction is the one that matters: none of
version seven's fourteen kinds carries an uptime claim
, so this is a
transition-version change rather than a call-site change. That list was
enumerated through KIND_SCHEME rather than by reversing a name table, because
the transaction-kind constants collide numerically with the entry-kind constants —
TRANSFER and SEAT_ENTRY are both 1 — and a first attempt produced a list that
looked right and was not.

Still Markdown only.

@kaikisegfault

Copy link
Copy Markdown
Owner Author

Verification

Run 33505480410 on head 433c44bsuccess.

Scope classified lightweight, so the focused metadata path ran and the
compiler/sanitizer matrix was correctly skipped: tools/verify_metadata.py
(272 internal Markdown links) and the tests/tools unittest suite. The diff is
docs/project/current-state.md only.

git diff --check main HEAD clean, and no added line exceeds 81 columns.

Merging now that the main push run for 9c733e4 has reached a terminal state,
so the workflow's concurrency group does not cancel it.

@kaikisegfault
kaikisegfault merged commit 8b1f57d into main Sep 1, 2026
3 checks passed
@kaikisegfault
kaikisegfault deleted the docs/m3-13h-closeout branch September 1, 2026 12:08
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