Slice 2 av fix #1 («rettelser fester seg»): binder rules.ts til den menneskelige sannhetskilden (skrivekontrakt §E), så en korreksjon gjort én gang håndheves for alltid i stedet for å gjenoppdages hver utgave (diagnose-gap 2). - ratify.ts: importerer RULES direkte (ingen skjør tekst-parsing), krever en bijeksjon mot §E gate-bindings-manifestet (id ↔ ref ↔ severity) + dangling- §-anker-sjekk. CLI: `--ratify [kontrakt]` / `npm run ratify`. Sti: arg > env MASKINROMMET_CONTRACT > default (relativt til modulen). - edition-state.template: foldIns[] fangst-kø (per-artikkel proveniens, pending|promoted|rejected, mekanisk→rules.ts / dømmekraft→§C2). - 12 nye tester (33 totalt), tsc rent. Live-kontrakt-integrasjonstest ratify-er det ekte §E-manifestet rent (10 regler bundet 1:1). Companion: skrivekontrakt §E (JA-promoter-prosedyre + manifest) i maskinrommet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.3 KiB
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 fix #1 (§C2 bindende + akkumulerende). Slice 1 = denne gaten: den binder utkast til
reglene — bevisst bindende, ren string/regex-evaluering, ingen AI, ingen nettverk, så den ikke kan
hoppes over eller snakkes rundt, og kjører på millisekunder. Slice 2 = ratify + §E: den binder
reglene (rules.ts) til den menneskelige sannhetskilden (kontrakten). Se Akkumulering.
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
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 run ratify # slice 2: rules.ts ↔ §E-manifest i sync?
npm test # 33 tester (gate + ratify)
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.
Akkumulering (slice 2)
Slice 1 binder utkast til reglene. Slice 2 binder reglene til kontrakten — så «rettelser fester seg» blir mekanisk, ikke håpet-på. Diagnosens gap 2 («rettelser fester seg ikke») lukkes ved at hver korreksjon KTG gjør får et varig, håndhevet hjem.
Ruta (full prosedyre i maskinrommet/docs/skrivekontrakt.md §E):
- Fang korreksjonen i utgave-staten (
articles.NN.foldIns[]) — ingenting mistes. - Klassifiser: mekanisk (eksakt frase / ord / markdown / telling) →
rules.ts-regel + §B/§C1/§C2-rad; dømmekraft → kun §C2-boks (blir hoseditorial-reviewer, ingen gate-regel). - JA-promoter: KTG svarer JA/NEI. NEI →
rejected(beholdes). JA → promotér. - Promotér atomisk:
rules.ts-entry + kontrakt-rad + §E-manifest-rad (id·ref·severity·proveniens)- merk fold-in
promoted.
- merk fold-in
- Ratify:
npm run ratifyMÅ være grønn før promoteringen teller.
Bindingen (src/ratify.ts): importerer RULES direkte (ingen skjør tekst-parsing) og krever en
bijeksjon mot gate-bindings-manifestet i §E — hver regel ↔ nøyaktig én manifest-rad, med ref +
severity identisk, og hver §-anker en ekte seksjon. En regel i rules.ts uten manifest-rad (gaten
håndhever noe udokumentert), eller en manifest-rad uten regel (en «regel» ingen håndhever), feiler:
$ npm run ratify
✓ I sync — 10 regler bundet 1:1 til §E-manifestet (ref + severity stemmer).
Kontrakt-sti: argument > MASKINROMMET_CONTRACT > default (relativt til modulen). Mangler kontrakten
(fersk klon uten maskinrommet) → exit 2 med klar beskjed; den ekte-kontrakt-testen skippes da.