feat(round-builder): one command turns a run's outbox into a round the gate can read [skip-docs]
python -m portfolio_optimiser.evals.round_builder --outbox <dir> --round <n> --ran-at <ISO> writes <rounds-dir>/<n>/ with the run's artefacts COPIED in, outcome.json derived from that copy, and report.md -- the one artefact in a round a domain expert reads and corrects. Round 0 of the v1 criterion can now be made; it counted 0 of 3 because it could not be, which is a different failure from a round nobody had held. What it derives it derives with the gate's own functions rather than a second copy: verify_run decides whether the run stands up to itself (an artefact contradicting its coverage row, a half-missing family and a stray artefact are all refused AT THE SOURCE, before a byte is written), stage_of gives column (c), row_changed gives the report's "changed since the previous round", parse_time refuses a stamp without a zone, safe_rounds_dir refuses a round directory the repo would commit. The validated total is ledger.to_ore per amount, summed as integers. Two things it never does, and both are the point. It never writes the operator's attestation -- the gate stops at FORM OK without one, and that is correct, because no arrangement of files can witness that a run happened. And it never invents: --ran-at is required because no outbox artefact carries a clock, and feedback_ids stays empty because no run records which feedback item produced which row. The report says "ingen tilbakemelding forklarer dette" on every changed row rather than hiding that model noise and an answered objection look alike. Chosen and why: --ran-at as a required argument rather than the coverage file's mtime, because an mtime is a filesystem attribute one call sets and reading it as evidence made row 2 green on a tree nothing had run in (18.09). The report carries no raw stage identifier -- every stage sentence is "<short name>: <explanation>" so the one-line diff of what changed has words a reader can act on. A citation shows its COUNT, because a run that cited 446 places and one that cited one must not look the same. [skip-docs]: the ledger row is in docs/invarianter.md, which is where this repo's rules live. README is the product's front door and this is an operator tool behind `python -m`, the same class as costsim/hitl/preflight, which README deliberately does not carry; v1-rounds/ is gitignored internal machinery and the gate itself is not in README either. CLAUDE.md was emptied of exactly this kind of row in session 130 and is not the place to put one back. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
0fa612a22f
commit
db38cfc1a4
4 changed files with 605 additions and 27 deletions
|
|
@ -3110,6 +3110,30 @@
|
|||
tall og bevisregisteret er pinnet mot kilden i testen. Småfunn: rundekatalog inne i repoet uten
|
||||
gitignore og manglende `--stress-root`/`--bundle-root` gir exit 2; en typeannotasjon teller ikke
|
||||
som kallsted. Reviewens 20 mutanter kjørt på nytt: **20 av 20 røde**.
|
||||
- **Rundekatalogen BYGGES av en kommando, og den kommandoen skriver aldri attesteringen (19.09):**
|
||||
målt read-only @ `6807946` bandt ingenting en kjørings utboks til `v1-rounds/<n>/` (40 treff på
|
||||
`v1-rounds|rounds_dir`, alle i gaten, dens tester, `.gitignore`, hovedboken og et deck; 0 i
|
||||
`run.py`/`outbox.py`/`scripts`) og ingen steder i `src/` skrev markdown — runde 0 sto på 0 av 3
|
||||
fordi den ikke KUNNE lages, ikke fordi ingen hadde holdt den. `python -m
|
||||
portfolio_optimiser.evals.round_builder --outbox <dir> --round <n> --ran-at <ISO>` skriver
|
||||
`<n>/outbox/` som KOPI, `<n>/outcome.json` UTLEDET av den kopien, og `<n>/report.md`. Binderen
|
||||
dømmer ikke med egne regler: `verify_run` avgjør om kjøringen står inne for seg selv (motsagt
|
||||
artefakt, halv familie, streifende fil — alle avvist VED KILDEN, før en byte skrives),
|
||||
`stage_of` gir kolonne (c), `row_changed` gir «Endret siden forrige runde», `parse_time` nekter
|
||||
et tidsstempel uten sone, `safe_rounds_dir` nekter en rundekatalog repoet ville committet;
|
||||
summen er `ledger.to_ore` per beløp. **To ting gjør den ALDRI:** skriver operatørens
|
||||
`attestering.txt` (gaten stopper på FORM OK uten den — ingen filsamling kan vitne om at en
|
||||
kjøring skjedde), og finner på. `--ran-at` er PÅKREVD fordi ingen utboksartefakt bærer en
|
||||
klokke, og `feedback_ids` står tomt fordi ingen kjøring sporer hvilken tilbakemelding som ga
|
||||
hvilken rad; rapporten skriver «Ingen tilbakemelding forklarer dette» på hver endret rad i
|
||||
stedet for å skjule at modellstøy og et besvart innspill ser like ut. Rapportens stadie-navn er
|
||||
prosa, aldri `stage4-p90`, og et sitat bærer ANTALLET siterte steder. Load-bearing MÅLT
|
||||
(`tests/test_round_builder_loadbearing.py`, 28 armer, hvert tall talt en gang til fra
|
||||
fixturens egen tabell); MÅLT på fire EKTE arkiverte utbokser (`tunnel-hauglia-2027` -04/-06/-07
|
||||
/-08): gaten leser rundene, rad 1 = **FORM OK, IKKE BEVIST**. **Ærlighets-grense, uttalt:** rad
|
||||
2 blir RØD og ikke FORM OK på de samme rundene — radene endret seg (2, 5, 5), men ingen endring
|
||||
er sporet til en feedback-id, fordi sporingen ikke finnes ennå. Den hører i oversettelsen
|
||||
`feedback.json` → kjøringens input, som er en egen ordre.
|
||||
- **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
|
||||
knytte til én tilnærming — og tre falsifiseringsarmer validerte. `declare_requirement` tar derfor
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue