docs(P4.5): taggens FORM var onsdagens siste ufattede beslutning

Punkt 10 sa `git tag v1.0.0` — lettvekts. Repoets eneste andre tag er
ANNOTERT (målt: `git cat-file -t v0.1.0` → `tag`, melding
`v0.1.0 — first tagged release`), så hovedreleasen ville blitt den eneste
taggen uten forfatter, dato eller melding. Ingen gate ville stoppet det:
`describe --tags` og `tag -l` svarer likt for begge former (målt).

Onsdagen skal MÅLE og UTFØRE, ikke avgjøre. Slik den sto, måtte dagen
enten tagge lettvekts uten å se avviket, eller oppdage det og improvisere
en `-m`-melding på en enveis-dag. Meldingen står nå literalt i §5 punkt 10
— og KUN der; planens to rader peker dit, så det finnes ingen andre kopi
å drifte fra. Utfyllings-gaten står derfor fortsatt på 2: en placeholder
ville gjort meldingen til et tredje felt onsdag måtte fylle.

Formen er tørrkjørt i et engangs-repo, ikke resonnert: `-a` med em-dash gir
`tag -l` → v1.0.0, `describe --tags --exact-match HEAD` → v1.0.0, filtrert
`ls-remote` → 1 linje, og em-dashen overlevde skallet.

MIN FØRSTE HYPOTESE VAR FEIL, OG MÅLINGEN FELTE DEN: jeg trodde punkt 11s
«én linje» brakk for annoterte tagger, siden `ls-remote --tags origin` viser
den peelede `^{}`-refen. Målt mot EKTE origin: MED refspec-filter gir den
annoterte v0.1.0 én linje — `^{}` matcher ikke pattern-et. Punkt 11 var
robust hele tiden. Presisert i teksten, fordi neste leser vil ha samme tvil.

EN ANDRE DEFEKT FALT UT AV Å MÅLE MOT EKTE REMOTE: origin rate-limiter SSH
på burst. Målt: de to første ls-remote gikk igjennom, de fire neste ga
`Connection refused`, porten svarte igjen etter en pause, og Forgejo-weben
var oppe hele tiden (HTTP 303) — serveren var aldri nede. Punkt 11 kjører
to SSH-kall rett etter en push, altså nøyaktig et burst.

Alvorligheten ligger i at BEGGE utfall gir null linjer på stdout (målt):
taggen mangler = exit 0 + tom stderr; kom ikke fram = exit 128 + melding.
Et `| wc -l` kan ikke skille dem — så en rate-limitet bekreftelse leses som
«taggen landet ikke» dagen etter at push-en faktisk lyktes, på enveis-dagen.
Diskriminatoren er exit-koden; retteslen er vent-og-kjør-på-nytt, aldri
re-push eller re-tag. Samme klasse som §5 punkt 5s arm: en gate må kunne
feile på riktig grunn, og de to måtene den svikter på må se ulike ut.

Ingen nye punkter, ingen renummerering: begge endringene sitter PÅ punkt 10
og 11. Målt: §5 fortsatt elleve punkter · utfyllings-gaten 2 · CHANGELOG
urørt ([Unreleased] = 1, null link-refs) · kun to diff-hunks, begge i §5, så
§0/§1/§2/§3/§4/§6 er byte-urørt og økt 9s 67 målinger av §2 står · planens
to rader uendret i linjeantall og pipe-struktur (5/0 og 6/3, før = etter) ·
frys-gaten mot HEAD TOM og diskriminerende (c255662 = 6 filer).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nZQkAJytbaUAYxMAU2wk7
This commit is contained in:
Kjell Tore Guttormsen 2026-08-11 22:17:29 +02:00
commit 2319f04420
2 changed files with 26 additions and 3 deletions

View file

