ENFORCEMENT-LEDGERDesign + planagent-harnessmotor-fakta verifierad mot källor
Enforcement capability ledger: paritet mellan motorer, inte en Claude-hook-spegel
När du jobbar i Codex eller Gemini beter sig agenten annorlunda och mindre säkert. Inte för att reglerna saknas, utan för att den inte vet vilka skydd Claude får mekaniskt. Fixen är en kanonisk ledger nycklad på risk-intent: per skydd, vad varje motor faktiskt kan upprätthålla, och var den failar open.
Mål och klart-kriterium
En kanonisk enforcement-ledger som ger varje motor paritet via medvetenhet, inte via samma mekanik. Den är klar när:
varje policy (risk-intent) har en enforcement-grad per motor (Claude, Codex, Gemini), plus fail-läge och ett testfall
en agent mitt i en Codex- eller Gemini-session kan slå upp ett symptom, hitta policyn, och se sin motors grad plus vad den ska självupprätthålla
adaptrarnas felaktiga "inga hooks i denna motor" är ersatt av faktiska grader
gotcha-loggen matar ledgern: 2+ incidenter formaliseras till en rad eller ett hook
en riktig Codex-session har självupprätthållit ett skydd ur ledgern, med bevis
Avgränsning
I scope: ledger-strukturen, nyckling på risk-intent, per-motor-grader för de hårdaste skydden, fail-läge-dimensionen, gotcha-konvergensen, render-modellen, adapter-rättningen.
Uttryckligt uppskjutet: full population av alla 16 policyer gånger 3 motorer med källverifierad grad per rad (görs fas för fas), och faktisk auto-installation av genererade hooks (gated, senare beslut).
Kärnan: premissen "bara Claude har hooks" är fel
Codex bias-checken rev upp antagandet, verifierat mot primärkällor: både Codex CLI (developers.openai.com/codex/hooks) och Gemini CLI (geminicli.com/docs/hooks) har hook-system. Men de är olika starka, och båda failar open. Codex PreToolUse är uttryckligen "a guardrail rather than a complete enforcement boundary" (fångar inte alla shell-vägar, ej-stödda fält gör att tool-call fortsätter). Gemini defaultar till "Allow" om hookens stdout inte är ren JSON. Gemini har äkta hard block på BeforeTool; Codex har en native approval gate (PermissionRequest) som Gemini saknar. Slutsats: paritet byggs inte genom att spegla Claudes 32 hooks, utan genom en ledger som per skydd säger vad varje motor faktiskt klarar, och var den brister.
hard blocksoft guardrailfailar open
Ledger-formen: exempelrader (5 av 16 policyer)
Policy (risk-intent)
Claude
Codex
Gemini
Fail-läge andra motorer
Secret exposure (master-lösen ut)
hard
guardrail + gate
hard
open vid scriptfel
Filradering (rm, destruktivt)
hard
guardrail
hard
Codex: ej alla shell-vägar
Em-dash i kund-text
hard
guardrail
hard
open vid trasig JSON
Publikt GitHub-repo
gate
guardrail
hard
Codex: ekvivalent väg
Subagent-modellval
hard
saknas
text
Codex: SubagentStart kan ej stoppa start
Grader: hard = deterministisk blockering. guardrail = soft, kan kringgås eller failar open. gate = approval allow/deny. text = bara medvetenhet. saknas = ingen mekanism. Fullständig population av alla 16 policyer sker fas för fas med källkoll per rad.
Svåra-att-ångra beslut
Primärnyckel är risk-intent, inte hook-namn och inte symptom. Codex poäng: enforcement byggs runt invarianter (secret exposure, destructive shell), inte runt Claudes hook-katalog. Annars blir Claude norm.
Symptom är sekundärindex. Det är det reaktiva uppslaget du bad om: du klagar i symptom, agenten slår upp policyn och läser sin motors kolumn.
Handkurerad ledger som kanon (väg B, inte generera ur Claudes hooks). Codex valde B över min ursprungliga A: en generator ur Claude-hooks centrerar Claude och ärver Claude-specifika begrepp. Position bytt, källan var den verifierade kapabilitets-bilden.
Gotcha-loggen och ledgern är två vyer av samma kanon. Incidentloggen (reaktiv, upkeep/gotchas.md) matar ledgern (proaktiv). Vid 2+ incidenter formaliseras en rad eller, helst, ett hook (solve, don't punt).
Självbygge är gated. En agent får föreslå hooks och config-diffar ur ledgern, men installation kräver review. En hook som skriver hooks är en bootstrap-risk som kan cementera fel.
Rekommenderad ansats
A. Bygg ledger-filen (kanon)
kärnanny fil
policies/enforcement-ledger.md · MAP.md (trigger-rad samma commit)
Problem: ingen kanonisk per-motor enforcement-karta finns; adaptrarna ljuger om hooks.
Lösning: handkurerad tabell, rad per risk-intent, kolumner Claude/Codex/Gemini-grad plus fail-läge plus test plus symptom-index.
Varför: en sanning, paritet by-construction, B-strukturen minimerar drift mot HOOKS.md.
B. Rätta adaptrarna + render per-motor-vyer
troligedit
AGENTS.md, GEMINI.md
Problem: de säger felaktigt "inga hooks i denna motor".
Lösning: ersätt med "din motor HAR hooks, se ledgern för din grad per skydd"; rendera en per-motor-slice ur kanon.
Problem: ingen yta ackumulerar per-motor-fallgropar; HG-001/002 ligger fel i agent-notes.
Lösning: append-only logg, 2+ liknande formaliseras till en ledger-rad eller ett hook. Seed: HG-001 (Codex bg auto-notis), HG-002 (Codex bg dog mitt i).
Fil-karta: en ledger-rad
# policies/enforcement-ledger.md, en rad per risk-intent
| risk-intent | claude | codex | gemini | fail | test | symptom |
| filradering | hard (PreToolUse Bash) | guardrail* | hard (BeforeTool) | open | probe-rm | "den raderade en fil" |
# *guardrail: Codex fangar bara enkla shell-anrop, ej unified_exec/ekvivalent vag# sekundarindex: symptom -> rad. gotcha-logg matar nya rader vid 2+.
Marginalnot: graderna kommer ur den verifierade kapabilitets-workflowen (Codex-doc + Gemini-doc, adversariellt granskad). Tre grader flaggades osäkra och källverifieras vid population.
Implementationsordning
Bygg ledger-skelettet + MAP-trigger (fas A)
Populera de hårdaste skydden först (secret, radering, em-dash, publikt repo) med källverifierad grad per rad
Rätta adaptrarna (fas B)
Koppla gotcha-loggen, seed HG-001 och HG-002 (fas C)
Kör validation/probes per policy per motor som gate
Först när bevisad: render per-motor-vyer, och senare (gated) self-bootstrap
Risker
Fail-open på andra motorer (blockerande). Codex och Gemini failar open vid scriptfel eller ej-stödda fält. En "hard"-grad i ledgern får aldrig läsas som vattentät på Codex/Gemini. Därför är fail-läge en egen kolumn, inte en fotnot.
Tre osäkra grader. Verifieraren flaggade Codex PreCompact/PostCompact hard-block och Gemini samlad hard-block som vilande på fält utan ordagrant citat. Källverifiera vid population innan graden låses.
Drift. En handkurerad ledger kan glida från HOOKS.md. Möts av en upkeep-check som diffar ledger-rader mot hook-indexet.
Per-motor-nyckling är en Viva-utvidgning. Anthropics modell-axel är Haiku/Sonnet/Opus inom Claude, inte tvärs leverantörer. Märk i ledgern att detta är vår generalisering, inte Anthropic-doktrin.
Verifiering (e2e-smoke)
Inte bara att ledgern finns: en riktig Codex-session ges ett symptom (t.ex. "den var på väg att radera en fil"), slår upp policyn, läser sin grad och självupprätthåller med bevis. Plus validation/probes som kör ett testfall per policy per motor och rapporterar grad-utfallet mot ledgern, så drift och overclaim syns mekaniskt.
Öppna frågor
1. Ledger-format: en bred markdown-tabell eller en rad-per-fil? rekommenderat: en tabell-fil, läsbar och diffbar
2. Gotcha-logg och ledger i samma fil eller separat? rekommenderat: separat, loggen i upkeep/ matar ledgern i policies/
3. Fail-läge som egen kolumn eller fotnot? rekommenderat: egen kolumn, för viktigt för att gömma
4. Verifiera de tre osäkra graderna nu eller vid population? rekommenderat: vid population, källkoll per rad