@iowarp/clio-coder 0.3.3 → 0.3.6
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/CHANGELOG.md +74 -0
- package/CONTRIBUTING.md +7 -7
- package/README.md +3 -3
- package/dist/{acp-P2AQILE2.js → acp-2BEHC4DL.js} +9 -8
- package/dist/{agents-72W3BI7I.js → agents-LNNFTM53.js} +29 -24
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5TWEIYDN.js → auth-KXXFI2VS.js} +14 -10
- package/dist/{chunk-GGXXDWE4.js → chunk-22NAGB7X.js} +2 -2
- package/dist/{chunk-YCWGATWI.js → chunk-24I7BN55.js} +2 -2
- package/dist/{chunk-EKMEHE4H.js → chunk-33YXPOE3.js} +2 -3
- package/dist/chunk-3BPUFZDL.js +37 -0
- package/dist/chunk-43AOLP7E.js +375 -0
- package/dist/{chunk-ZDOOVTXZ.js → chunk-4OC57DA6.js} +27 -4
- package/dist/{chunk-6SGHMWE3.js → chunk-5JGRAMKL.js} +5 -5
- package/dist/{chunk-V6RTAOC2.js → chunk-6US73PDB.js} +572 -51
- package/dist/{chunk-5UFT4SUX.js → chunk-6XXKFVSN.js} +3 -3
- package/dist/{chunk-A3CYT5EX.js → chunk-AD2SYQYC.js} +55 -2
- package/dist/chunk-AOCYTWAV.js +449 -0
- package/dist/chunk-CFGTUFWB.js +67 -0
- package/dist/chunk-CJUB2JJ2.js +1478 -0
- package/dist/{chunk-FNTMWMX5.js → chunk-CKXWIANG.js} +14 -12
- package/dist/{chunk-PIWWS5BL.js → chunk-CYQKWTG3.js} +63 -78
- package/dist/{chunk-LZSJBIVT.js → chunk-DJVECN66.js} +271 -762
- package/dist/{chunk-CBCAPZAA.js → chunk-E25LMLRW.js} +2 -2
- package/dist/{chunk-ZWMF7253.js → chunk-E2ER4LJF.js} +304 -9
- package/dist/{chunk-STBPMHSX.js → chunk-EKY57CSP.js} +51 -84
- package/dist/{chunk-DUYJ5IO6.js → chunk-EYPA3EGJ.js} +12 -4
- package/dist/{chunk-M6SHUN7Q.js → chunk-FO5ZOVUY.js} +2 -2
- package/dist/chunk-FYYLNIL5.js +313 -0
- package/dist/{chunk-OQ33BKR3.js → chunk-G7MUEIGA.js} +3 -60
- package/dist/chunk-GEYXPTRF.js +613 -0
- package/dist/chunk-GOXNB3AO.js +261 -0
- package/dist/{chunk-G4BMMOKF.js → chunk-HVDIIIQW.js} +2 -2
- package/dist/chunk-HWUFFB6L.js +83 -0
- package/dist/{chunk-4XUGQOHA.js → chunk-K7T3E2SR.js} +15 -8
- package/dist/chunk-K7VKOLQQ.js +15 -0
- package/dist/{chunk-UFIIWP2H.js → chunk-KHSFENX2.js} +8 -8
- package/dist/{chunk-BMEMKKIT.js → chunk-KOHPCX4K.js} +2 -2
- package/dist/chunk-LCGCVYZ4.js +57 -0
- package/dist/chunk-LL4KHSZI.js +22 -0
- package/dist/{chunk-PAJK6MAQ.js → chunk-LYF7OHWH.js} +42 -15
- package/dist/{chunk-POHLU5DW.js → chunk-M6L6IDJG.js} +3 -3
- package/dist/{chunk-5UUP6MWO.js → chunk-MV3K5QF2.js} +5 -436
- package/dist/{chunk-X4RCMKVQ.js → chunk-NDINPTJ4.js} +2 -2
- package/dist/{chunk-TZK7PACC.js → chunk-NILBFAPG.js} +14 -8
- package/dist/chunk-ODFEOB4F.js +1082 -0
- package/dist/{chunk-AGYYIBLL.js → chunk-OH3TOQTB.js} +6 -2
- package/dist/chunk-OZNBF4L3.js +23 -0
- package/dist/{chunk-DSELYM6W.js → chunk-PBTHKCPN.js} +30 -10
- package/dist/{verify-375KUB3Y.js → chunk-PCZJO5TI.js} +127 -42
- package/dist/{chunk-ED4KHGC3.js → chunk-PPAMZ32Z.js} +9 -2
- package/dist/{chunk-SRDMMSEP.js → chunk-QM3F2GKX.js} +1063 -1645
- package/dist/{chunk-X6IAEBZR.js → chunk-QNQHSOLF.js} +7 -7
- package/dist/{chunk-OC7FIQPC.js → chunk-R46L2BIR.js} +10 -7
- package/dist/{chunk-2TLUCQVG.js → chunk-RD5U66HV.js} +3 -3
- package/dist/{chunk-6N5PTWMY.js → chunk-RY3LY4J5.js} +50 -13
- package/dist/{chunk-OKGUZO2U.js → chunk-SPULKLCF.js} +4 -3
- package/dist/{chunk-OOJYHWRB.js → chunk-TSHXZTOQ.js} +6 -5
- package/dist/chunk-TZSKNMZG.js +434 -0
- package/dist/{chunk-7MNJORFF.js → chunk-UL3WSD3F.js} +6 -1
- package/dist/{chunk-VJWL6YS5.js → chunk-UUVG37B4.js} +2 -2
- package/dist/{chunk-COU2UHX6.js → chunk-VEZEGCGW.js} +170 -2
- package/dist/chunk-W6GROXXM.js +69 -0
- package/dist/{chunk-OAO4GE4M.js → chunk-WHGPSPT5.js} +2 -2
- package/dist/chunk-WHJYKASB.js +677 -0
- package/dist/{chunk-ORBHGJC5.js → chunk-WR67VIZY.js} +3 -3
- package/dist/{chunk-YHZX5GEU.js → chunk-XAKHZX5N.js} +2 -2
- package/dist/{chunk-TZTZS7QK.js → chunk-XE2VEJHX.js} +5 -3
- package/dist/{chunk-LM5TQCJZ.js → chunk-XF5N4U5A.js} +8 -7
- package/dist/{chunk-LWLEKMDQ.js → chunk-XXQNGV4M.js} +1073 -552
- package/dist/{chunk-KZWTDYJF.js → chunk-XYDYPRZI.js} +7 -7
- package/dist/chunk-ZGVHUX3M.js +66 -0
- package/dist/{chunk-LW6DSM3M.js → chunk-ZRGEBJ4T.js} +1192 -1119
- package/dist/{chunk-2DJ2KNFG.js → chunk-ZXF4XRKW.js} +202 -40
- package/dist/chunk-ZZMN5OM4.js +122 -0
- package/dist/cli/index.js +34 -30
- package/dist/{clio-JOU4FXVA.js → clio-M2KGYUFZ.js} +7 -6
- package/dist/{code-nav-7AX6FYE6.js → code-nav-GQNL7XA6.js} +8 -6
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/{components-KELWS457.js → components-5TTYYX6G.js} +3 -3
- package/dist/{config-XCDVKR23.js → config-XUUYQIWO.js} +47 -35
- package/dist/{configure-4GAP54ZW.js → configure-IHJ7YOMV.js} +18 -15
- package/dist/{context-77FM5DV5.js → context-74JLXAWD.js} +18 -10
- package/dist/{context-4UOGGLQ5.js → context-75MIWW3U.js} +41 -29
- package/dist/{context-5VKGUVJJ.js → context-ZQ7SIFJV.js} +85 -9
- package/dist/{context-clear-XXJRLCJJ.js → context-clear-GYKWNUML.js} +41 -29
- package/dist/{context-index-BZ4UYMTC.js → context-index-SSR5ECNE.js} +3 -3
- package/dist/context-working-set-UX5KEP4J.js +1553 -0
- package/dist/{dispatch-runner-QPRDDBDX.js → dispatch-runner-GIJBHNFL.js} +47 -32
- package/dist/{docs-2C2LTVT2.js → docs-6FZSCG5B.js} +3 -3
- package/dist/{doctor-HR46URBJ.js → doctor-SVJ5BZCW.js} +12 -12
- package/dist/{eval-XSSNATB4.js → eval-CG6LLBLD.js} +54 -238
- package/dist/{evidence-6HG2PY2B.js → evidence-ZYFIEN42.js} +57 -28
- package/dist/{evolve-K7YU3NCY.js → evolve-QGEXEMDW.js} +36 -25
- package/dist/{extensions-QVDOHDGJ.js → extensions-ADGNCJJD.js} +3 -3
- package/dist/{fleet-VY3HHKN6.js → fleet-S5R4ZOQY.js} +73 -44
- package/dist/{fleet-preflight-DDN536IT.js → fleet-preflight-BHSNPBMH.js} +3 -3
- package/dist/{init-JYGXI3FK.js → init-5DRU55YR.js} +49 -37
- package/dist/memory-7YKKR6UC.js +467 -0
- package/dist/{models-I5QWSEOM.js → models-ZPOLRU2C.js} +24 -21
- package/dist/{monitor-GE4ID3IA.js → monitor-US5F5YGZ.js} +73 -46
- package/dist/{orchestrator-EM5MC3HM.js → orchestrator-E2AL4T5N.js} +1624 -1007
- package/dist/{paths-UXLN5YYZ.js → paths-E7KYAQWE.js} +3 -3
- package/dist/{reset-L2FQEE3E.js → reset-KZ652EK6.js} +6 -5
- package/dist/{run-ZU3QMZPZ.js → run-SRNBKDWD.js} +76 -54
- package/dist/{share-S5BZQC5I.js → share-CGZE33UP.js} +7 -6
- package/dist/{skills-X5VXCRNQ.js → skills-S2X4DLY5.js} +4 -4
- package/dist/{skills-eval-WKIHWTHR.js → skills-eval-W2GGIC4R.js} +40 -29
- package/dist/{targets-SNCPI2NR.js → targets-54SWINWB.js} +28 -23
- package/dist/{terminal-lease-BNAHVHBS.js → terminal-lease-SAIF2OGY.js} +6 -4
- package/dist/{uninstall-FZCQCDKC.js → uninstall-BVLWXKBT.js} +3 -3
- package/dist/{upgrade-JQHHPQ4K.js → upgrade-JKAR27XC.js} +20 -19
- package/dist/{usage-OR4O5SMZ.js → usage-MSAWCLX4.js} +79 -36
- package/dist/verifiers-NCBTHHN2.js +1220 -0
- package/dist/verify-X5HDROLA.js +25 -0
- package/dist/{wiki-generate-UEXP2ARI.js → wiki-generate-GUSOQ6ZP.js} +50 -37
- package/dist/worker/entry.js +90 -70
- package/dist/{workspace-G4ZWUIPR.js → workspace-ZJ6BFM3Q.js} +4 -4
- package/docs/README.md +8 -7
- package/docs/acp.md +1 -1
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-placement.md +1 -2
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +60 -26
- package/docs/config-knobs-audit.md +1 -2
- package/docs/configuration-and-targets.md +26 -1
- package/docs/context-engine.md +67 -13
- package/docs/context-working-set.md +194 -0
- package/docs/development-pipeline.md +1 -1
- package/docs/documentation-coverage.md +6 -6
- package/docs/documentation-guide.md +7 -6
- package/docs/environment-variables.md +2 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +4 -32
- package/docs/evidence-and-memory.md +139 -7
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +2 -2
- package/docs/fleet-dispatch.md +49 -8
- package/docs/glossary.md +21 -1
- package/docs/installation-and-lifecycle.md +2 -2
- package/docs/middleware-and-components.md +19 -2
- package/docs/model-catalog.md +7 -9
- package/docs/observability.md +4 -4
- package/docs/proactive-memory.md +26 -16
- package/docs/prompt-envelope-and-tools.md +7 -5
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +43 -40
- package/docs/safety-model.md +49 -8
- package/docs/scientific-validation.md +21 -3
- package/docs/session-lifecycle.md +3 -3
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +79 -12
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +38 -4
- package/docs/worker-dispatch-mechanics.md +11 -1
- package/package.json +13 -13
- package/skills/meta/clio-test/SKILL.md +20 -17
- package/skills/meta/clio-test/evals.md +3 -3
- package/skills/meta/clio-test/references/harness.md +35 -6
- package/skills/meta/clio-test/references/test-map.md +20 -10
- package/skills/registry.yaml +2 -2
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/agents.ts +2 -3
- package/src/cli/argv.ts +14 -1
- package/src/cli/context-working-set.ts +513 -0
- package/src/cli/context.ts +8 -0
- package/src/cli/evidence.ts +20 -2
- package/src/cli/fleet.ts +15 -0
- package/src/cli/index.ts +5 -1
- package/src/cli/memory.ts +272 -10
- package/src/cli/modes/json-stream.ts +2 -2
- package/src/cli/modes/print.ts +12 -1
- package/src/cli/run.ts +22 -2
- package/src/cli/targets.ts +12 -3
- package/src/cli/usage.ts +55 -7
- package/src/cli/verifiers.ts +325 -0
- package/src/core/bash-exec.ts +39 -14
- package/src/core/bus-events.ts +22 -4
- package/src/core/config.ts +54 -0
- package/src/core/defaults.ts +50 -3
- package/src/core/response-model-id.ts +134 -0
- package/src/core/toml.ts +62 -0
- package/src/core/verification-scripts.ts +6 -0
- package/src/core/workspace-files.ts +0 -1
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/verifier.md +3 -0
- package/src/domains/agents/catalog.ts +5 -4
- package/src/domains/agents/recipe.ts +54 -14
- package/src/domains/agents/result-contract.ts +7 -4
- package/src/domains/config/classify.ts +1 -0
- package/src/domains/context/bootstrap.ts +36 -27
- package/src/domains/context/project-metadata.ts +19 -63
- package/src/domains/context/prompt-context.ts +8 -0
- package/src/domains/context/working-set/contract.ts +161 -0
- package/src/domains/context/working-set/defaults.ts +28 -0
- package/src/domains/context/working-set/engine.ts +203 -0
- package/src/domains/context/working-set/fold.ts +62 -0
- package/src/domains/context/working-set/horizon.ts +38 -0
- package/src/domains/context/working-set/marker.ts +103 -0
- package/src/domains/context/working-set/path-index.ts +436 -0
- package/src/domains/context/working-set/payload.ts +152 -0
- package/src/domains/context/working-set/policies/age-horizon.ts +55 -0
- package/src/domains/context/working-set/policies/index.ts +20 -0
- package/src/domains/context/working-set/policies/structural.ts +160 -0
- package/src/domains/context/working-set/project.ts +132 -0
- package/src/domains/context/working-set/protect.ts +109 -0
- package/src/domains/context/working-set/recall.ts +177 -0
- package/src/domains/context/working-set/replay/controls.ts +112 -0
- package/src/domains/context/working-set/replay/load-clio.ts +199 -0
- package/src/domains/context/working-set/replay/metrics.ts +185 -0
- package/src/domains/context/working-set/replay/reference-graph.ts +79 -0
- package/src/domains/context/working-set/replay/report.ts +139 -0
- package/src/domains/context/working-set/replay/runner.ts +325 -0
- package/src/domains/context/working-set/replay/synthetic.ts +422 -0
- package/src/domains/context/working-set/replay/trace.ts +21 -0
- package/src/domains/context/working-set/visible.ts +54 -0
- package/src/domains/dispatch/budget-envelope.ts +396 -0
- package/src/domains/dispatch/contract.ts +2 -0
- package/src/domains/dispatch/extension.ts +81 -27
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/state.ts +1 -0
- package/src/domains/dispatch/types.ts +10 -3
- package/src/domains/dispatch/validation.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +14 -3
- package/src/domains/eval/metrics/evidence.ts +0 -116
- package/src/domains/eval/metrics/invariants.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +1 -10
- package/src/domains/eval/runners/external-command.ts +2 -29
- package/src/domains/eval/schema/suite.ts +0 -7
- package/src/domains/eval/suites/run.ts +1 -7
- package/src/domains/evidence/build.ts +112 -45
- package/src/domains/evidence/eval.ts +24 -7
- package/src/domains/evidence/index.ts +53 -0
- package/src/domains/evidence/ordering.ts +12 -0
- package/src/domains/evidence/run-trust.ts +221 -0
- package/src/domains/evidence/store.ts +46 -6
- package/src/domains/evidence/trust-status.ts +854 -0
- package/src/domains/evidence/types.ts +26 -0
- package/src/domains/memory/index.ts +22 -0
- package/src/domains/memory/operations.ts +58 -1
- package/src/domains/memory/promotion.ts +281 -0
- package/src/domains/memory/prompt-section.ts +25 -5
- package/src/domains/memory/proposal.ts +51 -7
- package/src/domains/memory/task-bank.ts +3 -2
- package/src/domains/memory/task-memory-handoff.ts +181 -24
- package/src/domains/memory/task-memory-policy.ts +3 -1
- package/src/domains/memory/types.ts +37 -0
- package/src/domains/memory/validate.ts +178 -0
- package/src/domains/middleware/memory-intervention.ts +38 -25
- package/src/domains/middleware/runtime.ts +6 -0
- package/src/domains/middleware/skills-reminder.ts +19 -4
- package/src/domains/middleware/stalled-turn.ts +208 -5
- package/src/domains/middleware/types.ts +10 -0
- package/src/domains/observability/contract.ts +6 -1
- package/src/domains/observability/cost.ts +20 -4
- package/src/domains/observability/extension.ts +2 -2
- package/src/domains/providers/index.ts +3 -0
- package/src/domains/providers/model-discovery.ts +9 -0
- package/src/domains/providers/runtime-resolution.ts +38 -1
- package/src/domains/providers/runtimes/common/probe-helpers.ts +97 -16
- package/src/domains/providers/types/context-window-slots.ts +18 -0
- package/src/domains/providers/types/runtime-descriptor.ts +3 -1
- package/src/domains/safety/autonomy.ts +1 -1
- package/src/domains/safety/call-target.ts +211 -14
- package/src/domains/safety/decision-presentation.ts +268 -0
- package/src/domains/safety/default-path-policy.ts +8 -0
- package/src/domains/safety/finish-contract.ts +4 -3
- package/src/domains/safety/policy-engine.ts +48 -6
- package/src/domains/safety/redaction.ts +73 -0
- package/src/domains/session/compaction/compact.ts +23 -1
- package/src/domains/session/compaction/cut-point.ts +2 -0
- package/src/domains/session/compaction/tokens.ts +16 -1
- package/src/domains/session/context-ledger.ts +12 -1
- package/src/domains/session/decision-board.ts +4 -0
- package/src/domains/session/entries.ts +110 -1
- package/src/domains/session/history.ts +68 -19
- package/src/domains/session/manager.ts +9 -2
- package/src/domains/session/migrations/index.ts +22 -3
- package/src/domains/session/usage.ts +24 -7
- package/src/engine/acp/event-mapper.ts +7 -0
- package/src/engine/acp/server.ts +32 -2
- package/src/engine/agent.ts +18 -1
- package/src/engine/apis/lmstudio.ts +25 -4
- package/src/engine/apis/openai-completions.ts +147 -22
- package/src/engine/claude/sdk-runtime.ts +8 -2
- package/src/engine/claude/tool-safety.ts +13 -0
- package/src/engine/loop-guard.ts +27 -3
- package/src/engine/session.ts +9 -3
- package/src/engine/worker-events.ts +4 -3
- package/src/engine/worker-runtime.ts +59 -54
- package/src/entry/orchestrator.ts +34 -5
- package/src/interactive/chat-loop-messages.ts +40 -6
- package/src/interactive/chat-loop.ts +13 -0
- package/src/interactive/chat-panel.ts +17 -1
- package/src/interactive/chat-renderer.ts +49 -24
- package/src/interactive/clio-editor.ts +44 -7
- package/src/interactive/context-meter.ts +10 -0
- package/src/interactive/context-overlay.ts +120 -7
- package/src/interactive/context-recall-command.ts +110 -0
- package/src/interactive/cost-overlay.ts +39 -8
- package/src/interactive/dispatch-board.ts +212 -35
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +6 -1
- package/src/interactive/interactive-input-runtime.ts +11 -1
- package/src/interactive/interactive-presentation.ts +11 -1
- package/src/interactive/interactive-slash-runtime.ts +37 -1
- package/src/interactive/memory-overlay.ts +89 -4
- package/src/interactive/model-session-replay.ts +21 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +1 -1
- package/src/interactive/overlay-frame.ts +5 -2
- package/src/interactive/overlay-general-openers.ts +46 -1
- package/src/interactive/overlay-key-routing.ts +41 -1
- package/src/interactive/overlay-lifecycle.ts +11 -4
- package/src/interactive/overlay-permission-lifecycle.ts +23 -8
- package/src/interactive/overlay-session-lifecycle.ts +8 -4
- package/src/interactive/overlay-transitions.ts +11 -0
- package/src/interactive/overlays/ask-user.ts +74 -30
- package/src/interactive/overlays/decisions.ts +3 -1
- package/src/interactive/permission-hint.ts +35 -0
- package/src/interactive/permission-overlay.ts +95 -45
- package/src/interactive/renderers/tool-execution.ts +37 -51
- package/src/interactive/session-last-turn.ts +8 -1
- package/src/interactive/session-transcript.ts +2 -2
- package/src/interactive/session-usage-reseed.ts +36 -10
- package/src/interactive/slash-commands.ts +31 -4
- package/src/interactive/status/summary.ts +5 -0
- package/src/interactive/status/types.ts +5 -0
- package/src/interactive/terminal-lease.ts +1 -0
- package/src/interactive/turn-context.ts +333 -110
- package/src/interactive/turn-middleware.ts +7 -6
- package/src/interactive/turn-runtime.ts +37 -8
- package/src/interactive/turn-state.ts +3 -0
- package/src/interactive/worker-progress.ts +440 -0
- package/src/interactive/worker-stream.ts +51 -110
- package/src/tools/agent-tools.ts +39 -7
- package/src/tools/ask-user.ts +21 -1
- package/src/tools/bash.ts +144 -82
- package/src/tools/builtin-tool-catalog.ts +11 -5
- package/src/tools/context/index.ts +107 -5
- package/src/tools/context/surface.ts +3 -2
- package/src/tools/core-bootstrap.ts +21 -0
- package/src/tools/dispatch-arguments.ts +8 -0
- package/src/tools/dispatch-event-text.ts +19 -0
- package/src/tools/dispatch-runner.ts +9 -7
- package/src/tools/dispatch.ts +24 -1
- package/src/tools/monitor.ts +43 -20
- package/src/tools/registry.ts +72 -10
- package/src/tools/result-disposition.ts +706 -0
- package/src/tools/result-shaping.ts +321 -20
- package/src/tools/safe-exec.ts +2 -0
- package/src/tools/verify/authoring.ts +1120 -0
- package/src/tools/verify/catalog.ts +346 -0
- package/src/tools/verify/index.ts +13 -3
- package/src/tools/verify/scripts.ts +135 -37
- package/src/tools/verify/surface.ts +9 -5
- package/src/tools/worker-evidence.ts +54 -12
- package/src/worker/spec-contract.ts +43 -3
- package/dist/chunk-J7CWMCQD.js +0 -255
- package/dist/chunk-T6YILFSB.js +0 -80
- package/dist/chunk-VAKQQHWR.js +0 -434
- package/dist/chunk-VPAYEGVX.js +0 -184
- package/dist/chunk-XBXAASKX.js +0 -18
- package/dist/memory-WFZMGYHX.js +0 -236
- package/src/domains/eval/metrics/chaos-stream.ts +0 -93
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { type GateDecisionArtifact, verifyGateDecisionArtifact } from "../dispatch/gate-decisions.js";
|
|
2
|
+
import type { RunEnvelope, RunReceipt } from "../dispatch/types.js";
|
|
3
|
+
import type { FinishContractAssessment, FinishContractEvidenceKind } from "../safety/finish-contract.js";
|
|
4
|
+
import { compareCodepoints as compareStrings } from "./ordering.js";
|
|
5
|
+
import {
|
|
6
|
+
adaptFinishContractCompletionStatus,
|
|
7
|
+
adaptGateDecisionReviewStatus,
|
|
8
|
+
adaptGroundedEvidenceValidationStatus,
|
|
9
|
+
type CanonicalTrustStatus,
|
|
10
|
+
composeTrustStatus,
|
|
11
|
+
inspectRunReceiptTrustStatus,
|
|
12
|
+
isTrustStatusIdentifier,
|
|
13
|
+
type TrustArtifactReference,
|
|
14
|
+
} from "./trust-status.js";
|
|
15
|
+
import { EVIDENCE_VERSION, type EvidenceAuditLinkedRow, type EvidenceTrustStatusFile } from "./types.js";
|
|
16
|
+
|
|
17
|
+
export interface EvidenceRunTrustSource {
|
|
18
|
+
envelope: RunEnvelope;
|
|
19
|
+
receipt: RunReceipt | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface BuildEvidenceTrustStatusInput {
|
|
23
|
+
evidenceId: string;
|
|
24
|
+
runSources: ReadonlyArray<EvidenceRunTrustSource>;
|
|
25
|
+
gateDecisions: ReadonlyArray<GateDecisionArtifact>;
|
|
26
|
+
auditRows: ReadonlyArray<EvidenceAuditLinkedRow>;
|
|
27
|
+
validationEvidence?: ReadonlyMap<string, ReadonlyArray<TrustArtifactReference>>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Compose every evidence-linked trust axis at one pure boundary. Both the
|
|
32
|
+
* run/session and eval builders call this function, so the same authenticated
|
|
33
|
+
* receipt, gate decision, and exact finish-contract row cannot project
|
|
34
|
+
* differently merely because it was bundled through a different entry point.
|
|
35
|
+
*/
|
|
36
|
+
export function buildEvidenceTrustStatusFile(input: BuildEvidenceTrustStatusInput): EvidenceTrustStatusFile {
|
|
37
|
+
return {
|
|
38
|
+
version: EVIDENCE_VERSION,
|
|
39
|
+
evidenceId: input.evidenceId,
|
|
40
|
+
projection: "canonical",
|
|
41
|
+
runs: input.runSources.map((source) => ({
|
|
42
|
+
runId: source.envelope.id,
|
|
43
|
+
status: composeEvidenceRunTrustStatus({
|
|
44
|
+
evidenceId: input.evidenceId,
|
|
45
|
+
source,
|
|
46
|
+
gateDecisions: input.gateDecisions,
|
|
47
|
+
auditRows: input.auditRows,
|
|
48
|
+
validationEvidence: input.validationEvidence?.get(source.envelope.id) ?? [],
|
|
49
|
+
}),
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface ComposeEvidenceRunTrustInput {
|
|
55
|
+
evidenceId: string;
|
|
56
|
+
source: EvidenceRunTrustSource;
|
|
57
|
+
gateDecisions: ReadonlyArray<GateDecisionArtifact>;
|
|
58
|
+
auditRows: ReadonlyArray<EvidenceAuditLinkedRow>;
|
|
59
|
+
validationEvidence: ReadonlyArray<TrustArtifactReference>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function composeEvidenceRunTrustStatus(input: ComposeEvidenceRunTrustInput): CanonicalTrustStatus {
|
|
63
|
+
const inspection = inspectRunReceiptTrustStatus(input.source.receipt, input.source.envelope);
|
|
64
|
+
// A receipt that was presented and rejected authenticates nothing about the
|
|
65
|
+
// run it names. Its integrity failure stays on `artifactIntegrity`; no other
|
|
66
|
+
// axis may reach a trust-granting state on the strength of that run's own
|
|
67
|
+
// self-reports. A missing or unchecked receipt is not a rejection.
|
|
68
|
+
const receiptRejected = inspection.status.artifactIntegrity.state === "failed";
|
|
69
|
+
let status = inspection.status;
|
|
70
|
+
// Only independently observed executions ground validation. The
|
|
71
|
+
// completion-contract audit row is the run's own self-report: it feeds
|
|
72
|
+
// `completionEvidence` below and nothing else. The cross-axis rules this
|
|
73
|
+
// enforces are listed under "composition rules" in docs/evidence-and-memory.md.
|
|
74
|
+
const grounded = input.validationEvidence.filter((artifact) => isTrustStatusIdentifier(artifact.id));
|
|
75
|
+
if (
|
|
76
|
+
grounded.length > 0 &&
|
|
77
|
+
(status.validationGrounding.state === "absent" || status.validationGrounding.state === "unknown")
|
|
78
|
+
) {
|
|
79
|
+
status = composeTrustStatus(status, {
|
|
80
|
+
validationGrounding: adaptGroundedEvidenceValidationStatus({
|
|
81
|
+
evidenceId: input.evidenceId,
|
|
82
|
+
runId: input.source.envelope.id,
|
|
83
|
+
artifacts: grounded,
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const gate = latestGateDecisionForRun(input.gateDecisions, input.source.envelope.id);
|
|
89
|
+
if (gate !== null) {
|
|
90
|
+
const artifactVerification = verifyGateDecisionArtifact(gate);
|
|
91
|
+
const subject = gate.subjects.find((entry) => entry.runId === input.source.envelope.id);
|
|
92
|
+
const receipt = inspection.integrity.ok ? input.source.receipt : null;
|
|
93
|
+
const verification =
|
|
94
|
+
artifactVerification.ok &&
|
|
95
|
+
subject !== undefined &&
|
|
96
|
+
receipt?.integrity !== undefined &&
|
|
97
|
+
subject.digest === receipt.integrity.digest
|
|
98
|
+
? ({ ok: true } as const)
|
|
99
|
+
: ({
|
|
100
|
+
ok: false,
|
|
101
|
+
reason: artifactVerification.ok
|
|
102
|
+
? "gate subject receipt digest unavailable or mismatched"
|
|
103
|
+
: artifactVerification.reason,
|
|
104
|
+
} as const);
|
|
105
|
+
status = composeTrustStatus(status, {
|
|
106
|
+
independentReview: adaptGateDecisionReviewStatus(gate, input.source.envelope.id, verification),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const finish = latestFinishContractForRun(input.auditRows, input.source.envelope.id);
|
|
111
|
+
if (finish !== null) {
|
|
112
|
+
const completion = adaptFinishContractCompletionStatus(finish.assessment, {
|
|
113
|
+
sourceId: finish.sourceId,
|
|
114
|
+
artifacts: finish.artifacts,
|
|
115
|
+
});
|
|
116
|
+
status = composeTrustStatus(status, {
|
|
117
|
+
completionEvidence:
|
|
118
|
+
receiptRejected && completion.state === "evidenced"
|
|
119
|
+
? {
|
|
120
|
+
state: "unknown",
|
|
121
|
+
source: { kind: "finish_contract", id: finish.sourceId },
|
|
122
|
+
authority: { kind: "clio", id: "finish-contract" },
|
|
123
|
+
artifacts: finish.artifacts,
|
|
124
|
+
}
|
|
125
|
+
: completion,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return status;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function latestGateDecisionForRun(
|
|
132
|
+
decisions: ReadonlyArray<GateDecisionArtifact>,
|
|
133
|
+
runId: string,
|
|
134
|
+
): GateDecisionArtifact | null {
|
|
135
|
+
return (
|
|
136
|
+
decisions
|
|
137
|
+
.filter((decision) => decision.subjects.some((subject) => subject.runId === runId))
|
|
138
|
+
.sort(
|
|
139
|
+
(left, right) =>
|
|
140
|
+
compareStrings(left.createdAt, right.createdAt) || left.cycle - right.cycle || compareStrings(left.id, right.id),
|
|
141
|
+
)
|
|
142
|
+
.at(-1) ?? null
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
interface EvidenceFinishContractProjection {
|
|
147
|
+
sourceId: string;
|
|
148
|
+
assessment: FinishContractAssessment;
|
|
149
|
+
artifacts: TrustArtifactReference[];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function latestFinishContractForRun(
|
|
153
|
+
rows: ReadonlyArray<EvidenceAuditLinkedRow>,
|
|
154
|
+
runId: string,
|
|
155
|
+
): EvidenceFinishContractProjection | null {
|
|
156
|
+
const candidates = rows
|
|
157
|
+
.filter((row) => row.auditKind === "completion_contract" && row.runId === runId && row.confidence === "exact")
|
|
158
|
+
.flatMap((row) => {
|
|
159
|
+
const assessment = finishContractAssessmentFromAudit(row.row);
|
|
160
|
+
if (assessment === null) return [];
|
|
161
|
+
const correlationId = readOptionalString(row.row.correlationId) ?? `${runId}:completion-contract`;
|
|
162
|
+
// A malformed row is dropped from the trust projection rather than
|
|
163
|
+
// thrown out of the whole forensic build. `readAuditRows` already
|
|
164
|
+
// reports the malformed line, so the bundle stays honest about it.
|
|
165
|
+
if (!isTrustStatusIdentifier(correlationId)) return [];
|
|
166
|
+
const turnId = readOptionalString(row.row.turnId);
|
|
167
|
+
const artifacts: TrustArtifactReference[] = [
|
|
168
|
+
{ kind: "finish_contract_evidence", id: correlationId },
|
|
169
|
+
...(turnId === null || !isTrustStatusIdentifier(turnId) ? [] : [{ kind: "session_entry" as const, id: turnId }]),
|
|
170
|
+
];
|
|
171
|
+
return [{ sourceId: correlationId, assessment, artifacts, timestamp: row.ts ?? "" }];
|
|
172
|
+
})
|
|
173
|
+
.sort(
|
|
174
|
+
(left, right) => compareStrings(left.timestamp, right.timestamp) || compareStrings(left.sourceId, right.sourceId),
|
|
175
|
+
);
|
|
176
|
+
const latest = candidates.at(-1);
|
|
177
|
+
return latest === undefined
|
|
178
|
+
? null
|
|
179
|
+
: { sourceId: latest.sourceId, assessment: latest.assessment, artifacts: latest.artifacts };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function finishContractAssessmentFromAudit(row: Record<string, unknown>): FinishContractAssessment | null {
|
|
183
|
+
const reason = readOptionalString(row.reason);
|
|
184
|
+
const decision = readOptionalString(row.decision);
|
|
185
|
+
const mutatedPaths = Array.isArray(row.mutatedPaths)
|
|
186
|
+
? row.mutatedPaths.filter((entry): entry is string => typeof entry === "string")
|
|
187
|
+
: [];
|
|
188
|
+
const turnId = readOptionalString(row.turnId);
|
|
189
|
+
const evidenceKinds = Array.isArray(row.evidenceKinds) ? row.evidenceKinds.filter(isFinishContractEvidenceKind) : [];
|
|
190
|
+
const evidence = evidenceKinds.map((kind) => ({
|
|
191
|
+
kind,
|
|
192
|
+
summary: "recorded by the finish contract",
|
|
193
|
+
...(turnId === null ? {} : { turnId }),
|
|
194
|
+
}));
|
|
195
|
+
if (decision === "ok" && reason === "no_mutation") {
|
|
196
|
+
return { kind: "ok", reason, evidence: [], mutatedPaths };
|
|
197
|
+
}
|
|
198
|
+
if (decision === "ok" && reason === "validation_evidence") {
|
|
199
|
+
return { kind: "ok", reason, evidence, mutatedPaths };
|
|
200
|
+
}
|
|
201
|
+
if (decision === "ok" && reason === "explicit_limitation") {
|
|
202
|
+
return { kind: "ok", reason, evidence: [], mutatedPaths };
|
|
203
|
+
}
|
|
204
|
+
if (decision === "engage" && reason === "unvalidated_mutation") {
|
|
205
|
+
return { kind: "engage", reason, message: "finish contract engaged", evidence: [], mutatedPaths };
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function isFinishContractEvidenceKind(value: unknown): value is FinishContractEvidenceKind {
|
|
211
|
+
return value === "validation_command" || value === "protected_artifact" || value === "dispatch_receipt";
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* A blank or whitespace-only optional field is absent, not an identifier. The
|
|
216
|
+
* `??` fallbacks below depend on it, and an empty string would otherwise reach
|
|
217
|
+
* `normalizeArtifactReference` and abort the entire bundle.
|
|
218
|
+
*/
|
|
219
|
+
function readOptionalString(value: unknown): string | null {
|
|
220
|
+
return typeof value === "string" && value.trim().length > 0 ? value : null;
|
|
221
|
+
}
|
|
@@ -2,8 +2,16 @@ import { readdir, readFile } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { assertSafeId } from "../../core/safe-id.js";
|
|
4
4
|
import { type GateDecisionArtifact, verifyGateDecisionArtifact } from "../dispatch/index.js";
|
|
5
|
+
import { compareCodepoints as compareStrings } from "./ordering.js";
|
|
5
6
|
import { hasRunProvenance, type RunProvenanceView, runProvenanceFromUnknown } from "./provenance.js";
|
|
6
|
-
import
|
|
7
|
+
import { normalizeTrustStatus } from "./trust-status.js";
|
|
8
|
+
import type {
|
|
9
|
+
EvidenceFinding,
|
|
10
|
+
EvidenceFindingsFile,
|
|
11
|
+
EvidenceInspectable,
|
|
12
|
+
EvidenceOverview,
|
|
13
|
+
EvidenceTrustStatusView,
|
|
14
|
+
} from "./types.js";
|
|
7
15
|
|
|
8
16
|
export const EVIDENCE_FILES = [
|
|
9
17
|
"overview.json",
|
|
@@ -14,6 +22,7 @@ export const EVIDENCE_FILES = [
|
|
|
14
22
|
"audit-linked.jsonl",
|
|
15
23
|
"receipt.json",
|
|
16
24
|
"gate-decisions.json",
|
|
25
|
+
"trust-status.json",
|
|
17
26
|
"protected-artifacts.json",
|
|
18
27
|
"findings.json",
|
|
19
28
|
"findings.md",
|
|
@@ -69,7 +78,42 @@ export async function inspectEvidence(dataDir: string, evidenceId: string): Prom
|
|
|
69
78
|
}
|
|
70
79
|
const findingsParsed = parseJson(findingsRaw, `${evidenceId}/findings.json`);
|
|
71
80
|
const findings = parseFindingsFile(findingsParsed, `${evidenceId}/findings.json`);
|
|
72
|
-
return { overview, findings };
|
|
81
|
+
return { overview, findings, trustStatus: await loadEvidenceTrustStatus(dataDir, evidenceId) };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Load a canonical projection, or make the missing historical boundary explicit. */
|
|
85
|
+
export async function loadEvidenceTrustStatus(dataDir: string, evidenceId: string): Promise<EvidenceTrustStatusView> {
|
|
86
|
+
let raw: string;
|
|
87
|
+
try {
|
|
88
|
+
raw = await readFile(join(evidenceDirectory(dataDir, evidenceId), "trust-status.json"), "utf8");
|
|
89
|
+
} catch (error) {
|
|
90
|
+
if (isMissingFile(error)) {
|
|
91
|
+
return { version: 1, evidenceId, projection: "historical_format", runs: [] };
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
const source = `${evidenceId}/trust-status.json`;
|
|
96
|
+
const parsed = parseJson(raw, source);
|
|
97
|
+
if (!isRecord(parsed)) throw new Error(`${source}: expected object`);
|
|
98
|
+
if (parsed.version !== 1) throw new Error(`${source}: expected version 1`);
|
|
99
|
+
if (readString(parsed, source, "evidenceId") !== evidenceId) {
|
|
100
|
+
throw new Error(`${source}.evidenceId: expected ${evidenceId}`);
|
|
101
|
+
}
|
|
102
|
+
if (parsed.projection !== "canonical") throw new Error(`${source}.projection: expected canonical`);
|
|
103
|
+
if (!Array.isArray(parsed.runs)) throw new Error(`${source}.runs: expected array`);
|
|
104
|
+
return {
|
|
105
|
+
version: 1,
|
|
106
|
+
evidenceId,
|
|
107
|
+
projection: "canonical",
|
|
108
|
+
runs: parsed.runs.map((entry, index) => {
|
|
109
|
+
const entrySource = `${source}.runs[${index}]`;
|
|
110
|
+
if (!isRecord(entry)) throw new Error(`${entrySource}: expected object`);
|
|
111
|
+
return {
|
|
112
|
+
runId: readString(entry, entrySource, "runId"),
|
|
113
|
+
status: normalizeTrustStatus(entry.status),
|
|
114
|
+
};
|
|
115
|
+
}),
|
|
116
|
+
};
|
|
73
117
|
}
|
|
74
118
|
|
|
75
119
|
/** A bundle run whose receipt carries at least one provenance field set. */
|
|
@@ -282,10 +326,6 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
282
326
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
283
327
|
}
|
|
284
328
|
|
|
285
|
-
function compareStrings(a: string, b: string): number {
|
|
286
|
-
return a.localeCompare(b);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
329
|
export function findingsFile(evidenceId: string, findings: EvidenceFinding[]): EvidenceFindingsFile {
|
|
290
330
|
return { version: 1, evidenceId, findings };
|
|
291
331
|
}
|