docs(P4.5): torsdagens anker var arvet, og arvet gjorde det fail-open

§6 landet i 859be2a med frys-gatens to unntak (`docs/`, `CHANGELOG.md`)
kopiert inn i tag-ankeret. Unntakene er ikke generelle: de er begrunnet i
at ONSDAGEN skriver nøyaktig dem. Torsdag skriver ingenting, så riktig
forventning er IDENTITET — og arvet dit gjorde `docs/`-unntaket gaten
blind for den ene skriveren vi vet er aktiv i repoet, den parallelle
sesjonen som eier docs/presentasjon-portfolio-optimiser.html.

Samme klasse som da frys-gaten selv ble snudd fra positiv liste til
eksklusjonsform: en gate arvet uten at begrunnelsen ble re-utledet.

Ankeret er nå `git describe --tags --exact-match HEAD` -> `v1.0.0`.
MÅLT fail-closed begge veier: `no tag exactly matches '<sha>'` (exit 128)
når HEAD ikke er tagget, `bad revision` når taggen mangler. Ingen av dem
kan forveksles med grønt.

Feiler ankeret er det en BESKJED, ikke en abort: `git diff --stat
v1.0.0..HEAD` UTEN unntak skiller kjøresti-endring (-> §3) fra ren
`docs/` (demoen upåvirket, men da vitende).

Steg 1 var også et øyeblikksbilde, ikke en regel: «kun den fremmede
HTML-fila» slutter å stemme i det den sesjonen committer eller legger
igjen en fil til, og en gate som roper på noe operatøren ikke eier lærer
ham å ignorere gaten. Nå `git status --short --untracked-files=no`
-> TOMT (målt).

Lagt til én setning om at en `Resolved`/`Audited`/`Installed`-linje fra
uv er miljø-sjekken, ikke en feil — målt at `uv run` er STILLE på varmt
miljø (stderr = de fire linjene §1 beskriver), men en første kjøring for
dagen kan si fra.

Målt: utfyllings-gaten uendret på 3 · 810 passed / 4 skipped · ruff +
format + mypy rene · kalendertabellens pipe-telling intakt.

Planens to beskrivelser av gaten rettet i samme pass (P4.5-blokka +
tor-13-raden) — de beskrev et design som ikke lenger står.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0143ESVxVd5srp9PGshHCdi4
This commit is contained in:
Kjell Tore Guttormsen 2026-08-11 13:14:03 +02:00
commit 8e7fa54267
2 changed files with 43 additions and 18 deletions

View file

