The context sets, the packaged knowledge bases and the example bundles are replaced by one fictitious example set about IT operations in an invented organisation: three context sets (serverrom-2027, driftsavtale-2027 and the two-base drift-og-avtale-2027), two synthetic knowledge bases under src/portfolio_optimiser/data/kunnskapsbaser and two example bundles under src/portfolio_optimiser/data/bundles. Numbers, codes and structural values in tests and fixtures are kept; names, ids and wording change. Dated measurement documents that only recorded runs on the replaced material are deleted. Gate figures measured on the new set are not comparable with earlier ones. The exclusion gate from the previous commit is green: 0 tracked files hit outside the shared/ subtree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
124 lines
7.1 KiB
Markdown
124 lines
7.1 KiB
Markdown
# Hierarkisk navigasjon — målt på den ekte K2-bundelen
|
||
|
||
**Dato:** 2026-09-03 · **Ordre:** `20260903T034323Z-7704222791` punkt 2 (S7a-3) · **Økt 81**
|
||
**Base:** `~/corpora/okf-telling-20260829/K2-bundle-20260903` — 629 konsepter, 478 nestede
|
||
indekser, 1 108 filer på disk. Åpnet **slik den er levert** (mulig først etter punkt 1 i samme
|
||
ordre; før det nektet `BundleIdMismatch` fordi katalogen heter noe annet enn den erklærte id-en).
|
||
|
||
## 1. Hva som ble målt, og med hvilket instrument
|
||
|
||
Instrumentet er S7a-2s rettede sonde: hver prompt telles som **tekst + `function_call` +
|
||
`function_result`**, aldri `Message.text` alene (som måler en kontekstbærende prompt til noen få
|
||
tegn). Tokenisering: `o200k_base` (`tiktoken`), som er en utviklingsavhengighet i målingen og
|
||
**ikke** i pakka.
|
||
|
||
**Instrumentfeil funnet og rettet under målingen** (samme klasse som S7a-2s midtskive-sonde):
|
||
verktøyresultatet bærer `name=None` på transporten, så en sonde som nøkler på
|
||
`result:read_bundle` rapporterer **0 kopier** — som er umulig å skille fra en ekte null.
|
||
Sonden nøkler nå på resultatets eget INNHOLD (`"directories"`), og BEFORE-kjøringen reproduserer
|
||
S7a-2s publiserte tall (307 573 mot 307 496 tokens, 0,03 % avvik), som er den kjent-positive
|
||
kontrollen på at instrumentet kan finne det det leter etter.
|
||
|
||
BEFORE og AFTER er kjørt **i samme økt med samme kode**, der BEFORE er en mutasjon som gir
|
||
`read_bundle` den flate MAJOR-3-formen tilbake (mutasjons-harness-idiomet), ikke en historisk
|
||
kjøring hentet fra en rapport.
|
||
|
||
## 2. Resultat
|
||
|
||
| | BEFORE (flat listing) | AFTER (ett nivå) |
|
||
|---|---|---|
|
||
| `read_bundle`-nyttelast alene | **110 581 tegn / 42 761 tok** (629 oppføringer) | **3 954 tegn / 1 495 tok** (28 kataloger + 11 dokumenter) |
|
||
| Kopier i prompter | 7 | 8 (rot) + 7 (én `read_dir`) |
|
||
| Listing-tokens totalt | **307 573** | **12 595** |
|
||
| Andel av alle prompt-tokens | **89 %** | **26 %** |
|
||
| Prompt-tokens i hele kjøringen | **343 826** | **49 225** |
|
||
| Antall prompter | 12 | 13 |
|
||
|
||
### `read_dir` over den største katalogen — ordrens andre binding
|
||
|
||
Sveipet med den SHIPPEDE `okf.directory_listing` over **alle 478 nivåer** (1 rot + 477 kataloger):
|
||
|
||
| Nivå | tegn | tokens | oppføringer |
|
||
|---|---|---|---|
|
||
| **Verste nivå noe sted** (`del-i-konkurransebeskrivelsen-…`) | **6 073** | **2 094** | 65 kataloger, 0 dokumenter |
|
||
| Nest verste (`del-ii-bilag-3-7-milj-kartlegging-…`) | 4 064 | — | 25 kataloger, 12 dokumenter |
|
||
| Rota | 3 954 | 1 495 | 28 kataloger, 11 dokumenter |
|
||
|
||
**Verste nivå i hele korpuset koster 2 094 tokens — 4,9 % av den flate formens 42 761.** Den er
|
||
dyrere enn rota fordi den har størst forgrening (65 underkataloger), og fordi hver sti er
|
||
**bundle-relativ**: en katalog dypt nede betaler prefikset sitt én gang per oppføring. Det er den
|
||
målte prisen på at en sti er brukbar ORDRETT i neste kall, og alternativet — nivå-relative navn en
|
||
modell må komponere — er den ene feilen som gir en sti som aldri fantes.
|
||
|
||
**Utforskningens prompt-tokens faller 86 %** (343 826 → 49 225). `read_bundle`-nyttelasten alene
|
||
faller **96,5 %** (42 761 → 1 495 tokens).
|
||
|
||
**Den 13. prompten er en ærlig kostnad, ikke støy:** navigatøren tar nå ett steg til (`read_dir`
|
||
ned i prisskjema-katalogen) før den leser et dokument. Stigen har fått et trinn, og et trinn
|
||
koster en tur.
|
||
|
||
## 3. Premisset som ble felt før noe ble bygget på det
|
||
|
||
Ordren sier at `context_files` «ikke lenger skal forkaste hierarkiet». **Den har aldri holdt det
|
||
tilbake.** Hver `BundleFile.name` er allerede den fulle bundle-relative posix-stien
|
||
(`del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1.md`), så treet var alltid utledbart fra
|
||
navnene alene. Det som flatet det ut var **renderingen**.
|
||
|
||
Det er ikke pedanteri — det er grunnen til at `okf.bundle_context` og begge nav-goldenene er
|
||
**byte-identiske** etter endringen, som ordren krever eksplisitt. Egenskapen kom gratis, ikke av
|
||
forsiktighet.
|
||
|
||
Kataloger utledes derfor av STIER, aldri av `index.md`-filer: en nestet indeks er navigasjon, ikke
|
||
innhold (`context_files` dropper den på hvert nivå, og må fortsette med det, ellers følger
|
||
dom-laget med). Utledning fra navn betyr også at en katalog nådd via en lenke som hoppet over
|
||
indeksen fortsatt er synlig.
|
||
|
||
## 4. Avvik fra ordrens ordlyd, målt
|
||
|
||
Ordren formulerer taket som «`read_bundle` over K2-bundelen < 1 500 tegn». **Begge halvdeler av den
|
||
setningen holder ikke, og begge er målt:**
|
||
|
||
1. **K2 kan ikke være en testavhengighet.** Basen ligger utenfor repoet (`~/corpora/`). MAJOR-3-gaten
|
||
hadde samme begrensning og løste den likt: gaten binder den største basen som faktisk shippes,
|
||
og K2-tallene bor i en rapport. Gaten her binder derfor den største flate eksempelbasen
|
||
(den gang et energi-eksempel i commons, i dag `driftssenter-kjoling`),
|
||
`shared/examples/nav-golden-hierarchy/bundle` (nestet) og en syntetisk base på 242 konsepter bak
|
||
20 kataloger — der den FLATE formen er over 5× taket den nivå-formen ligger godt innenfor.
|
||
2. **1 500 tegn er ikke oppnåelig for K2s rotnivå, og skal ikke være det.** Rota bærer **39
|
||
identifiserbare oppføringer** (28 kataloger + 11 toppdokumenter) og måler **3 954 tegn ≈ 1 366
|
||
o200k-tokens** (2,89 tegn/token), og det verste nivået noe sted i korpuset **6 073 tegn / 2 094
|
||
tokens**. Å presse dem under 1 500 tegn ville krevd at titler eller oppføringer ble droppet —
|
||
repoets vakuøs-gate-klasse. Taket i testen er 1 500 TEGN per listing over de basene gaten kan
|
||
se, og egenskapen som produserte fallet er gatet direkte (kostnaden følger oppføringer på ETT
|
||
nivå, ikke dokumenter i basen). Ordrens kriterium er altså **ikke** oppfylt bokstavelig for K2;
|
||
det som ER oppfylt er bindingen: intet nivå i K2 koster mer enn **4,9 %** av den flate formen.
|
||
|
||
## 5. Ærlighets-grenser
|
||
|
||
- **Dette er ikke «−86 % kostnad» for enhver kjøring.** En navigatør som stiger ned *k* nivåer
|
||
betaler *k* listinger; gevinsten er at den betaler for det den VALGTE, og at hver listing rir fra
|
||
SITT kall og framover.
|
||
- **At en LEVENDE modell navigerer BEDRE med en katalogstruktur enn med 629 flate dokumenter er
|
||
IKKE bevist** (samme klasse som structured-output-grensen). Manuset er skriptet.
|
||
- **Multiplikatoren gjelder dette manuset.** 8 og 7 kopier er hva denne kontrakten og dette
|
||
manuset ga; en annen kontrakt gir andre tall.
|
||
- **`navigate_bundle` kalles fortsatt per verktøykall** — I/O og veggklokke, ikke tokens; ikke målt
|
||
her (samme grense som katalogmålingen i økt 65).
|
||
- **Debatten er urørt.** `okf.bundle_context` er byte-identisk, og demo-transkriptet er
|
||
byte-uendret (`shasum -a 1` = `ea8c534773acdbe41ae68f2c55724d69aaf8be4f`).
|
||
|
||
## 6. Kommandoer
|
||
|
||
```sh
|
||
# AFTER
|
||
uv run --with tiktoken python scratchpad/s7a3/k2_profile.py after
|
||
# BEFORE (patcher kilden, kjører, gjenoppretter)
|
||
uv run python scratchpad/s7a3/k2_before.py
|
||
# gatens egne tall
|
||
uv run python scratchpad/s7a3/measure_sizes.py
|
||
# ordrens andre binding: alle 478 nivaaer med den shippede funksjonen
|
||
uv run --with tiktoken python scratchpad/s7a3/k2_read_dir_sweep.py
|
||
```
|
||
|
||
Kontroll ved slutten av punkt 2: **1 252 passed / 5 skipped**, `ruff` og `mypy` rene, golden
|
||
byte-uendret. Ni mutasjoner, alle røde mot HELE suiten (N1–N9).
|