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.
This commit is contained in:
parent
9338454ea4
commit
58aebf05a9
10 changed files with 1329 additions and 0 deletions
73
scripts/contract-gate/README.md
Normal file
73
scripts/contract-gate/README.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# 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 2–5 → 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue