Skip to content

Commit eae1807

Browse files
committed
docs(perf): revision 3 of the calibration policy - two P0, two P1, still no numbers
Revision 2 was ruled PASS WITH MECHANICAL CORRECTIONS. None of the four findings changes the statistical model, which the owner ratified as settled. P0 - exact arithmetic never said how a constant is written down. The document refused a floating-point LP solver on exactness grounds and then left its constants as "a dimensionless number", so a committed decimal is a float to one implementation and a rational to another, and they disagree on every boundary. Every rational quantity is now a canonical integer pair: reduced, positive denominator. Reading one through a binary float is a refusal, ranges are expressed on the pair, and A_abs is not rounded to an integer because rounding a bound is an undeclared adjustment to it. P0 - the sequence allowed the implementation to be written after the training data existed. That is a steering surface even with the prose frozen. The implementation, its mutation review, its CI and its frozen digest now all precede the training collection, in a twelve step sequence. Code that decides admissibility must not have weaker provenance than code that starts the stopwatch: either the change moves the measurement-harness digest before any corpus exists, or the policy implementation's own digest becomes a mandatory identity axis for the fit, the freeze and the validation. Step 2 carries no constant defaults, so the code physically cannot hold a number nobody ratified. P1 - the tie-break rationale claimed more than the rule guarantees, and the claim is withdrawn rather than softened. Tied optimal lines can cross, so a smaller intercept can carry a steeper slope. Witness, found by search: observations (8,20), (8,10), (3,11) at q=1/2 have two minimisers at equal loss, A_abs=28/5 R_rel=9/5 and A_abs=11 R_rel=0; the rule picks the first, which is looser for every t > 3. A first randomised sweep found nothing because its generator kept driving ties onto the R_rel=0 boundary where the claim happens to hold, which is a reminder that a search finding nothing is evidence about the search. The rule stands unchanged as canonicalisation - identical constants from identical bytes - and no scalar tie-break by envelope area replaces it, since that would add an objective nobody asked for. P1 - N_max removed. A finite frozen ladder already ends somewhere; its last element is the mandatory stop, and a second maximum expresses nothing but a future argument about which one wins. No implementation, no clock, no numbers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CYLNQy6tLXqsV1CbuNqsSb
1 parent c7c5e88 commit eae1807

2 files changed

Lines changed: 176 additions & 39 deletions

File tree

docs/notes/p022-263a-calibration-policy-proposal.md

Lines changed: 140 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# P-022 / #263-A — calibration reproducibility policy, PROPOSAL (revision 2)
1+
# P-022 / #263-A — calibration reproducibility policy, PROPOSAL (revision 3)
22

33
**Status: PROPOSAL. Nothing here is ratified, and nothing here is a number.**
44

@@ -11,7 +11,25 @@ document where the value was chosen by whoever was holding the pen.
1111
No clock authority is claimed or implied. No implementation authority is claimed.
1212
No measurement is proposed here.
1313

14-
## Revision 2 — what the owner's review changed
14+
## Revision 3 — what the owner's second review changed
15+
16+
Revision 2 was ruled **PASS WITH MECHANICAL CORRECTIONS**: the statistical
17+
architecture accepted, the mechanism not yet ratified, on two P0 findings and two
18+
P1.
19+
20+
| finding | fixed in |
21+
|---|---|
22+
| P0 — exact arithmetic never said how a design constant is *written down*, so one implementation could read a decimal as a float and another as a rational | §2.6 — a canonical exact-rational representation, and a refusal for anything else |
23+
| P0 — the sequence let the implementation be written after the training data existed, which is a steering surface even with the prose frozen | §3.6 — the implementation, its controls and its frozen digest all precede the training collection |
24+
| P1 — the tie-break rationale claimed more than the rule guarantees | §3.3 — the claim is **withdrawn** with a counterexample; the rule stands as canonicalisation only |
25+
| P1 — `N_max` duplicated the last element of a finite frozen ladder and could contradict it | removed throughout; the ladder's last element **is** the mandatory stop |
26+
27+
Nothing else is reopened. The owner ratified the symmetric midpoint comparison,
28+
the hybrid form, the quantile regression, the pooling, the four-way semantics,
29+
the no-`K` aggregation, the holdout firewall and the per-`N` stratification as
30+
settled, and reopening a settled choice is its own kind of drift.
31+
32+
## Revision 2 — what the owner's first review changed
1533

