linkedin-studio/scripts/contract-gate/README.md
Kjell Tore Guttormsen 58aebf05a9 feat(linkedin-studio): deterministic §B/§C1 contract binding-gate (fix #1 slice 1)
Adds scripts/contract-gate/ — a deterministic, AI-free gate that enforces the
mechanical half of the Maskinrommet writing contract (§B red flags + §C1
regelsjekk) BEFORE operator handoff, so the same mechanical correction never
reaches KTG twice. First slice of fix #1 (binding + accumulating); target
re-scoped to close all 4 diagnosis gaps = sustainable newsletter workflow.

- Structured ruleset as DATA (src/rules.ts) so accumulation (slice 2) appends.
- 3 BLOCK (modell-strawman, series-thesis "er ikke modellen", _underscore_)
  + 7 WARN (judgment-needed). Block only on provable, ~zero-FP matches.
- Code/frontmatter masking; line-accurate reporting; CLI receipt + exit code.
- 21/21 tests (node:test), tsc clean.
- Validated on 6 real editions: 0 BLOCK on published Del 2-5; caught a real
  Rule-10 violation in Del 6 (WIP) automatically. Versal-tic uses an
  emphasis-word denylist after real-data FPs (NAV/DFØ/NPM).

Finding: the plugin already mirrors §A + §C2; §C1 was the unhomed gap this fills.
Plugin structure lint unchanged (81/0/0); no new agents/commands/refs/skills.
2026-06-20 17:17:51 +02:00

73 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Contract-gate — §B/§C1 mekanisk binding-gate
Deterministisk gate som håndhever den **mekaniske** halvdelen av Maskinrommet-skrivekontrakten
(`maskinrommet/docs/skrivekontrakt.md`: §B de ti reglene, §C1 regelsjekk-gaten, §C2 prosa-håndverk)
**før et utkast leveres til operatøren** — så de samme mekaniske korreksjonene aldri når KTG to ganger.
Dette er **slice 1** av fix #1 (§C2 bindende + akkumulerende). Den er bevisst _bindende_: ren
string/regex-evaluering, ingen AI, ingen nettverk — den kan ikke hoppes over eller snakkes rundt,
og kjører på millisekunder.
## Hva gaten gjør (og ikke gjør)
Tre-nivå-modellen fra diagnosen — denne gaten er **nivå 1**:
| Nivå | Hva | Hvem | Hvor |
|------|-----|------|------|
| **1 — rent mekanisk** | §B/§C1-grep + tellinger | **denne gaten** (BLOCK/WARN) | her |
| 2 — AI-mekanisk | §C1 pkt 1/8/9 | `voice-scrubber` (fikser før handoff) | Step 4 |
| 3 — ekte dømmekraft | §C2 narrativ-arkitektur | `editorial-reviewer` (flagg til KTG) | Step 5.5 |
**Klassifiseringsprinsipp:** BLOCK bare det gaten kan _bevise_ med ~null false positives.
Alt som krever dom → WARN (blokkerer ikke). Ekte dømmekraft / ekstern data er ikke her i det
hele tatt (blir hos nivå 2/3).
### Regler (seed)
| Regel | Ref | Severity |
|-------|-----|----------|
| Modell-stråmann (4 eksakte fraser) | §B-3 | **BLOCK** |
| Serie-tese «er ikke modellen» | §B-10 | **BLOCK** |
| `_understrek_`-emfase | §C1 | **BLOCK** |
| Metafor-ord (tak/lodd/reise/landskap) | §B-2 | WARN |
| Bar «modell» (alle treff) | §B-3 | WARN |
| «KI-en» som subjekt (>3×) | hygiene | WARN |
| PS-blokk | §B-9 | WARN |
| Tankestrek-tetthet (>1/50 ord) | §C2 | WARN |
| Versal-tic (emfase-ord, ikke akronymer) | §C2 | WARN |
| AI-tells (navngitte fraser) | §B-8 | WARN |
Reglene er **data** (`src/rules.ts`), ikke hardkodet logikk — det er det som gjør
akkumuleringen (slice 2) ren: en ny regel = én rad i `skrivekontrakt.md` + én post her.
### Bevisst utsatt (dokumenterte gap, ikke stille utelatelser)
- **§C2 «postulerte tall»** (tall uten hedge/kilde) — krever hedge-nærhet-heuristikk med
ikke-triviell false-positive-risiko.
- **§C2 «ordrette gjentakelser»** (n-gram gjentatt >2×) — krever n-gram-analyse; kontraktens
navngitte fraser er utgave-spesifikke.
Begge hører hjemme i en senere slice når heuristikken kan gjøres tillitsverdig.
## Kjøre
```bash
cd scripts/contract-gate
npm install # engangs (tsx + typescript)
node --import tsx src/cli.ts <utkast.md> # kvittering + exit 0/1
node --import tsx src/cli.ts <utkast.md> --json # maskinlesbart
npm test # 21 tester
```
Exit: `0` = passert (ingen BLOCK, handoff tillatt), `1` = blokkert, `2` = bruksfeil.
WARN feiler aldri gaten — de surfaces for KTGs dom.
## Validering (6 ekte utgaver, juni 2026)
- **0 BLOCK** på publiserte Del 25 → false-blokkerer ikke ekte arbeid.
- **Del 6 (WIP):** fanget et ekte Regel-10-brudd («Den knappe ressursen er ikke modellen» i
brødteksten) automatisk — slog-drepingen i praksis.
- **Del 1:** blokkerer på samme frase, men ble publisert **før** Regel 10 ble kodifisert (01.06) —
historisk artefakt, ikke gate-feil.
- Versal-tic-redesignet (denylist av emfase-ord, ikke allowlist av akronymer) fjernet
NAV/DFØ/NPM-false-positivene som ekte data avslørte.