@ -424,12 +424,20 @@ bevisst to-trinns:
show-element **under** demoen, og kjørt der oppdager den regresjonen samtidig med publikum.
Samme defektklasse som frys-gaten (×1 → ×2) og CHANGELOG-datoen (lest på feil HEAD):
**kommandoen var riktig, tidspunktet var det ikke.** §6 flytter den til før rommet fylles og
legger til tag-ankeret `git diff --stat v1.0.0..HEAD` med de samme to unntakene som frys-gaten.
**Målt at ankeret er fail-CLOSED:** en manglende `v1.0.0` gir `fatal: bad revision` (exit 128),
ikke tomt — en gate mot en tag som ikke finnes kunne ellers vært stille grønn. Kommandoen står
fortsatt kun ÉN gang i dokumentet (§6 peker på §1-blokka), så det er ikke laget en andre kopi å
drifte fra. Ingen ny placeholder: utfyllings-gaten står uendret på 3. Tatt tirsdag med vilje —
onsdagen skal måle og utføre, ikke avgjøre.
legger til et tag-anker. **Ankeret er IDENTITET (`git describe --tags --exact-match HEAD`
`v1.0.0`), ikke frys-gatens diff-med-unntak** — og den forskjellen ble felt i review: de to
unntakene (`docs/`, `CHANGELOG.md`) var begrunnet i at *onsdagen* skriver nøyaktig dem. Torsdag
skriver ingenting, så arvet dit ville de gjort gaten **fail-OPEN mot den ene skriveren vi vet er
aktiv** — den parallelle sesjonen som eier `docs/presentasjon-portfolio-optimiser.html`. Samme
klasse som da frys-gaten selv ble snudd fra positiv liste til eksklusjonsform.
**Målt fail-closed begge veier:** `no tag exactly matches '<sha>'` (exit 128) når HEAD ikke er
tagget, `bad revision` når taggen ikke finnes. Feiler den, er den en BESKJED: `git diff --stat
v1.0.0..HEAD` **uten unntak** viser hva som landet — kjøresti-filer = abort til §3, kun `docs/` =
demoen upåvirket, men da vitende. Steg 1 er likeledes en REGEL, ikke et øyeblikksbilde
(`--untracked-files=no` → TOMT), så den fremmede HTML-fila ikke lærer operatøren å ignorere gaten.
Kommandoen for selve outputen står fortsatt kun ÉN gang i dokumentet (§6 peker på §1-blokka), så
det er ikke laget en andre kopi å drifte fra. Ingen ny placeholder: utfyllings-gaten står uendret
på 3. Tatt tirsdag med vilje — onsdagen skal måle og utføre, ikke avgjøre.
**Utfyllingen er gjort til et SJEKKET steg, ikke et husket:** tre greppbare placeholders, og grep-en
er **selv-sikker** — mønsteret `'<<[A-ZÆØÅ-]*>>'` matcher ikke sin egen tekst (målt: 3 treff, ingen
av dem kommandolinjene i dokumentet). Et uutfylt felt er samme drift-klasse som plan-radene økt 4,
@ -516,7 +524,7 @@ og risikoen ligger tidlig med slakk bak seg.
| man 10. | **SYV ØKTER, alle ✔.** (1) **Generalprøve nr. 0** — kjørt mot **LEVERT VEGLYS-FV-SOER, ikke reserven**: P3 falt to døgn før fristen, så prøven målte demoinnholdet selv. Se UTFØRT-blokka under tabellen. (2) **S1.c synk + CHANGELOG** (`a41272d`) — forskuttert fra ons kveld; TAGGEN gjenstår, frys-gatet. (3) **`open/`-beslutningen TATT** — taggen til `origin` ALENE; speilet til P5-vinduet (se S1.c-raden i §0). (4) **Planen gjort sann** (`c9787cf`) — to `open/`-instrukser felt, P2 lukket, kalenderen rettet. (5) **Frysedagens to udefinerte steg lukket****P4 ✔** (fersk klon re-målt på `c9787cf`, elleve commits etter forrige måling) og **FRYS gjort kjørbar** (frys-blokka under). (6) **Persona-pullen landet** (`71b7b66`+`d0e8bb0`) — commons svarte to døgn før fristen, så tirsdagens eneste punkt ble tatt mandag; fasiten re-målt mot en prediksjon skrevet FØR pullen. **Ingenting kodemessig gjenstår før onsdag, og tirsdagen er tom.** (7) **P4.5-runbooken SKREVET** (`c7a57d8`) — beslutnings-innholdet forskuttert fra onsdag (gaten dekker målingene, ikke forfatterskapet), inkludert **mandat-setningen som aldri fantes som tekst**; onsdag fyller tre målte felt. Vedlegget felte tre «scene-kosmetiske» STATE-premisser: ingen av dem er synlige på skjermen (målt). **Frysen ble VURDERT flyttet fram og bevisst IKKE flyttet** — onsdag er en dato-beslutning på en enveis-handling, og risikoen den ville hedget er retirert av økt 6 (samme kjøresti målt grønn; `d0e8bb0..HEAD` er dokumenter alene). |
| tir 11. | **IKKE TOM — TRE ØKTER (8, 9, 10), alle måling/dokument, null kodeendring.** Frysen ble VURDERT flyttet fram og bevisst IKKE flyttet: **et frysevindu er en forpliktelse, ikke slakk** — å tagge tirsdag ville forbudt kjørestien et døgn lenger og gjort ethvert onsdagsfunn til en `v1.0.1`-beslutning på demo-aften. Tirsdagen er verdt mer som **lovlig-fiks-dag**. (8) generalprøve som PRØVE, alt grønt på `818b55a`; X bevisst IKKE notert; pre-flight mot stale tag ren. (9) runbookens §2 målt mot fasiten — 67 påstander + hver kommando kjørt, null feil; §1s stderr felte én defekt (`/tmp/po-sim-…` kan aldri vises, `TMPDIR` = `/var/folders/…/T/`). (10) **runbookens §6 — torsdagens pre-flight — tilføyd** (se P4.5). *(Raden sa «TOM — GÅ RETT PÅ ONSDAG»; det var sant da den ble skrevet man 10. og sluttet å være det samme uke. Samme drift-klasse som radene økt 4, 5 og 6 hver for seg fant.)* *(Amendert man 10. økt 6: tirsdagens ENESTE åpne punkt var commons-svaret på persona-formuleringen — «i kontorbygg» på et veglys-prosjekt, printet ordrett i Steg 7. Svaret kom **to døgn før fristen** og ble tatt samme dag: subtree pull av commons `73136eb` → «i tilsvarende anlegg», `marker` byte-uendret (`71b7b66`), fasiten re-målt (`d0e8bb0`). Abortstien I4 ble aldri utløst — men den ble verifisert KJØRBAR først: `git reset --hard` blokkeres av hooken, **`--keep` slipper**. Rød-settet etter pullen var NØYAKTIG én test, det pinnede transkriptet; goldenene (kriterium 8) uendret; `pyproject.toml`/`uv.lock` urørt. Denne raden instruerte om arbeid som var utført — samme drift-klasse som økt 4 felte.)* |
| ons 12. | **FRYSESEKVENSEN, i denne rekkefølgen. P4 ER LUKKET (man 10., økt 5 — fersk-klon-målingen var det eneste som gjensto, og den er kjørt på `c9787cf`), så sekvensen starter på prøven, ikke på en udefinert re-måling:** **generalprøve ×2** (bruk **distinkt**-tellingen `grep -oE "^ *Steg [1-8]" \| tr -d ' ' \| sort -u \| wc -l`**8**; linje-tellingen gir 9, se avviket under tabellen) → **FRYS****P4.5: FYLL UT demo-runbooken** (`docs/plan/2026-08-12-demo-runbook.md` — den er SKREVET man 10. økt 7, `c7a57d8`; onsdag setter inn tre målte felt og krysser av sjekklista i §5. Utfyllings-gaten: `grep -n '<<[A-ZÆØÅ-]*>>' docs/plan/2026-08-12-demo-runbook.md` → TOMT) → **S1.c-TAGGEN sist** (CHANGELOG-stempel + `git tag v1.0.0` + push til **`origin` ALENE** — synk + CHANGELOG-innhold er alt gjort man 10.; `[project.scripts]` lå i helgen, I3). **Alle beslutninger er tatt på forhånd — onsdag skal MÅLE og UTFØRE, ikke avgjøre.** **FRYSEN ER TO KOMMANDOER, ikke en holdning — se frys-blokka under tabellen.** |
| tor 13. | **DEMO = v1 vises** (runbooken i hånda). **FØRST runbookens §6 — pre-flighten, før noen er i rommet:** rent tre · tag-ankeret `v1.0.0..HEAD` TOMT (`fatal: bad revision` er IKKE grønt) · golden-diffen TOM. Ikke tom = §3, vis fasit-fila; ikke debug. *(Tilføyd tir 11. — golden-transkriptet ble bygget for å fange regresjon onsdag→torsdag, men kommandoen sto som et show-element UNDER demoen; kjørt der oppdager den regresjonen samtidig med publikum.)* |
| tor 13. | **DEMO = v1 vises** (runbooken i hånda). **FØRST runbookens §6 — pre-flighten, før noen er i rommet:** rent tre (`git status --short --untracked-files=no` → TOMT) · tag-ankeret `git describe --tags --exact-match HEAD`**`v1.0.0`** (IDENTITET, ikke frys-gatens diff-med-unntak — de unntakene er onsdagens, og arvet hit ville de vært fail-open mot den parallelle `docs/`-sesjonen) · golden-diffen TOM. Feiler ankeret: les `git diff --stat v1.0.0..HEAD` UTEN unntak — kjøresti-filer = §3, kun `docs/` = upåvirket men vitende. Golden-diff ikke tom = §3, vis fasit-fila; aldri debugging på scenen. *(Tilføyd tir 11. — goldenen ble bygget for å fange regresjon onsdag→torsdag, men kommandoen sto som et show-element UNDER demoen; kjørt der oppdager den regresjonen samtidig med publikum.)* |
| fre 14.lør 15. | **P5**: README (O4) |
| deretter | **P6 → P7 → P8 → P9**, ett punkt per økt; STATE.md peker på øverste åpne |