1634
Revision 1 was ruled **CHANGES REQUIRED** with four P0 findings and one P1. The
1735
form was ratified in principle; the mechanism was not, because a reasonable
@@ -26,8 +44,7 @@ space between those two is where knobs hide.
2644
| P0 — `N` selection was mathematically undefined: the model has no `N` in it | §3.4 — per-`N` envelopes and a deterministic selection rule |
2745
| P1 — §6.3 inherited constants without naming their provenance | §6.3 — the source artifact, the digest that covers it, and why this policy may not touch them |
2846

29-
Three things are **not** reopened, because the owner ratified them in principle
30-
and reopening a settled choice is its own kind of drift: the symmetric midpoint
47+
Three things were **not** reopened in revision 2 either: the symmetric midpoint
3148
comparison, the hybrid absolute-plus-relative form, and the no-`K` aggregation.
3249

3350
## Why this document exists, in the frozen brief's own terms
@@ -166,6 +183,38 @@ describes the instrument's own dispersion, not a budget of permitted failures. I
166183
that proves impossible, the honest outcome is a failed policy under §4 and a
167184
conversation with the owner, not a `K` that grows until the gate opens.
168185

186+
### 2.6 How a constant is written down
187+
188+
Revision 2 insisted on exact rational arithmetic and then left the constants as
189+
"a dimensionless number", which settles nothing: a value written as a decimal —
190+
say `0.95`, used here only as an illustration and not as a proposed value — is
191+
read by one implementation as a binary float and by another as `19/20`, and the
192+
two then disagree on every boundary case. That is a particularly silly gap in a document that already
193+
refused a floating-point LP solver on exactness grounds.
194+
195+
**Every rational quantity in this policy — design constant, empirical constant,
196+
and every intermediate — is represented canonically as a pair of integers:**
197+
198+
numerator, denominator
199+
denominator > 0
200+
gcd(|numerator|, denominator) = 1
201+
202+
The reduced form with a positive denominator is unique, so the representation is
203+
itself canonical and two implementations cannot disagree about what was frozen.
204+
205+
Binding consequences:
206+
207+
- a constant is **committed as that integer pair**, never as a decimal string and
208+
never as a float
209+
- reading, writing or comparing any of these quantities through a binary
210+
floating-point value is a **refusal**, not a rounding difference
211+
- the admissible ranges are expressed on the pair: `q` in `(0, 1)` means
212+
`0 < numerator < denominator`; `M > 1` means `numerator > denominator > 0`;
213+
`G ≥ 0` means `numerator ≥ 0`
214+
- `A_abs` is a rational count of nanoseconds in the same canonical form. It is
215+
not rounded to an integer: rounding it would be an undeclared adjustment to a
216+
bound, in whichever direction the rounding happened to go
217+
169218
## 3. How the constants will be obtained
170219

171220
### 3.1 Three corpora, and a firewall between them
@@ -223,12 +272,12 @@ already in hand.
223272
| `q` | quantile level in `(0, 1)` | which quantile of the instrument's dispersion the inner bound claims to cover |
224273
| `M` | dimensionless, `> 1` | the width of the inconclusive band, as the outer bound's multiple of the inner |
225274
| `R_runs` | count, `≥ 2` | how many repeated runs per cell the fitting corpus collects |
226-
| the `N` ladder | ordered counts | the repetition counts the instrument may use |
227-
| `N_max` | count | the ladder's mandatory stop |
275+
| the `N` ladder | a **finite**, ordered, frozen list of counts | the repetition counts the instrument may use; **its last element is the mandatory stop**, and there is no separate maximum — a second knob there would express nothing but a future argument about which maximum wins |
228276
| `G` | dimensionless, `≥ 0` | the diminishing-returns margin used by §3.4 to select `N` |
229277

