Skip to content

Commit 2eac6a2

Browse files
committed
docs(t0): close the five freeze-blockers the full review found
F1 — the campaign join. The accepted D7 payload binds the reference, harness digest and version, and workload manifest, and nothing else; `execution_binding` does not occur in the instrument, and an extra payload key is tolerated without ever being verified. T0 also claimed D7 "records exact numbers", which described a stronger mechanism than the one that exists. Both are corrected: D7 freezes rules and bindings before collection while the numbers belong to #263-B evidence, and a campaign link — verified fail-closed at preflight and again at postflight — ties the execution binding to the D7 payload and its attestation by exact bytes. The limit is stated rather than hidden: the instrument's firewall stays unaware of the campaign, so a clock can physically run outside one; what cannot happen is that such a run becomes admissible. F2 — the acceptance leaf is `(cell, resource)`, not the cell. T0 had said both in different sections, which let two different implementations each claim to follow it. 12 canonical workloads x 2 platforms x 2 regimes = 48 end-to-end D7 cells; 48 x 2 gated resources = 96 acceptance resource leaves. The resource axis lives in this contract and not in `D7_CELL_DIMENSIONS`; no schema change. F3 — reproducibility is no longer an invalidation predicate. Listing a median change above `REPRODUCIBILITY_MAX_MEDIAN_CHANGE` among the INVALID triggers turned an observed number into a ticket for another throw of the coin, one paragraph above the sentence promising that a performance result never invalidates anything. The accepted instrument keeps `timings_reproduced` and `environment_valid` apart precisely because a timing disagreement does not say what caused it. Statistical non-reproduction now grants no retry, and INVALID keeps only integrity and environment failures. F4 — the authority state machine (R15). Freezing this contract is the owner act that sets FROZEN and collection_authorized: true together; the flag is necessary and never sufficient, and three of the four combinations refuse — including NOT_FROZEN+true, because an authorisation without a fixed protocol is a contradiction. The step-7 tooling enforces it fail-closed on both paths. F5 — retry scope. R8 governs the decisive campaign only. Step-7 training keeps its own frozen rule: exactly one collection, no automatic retry, and an INVALID training collection yields no admissible Step-8 input. T0 does not amend Step 6 by implication — a fixed thirty-run collection does not remain the same object after a second attempt. Presentation: the status block no longer denies observations that exist — it narrows to T0-governed training and decisive collection, leaving the historical calibration and Round-7 evidence alone — and T0-5 names the per-resource-leaf decision function. Status unchanged: NOT_FROZEN, collection_authorized false. Not a freeze commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018xhcg5opoFbSTdYHpkSXCh
1 parent 387fac6 commit 2eac6a2

1 file changed

Lines changed: 125 additions & 10 deletions

File tree

docs/notes/p022-263-t0-protocol-freeze.md

