The 1.4.0 release commit (d19de8c) dated the CHANGELOG heading and nothing
else, so the tag went out with README, ADOPTION-BRIEF and BRIEF still
naming 1.3.0 and the install pin still installing 1.3.0. This bumps the
badge, status line and install pin in README, the status and "as of"
lines in ADOPTION-BRIEF (test count 868 -> 893) and BRIEF's status line.
The tag itself is not moved.
Three claims that went false earlier are corrected against the code:
- README said `resource` is deliberately not on the frontmatter allowlist
and that a `sources` block list of mappings is refused. Both stopped
being true in 1.3.0. The paragraph now names the four mapping carriers
and says `resource` / `usage_window` are admitted inside a `sources`
entry only.
- README described the `resource` https-allowlist without its scope. It
covers the top-level `resource` only; `sources[].resource` is never
URL-validated (measured: `javascript:` there imports with no error).
- LIMITATIONS still listed `tags: [a, b]` among the routes that fail.
It parses since 1.4.0.
Gates after the edit: 893 passed, coverage exit 0, redos-sweep exit 0,
45 LIMITATIONS entries.
87 lines
5.4 KiB
Markdown
87 lines
5.4 KiB
Markdown
# 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, tagget og pushet** (`d19de8c`). Release-commiten daterte
|
|
bare CHANGELOG-en; de fire dokumentflatene (README-badge + install-pin,
|
|
ADOPTION-BRIEF, BRIEF) ble bumpet i en egen docs-commit etterpå — taggen selv
|
|
bærer fortsatt `1.3.0` i de flatene, og tags flyttes aldri. 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 `<base>` 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: `<a>`/`<area>` er klikk-krevende og rapporteres
|
|
som `active:raw-html-link` (MEDIUM), og en tagg hvis hele affordans ER en URL den
|
|
ikke bærer (`</a>`, `<Frame>`, `<video />`) er inert. Klassifisering skjer i
|
|
`active_tag_class`; `is_active_tag` er en tynn wrapper, og census patcher den
|
|
FØRSTE (en boolsk patch kan ikke uttrykke en regradering).
|
|
ZWJ (U+200D) dømmes på KONTEKST, ikke identitet — unntas kun mellom to emoji, på
|
|
begge flater (`sanitize` eier predikatet, `output` importerer det).
|
|
Start med `docs/BRIEF.md` for design, `README.md` for bruk, `docs/PLAN.md` for
|
|
byggerekkefølgen.
|
|
|
|
## Konvensjoner
|
|
|
|
- Norsk for dialog og planer, engelsk for kode og innhold (repoet er publisert).
|
|
- Ingen GitHub — kun Forgejo (`git.fromaitochitta.com`).
|
|
- Remote satt: offentlig `open/`-speil på Forgejo; push hver commit (durabelt autorisert).
|
|
- Minimal-dependency: stdlib-first kjerne; ML/judge-detektorer bak extras.
|
|
|
|
## Communication patterns
|
|
|
|
### Linking to local files
|
|
|
|
When pointing to local files in responses, always use markdown link syntax with a descriptive name:
|
|
|
|
- Use `[Human-friendly name](file:///absolute/path)` — never bare `file:///...` URLs or autolinks `<file://...>`.
|
|
- Always use absolute paths. Never `~/` or relative paths.
|
|
- For multiple files, render as a bullet list of named markdown links.
|
|
|
|
Why: bare `file://` URLs only render the first as clickable across multiple lines. Named markdown links make each entry independently clickable and look cleaner.
|
|
|
|
Example (the path is a placeholder — the checkout root is the reader's own, and
|
|
this file is published, so it must not carry one machine's directory layout):
|
|
|
|
- [Brief](file:///absolute/path/to/llm-ingestion-pipeline-security/docs/BRIEF.md)
|