230-
No design constant may be derived from the fitting corpus, and none has a value
231-
here.
278+
No design constant may be derived from the fitting corpus, none has a value here,
279+
and each is written in the canonical exact-rational form of §2.6 when it is
280+
eventually ratified.
232281

233282
### 3.3 The empirical fit, specified as a single computable function
234283

@@ -288,12 +337,30 @@ margin. Without a stated tie-break, two correct implementations of this document
288337
would return materially different constants and both would be entitled to say
289338
they followed it. That is precisely the defect this revision exists to remove.
290339

291-
**Tie-break, in order:** among all minimisers, take the smallest `A_abs`; among
292-
those, the smallest `R_rel`.
340+
**Tie-break, in order.** Among all objective minimisers represented by the
341+
enumerated candidate set:
342+
343+
1. choose the smallest `A_abs`;
344+
2. among those, choose the smallest `R_rel`.
345+
346+
This is a deterministic **canonicalisation** rule. It does not claim pointwise
347+
dominance over every other minimiser. Its purpose is identical constants from
348+
identical corpus bytes, and that is the whole of its purpose.
293349

294-
The governing principle, stated so the rule can be checked against it rather than
295-
merely obeyed: **a tie is never resolved in the direction that makes the gate
296-
easier to pass.** Both components select the tighter bound.
350+
**A claim about this rule is withdrawn.** Revision 2 asserted that "a tie is
351+
never resolved in the direction that makes the gate easier to pass". That is
352+
false, and not merely overstated. Tied optima need not share a slope, so a
353+
smaller intercept can come with a steeper one, and the two lines cross. A
354+
concrete witness, found by search rather than argued: observations
355+
`(t, y) = (8, 20), (8, 10), (3, 11)` at `q = 1/2` have two tied minimisers at
356+
equal loss — `A_abs = 28/5, R_rel = 9/5` and `A_abs = 11, R_rel = 0`. The rule
357+
selects the first, which is **looser** than the second for every `t > 3`.
358+
359+
The moral is the one this project keeps paying for: a rule may be perfectly good
360+
at its actual job while the sentence justifying it quietly promises something
361+
else. The rule stays; the promise goes. And no scalar tie-break by envelope area
362+
or summed width replaces it, because that would introduce a second objective
363+
nobody asked for, on top of the one that already decides.
297364

298365
**Fail-closed conditions of the fit**, each refusing rather than guessing:
299366

@@ -356,24 +423,53 @@ under the current harness identity. Everything on hand is form evidence.
356423
This is a normal outcome, not a setback, and the response is not to squeeze
357424
constants out of the museum exhibit in `historical/`.
358425

359-
The required sequence, each step a separate owner decision:
426+
### 3.6 The implementation is written before the data, not after
427+
428+
Revision 2 jumped from a ratified mechanism straight to a measurement, leaving
429+
the code that applies the policy to be written afterwards. That is a steering
430+
surface even when the prose is frozen: an implementation written with the
431+
training data already on disk can be nudged, in a hundred defensible small ways,
432+
toward the answer its author has already seen.
433+
434+
So the implementation, its controls and its **frozen digest** all precede the
435+
training collection. And its provenance is not softer than the instrument's:
436+
**code that decides admissibility must not have weaker provenance than code that
437+
starts the stopwatch.**
438+
439+
- if the implementation changes `perf_baseline.py` or any source covered by the
440+
**measurement-harness digest**, that digest moves — necessarily **before** any
441+
training data exists, never after
442+
- if it lives separately and the harness is untouched, that is equally fine, but
443+
its **own digest becomes a mandatory identity axis** for the fit, for the
444+
constant freeze and for the validation pair, exactly as the harness digest is
445+
446+
The required sequence, each numbered step a separate owner decision:
360447

361448
```text
362-
1. ratify this mechanism (docs only; this document)
363-
2. ratify the design constants q, M, R_runs,
364-
the N ladder, N_max, G (owner decision; no data consulted)
365-
3. preregister and authorise ONE
366-
calibration-only training collection (a measurement; NOT authorised here)
367-
4. fit per §3.3 per rung, select N per §3.4,
368-
freeze and commit the constants (deterministic; no new data)
369-
5. commit the validation protocol (before any validation data exists)
370-
6. run ONE fresh holdout pair (a measurement; NOT authorised here)
371-
7. verdict per §4
449+
1. mechanism RATIFIED (docs only; this document)
450+
2. implement pure policy / fitter / verdict (NO constant defaults anywhere)
451+
3. mutation + control review, exact-head CI (the implementation's own adversary)
452+
4. freeze policy-implementation digest
453+
AND measurement-harness digest (both, before any corpus exists)
454+
5. ratify the exact-rational design constants
455+
q, M, R_runs, the finite N ladder, G (owner decision; no data consulted)
456+
6. preregister the numeric training collection,
457+
bound to BOTH frozen digests (before it is run)
458+
7. separate authority -> ONE training collection (a measurement)
459+
8. deterministic fit per rung, select N per §3.4 (no new data)
460+
9. freeze the empirical constants (committed)
461+
10. commit the fresh holdout protocol (before any validation data)
462+
11. separate authority -> ONE validation pair (a measurement)
463+
12. four-way verdict per §4
372464
```
373465

374-
Steps 3 and 6 are measurements and neither is authorised by this document. Step 2
375-
precedes step 3 deliberately: design constants chosen after seeing the training
376-
corpus would be design constants chosen to flatter it.
466+
Step 2 carries **no constant defaults**: the fitter and the verdict function take
467+
`q`, `M`, `G`, `A_abs` and `R_rel` as required arguments with no fallback value,
468+
so the code physically cannot carry a number that no one ratified.
469+
470+
Steps 7 and 11 are measurements and neither is authorised by this document.
471+
Step 5 precedes step 6 deliberately: design constants chosen after seeing the
472+
training corpus would be design constants chosen to flatter it.
377473

378474
## 4. The holdout firewall
379475

@@ -507,7 +603,7 @@ it can record what it observed, and it must refuse rather than guess.
507603

508604
A GitHub-hosted Windows runner is already recorded as not measurement-grade — two
509605
runs minutes apart on one commit disagreed about their own environment — so the
510-
environment must be named explicitly in §4's protocol and in step 3's training
606+
environment must be named explicitly in §4's protocol and in the step 6 training
511607
preregistration.
512608

513609
### 6.6 Determinism and the re-run rule
@@ -547,17 +643,21 @@ Three binding consequences:
547643
```text
548644
policy mechanism frozen (this document, ratified)
549645
550-
design constants ratified (§3.2; before any corpus is collected)
646+
pure implementation written, mutation-reviewed, CI green
647+
648+
policy-implementation digest AND measurement-harness digest frozen
649+
650+
design constants ratified as exact rationals (§2.6, §3.2; no data consulted)
551651
552-
training collection preregistered + authorised + run (§3.5 step 3)
652+
training collection preregistered against both digests, authorised, run once
553653
554-
empirical constants frozen, N selected (§3.3, §3.4; deterministic)
654+
empirical constants frozen per rung, N selected (§3.3, §3.4; deterministic)
555655
556656
validation protocol committed (§4; before any validation data)
557657
558658
ONE fresh validation pair
559659
560-
verdict under §2 and the §6 contract
660+
four-way verdict under §2 and the §6 contract
561661
reproducible inconclusive / not-reproducible / invalid
562662
↓ ↓
563663
#263-A PASS owner decision / redesign
@@ -580,8 +680,7 @@ verdict under §2 and the §6 contract
580680
| `q` | quantile level in `(0, 1)` | owner ratification |
581681
| `M` | dimensionless, `> 1` | owner ratification |
582682
| `R_runs` | count, `≥ 2` | owner ratification |
583-
| the `N` ladder | ordered counts | owner ratification |
584-
| `N_max` | count | owner ratification |
683+
| the `N` ladder | finite ordered list of counts; last element is the mandatory stop | owner ratification |
585684
| `G` | dimensionless, `≥ 0` | owner ratification |
586685

587686
**Inherited — not set, not re-derived, not proposed here:** the noise-probe
@@ -594,11 +693,13 @@ where it will be visible.
594693

595694
## 10. What this proposal does not do
596695

597-
It does not authorise any measurement — not the training collection of §3.5 step
598-
3, not the validation pair of §4. It does not authorise an implementation. It
599-
does not re-record the stale sizing pairs, promote a calibration of record,
600-
freeze D7, unblock #263-B, merge, or start Stage 3 or Stage 4. It does not move
601-
any incumbent constant.
696+
It does not authorise any measurement — not the training collection at step 7,
697+
not the validation pair at step 11. It does not authorise the implementation at
698+
step 2 either: that is the next thing to be authorised, not something this
699+
document grants itself. It does not re-record the stale sizing pairs, promote a
700+
calibration of record, freeze D7, unblock #263-B, merge, or start Stage 3 or
701+
Stage 4. It does not move any incumbent constant, and it still contains no
702+
values.
602703

603704
It does not claim the instrument is frozen. It is a plan to find out, and every
604705
number it will eventually need is still missing on purpose.

docs/notes/p022-263a-instrument.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,42 @@ Round 6 declined to establish and named as its own alternative. A functional for
10891089
nobody has evidence for is not a repair, it is missing knowledge in mathematical
10901090
notation.
10911091

1092+
### The tie-break was fine; the sentence defending it was not
1093+
1094+
Revision 2 of the policy earned PASS WITH MECHANICAL CORRECTIONS: two P0 and two
1095+
P1, none of which changed the statistical model. Two are worth recording.
1096+
1097+
**Exact arithmetic said nothing about how a constant is written down.** The
1098+
document refused a floating-point LP solver on exactness grounds and then left
1099+
its constants as "a dimensionless number", so a committed decimal would be read
1100+
as a binary float by one implementation and as a rational by another, and the two
1101+
would disagree on every boundary case. Constants are now canonical integer pairs
1102+
— reduced, positive denominator — and reading one through a float is a refusal.
1103+
1104+
**A rule was good and its justification was false.** The lexicographic tie-break
1105+
(smallest `A_abs`, then smallest `R_rel`) was defended with "a tie is never
1106+
resolved in the direction that makes the gate easier to pass". The owner pointed
1107+
out that tied optimal lines can cross. They can: observations
1108+
`(8, 20), (8, 10), (3, 11)` at `q = 1/2` have two minimisers at equal loss,
1109+
`A_abs = 28/5, R_rel = 9/5` and `A_abs = 11, R_rel = 0`, and the rule picks the
1110+
first, which is **looser** for every `t > 3`. Found by search, not by argument,
1111+
after a first randomised sweep found nothing because its generator kept driving
1112+
ties onto the `R_rel = 0` boundary where the claim happens to hold — a reminder
1113+
that a search finding nothing is evidence about the search.
1114+
1115+
The rule survives unchanged as pure canonicalisation, which is all it was ever
1116+
needed for. Only the promise was removed. That is the sharpest form of this PR's
1117+
recurring lesson to date: not a broken check, but a working mechanism with a
1118+
sentence attached that quietly claimed more than the mechanism delivers — and
1119+
prose is where that is cheapest to write and hardest to test.
1120+
1121+
Also closed: the implementation now precedes the training data in the sequence,
1122+
because code written with the data already on disk can be nudged in a hundred
1123+
defensible small ways, and **code that decides admissibility must not have weaker
1124+
provenance than code that starts the stopwatch**. And `N_max` is gone; a finite
1125+
frozen ladder already ends somewhere, and a second maximum expresses nothing but
1126+
a future argument about which one wins.
1127+
10921128
### Both pairs are stale, and are not re-recorded
10931129

10941130
The digest moved from `2d6e52fe4352` to `6713e7300c7c`, and again to

0 commit comments

Comments
 (0)