Lines changed: 125 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ Status:
88
MANDATORY UNRESOLVED SLOTS: 0 (T0-completion).
99
OPEN NORMATIVE CONFLICTS: none. The #262 ratification blocker was withdrawn
1010
as a misreading — see T0-3.
11-
NO CLOCK HAS RUN. NO OBSERVATION EXISTS.
11+
NO T0-GOVERNED CLOCK HAS RUN. NO TRAINING OR DECISIVE OBSERVATION EXISTS.
12+
(Historical calibration and Round-7 observations exist and are untouched
13+
by this contract; they are not training or decisive evidence.)
1214
```
1315

1416
**What this is.** The contract that fixes *how numbers will be judged*, before any
@@ -17,14 +19,40 @@ the decisive campaign (#263-B) alike, because a rule chosen after a look at
1719
training data is not a preregistered rule — it is a preference with a timestamp.
1820

1921
**What this is not.** It is not D7. T0 says how a verdict is computed; D7 later
20-
records *which* exact numbers, candidate, digests and host instances the verdict
21-
was computed from, and adds no analytical decision of its own.
22+
**freezes the rules and the bindings before collection** — the reference, the
23+
harness identity, the workload manifest and a preregistered rule for every cell —
24+
and adds no analytical decision of its own. The measured numbers are not in D7 at
25+
all: they belong to the #263-B evidence produced afterwards. An earlier revision
26+
said D7 "records exact numbers", which described a stronger mechanism than the
27+
one that exists.
2228

2329
**Authority.** T0-0 revoked the automatic authorisation of the first step-7
2430
collection (`docs/notes/p022-263a-step7-environment-capture.md`). Until this
2531
document is frozen, `collection_authorized` is `false` and no training, first or
2632
decisive collection may run, however ready the hosts are.
2733

34+
**The freeze is the authorising act, and it is not sufficient on its own (R15).**
35+
Freezing this contract sets both `status: FROZEN` and
36+
`collection_authorized: true` in the same commit — one owner act, one state — and
37+
the flag is then a *necessary* condition, never a permission slip. Host
38+
qualification, an exact execution binding and a session preflight are still
39+
required, and each can still refuse.
40+
41+
The two fields are read as one state, and three of the four combinations are
42+
refusals:
43+
44+
```text
45+
NOT_FROZEN + false refuse — the protocol is not fixed
46+
FROZEN + false refuse — frozen, but the owner has not authorised collection
47+
NOT_FROZEN + true refuse — an authorisation without a fixed protocol is a
48+
contradiction, and a tool that accepted it would be
49+
honouring a flag over the contract
50+
FROZEN + true may proceed to the remaining gates, which may still refuse
51+
```
52+
53+
The step-7 tooling enforces this state machine fail-closed; neither the
54+
qualification path nor the binding path may accept `FROZEN + false`.
55+
2856
**Slot discipline.** Every value this document does not already hold appears as a
2957
typed `UNRESOLVED_OWNER_DECISION` slot with its unit and its scope stated. A slot
3058
is filled by an owner ruling recorded here, never by a plausible default and
@@ -65,7 +93,18 @@ key. There is no second term for it — a "platform-cell" would
6593
be the same idea with a second name, and two names for one thing is how a
6694
contract starts disagreeing with itself.
6795

68-
**The cell is also the acceptance leaf.** For each matched pair:
96+
**The cell is not the acceptance leaf; a resource inside it is.** A D7 cell
97+
carries two gated resources — elapsed time and the stratum's memory metric — and
98+
each is decided on its own. The leaf is therefore
99+
100+
(cell, resource) resource ∈ { elapsed, the stratum's memory metric }
101+
102+
and this document says "resource leaf" wherever the decision is meant, reserving
103+
"cell" for the measurement identity D7 enumerates. An earlier revision called the
104+
cell the leaf, which made two different implementations able to claim they
105+
followed T0.
106+
107+
For each matched pair, per resource:
69108

70109
P_c = median(Python_c)
71110
R_c = median(Rust_c)
@@ -371,6 +410,18 @@ windows / launcher-e2e / warm / max_process_peak_commit (bytes)
371410
Windows. `U_linux` and `U_windows` are never pooled, and no ratio is formed
372411
across them.
373412

413+
### Cells and leaves are not the same count
414+
415+
```text
416+
12 canonical workloads x 2 platforms x 2 regimes = 48 end-to-end D7 cells
417+
48 cells x 2 gated resources (elapsed, memory) = 96 acceptance resource leaves
418+
```
419+
420+
The resource axis exists in this contract and **not** in `D7_CELL_DIMENSIONS`;
421+
adding it there would be a schema change, and none is made. The two resource
422+
verdicts of one cell are independent and are combined only by the operator below,
423+
never inside the cell.
424+
374425
### Two roll-ups, one operator
375426

376427
```text
@@ -513,6 +564,45 @@ is ever pooled, averaged or otherwise combined across workloads, regimes,
513564
platforms or resources: the algebra above applies to the three words `PASS`,
514565
`NO_DECISION` and `FAIL`, and to nothing else.
515566

567+
### The campaign join, and what it is not
568+
569+
The accepted D7 payload binds `python_reference_commit`,
570+
`python_reference_tree`, `harness_digest`, `harness_version` and
571+
`workload_manifest_sha256`. It does **not** bind the execution binding:
572+
`execution_binding_sha256` appears nowhere in `D7_PAYLOAD_BINDING_KEYS`, and the
573+
string `execution_binding` does not appear in the instrument at all. The gate
574+
checks that the listed keys are *present* and matching; an extra key in the
575+
payload is tolerated and never verified. So a payload could name a campaign and
576+
the gate would not notice if it named the wrong one.
577+
578+
That gap is closed by a **campaign link**, an artifact of the step-7 layer that
579+
ties the three identities together and is verified fail-closed before the clock
580+
and again after it:
581+
582+
```text
583+
campaign link binds, by exact bytes:
584+
execution_binding_sha256
585+
the D7 payload's sha256, its blob id and the commit that carries it
586+
the D7 attestation's exact identity
587+
```
588+
589+
**A decisive session is admissible only with it.** The session preflight refuses
590+
to start when the link is absent, when it does not name this execution binding,
591+
or when the D7 payload and attestation now on disk do not hash to what the link
592+
names; the postflight refuses to issue an admissibility record on the same
593+
grounds. Admissibility under this contract *is* the existence of that postflight
594+
record, so evidence produced without the link is not inadmissible by opinion —
595+
there is no artifact that can say it is admissible.
596+
597+
**What the link does not do, stated plainly.** It does not make the instrument's
598+
firewall aware of the campaign. The `IdentityGate` arms from the D7 payload and
599+
attestation alone, so a decisive clock can physically run with no execution
600+
binding in existence; what cannot happen is that such a run becomes admissible
601+
evidence. Making the firewall itself refuse would require editing
602+
`scripts/perf_baseline.py`, which moves `measurement_harness_digest` and re-opens
603+
steps 4, 5 and 6 — a price this contract does not pay for a property it can
604+
obtain by making admissibility, rather than execution, the thing that is gated.
605+
516606
Nothing here requires a change to `scripts/perf_baseline.py`, and therefore
517607
nothing here moves the harness digest.
518608

@@ -630,8 +720,9 @@ rather than in a reading nobody re-reads.
630720
**RESOLVED (R5): a deterministic gray zone in two dimensions.**
631721

632722
The gray zone is defined on the same two coordinates the margins are, and no
633-
synthetic scalar score is constructed from them. Per **cell**, against the
634-
budget family its class belongs to:
723+
synthetic scalar score is constructed from them. This is the **per-resource-leaf
724+
decision function**, applied to one resource of one cell against the budget
725+
family that resource belongs to:
635726

636727
```text
637728
PASS iff relative_regression_c <= M_pass
@@ -696,7 +787,6 @@ Invalidation fires only on machine-detectable predicates frozen in advance:
696787
- opening or closing noise probe relative IQR above `NOISE_PROBE_MAX_RELATIVE_IQR`
697788
(0.35);
698789
- drift between opening and closing probes above `NOISE_PROBE_MAX_DRIFT` (0.35);
699-
- reproducibility median change above `REPRODUCIBILITY_MAX_MEDIAN_CHANGE` (0.35);
700790
- a cell that did not do its rung's work, proved by its post-condition;
701791
- a required primary metric that returned `null` or went missing mid-attempt
702792
(T0-4 case B);
@@ -713,7 +803,22 @@ Invalidation fires only on machine-detectable predicates frozen in advance:
713803
- candidate byte drift within a stratum after collection started.
714804

715805
**A performance result is never an invalidation condition.** Not a slow cell, not
716-
a gray-zone outcome, not a disappointing cell comparison. Every predicate above is
806+
a gray-zone outcome, not a disappointing cell comparison — and, since this
807+
revision, not a failure to reproduce a median either.
808+
809+
**Statistical non-reproduction is not `INVALID` and buys no retry.** An earlier
810+
revision listed a reproducibility median change above
811+
`REPRODUCIBILITY_MAX_MEDIAN_CHANGE` among the invalidation predicates, which
812+
turned an observed number into a ticket for another throw of the coin — the
813+
outcome-selective surface this contract exists to close. The accepted instrument
814+
keeps the two questions apart on purpose: `timings_reproduced` and
815+
`environment_valid` are separate verdicts, and a timing disagreement does not
816+
establish whether contention, a variable workload or the uncertainty of a median
817+
caused it. `INVALID` remains for integrity and environment failures that are
818+
knowable without looking at the comparison: noise and drift probes, missing or
819+
corrupt evidence, the wrong population, identity or candidate drift, a missing
820+
required metric, a broken numeric domain. Reproducibility keeps the meaning the
821+
accepted calibration policy gives it, and T0 does not reclassify it. Every predicate above is
717822
machine-detected, so no operator chooses to invalidate a session.
718823

719824
One retry attempt is one full re-collection of the invalidated session on the
@@ -724,7 +829,15 @@ evidence and none is deleted.
724829
retry_budget: 1 # R8
725830
```
726831

727-
Read literally:
832+
**Scope: the decisive campaign only.** `retry_budget` governs #263-B and nothing
833+
else. Step-7 training keeps the rule its own frozen preregistration already
834+
carries — `exactly_one_collection`, `abort_semantics.no_automatic_retry`, and an
835+
`INVALID` training collection yields no admissible Step-8 input. No training
836+
attempt is created by R8, and this document does not amend Step 6 by implication:
837+
a fixed thirty-run collection does not remain the same object after a second
838+
attempt, whatever a later reader would prefer.
839+
840+
Read literally, for the decisive campaign:
728841

729842
1 initial attempt
730843
+ at most 1 full-session retry after INVALID
@@ -1048,7 +1161,9 @@ is now in it:
10481161
| the decisive gate population | T0-3 | S1 |
10491162
| the numeric domain and sample completeness | T0-4 | S2, S3 |
10501163
| eight platform-qualified gate **classes** | T0-3 | S8 |
1051-
| the leaf decision: one verdict per canonical workload cell | T0-1, T0-5 | P3.5 |
1164+
| the leaf decision: one verdict per (cell, resource) leaf | T0-1, T0-5 | P3.5, F2 |
1165+
| the authority state machine, freeze as the authorising act | preamble | R15 |
1166+
| the campaign link joining execution binding, D7 payload and attestation | T0-3 | F1 |
10521167
| the within-class roll-up over canonical workload verdicts | T0-3 | P3.5 |
10531168
| the overall roll-up over the eight class verdicts | T0-3 | P3.5 |
10541169
| the D7 serialization and its equivalence proof | T0-3 | P3.5 |

0 commit comments

Comments
 (0)