@ -37,7 +37,7 @@ inventaret i `2026-08-06-v1-inventory.local.md`) + to lukkinger + release-kuttet
|---|---|---|---|
| S1.a = **P1** | Steg 7-innboksen inn i demoløpet | 1 økt | ærlig etikett (0,1 økt) |
| S1.b = **P2** | Innholdsgaten (Spor B) **✔ (2026-08-09, `c255662`)** — alle seks kriterier grønne; 801 → 810 tester. **JA-varianten** i ærlighets-teksten gjelder dermed. | 12 økter | NEI-varianten i ærlighets-teksten (ferdigskrevet) — **ikke i bruk** |
| S1.c (ny) | **Release-kuttet:** versjon `1.0.0` synket FIRE steder (`pyproject`/`__init__`/`uv.lock`/`test_smoke`) + CHANGELOG (`[Unreleased]` → 1.0.0; Steg-5-API-endringen står alt der) + tag `v1.0.0` ETTER grønn generalprøve. **⚠️ «PÅ BEGGE REMOTES» ER FELT (2026-08-10) — TAGGEN GÅR TIL `origin` ALENE.** `open/`-speilet mangler 26 commits (**53 filer / 6087 innsettelser**, målt: `open/main` = `520e741` = `v0.1.0`), så en tag DER er ikke en tag-operasjon men en **offentlig publisering** — og eksponerings-gjennomgangen viste at den krever **seks plandokument-beslutninger**: `2026-08-06-intensjons-qa` + `2026-08-06-demo-uke-plan` (åpen sak, stående anbefaling NEI) pluss FIRE aldri vurdert (`2026-08-07-planrevisjon-prompt`, `2026-08-09-egnethetsreview-plan`, `2026-08-09-fable-egnethetsreview-prompt`, `2026-08-09-innholdsgate-og-aerlighet`). Seks publiseringsbeslutninger på frysedagen er nøyaktig det denne planen forbyr. **Speilet synkes i P5-vinduet**, med READMEen som forklarer commitene — kode publisert foran sin README leser som forlatt. **Onsdag er dermed ETT trekk: CHANGELOG-stempel + `git tag v1.0.0` + `git push origin v1.0.0`.** *(`[project.scripts]` er flyttet videre til P4 pkt. 5 i HELGEN (I3): en ny entry point endrer install-flaten, så den må ligge FØR fresh-clone-målingen — aldri på frysedagen.)* **SYNK + CHANGELOG ✔ (2026-08-10, `a41272d`) — forskuttert fra ons kveld; TAGGEN gjenstår, frys-gatet.** Overskriften står bevisst på `[Unreleased]`: STATE hjemler innholdet nå, ikke release-stempelet, og et forhåndsdatert `[1.0.0] - <dato>` ville påstått en hendelse som ikke har skjedd. Ingen test leser CHANGELOG (målt), så paret er ikke maskin-gatet. Tag-dagen = ETT trekk: døp om overskriften, stemple dato, tagge. **«ETT trekk» er MÅLT (2026-08-10), ikke antatt:** `grep -c '^## \[Unreleased\]$' CHANGELOG.md`**1** (verbatim og unik; kun to `## `-overskrifter, og `## [0.1.0] - 2026-08-06` er historikk), og **ingen link-refs** nederst (`grep -nE '^\[.+\]:'` → tomt) som måtte følges med. Bar en dato, eller stod overskriften to steder, ville «det ene trekket» blitt improvisasjon på frysedagen. **Re-locken ble gatet, ikke antatt:** `uv lock` kjørt EKSPLISITT og diffet FØR noen test, ellers ville neste `uv run` re-locket usynlig mot en range-dep mens de to `ExperimentalWarning`-linjene er byte-pinnet i stderr-goldenen. Diffen = kun versjonslinja. **Målt at fire ER alle:** ingen README-badge; CHANGELOG-ens `[0.1.0]` er historikk. | 0,50,75 økt (ons kveld) | tag fredag i stedet — aldri tag før grønn generalprøve |
| S1.c (ny) | **Release-kuttet:** versjon `1.0.0` synket FIRE steder (`pyproject`/`__init__`/`uv.lock`/`test_smoke`) + CHANGELOG (`[Unreleased]` → 1.0.0; Steg-5-API-endringen står alt der) + tag `v1.0.0` ETTER grønn generalprøve. **⚠️ «PÅ BEGGE REMOTES» ER FELT (2026-08-10) — TAGGEN GÅR TIL `origin` ALENE.** `open/`-speilet mangler 26 commits (**53 filer / 6087 innsettelser**, målt: `open/main` = `520e741` = `v0.1.0`), så en tag DER er ikke en tag-operasjon men en **offentlig publisering** — og eksponerings-gjennomgangen viste at den krever **seks plandokument-beslutninger**: `2026-08-06-intensjons-qa` + `2026-08-06-demo-uke-plan` (åpen sak, stående anbefaling NEI) pluss FIRE aldri vurdert (`2026-08-07-planrevisjon-prompt`, `2026-08-09-egnethetsreview-plan`, `2026-08-09-fable-egnethetsreview-prompt`, `2026-08-09-innholdsgate-og-aerlighet`). Seks publiseringsbeslutninger på frysedagen er nøyaktig det denne planen forbyr. **Speilet synkes i P5-vinduet**, med READMEen som forklarer commitene — kode publisert foran sin README leser som forlatt. **Onsdag er dermed ETT trekk: CHANGELOG-stempel + `git tag -a v1.0.0` + `git push origin v1.0.0`.** **Taggen er ANNOTERT (tir 11. økt 14, målt):** repoets eneste andre tag er det (`git cat-file -t v0.1.0``tag`, melding `v0.1.0 — first tagged release`), så en lettvekts `v1.0.0` ville gjort hovedreleasen til den eneste taggen uten forfatter, dato eller melding. **Meldingsteksten står literalt ÉTT sted — runbookens §5 punkt 10** — så den verken improviseres på enveis-dagen eller får en andre kopi å drifte fra. Formen er tørrkjørt i eget engangs-repo; ingen av de tre bekreftelses-kommandoene i punkt 11 endrer forventning av `-a`. *(`[project.scripts]` er flyttet videre til P4 pkt. 5 i HELGEN (I3): en ny entry point endrer install-flaten, så den må ligge FØR fresh-clone-målingen — aldri på frysedagen.)* **SYNK + CHANGELOG ✔ (2026-08-10, `a41272d`) — forskuttert fra ons kveld; TAGGEN gjenstår, frys-gatet.** Overskriften står bevisst på `[Unreleased]`: STATE hjemler innholdet nå, ikke release-stempelet, og et forhåndsdatert `[1.0.0] - <dato>` ville påstått en hendelse som ikke har skjedd. Ingen test leser CHANGELOG (målt), så paret er ikke maskin-gatet. Tag-dagen = ETT trekk: døp om overskriften, stemple dato, tagge. **«ETT trekk» er MÅLT (2026-08-10), ikke antatt:** `grep -c '^## \[Unreleased\]$' CHANGELOG.md`**1** (verbatim og unik; kun to `## `-overskrifter, og `## [0.1.0] - 2026-08-06` er historikk), og **ingen link-refs** nederst (`grep -nE '^\[.+\]:'` → tomt) som måtte følges med. Bar en dato, eller stod overskriften to steder, ville «det ene trekket» blitt improvisasjon på frysedagen. **Re-locken ble gatet, ikke antatt:** `uv lock` kjørt EKSPLISITT og diffet FØR noen test, ellers ville neste `uv run` re-locket usynlig mot en range-dep mens de to `ExperimentalWarning`-linjene er byte-pinnet i stderr-goldenen. Diffen = kun versjonslinja. **Målt at fire ER alle:** ingen README-badge; CHANGELOG-ens `[0.1.0]` er historikk. | 0,50,75 økt (ons kveld) | tag fredag i stedet — aldri tag før grønn generalprøve |
**Andre repo — hva som faktisk MÅ gjøres der (målt, ikke antatt):**
- **commons:** energieksemplet MED `cost-baseline.json` — ALLEREDE bestilt (frist tir 11.,
@ -566,7 +566,7 @@ og risikoen ligger tidlig med slakk bak seg.
| lør 8.søn 9. | **P2/S1.b**: innholdsgaten (økt 2, evt. 3) + **P4-forskuddet UTVIDET** (0,751,25 økt), i denne rekkefølgen: forankret prøvekjøring + 10 %-prøven (pkt. 0, I1) **✔ 08-09** → `[project.scripts]` (pkt. 5, I3) → stderr-demping FØR pinning (pkt. 2, I2) → fresh-clone (pkt. 1) → golden-transkript-mekanikk (pkt. 3) → de to ærlighets-setningene (pkt. 4) — alt bygges og måles mot den FORANKREDE mikro-reserven NÅ |
| 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~~ **to** målte felt (tag-feltet felt tir 11. økt 12 — det var sirkulært). 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 — SEKS ØKTER (8, 9, 10, 11, 12, 13), 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). (11) **to en-linjes herdinger av onsdagen/torsdagen:** §5 manglet en **arbeidstre-sjekk ved X** (frys-gaten er commit-til-commit, prøven leser treet — en ucommittet `src/`-endring ville gjort X til en beskrivelse av noe som aldri ble prøvd, usynlig for BEGGE gate-kjøringene), og **§3s abortsti brukte relativ sti** til fasit-fila, altså feilet av nøyaktig den «feil katalog»-årsaken prosaen selv navngir (målt). Frysen er nå **tre** kommandoer. (12) **§0s tag-felt var SIRKULÆRT og §5s haker var tvillingen** — feltet kunne først fylles etter §5s siste punkt, mens punkt 6 krever at gaten er tom; hakene settes i fila, og punkt 710 skjer etter runbook-commiten `Y`. Begge utveier gjorde en av **torsdagens** to gater rød (ucommittet → §6 steg 1; commit etter taggen → §6 steg 2s identitet). Tag-raden fjernet, ellevte §5-punkt bekrefter taggen der den settes, hakene forlot fila. Se P4.5-amendementet. (13) **§5s punkt 5 var en gate som ikke kunne feile** — `<X>` **er** HEAD der, så `<X>..HEAD` er tom per konstruksjon (målt med en endret `src/`-fil i treet: fortsatt tom). Den målte altså ingen tilstand, mens økt 7s begrunnelse sa «en tilstand som ikke lenger finnes». Punktet beholdt (fjerning ville renummerert elleve punkter og brutt fem kryssreferanser på frys-eve), men gitt en **andre arm** mot fast hash `c255662` → ikke tomt (6 filer), som beviser at kommandoen kan diskriminere før punkt 9 hviler på at den er tom — uten den ville en ødelagt pathspec gitt grønt på feil grunnlag. Punkt 9s tilbakereferanse og §5s ingress rettet i samme pass. Se frys-blokkas økt-13-amendement. *(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 **to** målte felt (X + prøve-tidspunkt) og følger §5s **elleve** punkter i terminalen — **hakene settes ALDRI i fila**, og taggen bekreftes i punkt 11, ikke som et felt i §0; begge deler ville krevd en skriving etter taggen og gjort torsdagens identitets-anker rødt (tir 11. økt 12). 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 TRE PUNKTER, ikke en holdning — se frys-blokka under tabellen** (rent tre → noter X → gaten; arbeidstre-sjekken tilføyd tir 11. økt 11, fordi gaten er commit-til-commit og prøven leser treet). Punkt 3 er **to armer** siden økt 13 — kjøringen mot `<X>` er tom per konstruksjon og beviser ingenting alene; diskriminerings-armen mot `c255662` er den som gjør den siste gate-kjøringen meningsfull. |
| 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 **to** målte felt (X + prøve-tidspunkt) og følger §5s **elleve** punkter i terminalen — **hakene settes ALDRI i fila**, og taggen bekreftes i punkt 11, ikke som et felt i §0; begge deler ville krevd en skriving etter taggen og gjort torsdagens identitets-anker rødt (tir 11. økt 12). Utfyllings-gaten: `grep -n '<<[A-ZÆØÅ-]*>>' docs/plan/2026-08-12-demo-runbook.md` → TOMT) → **S1.c-TAGGEN sist** (CHANGELOG-stempel + `git tag -a v1.0.0`**ANNOTERT**, som `v0.1.0`; meldingen står literalt i runbookens §5 punkt 10 og skal ikke skrives på nytt her — + push til **`origin` ALENE** — synk + CHANGELOG-innhold er alt gjort man 10.; `[project.scripts]` lå i helgen, I3). **Punkt 11s bekreftelse tåler nå en rate-limitet `origin`** (tir 11. økt 14, målt): tom utskrift er tvetydig, og exit-koden er det som skiller «taggen mangler» (0) fra «kom ikke fram» (128). **Alle beslutninger er tatt på forhånd — onsdag skal MÅLE og UTFØRE, ikke avgjøre.** **FRYSEN ER TRE PUNKTER, ikke en holdning — se frys-blokka under tabellen** (rent tre → noter X → gaten; arbeidstre-sjekken tilføyd tir 11. økt 11, fordi gaten er commit-til-commit og prøven leser treet). Punkt 3 er **to armer** siden økt 13 — kjøringen mot `<X>` er tom per konstruksjon og beviser ingenting alene; diskriminerings-armen mot `c255662` er den som gjør den siste gate-kjøringen meningsfull. |
| 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

@ -278,13 +278,36 @@ til **hakene** — de er det eneste som ellers ville havnet i fila etter `Y`.
konstruksjon* (X var HEAD da); her har runbook-commiten (Y) og CHANGELOG-stempelet (Z) flyttet
HEAD forbi X, så en `src/`-endring imellom ville dukket opp. Tom her = **det taggede treet er
beviselig det prøvde treet**. Ikke tomt = IKKE tag.
- [ ] `git tag v1.0.0` + `git push origin v1.0.0` (**`origin` alene** — `open/` er P5-vinduet)
- [ ] `git tag -a v1.0.0 -m "v1.0.0 — first complete eight-step loop"` + `git push origin v1.0.0`
(**`origin` alene** — `open/` er P5-vinduet).
**Annotert (`-a`), ikke lettvekts.** Repoets eneste andre tag er annotert — målt:
`git cat-file -t v0.1.0``tag`, med tagger-header og meldingen `v0.1.0 — first tagged release`.
En lettvekts `v1.0.0` ville gjort hovedreleasen til den eneste taggen uten forfatter, dato eller
melding. **Meldingen står literalt her nettopp for at den ikke skal improviseres på en enveis-dag**
— den er *ikke* et felt i §0, og utfyllings-gaten forblir derfor på **2**.
Formen er tørrkjørt 08-11 (eget engangs-repo, ikke dette treet): `-a` med em-dash gir
`git tag -l``v1.0.0`, `git describe --tags --exact-match HEAD``v1.0.0`, filtrert
`ls-remote`**1 linje**, og em-dashen overlevde skallet.
- [ ] **Taggen bekreftet der den ble satt**`git tag -l v1.0.0``v1.0.0` · `git ls-remote --tags
origin v1.0.0` → **én linje** · `git describe --tags --exact-match HEAD` → `v1.0.0`.
Dette **er** tag-bekreftelsen; den skrives ikke inn i §0 (begrunnelsen står der). Den tredje
kommandoen er nøyaktig ankeret torsdagens §6 steg 2 leser — kjørt her koster den sekunder, og
en tag som landet på feil commit oppdages på **frysedagen** i stedet for på demo-morgenen.
Samme grunn som at §6 selv ble flyttet fra «under demoen» til «før rommet fylles».
**«Én linje» gjelder BEGGE tag-former**, så punkt 10s `-a` endrer ikke forventningen her.
Målt mot ekte `origin` 08-11: den annoterte `v0.1.0` gir **to** linjer *uten* filter
(`refs/tags/v0.1.0` + den peelede `refs/tags/v0.1.0^{}`), men **én** med `v0.1.0` som refspec —
`^{}` matcher ikke pattern-et. Kjør den derfor **med** taggnavnet, som over.
**⚠️ TOM UTSKRIFT ER TVETYDIG — LES EXIT-KODEN.** `origin` rate-limiter SSH på burst. Målt
08-11: de to første `ls-remote` gikk igjennom, de fire neste ga `Connection refused`, og porten
svarte igjen etter en pause — Forgejo-weben var oppe hele tiden (HTTP 303), så serveren var
aldri nede. Punkt 11 kjører to SSH-kall rett etter en push, altså nøyaktig et burst.
**Begge tilfellene gir null linjer på stdout** (målt): taggen mangler = **exit 0** og tom
stderr · kom ikke fram = **exit 128** og `ssh: connect to host … Connection refused` på stderr.
Et `| wc -l` alene kan altså ikke skille dem, og lest som «taggen landet ikke» er det en abort
på feil grunnlag — dagen etter at push-en faktisk lyktes. **Exit 128: vent et halvminutt og
kjør kommandoen på nytt. Ikke re-push, og ikke re-tag.** `git tag -l` er lokal og svarer
uansett; den skiller «tagget lokalt» fra «nådde origin» uten å røre nettverket.
---