Speiler MAF I2 fra shared/ingest-spec.md alene: manifest → CSV-konnektor → materialisert OKF-bundle, byte-identisk med den delte golden-fasiten. - ingest.py: ManifestContract (pydantic, fail-fast, file-kilde, verdict-reservasjon §3, id-grammatikk, max_rows), CSV-konnektor (boundary-checked fail-closed), materialisering (§5-frontmatter eksakt rekkefølge, markdown-tabell m/ escaping, LF-only, SHA-256 manifest-stamp), index-generering (§6), replacement §3/§5. - okf.py: _parse_index_entry — tolererer frontmatterløs index (method-spec §3: index rendres via body = summary, ikke som typet concept-fil). Golden var spec-konform; D7-okf var strengere enn standarden. Scoped: non-index concept- filer krever fortsatt type (honesty-test). - examples/ingest-golden-file/: repo-lokal golden (byte-frossen kopi av I2s fasit). - Speiltester (I2s load-bearing-sett, alle detach-bevist røde): golden byte-fasit + mutasjonskontroller · provenance/navigability/verdict-reservasjon/re-ingest-safety · kontrakt fail-fast/max_rows/boundary/kollisjon · spec-integritet §11. - docs/2026-07-04-I3-brief.md: brief + de to operatør-avgjorte beslutningene. Suite 239 passed uten nøkkel/nettverk (189 + 50 nye) · ruff + mypy --strict rene. [skip-docs] README + docs/extending.md er bevisst utsatt til I7 per sesjonsplan (programmet batcher ingest-doc der, avgrenset til det D7 faktisk har — CSV nå, SQL/HTTP senere). Endringen er dokumentert i docs/2026-07-04-I3-brief.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017MM6BWb1hWmJZuXFZ7rjxT
4.4 KiB
I3 — D7-speil av ingest (filkatalog/CSV) — brief
Forankret i hovedrepoets sesjonsplan
~/repos/portfolio-optimiser/docs/plan/2026-07-03-sesjonsplan-ingest.md§I3 og dette repoets STATE. Bygget frashared/ingest-spec.mdalene (subtree-pull fra commons) — aldri ved reverse-engineering av MAF-koden. Golden-bytene (den delte fasiten) er lest, siden spec §11 gjør dem til konformanskravet begge stacker reproduserer.
Mål (§I3)
Samme ingest-kontrakt konsumert uendret fra commons i dette søskenrepoet — beviser at
ingest-spec-en faktisk er delt: D7s uavhengige impl reproduserer MAF I2s golden byte-identisk
fra spec alene. Scope = file-kildetypen (lokal CSV-katalog). sql = senere (I5), http =
ikke i D7 (målbildet: HTTP/MCP demonstreres MAF-only, I6).
To beslutninger (operatør-avgjort denne økta)
-
Golden-fasit: repo-lokal kopi. I2 la ingest-golden repo-lokalt (
examples/ingest-golden-file, ulikt method-golden ishared/examples/). D7 speiler mønsteret: kopi i dette repoetsexamples/ingest-golden-file/, speiltest peker dit. Holder I3 som én lukket økt, ingen commons-runde. (Alternativ — løfte golden til commons — avvist: egen GATET runde + avvik fra I2-mønsteret.) -
okf relaksert for frontmatterløs index (følg standarden). Funn: den delte golden-ens
index.mdhar ingen frontmatter; D7sokf.navigate_bundlekrevde det → kunne ikke både reprodusere golden byte-identisk OG navigere den med uendret okf. method-spec §3 Step 1 er avgjørende: «the rendered read-context is the index body (the summary) followed by each non-index concept file as a## {type}: {title}section» — standarden behandler index via sin body, ikke som en typet concept-fil. Golden-en er altså spec-konform; D7s okf var strengere enn standarden. Fix:okftolererer nå frontmatterløs index (hele fila = body,typedefaulter tilindex); frontmatter-ful kuratert index parses uendret; non-index concept-filer krever fortsatttype(relaksasjonen er scoped, bevist av egen honesty-test). (Alternativ — «typet index overalt» via commons-RFC + MAF golden-regen — avvist: omskriver standarden for å romme en D7-quirk, endrer frossen fasit, flerrepo GATET.)
Leveranse
examples/ingest-golden-file/— repo-lokal golden (kopi av I2s, byte-frossen).src/portfolio_optimiser_claude/ingest.py—ManifestContract(pydantic, fail-fast,file-kilde, verdict-reservasjon §3, id-grammatikk,max_rows>0), CSV-konnektor (boundary-checked fail-closed), materialisering (§5-frontmatter i eksakt rekkefølge, markdown-tabell m/ §5-escaping, LF-only, SHA-256 manifest-stamp), index-generering (§6), replacement-semantikk (§3/§5).src/…/okf.py—_parse_index_entry(frontmatterløs index-toleranse, method-spec §3).- Speiltester (I2s load-bearing-sett):
test_ingest_golden.py(byte-fasit + 3 mutasjonskontroller),test_ingest_loadbearing.py(provenance / navigability / verdict-reservasjon / re-ingest-safety),test_ingest.py(kontrakt fail-fast, max_rows, boundary, kollisjon, escaping),test_ingest_spec_loadbearing.py(spec-integritet §11: fil finnes · navngir ingen toolkit · dokumenterer hvert kontrakt-felt) — D7-analogen til MAFs I1-guard.
SDK-kroker (STATE steg 4 — søk-først)
I3 (filkatalog/CSV) introduserer ingen SDK-flate: ingest er deterministisk, null modellkall.
Søk-først SDK-krok-reverifisering (API-drift på create_sdk_mcp_server) er relevant for I6
(HTTP/MCP), ikke I3 — utsatt dit kroken faktisk brukes. Eksisterende SDK-klient (sdk_client.py,
test_sdk_isolation.py) uendret og grønn i suiten.
Verifisering (kjørt, grønn)
- Golden byte-identisk konsumert (5/5, inkl. idempotens + mutasjonskontroller).
- Speiltester røde ved detach — alle fire sømmer bevist load-bearing (detach-bevis-skript).
- Søskensuite grønn uten nøkkel/nettverk: 239 passed (189 + 50 nye).
ruff check+ruff formatrene ·mypy --strict src: no issues (16 filer).
Åpent (forslag, ikke utført — utenfor I3-scope)
- Standard-evolusjon: vil operatøren senere ha «alle bundle-filer er typede concept-filer» (typet index overalt) som bevisst OKF-endring, er det en egen koordinert commons-RFC (begge specs, begge golden, begge okf). Dagens permissive okf er forover-kompatibel med det.