test(p13): the okf pin is MEASURED and deliberately NOT lifted -- the V1 stamp form disarms the forgery guard
The lift to llm-ingestion-okf v0.8.5 (which forces llm-ingestion-guard to
v1.4.0) was built and run in a worktree, never in the tracked tree. It is not
green, and the reason that decides it is not the red tests.
MEASURED. 27/27 imported names still resolve across five modules. Both demo
goldens stay byte-identical (ea8c534... / ede3e2f...), ruff check passes and
mypy clears 37 files. The suite goes 1579/3/5 (control) -> 1573/9/5. Eight of
the nine reds have ONE cause: the emitter moved from `generated: true` to the
V1 flow mapping `generated: { by: process:okf-ingest, at: ... }`, one line per
generated concept, seven files across four examples/ingest-golden-* bundles --
and 0 under shared/, so a future lift does not touch the pull-only subtree.
THE FINDING. okf._carries_complete_ingest_stamp reads the new form as NOT a
stamp (measured: True on the literal, False on the flow mapping), so
write_concept_file's IngestStampError refusal would land DISARMED -- and
test_ingest_stamp_fail_closed_loadbearing stayed GREEN through the whole bump
run. That is exactly the trap the _YAML_TRUE_LITERALS invariant row was written
for, arriving by a spelling it did not anticipate. A gate that stops gating is
not a row to name; it is a blocker.
TWO PREMISES FELLED before anything was built on them. Guard v1.2.0 -- the
lowest 1.x satisfying okf's declared >=1.2,<2.0 -- is NOT choosable: okf v0.8.5
pins the guard itself via [tool.uv.sources] tag = "v1.4.0" and uv refuses the
consumer's lower pin as conflicting URLs. And `rev = "v1.4.0"` is a DIFFERENT
url to uv than `tag = "v1.4.0"` even at the same value; only the tag= spelling
resolves.
DELIVERED. tests/test_okf_version_guard.py pins what is measured-green
(0.3.2 / 0.3.4) in two halves -- the installed distribution and pyproject --
with the refusal messages NAMING the eight-row cost of the lift, so the next
session cannot lift the pin without re-measuring. Iron Law: written red against
the v0.8.5/v1.2.0 target first (3 failed / 2 passed). Four mutations, each with
its own signature, all red: the okf assert never raises (1) / always raises (1)
/ the guard assert never raises (1) / the pin constant drifts to 0.3.3 (2 --
both halves, so the derivation is live and not two literals).
Also in the assessment: R761 navigated free for the first time (po had 0
references to it) -- 8.58/6.89/7.11 s, 131 MB max RSS, 5514 files -> 2756
concepts, 0 skipped links, against n100-2023's 0.21 s / 111 MB / 450 -> 446 /
0; and what the CLI can and cannot do with four bundles today.
Suite 1582 passed / 5 skipped (from 1577/5, strict superset, 0 removed).
Goldens byte-unchanged. Two coord messages closed; two STATE claims corrected
against measurement (upushed 3 -> 0, inbox "empty" -> 2).
Order: 20260912T190444Z-8080128610-from-.claude
Record: docs/2026-09-12-p13-okf-pin-r761.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
9f14c642c8
commit
afdd9e0692
2 changed files with 521 additions and 0 deletions
407
docs/2026-09-12-p13-okf-pin-r761.md
Normal file
407
docs/2026-09-12-p13-okf-pin-r761.md
Normal file
|
|
@ -0,0 +1,407 @@
|
|||
# P13 — okf-pinnen v0.3.2 → v0.8.5 vurdert og målt, R761 gratis-navigasjon
|
||||
|
||||
Dato: 2026-09-12. Ordre `20260912T190444Z-8080128610-from-.claude`.
|
||||
Forberedelse til stresstesten fra 18.09. **Ingen modellkall, ingen Azure, NOK 0.**
|
||||
|
||||
---
|
||||
|
||||
## § 0 — Hva som ER målt og hva som IKKE er det
|
||||
|
||||
**Målt i denne økten**
|
||||
|
||||
| # | Påstand | Hvordan |
|
||||
|---|---|---|
|
||||
| 1 | po sender ALDRI `llm_ingestion_okf.parse_frontmatter`-retur videre til en YAML-leser | `grep` over `src`+`tests`: 53 `parse_frontmatter`-treff, ALLE mot po sin egen `okf.py:125`; 0 `import yaml` noe sted |
|
||||
| 2 | Upushede commits = **0** (STATE påsto 3) | `git log --oneline origin/main..main \| wc -l` |
|
||||
| 3 | Innboksen hadde **2** meldinger (STATE påsto tom) | `ls ~/.claude/coord/portfolio-optimiser/inbox/` |
|
||||
| 4 | okf v0.8.5 + guard v1.4.0 resolverer, installerer og importerer | `uv lock`/`uv sync` i worktree, 27/27 navn |
|
||||
| 5 | Bumpen gjør **9 tester røde**, alle fra ÉN emittert linje | full suite i worktree |
|
||||
| 6 | Bumpen gjør `write_concept_file`-forfalskningsvakten **INERT**, uten at én test merker det | direkte kall på `_carries_complete_ingest_stamp` |
|
||||
| 7 | R761 navigeres på 6,9–8,6 s / 131 MB, 5 514 filer, 0 hopp | `/usr/bin/time -l`, tre kjøringer |
|
||||
| 8 | N100 navigeres på 0,20–0,22 s / 111 MB, 450 filer, 0 hopp | samme |
|
||||
| 9 | `--bundle-dir` tar ÉN katalog; multi-base finnes kun som bibliotek-funksjon | `grep` på `bundle_dirs=` og `run_mandate_across_bundles` |
|
||||
|
||||
**IKKE målt**
|
||||
|
||||
- **Ingen levende modell har kjørt mot R761.** Veggtid og RSS er `navigate_bundle` alene — ikke
|
||||
`read_bundle`, ikke `list_bundles`, ikke token-kostnad, ikke prompt-antall. At en modell navigerer
|
||||
R761 *godt* er ikke berørt (structured-output-grensens klasse).
|
||||
- **Bumpen er ikke landet, så ingen kjøring har brukt okf 0.8.5 i po.** Alle tall om bumpen er fra
|
||||
worktreet.
|
||||
- **Guard-kalibreringen er målt kun gjennom suiten.** `test_ingest_content_gate_loadbearing` sto
|
||||
grønn på 1.4.0, altså holder `_ACCEPTED_DISPOSITION = "warn"` for de dokumentene den kjører. Et
|
||||
bredere korpus er ikke prøvd.
|
||||
- **Ingen av de fire vegnormal-bundlene er gitt til en po-kjøring.** § 3.2 er en beskrivelse av
|
||||
flaten som finnes, ikke en måling av at fire baser virker sammen.
|
||||
- **`--docs-dir`-ruten for «resten av basene» er IKKE prøvd** — se ærlighets-grensen i § 3.2.
|
||||
|
||||
---
|
||||
|
||||
## § 1 — Innboks og STATE-avvik (DEL 1)
|
||||
|
||||
### 1a — de to meldingene fra `llm-ingestion-okf`
|
||||
|
||||
Begge `reply-expected: no`, begge lest i sin helhet, begge lukket med `coord-done` (ingen svar
|
||||
sendt: ingenting er bedt av po, og begge er rene FYI-er).
|
||||
|
||||
| Melding | Innhold | Konsekvens for po |
|
||||
|---|---|---|
|
||||
| `…145106Z…` (K3-24) | Blokkform-`sources` leses nå av alle tre flate lesere i okf. Anbefaler `consume.read_sources` for tre-tilstands-svaret. Sier eksplisitt at po sin `read_provenance` (som svarer `UnreadableProvenance(reason="block-sequence")`) er grunnen okf **ikke** flyttet emitteren til blokkform. | **Ingen.** po kaller ingen av okf sine lesere. |
|
||||
| `…174754Z…` (v0.8.5 tagget) | `okf.parse_frontmatter` returnerer nå en flow-STRENG for blokk-`sources` der den ga tom streng. Advarer: kode som sendte returverdien rett til en YAML-leser får nå en parse-feil. | **Ingen.** Se måling 1 under. |
|
||||
|
||||
**Måling 1 — sender po `parse_frontmatter`-retur til en YAML-leser?** Nei, og ikke fordi po er
|
||||
forsiktig, men fordi po aldri kaller funksjonen.
|
||||
|
||||
```
|
||||
grep -rn "parse_frontmatter" src tests -> 53 treff
|
||||
```
|
||||
|
||||
Alle 53 er `okf.parse_frontmatter` / `portfolio_optimiser.okf` — po sin EGEN linjeorienterte leser
|
||||
(`src/portfolio_optimiser/okf.py:125`). `grep -rn "llm_ingestion_okf" src` gir **9** treff, fordelt
|
||||
på nøyaktig to filer (`ingest.py`, `ingest_mcp.py`), og `parse_frontmatter` er ikke blant navnene
|
||||
som importeres. `grep -rn "import yaml\|yaml.safe_load\|yaml.load" src tests` gir **0**. po har ingen
|
||||
YAML-leser i det hele tatt, så den beskrevne regresjonen har ingen sti hit.
|
||||
|
||||
### 1b — STATE-avvikene rettet
|
||||
|
||||
| STATE påsto | Målt 12.09 | Kommando |
|
||||
|---|---|---|
|
||||
| «UPUSHET = 3 (`c623498`, `a629902`, `9f14c64`); `ls-remote` = `6eb58e5`» | **0 upushet**; `ls-remote origin main` = `9f14c64` (= lokal HEAD) | `git log --oneline origin/main..main \| wc -l` |
|
||||
| «📬 INNBOKS TOM (= 0)» | **2 meldinger**, begge fra `llm-ingestion-okf`, begge nå lukket | `ls ~/.claude/coord/portfolio-optimiser/inbox/` |
|
||||
|
||||
Operatøren pushet altså etter at STATE ble skrevet, og to meldinger landet etterpå. Begge er rettet
|
||||
i STATE.
|
||||
|
||||
---
|
||||
|
||||
## § 2 — okf-pinnen v0.3.2 → v0.8.5 (DEL 2)
|
||||
|
||||
### 2a — utgangspunktet
|
||||
|
||||
```
|
||||
pyproject.toml:68 llm-ingestion-okf = { git = ...llm-ingestion-okf.git, rev = "v0.3.2" }
|
||||
pyproject.toml:72 llm-ingestion-guard = { git = ...pipeline-security.git, rev = "v0.3.4" }
|
||||
uv.lock okf v0.3.2 = f14c075 · guard v0.3.4 = adf93e47
|
||||
installert okf 0.3.2 · guard 0.3.4
|
||||
```
|
||||
|
||||
okf v0.8.5 (`pyproject.toml` fra taggen) erklærer `dependencies = ["llm-ingestion-guard>=1.2,<2.0"]`
|
||||
— guarden er okf sin ENE runtime-avhengighet, så å løfte okf TVINGER guarden opp.
|
||||
|
||||
Guard-tagger som finnes (`git ls-remote --tags`): 0.1.0 … 0.7.0, **1.0.0, 1.1.0, 1.2.0, 1.3.0,
|
||||
1.4.0**. Laveste som tilfredsstiller `>=1.2,<2.0` er **1.2.0**.
|
||||
|
||||
**PREMISS FELT (1 av 2): «laveste 1.x» er ikke valgbar.** okf v0.8.5 pinner guarden i sin EGEN
|
||||
`[tool.uv.sources]` til `tag = "v1.4.0"`, og uv behandler det som et direkte-URL-krav. Med po på
|
||||
v1.2.0:
|
||||
|
||||
```
|
||||
x Failed to resolve dependencies for `llm-ingestion-okf` (v0.8.5)
|
||||
Requirements contain conflicting URLs for package `llm-ingestion-guard`
|
||||
- ...pipeline-security.git@v1.4.0
|
||||
- ...pipeline-security.git@v1.2.0
|
||||
```
|
||||
|
||||
**PREMISS FELT (2 av 2): `rev =` og `tag =` er ULIKE URL-er for uv, selv med samme verdi.** Med po
|
||||
på `rev = "v1.4.0"` — altså samme tag som okf — nekter uv fortsatt, og skriver ut to identiske
|
||||
strenger som «conflicting». Først `tag = "v1.4.0"` resolverer. Konsekvensen for en framtidig bump
|
||||
er en konkret skrivemåte, ikke et valg: **po må skrive `tag = "v1.4.0"`**, ikke `rev =`, og ikke en
|
||||
lavere 1.x.
|
||||
|
||||
**Guardens brudd mot po sine fire importer (`Channel`, `Origin`, `format_log_entry`,
|
||||
`import_bundle`).** Ingen. Guardens CHANGELOG `[1.0.0]` fryser den eksporterte flaten under semver
|
||||
— «no name exported from `llm_ingestion_guard` is removed, renamed or given a different meaning
|
||||
without a `2.0.0`», og målt før taggen: «four names added, none removed or renamed» siden 0.3.4.
|
||||
**Men samme seksjon holder deteksjons-ATFERD utenfor frysen:** «Severities, thresholds, lexicon
|
||||
entries and the dispositions they produce are calibration, and calibration moves in minor and patch
|
||||
releases.» Det er nøyaktig det `ingest._ACCEPTED_DISPOSITION = "warn"` hviler på
|
||||
(`ingest.py:235-239`). Målt utfall: `test_ingest_content_gate_loadbearing` sto GRØNN på guard 1.4.0,
|
||||
så kalibreringen har ikke flyttet seg for de dokumentene den kjører — men det er en måling med en
|
||||
smal nevner, ikke en garanti.
|
||||
|
||||
### 2b — rød test først (Iron Law)
|
||||
|
||||
`tests/test_okf_version_guard.py` skrevet mot målet v0.8.5/v1.2.0 og kjørt FØR noen produksjonskode
|
||||
ble rørt: **3 failed / 2 passed** på dagens installasjon (de to installerte versjonene + `pyproject`-
|
||||
halvdelen røde). Dermed er vakten bevist i stand til å bli rød.
|
||||
|
||||
### 2c — målingene i worktree
|
||||
|
||||
Alt under kjørt i `git worktree add --detach` (aldri i det sporede treet).
|
||||
**Kontrollkjøring FØR bumpen, samme worktree:** 1579 passed / 3 failed / 5 skipped, der de tre røde
|
||||
er vaktens egne. `1577 (STATE-basislinje) + 2 grønne vakt-armer = 1579`, altså er kontrollen
|
||||
avstemt mot basislinjen.
|
||||
|
||||
> Én forstyrrelse måtte ryddes først, og den er en egenskap ved WORKTREET, ikke ved bumpen:
|
||||
> `test_package_leaks_no_local_or_secret_files` har en KONTROLL på at `STATE.md` finnes lokalt
|
||||
> (ellers kan gaten ikke diskriminere), og `STATE.md` er local-only, altså ikke i et worktree.
|
||||
> Kopiert inn → 10/10 grønne. Uten den kopien ville nevneren vært 1 for lav.
|
||||
|
||||
**(i) Importerer alle navnene fortsatt? JA — 27 av 27.** Ordren sa «13 navn»; den målte nevneren er
|
||||
27 fordelt på fem moduler (14 fra `llm_ingestion_okf`, 5 `…connectors`, 1 `…manifest`,
|
||||
3 `…render`, 4 `llm_ingestion_guard.okf`). 0 manglende.
|
||||
|
||||
**(ii) Hele suiten: 1573 passed / 9 failed / 5 skipped.** IKKE grønn.
|
||||
|
||||
**(iii) Begge demo-goldener BYTE-UENDRET.** `ea8c534773acdbe41ae68f2c55724d69aaf8be4f` (stdout) og
|
||||
`ede3e2f685ce6a14ad9888e9de421d1a66f6c611` (stderr) — `shasum -a 1` av INNHOLDET, ikke git-blob-id.
|
||||
|
||||
**(iv) De tre portene:** `ruff check --exclude scratchpad` → All checks passed! · `mypy src` →
|
||||
Success, 37 filer · `ruff format --check` → 211 filer formatert, 1 ville reformateres, og det var
|
||||
vaktfila jeg nettopp hadde skrevet (rettet i det sporede treet).
|
||||
|
||||
**(v) Door A-goldenen: ETT avvik, én linje, rad for rad.**
|
||||
|
||||
```diff
|
||||
--- examples/ingest-golden-file/expected-bundle/ingest-costs.md
|
||||
@@ -8 +8 @@
|
||||
-generated: true
|
||||
+generated: { by: process:okf-ingest, at: 2026-07-03T12:00:00Z }
|
||||
```
|
||||
|
||||
Identisk diff i alle sju genererte konseptfiler. Dette er pre-V1 → V1-formen ordren forutså, og det
|
||||
er samme flow-mapping guarden åpnet for i sin `1.2.0`.
|
||||
|
||||
Alle **ni** røde tester, med årsak:
|
||||
|
||||
| # | Test | Årsak |
|
||||
|---|---|---|
|
||||
| 1 | `test_ingest_golden::…bit_deterministic` | byte-diff, `ingest-costs.md` + `ingest-edge.md` |
|
||||
| 2 | `test_ingest_golden_http::…` | byte-diff, `ingest-report.md` + `ingest-status.md` |
|
||||
| 3 | `test_ingest_golden_sql::…` | byte-diff, `ingest-costs.md` + `ingest-meta.md` |
|
||||
| 4 | `test_ingest_golden_mcp::…` | byte-diff, `ingest-cost-docs.md` |
|
||||
| 5 | `test_ingest_loadbearing::test_every_generated_file_carries_the_provenance_layer` | `fm["generated"] == "true"` |
|
||||
| 6 | `test_ingest_materialize::test_provenance_roundtrips_via_unchanged_parse_frontmatter` | samme assert |
|
||||
| 7 | `test_ingest_mcp::test_mcp_source_materializes_a_bundle_through_the_http_family` | `"generated: true" in text` |
|
||||
| 8 | `test_ingest_sql::test_sql_manifest_materializes_with_provenance` | `fm["generated"] == "true"` |
|
||||
| 9 | `test_okf_version_guard::test_pyproject_pins_both_revisions` | vaktens egen konstant (v1.2.0 → v1.4.0) |
|
||||
|
||||
Åtte av ni har SAMME enkeltårsak. Alle sju golden-filene ligger under po sin egen `examples/` — **0
|
||||
under `shared/`**, altså treffer en framtidig bump ikke den pull-only subtree-kontrakten.
|
||||
|
||||
### 2c′ — FUNNET som avgjør: forfalskningsvakten går INERT, og suiten sier ingenting
|
||||
|
||||
`okf._carries_complete_ingest_stamp` (`okf.py:1239`) er halvdelen av invarianten «kuraterte skrivere
|
||||
kan ikke forfalske ingest-stempelet»: `write_concept_file` reiser `IngestStampError` når frontmatter
|
||||
bærer BEGGE halvdeler av eierskaps-stempelet. `generated`-halvdelen leses mot
|
||||
`_YAML_TRUE_LITERALS = {"true", "yes", "on"}`.
|
||||
|
||||
Målt på guard 1.4.0 / okf 0.8.5:
|
||||
|
||||
```
|
||||
pre-V1 form ({"generated": "true", ...}) -> True
|
||||
V1 flow-mapping ({"generated": "{ by: process:okf-ingest, at: ... }"}) -> False
|
||||
```
|
||||
|
||||
Emitteren skriver nå nøyaktig den formen vakten IKKE gjenkjenner. Konsekvensen er at en kuratert
|
||||
skriver kunne skrevet `generated: { by: … } + ingest_manifest` og **ikke blitt nektet** — vakten
|
||||
slutter å vokte. Og `test_ingest_stamp_fail_closed_loadbearing.py` sto **GRØNN** gjennom hele
|
||||
bump-kjøringen, fordi den bruker literalformene. Dette er ordrett den fella invariant-raden i
|
||||
CLAUDE.md ble skrevet for: *«en fremtidig `uv sync` mot en skrivemåte som `yes`/`on` ville latt
|
||||
vakten slutte å vokte uten én lokal diff»* — bare med en annen skrivemåte enn den forutså.
|
||||
|
||||
Dette er ikke «et avvik å navngi rad for rad». Det er en gate som slutter å gate, og den er ikke
|
||||
dekket av noen test.
|
||||
|
||||
### 2d — BESLUTNING: **INGEN BUMP**
|
||||
|
||||
(ii) er rød, og 2c′ er den ekte grunnen: å lande bumpen nå ville shippet en avvæpnet
|
||||
sikkerhets-invariant med suiten grønn på nøyaktig den sømmen. Ordrens regel er fulgt
|
||||
(«Er noe rødt: INGEN bump»), og begge utfall er godkjent leveranse.
|
||||
|
||||
**Hva som må endres i po FØR bumpen kan landes — komplett, målt liste:**
|
||||
|
||||
1. **`okf._carries_complete_ingest_stamp` + `_YAML_TRUE_LITERALS`** må gjenkjenne V1-flow-mapping-
|
||||
formen i tillegg til literalene. **FØRST** — dette er den eneste raden som er sikkerhetsbærende.
|
||||
2. **`tests/test_ingest_stamp_fail_closed_loadbearing.py`** utvides med en mutasjon for den nye
|
||||
formen, ellers gjentar raden 1 seg ved neste emitter-endring.
|
||||
3. **7 golden-konseptfiler** regenereres (1 linje hver): `examples/ingest-golden-file/expected-bundle/`
|
||||
`ingest-costs.md`, `ingest-edge.md` · `…-http/…/ingest-report.md`, `ingest-status.md` ·
|
||||
`…-sql/…/ingest-costs.md`, `ingest-meta.md` · `…-mcp/…/ingest-cost-docs.md`. Regenerering er en
|
||||
BESLUTNING, ikke opprydding — de pinner formen Door A ble målt mot.
|
||||
4. **4 tester** som asserterer `generated == "true"`: `test_ingest_loadbearing`,
|
||||
`test_ingest_materialize`, `test_ingest_mcp`, `test_ingest_sql`.
|
||||
5. **2 prosa-steder** som navngir den gamle formen: `ingest_mcp.py:29`, `okf.py:1278`.
|
||||
6. **`pyproject.toml`**: okf `rev = "v0.8.5"` OG guard `tag = "v1.4.0"` — `tag=`, ikke `rev=`, og
|
||||
ikke v1.2.0 (§ 2a).
|
||||
7. **`pyproject.toml:40`-kommentaren** («zero runtime deps») er allerede usann for v0.8.5 og må
|
||||
rettes i samme trekk: okf-kjernen har nå ÉN runtime-avhengighet, guarden.
|
||||
8. **`tests/test_okf_version_guard.py`**: pinnene og kostnads-meldingene oppdateres.
|
||||
|
||||
Punkt 7 er IKKE rettet nå. Kommentaren beskriver den pinnede v0.3.2, som faktisk har null runtime-
|
||||
avhengigheter; å skrive om den mens pinnen står ville gjort den usann i den andre retningen.
|
||||
|
||||
**Leveransen fra DEL 2 er `tests/test_okf_version_guard.py`**, som nå pinner det MÅLTE (0.3.2/0.3.4)
|
||||
i to halvdeler — installert distribusjon + `pyproject` — og hvis nekt-meldinger NAVNGIR kostnaden
|
||||
over, slik at neste økt ikke løfter pinnen uten å re-måle.
|
||||
|
||||
Fire mutasjoner, hver med sin egen signatur, alle røde, deretter restaurert grønn:
|
||||
|
||||
| # | Mutasjon | Utfall |
|
||||
|---|---|---|
|
||||
| M1 | okf-asserten reiser aldri | 1 rød (nekt-armen) |
|
||||
| M2 | okf-asserten reiser alltid | 1 rød (installert-kontrollen) |
|
||||
| M3 | guard-asserten reiser aldri | 1 rød (guardens nekt-arm) |
|
||||
| M4 | pinne-konstanten drives til `0.3.3` | **2 røde** — installert-armen OG `pyproject`-armen, altså er avledningen levende og ikke to literaler |
|
||||
|
||||
Sporet tre: **1582 passed / 5 skipped** (fra 1577/5, strengt supersett, 0 fjernet) · begge goldener
|
||||
byte-uendret · `ruff check` All checks passed · `ruff format` 212 filer · `mypy` 37 filer.
|
||||
|
||||
---
|
||||
|
||||
## § 3 — R761 gratis-navigasjon (DEL 3)
|
||||
|
||||
### 3a — målingene
|
||||
|
||||
`portfolio_optimiser.okf.navigate_bundle`, tre kjøringer hver, `/usr/bin/time -l`. po hadde ALDRI
|
||||
sett R761 før denne økten (`grep -rln "R761\|r761" docs src tests` = 0).
|
||||
|
||||
| Base | Navigasjon (s) | Prosess-real (s) | Maks RSS (MB) | `files` | `context_files` | `verdicts` | `skipped` |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| `n100-2023` | 0,219 · 0,201 · 0,210 | 2,01 · 2,03 · 2,06 | 110,9 · 111,2 · 111,4 | 450 | 446 | 0 | **0** |
|
||||
| `r761-2025` | 8,580 · 6,889 · 7,108 | 10,39 · 8,59 · 9,03 | 131,2 · 131,1 · 131,9 | 5 514 | **2 756** | 0 | **0** |
|
||||
|
||||
Prosess-real inkluderer ~1,8 s tolkerstart (`uv run python`); navigasjonstallet er `perf_counter`
|
||||
rundt `navigate_bundle` alene.
|
||||
|
||||
**Avstemming av nevneren.** R761 på disk: 2 758 `index.md` + 2 756 andre `.md` = 5 514 filer i
|
||||
2 758 kataloger. `navigate_bundle` når alle 5 514 og hopper over **null** lenker;
|
||||
`context_files` = 2 756, altså faller nøyaktig de 2 758 nestede/rot-indeksene bort (navigasjon, ikke
|
||||
innhold), og `verdicts` = 0. Ordrens «2 757 seksjoner» = de 2 757 underkatalogene; den målte
|
||||
konsept-tellingen er **2 756**.
|
||||
|
||||
**Leseretning.** R761 er ~12× N100 i filer og koster ~34× i navigasjonstid (7,1 s mot 0,21 s) men
|
||||
bare **+18 % RSS** (131 mot 111 MB). Tiden er I/O-dominert (sys-tid 2,7–3,1 s mot N100s 0,35 s;
|
||||
2 758 katalog-traverseringer), ikke minne. Ingen av dem er i nærheten av et problem for en gratis
|
||||
oppstart: verste målte navigasjon av R761 er 8,6 s, én gang per verktøykall.
|
||||
|
||||
**Ikke målt her, og det er den interessante kostnaden:** hva R761 koster i TOKENS gjennom stigen
|
||||
(`list_bundles` → `read_bundle` → `read_dir` → `read_file`). S7a-3 målte K2s 629 konsepter til
|
||||
42 761 o200k-tokens i flat form, og hierarkiet tok rota ned til 1 495. R761 har **4,4× så mange
|
||||
konsepter som K2**, og det tallet er ikke tatt.
|
||||
|
||||
### 3b — hvordan fire bundler gis til ÉN kjøring i dag
|
||||
|
||||
**Målt flate, ikke forslag:**
|
||||
|
||||
- `--bundle-dir` tar **ÉN** katalog (`run.py:2444`). CLI-en mater utforskningen med en 1-tuppel:
|
||||
`bundle_dirs=(args.bundle_dir,)` (`run.py:3606`) — det er det eneste `bundle_dirs=`-kallstedet i
|
||||
hele `run.py`.
|
||||
- `run_mandate_across_bundles` (`run.py:2124`) TAR N baser og partisjonerer et mandat over dem via
|
||||
`mandate.route_by_bundle`, men har **ingen CLI-flate**: ingen kaller i `main()`, kun tester og
|
||||
`explore.py`-prosa refererer den. Dette er den bevisste grensen fra multi-base-raden.
|
||||
- `--docs-dir` er en ANNEN søm: den mater `retrieve_chunks`/`make_retrieval_tool`
|
||||
(`run.py:1194`/`1204`), altså keyword-chunk-henting — ikke OKF-navigasjon. På bundle-stien settes
|
||||
`docs_dir=bundle_dir` (`run.py:678`, `:2263`).
|
||||
- Repeterbart `--bundle-dir` er **NEI** i STATE og bygges ikke her.
|
||||
|
||||
**`--mandate`-JSON-formatet** (`run.py:2459`, `mandate.py`) — utgangspunktet for «hva man ønsker å
|
||||
optimalisere på»:
|
||||
|
||||
```json
|
||||
{
|
||||
"objective": "<fri prosa: hva kjøringen er til for>",
|
||||
"allow_own_proposals": true,
|
||||
"success_criteria": ["<fri prosa>", "..."],
|
||||
"approaches": [
|
||||
{
|
||||
"id": "<unik, ikke 'own-proposal'>",
|
||||
"label": "<ekspertens ord; blir SavingsProposal.measure VERBATIM>",
|
||||
"description": "<ekspertens begrunnelse; går ordrett i proposer-prompten>",
|
||||
"affected_codes": ["<kostkode>", "..."],
|
||||
"claimed_saving_nok": 0,
|
||||
"bundle_id": "<rutingsnøkkel; tom = 'ingen base navngitt'>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`Approach.bundle_id` ER multi-base-nøkkelen og finnes allerede, default `""`. Tallmålet hører IKKE
|
||||
hjemme her — det bor i `contracts.GoalContract` / `--goals`.
|
||||
|
||||
**Hva P14 må VELGE mellom (ikke avgjort her):**
|
||||
|
||||
| Alternativ | Hva det koster | Hva det kjøper |
|
||||
|---|---|---|
|
||||
| **(a) Én bundle per kjøring, fire kjøringer** | Fire `run_id`-er, fire utbokser, ingen kryss-base-læring i én `VerdictStore` med mindre en kaller tråder den; ingen kodeendring | Virker I DAG, uendret CLI. Den eneste som er nåbar uten ny flate. |
|
||||
| **(b) `--docs-dir` for «resten»** | Er en ANNEN mekanisme — keyword-chunks, ikke navigasjon; §4.1a-dimensjonsgaten og verdict-gaten sitter på navigatør-verktøyene, ikke på chunk-verktøyet | Billig å skrive. **Men den omgår stigen og to gater — jeg fraråder den, og den er uprøvd.** |
|
||||
| **(c) CLI-flate for `run_mandate_across_bundles`** | NY operatørflate (repeterbart `--bundle-dir` eller `--bundle-dirs`), altså en egen beslutning STATE i dag sier NEI til; dispatchen er sekvensiell, N kjøringer trenger N `run_id`-er, og outboxen er ikke wiret | Den ENESTE som gir ett mandat rutet over fire baser med én delt `VerdictStore`. Motoren finnes ferdig og er load-bearing-testet; det som mangler er argparse + `run_id`-mynting. |
|
||||
|
||||
P14 skriver kontekstsettet; valget mellom (a) og (c) er operatørens, og (c) er en bygge-ordre —
|
||||
ikke noe denne økten har mandat til.
|
||||
|
||||
---
|
||||
|
||||
## § 4 — Honesty limits
|
||||
|
||||
1. **Bumpen er ikke prøvd mot et EKTE ingest-kjør** utover suitens fixturer. At okf 0.8.5 oppfører
|
||||
seg riktig på et levende manifest er ikke vist.
|
||||
2. **Guard-kalibreringen** (`_ACCEPTED_DISPOSITION = "warn"`) er bekreftet kun gjennom
|
||||
`test_ingest_content_gate_loadbearing`s egne dokumenter. Guardens egen CHANGELOG sier at
|
||||
dispositions er fri til å flytte i enhver 1.x; en bredere måling er ikke gjort.
|
||||
3. **De sju golden-filene er TALT, ikke regenerert.** At regenereringen gir nøyaktig den ene
|
||||
linje-endringen i alle sju er målt for `ingest-golden-file` (to filer, direkte diff) og utledet
|
||||
for de fem andre fra deres feilmeldinger — http/sql/mcp-goldenene kan ikke materialiseres utenfor
|
||||
testenes stubber (de krever `PORTEFOLJE_SQL_DSN` / nettverks-opt-in).
|
||||
4. **R761-tallene er ÉN maskin, tre kjøringer, varm filsystem-cache.** Første R761-kjøring var
|
||||
8,58 s mot 6,89/7,11 s for de to neste; spredningen er oppgitt, ikke bortsnittet.
|
||||
5. **`Bundle.skipped` = 0 på begge baser** betyr at hver kryss-lenke ble fulgt — ikke at basene er
|
||||
komplette. Det er et utsagn om navigasjonen, ikke om innholdet.
|
||||
6. **Ingen modellkall, ingen Azure, NOK 0.** Ingenting her sier hva en modell gjør med R761.
|
||||
7. **§ 3.2 (b) er frarådet uten å være målt.** Begrunnelsen er kodelesning (gatene sitter på
|
||||
navigatør-verktøyene), ikke en kjøring.
|
||||
|
||||
---
|
||||
|
||||
## § 5 — Reproduksjon
|
||||
|
||||
```bash
|
||||
# DEL 1
|
||||
git log --oneline origin/main..main | wc -l
|
||||
ls ~/.claude/coord/portfolio-optimiser/inbox/*.md | wc -l
|
||||
grep -rn "parse_frontmatter" src tests | wc -l
|
||||
grep -rn "llm_ingestion_okf" src | wc -l
|
||||
grep -rn "import yaml\|yaml.safe_load\|yaml.load" src tests | wc -l
|
||||
|
||||
# DEL 2a
|
||||
grep -n "llm-ingestion-okf\|llm-ingestion-guard" pyproject.toml uv.lock
|
||||
git -C ~/repos/llm-ingestion-okf show v0.8.5:pyproject.toml | grep -A2 "tool.uv.sources"
|
||||
git ls-remote --tags https://git.fromaitochitta.com/open/llm-ingestion-pipeline-security.git
|
||||
|
||||
# DEL 2b (rød FØRST, på dagens pinne -- men vaktfila er nå oppdatert til å pinne 0.3.2/0.3.4,
|
||||
# så re-kjøring i dag er GRØNN; RED-beviset var mot v0.8.5/v1.2.0-konstantene)
|
||||
uv run pytest tests/test_okf_version_guard.py -q
|
||||
|
||||
# DEL 2c (worktree -- ALDRI i det sporede treet)
|
||||
git worktree add --detach /tmp/po-wt HEAD
|
||||
cp STATE.md /tmp/po-wt/STATE.md # handover-gatens egen kontroll trenger den
|
||||
cd /tmp/po-wt
|
||||
uv sync && uv run pytest -q # kontroll: 1579/3/5
|
||||
sed -i '' 's|okf.git", rev = "v0.3.2"|okf.git", rev = "v0.8.5"|' pyproject.toml
|
||||
sed -i '' 's|security.git", rev = "v0.3.4"|security.git", tag = "v1.4.0"|' pyproject.toml
|
||||
uv lock && uv sync && uv run pytest -q # etter: 1573/9/5
|
||||
shasum -a 1 tests/golden/demo-transcript.stdout tests/golden/demo-transcript.stderr
|
||||
uv run ruff check . --exclude scratchpad && uv run mypy src
|
||||
|
||||
# DEL 2c' -- funnet
|
||||
uv run python -c "
|
||||
from portfolio_optimiser.okf import _carries_complete_ingest_stamp as f
|
||||
print(f({'generated':'true','ingest_manifest':'m.json'}))
|
||||
print(f({'generated':'{ by: process:okf-ingest, at: 2026-07-03T12:00:00Z }','ingest_manifest':'m.json'}))"
|
||||
|
||||
# DEL 3a
|
||||
for b in n100-2023 r761-2025; do for i in 1 2 3; do
|
||||
/usr/bin/time -l uv run python - "$HOME/repos/vegnormal-okf/build/ferdig/$b" <<'PY'
|
||||
import sys, time
|
||||
from portfolio_optimiser import okf
|
||||
t0 = time.perf_counter(); b = okf.navigate_bundle(sys.argv[1]); dt = time.perf_counter() - t0
|
||||
print(f"WALL={dt:.3f}s FILES={len(b.files)} CONTEXT={len(b.context_files)} "
|
||||
f"VERDICTS={len(b.verdicts)} SKIPPED={len(b.skipped)}")
|
||||
PY
|
||||
done; done
|
||||
|
||||
# DEL 3b
|
||||
grep -n '"--bundle-dir"\|"--docs-dir"\|"--mandate"' src/portfolio_optimiser/run.py
|
||||
grep -n "bundle_dirs=" src/portfolio_optimiser/run.py
|
||||
grep -rn "run_mandate_across_bundles" src tests
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue