feat(ms-ai-architect): Layer B ingestion-gate — deterministisk adversariell-innhold-skann før skriving/commit (G6 §8 / R6 punkt d, TDD) [skip-docs]

Load-bearing gaten i den to-lags ingestion-sikkerheten: en deterministisk,
alltid-på node-skann (unicode/injection/base64, prosa + fenced code blocks) over
kandidat skills/**/*.md, wiret inn som sibling til validate-kb-file.mjs ved det
ENESTE skrive-chokepunktet — dekker kb-update + generate-skills + fremtidig R7.

- lib/adversarial-scan.mjs: ren disposition-kjerne (provenance-tiering + BLOCK/
  WARN-matrise). Ortogonal til korrekthets-judgen.
- lib/adversarial-detect.mjs: bro til de DELTE llm-security-detektorene
  (scanForInjection-lexikon + unicode-scanner + base64/entropi) — ingen kopi av
  lexikonet. Fail-closed hvis llm-security fraværende.
- scan-adversarial-content.mjs: CLI (speiler validate-kb-file.mjs); exit 1=BLOCK
  (aldri skriv), 2=WARN (flagg → menneske), 0=ren.
- 30 tester (19 kjerne + 7 CLI + 4 integrasjon mot ekte llm-security). Suite 692/0.

Premiss-verifisert mot live kode: research/research-agent skriver ingenting
(kun Layer A); R7-judge re-bruker samme create-guard; CLI-scan alene misset
injection+base64 for markdown → importerer rene primitiver i stedet.
This commit is contained in:
Kjell Tore Guttormsen 2026-07-04 07:13:43 +02:00
commit 89dcd80cbc
8 changed files with 770 additions and 14 deletions

View file

@ -180,14 +180,19 @@ Task(general-purpose, sonnet): "Research + write skill: Multi-Index..."
1. **Parse kvitteringer** fra agentene
2. **Verifiser filer finnes** med Glob
3. **Create-guard (OBLIGATORISK — Spor 3 Port 2):** kjør gaten over batchens nye filer:
3. **Create-guard (OBLIGATORISK — to sibling-gater):** kjør BEGGE over batchens nye filer:
```bash
node scripts/kb-update/validate-kb-file.mjs <fil1.md> <fil2.md> ...
node scripts/kb-update/scan-adversarial-content.mjs <fil1.md> <fil2.md> ...
```
Gaten exit-er ≠0 hvis en fil mangler `Source`, ikke er født-verifisert (mangler
`Verified`/`Verified by`), eller er en stor fil uten TOC. **En fil som FAIL-er
committes IKKE** — logg den i `state.failed` og send den til menneske-gaten. Dette er
det som hindrer generatoren i å re-introdusere drift (avhengighet før Spor 1).
Kontrakt-gaten exit-er ≠0 hvis en fil mangler `Source`, ikke er født-verifisert (mangler
`Verified`/`Verified by`), eller er en stor fil uten TOC. **Layer B ingestion-gaten
(G6 §8 / R6 punkt d)** exit-er 1 (BLOCK — aldri committ, karantene) på adversarielt
innhold (unicode/injection/base64 i prosa + fenced code blocks, via delte llm-security-
detektorer) eller 2 (WARN — flagg for operatør, ikke auto-committ). **En fil som FAIL-er
noen av gatene committes IKKE** — logg den i `state.failed` og send den til menneske-
gaten. Dette hindrer generatoren i å re-introdusere drift (kontrakt) OG i å persistere en
forgiftet referansefil (Layer B — ortogonal til korrekthet).
4. **Oppdater state.json:**
- Legg til ferdige (gate-PASS) skill-IDer i `completed`
- Legg til feilede/gate-FAIL i `failed`
@ -209,15 +214,17 @@ Task(general-purpose, sonnet): "Research + write skill: Multi-Index..."
Gjenstår: N skills
```
2. **Create-guard FØR commit (OBLIGATORISK):** kjør gaten over ALLE filer du er i ferd
med å committe. Bare gate-PASS-filer skal med:
2. **Create-guard FØR commit (OBLIGATORISK — begge gater):** kjør BEGGE over ALLE filer du er
i ferd med å committe. Bare filer som passerer BEGGE skal med:
```bash
node scripts/kb-update/validate-kb-file.mjs $(git diff --name-only --diff-filter=AM -- 'skills/ms-ai-*/references/**/*.md')
FILES=$(git diff --name-only --diff-filter=AM -- 'skills/ms-ai-*/references/**/*.md')
node scripts/kb-update/validate-kb-file.mjs $FILES
node scripts/kb-update/scan-adversarial-content.mjs $FILES # Layer B ingestion-gate (G6 §8)
git add skills/ms-ai-*/references/<dirs>/ scripts/skill-gen/state.json
git commit -m "docs(architect): generate N knowledge skills (category-names)"
```
Hvis gaten exit-er ≠0: IKKE commit de feilende filene — fjern dem fra staging og send
til menneske-gaten.
Hvis noen av gatene exit-er ≠0: IKKE commit de feilende filene — fjern dem fra staging og
send til menneske-gaten (kontrakt-FAIL rettes; Layer B BLOCK karantenes/adjudiseres).
3. **Oppdater STATE.md** med ny status
@ -316,7 +323,7 @@ status: success|no_changes|failed
```
4. Track in `state.json` under a new `"updated"` array
5. **Create-guard (OBLIGATORISK):** `node scripts/kb-update/validate-kb-file.mjs <oppdaterte filer>` — gate-FAIL committes IKKE
5. **Create-guard (OBLIGATORISK — begge gater):** `node scripts/kb-update/validate-kb-file.mjs <oppdaterte filer>` + `node scripts/kb-update/scan-adversarial-content.mjs <oppdaterte filer>` (Layer B ingestion-gate, G6 §8) — FAIL på noen av dem committes IKKE
6. After each batch, verify files still pass `validate-plugin.sh`
**Key difference from generation:** Update uses Edit (preserves structure), generation uses Write (creates from scratch).