# 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 `shared/examples/tunnel-hauglia` (flat), `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).