docs(invarianter): the first screen, and the substring that was never a guard

The round binder's row gets its two corrected denominators, and the first screen gets a row of
its own: what survived, why none of it was a code defect, and why that makes "red first"
impossible to satisfy with a commit rather than with a mutant run.

The 7-type sentence said "en ekte kjøring" and measured four archived runs. Re-counted: `run.py`
calls TEN of outbox.py's ten writers, so five more types exist; and the union over every outbox
in this repo with exactly one coverage (15 directories, of 25 coverage files in 20 directories)
is also 7. Seven is the floor the measurement gives, not a ceiling — the binder copies on a glob,
not on that list.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-19 20:51:43 +02:00
commit e71d248f02
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q

View file

@ -3142,13 +3142,19 @@
Ingen av dem overlevde fordi koden var gal — binderen gjorde alle sju riktig. De overlevde fordi Ingen av dem overlevde fordi koden var gal — binderen gjorde alle sju riktig. De overlevde fordi
ingen arm så etter: `grep` på sitat- og kostnadslinje-ord ga 2 treff i 709 testlinjer, begge i ingen arm så etter: `grep` på sitat- og kostnadslinje-ord ga 2 treff i 709 testlinjer, begge i
fixturen, null i en assert. En uvitnet søm er en søm neste endring kan slette gratis. To fixturen, null i en assert. En uvitnet søm er en søm neste endring kan slette gratis. To
fixturfeil gjorde tre av dem uoppnåelige, ikke bare umålte. **(1) Nevneren var 3 av 7.** En ekte fixturfeil gjorde tre av dem uoppnåelige, ikke bare umålte. **(1) Nevneren var 3 av 7.** Kjøringene som er MÅLT legger
kjøring legger igjen SJU artefakt-typer, talt over de fire arkiverte kjøringene sjekkpunktet igjen SJU artefakt-typer — ikke «en ekte kjøring», som lovet mer enn målingen (RETTET 19.09:
`run.py` kaller TI av `outbox.py`s ti skrivere, så `exploration`, `prepass`, `multibase`,
`plan-review` og `proposal-reviews` er fem typer til, skrevet når flaggene som lager dem er
gitt; ingen av dem ligger i dag i en utboks som også har coverage. Sju er gulvet målingen gir,
ikke et tak — og binderen kopierer på glob, ikke på denne lista, så en type utenfor den bæres
uansett). Talt over de fire arkiverte kjøringene sjekkpunktet
leste (`tunnel-hauglia-2027` -04/-06/-07/-08; hver `<run_id>-<rest>.json` typet som leste (`tunnel-hauglia-2027` -04/-06/-07/-08; hver `<run_id>-<rest>.json` typet som
`proposal`/`outcome` når `<rest>` ender der, ellers `<rest>` selv): `-06`, `-07` og `-08` har `proposal`/`outcome` når `<rest>` ender der, ellers `<rest>` selv): `-06`, `-07` og `-08` har
alle sju (15 filer hver), `-04` har seks (12 filer, ingen `parse-failures` — den skrives bare når alle sju (15 filer hver), `-04` har seks (12 filer, ingen `parse-failures` — den skrives bare når
noe ikke parset, så FRAVÆRET er signalet). Union = 7, skrevet av TO kommandoer: `run.py` seks, noe ikke parset, så FRAVÆRET er signalet). Union = 7, skrevet av TO kommandoer: `run.py` seks,
`stress.py` `-verdict.json`. **(2) Hvert forslag bar samme sitat-stempel**, så «1 av 1 siterte `stress.py` `-verdict.json`. Talt om igjen 19.09 over HVER utboks i repoet med nøyaktig én
coverage — 15 kataloger, av 25 coverage-filer i 20 kataloger — er unionen 7 der også. **(2) Hvert forslag bar samme sitat-stempel**, så «1 av 1 siterte
steder» kunne ikke skille et droppet antall fra et beholdt; fixturen gir nå hvert forslag sitt steder» kunne ikke skille et droppet antall fra et beholdt; fixturen gir nå hvert forslag sitt
eget antall. Fire ting er NY atferd, alle røde på ASSERT først: **hengende symlenke** som eget antall. Fire ting er NY atferd, alle røde på ASSERT først: **hengende symlenke** som
rundekatalog avvises med grunn og exit 1 (`exists()` FØLGER lenka, så den hengende svarte False, rundekatalog avvises med grunn og exit 1 (`exists()` FØLGER lenka, så den hengende svarte False,
@ -3169,6 +3175,29 @@
coverage-skriver kunne lage. Fixturens avviste rad bærer et beløp MED VILJE — målt på de samme coverage-skriver kunne lage. Fixturens avviste rad bærer et beløp MED VILJE — målt på de samme
fire utboksene har hver `rejected`-rad `saving_nok = None`, så vakten sikter mot en skriver som fire utboksene har hver `rejected`-rad `saving_nok = None`, så vakten sikter mot en skriver som
ikke finnes ennå, og en fixtur som ikke kan lage tallet kan ikke vitne om vakten. ikke finnes ennå, og en fixtur som ikke kan lage tallet kan ikke vitne om vakten.
- **Rapportens FØRSTE SKJERM er voktet ord for ord, og en delstreng er ikke lenger en vakt
(19.09, rundebinderens to siste uvoktede utsagn):** PM-sjekkpunktet fant to overlevende mutanter
i nøyaktig det en fagperson leser FØRST. Begge er reprodusert som OVERLEVENDE mot de 40 armene
før noe ble skrevet: **domsordet** (`_status_word`, «rejected» → «validert») og **kroner per
tiltak** (overskriftens beløp kuttet til hel krone). Jeg plantet åtte til mot samme skjerm —
**8 av 10 overlevde**: ordet droppet helt, etiketten paret med NESTE rads ord, `not_evaluated`
lest som «avvist», `unsupported` lest som «validert», antallet kommisjonen ba om av med én, og
overskriftens «kroner» byttet til «kr». Ingen av dem var en kodefeil — binderen gjorde alle ti
tingene riktig — og **derfor kan ingen av de tre nye armene være RØD ved HEAD**: det finnes
ingen fiks å være rød før. Beviset er mutantkjøringen, ikke commiten: **12 av 12 felt, hver på
en AssertionError om atferd, 0 på import/AttributeError**, kontroll 43 av 43.
**ÅRSAKEN VAR MÅLT, IKKE GJETTET:** `«60 000,01» in text` traff også «Berørte
kostnadslinjer»-linja, som bygges av `unit_cost` og som mutanten ikke rørte. Talt over fixturens
egen rapport har **4 av 11 positive delstreng-assert-steder** i fila nåla på MER ENN ÉN linje;
**3 av de 4** var asserts om ÉN bestemt av dem. De tre er nå sammenligninger av HELE linja
(`- **{etikett}** — {ord}`, `### {etikett} — {beløp} kroner`, `### {etikett} — falt på …`), den
fjerde påstår bare tilstedeværelse og måler tilstedeværelse. **Ordforrådet er pinnet til
MANDATETS egen statusliste** (`ApproachOutcome.status`, fire verdier), slik scene-ordforrådet er
pinnet til validatorens: `_status_word` faller tilbake på `str(row["status"])`, så en status lagt
til der uten ord her når fagpersonen som en bar engelsk id. Ordene skrives ut i testfila, aldri
importert fra binderen — og «validert» er et PREFIKS av «validert, men uten erklært krav», som er
selve grunnen til at ingen delstreng-assert kan skille dem.
- **Et forslag uten tilnærmingens EGEN erklæring kan ikke bære `validated` (rad 6, 17.09):** målt - **Et forslag uten tilnærmingens EGEN erklæring kan ikke bære `validated` (rad 6, 17.09):** målt
på stressrunde 6 hadde alle 10 validerte tilnærmingene bare kjørings-erklæringer, som ingen kan på stressrunde 6 hadde alle 10 validerte tilnærmingene bare kjørings-erklæringer, som ingen kan
knytte til én tilnærming — og tre falsifiseringsarmer validerte. `declare_requirement` tar derfor knytte til én tilnærming — og tre falsifiseringsarmer validerte. `declare_requirement` tar derfor