View file

@ -231,31 +231,48 @@ seg over natta (egnethetsreview-planen pkt. 3). Kommandoen som gjør det står a
går på — ikke som et show underveis.** Samme kommando, annet tidspunkt, helt annen jobb: kjørt på
scenen oppdager den regresjonen samtidig med publikum.
**1 — Riktig katalog, rent tre**
**1 — Rent tre**
```
git status --short
git status --short --untracked-files=no
```
Forventet: **kun** `?? docs/presentasjon-portfolio-optimiser.html` (den fila eies av en annen sesjon
og er utracket med vilje). Flere linjer = noe har flyttet seg; les hva det er før du gjør noe annet.
Forventet: **TOMT** (målt). Utrackede filer holdes bevisst utenfor: `docs/presentasjon-portfolio-optimiser.html`
eies av en annen sesjon, og en gate som roper på den lærer deg å ignorere gaten. Kommer det linjer
her, er det **sporet** innhold som har endret seg — les hva før du gjør noe annet.
**2 — Treet du kjører ER treet som ble tagget**
**2 — Treet du kjører ER det taggede**
```
git diff --stat v1.0.0..HEAD -- . ':(exclude)docs/' ':(exclude)CHANGELOG.md'
git describe --tags --exact-match HEAD
```
Forventet: **TOMT**. Samme gate som onsdag, nå med taggen som anker i stedet for X.
**`fatal: bad revision` (exit 128) er IKKE en grønn gate** — det betyr at `v1.0.0` ikke finnes her,
altså at onsdagens siste steg ikke landet. Målt: en manglende tag feiler høylytt, den returnerer
ikke tomt. Unntakene er de samme to som onsdag, av samme grunn: `docs/` og `CHANGELOG.md` er det
eneste som lovlig kan ha landet etter taggen.
Forventet: **`v1.0.0`**. Torsdag skriver ingenting, så forventningen er **IDENTITET** — ikke
frys-gatens «tom modulo `docs/` og `CHANGELOG.md`». De to unntakene var begrunnet i at *onsdagen*
skriver nøyaktig dem; arvet hit ville de gjort gaten blind for den ene skriveren vi vet er aktiv i
repoet (den parallelle sesjonens `docs/`-fil).
**Feiler den, er det en BESKJED — ikke nødvendigvis en abort.** Målt: uten tag på HEAD sier git
`fatal: no tag exactly matches '<sha>'` (exit 128); finnes ikke taggen i det hele tatt, sier den
`fatal: bad revision` — da landet ikke onsdagens siste steg. Begge feiler høylytt; ingen av dem kan
forveksles med grønt. Les så hva som faktisk landet:
```
git diff --stat v1.0.0..HEAD
```
**Ingen unntak her, med vilje.** Rører det `src/`, `tests/`, `shared/`, `pyproject.toml` eller
`uv.lock`**ikke kjør demoen fra dette treet**, gå til §3. Er det bare `docs/`, er demoen
upåvirket — men da *vet* du det, i stedet for å ha hatt en gate som tidde.
**3 — Outputen er fortsatt den frosne**
Kjør blokka i §1 («Hvis du vil vise at outputen er den frosne»). Forventet: `diff` **TOMT**.
*(Skriver `uv` en `Resolved`/`Audited`/`Installed`-linje før programmet starter, er det miljø-sjekken
sin og ikke en feil. Målt på varmt miljø er `uv run` stille — stderr er de fire linjene §1 beskriver
— men en første kjøring for dagen kan si fra. Det er ingen grunn til abort.)*
**Er 3 ikke tom: ikke debug — gå til §3.** Forskjellen er at du vet det på forhånd, så «dette er den
frosne kjøringen, sjekket inn som fasit» blir en planlagt setning i stedet for en redning.