@hawkeyexl/manni 4.10.0 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{batch-6NICDKRE.js → batch-UAULUMGH.js} +18 -14
- package/dist/{build-3KP2K3XN.js → build-QSPNK5AL.js} +14 -11
- package/dist/calibrate-KXN4URPM.js +40 -0
- package/dist/{capture-NETOHCB4.js → capture-JHTSUPUC.js} +16 -13
- package/dist/{check-E4QCB7LS.js → check-MDGXEUWL.js} +5 -5
- package/dist/{check-NLL4NRYA.js → check-VELUQAUW.js} +17 -14
- package/dist/{check-NLL4NRYA.js.map → check-VELUQAUW.js.map} +1 -1
- package/dist/check-WOQRKNZK.js +29 -0
- package/dist/{check-7B77ZD2N.js → check-YEOYBFST.js} +14 -11
- package/dist/{chunk-2JV7C4YV.js → chunk-2DRHT73U.js} +7 -7
- package/dist/{chunk-CCWMACJL.js → chunk-2IAZEB45.js} +8 -8
- package/dist/{chunk-ZHRPH52H.js → chunk-2IR4T5PO.js} +2 -2
- package/dist/{chunk-2BV4FBC7.js → chunk-2MJ62AYQ.js} +2 -2
- package/dist/{chunk-2BV4FBC7.js.map → chunk-2MJ62AYQ.js.map} +1 -1
- package/dist/{chunk-RODZ7MB7.js → chunk-4CK6ZSOK.js} +6 -6
- package/dist/{chunk-7Y3N4Y72.js → chunk-4D5IZSXM.js} +3 -3
- package/dist/{chunk-4DLF5SA4.js → chunk-4VBSTXN6.js} +4 -4
- package/dist/{chunk-2YJ5H5E6.js → chunk-54F74XR3.js} +15 -13
- package/dist/{chunk-2YJ5H5E6.js.map → chunk-54F74XR3.js.map} +1 -1
- package/dist/{chunk-2W34HX2U.js → chunk-6HWBRZIN.js} +47 -191
- package/dist/chunk-6HWBRZIN.js.map +1 -0
- package/dist/{chunk-SUTMSDQ2.js → chunk-ADMEPUBT.js} +3 -3
- package/dist/{chunk-VZVEP2OZ.js → chunk-B7XYNRJQ.js} +2 -2
- package/dist/{chunk-GB2XPITA.js → chunk-BBT6AVUG.js} +2 -2
- package/dist/{chunk-PK7EKJ5T.js → chunk-BKVHX6FU.js} +4 -4
- package/dist/{chunk-QBVP3SQP.js → chunk-D4N2V43Z.js} +4 -4
- package/dist/{chunk-6AGESHHM.js → chunk-EFW7CAG4.js} +2 -2
- package/dist/{chunk-H26VDFDS.js → chunk-EIFCP6CZ.js} +2 -2
- package/dist/{chunk-GCKHSBEN.js → chunk-FBMZJEB3.js} +2 -2
- package/dist/{chunk-2UCC26MO.js → chunk-FQXWVS6J.js} +8 -8
- package/dist/{chunk-5REEVKGH.js → chunk-FUCPZVRY.js} +2 -2
- package/dist/{chunk-WN47MNSK.js → chunk-GDVZ5VII.js} +4 -4
- package/dist/{chunk-KBG463UK.js → chunk-GV56WGL2.js} +321 -3308
- package/dist/chunk-GV56WGL2.js.map +1 -0
- package/dist/{chunk-IJ62BB2T.js → chunk-HA6MQMOY.js} +6 -6
- package/dist/{chunk-DNZUBCGZ.js → chunk-HQR2ZBHW.js} +3 -3
- package/dist/{chunk-DFCQ6BMI.js → chunk-IGSHYP74.js} +4 -4
- package/dist/{chunk-ABHG6I3G.js → chunk-J6IDQGJL.js} +4 -4
- package/dist/{chunk-GDLHTI5R.js → chunk-JPQDNYXH.js} +2 -2
- package/dist/{chunk-VVVKBUBO.js → chunk-JROBZ7JA.js} +2 -2
- package/dist/{chunk-BD7IXBWE.js → chunk-KGEQJ5CC.js} +5 -5
- package/dist/{chunk-LQZQ5KGG.js → chunk-LBSCW232.js} +4 -4
- package/dist/{chunk-G6FNWRAI.js → chunk-LKP7QDFN.js} +4 -4
- package/dist/{chunk-55GMOVKW.js → chunk-LPIF5LIE.js} +2 -2
- package/dist/chunk-M42DZCOU.js +164 -0
- package/dist/chunk-M42DZCOU.js.map +1 -0
- package/dist/{chunk-ZXXFP2LA.js → chunk-MSRU4D4P.js} +2 -2
- package/dist/{chunk-QJRQ4BRC.js → chunk-NSBXVPZL.js} +11 -11
- package/dist/{chunk-Z5YHMRLF.js → chunk-ODRPL3WB.js} +2 -2
- package/dist/{chunk-XU73V5XT.js → chunk-OPXWPJDA.js} +10 -10
- package/dist/chunk-PCQ7ELJH.js +3081 -0
- package/dist/chunk-PCQ7ELJH.js.map +1 -0
- package/dist/{chunk-3E2X2RBU.js → chunk-PCS4VJBV.js} +6 -6
- package/dist/{chunk-GXN7RRHR.js → chunk-PWBH7DCQ.js} +3 -3
- package/dist/{chunk-6M5VJOC2.js → chunk-QLWC7MKD.js} +33 -32
- package/dist/chunk-QLWC7MKD.js.map +1 -0
- package/dist/{chunk-EAUIQADY.js → chunk-R4WXQIOZ.js} +6 -6
- package/dist/{chunk-AO5TSDKT.js → chunk-RLT5SEML.js} +5 -5
- package/dist/{chunk-XG6PVB5S.js → chunk-SSQZB5SQ.js} +1 -11
- package/dist/chunk-SSQZB5SQ.js.map +1 -0
- package/dist/chunk-T7JAOYE5.js +393 -0
- package/dist/chunk-T7JAOYE5.js.map +1 -0
- package/dist/chunk-TU2WUBVZ.js +2 -0
- package/dist/{chunk-D2UW3ZCK.js → chunk-U7CTFN2J.js} +12 -10
- package/dist/{chunk-D2UW3ZCK.js.map → chunk-U7CTFN2J.js.map} +1 -1
- package/dist/{chunk-G7XD4QH5.js → chunk-VSEBFHAY.js} +10 -7
- package/dist/{chunk-G7XD4QH5.js.map → chunk-VSEBFHAY.js.map} +1 -1
- package/dist/{chunk-RZVCWX5R.js → chunk-WDWXAYVH.js} +4 -4
- package/dist/{chunk-6LR73NMO.js → chunk-Y6DOMTQD.js} +10 -8
- package/dist/{chunk-6LR73NMO.js.map → chunk-Y6DOMTQD.js.map} +1 -1
- package/dist/chunk-ZPLVANY2.js +15 -0
- package/dist/chunk-ZPLVANY2.js.map +1 -0
- package/dist/{cli-4YYC6LCY.js → cli-3BTCK4AB.js} +18 -15
- package/dist/{cli-4YYC6LCY.js.map → cli-3BTCK4AB.js.map} +1 -1
- package/dist/{cli-BIIUKPTE.js → cli-4MF37HAQ.js} +15 -12
- package/dist/{cli-BIIUKPTE.js.map → cli-4MF37HAQ.js.map} +1 -1
- package/dist/{cli-V2DI3K2R.js → cli-6KZTHWGP.js} +17 -14
- package/dist/{cli-V2DI3K2R.js.map → cli-6KZTHWGP.js.map} +1 -1
- package/dist/{cli-EH3I4IUX.js → cli-DRMZBZLB.js} +38 -33
- package/dist/cli-DRMZBZLB.js.map +1 -0
- package/dist/{cli-HO62TOM2.js → cli-I62SRH3R.js} +10 -8
- package/dist/cli-JJMOVIKS.js +83 -0
- package/dist/cli-JJMOVIKS.js.map +1 -0
- package/dist/{cli-SGVFZOAW.js → cli-O4ABTN4Z.js} +25 -21
- package/dist/{cli-SGVFZOAW.js.map → cli-O4ABTN4Z.js.map} +1 -1
- package/dist/{cli-UETKXHJN.js → cli-ONTC5PKT.js} +3 -3
- package/dist/{cli-TELPAMJO.js → cli-RORDPAPE.js} +17 -14
- package/dist/{cli-TELPAMJO.js.map → cli-RORDPAPE.js.map} +1 -1
- package/dist/{cli-P2X7PNY6.js → cli-VID7PJS3.js} +17 -13
- package/dist/{cli-P2X7PNY6.js.map → cli-VID7PJS3.js.map} +1 -1
- package/dist/{cli-LWST5FQH.js → cli-VUKMWSSF.js} +3 -3
- package/dist/cli.js +18 -12
- package/dist/cli.js.map +1 -1
- package/dist/{config-TYXYQK3I.js → config-XDA42RJL.js} +3 -3
- package/dist/docmeta.js +9 -7
- package/dist/docmeta.js.map +1 -1
- package/dist/github-RY3FRA6P.js +29 -0
- package/dist/github-YKQSH7FS.js +34 -0
- package/dist/index.d.ts +1023 -915
- package/dist/index.js +106 -81
- package/dist/index.js.map +1 -1
- package/dist/{json-QR4G35KA.js → json-BXY44ED7.js} +13 -10
- package/dist/{lint-QTI7XK2A.js → lint-YJ2L22BW.js} +13 -10
- package/dist/list-NSG24VVX.js +31 -0
- package/dist/list-V6EGCSHX.js +34 -0
- package/dist/{page-FSXDXCDD.js → page-EV7OUBAU.js} +12 -9
- package/dist/{prepare-UPIBTFNS.js → prepare-JHJDJB6I.js} +17 -14
- package/dist/{prepare-UPIBTFNS.js.map → prepare-JHJDJB6I.js.map} +1 -1
- package/dist/{pretty-R4BQD2VH.js → pretty-Q5Y2PA64.js} +14 -11
- package/dist/{pretty-4IONWSEP.js → pretty-SCRK66M5.js} +13 -10
- package/dist/{reporters-FPP6JNDP.js → reporters-A5ADKDYR.js} +12 -9
- package/dist/{reporters-DHO2BXAD.js → reporters-RBYTASMI.js} +5 -5
- package/dist/run-BUE2DDXN.js +36 -0
- package/dist/{term-ASM4LVYC.js → term-CQAGNG3Q.js} +17 -14
- package/dist/{term-ASM4LVYC.js.map → term-CQAGNG3Q.js.map} +1 -1
- package/dist/{validate-7JI3H57P.js → validate-ZBW44RHT.js} +6 -5
- package/dist/validate-ZBW44RHT.js.map +1 -0
- package/package.json +1 -1
- package/plugin/manni/.claude-plugin/plugin.json +1 -1
- package/dist/calibrate-LUA3DWKD.js +0 -36
- package/dist/check-PTECPIIB.js +0 -26
- package/dist/chunk-2W34HX2U.js.map +0 -1
- package/dist/chunk-6M5VJOC2.js.map +0 -1
- package/dist/chunk-KBG463UK.js.map +0 -1
- package/dist/chunk-XG6PVB5S.js.map +0 -1
- package/dist/cli-EH3I4IUX.js.map +0 -1
- package/dist/github-ESK45CEZ.js +0 -26
- package/dist/github-WER7JUTN.js +0 -31
- package/dist/list-JO4G3TS3.js +0 -30
- package/dist/list-O2MJUP5V.js +0 -28
- package/dist/run-YH5Z7RJ7.js +0 -32
- /package/dist/{batch-6NICDKRE.js.map → batch-UAULUMGH.js.map} +0 -0
- /package/dist/{build-3KP2K3XN.js.map → build-QSPNK5AL.js.map} +0 -0
- /package/dist/{calibrate-LUA3DWKD.js.map → calibrate-KXN4URPM.js.map} +0 -0
- /package/dist/{capture-NETOHCB4.js.map → capture-JHTSUPUC.js.map} +0 -0
- /package/dist/{check-7B77ZD2N.js.map → check-MDGXEUWL.js.map} +0 -0
- /package/dist/{check-E4QCB7LS.js.map → check-WOQRKNZK.js.map} +0 -0
- /package/dist/{check-PTECPIIB.js.map → check-YEOYBFST.js.map} +0 -0
- /package/dist/{chunk-2JV7C4YV.js.map → chunk-2DRHT73U.js.map} +0 -0
- /package/dist/{chunk-CCWMACJL.js.map → chunk-2IAZEB45.js.map} +0 -0
- /package/dist/{chunk-ZHRPH52H.js.map → chunk-2IR4T5PO.js.map} +0 -0
- /package/dist/{chunk-RODZ7MB7.js.map → chunk-4CK6ZSOK.js.map} +0 -0
- /package/dist/{chunk-7Y3N4Y72.js.map → chunk-4D5IZSXM.js.map} +0 -0
- /package/dist/{chunk-4DLF5SA4.js.map → chunk-4VBSTXN6.js.map} +0 -0
- /package/dist/{chunk-SUTMSDQ2.js.map → chunk-ADMEPUBT.js.map} +0 -0
- /package/dist/{chunk-VZVEP2OZ.js.map → chunk-B7XYNRJQ.js.map} +0 -0
- /package/dist/{chunk-GB2XPITA.js.map → chunk-BBT6AVUG.js.map} +0 -0
- /package/dist/{chunk-PK7EKJ5T.js.map → chunk-BKVHX6FU.js.map} +0 -0
- /package/dist/{chunk-QBVP3SQP.js.map → chunk-D4N2V43Z.js.map} +0 -0
- /package/dist/{chunk-6AGESHHM.js.map → chunk-EFW7CAG4.js.map} +0 -0
- /package/dist/{chunk-H26VDFDS.js.map → chunk-EIFCP6CZ.js.map} +0 -0
- /package/dist/{chunk-GCKHSBEN.js.map → chunk-FBMZJEB3.js.map} +0 -0
- /package/dist/{chunk-2UCC26MO.js.map → chunk-FQXWVS6J.js.map} +0 -0
- /package/dist/{chunk-5REEVKGH.js.map → chunk-FUCPZVRY.js.map} +0 -0
- /package/dist/{chunk-WN47MNSK.js.map → chunk-GDVZ5VII.js.map} +0 -0
- /package/dist/{chunk-IJ62BB2T.js.map → chunk-HA6MQMOY.js.map} +0 -0
- /package/dist/{chunk-DNZUBCGZ.js.map → chunk-HQR2ZBHW.js.map} +0 -0
- /package/dist/{chunk-DFCQ6BMI.js.map → chunk-IGSHYP74.js.map} +0 -0
- /package/dist/{chunk-ABHG6I3G.js.map → chunk-J6IDQGJL.js.map} +0 -0
- /package/dist/{chunk-GDLHTI5R.js.map → chunk-JPQDNYXH.js.map} +0 -0
- /package/dist/{chunk-VVVKBUBO.js.map → chunk-JROBZ7JA.js.map} +0 -0
- /package/dist/{chunk-BD7IXBWE.js.map → chunk-KGEQJ5CC.js.map} +0 -0
- /package/dist/{chunk-LQZQ5KGG.js.map → chunk-LBSCW232.js.map} +0 -0
- /package/dist/{chunk-G6FNWRAI.js.map → chunk-LKP7QDFN.js.map} +0 -0
- /package/dist/{chunk-55GMOVKW.js.map → chunk-LPIF5LIE.js.map} +0 -0
- /package/dist/{chunk-ZXXFP2LA.js.map → chunk-MSRU4D4P.js.map} +0 -0
- /package/dist/{chunk-QJRQ4BRC.js.map → chunk-NSBXVPZL.js.map} +0 -0
- /package/dist/{chunk-Z5YHMRLF.js.map → chunk-ODRPL3WB.js.map} +0 -0
- /package/dist/{chunk-XU73V5XT.js.map → chunk-OPXWPJDA.js.map} +0 -0
- /package/dist/{chunk-3E2X2RBU.js.map → chunk-PCS4VJBV.js.map} +0 -0
- /package/dist/{chunk-GXN7RRHR.js.map → chunk-PWBH7DCQ.js.map} +0 -0
- /package/dist/{chunk-EAUIQADY.js.map → chunk-R4WXQIOZ.js.map} +0 -0
- /package/dist/{chunk-AO5TSDKT.js.map → chunk-RLT5SEML.js.map} +0 -0
- /package/dist/{cli-HO62TOM2.js.map → chunk-TU2WUBVZ.js.map} +0 -0
- /package/dist/{chunk-RZVCWX5R.js.map → chunk-WDWXAYVH.js.map} +0 -0
- /package/dist/{config-TYXYQK3I.js.map → cli-I62SRH3R.js.map} +0 -0
- /package/dist/{cli-UETKXHJN.js.map → cli-ONTC5PKT.js.map} +0 -0
- /package/dist/{cli-LWST5FQH.js.map → cli-VUKMWSSF.js.map} +0 -0
- /package/dist/{github-ESK45CEZ.js.map → config-XDA42RJL.js.map} +0 -0
- /package/dist/{github-WER7JUTN.js.map → github-RY3FRA6P.js.map} +0 -0
- /package/dist/{json-QR4G35KA.js.map → github-YKQSH7FS.js.map} +0 -0
- /package/dist/{lint-QTI7XK2A.js.map → json-BXY44ED7.js.map} +0 -0
- /package/dist/{list-JO4G3TS3.js.map → lint-YJ2L22BW.js.map} +0 -0
- /package/dist/{list-O2MJUP5V.js.map → list-NSG24VVX.js.map} +0 -0
- /package/dist/{page-FSXDXCDD.js.map → list-V6EGCSHX.js.map} +0 -0
- /package/dist/{pretty-4IONWSEP.js.map → page-EV7OUBAU.js.map} +0 -0
- /package/dist/{pretty-R4BQD2VH.js.map → pretty-Q5Y2PA64.js.map} +0 -0
- /package/dist/{reporters-DHO2BXAD.js.map → pretty-SCRK66M5.js.map} +0 -0
- /package/dist/{reporters-FPP6JNDP.js.map → reporters-A5ADKDYR.js.map} +0 -0
- /package/dist/{run-YH5Z7RJ7.js.map → reporters-RBYTASMI.js.map} +0 -0
- /package/dist/{validate-7JI3H57P.js.map → run-BUE2DDXN.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tracevals/commands/check.ts","../src/tracevals/rules/judge.ts","../src/tracevals/rules/judge-prompt.ts","../src/tracevals/rules/timeline.ts"],"sourcesContent":["/**\n * `manni tracevals check <trace>`: judge the last turn of one session against\n * the rules that governed it (proposal 0079). `checkTurn` is the same\n * judgement inside a Stop or SubagentStop hook, with the hook's model and\n * every gate of \"When tracevals stays out of the way\".\n *\n * Both are read-only over the trace and the sources. What they write is the\n * rules cache and the verdict cache, under `judge.cacheDir`. The hook also\n * writes the session ledger, for every turn it parses, which `check` by hand\n * only reads and sums up.\n */\nimport { writeFile } from \"node:fs/promises\";\nimport { basename, resolve } from \"node:path\";\nimport type { InferenceProvider, ProviderName } from \"@hawkeyexl/inference\";\nimport { discoverConfig, type TracevalsConfig } from \"../core/config.js\";\nimport {\n constructProvider,\n resolveSelectionIdentity,\n selectHookProvider,\n selectProvider,\n type ProviderSelection,\n} from \"../judge/provider.js\";\nimport { renderCheck } from \"../reporters/runtime.js\";\nimport type { SummaryFormat } from \"../reporters/index.js\";\nimport { hostHolds, hostSetting, queued, QUEUE_WAIT_MS, type HostApi } from \"../rules/host.js\";\nimport {\n allVerdictsCached,\n applicableRules,\n judgeTurn,\n StateLimits,\n TurnCache,\n type TurnFinding,\n type TurnJudgement,\n type TurnRule,\n} from \"../rules/judge.js\";\nimport { ruleKey } from \"../rules/judge-prompt.js\";\nimport {\n ledgerPath,\n readLedger,\n recordFacts,\n recordTurn,\n rollup,\n turnFacts,\n writeLedger,\n type Ledger,\n type LedgerOutcome,\n type SessionRollup,\n} from \"../rules/ledger.js\";\nimport { warn } from \"../../shared/warn.js\";\nimport { libraryLocalModels, type LocalModels } from \"../rules/local.js\";\nimport { mockTurnJudge } from \"../rules/mock.js\";\nimport { resolveTurnSources, type RuleSource } from \"../rules/sources.js\";\nimport { lastTurn, subagentTurn, type TurnSlice } from \"../rules/turn.js\";\nimport { parseTraceFile } from \"../trace/claude.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport { TracevalsError } from \"../types.js\";\nimport {\n assertDownloaded,\n runtimeOf,\n extraction,\n firstLine,\n isNetworkProvider,\n JUDGE_ENV,\n localGate,\n markJudgeProcess,\n offlineRefusal,\n rulesCacheFor,\n type GateSkip,\n type Identity,\n type LocalGate,\n} from \"./runtime.js\";\n\n/** Why a judgement stopped short, as the report's `skipped` names it. */\nexport type CheckSkip = \"empty-turn\" | \"no-sources\" | \"not-applicable\";\n\n/** Every gate a hook can stop at, in the proposal's order. */\nexport type HookGate =\n | \"not-in-play\"\n | \"judge-session\"\n | CheckSkip\n | LocalGate\n | \"busy\";\n\nexport interface CheckSourceEntry {\n path: string;\n format: RuleSource[\"format\"];\n skill?: string;\n trigger: string;\n rules: number;\n origin: \"declared\" | \"extracted\";\n}\n\nexport interface CheckReport {\n trace: string;\n sessionId: string;\n /** The subagent a SubagentStop judged, or null for the main session. */\n agentId: string | null;\n turn: { from: number; to: number };\n /** Null when the run stopped before a judge was asked. */\n judge: { provider: string; model: string; mode: TurnJudgement[\"mode\"]; runs: number } | null;\n /** Null when no source needed the extraction model. */\n extraction: { provider: string; model: string } | null;\n sources: CheckSourceEntry[];\n /** Only `fail` and `needs-review`. */\n findings: TurnFinding[];\n /** `fail` counts `error` breaks; `reported` counts `warning` ones, which never fail a turn. */\n summary: {\n sources: number;\n rules: number;\n notApplicable: number;\n fail: number;\n needsReview: number;\n reported: number;\n };\n /** By hand, the session ledger summed up per rule. Null when it holds nothing, and under a hook. */\n session: SessionRollup | null;\n skipped: CheckSkip | null;\n warnings: string[];\n exitCode: number;\n}\n\n/** Test seams; production builds every one of these from config. */\ninterface Seams {\n /** The judge, in place of the selected provider. */\n judge?: InferenceProvider;\n /** The extraction model, in place of the out-of-loop provider. */\n extractor?: InferenceProvider;\n localModels?: LocalModels;\n /** The model host's calls, in place of the library's. */\n hostApi?: HostApi;\n}\n\ninterface Params extends Seams {\n config: TracevalsConfig;\n configDir: string;\n trace: Trace;\n turn: TurnSlice;\n sessionId: string;\n agentId: string | null;\n agentType?: string;\n projectDir: string;\n projectRoot?: string;\n env?: Record<string, string | undefined>;\n judgeSelection: ProviderSelection;\n runs: number;\n inLoop: boolean;\n noCache: boolean;\n offline: boolean;\n lastAssistantMessage?: string;\n}\n\ntype Outcome =\n | { kind: \"report\"; report: CheckReport; judgement?: TurnJudgement }\n | { kind: \"gate\"; skip: GateSkip<HookGate> };\n\nconst idOf = (p: InferenceProvider): Identity => ({\n provider: p.provider() as ProviderName,\n model: p.modelName(),\n});\n\nconst LEDGER_OUTCOME: Record<TurnJudgement[\"verdicts\"][number][\"outcome\"], LedgerOutcome> = {\n fail: \"broken\",\n followed: \"followed\",\n \"needs-review\": \"needs-review\",\n \"not-applicable\": \"not-applicable\",\n};\n\n/** How far a run got, for the ledger. */\ninterface Seen {\n sources: RuleSource[];\n judgement?: TurnJudgement;\n}\n\n/**\n * The pipeline both modes run, with the session ledger around it. The hook\n * records every turn it parses, judged or not. By hand the ledger is only\n * read, and summed up for the report.\n */\nasync function runtimeCheck(p: Params): Promise<Outcome> {\n const ledgerFile = ledgerPath(p.projectDir, p.sessionId, p.agentId);\n const ledger = await readLedger(ledgerFile);\n const seen: Seen = { sources: [] };\n const outcome = await judgeTurnOf(p, ledger, seen);\n if (p.inLoop) await record(p, ledgerFile, ledger, seen);\n else if (outcome.kind === \"report\") outcome.report.session = rollup(ledger);\n return outcome;\n}\n\n/** This turn's facts, and its verdicts when it was judged. A failed write warns. */\nasync function record(p: Params, file: string, ledger: Ledger, seen: Seen): Promise<void> {\n const facts = turnFacts(p.trace, p.turn, seen.sources, {\n cwd: p.projectDir,\n root: p.projectRoot ?? p.projectDir,\n redact: p.config.judge.redact,\n });\n let next = recordFacts(ledger, facts);\n if (seen.judgement !== undefined) {\n next = recordTurn(\n next,\n p.turn.from,\n seen.judgement.verdicts.map((v) => ({\n key: ruleKey(v.source, v.rule),\n text: v.text,\n outcome: LEDGER_OUTCOME[v.outcome],\n note: v.reasoning ?? \"\",\n })),\n );\n }\n try {\n await writeLedger(file, next);\n } catch (err) {\n warn(`could not write the session ledger ${file}: ${firstLine(err)}`);\n }\n}\n\n/** Sources, extraction, the judge. */\nasync function judgeTurnOf(p: Params, ledger: Ledger, seen: Seen): Promise<Outcome> {\n const { config, turn } = p;\n const runtime = runtimeOf(config);\n const local = p.localModels ?? libraryLocalModels(config.providers);\n const report: CheckReport = {\n trace: p.trace.file,\n sessionId: p.sessionId,\n agentId: p.agentId,\n turn: { from: turn.from, to: turn.to },\n judge: null,\n extraction: null,\n sources: [],\n findings: [],\n summary: { sources: 0, rules: 0, notApplicable: 0, fail: 0, needsReview: 0, reported: 0 },\n session: null,\n skipped: null,\n warnings: [...p.trace.warnings],\n exitCode: 0,\n };\n const stop = (skipped: CheckSkip): Outcome => {\n report.skipped = skipped;\n return { kind: \"report\", report };\n };\n\n // Gate 3.\n if (turn.window.empty) return stop(\"empty-turn\");\n\n // Gate 4.\n const resolved = await resolveTurnSources(p.trace, turn, {\n projectDir: p.projectDir,\n ...(p.projectRoot !== undefined ? { projectRoot: p.projectRoot } : {}),\n ...(p.env !== undefined ? { env: p.env } : {}),\n include: runtime.include,\n exclude: runtime.exclude,\n plans: runtime.plans,\n redact: config.judge.redact,\n ...(p.agentType !== undefined ? { agentType: p.agentType } : {}),\n });\n report.warnings.push(...resolved.warnings);\n // Under a hook a source that never blocks (Claude Code's default system\n // prompt) could only add judge calls, so it is neither extracted nor judged.\n // By hand it is, and its breaks are reported.\n const sources = p.inLoop ? resolved.sources.filter((s) => s.blocks) : resolved.sources;\n seen.sources = sources;\n report.summary.sources = sources.length;\n if (sources.length === 0) return stop(\"no-sources\");\n\n const judgeId = p.judge !== undefined ? idOf(p.judge) : await resolveSelectionIdentity(config, p.judgeSelection);\n const judgeIsLocal = judgeId.provider === \"llama-cpp\";\n\n // Gate 5, for the judge. Extraction's own model is asked below, only when a\n // source needs it.\n if (p.inLoop && judgeIsLocal) {\n const skip = await localGate(local, judgeId.model, [\"downloading\"]);\n if (skip !== undefined) return { kind: \"gate\", skip };\n }\n\n // Extraction, between gates 4 and 6, with the out-of-loop model always.\n const host = hostSetting(p.inLoop, p.sessionId, config.providers[\"llama-cpp\"]?.keepAlive);\n const ex = await extraction(config, rulesCacheFor(config, p.configDir, p.noCache), p.extractor, host);\n if (sources.some((s) => ex.needs(s))) {\n report.extraction = { provider: ex.identity.provider, model: ex.identity.model };\n if (p.offline && isNetworkProvider(ex.identity.provider)) {\n throw offlineRefusal(\"extraction\", ex.identity);\n }\n if (ex.identity.provider === \"llama-cpp\") {\n if (p.inLoop) {\n const skip = await localGate(\n local,\n ex.identity.model,\n [\"downloading\", \"not-downloaded\", \"memory\"],\n () => hostHolds(ex.identity.model, p.hostApi),\n );\n if (skip !== undefined) return { kind: \"gate\", skip };\n } else {\n await assertDownloaded(local, ex.identity.model);\n }\n }\n }\n const rules: TurnRule[] = [];\n for (const source of sources) {\n const { rules: found, origin } = await ex.rulesOf(source);\n report.sources.push({\n path: source.displayPath,\n format: source.format,\n ...(source.skill !== undefined ? { skill: source.skill } : {}),\n trigger: source.trigger,\n rules: found.length,\n origin,\n });\n for (const rule of found) rules.push({ source, rule });\n }\n report.summary.rules = rules.length;\n\n // Gate 6.\n const { applicable } = applicableRules(rules, turn.window);\n if (applicable.length === 0) {\n report.summary.notApplicable = rules.length;\n return stop(\"not-applicable\");\n }\n\n if (p.offline && isNetworkProvider(judgeId.provider)) {\n throw offlineRefusal(\"the judge\", judgeId);\n }\n const cacheRoot = resolve(p.configDir, config.judge.cacheDir);\n const limits = new StateLimits(resolve(cacheRoot, \"limits\"), !p.noCache);\n const plan = {\n trace: p.trace,\n turn,\n rules,\n runs: p.runs,\n temperature: config.judge.temperature,\n zones: config.judge.zones,\n render: {\n maxBlockChars: config.render.maxBlockChars,\n maxTotalChars: config.render.maxTotalChars,\n redact: config.judge.redact,\n },\n ...(p.lastAssistantMessage !== undefined ? { lastAssistantMessage: p.lastAssistantMessage } : {}),\n ledger,\n project: { cwd: p.projectDir, root: p.projectRoot ?? p.projectDir },\n cache: new TurnCache(resolve(cacheRoot, \"turns\"), !p.noCache),\n };\n\n // Gates 7 and 8, model on disk and memory. The memory probe is skipped when\n // the model will not be loaded or is loaded already: every applicable\n // rule's verdict is cached (gate 9, read from the remembered state limit\n // without a provider), or the host holds the model. The verdict cache is\n // otherwise read inside judgeTurn, once the provider reports its limit.\n if (judgeIsLocal) {\n if (p.inLoop) {\n const skip = await localGate(\n local,\n judgeId.model,\n [\"not-downloaded\", \"memory\"],\n async () =>\n allVerdictsCached({ ...plan, limits }, judgeId) || (await hostHolds(judgeId.model, p.hostApi)),\n );\n if (skip !== undefined) return { kind: \"gate\", skip };\n } else {\n await assertDownloaded(local, judgeId.model);\n }\n }\n\n markJudgeProcess();\n const provider =\n p.judge ??\n (judgeId.provider === \"mock\"\n ? mockTurnJudge(judgeId.model)\n : constructProvider(config, judgeId, { host }));\n let ran: Awaited<ReturnType<typeof queued<TurnJudgement>>>;\n try {\n ran = await queued(judgeId.model, () =>\n judgeTurn({ ...plan, provider, limits }),\n );\n } catch (err) {\n if (err instanceof TracevalsError) throw err;\n throw new TracevalsError(`could not judge the last turn: ${firstLine(err)}`);\n }\n if (ran.busy) {\n return {\n kind: \"gate\",\n skip: {\n gate: \"busy\",\n message: `tracevals skipped this turn: ${judgeId.model} was busy with other judgements for ${String(QUEUE_WAIT_MS / 60_000)} minutes.`,\n },\n };\n }\n const judgement = ran.value;\n seen.judgement = judgement;\n report.judge = {\n provider: judgeId.provider,\n model: judgeId.model,\n mode: judgement.mode,\n runs: judgement.runs,\n };\n report.findings = judgement.findings;\n report.summary.notApplicable = judgement.notApplicable;\n const fails = judgement.findings.filter((f) => f.outcome === \"fail\");\n report.summary.fail = fails.filter((f) => f.severity === \"error\").length;\n // `reported` is confirmed breaks from sources that never block. A\n // needs-review verdict from any source, those included, stays in needsReview.\n report.summary.reported = fails.length - report.summary.fail;\n report.summary.needsReview = judgement.findings.length - fails.length;\n report.warnings.push(...judgement.warnings);\n report.exitCode = report.summary.fail > 0 ? 1 : 0;\n return { kind: \"report\", report, judgement };\n}\n\nasync function readTrace(path: string): Promise<Trace> {\n try {\n return await parseTraceFile(path);\n } catch (err) {\n throw new TracevalsError(`cannot read trace ${path}: ${firstLine(err)}`);\n }\n}\n\n// ── By hand ──────────────────────────────────────────────────────\n\nexport interface CheckOptions extends Seams {\n tracePath: string;\n /** Project root for resolving sources; default the trace's recorded cwd. */\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n /** Overrides `judge.ensembleRuns`. */\n runs?: number;\n noCache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n output?: string;\n color?: boolean;\n /** Directory holding manni.config.yaml; defaults to cwd. */\n configDir?: string;\n config?: string;\n noConfig?: boolean;\n env?: Record<string, string | undefined>;\n}\n\nexport interface CheckResult {\n report: CheckReport;\n rendered: string;\n}\n\nexport async function runCheck(options: CheckOptions): Promise<CheckResult> {\n const { config, dir: configDir } = await discoverConfig(options.configDir ?? process.cwd(), {\n ...(options.config === undefined ? {} : { configPath: options.config }),\n ...(options.noConfig === undefined ? {} : { noConfig: options.noConfig }),\n });\n const judgeSelection = selectProvider(config, {\n ...(options.provider !== undefined ? { provider: options.provider } : {}),\n ...(options.model !== undefined ? { model: options.model } : {}),\n ...(options.local !== undefined ? { local: options.local } : {}),\n });\n const trace = await readTrace(options.tracePath);\n const outcome = await runtimeCheck({\n config,\n configDir,\n trace,\n turn: lastTurn(trace),\n sessionId: trace.sessionId ?? basename(trace.file).replace(/\\.jsonl$/, \"\"),\n agentId: null,\n projectDir: options.project ?? trace.cwd,\n ...(options.project !== undefined ? { projectRoot: options.project } : {}),\n ...(options.env !== undefined ? { env: options.env } : {}),\n judgeSelection,\n runs: options.runs ?? config.judge.ensembleRuns,\n inLoop: false,\n noCache: options.noCache === true,\n offline: options.offline === true,\n ...seamsOf(options),\n });\n // By hand only the report's own skips exist; the other gates act under a hook.\n if (outcome.kind === \"gate\") throw new TracevalsError(outcome.skip.message);\n const { report } = outcome;\n const rendered =\n options.format === \"json\"\n ? JSON.stringify(report, null, 2)\n : renderCheck(report, { color: options.color === true });\n if (options.output !== undefined) await writeFile(options.output, rendered, \"utf-8\");\n return { report, rendered };\n}\n\nfunction seamsOf(s: Seams): Seams {\n return {\n ...(s.judge !== undefined ? { judge: s.judge } : {}),\n ...(s.extractor !== undefined ? { extractor: s.extractor } : {}),\n ...(s.localModels !== undefined ? { localModels: s.localModels } : {}),\n ...(s.hostApi !== undefined ? { hostApi: s.hostApi } : {}),\n };\n}\n\n// ── Inside a hook ────────────────────────────────────────────────\n\n/** What a Stop or SubagentStop envelope carries, as the family hook passes it. */\nexport interface TurnCheckInput extends Seams {\n transcriptPath: string;\n /** SubagentStop: the subagent's own transcript, judged alone. */\n agentTranscriptPath?: string;\n agentId?: string;\n /** SubagentStop: the subagent type, whose definition governs the run. */\n agentType?: string;\n /** Appended when the transcript lags the Stop. */\n lastAssistantMessage?: string;\n sessionId: string;\n cwd: string;\n inLoop: true;\n /** Defaults to `process.env`; gate 2 and the source walk read it. */\n env?: Record<string, string | undefined>;\n}\n\nexport interface TurnCheckResult {\n /** The gate that ended the run. A message is set where the proposal says one. */\n skipped?: { gate: HookGate; message?: string };\n judgement?: TurnJudgement;\n /** Only `fail` and `needs-review`; empty when skipped. */\n findings: TurnFinding[];\n /** Absent for gates 1, 2, 5, 8, 9 and a busy host. */\n report?: CheckReport;\n /** 1 when a rule was broken with a confident verdict. */\n exitCode: 0 | 1;\n}\n\n/**\n * Gates 1 to 9 for one turn, then the judgement. The skip messages are said\n * once per session by the caller, which knows the session. An operational\n * failure throws a `TracevalsError`.\n */\nexport async function checkTurn(input: TurnCheckInput): Promise<TurnCheckResult> {\n const { config, dir: configDir } = await discoverConfig(input.cwd);\n // Gate 1. The transcript is not parsed.\n if (config.runtime === null) {\n return { skipped: { gate: \"not-in-play\" }, findings: [], exitCode: 0 };\n }\n // Gate 2: a judge's own session.\n const env = input.env ?? process.env;\n if ((env[JUDGE_ENV] ?? \"\") !== \"\") {\n return { skipped: { gate: \"judge-session\" }, findings: [], exitCode: 0 };\n }\n const subagent = input.agentTranscriptPath !== undefined;\n const trace = await readTrace(input.agentTranscriptPath ?? input.transcriptPath);\n const outcome = await runtimeCheck({\n config,\n configDir,\n trace,\n turn: subagent ? subagentTurn(trace) : lastTurn(trace),\n sessionId: input.sessionId,\n agentId: input.agentId ?? null,\n ...(input.agentType !== undefined ? { agentType: input.agentType } : {}),\n projectDir: input.cwd,\n ...(input.env !== undefined ? { env: input.env } : {}),\n judgeSelection: selectHookProvider(config),\n runs: config.runtime.hook.runs,\n inLoop: true,\n noCache: false,\n offline: false,\n ...(input.lastAssistantMessage !== undefined\n ? { lastAssistantMessage: input.lastAssistantMessage }\n : {}),\n ...seamsOf(input),\n });\n if (outcome.kind === \"gate\") {\n return { skipped: outcome.skip, findings: [], exitCode: 0 };\n }\n const { report, judgement } = outcome;\n if (report.skipped !== null) {\n return { skipped: { gate: report.skipped }, findings: [], report, exitCode: 0 };\n }\n return {\n ...(judgement !== undefined ? { judgement } : {}),\n findings: report.findings,\n report,\n exitCode: report.exitCode === 1 ? 1 : 0,\n };\n}\n","/**\n * The turn judge (proposal 0079, \"The judge, decisions first\" and \"The block\n * bar\"). It checks one turn against the rules that governed it.\n *\n * Each rule is judged on its own, against the rendered turn. Which path runs\n * is detected from the provider, never configured. A decision-only provider\n * gets one `decide` call, one question per rule, branching from the turn.\n * Every provider that generates gets `runs` calls of `completeJSONShared`, one\n * item per rule, each answered with a sentence of reasoning and then three\n * independent scores. Both share what earlier turns of the transcript did,\n * and a scored rule's item carries what the session ledger holds for it.\n *\n * Only a confident violation blocks. Everything short of that is\n * `needs-review`, and an errored rule can only go there, never to a silent\n * pass and never to a fail.\n */\nimport {\n JsonCache,\n buildCacheKey,\n canDecide,\n completeJSONShared,\n sha256,\n type DecideAnswer,\n type DecisionProvider,\n type InferenceProvider,\n type ZoneThresholds,\n} from \"@hawkeyexl/inference\";\nimport { DECISION_ONLY_PROVIDERS } from \"../../shared/providers.js\";\nimport type { Severity } from \"../../shared/severity.js\";\nimport type { TraceWindow } from \"../graders/util.js\";\nimport { evaluateWhen } from \"../graders/when.js\";\nimport { makeRedactor } from \"../judge/redact.js\";\nimport { renderTrace } from \"../judge/render.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport type { Rule } from \"./extract.js\";\nimport {\n TURN_JUDGE_PROMPT_VERSION,\n TURN_JUDGE_SYSTEM_PROMPT,\n TURN_SCORES,\n buildDecisionState,\n buildRuleItem,\n buildTurnShared,\n questionFor,\n ruleKey,\n TURN_SCHEMA,\n type TurnScore,\n} from \"./judge-prompt.js\";\nimport { historyBlock, type Ledger } from \"./ledger.js\";\nimport type { RuleSource } from \"./sources.js\";\nimport { timelineBlock } from \"./timeline.js\";\nimport type { TurnSlice } from \"./turn.js\";\n\n/** Default location, under the tool's per-project cache directory. */\nexport const DEFAULT_TURN_CACHE_DIR = \".manni/tracevals/cache/turns\";\n\n/**\n * Characters per token when fitting a provider's state limit. Prose and code\n * run near 4 characters a token in common tokenizers, and dense text such as\n * JSON, paths and hashes runs lower. 3 errs toward a smaller render, which\n * costs evidence; erring the other way costs the request.\n */\nexport const CHARS_PER_TOKEN = 3;\n\nexport interface TurnRule {\n /**\n * `path` lets the earlier turns say the session read the source. A source\n * whose `blocks` is false gives warnings; one that leaves it out blocks.\n */\n source: Pick<RuleSource, \"displayPath\"> & Partial<Pick<RuleSource, \"path\" | \"blocks\">>;\n rule: Rule;\n}\n\nexport interface TurnJudgeInput {\n trace: Trace;\n turn: TurnSlice;\n /** Every in-scope rule, sources ordered farthest to nearest. */\n rules: TurnRule[];\n provider: InferenceProvider;\n /** Scored runs. A decision-only provider makes one call and reports 1. */\n runs: number;\n temperature: number;\n zones: ZoneThresholds;\n render: { maxBlockChars: number; maxTotalChars: number; redact: string[] };\n /** The Stop payload's `last_assistant_message`, appended when the transcript lags. */\n lastAssistantMessage?: string;\n /**\n * The session's earlier verdicts, and which earlier turns had no rule in\n * scope. Only a scored rule's item carries its own history.\n */\n ledger?: Ledger;\n /** Where paths in earlier turns are made relative; the trace's cwd by default. */\n project?: { cwd: string; root: string };\n cache?: TurnCache;\n}\n\nexport interface TurnFinding {\n source: string;\n rule: string;\n text: string;\n outcome: \"fail\" | \"needs-review\";\n /** `error` when the rule's source blocks, `warning` when it is only reported. */\n severity: Severity;\n observed: string;\n confidence: number;\n /** The judge's reasoning. A decision-only provider gives none. */\n reasoning?: string;\n}\n\n/** Every rule sent to the judge, with where its verdict landed. */\nexport interface TurnVerdict {\n source: string;\n rule: string;\n text: string;\n outcome: Outcome;\n reasoning?: string;\n}\n\nexport interface TurnJudgement {\n mode: \"decision\" | \"generative\";\n runs: number;\n /** Only `fail` and `needs-review`; a rule left out passed or did not apply. */\n findings: TurnFinding[];\n /** One per rule sent to the judge, whatever its outcome. */\n verdicts: TurnVerdict[];\n /** Rules sent to the judge. */\n judged: number;\n /** Rules whose `when` failed over the turn, plus those scored not applicable. */\n notApplicable: number;\n /** Every rule's verdict came from the cache. */\n cached: boolean;\n warnings: string[];\n}\n\ntype Scores = Record<TurnScore, number> & { reasoning?: string };\n\n/** One rule's answers: a score set per run that answered. */\ninterface Verdict {\n runs: Scores[];\n error?: string;\n}\n\nexport type Outcome = \"fail\" | \"not-applicable\" | \"followed\" | \"needs-review\";\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nfunction isScores(v: unknown): v is Scores {\n return isRecord(v) && TURN_SCORES.every((s) => typeof v[s] === \"number\");\n}\n\n/**\n * Raw scores per rule and turn, before the block bar is applied, so a change\n * of `zones` reuses them. A rule with an errored run is never written.\n */\nexport class TurnCache {\n private readonly store: JsonCache<unknown>;\n\n constructor(dir: string = DEFAULT_TURN_CACHE_DIR, enabled = true) {\n this.store = new JsonCache<unknown>(dir, enabled, \"manni-tracevals\");\n }\n\n /** An entry of any other shape, from an older version, is a miss. */\n get(key: string): Scores[] | undefined {\n const v = this.store.get(key);\n if (!isRecord(v) || !Array.isArray(v.runs) || v.runs.length === 0) return undefined;\n const runs: unknown[] = v.runs;\n return runs.every(isScores) ? runs : undefined;\n }\n\n set(key: string, runs: Scores[]): void {\n this.store.set(key, { runs });\n }\n}\n\nexport interface ModelId {\n provider: string;\n model: string;\n}\n\n/**\n * What a provider's `stateLimit()` last said, per provider and model, with\n * `null` for one that has no limit. A local model loads to report it, and the\n * limit sets how much of the turn is rendered, which the verdict key hashes. So\n * \"is every verdict cached?\" could not be answered without loading the model\n * until this remembered the answer. A stale limit costs a miss, never a wrong\n * verdict, because a hit is keyed by the text it was scored on.\n */\nexport class StateLimits {\n private readonly store: JsonCache<unknown>;\n\n constructor(dir: string, enabled = true) {\n this.store = new JsonCache<unknown>(dir, enabled, \"manni-tracevals\");\n }\n\n get(id: ModelId): number | null | undefined {\n const v = this.store.get(buildCacheKey([id.provider, id.model]));\n return isRecord(v) && (v.limit === null || typeof v.limit === \"number\") ? v.limit : undefined;\n }\n\n set(id: ModelId, limit: number | null): void {\n this.store.set(buildCacheKey([id.provider, id.model]), { limit });\n }\n}\n\n/** Gate 6: a rule whose `when` fails over the turn is skipped, never passed. */\nexport function applicableRules(\n rules: TurnRule[],\n window: TraceWindow,\n): { applicable: TurnRule[]; notApplicable: number } {\n const applicable = rules.filter(\n (r) => evaluateWhen({ when: r.rule.when }, window).armed,\n );\n return { applicable, notApplicable: rules.length - applicable.length };\n}\n\ninterface Planned {\n /** Decision question id: source index among every input source, then rule id. */\n qid: string;\n source: string;\n id: string;\n text: string;\n severity: Severity;\n /** The ledger's block for this rule, \"\" for none and on the decision path. */\n history: string;\n /** The scored path's item for this rule. */\n item: string;\n}\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/** Decision-only providers decide; every provider that generates is scored. */\nfunction decisionOnly(provider: InferenceProvider): DecisionProvider | undefined {\n return DECISION_ONLY_PROVIDERS.has(provider.provider()) && canDecide(provider)\n ? provider\n : undefined;\n}\n\n/** The input without the provider, which a gate can use before one is built. */\nexport type TurnPlanInput = Omit<TurnJudgeInput, \"provider\">;\n\ninterface Plan {\n planned: Planned[];\n turnText: string;\n /** The transcript's account of earlier turns, \"\" for none. */\n earlier: string;\n warnings: string[];\n hits: Map<Planned, Verdict>;\n todo: Planned[];\n keyOf: (p: Planned) => string;\n}\n\n/**\n * Everything short of the model call: each rule's item, the turn rendered to\n * `limit` (undefined for no limit), and the verdict cache read. `decisionOnly`\n * and `limit` are all that come from the provider, so a caller that knows both\n * can plan without one.\n */\nfunction planTurn(\n input: TurnPlanInput,\n id: ModelId,\n decisionOnly: boolean,\n limit: number | undefined,\n): Plan {\n const runs = decisionOnly ? 1 : input.runs;\n const { applicable } = applicableRules(input.rules, input.turn.window);\n const warnings: string[] = [];\n const hits = new Map<Planned, Verdict>();\n\n // Indexed over every input source, so a question id does not move when a\n // farther source's rules happen not to apply.\n const sourceIndex = new Map<string, number>();\n for (const r of input.rules) {\n const path = r.source.displayPath;\n if (!sourceIndex.has(path)) sourceIndex.set(path, sourceIndex.size);\n }\n const planned: Planned[] = applicable.map(({ source, rule }) => {\n const history =\n !decisionOnly && input.ledger !== undefined\n ? historyBlock(input.ledger, ruleKey(source.displayPath, rule.id), rule.text, input.turn.from)\n : \"\";\n return {\n qid: `${String(sourceIndex.get(source.displayPath))}:${rule.id}`,\n source: source.displayPath,\n id: rule.id,\n text: rule.text,\n severity: source.blocks === false ? \"warning\" : \"error\",\n history,\n item: buildRuleItem(source.displayPath, rule, history),\n };\n });\n if (planned.length === 0) {\n return { planned, turnText: \"\", earlier: \"\", warnings, hits, todo: [], keyOf: () => \"\" };\n }\n\n // Render the turn, to the state limit when there is one. Every rule counts\n // toward the longest, cached or not, so the render and its key stay put.\n const tail = lastMessageLine(input);\n let budget = input.render.maxTotalChars;\n let byLimit = false;\n if (limit !== undefined) {\n const longest = Math.max(\n ...planned.map((p) =>\n decisionOnly ? JSON.stringify(questionFor(p.source, p)).length : p.item.length,\n ),\n );\n const fixed = decisionOnly\n ? buildDecisionState(\"\").length\n : TURN_JUDGE_SYSTEM_PROMPT.length + buildTurnShared(\"\").length;\n const fit = limit * CHARS_PER_TOKEN - longest - fixed;\n if (fit < budget) {\n budget = fit;\n byLimit = true;\n }\n }\n // Earlier turns share the budget with the turn, and take at most a quarter\n // of it, so the turn itself is never crowded out.\n const sources = [\n ...new Map(\n input.rules.flatMap(({ source: { path, displayPath } }) =>\n // A source with no file (the typed prompts, an inline plan, the system\n // prompt) is never read.\n path !== undefined && path !== \"\" ? [[displayPath, { path, displayPath }] as const] : [],\n ),\n ).values(),\n ];\n const earlier = timelineBlock(input.trace, input.turn.from, {\n cwd: input.project?.cwd ?? input.trace.cwd,\n root: input.project?.root ?? input.trace.cwd,\n redact: input.render.redact,\n sources,\n ...(input.ledger !== undefined ? { ledger: input.ledger } : {}),\n maxChars: Math.floor(budget / 4),\n });\n budget -= buildTurnShared(\"\", earlier).length - buildTurnShared(\"\").length;\n const cut = { happened: false };\n const turnText =\n renderTrace(input.trace, {\n maxBlockChars: input.render.maxBlockChars,\n maxTotalChars: budget - tail.length,\n redact: input.render.redact,\n turnFrom: input.turn.from,\n onTruncated: () => {\n cut.happened = true;\n },\n }) + tail;\n if (cut.happened) {\n warnings.push(\n byLimit\n ? `the session was cut to fit the state limit of ${String(limit)} tokens of ${id.provider}/${id.model}; earlier turns went first, then the last turn's middle`\n : `the session was cut to the render cap of ${String(input.render.maxTotalChars)} characters; earlier turns went first, then the last turn's middle`,\n );\n }\n\n // Gate 9: the same turn, rule and model reuse the verdict.\n const base = [\n id.provider,\n id.model,\n decisionOnly ? \"decision\" : \"generative\",\n `r${String(runs)}`,\n `t${String(input.temperature)}`,\n `turn-v${String(TURN_JUDGE_PROMPT_VERSION)}`,\n sha256(turnText),\n sha256(earlier),\n ];\n const keyOf = (p: Planned): string =>\n buildCacheKey([...base, sha256(JSON.stringify([p.source, p.id, p.text, p.history]))]);\n const todo: Planned[] = [];\n for (const p of planned) {\n const hit = input.cache?.get(keyOf(p));\n if (hit !== undefined) hits.set(p, { runs: hit });\n else todo.push(p);\n }\n return { planned, turnText, earlier, warnings, hits, todo, keyOf };\n}\n\n/**\n * Whether every applicable rule already has its verdict, answered without a\n * provider and so without loading a local model. The render depends on the\n * provider's state limit, which `StateLimits` remembers from the last\n * judgement, so a model never judged with is unknown and the answer is no.\n * A decision-only provider is never asked here: it is not a local model.\n */\nexport function allVerdictsCached(\n input: TurnPlanInput & { limits: StateLimits },\n id: ModelId,\n): boolean {\n const limit = input.limits.get(id);\n if (limit === undefined || DECISION_ONLY_PROVIDERS.has(id.provider)) return false;\n const plan = planTurn(input, id, false, limit ?? undefined);\n return plan.planned.length > 0 && plan.todo.length === 0;\n}\n\nexport async function judgeTurn(\n input: TurnJudgeInput & { limits?: StateLimits },\n): Promise<TurnJudgement> {\n const { provider, zones } = input;\n const decider = decisionOnly(provider);\n const mode = decider !== undefined ? \"decision\" : \"generative\";\n const runs = decider !== undefined ? 1 : input.runs;\n const id: ModelId = { provider: provider.provider(), model: provider.modelName() };\n const { applicable, notApplicable } = applicableRules(input.rules, input.turn.window);\n const result: TurnJudgement = {\n mode,\n runs,\n findings: [],\n verdicts: [],\n judged: applicable.length,\n notApplicable,\n cached: false,\n warnings: [],\n };\n if (applicable.length === 0) return result;\n\n // The provider's limit, remembered. A remembered one lets a fully cached\n // turn finish without asking the provider at all; any miss asks for the real\n // one, which refreshes the memory, and plans again if it moved.\n const fresh = async (): Promise<number | null> => {\n const real = canDecide(provider) ? await provider.stateLimit() : null;\n input.limits?.set(id, real);\n return real;\n };\n const remembered = input.limits?.get(id);\n let limit = remembered ?? (await fresh());\n let plan = planTurn(input, id, decider !== undefined, limit ?? undefined);\n if (remembered !== undefined && plan.todo.length > 0) {\n const real = await fresh();\n if (real !== limit) {\n limit = real;\n plan = planTurn(input, id, decider !== undefined, limit ?? undefined);\n }\n }\n const { planned, hits: verdicts, todo, keyOf, turnText, earlier } = plan;\n const warnings = plan.warnings;\n result.warnings = warnings;\n result.cached = todo.length === 0;\n if (todo.length > 0) {\n const scored =\n decider !== undefined\n ? await decide(decider, todo, buildDecisionState(turnText, earlier))\n : await score(provider, todo, buildTurnShared(turnText, earlier), runs, input.temperature);\n if (scored.every((v) => v.runs.length === 0)) {\n throw new Error(scored.find((v) => v.error !== undefined)?.error ?? \"every judge call errored\");\n }\n const errored = scored.filter((v) => v.error !== undefined);\n if (errored.length > 0) {\n warnings.push(\n `the judge errored on ${String(errored.length)} of ${String(todo.length)} rules, so they need review: ${errored[0]?.error ?? \"\"}`,\n );\n }\n todo.forEach((p, i) => {\n const v = scored[i] ?? { runs: [], error: \"the judge returned nothing\" };\n verdicts.set(p, v);\n if (v.error === undefined) input.cache?.set(keyOf(p), v.runs);\n });\n }\n\n for (const p of planned) {\n const v = verdicts.get(p) ?? { runs: [], error: \"the judge returned nothing\" };\n const outcome = outcomeOf(v, runs, zones);\n const reasoning = v.runs.find((r) => typeof r.reasoning === \"string\")?.reasoning;\n result.verdicts.push({\n source: p.source,\n rule: p.id,\n text: p.text,\n outcome,\n ...(reasoning !== undefined ? { reasoning } : {}),\n });\n if (outcome === \"not-applicable\") result.notApplicable += 1;\n else if (outcome !== \"followed\") result.findings.push(findingOf(p, outcome, v, runs));\n }\n return result;\n}\n\n/** One `decide` call; each option's probability becomes its score. */\nasync function decide(\n decider: DecisionProvider,\n todo: Planned[],\n state: string,\n): Promise<Verdict[]> {\n const response = await decider.decide({\n state,\n questions: Object.fromEntries(todo.map((p) => [p.qid, questionFor(p.source, p)])),\n });\n const answers: Record<string, DecideAnswer | undefined> = response.answers;\n return todo.map((p) => {\n const answer = answers[p.qid];\n if (answer === undefined) return { runs: [], error: \"the judge returned no answer for this rule\" };\n const pct = (s: TurnScore): number => Math.round((answer.probabilities[s] ?? 0) * 100);\n return {\n runs: [\n {\n followed: pct(\"followed\"),\n \"not-followed\": pct(\"not-followed\"),\n \"not-applicable\": pct(\"not-applicable\"),\n },\n ],\n };\n });\n}\n\n/** `runs` shared-prefix calls, one item per rule. */\nasync function score(\n provider: InferenceProvider,\n todo: Planned[],\n shared: string,\n runs: number,\n temperature: number,\n): Promise<Verdict[]> {\n const verdicts: Verdict[] = todo.map(() => ({ runs: [] }));\n const errors = todo.map(() => 0);\n for (let run = 0; run < runs; run++) {\n const response = await completeJSONShared(provider, {\n system: TURN_JUDGE_SYSTEM_PROMPT,\n shared,\n items: todo.map((p) => p.item),\n schema: TURN_SCHEMA,\n temperature,\n });\n verdicts.forEach((v, i) => {\n const answer = response.answers[i];\n if (answer !== undefined && \"json\" in answer && isScores(answer.json)) {\n v.runs.push(answer.json);\n return;\n }\n errors[i] = (errors[i] ?? 0) + 1;\n v.error ??= answer !== undefined && \"error\" in answer ? answer.error : \"the judge returned nothing\";\n });\n }\n return verdicts.map((v, i) =>\n v.error === undefined || v.runs.length === 0\n ? v\n : { ...v, error: `${String(errors[i] ?? 0)} of ${String(runs)} runs errored: ${v.error}` },\n );\n}\n\nfunction classify(s: Scores, zones: ZoneThresholds): Outcome {\n // An integer over 100 lands on the same double as the zone's literal, where\n // the zone times 100 can miss it (0.7 * 100 is 70.00000000000001).\n if (s[\"not-followed\"] / 100 >= zones.autoFail) return \"fail\";\n if (s[\"not-applicable\"] / 100 >= zones.autoPass) return \"not-applicable\";\n if (s.followed / 100 >= zones.autoPass) return \"followed\";\n return \"needs-review\";\n}\n\n/** Every run has to agree: a split ensemble, or any error, is review. */\nfunction outcomeOf(v: Verdict, runs: number, zones: ZoneThresholds): Outcome {\n if (v.error !== undefined || v.runs.length < runs) return \"needs-review\";\n const each = v.runs.map((s) => classify(s, zones));\n if (each.every((c) => c === \"fail\")) return \"fail\";\n if (each.every((c) => c === \"not-applicable\")) return \"not-applicable\";\n if (each.every((c) => c === \"not-applicable\" || c === \"followed\")) return \"followed\";\n return \"needs-review\";\n}\n\nfunction findingOf(\n p: Planned,\n outcome: TurnFinding[\"outcome\"],\n v: Verdict,\n runs: number,\n): TurnFinding {\n const base = { source: p.source, rule: p.id, text: p.text, outcome, severity: p.severity };\n if (v.runs.length === 0) {\n return {\n ...base,\n observed: `the judge returned no answer for this rule: ${v.error ?? \"\"}`,\n confidence: 0,\n };\n }\n const mean = (s: TurnScore): number =>\n Math.round(v.runs.reduce((sum, r) => sum + r[s], 0) / v.runs.length);\n const scores = `not-followed ${String(mean(\"not-followed\"))}, followed ${String(mean(\"followed\"))}, not-applicable ${String(mean(\"not-applicable\"))}`;\n const errored = v.error !== undefined && runs > 1 ? `; ${v.error}` : \"\";\n const reasoning = v.runs.find((r) => typeof r.reasoning === \"string\")?.reasoning;\n return {\n ...base,\n observed: `${scores}${errored}${reasoning !== undefined ? `. ${reasoning}` : \"\"}`,\n confidence: round(mean(\"not-followed\") / 100),\n ...(reasoning !== undefined ? { reasoning } : {}),\n };\n}\n\n/**\n * The transcript is written asynchronously, so its last message can lag the\n * Stop. The payload's copy is appended when the window does not end with it,\n * scrubbed and clipped as every rendered block is.\n */\nfunction lastMessageLine(input: TurnPlanInput): string {\n const message = input.lastAssistantMessage?.trim();\n if (message === undefined || message === \"\") return \"\";\n if (input.turn.window.assistantTexts.at(-1)?.trim() === message) return \"\";\n const safe = makeRedactor(input.render.redact)(message);\n const max = input.render.maxBlockChars;\n const clipped =\n safe.length <= max\n ? safe\n : `${safe.slice(0, max)} [... truncated ${String(safe.length - max)} chars ...]`;\n return `\\n[assistant] ${clipped}`;\n}\n","/**\n * The turn judge's prompt surface (proposal 0079, \"The judge, decisions\n * first\", reworded by proposal 0080 to judge the last turn against the\n * session). Each rule is judged on its own: the shared part is what earlier\n * turns did and the rendered turn, and each rule is one item appended to it. A decision-only provider\n * gets the same text as its state and one question per rule.\n */\nimport type { DecideQuestion } from \"@hawkeyexl/inference\";\n\n/**\n * Part of the turn verdict cache key: bump whenever anything in this file that\n * reaches a provider changes. `test/tracevals/unit/rules-judge.test.ts` pins it\n * to a digest of the surface, so the pair has to move together.\n */\nexport const TURN_JUDGE_PROMPT_VERSION = 8;\n\nexport const TURN_JUDGE_SYSTEM_PROMPT = [\n \"You check the last turn of an AI coding agent's session against one rule.\",\n \"The last turn starts at the last prompt the user typed and runs to the end of the transcript.\",\n \"The transcript shows the user's prompts, the agent's tool calls with their inputs, and its replies.\",\n '\"Earlier in this session\" lists what the session did before the last turn.',\n \"\",\n \"A prompt the user typed overrides any rule. Doing what the user explicitly asked is never a violation.\",\n \"A rule from the system prompt is a default. An instruction file, or a prompt the user typed, overrides it.\",\n \"\",\n \"Judge only from what the transcript and the earlier turns show. Do not guess.\",\n \"A rule applies only once the session does the kind of work it covers.\",\n \"Score it broken only for what the last turn did, or for the last turn saying the work is done without it.\",\n].join(\"\\n\");\n\n/** The three scores, each independent of the others, 0 to 100. */\nexport const TURN_SCORES = [\"not-applicable\", \"followed\", \"not-followed\"] as const;\nexport type TurnScore = (typeof TURN_SCORES)[number];\n\nconst SCORE = { type: \"integer\", minimum: 0, maximum: 100 } as const;\n\n/**\n * `reasoning` is declared first and always required, so a model writing the\n * object in order says what it saw before it commits to a score. It is not\n * length-capped: a 240-character cap was measured, and a model cut off\n * mid-reasoning committed to wrong scores on the fixtures.\n */\nexport const TURN_SCHEMA = {\n type: \"object\",\n required: [\"reasoning\", ...TURN_SCORES],\n additionalProperties: false,\n properties: {\n reasoning: { type: \"string\" },\n \"not-applicable\": SCORE,\n followed: SCORE,\n \"not-followed\": SCORE,\n },\n};\n\n/** Decision-only providers: the three options, one per score. */\nexport const TURN_CRITERIA: Record<TurnScore, string> = {\n followed: \"The session does what the rule asks.\",\n \"not-followed\":\n \"The last turn did what the rule forbids, skipped what it requires, or said the work is done without it.\",\n \"not-applicable\": \"The rule does not apply yet, or the last turn did nothing it covers.\",\n};\n\n/** How a rule is named to a model. */\nexport function ruleKey(displayPath: string, id: string): string {\n return `${displayPath}#${id}`;\n}\n\n/**\n * The part every rule's call shares: what earlier turns of the transcript\n * did, when any did something, then the turn.\n */\nexport function buildTurnShared(turn: string, earlier = \"\"): string {\n return `${earlier !== \"\" ? `${earlier}\\n\\n` : \"\"}# The turn\\n\\n${turn}\\n\\n`;\n}\n\n/**\n * One rule's item, appended to the shared part as it is. `history` is the\n * ledger's block for the rule, or \"\" when earlier turns have nothing to say.\n */\nexport function buildRuleItem(\n displayPath: string,\n rule: { id: string; text: string },\n history = \"\",\n): string {\n return [\n \"# The rule\",\n \"\",\n `${ruleKey(displayPath, rule.id)}: ${rule.text}`,\n \"\",\n ...(history !== \"\" ? [history, \"\"] : []),\n \"First say in one or two sentences what the session shows about this rule. Then score each as a whole number from 0 to 100: \" +\n \"the rule does not apply yet, or the last turn did nothing it covers; the session follows it; the last turn broke it, or the last turn says the work is done without it.\",\n ].join(\"\\n\");\n}\n\n/** A decision-only provider's state: the system prompt, then the shared part. */\nexport function buildDecisionState(turn: string, earlier = \"\"): string {\n return `${TURN_JUDGE_SYSTEM_PROMPT}\\n\\n${buildTurnShared(turn, earlier)}`;\n}\n\nexport function questionFor(\n displayPath: string,\n rule: { id: string; text: string },\n): DecideQuestion {\n return {\n type: \"choice\",\n instructions: `Did this turn follow ${ruleKey(displayPath, rule.id)}? The rule: ${rule.text}`,\n criteria: { ...TURN_CRITERIA },\n };\n}\n","/**\n * \"# Earlier in this session\", read from the transcript (proposal 0080,\n * \"Earlier in this session, from the transcript\"). Every turn before the\n * judged one that did something gets a line, newest last, so a rule about a\n * procedure that spans turns is judged with the whole session behind it. The\n * ledger only says which of those turns had no rule in scope.\n */\nimport { makeRedactor } from \"../judge/redact.js\";\nimport { materialize } from \"../graders/util.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport { clipTo, projectPath, turnFacts, type Ledger } from \"./ledger.js\";\nimport type { RuleSource } from \"./sources.js\";\nimport { isTypedPrompt } from \"./turn.js\";\n\nconst HEAD = \"# Earlier in this session\\n\\n\";\nconst RESULT_CHARS = 120;\nconst TICK_CHARS = 60;\nconst SPAWNS = 10;\n/** A task line in Spec Kit, Kiro and OpenSpec task lists. */\nconst TASK = /^\\s*-\\s+\\[([ xX])\\]\\s+(.+?)\\s*$/;\n/** A task's leading id: `T014`, `FR-001`, `1.2`. */\nconst TASK_ID = /^(?:[A-Z]+(?:-[A-Z]+)*-?\\d+(?:\\.\\d+)*|\\d+(?:\\.\\d+)*)(?=[\\s:.)\\]]|$)/;\n\nexport interface TimelineOptions {\n cwd: string;\n root: string;\n redact: readonly string[];\n /** The rule sources a `read` fact names; others' reads are left out. */\n sources: Pick<RuleSource, \"path\" | \"displayPath\">[];\n /** Marks a turn it recorded with no rules in scope. */\n ledger?: Ledger;\n maxChars?: number;\n}\n\ninterface ToolResult {\n text: string;\n isError: boolean;\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** Every tool_result block in the trace, by the id of the call it answers. */\nfunction toolResults(trace: Trace): Map<string, ToolResult> {\n const out = new Map<string, ToolResult>();\n for (const e of trace.events) {\n if (e.kind !== \"tool_result\") continue;\n const message = e.raw.message;\n const content: unknown = isRecord(message) ? message.content : undefined;\n if (!Array.isArray(content)) continue;\n for (const block of content as unknown[]) {\n if (!isRecord(block) || block.type !== \"tool_result\" || typeof block.tool_use_id !== \"string\") continue;\n const body: unknown = block.content;\n const text =\n typeof body === \"string\"\n ? body\n : Array.isArray(body)\n ? (body as unknown[])\n .flatMap((b) => (isRecord(b) && typeof b.text === \"string\" ? [b.text] : []))\n .join(\"\\n\")\n : \"\";\n out.set(block.tool_use_id, { text, isError: block.is_error === true });\n }\n }\n return out;\n}\n\n/** The `tool_use` id of the call at `index`, read from its event. */\nfunction callId(trace: Trace, index: number): string | undefined {\n // Find by ordinal: the event array need not hold one event per ordinal.\n const id = trace.events.find((e) => e.index === index)?.raw.id;\n return typeof id === \"string\" ? id : undefined;\n}\n\n/** Texts of the task lines in `text` whose box is ticked (`x`) or not (` `). */\nfunction tasks(text: string, ticked: boolean): string[] {\n return text.split(/\\r?\\n/).flatMap((line) => {\n const m = TASK.exec(line);\n const box = m?.[1];\n const body = m?.[2];\n if (box === undefined || body === undefined) return [];\n return (box !== \" \") === ticked ? [body] : [];\n });\n}\n\n/** The tasks an edit ticks: unticked in its old string, ticked with the same text in its new. */\nfunction ticks(oldText: unknown, newText: unknown): string[] {\n if (typeof oldText !== \"string\" || typeof newText !== \"string\") return [];\n const now = new Set(tasks(newText, true));\n return tasks(oldText, false).filter((t) => now.has(t));\n}\n\nconst list = (verb: string, items: string[]): string[] =>\n items.length > 0 ? [`${verb} ${items.join(\", \")}`] : [];\n\n/**\n * The block for the turns before `before`, or \"\" when none did anything.\n * Over `maxChars`, the oldest lines go first, and a marker line says which.\n */\nexport function timelineBlock(trace: Trace, before: number, opts: TimelineOptions): string {\n const scrub = makeRedactor(opts.redact);\n const results = toolResults(trace);\n const starts = trace.events\n .filter((e) => e.index < before && e.sidechain !== true && isTypedPrompt(e))\n .map((e) => e.index);\n\n const lines = starts.flatMap((from, i) => {\n const end = starts[i + 1] ?? before;\n const window = materialize(trace, \"turn\", \"earlier turn\", [{ start: from, end }], undefined, new Set([undefined]));\n // turnFacts reads only the window and bounds; 0 just satisfies TurnSlice.\n const facts = turnFacts(trace, { window, from, to: end - 1, sessionTurnCount: 0 }, opts.sources, opts);\n const spawns = trace.agentSpawns\n .filter((a) => a.index >= from && a.index < end)\n .slice(0, SPAWNS)\n .map((a) => {\n const result = results.get(a.toolUseId ?? callId(trace, a.index) ?? \"\");\n // Redact, then clip, so a cap never lands mid-secret.\n const first = scrub(result?.text ?? \"\").trim().split(/\\r?\\n/)[0]?.trim() ?? \"\";\n return first === \"\"\n ? `spawned ${a.subagentType}`\n : `spawned ${a.subagentType}, which returned ${clipTo(first, RESULT_CHARS)}`;\n });\n const calls = window.toolCalls;\n const asked = calls.some((c) => c.name === \"AskUserQuestion\") ? [\"asked the user\"] : [];\n const ticked = calls.flatMap((c) => {\n if (typeof c.input.file_path !== \"string\") return [];\n const edits: unknown[] =\n c.name === \"Edit\" ? [c.input] : c.name === \"MultiEdit\" && Array.isArray(c.input.edits) ? c.input.edits : [];\n const path = scrub(projectPath(c.input.file_path, opts.cwd, opts.root));\n return edits.flatMap((e) =>\n isRecord(e)\n ? ticks(e.old_string, e.new_string).map((t) => {\n const safe = scrub(t);\n return `ticked ${TASK_ID.exec(safe)?.[0] ?? clipTo(safe, TICK_CHARS)} in ${path}`;\n })\n : [],\n );\n });\n const approved = calls.some((c) => {\n if (c.name !== \"ExitPlanMode\") return false;\n const result = results.get(callId(trace, c.index) ?? \"\");\n return result !== undefined && !result.isError;\n })\n ? [\"had a plan approved\"]\n : [];\n const parts = [\n ...list(\"ran\", facts.commands),\n ...list(\"wrote\", facts.wrote),\n ...list(\"read\", facts.read),\n ...facts.skills.map((s) => `ran skill ${s}`),\n ...spawns,\n ...asked,\n ...[...new Set(ticked)],\n ...approved,\n ];\n if (parts.length === 0) return [];\n const out = opts.ledger?.turns.find((t) => t.turn === from)?.inScope === false;\n return [{ turn: from, line: `- turn ${String(from)}: ${parts.join(\"; \")}${out ? \" (no rules in scope)\" : \"\"}` }];\n });\n\n // Drop the oldest until the block fits, the marker's length included.\n const max = opts.maxChars ?? Number.POSITIVE_INFINITY;\n const marker = (n: number): string => {\n const a = String(lines[0]?.turn);\n const b = String(lines[n - 1]?.turn);\n return n === 1 ? `- (turn ${a}: 1 line left out)` : `- (turns ${a}–${b}: ${String(n)} lines left out)`;\n };\n let kept = lines.reduce((sum, l) => sum + l.line.length + 1, HEAD.length - 1);\n let dropped = 0;\n const size = (): number => kept + (dropped > 0 ? marker(dropped).length + 1 : 0);\n while (dropped < lines.length && size() > max) {\n kept -= (lines[dropped]?.line.length ?? 0) + 1;\n dropped += 1;\n }\n if (dropped === lines.length) return \"\";\n const shown = lines.slice(dropped).map((l) => l.line);\n return `${HEAD}${[...(dropped > 0 ? [marker(dropped)] : []), ...shown].join(\"\\n\")}`;\n}\n"],"mappings":"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","names":["isRecord","decisionOnly"]}
|
|
1
|
+
{"version":3,"sources":["../src/tracevals/commands/check.ts","../src/tracevals/rules/judge.ts","../src/tracevals/rules/judge-prompt.ts","../src/tracevals/rules/timeline.ts"],"sourcesContent":["/**\n * `manni tracevals check <trace>`: judge the last turn of one session against\n * the rules that governed it (proposal 0079). `checkTurn` is the same\n * judgement inside a Stop or SubagentStop hook, with the hook's model and\n * every gate of \"When tracevals stays out of the way\".\n *\n * Both are read-only over the trace and the sources. What they write is the\n * rules cache and the verdict cache, under `judge.cacheDir`. The hook also\n * writes the session ledger, for every turn it parses, which `check` by hand\n * only reads and sums up.\n */\nimport { writeFile } from \"node:fs/promises\";\nimport { basename, resolve } from \"node:path\";\nimport type { InferenceProvider, ProviderName } from \"@hawkeyexl/inference\";\nimport { discoverConfig, type TracevalsConfig } from \"../core/config.js\";\nimport {\n constructProvider,\n resolveSelectionIdentity,\n selectHookProvider,\n selectProvider,\n type ProviderSelection,\n} from \"../judge/provider.js\";\nimport { renderCheck } from \"../reporters/runtime.js\";\nimport type { SummaryFormat } from \"../reporters/index.js\";\nimport { hostHolds, hostSetting, queued, QUEUE_WAIT_MS, type HostApi } from \"../rules/host.js\";\nimport {\n allVerdictsCached,\n applicableRules,\n judgeTurn,\n StateLimits,\n TurnCache,\n type TurnFinding,\n type TurnJudgement,\n type TurnRule,\n} from \"../rules/judge.js\";\nimport { ruleKey } from \"../rules/judge-prompt.js\";\nimport {\n ledgerPath,\n readLedger,\n recordFacts,\n recordTurn,\n rollup,\n turnFacts,\n writeLedger,\n type Ledger,\n type LedgerOutcome,\n type SessionRollup,\n} from \"../rules/ledger.js\";\nimport { warn } from \"../../shared/warn.js\";\nimport { libraryLocalModels, type LocalModels } from \"../rules/local.js\";\nimport { mockTurnJudge } from \"../rules/mock.js\";\nimport { resolveTurnSources, type RuleSource } from \"../rules/sources.js\";\nimport { lastTurn, subagentTurn, type TurnSlice } from \"../rules/turn.js\";\nimport { parseTraceFile } from \"../trace/claude.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport { TracevalsError } from \"../types.js\";\nimport {\n assertDownloaded,\n runtimeOf,\n extraction,\n firstLine,\n isNetworkProvider,\n JUDGE_ENV,\n localGate,\n markJudgeProcess,\n offlineRefusal,\n rulesCacheFor,\n type GateSkip,\n type Identity,\n type LocalGate,\n} from \"./runtime.js\";\n\n/** Why a judgement stopped short, as the report's `skipped` names it. */\nexport type CheckSkip = \"empty-turn\" | \"no-sources\" | \"not-applicable\";\n\n/** Every gate a hook can stop at, in the proposal's order. */\nexport type HookGate =\n | \"not-in-play\"\n | \"judge-session\"\n | CheckSkip\n | LocalGate\n | \"busy\";\n\nexport interface CheckSourceEntry {\n path: string;\n format: RuleSource[\"format\"];\n skill?: string;\n trigger: string;\n rules: number;\n origin: \"declared\" | \"extracted\";\n}\n\nexport interface CheckReport {\n trace: string;\n sessionId: string;\n /** The subagent a SubagentStop judged, or null for the main session. */\n agentId: string | null;\n turn: { from: number; to: number };\n /** Null when the run stopped before a judge was asked. */\n judge: { provider: string; model: string; mode: TurnJudgement[\"mode\"]; runs: number } | null;\n /** Null when no source needed the extraction model. */\n extraction: { provider: string; model: string } | null;\n sources: CheckSourceEntry[];\n /** Only `fail` and `needs-review`. */\n findings: TurnFinding[];\n /** `fail` counts `error` breaks; `reported` counts `warning` ones, which never fail a turn. */\n summary: {\n sources: number;\n rules: number;\n notApplicable: number;\n fail: number;\n needsReview: number;\n reported: number;\n };\n /** By hand, the session ledger summed up per rule. Null when it holds nothing, and under a hook. */\n session: SessionRollup | null;\n skipped: CheckSkip | null;\n warnings: string[];\n exitCode: number;\n}\n\n/** Test seams; production builds every one of these from config. */\ninterface Seams {\n /** The judge, in place of the selected provider. */\n judge?: InferenceProvider;\n /** The extraction model, in place of the out-of-loop provider. */\n extractor?: InferenceProvider;\n localModels?: LocalModels;\n /** The model host's calls, in place of the library's. */\n hostApi?: HostApi;\n}\n\ninterface Params extends Seams {\n config: TracevalsConfig;\n configDir: string;\n trace: Trace;\n turn: TurnSlice;\n sessionId: string;\n agentId: string | null;\n agentType?: string;\n projectDir: string;\n projectRoot?: string;\n env?: Record<string, string | undefined>;\n judgeSelection: ProviderSelection;\n runs: number;\n inLoop: boolean;\n noCache: boolean;\n offline: boolean;\n lastAssistantMessage?: string;\n}\n\ntype Outcome =\n | { kind: \"report\"; report: CheckReport; judgement?: TurnJudgement }\n | { kind: \"gate\"; skip: GateSkip<HookGate> };\n\nconst idOf = (p: InferenceProvider): Identity => ({\n provider: p.provider() as ProviderName,\n model: p.modelName(),\n});\n\nconst LEDGER_OUTCOME: Record<TurnJudgement[\"verdicts\"][number][\"outcome\"], LedgerOutcome> = {\n fail: \"broken\",\n followed: \"followed\",\n \"needs-review\": \"needs-review\",\n \"not-applicable\": \"not-applicable\",\n};\n\n/** How far a run got, for the ledger. */\ninterface Seen {\n sources: RuleSource[];\n judgement?: TurnJudgement;\n}\n\n/**\n * The pipeline both modes run, with the session ledger around it. The hook\n * records every turn it parses, judged or not. By hand the ledger is only\n * read, and summed up for the report.\n */\nasync function runtimeCheck(p: Params): Promise<Outcome> {\n const ledgerFile = ledgerPath(p.projectDir, p.sessionId, p.agentId);\n const ledger = await readLedger(ledgerFile);\n const seen: Seen = { sources: [] };\n const outcome = await judgeTurnOf(p, ledger, seen);\n if (p.inLoop) await record(p, ledgerFile, ledger, seen);\n else if (outcome.kind === \"report\") outcome.report.session = rollup(ledger);\n return outcome;\n}\n\n/** This turn's facts, and its verdicts when it was judged. A failed write warns. */\nasync function record(p: Params, file: string, ledger: Ledger, seen: Seen): Promise<void> {\n const facts = turnFacts(p.trace, p.turn, seen.sources, {\n cwd: p.projectDir,\n root: p.projectRoot ?? p.projectDir,\n redact: p.config.judge.redact,\n });\n let next = recordFacts(ledger, facts);\n if (seen.judgement !== undefined) {\n next = recordTurn(\n next,\n p.turn.from,\n seen.judgement.verdicts.map((v) => ({\n key: ruleKey(v.source, v.rule),\n text: v.text,\n outcome: LEDGER_OUTCOME[v.outcome],\n note: v.reasoning ?? \"\",\n })),\n );\n }\n try {\n await writeLedger(file, next);\n } catch (err) {\n warn(`could not write the session ledger ${file}: ${firstLine(err)}`);\n }\n}\n\n/** Sources, extraction, the judge. */\nasync function judgeTurnOf(p: Params, ledger: Ledger, seen: Seen): Promise<Outcome> {\n const { config, turn } = p;\n const runtime = runtimeOf(config);\n const local = p.localModels ?? libraryLocalModels(config.providers);\n const report: CheckReport = {\n trace: p.trace.file,\n sessionId: p.sessionId,\n agentId: p.agentId,\n turn: { from: turn.from, to: turn.to },\n judge: null,\n extraction: null,\n sources: [],\n findings: [],\n summary: { sources: 0, rules: 0, notApplicable: 0, fail: 0, needsReview: 0, reported: 0 },\n session: null,\n skipped: null,\n warnings: [...p.trace.warnings],\n exitCode: 0,\n };\n const stop = (skipped: CheckSkip): Outcome => {\n report.skipped = skipped;\n return { kind: \"report\", report };\n };\n\n // Gate 3.\n if (turn.window.empty) return stop(\"empty-turn\");\n\n // Gate 4.\n const resolved = await resolveTurnSources(p.trace, turn, {\n projectDir: p.projectDir,\n ...(p.projectRoot !== undefined ? { projectRoot: p.projectRoot } : {}),\n ...(p.env !== undefined ? { env: p.env } : {}),\n include: runtime.include,\n exclude: runtime.exclude,\n plans: runtime.plans,\n redact: config.judge.redact,\n ...(p.agentType !== undefined ? { agentType: p.agentType } : {}),\n });\n report.warnings.push(...resolved.warnings);\n // Under a hook a source that never blocks (Claude Code's default system\n // prompt) could only add judge calls, so it is neither extracted nor judged.\n // By hand it is, and its breaks are reported.\n const sources = p.inLoop ? resolved.sources.filter((s) => s.blocks) : resolved.sources;\n seen.sources = sources;\n report.summary.sources = sources.length;\n if (sources.length === 0) return stop(\"no-sources\");\n\n const judgeId = p.judge !== undefined ? idOf(p.judge) : await resolveSelectionIdentity(config, p.judgeSelection);\n const judgeIsLocal = judgeId.provider === \"llama-cpp\";\n\n // Gate 5, for the judge. Extraction's own model is asked below, only when a\n // source needs it.\n if (p.inLoop && judgeIsLocal) {\n const skip = await localGate(local, judgeId.model, [\"downloading\"]);\n if (skip !== undefined) return { kind: \"gate\", skip };\n }\n\n // Extraction, between gates 4 and 6, with the out-of-loop model always.\n const host = hostSetting(p.inLoop, p.sessionId, config.providers[\"llama-cpp\"]?.keepAlive);\n const ex = await extraction(config, rulesCacheFor(config, p.configDir, p.noCache), p.extractor, host);\n if (sources.some((s) => ex.needs(s))) {\n report.extraction = { provider: ex.identity.provider, model: ex.identity.model };\n if (p.offline && isNetworkProvider(ex.identity.provider)) {\n throw offlineRefusal(\"extraction\", ex.identity);\n }\n if (ex.identity.provider === \"llama-cpp\") {\n if (p.inLoop) {\n const skip = await localGate(\n local,\n ex.identity.model,\n [\"downloading\", \"not-downloaded\", \"memory\"],\n () => hostHolds(ex.identity.model, p.hostApi),\n );\n if (skip !== undefined) return { kind: \"gate\", skip };\n } else {\n await assertDownloaded(local, ex.identity.model);\n }\n }\n }\n const rules: TurnRule[] = [];\n for (const source of sources) {\n const { rules: found, origin } = await ex.rulesOf(source);\n report.sources.push({\n path: source.displayPath,\n format: source.format,\n ...(source.skill !== undefined ? { skill: source.skill } : {}),\n trigger: source.trigger,\n rules: found.length,\n origin,\n });\n for (const rule of found) rules.push({ source, rule });\n }\n report.summary.rules = rules.length;\n\n // Gate 6.\n const { applicable } = applicableRules(rules, turn.window);\n if (applicable.length === 0) {\n report.summary.notApplicable = rules.length;\n return stop(\"not-applicable\");\n }\n\n if (p.offline && isNetworkProvider(judgeId.provider)) {\n throw offlineRefusal(\"the judge\", judgeId);\n }\n const cacheRoot = resolve(p.configDir, config.judge.cacheDir);\n const limits = new StateLimits(resolve(cacheRoot, \"limits\"), !p.noCache);\n const plan = {\n trace: p.trace,\n turn,\n rules,\n runs: p.runs,\n temperature: config.judge.temperature,\n zones: config.judge.zones,\n render: {\n maxBlockChars: config.render.maxBlockChars,\n maxTotalChars: config.render.maxTotalChars,\n redact: config.judge.redact,\n },\n ...(p.lastAssistantMessage !== undefined ? { lastAssistantMessage: p.lastAssistantMessage } : {}),\n ledger,\n project: { cwd: p.projectDir, root: p.projectRoot ?? p.projectDir },\n cache: new TurnCache(resolve(cacheRoot, \"turns\"), !p.noCache),\n };\n\n // Gates 7 and 8, model on disk and memory. The memory probe is skipped when\n // the model will not be loaded or is loaded already: every applicable\n // rule's verdict is cached (gate 9, read from the remembered state limit\n // without a provider), or the host holds the model. The verdict cache is\n // otherwise read inside judgeTurn, once the provider reports its limit.\n if (judgeIsLocal) {\n if (p.inLoop) {\n const skip = await localGate(\n local,\n judgeId.model,\n [\"not-downloaded\", \"memory\"],\n async () =>\n allVerdictsCached({ ...plan, limits }, judgeId) || (await hostHolds(judgeId.model, p.hostApi)),\n );\n if (skip !== undefined) return { kind: \"gate\", skip };\n } else {\n await assertDownloaded(local, judgeId.model);\n }\n }\n\n markJudgeProcess();\n const provider =\n p.judge ??\n (judgeId.provider === \"mock\"\n ? mockTurnJudge(judgeId.model)\n : constructProvider(config, judgeId, { host }));\n let ran: Awaited<ReturnType<typeof queued<TurnJudgement>>>;\n try {\n ran = await queued(judgeId.model, () =>\n judgeTurn({ ...plan, provider, limits }),\n );\n } catch (err) {\n if (err instanceof TracevalsError) throw err;\n throw new TracevalsError(`could not judge the last turn: ${firstLine(err)}`);\n }\n if (ran.busy) {\n return {\n kind: \"gate\",\n skip: {\n gate: \"busy\",\n message: `tracevals skipped this turn: ${judgeId.model} was busy with other judgements for ${String(QUEUE_WAIT_MS / 60_000)} minutes.`,\n },\n };\n }\n const judgement = ran.value;\n seen.judgement = judgement;\n report.judge = {\n provider: judgeId.provider,\n model: judgeId.model,\n mode: judgement.mode,\n runs: judgement.runs,\n };\n report.findings = judgement.findings;\n report.summary.notApplicable = judgement.notApplicable;\n const fails = judgement.findings.filter((f) => f.outcome === \"fail\");\n report.summary.fail = fails.filter((f) => f.severity === \"error\").length;\n // `reported` is confirmed breaks from sources that never block. A\n // needs-review verdict from any source, those included, stays in needsReview.\n report.summary.reported = fails.length - report.summary.fail;\n report.summary.needsReview = judgement.findings.length - fails.length;\n report.warnings.push(...judgement.warnings);\n report.exitCode = report.summary.fail > 0 ? 1 : 0;\n return { kind: \"report\", report, judgement };\n}\n\nasync function readTrace(path: string): Promise<Trace> {\n try {\n return await parseTraceFile(path);\n } catch (err) {\n throw new TracevalsError(`cannot read trace ${path}: ${firstLine(err)}`);\n }\n}\n\n// ── By hand ──────────────────────────────────────────────────────\n\nexport interface CheckOptions extends Seams {\n tracePath: string;\n /** Project root for resolving sources; default the trace's recorded cwd. */\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n /** Overrides `judge.ensembleRuns`. */\n runs?: number;\n noCache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n output?: string;\n color?: boolean;\n /** Directory holding manni.config.yaml; defaults to cwd. */\n configDir?: string;\n config?: string;\n noConfig?: boolean;\n env?: Record<string, string | undefined>;\n}\n\nexport interface CheckResult {\n report: CheckReport;\n rendered: string;\n}\n\nexport async function runCheck(options: CheckOptions): Promise<CheckResult> {\n const { config, dir: configDir } = await discoverConfig(options.configDir ?? process.cwd(), {\n ...(options.config === undefined ? {} : { configPath: options.config }),\n ...(options.noConfig === undefined ? {} : { noConfig: options.noConfig }),\n });\n const judgeSelection = selectProvider(config, {\n ...(options.provider !== undefined ? { provider: options.provider } : {}),\n ...(options.model !== undefined ? { model: options.model } : {}),\n ...(options.local !== undefined ? { local: options.local } : {}),\n });\n const trace = await readTrace(options.tracePath);\n const outcome = await runtimeCheck({\n config,\n configDir,\n trace,\n turn: lastTurn(trace),\n sessionId: trace.sessionId ?? basename(trace.file).replace(/\\.jsonl$/, \"\"),\n agentId: null,\n projectDir: options.project ?? trace.cwd,\n ...(options.project !== undefined ? { projectRoot: options.project } : {}),\n ...(options.env !== undefined ? { env: options.env } : {}),\n judgeSelection,\n runs: options.runs ?? config.judge.ensembleRuns,\n inLoop: false,\n noCache: options.noCache === true,\n offline: options.offline === true,\n ...seamsOf(options),\n });\n // By hand only the report's own skips exist; the other gates act under a hook.\n if (outcome.kind === \"gate\") throw new TracevalsError(outcome.skip.message);\n const { report } = outcome;\n const rendered =\n options.format === \"json\"\n ? JSON.stringify(report, null, 2)\n : renderCheck(report, { color: options.color === true });\n if (options.output !== undefined) await writeFile(options.output, rendered, \"utf-8\");\n return { report, rendered };\n}\n\nfunction seamsOf(s: Seams): Seams {\n return {\n ...(s.judge !== undefined ? { judge: s.judge } : {}),\n ...(s.extractor !== undefined ? { extractor: s.extractor } : {}),\n ...(s.localModels !== undefined ? { localModels: s.localModels } : {}),\n ...(s.hostApi !== undefined ? { hostApi: s.hostApi } : {}),\n };\n}\n\n// ── Inside a hook ────────────────────────────────────────────────\n\n/** What a Stop or SubagentStop envelope carries, as the family hook passes it. */\nexport interface TurnCheckInput extends Seams {\n transcriptPath: string;\n /** SubagentStop: the subagent's own transcript, judged alone. */\n agentTranscriptPath?: string;\n agentId?: string;\n /** SubagentStop: the subagent type, whose definition governs the run. */\n agentType?: string;\n /** Appended when the transcript lags the Stop. */\n lastAssistantMessage?: string;\n sessionId: string;\n cwd: string;\n inLoop: true;\n /** Defaults to `process.env`; gate 2 and the source walk read it. */\n env?: Record<string, string | undefined>;\n}\n\nexport interface TurnCheckResult {\n /** The gate that ended the run. A message is set where the proposal says one. */\n skipped?: { gate: HookGate; message?: string };\n judgement?: TurnJudgement;\n /** Only `fail` and `needs-review`; empty when skipped. */\n findings: TurnFinding[];\n /** Absent for gates 1, 2, 5, 8, 9 and a busy host. */\n report?: CheckReport;\n /** 1 when a rule was broken with a confident verdict. */\n exitCode: 0 | 1;\n}\n\n/**\n * Gates 1 to 9 for one turn, then the judgement. The skip messages are said\n * once per session by the caller, which knows the session. An operational\n * failure throws a `TracevalsError`.\n */\nexport async function checkTurn(input: TurnCheckInput): Promise<TurnCheckResult> {\n const { config, dir: configDir } = await discoverConfig(input.cwd);\n // Gate 1. The transcript is not parsed.\n if (config.runtime === null) {\n return { skipped: { gate: \"not-in-play\" }, findings: [], exitCode: 0 };\n }\n // Gate 2: a judge's own session.\n const env = input.env ?? process.env;\n if ((env[JUDGE_ENV] ?? \"\") !== \"\") {\n return { skipped: { gate: \"judge-session\" }, findings: [], exitCode: 0 };\n }\n const subagent = input.agentTranscriptPath !== undefined;\n const trace = await readTrace(input.agentTranscriptPath ?? input.transcriptPath);\n const outcome = await runtimeCheck({\n config,\n configDir,\n trace,\n turn: subagent ? subagentTurn(trace) : lastTurn(trace),\n sessionId: input.sessionId,\n agentId: input.agentId ?? null,\n ...(input.agentType !== undefined ? { agentType: input.agentType } : {}),\n projectDir: input.cwd,\n ...(input.env !== undefined ? { env: input.env } : {}),\n judgeSelection: selectHookProvider(config),\n runs: config.runtime.hook.runs,\n inLoop: true,\n noCache: false,\n offline: false,\n ...(input.lastAssistantMessage !== undefined\n ? { lastAssistantMessage: input.lastAssistantMessage }\n : {}),\n ...seamsOf(input),\n });\n if (outcome.kind === \"gate\") {\n return { skipped: outcome.skip, findings: [], exitCode: 0 };\n }\n const { report, judgement } = outcome;\n if (report.skipped !== null) {\n return { skipped: { gate: report.skipped }, findings: [], report, exitCode: 0 };\n }\n return {\n ...(judgement !== undefined ? { judgement } : {}),\n findings: report.findings,\n report,\n exitCode: report.exitCode === 1 ? 1 : 0,\n };\n}\n","/**\n * The turn judge (proposal 0079, \"The judge, decisions first\" and \"The block\n * bar\"). It checks one turn against the rules that governed it.\n *\n * Each rule is judged on its own, against the rendered turn. Which path runs\n * is detected from the provider, never configured. A decision-only provider\n * gets one `decide` call, one question per rule, branching from the turn.\n * Every provider that generates gets `runs` calls of `completeJSONShared`, one\n * item per rule, each answered with a sentence of reasoning and then three\n * independent scores. Both share what earlier turns of the transcript did,\n * and a scored rule's item carries what the session ledger holds for it.\n *\n * Only a confident violation blocks. Everything short of that is\n * `needs-review`, and an errored rule can only go there, never to a silent\n * pass and never to a fail.\n */\nimport {\n JsonCache,\n buildCacheKey,\n canDecide,\n completeJSONShared,\n sha256,\n type DecideAnswer,\n type DecisionProvider,\n type InferenceProvider,\n type ZoneThresholds,\n} from \"@hawkeyexl/inference\";\nimport { DECISION_ONLY_PROVIDERS } from \"../../shared/providers.js\";\nimport type { Severity } from \"../../shared/severity.js\";\nimport type { TraceWindow } from \"../graders/util.js\";\nimport { evaluateWhen } from \"../graders/when.js\";\nimport { makeRedactor } from \"../judge/redact.js\";\nimport { renderTrace } from \"../judge/render.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport type { Rule } from \"./extract.js\";\nimport {\n TURN_JUDGE_PROMPT_VERSION,\n TURN_JUDGE_SYSTEM_PROMPT,\n TURN_SCORES,\n buildDecisionState,\n buildRuleItem,\n buildTurnShared,\n questionFor,\n ruleKey,\n TURN_SCHEMA,\n type TurnScore,\n} from \"./judge-prompt.js\";\nimport { historyBlock, type Ledger } from \"./ledger.js\";\nimport type { RuleSource } from \"./sources.js\";\nimport { timelineBlock } from \"./timeline.js\";\nimport type { TurnSlice } from \"./turn.js\";\n\n/** Default location, under the tool's per-project cache directory. */\nexport const DEFAULT_TURN_CACHE_DIR = \".manni/tracevals/cache/turns\";\n\n/**\n * Characters per token when fitting a provider's state limit. Prose and code\n * run near 4 characters a token in common tokenizers, and dense text such as\n * JSON, paths and hashes runs lower. 3 errs toward a smaller render, which\n * costs evidence; erring the other way costs the request.\n */\nexport const CHARS_PER_TOKEN = 3;\n\nexport interface TurnRule {\n /**\n * `path` lets the earlier turns say the session read the source. A source\n * whose `blocks` is false gives warnings; one that leaves it out blocks.\n */\n source: Pick<RuleSource, \"displayPath\"> & Partial<Pick<RuleSource, \"path\" | \"blocks\">>;\n rule: Rule;\n}\n\nexport interface TurnJudgeInput {\n trace: Trace;\n turn: TurnSlice;\n /** Every in-scope rule, sources ordered farthest to nearest. */\n rules: TurnRule[];\n provider: InferenceProvider;\n /** Scored runs. A decision-only provider makes one call and reports 1. */\n runs: number;\n temperature: number;\n zones: ZoneThresholds;\n render: { maxBlockChars: number; maxTotalChars: number; redact: string[] };\n /** The Stop payload's `last_assistant_message`, appended when the transcript lags. */\n lastAssistantMessage?: string;\n /**\n * The session's earlier verdicts, and which earlier turns had no rule in\n * scope. Only a scored rule's item carries its own history.\n */\n ledger?: Ledger;\n /** Where paths in earlier turns are made relative; the trace's cwd by default. */\n project?: { cwd: string; root: string };\n cache?: TurnCache;\n}\n\nexport interface TurnFinding {\n source: string;\n rule: string;\n text: string;\n outcome: \"fail\" | \"needs-review\";\n /** `error` when the rule's source blocks, `warning` when it is only reported. */\n severity: Severity;\n observed: string;\n confidence: number;\n /** The judge's reasoning. A decision-only provider gives none. */\n reasoning?: string;\n}\n\n/** Every rule sent to the judge, with where its verdict landed. */\nexport interface TurnVerdict {\n source: string;\n rule: string;\n text: string;\n outcome: Outcome;\n reasoning?: string;\n}\n\nexport interface TurnJudgement {\n mode: \"decision\" | \"generative\";\n runs: number;\n /** Only `fail` and `needs-review`; a rule left out passed or did not apply. */\n findings: TurnFinding[];\n /** One per rule sent to the judge, whatever its outcome. */\n verdicts: TurnVerdict[];\n /** Rules sent to the judge. */\n judged: number;\n /** Rules whose `when` failed over the turn, plus those scored not applicable. */\n notApplicable: number;\n /** Every rule's verdict came from the cache. */\n cached: boolean;\n warnings: string[];\n}\n\ntype Scores = Record<TurnScore, number> & { reasoning?: string };\n\n/** One rule's answers: a score set per run that answered. */\ninterface Verdict {\n runs: Scores[];\n error?: string;\n}\n\nexport type Outcome = \"fail\" | \"not-applicable\" | \"followed\" | \"needs-review\";\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\nfunction isScores(v: unknown): v is Scores {\n return isRecord(v) && TURN_SCORES.every((s) => typeof v[s] === \"number\");\n}\n\n/**\n * Raw scores per rule and turn, before the block bar is applied, so a change\n * of `zones` reuses them. A rule with an errored run is never written.\n */\nexport class TurnCache {\n private readonly store: JsonCache<unknown>;\n\n constructor(dir: string = DEFAULT_TURN_CACHE_DIR, enabled = true) {\n this.store = new JsonCache<unknown>(dir, enabled, \"manni-tracevals\");\n }\n\n /** An entry of any other shape, from an older version, is a miss. */\n get(key: string): Scores[] | undefined {\n const v = this.store.get(key);\n if (!isRecord(v) || !Array.isArray(v.runs) || v.runs.length === 0) return undefined;\n const runs: unknown[] = v.runs;\n return runs.every(isScores) ? runs : undefined;\n }\n\n set(key: string, runs: Scores[]): void {\n this.store.set(key, { runs });\n }\n}\n\nexport interface ModelId {\n provider: string;\n model: string;\n}\n\n/**\n * What a provider's `stateLimit()` last said, per provider and model, with\n * `null` for one that has no limit. A local model loads to report it, and the\n * limit sets how much of the turn is rendered, which the verdict key hashes. So\n * \"is every verdict cached?\" could not be answered without loading the model\n * until this remembered the answer. A stale limit costs a miss, never a wrong\n * verdict, because a hit is keyed by the text it was scored on.\n */\nexport class StateLimits {\n private readonly store: JsonCache<unknown>;\n\n constructor(dir: string, enabled = true) {\n this.store = new JsonCache<unknown>(dir, enabled, \"manni-tracevals\");\n }\n\n get(id: ModelId): number | null | undefined {\n const v = this.store.get(buildCacheKey([id.provider, id.model]));\n return isRecord(v) && (v.limit === null || typeof v.limit === \"number\") ? v.limit : undefined;\n }\n\n set(id: ModelId, limit: number | null): void {\n this.store.set(buildCacheKey([id.provider, id.model]), { limit });\n }\n}\n\n/** Gate 6: a rule whose `when` fails over the turn is skipped, never passed. */\nexport function applicableRules(\n rules: TurnRule[],\n window: TraceWindow,\n): { applicable: TurnRule[]; notApplicable: number } {\n const applicable = rules.filter(\n (r) => evaluateWhen({ when: r.rule.when }, window).armed,\n );\n return { applicable, notApplicable: rules.length - applicable.length };\n}\n\ninterface Planned {\n /** Decision question id: source index among every input source, then rule id. */\n qid: string;\n source: string;\n id: string;\n text: string;\n severity: Severity;\n /** The ledger's block for this rule, \"\" for none and on the decision path. */\n history: string;\n /** The scored path's item for this rule. */\n item: string;\n}\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\n/** Decision-only providers decide; every provider that generates is scored. */\nfunction decisionOnly(provider: InferenceProvider): DecisionProvider | undefined {\n return DECISION_ONLY_PROVIDERS.has(provider.provider()) && canDecide(provider)\n ? provider\n : undefined;\n}\n\n/** The input without the provider, which a gate can use before one is built. */\nexport type TurnPlanInput = Omit<TurnJudgeInput, \"provider\">;\n\ninterface Plan {\n planned: Planned[];\n turnText: string;\n /** The transcript's account of earlier turns, \"\" for none. */\n earlier: string;\n warnings: string[];\n hits: Map<Planned, Verdict>;\n todo: Planned[];\n keyOf: (p: Planned) => string;\n}\n\n/**\n * Everything short of the model call: each rule's item, the turn rendered to\n * `limit` (undefined for no limit), and the verdict cache read. `decisionOnly`\n * and `limit` are all that come from the provider, so a caller that knows both\n * can plan without one.\n */\nfunction planTurn(\n input: TurnPlanInput,\n id: ModelId,\n decisionOnly: boolean,\n limit: number | undefined,\n): Plan {\n const runs = decisionOnly ? 1 : input.runs;\n const { applicable } = applicableRules(input.rules, input.turn.window);\n const warnings: string[] = [];\n const hits = new Map<Planned, Verdict>();\n\n // Indexed over every input source, so a question id does not move when a\n // farther source's rules happen not to apply.\n const sourceIndex = new Map<string, number>();\n for (const r of input.rules) {\n const path = r.source.displayPath;\n if (!sourceIndex.has(path)) sourceIndex.set(path, sourceIndex.size);\n }\n const planned: Planned[] = applicable.map(({ source, rule }) => {\n const history =\n !decisionOnly && input.ledger !== undefined\n ? historyBlock(input.ledger, ruleKey(source.displayPath, rule.id), rule.text, input.turn.from)\n : \"\";\n return {\n qid: `${String(sourceIndex.get(source.displayPath))}:${rule.id}`,\n source: source.displayPath,\n id: rule.id,\n text: rule.text,\n severity: source.blocks === false ? \"warning\" : \"error\",\n history,\n item: buildRuleItem(source.displayPath, rule, history),\n };\n });\n if (planned.length === 0) {\n return { planned, turnText: \"\", earlier: \"\", warnings, hits, todo: [], keyOf: () => \"\" };\n }\n\n // Render the turn, to the state limit when there is one. Every rule counts\n // toward the longest, cached or not, so the render and its key stay put.\n const tail = lastMessageLine(input);\n let budget = input.render.maxTotalChars;\n let byLimit = false;\n if (limit !== undefined) {\n const longest = Math.max(\n ...planned.map((p) =>\n decisionOnly ? JSON.stringify(questionFor(p.source, p)).length : p.item.length,\n ),\n );\n const fixed = decisionOnly\n ? buildDecisionState(\"\").length\n : TURN_JUDGE_SYSTEM_PROMPT.length + buildTurnShared(\"\").length;\n const fit = limit * CHARS_PER_TOKEN - longest - fixed;\n if (fit < budget) {\n budget = fit;\n byLimit = true;\n }\n }\n // Earlier turns share the budget with the turn, and take at most a quarter\n // of it, so the turn itself is never crowded out.\n const sources = [\n ...new Map(\n input.rules.flatMap(({ source: { path, displayPath } }) =>\n // A source with no file (the typed prompts, an inline plan, the system\n // prompt) is never read.\n path !== undefined && path !== \"\" ? [[displayPath, { path, displayPath }] as const] : [],\n ),\n ).values(),\n ];\n const earlier = timelineBlock(input.trace, input.turn.from, {\n cwd: input.project?.cwd ?? input.trace.cwd,\n root: input.project?.root ?? input.trace.cwd,\n redact: input.render.redact,\n sources,\n ...(input.ledger !== undefined ? { ledger: input.ledger } : {}),\n maxChars: Math.floor(budget / 4),\n });\n budget -= buildTurnShared(\"\", earlier).length - buildTurnShared(\"\").length;\n const cut = { happened: false };\n const turnText =\n renderTrace(input.trace, {\n maxBlockChars: input.render.maxBlockChars,\n maxTotalChars: budget - tail.length,\n redact: input.render.redact,\n turnFrom: input.turn.from,\n onTruncated: () => {\n cut.happened = true;\n },\n }) + tail;\n if (cut.happened) {\n warnings.push(\n byLimit\n ? `the session was cut to fit the state limit of ${String(limit)} tokens of ${id.provider}/${id.model}; earlier turns went first, then the last turn's middle`\n : `the session was cut to the render cap of ${String(input.render.maxTotalChars)} characters; earlier turns went first, then the last turn's middle`,\n );\n }\n\n // Gate 9: the same turn, rule and model reuse the verdict.\n const base = [\n id.provider,\n id.model,\n decisionOnly ? \"decision\" : \"generative\",\n `r${String(runs)}`,\n `t${String(input.temperature)}`,\n `turn-v${String(TURN_JUDGE_PROMPT_VERSION)}`,\n sha256(turnText),\n sha256(earlier),\n ];\n const keyOf = (p: Planned): string =>\n buildCacheKey([...base, sha256(JSON.stringify([p.source, p.id, p.text, p.history]))]);\n const todo: Planned[] = [];\n for (const p of planned) {\n const hit = input.cache?.get(keyOf(p));\n if (hit !== undefined) hits.set(p, { runs: hit });\n else todo.push(p);\n }\n return { planned, turnText, earlier, warnings, hits, todo, keyOf };\n}\n\n/**\n * Whether every applicable rule already has its verdict, answered without a\n * provider and so without loading a local model. The render depends on the\n * provider's state limit, which `StateLimits` remembers from the last\n * judgement, so a model never judged with is unknown and the answer is no.\n * A decision-only provider is never asked here: it is not a local model.\n */\nexport function allVerdictsCached(\n input: TurnPlanInput & { limits: StateLimits },\n id: ModelId,\n): boolean {\n const limit = input.limits.get(id);\n if (limit === undefined || DECISION_ONLY_PROVIDERS.has(id.provider)) return false;\n const plan = planTurn(input, id, false, limit ?? undefined);\n return plan.planned.length > 0 && plan.todo.length === 0;\n}\n\nexport async function judgeTurn(\n input: TurnJudgeInput & { limits?: StateLimits },\n): Promise<TurnJudgement> {\n const { provider, zones } = input;\n const decider = decisionOnly(provider);\n const mode = decider !== undefined ? \"decision\" : \"generative\";\n const runs = decider !== undefined ? 1 : input.runs;\n const id: ModelId = { provider: provider.provider(), model: provider.modelName() };\n const { applicable, notApplicable } = applicableRules(input.rules, input.turn.window);\n const result: TurnJudgement = {\n mode,\n runs,\n findings: [],\n verdicts: [],\n judged: applicable.length,\n notApplicable,\n cached: false,\n warnings: [],\n };\n if (applicable.length === 0) return result;\n\n // The provider's limit, remembered. A remembered one lets a fully cached\n // turn finish without asking the provider at all; any miss asks for the real\n // one, which refreshes the memory, and plans again if it moved.\n const fresh = async (): Promise<number | null> => {\n const real = canDecide(provider) ? await provider.stateLimit() : null;\n input.limits?.set(id, real);\n return real;\n };\n const remembered = input.limits?.get(id);\n let limit = remembered ?? (await fresh());\n let plan = planTurn(input, id, decider !== undefined, limit ?? undefined);\n if (remembered !== undefined && plan.todo.length > 0) {\n const real = await fresh();\n if (real !== limit) {\n limit = real;\n plan = planTurn(input, id, decider !== undefined, limit ?? undefined);\n }\n }\n const { planned, hits: verdicts, todo, keyOf, turnText, earlier } = plan;\n const warnings = plan.warnings;\n result.warnings = warnings;\n result.cached = todo.length === 0;\n if (todo.length > 0) {\n const scored =\n decider !== undefined\n ? await decide(decider, todo, buildDecisionState(turnText, earlier))\n : await score(provider, todo, buildTurnShared(turnText, earlier), runs, input.temperature);\n if (scored.every((v) => v.runs.length === 0)) {\n throw new Error(scored.find((v) => v.error !== undefined)?.error ?? \"every judge call errored\");\n }\n const errored = scored.filter((v) => v.error !== undefined);\n if (errored.length > 0) {\n warnings.push(\n `the judge errored on ${String(errored.length)} of ${String(todo.length)} rules, so they need review: ${errored[0]?.error ?? \"\"}`,\n );\n }\n todo.forEach((p, i) => {\n const v = scored[i] ?? { runs: [], error: \"the judge returned nothing\" };\n verdicts.set(p, v);\n if (v.error === undefined) input.cache?.set(keyOf(p), v.runs);\n });\n }\n\n for (const p of planned) {\n const v = verdicts.get(p) ?? { runs: [], error: \"the judge returned nothing\" };\n const outcome = outcomeOf(v, runs, zones);\n const reasoning = v.runs.find((r) => typeof r.reasoning === \"string\")?.reasoning;\n result.verdicts.push({\n source: p.source,\n rule: p.id,\n text: p.text,\n outcome,\n ...(reasoning !== undefined ? { reasoning } : {}),\n });\n if (outcome === \"not-applicable\") result.notApplicable += 1;\n else if (outcome !== \"followed\") result.findings.push(findingOf(p, outcome, v, runs));\n }\n return result;\n}\n\n/** One `decide` call; each option's probability becomes its score. */\nasync function decide(\n decider: DecisionProvider,\n todo: Planned[],\n state: string,\n): Promise<Verdict[]> {\n const response = await decider.decide({\n state,\n questions: Object.fromEntries(todo.map((p) => [p.qid, questionFor(p.source, p)])),\n });\n const answers: Record<string, DecideAnswer | undefined> = response.answers;\n return todo.map((p) => {\n const answer = answers[p.qid];\n if (answer === undefined) return { runs: [], error: \"the judge returned no answer for this rule\" };\n const pct = (s: TurnScore): number => Math.round((answer.probabilities[s] ?? 0) * 100);\n return {\n runs: [\n {\n followed: pct(\"followed\"),\n \"not-followed\": pct(\"not-followed\"),\n \"not-applicable\": pct(\"not-applicable\"),\n },\n ],\n };\n });\n}\n\n/** `runs` shared-prefix calls, one item per rule. */\nasync function score(\n provider: InferenceProvider,\n todo: Planned[],\n shared: string,\n runs: number,\n temperature: number,\n): Promise<Verdict[]> {\n const verdicts: Verdict[] = todo.map(() => ({ runs: [] }));\n const errors = todo.map(() => 0);\n for (let run = 0; run < runs; run++) {\n const response = await completeJSONShared(provider, {\n system: TURN_JUDGE_SYSTEM_PROMPT,\n shared,\n items: todo.map((p) => p.item),\n schema: TURN_SCHEMA,\n temperature,\n });\n verdicts.forEach((v, i) => {\n const answer = response.answers[i];\n if (answer !== undefined && \"json\" in answer && isScores(answer.json)) {\n v.runs.push(answer.json);\n return;\n }\n errors[i] = (errors[i] ?? 0) + 1;\n v.error ??= answer !== undefined && \"error\" in answer ? answer.error : \"the judge returned nothing\";\n });\n }\n return verdicts.map((v, i) =>\n v.error === undefined || v.runs.length === 0\n ? v\n : { ...v, error: `${String(errors[i] ?? 0)} of ${String(runs)} runs errored: ${v.error}` },\n );\n}\n\nfunction classify(s: Scores, zones: ZoneThresholds): Outcome {\n // An integer over 100 lands on the same double as the zone's literal, where\n // the zone times 100 can miss it (0.7 * 100 is 70.00000000000001).\n if (s[\"not-followed\"] / 100 >= zones.autoFail) return \"fail\";\n if (s[\"not-applicable\"] / 100 >= zones.autoPass) return \"not-applicable\";\n if (s.followed / 100 >= zones.autoPass) return \"followed\";\n return \"needs-review\";\n}\n\n/** Every run has to agree: a split ensemble, or any error, is review. */\nfunction outcomeOf(v: Verdict, runs: number, zones: ZoneThresholds): Outcome {\n if (v.error !== undefined || v.runs.length < runs) return \"needs-review\";\n const each = v.runs.map((s) => classify(s, zones));\n if (each.every((c) => c === \"fail\")) return \"fail\";\n if (each.every((c) => c === \"not-applicable\")) return \"not-applicable\";\n if (each.every((c) => c === \"not-applicable\" || c === \"followed\")) return \"followed\";\n return \"needs-review\";\n}\n\nfunction findingOf(\n p: Planned,\n outcome: TurnFinding[\"outcome\"],\n v: Verdict,\n runs: number,\n): TurnFinding {\n const base = { source: p.source, rule: p.id, text: p.text, outcome, severity: p.severity };\n if (v.runs.length === 0) {\n return {\n ...base,\n observed: `the judge returned no answer for this rule: ${v.error ?? \"\"}`,\n confidence: 0,\n };\n }\n const mean = (s: TurnScore): number =>\n Math.round(v.runs.reduce((sum, r) => sum + r[s], 0) / v.runs.length);\n const scores = `not-followed ${String(mean(\"not-followed\"))}, followed ${String(mean(\"followed\"))}, not-applicable ${String(mean(\"not-applicable\"))}`;\n const errored = v.error !== undefined && runs > 1 ? `; ${v.error}` : \"\";\n const reasoning = v.runs.find((r) => typeof r.reasoning === \"string\")?.reasoning;\n return {\n ...base,\n observed: `${scores}${errored}${reasoning !== undefined ? `. ${reasoning}` : \"\"}`,\n confidence: round(mean(\"not-followed\") / 100),\n ...(reasoning !== undefined ? { reasoning } : {}),\n };\n}\n\n/**\n * The transcript is written asynchronously, so its last message can lag the\n * Stop. The payload's copy is appended when the window does not end with it,\n * scrubbed and clipped as every rendered block is.\n */\nfunction lastMessageLine(input: TurnPlanInput): string {\n const message = input.lastAssistantMessage?.trim();\n if (message === undefined || message === \"\") return \"\";\n if (input.turn.window.assistantTexts.at(-1)?.trim() === message) return \"\";\n const safe = makeRedactor(input.render.redact)(message);\n const max = input.render.maxBlockChars;\n const clipped =\n safe.length <= max\n ? safe\n : `${safe.slice(0, max)} [... truncated ${String(safe.length - max)} chars ...]`;\n return `\\n[assistant] ${clipped}`;\n}\n","/**\n * The turn judge's prompt surface (proposal 0079, \"The judge, decisions\n * first\", reworded by proposal 0080 to judge the last turn against the\n * session). Each rule is judged on its own: the shared part is what earlier\n * turns did and the rendered turn, and each rule is one item appended to it. A decision-only provider\n * gets the same text as its state and one question per rule.\n */\nimport type { DecideQuestion } from \"@hawkeyexl/inference\";\n\n/**\n * Part of the turn verdict cache key: bump whenever anything in this file that\n * reaches a provider changes. `test/tracevals/unit/rules-judge.test.ts` pins it\n * to a digest of the surface, so the pair has to move together.\n */\nexport const TURN_JUDGE_PROMPT_VERSION = 8;\n\nexport const TURN_JUDGE_SYSTEM_PROMPT = [\n \"You check the last turn of an AI coding agent's session against one rule.\",\n \"The last turn starts at the last prompt the user typed and runs to the end of the transcript.\",\n \"The transcript shows the user's prompts, the agent's tool calls with their inputs, and its replies.\",\n '\"Earlier in this session\" lists what the session did before the last turn.',\n \"\",\n \"A prompt the user typed overrides any rule. Doing what the user explicitly asked is never a violation.\",\n \"A rule from the system prompt is a default. An instruction file, or a prompt the user typed, overrides it.\",\n \"\",\n \"Judge only from what the transcript and the earlier turns show. Do not guess.\",\n \"A rule applies only once the session does the kind of work it covers.\",\n \"Score it broken only for what the last turn did, or for the last turn saying the work is done without it.\",\n].join(\"\\n\");\n\n/** The three scores, each independent of the others, 0 to 100. */\nexport const TURN_SCORES = [\"not-applicable\", \"followed\", \"not-followed\"] as const;\nexport type TurnScore = (typeof TURN_SCORES)[number];\n\nconst SCORE = { type: \"integer\", minimum: 0, maximum: 100 } as const;\n\n/**\n * `reasoning` is declared first and always required, so a model writing the\n * object in order says what it saw before it commits to a score. It is not\n * length-capped: a 240-character cap was measured, and a model cut off\n * mid-reasoning committed to wrong scores on the fixtures.\n */\nexport const TURN_SCHEMA = {\n type: \"object\",\n required: [\"reasoning\", ...TURN_SCORES],\n additionalProperties: false,\n properties: {\n reasoning: { type: \"string\" },\n \"not-applicable\": SCORE,\n followed: SCORE,\n \"not-followed\": SCORE,\n },\n};\n\n/** Decision-only providers: the three options, one per score. */\nexport const TURN_CRITERIA: Record<TurnScore, string> = {\n followed: \"The session does what the rule asks.\",\n \"not-followed\":\n \"The last turn did what the rule forbids, skipped what it requires, or said the work is done without it.\",\n \"not-applicable\": \"The rule does not apply yet, or the last turn did nothing it covers.\",\n};\n\n/** How a rule is named to a model. */\nexport function ruleKey(displayPath: string, id: string): string {\n return `${displayPath}#${id}`;\n}\n\n/**\n * The part every rule's call shares: what earlier turns of the transcript\n * did, when any did something, then the turn.\n */\nexport function buildTurnShared(turn: string, earlier = \"\"): string {\n return `${earlier !== \"\" ? `${earlier}\\n\\n` : \"\"}# The turn\\n\\n${turn}\\n\\n`;\n}\n\n/**\n * One rule's item, appended to the shared part as it is. `history` is the\n * ledger's block for the rule, or \"\" when earlier turns have nothing to say.\n */\nexport function buildRuleItem(\n displayPath: string,\n rule: { id: string; text: string },\n history = \"\",\n): string {\n return [\n \"# The rule\",\n \"\",\n `${ruleKey(displayPath, rule.id)}: ${rule.text}`,\n \"\",\n ...(history !== \"\" ? [history, \"\"] : []),\n \"First say in one or two sentences what the session shows about this rule. Then score each as a whole number from 0 to 100: \" +\n \"the rule does not apply yet, or the last turn did nothing it covers; the session follows it; the last turn broke it, or the last turn says the work is done without it.\",\n ].join(\"\\n\");\n}\n\n/** A decision-only provider's state: the system prompt, then the shared part. */\nexport function buildDecisionState(turn: string, earlier = \"\"): string {\n return `${TURN_JUDGE_SYSTEM_PROMPT}\\n\\n${buildTurnShared(turn, earlier)}`;\n}\n\nexport function questionFor(\n displayPath: string,\n rule: { id: string; text: string },\n): DecideQuestion {\n return {\n type: \"choice\",\n instructions: `Did this turn follow ${ruleKey(displayPath, rule.id)}? The rule: ${rule.text}`,\n criteria: { ...TURN_CRITERIA },\n };\n}\n","/**\n * \"# Earlier in this session\", read from the transcript (proposal 0080,\n * \"Earlier in this session, from the transcript\"). Every turn before the\n * judged one that did something gets a line, newest last, so a rule about a\n * procedure that spans turns is judged with the whole session behind it. The\n * ledger only says which of those turns had no rule in scope.\n */\nimport { makeRedactor } from \"../judge/redact.js\";\nimport { materialize } from \"../graders/util.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport { clipTo, projectPath, turnFacts, type Ledger } from \"./ledger.js\";\nimport type { RuleSource } from \"./sources.js\";\nimport { isTypedPrompt } from \"./turn.js\";\n\nconst HEAD = \"# Earlier in this session\\n\\n\";\nconst RESULT_CHARS = 120;\nconst TICK_CHARS = 60;\nconst SPAWNS = 10;\n/** A task line in Spec Kit, Kiro and OpenSpec task lists. */\nconst TASK = /^\\s*-\\s+\\[([ xX])\\]\\s+(.+?)\\s*$/;\n/** A task's leading id: `T014`, `FR-001`, `1.2`. */\nconst TASK_ID = /^(?:[A-Z]+(?:-[A-Z]+)*-?\\d+(?:\\.\\d+)*|\\d+(?:\\.\\d+)*)(?=[\\s:.)\\]]|$)/;\n\nexport interface TimelineOptions {\n cwd: string;\n root: string;\n redact: readonly string[];\n /** The rule sources a `read` fact names; others' reads are left out. */\n sources: Pick<RuleSource, \"path\" | \"displayPath\">[];\n /** Marks a turn it recorded with no rules in scope. */\n ledger?: Ledger;\n maxChars?: number;\n}\n\ninterface ToolResult {\n text: string;\n isError: boolean;\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** Every tool_result block in the trace, by the id of the call it answers. */\nfunction toolResults(trace: Trace): Map<string, ToolResult> {\n const out = new Map<string, ToolResult>();\n for (const e of trace.events) {\n if (e.kind !== \"tool_result\") continue;\n const message = e.raw.message;\n const content: unknown = isRecord(message) ? message.content : undefined;\n if (!Array.isArray(content)) continue;\n for (const block of content as unknown[]) {\n if (!isRecord(block) || block.type !== \"tool_result\" || typeof block.tool_use_id !== \"string\") continue;\n const body: unknown = block.content;\n const text =\n typeof body === \"string\"\n ? body\n : Array.isArray(body)\n ? (body as unknown[])\n .flatMap((b) => (isRecord(b) && typeof b.text === \"string\" ? [b.text] : []))\n .join(\"\\n\")\n : \"\";\n out.set(block.tool_use_id, { text, isError: block.is_error === true });\n }\n }\n return out;\n}\n\n/** The `tool_use` id of the call at `index`, read from its event. */\nfunction callId(trace: Trace, index: number): string | undefined {\n // Find by ordinal: the event array need not hold one event per ordinal.\n const id = trace.events.find((e) => e.index === index)?.raw.id;\n return typeof id === \"string\" ? id : undefined;\n}\n\n/** Texts of the task lines in `text` whose box is ticked (`x`) or not (` `). */\nfunction tasks(text: string, ticked: boolean): string[] {\n return text.split(/\\r?\\n/).flatMap((line) => {\n const m = TASK.exec(line);\n const box = m?.[1];\n const body = m?.[2];\n if (box === undefined || body === undefined) return [];\n return (box !== \" \") === ticked ? [body] : [];\n });\n}\n\n/** The tasks an edit ticks: unticked in its old string, ticked with the same text in its new. */\nfunction ticks(oldText: unknown, newText: unknown): string[] {\n if (typeof oldText !== \"string\" || typeof newText !== \"string\") return [];\n const now = new Set(tasks(newText, true));\n return tasks(oldText, false).filter((t) => now.has(t));\n}\n\nconst list = (verb: string, items: string[]): string[] =>\n items.length > 0 ? [`${verb} ${items.join(\", \")}`] : [];\n\n/**\n * The block for the turns before `before`, or \"\" when none did anything.\n * Over `maxChars`, the oldest lines go first, and a marker line says which.\n */\nexport function timelineBlock(trace: Trace, before: number, opts: TimelineOptions): string {\n const scrub = makeRedactor(opts.redact);\n const results = toolResults(trace);\n const starts = trace.events\n .filter((e) => e.index < before && e.sidechain !== true && isTypedPrompt(e))\n .map((e) => e.index);\n\n const lines = starts.flatMap((from, i) => {\n const end = starts[i + 1] ?? before;\n const window = materialize(trace, \"turn\", \"earlier turn\", [{ start: from, end }], undefined, new Set([undefined]));\n // turnFacts reads only the window and bounds; 0 just satisfies TurnSlice.\n const facts = turnFacts(trace, { window, from, to: end - 1, sessionTurnCount: 0 }, opts.sources, opts);\n const spawns = trace.agentSpawns\n .filter((a) => a.index >= from && a.index < end)\n .slice(0, SPAWNS)\n .map((a) => {\n const result = results.get(a.toolUseId ?? callId(trace, a.index) ?? \"\");\n // Redact, then clip, so a cap never lands mid-secret.\n const first = scrub(result?.text ?? \"\").trim().split(/\\r?\\n/)[0]?.trim() ?? \"\";\n return first === \"\"\n ? `spawned ${a.subagentType}`\n : `spawned ${a.subagentType}, which returned ${clipTo(first, RESULT_CHARS)}`;\n });\n const calls = window.toolCalls;\n const asked = calls.some((c) => c.name === \"AskUserQuestion\") ? [\"asked the user\"] : [];\n const ticked = calls.flatMap((c) => {\n if (typeof c.input.file_path !== \"string\") return [];\n const edits: unknown[] =\n c.name === \"Edit\" ? [c.input] : c.name === \"MultiEdit\" && Array.isArray(c.input.edits) ? c.input.edits : [];\n const path = scrub(projectPath(c.input.file_path, opts.cwd, opts.root));\n return edits.flatMap((e) =>\n isRecord(e)\n ? ticks(e.old_string, e.new_string).map((t) => {\n const safe = scrub(t);\n return `ticked ${TASK_ID.exec(safe)?.[0] ?? clipTo(safe, TICK_CHARS)} in ${path}`;\n })\n : [],\n );\n });\n const approved = calls.some((c) => {\n if (c.name !== \"ExitPlanMode\") return false;\n const result = results.get(callId(trace, c.index) ?? \"\");\n return result !== undefined && !result.isError;\n })\n ? [\"had a plan approved\"]\n : [];\n const parts = [\n ...list(\"ran\", facts.commands),\n ...list(\"wrote\", facts.wrote),\n ...list(\"read\", facts.read),\n ...facts.skills.map((s) => `ran skill ${s}`),\n ...spawns,\n ...asked,\n ...[...new Set(ticked)],\n ...approved,\n ];\n if (parts.length === 0) return [];\n const out = opts.ledger?.turns.find((t) => t.turn === from)?.inScope === false;\n return [{ turn: from, line: `- turn ${String(from)}: ${parts.join(\"; \")}${out ? \" (no rules in scope)\" : \"\"}` }];\n });\n\n // Drop the oldest until the block fits, the marker's length included.\n const max = opts.maxChars ?? Number.POSITIVE_INFINITY;\n const marker = (n: number): string => {\n const a = String(lines[0]?.turn);\n const b = String(lines[n - 1]?.turn);\n return n === 1 ? `- (turn ${a}: 1 line left out)` : `- (turns ${a}–${b}: ${String(n)} lines left out)`;\n };\n let kept = lines.reduce((sum, l) => sum + l.line.length + 1, HEAD.length - 1);\n let dropped = 0;\n const size = (): number => kept + (dropped > 0 ? marker(dropped).length + 1 : 0);\n while (dropped < lines.length && size() > max) {\n kept -= (lines[dropped]?.line.length ?? 0) + 1;\n dropped += 1;\n }\n if (dropped === lines.length) return \"\";\n const shown = lines.slice(dropped).map((l) => l.line);\n return `${HEAD}${[...(dropped > 0 ? [marker(dropped)] : []), ...shown].join(\"\\n\")}`;\n}\n"],"mappings":"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","names":["isRecord","decisionOnly"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
runCheck
|
|
4
|
+
} from "./chunk-4VBSTXN6.js";
|
|
5
|
+
import "./chunk-J6IDQGJL.js";
|
|
6
|
+
import "./chunk-77AINBYM.js";
|
|
7
|
+
import "./chunk-IKEWBMCN.js";
|
|
8
|
+
import "./chunk-TU2WUBVZ.js";
|
|
9
|
+
import "./chunk-LKP7QDFN.js";
|
|
10
|
+
import "./chunk-6HWBRZIN.js";
|
|
11
|
+
import "./chunk-M42DZCOU.js";
|
|
12
|
+
import "./chunk-PCQ7ELJH.js";
|
|
13
|
+
import "./chunk-GV56WGL2.js";
|
|
14
|
+
import "./chunk-D4N2V43Z.js";
|
|
15
|
+
import "./chunk-VSEBFHAY.js";
|
|
16
|
+
import "./chunk-YEUYKR62.js";
|
|
17
|
+
import "./chunk-RNVYGWIC.js";
|
|
18
|
+
import "./chunk-MNH7QO4Z.js";
|
|
19
|
+
import "./chunk-QLWC7MKD.js";
|
|
20
|
+
import "./chunk-HX44GB4Z.js";
|
|
21
|
+
import "./chunk-QCHVR4ZM.js";
|
|
22
|
+
import "./chunk-2MJ62AYQ.js";
|
|
23
|
+
import "./chunk-OWBRDNRZ.js";
|
|
24
|
+
import "./chunk-G3T47CFV.js";
|
|
25
|
+
import "./chunk-2H7UOFLK.js";
|
|
26
|
+
export {
|
|
27
|
+
runCheck
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=check-WOQRKNZK.js.map
|
|
@@ -7,23 +7,26 @@ import {
|
|
|
7
7
|
readTarget,
|
|
8
8
|
runCheck,
|
|
9
9
|
sayNotices
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-PCS4VJBV.js";
|
|
11
|
+
import "./chunk-WDWXAYVH.js";
|
|
12
12
|
import "./chunk-77AINBYM.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-BKVHX6FU.js";
|
|
14
14
|
import "./chunk-IKEWBMCN.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-TU2WUBVZ.js";
|
|
16
|
+
import "./chunk-LKP7QDFN.js";
|
|
17
|
+
import "./chunk-6HWBRZIN.js";
|
|
18
|
+
import "./chunk-M42DZCOU.js";
|
|
19
|
+
import "./chunk-PCQ7ELJH.js";
|
|
20
|
+
import "./chunk-GV56WGL2.js";
|
|
21
|
+
import "./chunk-D4N2V43Z.js";
|
|
22
|
+
import "./chunk-VSEBFHAY.js";
|
|
20
23
|
import "./chunk-YEUYKR62.js";
|
|
21
24
|
import "./chunk-RNVYGWIC.js";
|
|
22
25
|
import "./chunk-MNH7QO4Z.js";
|
|
23
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-QLWC7MKD.js";
|
|
24
27
|
import "./chunk-HX44GB4Z.js";
|
|
25
28
|
import "./chunk-QCHVR4ZM.js";
|
|
26
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-2MJ62AYQ.js";
|
|
27
30
|
import "./chunk-OWBRDNRZ.js";
|
|
28
31
|
import "./chunk-G3T47CFV.js";
|
|
29
32
|
import "./chunk-2H7UOFLK.js";
|
|
@@ -36,4 +39,4 @@ export {
|
|
|
36
39
|
runCheck,
|
|
37
40
|
sayNotices
|
|
38
41
|
};
|
|
39
|
-
//# sourceMappingURL=check-
|
|
42
|
+
//# sourceMappingURL=check-YEOYBFST.js.map
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
routesFrom,
|
|
25
25
|
searchIndexFilename,
|
|
26
26
|
vectorIndexFilename
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-2IAZEB45.js";
|
|
28
28
|
import {
|
|
29
29
|
bundledShapesPath,
|
|
30
30
|
compactIri,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
loadGraph,
|
|
33
33
|
storeToQuads,
|
|
34
34
|
validateGraph
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-EFW7CAG4.js";
|
|
36
36
|
import {
|
|
37
37
|
COVERAGE_FIELDS,
|
|
38
38
|
DEFAULT_MODEL,
|
|
@@ -72,19 +72,19 @@ import {
|
|
|
72
72
|
loadRunConfig,
|
|
73
73
|
profileFor,
|
|
74
74
|
withPrefix
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-JROBZ7JA.js";
|
|
76
76
|
import {
|
|
77
77
|
mergeMetaProvenance
|
|
78
|
-
} from "./chunk-
|
|
78
|
+
} from "./chunk-M42DZCOU.js";
|
|
79
79
|
import {
|
|
80
80
|
isMissing,
|
|
81
81
|
spliceManifestValue
|
|
82
|
-
} from "./chunk-
|
|
82
|
+
} from "./chunk-GV56WGL2.js";
|
|
83
83
|
import {
|
|
84
84
|
DocmetaError,
|
|
85
85
|
urlManifestMessage,
|
|
86
86
|
writeFileAtomic
|
|
87
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-VSEBFHAY.js";
|
|
88
88
|
import {
|
|
89
89
|
noticeOnce,
|
|
90
90
|
warn
|
|
@@ -3958,4 +3958,4 @@ export {
|
|
|
3958
3958
|
runTraverse,
|
|
3959
3959
|
renderTraverse
|
|
3960
3960
|
};
|
|
3961
|
-
//# sourceMappingURL=chunk-
|
|
3961
|
+
//# sourceMappingURL=chunk-2DRHT73U.js.map
|
|
@@ -34,33 +34,33 @@ import {
|
|
|
34
34
|
mintSchemeIri,
|
|
35
35
|
mintSectionIri,
|
|
36
36
|
normalizeDocPath
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-JROBZ7JA.js";
|
|
38
38
|
import {
|
|
39
39
|
parserByName,
|
|
40
40
|
parserForExtension,
|
|
41
41
|
supportedExtensions,
|
|
42
42
|
unsupportedFormatMessage
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-2IR4T5PO.js";
|
|
44
44
|
import {
|
|
45
45
|
metaPageView
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-LKP7QDFN.js";
|
|
47
47
|
import {
|
|
48
48
|
STDIN_REQUIRES_AS,
|
|
49
49
|
writeTextAtomic
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-GV56WGL2.js";
|
|
51
51
|
import {
|
|
52
52
|
extractFrontmatter,
|
|
53
53
|
extractorForExtension
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-VSEBFHAY.js";
|
|
55
55
|
import {
|
|
56
56
|
selectCollections
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-QLWC7MKD.js";
|
|
58
58
|
import {
|
|
59
59
|
warn
|
|
60
60
|
} from "./chunk-HX44GB4Z.js";
|
|
61
61
|
import {
|
|
62
62
|
package_default
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-2MJ62AYQ.js";
|
|
64
64
|
import {
|
|
65
65
|
errorMessage
|
|
66
66
|
} from "./chunk-G3T47CFV.js";
|
|
@@ -1810,4 +1810,4 @@ export {
|
|
|
1810
1810
|
runBuild,
|
|
1811
1811
|
buildGraph
|
|
1812
1812
|
};
|
|
1813
|
-
//# sourceMappingURL=chunk-
|
|
1813
|
+
//# sourceMappingURL=chunk-2IAZEB45.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
extractFrontmatter,
|
|
7
7
|
extractorForExtension,
|
|
8
8
|
locateFrontmatter
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VSEBFHAY.js";
|
|
10
10
|
import {
|
|
11
11
|
errorMessage
|
|
12
12
|
} from "./chunk-G3T47CFV.js";
|
|
@@ -3247,4 +3247,4 @@ export {
|
|
|
3247
3247
|
unsupportedFormatMessage,
|
|
3248
3248
|
listFormats
|
|
3249
3249
|
};
|
|
3250
|
-
//# sourceMappingURL=chunk-
|
|
3250
|
+
//# sourceMappingURL=chunk-2IR4T5PO.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// package.json
|
|
4
4
|
var package_default = {
|
|
5
5
|
name: "@hawkeyexl/manni",
|
|
6
|
-
version: "4.
|
|
6
|
+
version: "4.11.0",
|
|
7
7
|
description: "One command line for documentation that is meant to be checked. `manni meta` validates the presence and format of document metadata (Markdown frontmatter and more) against JSON Schema, built for CI. Formerly docmeta.",
|
|
8
8
|
type: "module",
|
|
9
9
|
bin: {
|
|
@@ -175,4 +175,4 @@ var package_default = {
|
|
|
175
175
|
export {
|
|
176
176
|
package_default
|
|
177
177
|
};
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-2MJ62AYQ.js.map
|