fix(outbox,toolbox): the class was every caller-supplied name, and containment was not unreachable

Session 146 fixed `--run-id` across the seven doors and called it a class. It was not: the class
is every caller-supplied value that reaches a file name, and `write_outbox` composes
`{run_id}-{approach_id}`. Measured 20.09 -- `--approach-id a/../../../ESCAPE` answered 0 and put
the artefacts three levels above the directory the caller named. Counted rather than assumed: 11
path compositions in `outbox.py`, 2 such values, both now through one `_checked_name`.

The ledger sentence that said containment was UNREACHABLE after the string rule was untrue, and
the approach-id escape is the disproof -- the removed check would have caught it. It is back, but
in `outbox._artefact_path`, where the composition is, not in the door. That is the difference
that makes it reachable: the string rule lives in the door, while `run.py` hands its own
`--run-id` straight to the writers and goes past it. Checked before the directory is created, so
a refusal leaves nothing behind, and it covers the next flag someone interpolates into a name.

The judge's exact call now answers 3 with 0 files outside. Suite 2291/0/5/5 (746 s), ruff clean,
mypy 0. Both gates re-run after `git add`: v1 exit 1 (0/3, 0/3, 3/8, no report, 3/8, NOT
MEASURED, 1/20), B exit 1 (15/17, 0/2, 15/15 over 516 files, 0/3, 4/5, NOT MEASURED) -- no row
moved, and row 3's denominator held because the probe grew in place rather than as a new file.

Also: the presentation deck said 1.1.0 was the current version in two places. 1.2.0 now stands in
every tracked place that claims the repo's version. No bump, no tag, no new capability.

[skip-docs]

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-20 13:12:15 +02:00
commit cec9b8fe50
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
5 changed files with 116 additions and 68 deletions

View file

@ -163,7 +163,7 @@
<!-- tittel -->
<section class="slide divider">
<div class="inner">
<p class="kicker"><span class="part">portfolio-optimiser · v1.1.0 · teknisk gjennomgang</span></p>
<p class="kicker"><span class="part">portfolio-optimiser · v1.2.0 · teknisk gjennomgang</span></p>
<h1>Agentene foreslår. En beregning avgjør. Fagfolk dømmer.</h1>
<p class="lede">Et åpent Python-rammeverk på Microsoft Agent Framework som leter etter kostnadsbesparelser <b>inni</b> hvert prosjekt i en portefølje: arkitekturen, tilbakemeldingssløyfene og harnessen, fra formålet ned til hver enkelt søm.</p>
<p class="small">For AI-arkitekter og utviklere · inntil 60 minutter · alle påstander har kildelinje til repoet (<code>git.fromaitochitta.com/open/portfolio-optimiser</code>, HEAD 50c9763, 2026-09-18)</p>
@ -3147,7 +3147,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<div class="inner">
<p class="kicker"><span class="part">Del 7 · Etter v1.1</span></p>
<h1>Etter v1.1</h1>
<p class="lede">v1.1.0 ble sluppet 14.08.2026, og det er den siste utgivelsen. Alt etter den datoen er måling. Denne delen sier hva planen kaller destinasjonen, hvor langt unna vi er, og hva som med vilje ikke skal bygges.</p>
<p class="lede">v1.2.0 er repoets versjon, satt 20.09.2026; v1.1.0 ble sluppet 14.08.2026 og er den siste TAGGEDE utgivelsen. Alt etter den datoen er måling. Denne delen sier hva planen kaller destinasjonen, hvor langt unna vi er, og hva som med vilje ikke skal bygges.</p>
</div>
</section>
@ -3168,7 +3168,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
</div>
<div class="col soft">
<span class="step">Hva som endret seg i planen</span>
<p>«v1» ble omdefinert fra en tag til en produkttilstand — repoet står allerede på 1.1.0. Kriteriet ble skrevet så det kan FELLES, og en ny syntetisk stressrunde 7 er eksplisitt forbudt.</p>
<p>«v1» ble omdefinert fra en tag til en produkttilstand — repoet står allerede på 1.2.0. Kriteriet ble skrevet så det kan FELLES, og en ny syntetisk stressrunde 7 er eksplisitt forbudt.</p>
</div>
</div>
<p class="callout warn"><b>En ramme planen ber om at ikke skjules:</b> én person er bestiller, fagperson og operatør. «Det er en kjent begrensning.» Loggen i <code>PLAN.md</code> har åtte rader, og seks av dem sier «ingen bevegelse på kriteriet». En serie av dem er i seg selv et funn.</p>