docs(major2): steg 9 fullfoert - M38..M40 roede, K2-omkjoeringen maalt, last_ruling-paastanden rettet
M38 (attempts_remaining fra max_attempts alene) 2 roede - T3a og T5, som BEGGE navngir M38 i sin docstring; M39 (drop --checkpoint-dir-nekten) 1; M40 (honoured=True ved revise-tid) 2. Sum: 41 kjoeringer, 40 roede, 1 groenn (M29). K2-omkjoeringen (kriterium 8), instrumentet validert mot en kjent positiv foerst (3 954 tegn / 1 495 tok, S7a-3s tall reprodusert eksakt): utforskningen 12 prompter / 18 355 tokens UENDRET til tokenet, debatt-promptene uendret i antall OG stoerrelse, genererings-promptene 2 -> 4. Totalt 17 -> 19 prompter, 19 274 -> 19 776 tokens (+2,6 %). Utfallet flytter seg 200 000 -> 150 000 NOK og dom-noekkelen be8535e2 -> f23ecff8; ekspertens ord staar ordrett i 2 av 6 proposer-prompter (0 av 4 i kontrollen). generate.py: kommentaren paasto at `assert last is not None` ville fyrt uten baereren. M29 maalte at den ikke KAN - D1(a) returnerer inne i loekka naar remaining == 0, og paa siste forsoek er max_attempts - i - 1 alltid 0, saa halen er naabar kun etter en validator-avvisning, som setter `last` ogsaa. Baereren er uvitnet (budget_stop-presedensen), og det staar naa i kilden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
38cbc2c8ac
commit
74ea1dcf02
2 changed files with 132 additions and 27 deletions
|
|
@ -1,14 +1,11 @@
|
||||||
# MAJOR-2 — en dør for menneskelig tilbakemelding på forslaget som ligger på bordet
|
# MAJOR-2 — en dør for menneskelig tilbakemelding på forslaget som ligger på bordet
|
||||||
|
|
||||||
> **Status: DELVIS — steg 9 er påbegynt, ikke fullført.** M1–M37 er målt; **M38, M39 og M40
|
|
||||||
> gjenstår**, og K2-omkjøringen (§ 3) er ikke kjørt. Steg 10 (invariantraden + README) er ikke
|
|
||||||
> skrevet. Dokumentet er committet i denne tilstanden fordi økten skiftes ved sømmen; neste økt
|
|
||||||
> fortsetter fra M38.
|
|
||||||
>
|
|
||||||
> **Måledato:** 2026-09-05 (stien bærer ordredatoen, headeren måledatoen — S7b/S2c-formen)
|
> **Måledato:** 2026-09-05 (stien bærer ordredatoen, headeren måledatoen — S7b/S2c-formen)
|
||||||
> **Ordre:** `20260904T173146Z-8102814273-from-portfolio-optimiser`
|
> **Ordre:** `20260904T173146Z-8102814273-from-portfolio-optimiser`
|
||||||
> **Kode målt ved:** `ee7da3b` (steg 1–8: `ce4c15e` · `d4c8691` · `bbf4d3b` · `59f3fce` ·
|
> **Kode målt ved:** `ee7da3b` (steg 1–8: `ce4c15e` · `d4c8691` · `bbf4d3b` · `59f3fce` ·
|
||||||
> `c391fb5` · `fedf989` · `bfc634d` · `ee7da3b`)
|
> `c391fb5` · `fedf989` · `bfc634d` · `ee7da3b`); mutasjonene M1–M40 og K2-omkjøringen er
|
||||||
|
> målt mot nøyaktig det treet (`shasum -c` grønn før og etter hver mutasjon)
|
||||||
|
> **Grønn kontroll:** 1363 / 5 under mutasjonsmålingen, 1364 / 5 etter README-armen i steg 10
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -66,7 +63,7 @@ invariantraden).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. Mutasjonstabellen — M1–M37 målt, M38–M40 gjenstår
|
## 2. Mutasjonstabellen — M1–M40, ÉN liste
|
||||||
|
|
||||||
**Grønn kontroll:** `uv run pytest -q` → **1363 passed / 5 skipped**.
|
**Grønn kontroll:** `uv run pytest -q` → **1363 passed / 5 skipped**.
|
||||||
Node-ID-settet er et **strengt supersett** av pre-MAJOR-2-baselinen: 1319 → 1368, **0 fjernet**,
|
Node-ID-settet er et **strengt supersett** av pre-MAJOR-2-baselinen: 1319 → 1368, **0 fjernet**,
|
||||||
|
|
@ -75,9 +72,14 @@ Golden `tests/golden/demo-transcript.stdout` **BYTE-UENDRET**, `shasum -a 1` av
|
||||||
`ea8c534773acdbe41ae68f2c55724d69aaf8be4f` (ikke git-blob-id-en).
|
`ea8c534773acdbe41ae68f2c55724d69aaf8be4f` (ikke git-blob-id-en).
|
||||||
|
|
||||||
Protokoll per mutasjon: hele suiten, maks to mutasjoner per Bash-kall, restaurert fra
|
Protokoll per mutasjon: hele suiten, maks to mutasjoner per Bash-kall, restaurert fra
|
||||||
`scratchpad/major2/pristine/` og verifisert med `shasum -c` — aldri `git checkout`. Alle 38
|
`scratchpad/major2/pristine/` og verifisert med `shasum -c` — aldri `git checkout`. Alle 41
|
||||||
kjøringer rapporterte `restore=OK`.
|
kjøringer rapporterte `restore=OK`.
|
||||||
|
|
||||||
|
**Nevneren, med enhet:** M1–M40 er **40 mutasjons-ID-er**, men M26 er sjekket i TO lengder
|
||||||
|
(M26a/M26b, planens funn-1-skjerping), så måleprotokollen er **41 KJØRINGER**. Av dem er **40
|
||||||
|
røde og 1 grønn** (M29). Begge tellemåtene er sanne; dokumentet teller i KJØRINGER hele veien,
|
||||||
|
og `coord-send`-rapporten gjør det samme.
|
||||||
|
|
||||||
| M | hva mutasjonen gjør | røde | første navngitte armer | uavhengige vitner |
|
| M | hva mutasjonen gjør | røde | første navngitte armer | uavhengige vitner |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| M1 | detach reviewer-kallet (returner på validert som før) | 16 | T1, T2, T3a … | — |
|
| M1 | detach reviewer-kallet (returner på validert som før) | 16 | T1, T2, T3a … | — |
|
||||||
|
|
@ -118,18 +120,23 @@ kjøringer rapporterte `restore=OK`.
|
||||||
| M35 | bygg posten fra en RETURNERT liste i stedet for kaller-eid sink | 1 | T9 alene | — |
|
| M35 | bygg posten fra en RETURNERT liste i stedet for kaller-eid sink | 1 | T9 alene | — |
|
||||||
| M36 | dispatcheren slutter å tråde revieweren | 1 | T22 alene | — |
|
| M36 | dispatcheren slutter å tråde revieweren | 1 | T22 alene | — |
|
||||||
| M37 | detach CLI-utskriften mens rendereren fortsatt returnerer linja | 2 | T13, CLI-null-armen | — |
|
| M37 | detach CLI-utskriften mens rendereren fortsatt returnerer linja | 2 | T13, CLI-null-armen | — |
|
||||||
| M38 | `attempts_remaining` regnet fra `max_attempts` alene | — | **IKKE MÅLT** | — |
|
| M38 | `attempts_remaining` regnet fra `max_attempts` alene | 2 | T3a, T5 | — |
|
||||||
| M39 | drop `--checkpoint-dir`-nekten | — | **IKKE MÅLT** | — |
|
| M39 | drop `--checkpoint-dir`-nekten | 1 | park-armen alene | — |
|
||||||
| M40 | `honoured=True` satt ved revise-tid i stedet for etter hentingen | — | **IKKE MÅLT** | — |
|
| M40 | `honoured=True` satt ved revise-tid i stedet for etter hentingen | 2 | T3b, T9 | — |
|
||||||
|
|
||||||
**Sum så langt: 38 kjøringer, 37 røde, 1 grønn (M29).**
|
**Sum: 41 kjøringer (40 mutasjons-ID-er), 40 røde, 1 grønn (M29).**
|
||||||
|
|
||||||
### To signaturer verdt å lese
|
### Tre signaturer verdt å lese
|
||||||
|
|
||||||
* **M13 og M23 er røde i tester som er ELDRE enn dette arbeidet.** «Skriv artefaktet iff en reviewer
|
* **M13 og M23 er røde i tester som er ELDRE enn dette arbeidet.** «Skriv artefaktet iff en reviewer
|
||||||
ble gitt» (D4) holdes av A5-ens eksakte fire-navns-listing og av parse-fangstens kontroll; den
|
ble gitt» (D4) holdes av A5-ens eksakte fire-navns-listing og av parse-fangstens kontroll; den
|
||||||
hostede partisjonen holdes av Fase-4es to asserts. Sømmene er altså gatet av uavhengige vitner,
|
hostede partisjonen holdes av Fase-4es to asserts. Sømmene er altså gatet av uavhengige vitner,
|
||||||
ikke bare av sine egne armer.
|
ikke bare av sine egne armer.
|
||||||
|
* **M38 er rød i TO armer, og begge NAVNGIR den.** T3a («no exception, exactly two calls»
|
||||||
|
under `max_rounds=2`/`max_attempts=10`) og T5 (terminalen viser `attempts_remaining == 0` under
|
||||||
|
`max_rounds=1`/`max_attempts=3`) er de to sidene av den samme ledger-bevisste `min(...)`: den
|
||||||
|
ene måler at løkka STOPPER der boka slutter, den andre at TALLET operatøren leser sier det
|
||||||
|
samme. Det ble VERIFISERT i docstringene, ikke antatt ut fra at armene lå i samme fil.
|
||||||
* **M26a og M26b har ULIKE signaturer, og det var ikke gitt.** Ved 40 tegn overlever
|
* **M26a og M26b har ULIKE signaturer, og det var ikke gitt.** Ved 40 tegn overlever
|
||||||
`PROPOSAL-REVIEW-SENTINEL-9c41ae` (31 tegn) i de armene hvis feedback er kortere enn taket, så
|
`PROPOSAL-REVIEW-SENTINEL-9c41ae` (31 tegn) i de armene hvis feedback er kortere enn taket, så
|
||||||
T3b og T9 blir grønne igjen mens T1, T8 og T13 — de med lengre feedback — forblir røde. Planens
|
T3b og T9 blir grønne igjen mens T1, T8 og T13 — de med lengre feedback — forblir røde. Planens
|
||||||
|
|
@ -137,22 +144,108 @@ kjøringer rapporterte `restore=OK`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. K2-omkjøringen — IKKE KJØRT
|
## 3. K2-omkjøringen — kriterium 8
|
||||||
|
|
||||||
Kriterium 8 (S7b DEL-B-kommandoen over `scratchpad/s7b-syretest/K2-priset-SYNTETISK` pluss
|
Samme base, samme syntetiske prisfikstur og samme instrument som S7b § 3 og S2c § 3:
|
||||||
`--proposal-review` med et pipet `revise`/`approve`-manus, mot en approve-only-kontroll) gjenstår.
|
`scratchpad/s7b-syretest/K2-priset-SYNTETISK` (630 konseptfiler, erklært id `k2-trinn1-20260903`
|
||||||
Manuset er forberedt: `scratchpad/major2/scripted-replies-major2.json` bærer et FIRE-stegs
|
mot monteringsnavnet — S7a-3-slakken fyrer, og kjøringen sier det). K2-basen er **utracket og
|
||||||
proposer-manus (to tilnærminger × to forsøk), der annethvert steg oppgir 150 000 i stedet for
|
finnes kun på denne maskinen**, så kriteriet er verifiserbart her og rapporteres; det asserteres
|
||||||
200 000, slik at «svaret ble BRUKT» er utfallet og ikke bare at en post finnes.
|
aldri av suiten.
|
||||||
|
|
||||||
K2-basen er **utracket og finnes kun på denne maskinen**, så kriteriet er verifiserbart her og
|
**Instrumentet er validert mot en KJENT POSITIV FØR bruk:** rotnivå-listingen på LEVERT K2 måles
|
||||||
rapporteres — det asserteres aldri av suiten.
|
til **3 954 tegn / 1 495 o200k-tokens over 629 konsepter**, som reproduserer S7a-3s publiserte tall
|
||||||
|
eksakt. Uten den kontrollen ville et lavt ETTER-tall like gjerne betydd at sonden var i stykker
|
||||||
|
(MAJOR-3s falske null).
|
||||||
|
|
||||||
---
|
### 3.1 De to kjøringene
|
||||||
|
|
||||||
## 4. Ærlighets-grenser (så langt)
|
Manuset (`scratchpad/major2/scripted-replies-major2.json`) gir proposeren FIRE steg — to
|
||||||
|
tilnærminger × to forsøk, der annethvert oppgir **150 000** i stedet for **200 000**. Manus-
|
||||||
|
posisjonen er delt over kjøringen, ikke per tilnærming (målt), så kontrollen og den reviderte
|
||||||
|
kjøringen leser den samme lista fra hver sin ende.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# KONTROLL — samme flagg, samme manus, bare et annet SVAR
|
||||||
|
printf 'approve\napprove\n' | uv run portfolio-optimiser K2 \
|
||||||
|
--docs-dir scratchpad/s7b-syretest/K2-priset-SYNTETISK \
|
||||||
|
--bundle-dir scratchpad/s7b-syretest/K2-priset-SYNTETISK \
|
||||||
|
--derive-cost-baseline \
|
||||||
|
--explore "Finn kostnadsbesparelser i Stange skole-anbudet" \
|
||||||
|
--explore-config scratchpad/s7b-syretest/explore-config.json \
|
||||||
|
--scripted-replies scratchpad/major2/scripted-replies-major2.json \
|
||||||
|
--outbox-dir scratchpad/major2/outbox-control --run-id major2-control \
|
||||||
|
--proposal-review
|
||||||
|
|
||||||
|
# REVIDERT — to revise, to approve
|
||||||
|
printf 'revise Bruk 150 000, ikke 200 000\napprove\nrevise Bruk 150 000, ikke 200 000\napprove\n' | ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Kontrollen er approve-only, ikke «uten flagget».** Det isolerer SVARET: begge kjøringene har
|
||||||
|
døra, samme manus og samme budsjett, så alt som skiller dem er hva mennesket sa.
|
||||||
|
|
||||||
|
### 3.2 Utfallet flytter seg
|
||||||
|
|
||||||
|
| | KONTROLL (approve ×2) | REVIDERT (revise/approve ×2) |
|
||||||
|
|---|---|---|
|
||||||
|
| review-spørsmål | 2 over 2 kandidater | **4 over 2 kandidater** |
|
||||||
|
| `hypothesis-1` | VALIDERT 200 000 NOK | **VALIDERT 150 000 NOK** |
|
||||||
|
| `own-proposal` | VALIDERT 150 000 NOK | VALIDERT 150 000 NOK |
|
||||||
|
| kjøringens utfall | best **200 000** NOK | best **150 000** NOK |
|
||||||
|
| dom-nøkkel | `be8535e204cdc4c6` | **`f23ecff85f4188b5`** |
|
||||||
|
| `attempts remaining` vist | 2 | 2, så **1** på forsøk to |
|
||||||
|
|
||||||
|
Begge kjøringene ender rc 0 med `ValidatedProposal`. Validatorens dom er ikke overstyrt av noen —
|
||||||
|
det er en ANNEN kandidat som ble dømt, fordi mennesket kjøpte ett forsøk til.
|
||||||
|
|
||||||
|
### 3.3 Prisen: én ekstra genererings-prompt per tilnærming
|
||||||
|
|
||||||
|
| fase | prompter (kontroll) | tokens | prompter (revidert) | tokens |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 1 — utforskning (navigatør 5, manager 6, hypotesiser 1) | 12 | 18 355 | 12 | **18 355** |
|
||||||
|
| 2a — debatt (proposer 2, checker 1) | 3 | 513 | 3 | **513** |
|
||||||
|
| 2b — generering | 2 | 406 | **4** | 908 |
|
||||||
|
| **sum** | **17** | **19 274** | **19** | **19 776** |
|
||||||
|
|
||||||
|
**Utforskningen er uendret til tokenet**, og debatt-promptene er uendret både i antall og i
|
||||||
|
størrelse (proposer 314, checker 199 i begge). Hele forskjellen er de **to ekstra
|
||||||
|
genererings-promptene** — én per tilnærming, nøyaktig dét en `revise` kjøper. **+502 tokens, +2,6 %**
|
||||||
|
for en kjøring der et menneske faktisk endret utfallet.
|
||||||
|
|
||||||
|
Klassifiseringen debatt/generering er MÅLT, ikke antatt: genererings-prompten bærer
|
||||||
|
`Project: {id} - {name}` (`generate._build_messages`), debatt-turen bærer basepekeren.
|
||||||
|
|
||||||
|
### 3.4 Ordene når fram — ORDRETT
|
||||||
|
|
||||||
|
`Bruk 150 000, ikke 200 000` står i **2 av 6** proposer-prompter i den reviderte kjøringen og i
|
||||||
|
**0 av 4** i kontrollen — altså nøyaktig i de to andre-forsøks-promptene, og ingen andre steder.
|
||||||
|
|
||||||
|
`scratchpad/major2/outbox-revise/major2-revise-proposal-reviews.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"approach_id": "hypothesis-1", "attempt": 0, "decision": "revise",
|
||||||
|
"feedback": "Bruk 150 000, ikke 200 000", "honoured": true,
|
||||||
|
"p50": 319311.8986090132, "verdict_key": "be8535e204cdc4c6"}
|
||||||
|
{"approach_id": "hypothesis-1", "attempt": 1, "decision": "approve", "feedback": "",
|
||||||
|
"honoured": true, "p50": 319311.8986090132, "verdict_key": "f23ecff85f4188b5"}
|
||||||
|
```
|
||||||
|
|
||||||
|
Posten er nøklet per `(approach_id, attempt)` og bærer `verdict_key` for den kandidaten mennesket
|
||||||
|
faktisk SÅ — attempt 0 navngir 200 000-kandidaten, attempt 1 den kjøringen endte på. Kontrollens
|
||||||
|
artefakt har to rader, begge `approve` med tom feedback: **fila skrives uansett, fordi en reviewer
|
||||||
|
ble gitt** (D4).
|
||||||
|
|
||||||
|
**Ærlighets-grense på nettopp dette manuset:** den skriptede proposeren LESER ikke feedbacken — den
|
||||||
|
returnerer steg 2 uansett. Det som er målt her er derfor (a) at ordene når prompten ordrett, (b) at
|
||||||
|
et forsøk til faktisk ble kjøpt og hentet (`honoured: true`), og (c) at kjøringen bærer validatorens
|
||||||
|
dom på DET forsøket. At en levende modell ville korrigert seg etter ordene er ikke vist, og kan
|
||||||
|
ikke vises av et manus.
|
||||||
|
|
||||||
|
## 4. Ærlighets-grenser
|
||||||
|
|
||||||
* **`last_ruling`-bæreren er uvitnet** — se § 1. Planens «Critical risk #1» er falsifisert.
|
* **`last_ruling`-bæreren er uvitnet** — se § 1. Planens «Critical risk #1» er falsifisert.
|
||||||
|
Kommentaren i `generate.py` som påsto at asserten ville fyrt er RETTET i samme commit som dette
|
||||||
|
dokumentet; commit-teksten for `bbf4d3b` bærer fortsatt den gamle påstanden, og historikken
|
||||||
|
skrives ikke om.
|
||||||
* **Steg 5 under-rapporterer på en revidert kjøring:** en `revise` bruker ett av de SAMME
|
* **Steg 5 under-rapporterer på en revidert kjøring:** en `revise` bruker ett av de SAMME
|
||||||
`max_attempts`-forsøkene en validator-avvisning ville brukt, så en kjøring kan bruke opp forsøkene
|
`max_attempts`-forsøkene en validator-avvisning ville brukt, så en kjøring kan bruke opp forsøkene
|
||||||
på ekspert-revisjoner og aldri nå en andre validator-falsifisering. `refinements` under-rapporterer
|
på ekspert-revisjoner og aldri nå en andre validator-falsifisering. `refinements` under-rapporterer
|
||||||
|
|
@ -173,3 +266,9 @@ rapporteres — det asserteres aldri av suiten.
|
||||||
* **`run_portfolio` tar ingen reviewer**, og fraværet er assertert.
|
* **`run_portfolio` tar ingen reviewer**, og fraværet er assertert.
|
||||||
* **Ingen levende modell har svart på en review.** Alt her er skriptede stand-ins
|
* **Ingen levende modell har svart på en review.** Alt her er skriptede stand-ins
|
||||||
(structured-output-grensens klasse).
|
(structured-output-grensens klasse).
|
||||||
|
* **K2-prisene er SYNTETISKE**, og manuset er skriptet: null modellkall, banneret sier det på hver
|
||||||
|
kjøring. Det som er vist er at maskineriet kommer HELT fram med et menneske i løkka, ikke hva et
|
||||||
|
tilbud koster. Multiplikatorene i § 3.3 gjelder dette manuset.
|
||||||
|
* **README-armen har intet M-nummer** — M-lista lukket ved M40. Den ble drevet rød to ganger
|
||||||
|
(manglende blokk, og blokk uten `--checkpoint-dir` navngitt), og kontrollen på at uttrekkeren
|
||||||
|
ikke stille finner ingenting er `--plan-review`-blokka.
|
||||||
|
|
|
||||||
|
|
@ -535,10 +535,16 @@ async def generate_via_llm(
|
||||||
# rejection is about to inform a further attempt; it is never read back into a prompt.
|
# rejection is about to inform a further attempt; it is never read back into a prompt.
|
||||||
fed_back: list[Rejection] = []
|
fed_back: list[Rejection] = []
|
||||||
# The most recent ruling of EITHER kind. Before MAJOR-2 the exit rested on ``last``, which only
|
# The most recent ruling of EITHER kind. Before MAJOR-2 the exit rested on ``last``, which only
|
||||||
# a validator REJECTION sets -- so "validated -> revise" on every attempt reached the end of the
|
# a validator REJECTION sets. The plan predicted that "validated -> revise" on every attempt
|
||||||
# loop with ``last is None`` and died on ``assert last is not None`` (and, under -O, on
|
# would therefore reach the end of the loop with ``last is None`` and die on
|
||||||
# ``None.proposal``). The carrier is explicit, and D6 reads straight off it: whatever the
|
# ``assert last is not None``; MEASUREMENT FALSIFIED THAT (MAJOR-2 mutation M29 stayed GREEN
|
||||||
# validator ruled LAST is what the run carries, never a proposal the reviewer picked.
|
# against the whole suite). D1(a) RETURNS inside the loop when ``remaining == 0``, and on the
|
||||||
|
# final attempt ``max_attempts - i - 1`` is always 0 -- so the tail is reachable only after a
|
||||||
|
# validator REJECTION, which sets ``last`` too. This carrier is therefore UNWITNESSED (the
|
||||||
|
# ``budget_stop`` precedent): it stands because it makes D6 explicit and removes an assert that
|
||||||
|
# rested on a non-local invariant, not because a test holds it. D6 reads straight off it:
|
||||||
|
# whatever the validator ruled LAST is what the run carries, never a proposal the reviewer
|
||||||
|
# picked.
|
||||||
last_ruling: ValidatedProposal | Rejection | None = None
|
last_ruling: ValidatedProposal | Rejection | None = None
|
||||||
# The expert's STANDING instruction. Unlike ``last`` it is not cleared per attempt: it holds
|
# The expert's STANDING instruction. Unlike ``last`` it is not cleared per attempt: it holds
|
||||||
# until the reviewer next answers, because a human's request survives one machine round trip.
|
# until the reviewer next answers, because a human's request survives one machine round trip.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue