# llm-ingestion-pipeline-security ## Kontekst Gjenbrukbar, minimal defensiv layer for LLM **ingestion**-pipelines (write-time), til forskjell fra query-time chatbot-guardrails. Pakker det arkitektoniske kontraktet — sanitize → fence → tool-less karantenert transform → per-stadium capability-isolasjon → scan output før commit → fail-secure — som komponerbar, framework-agnostisk kode. Referanse-implementasjon: `claude-code-llm-wiki` Stage B (`tools/wiki_ingest/`). Lexikon-seed: `injection-patterns.mjs` fra `llm-security`-pluginen. Repoet er på **v1.4.0 i koden, UUTGITT** (`pyproject.toml` + `__init__.py` er bumpet; README-badge, install-pinnen, ADOPTION-BRIEF og BRIEF står med vilje igjen på `1.3.0`, som er den siste taggen som FINNES — en install-pin må peke på en ekte tag). Release-commiten (CHANGELOG-overskrift datert, de fire dokumentflatene bumpet, tag) er ikke tatt. Den eksporterte Python-surfacen er frosset under semver (deteksjonsatferd er det IKKE; kalibrering flytter seg i 1.x). Stdlib-kjernen er bygget og testet (15 moduler + topp-nivå wiring, showcase + korpus), inkl. OKF-adapter og aktivt-innhold- detektor (EchoLeak-klassen) i output-gaten. OKF-frontmatterens mapping-klasse har **fire** uttrykkbare bærere (G3 21.08, G30 02.09): flow-mapping som verdi og som blokkliste-element, flow-sekvens av flow-mappinger, og blokk-sekvens av blokk-mappinger (SPEC §5.1s egen form). HVER nøkkel i alle fire står på allowlisten og hvert blad er en ren skalar. Formen er trygg fordi allowlisten inspiserer hver nøkkel; det blanke avslaget var håndhevelsen, ikke poenget. **`resource` er allowlistet KUN inne i en `sources`-oppføring** — foreldre- nøkkelen avgjør, så `executor`/`attester` sin `resource` (§10, dør C) avvises gjennom hver eneste bærer. 1.2.0s begrunnelse for å utelate den (parseren manglet foreldre-kontekst) var målt feil: konteksten var der, den var bare aldri tredd gjennom. Topp-nivå blokk-mapping, dotted- og inline-kolon-rutene raiser fortsatt, en blokkliste kan ikke blande skalarer og mappinger, og en avvist mapping raiser — den degraderer aldri til en streng (1.1.0-defekten). **Flow-sekvens av rene skalarer (`tags: [a, b]`) PARSER fra 1.4.0** (P1, operatørbeslutning 08.09) — SPEC §4.1s eget skjelett. Et element er en ren skalar kun hvis det er ikke-tomt og uten `{ } [ ] : , " ' #`, og så gjelder den uendrete indikator-regelen; sitert element, kolon/komma i elementet, sekvens i sekvens, tomt element, anker og alias raiser fortsatt, og en flow-sekvens kan ikke blande skalarer og mappinger. **Målt med nevner: 0/53 → 6/53** på pinnet OKF-korpus (`3fcbb9f`). Den bindende skranken er IKKE tags/description, men `generated` som topp-nivå blokk-mapping (44/53) — den bruker opp dybde-1 og er en sikkerhetsbeslutning. P2 (blokksekvens uten innrykk) og P3 (foldet plain scalar) er MÅLT til 0/53 hver og bevisst IKKE bygget. `sources[].resource` URL-valideres ALDRI (T3 ser kun topp-nivå `resource`) — §5.1 tillater bundle-relative stier og scope-beskrivelser, så en https-gate ville over-blokkert konforme bundles; konsumenten må selv kalle `validate_resource_url`. Mode-b `import_bundle` skanner reserverte strukturfiler (`index.md`/`log.md`) i mottatte bundles i stedet for å path-avvise dem; upload-front-end beholder shadow-reject (`allow_reserved=False`). Output-gatens decode-and-rescan mater dekodet base64-klartekst gjennom BÅDE lexicon og secret-egress (LLM02), så en base64-innpakket credential fanges som `decoded:egress:*` i stedet for å forsvinne; hex-innpakket er en dokumentert restgap (entropy eksponerer kun base64-klartekst). `active:raw-html` krever et EKSTERNT mål på URL-attributt-grenen, og `` er ute av det aktive navnesettet; scanner og mutator har hver sin predikat (`is_active_tag` / `is_defangable_tag`). Rå HTML graderes nå også på BÆRER: ``/`` er klikk-krevende og rapporteres som `active:raw-html-link` (MEDIUM), og en tagg hvis hele affordans ER en URL den ikke bærer (``, ``, `