Record the M3.13h delivery and the next slice - #227
Conversation
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.
A correction pushed before mergeThe first commit's next-action entry said M3.13i must "specify the attested-claim And the reserved part is scoped out of it by name. The specification's own What is missing is the second item on that same list: "the numeric consensus
The conclusion that survived the correction is the one that matters: none of Still Markdown only. |
VerificationRun 33505480410 on head Scope classified
Merging now that the |
Pure Markdown —
docs/project/current-state.mdonly — so the focused metadatapath 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:
recorded blocks' raw inputs into a vector file. Reading
simulation/economy_transition_v7/trace.pyfirst found the sentence that makesthat 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.
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
nullptrand 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_SCHEMErather than by reversing a nametable, because the transaction-kind constants collide numerically with the state
entry-kind constants —
TRANSFERandSEAT_ENTRYare both 1 — and a firstattempt 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:
kActivityThresholdSecondsis64,800 seconds, founder-directed and checked against
test-vectors/economy-transition-v3.txt. What the owner has to answer is what amachine 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 reservedquestion becomes the nearest dependency, and names the two things the slice must
not do to unblock itself.
Verification
git diff --check main HEADclean, no added line over 81 columns, andpython3 tools/verify_metadata.pyvalidates 272 internal Markdown links.