@iowarp/clio-coder 0.3.7 → 0.3.9
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 +80 -0
- package/README.md +13 -4
- package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
- package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
- package/dist/builtins-AD25UL3C.js +17 -0
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
- package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
- package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
- package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
- package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
- package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
- package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
- package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
- package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
- package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
- package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
- package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
- package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
- package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
- package/dist/chunk-774ILSRL.js +172 -0
- package/dist/chunk-7C6RYZGQ.js +391 -0
- package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
- package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
- package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
- package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
- package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
- package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
- package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
- package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
- package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
- package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
- package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
- package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
- package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
- package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
- package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
- package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
- package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
- package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
- package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
- package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
- package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
- package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
- package/dist/chunk-JEQQR47K.js +3025 -0
- package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
- package/dist/chunk-LU7P4LHA.js +33 -0
- package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
- package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
- package/dist/chunk-MLOK6ZOS.js +2888 -0
- package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
- package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
- package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
- package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
- package/dist/chunk-NUGM5KR6.js +165 -0
- package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
- package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
- package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
- package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
- package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
- package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
- package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
- package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
- package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
- package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
- package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
- package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
- package/dist/chunk-VO2LKSTM.js +165 -0
- package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
- package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
- package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
- package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
- package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
- package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
- package/dist/chunk-YSEHGPCT.js +127 -0
- package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
- package/dist/cli/index.js +32 -32
- package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
- package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
- package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
- package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
- package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
- package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
- package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
- package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
- package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
- package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
- package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
- package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
- package/dist/doctor-TWBWFK5V.js +165 -0
- package/dist/eval-IJ5VEZDJ.js +4483 -0
- package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
- package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
- package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
- package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
- package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
- package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
- package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
- package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
- package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
- package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
- package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
- package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
- package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
- package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
- package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
- package/dist/registry-LG64LTF4.js +11 -0
- package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
- package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
- package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
- package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
- package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
- package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
- package/dist/support-I7LOJLIF.js +38 -0
- package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
- package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
- package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
- package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
- package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
- package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
- package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
- package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
- package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
- package/dist/worker/entry.js +69 -66
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +1 -1
- package/docs/artifact-versions.md +11 -5
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +23 -2
- package/docs/commands-and-modes.md +2 -2
- package/docs/configuration-and-targets.md +37 -5
- package/docs/context-engine.md +63 -4
- package/docs/documentation-coverage.md +3 -3
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +2 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +77 -12
- package/docs/evolution.md +1 -1
- package/docs/extensions-and-sharing.md +3 -1
- package/docs/fleet-dispatch.md +34 -9
- package/docs/glossary.md +21 -1
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +1 -1
- package/docs/observability.md +54 -3
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +22 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +60 -41
- package/docs/safety-model.md +1 -1
- package/docs/scientific-validation.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +1 -1
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +87 -0
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +2 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +5 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +107 -23
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor.ts +7 -1
- package/src/cli/eval.ts +80 -16
- package/src/cli/evidence.ts +30 -25
- package/src/cli/extensions.ts +5 -1
- package/src/cli/fleet-preflight.ts +2 -12
- package/src/cli/fleet.ts +32 -3
- package/src/cli/shared.ts +1 -0
- package/src/cli/targets.ts +45 -11
- package/src/cli/trace.ts +63 -4
- package/src/cli/usage.ts +63 -14
- package/src/cli/validate-model.ts +60 -5
- package/src/core/bus-events.ts +54 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/commit-attribution.ts +4 -4
- package/src/core/config.ts +18 -0
- package/src/core/defaults.ts +36 -6
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/path-boundary.ts +100 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +36 -2
- package/src/domains/agents/extension.ts +2 -11
- package/src/domains/agents/fleet-contract.ts +30 -12
- package/src/domains/agents/recipe.ts +7 -1
- package/src/domains/agents/registry.ts +73 -5
- package/src/domains/agents/result-contract.ts +128 -17
- package/src/domains/agents/write-boundary.ts +15 -50
- package/src/domains/config/classify.ts +3 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/context/project-rules.ts +51 -1
- package/src/domains/dispatch/admission.ts +40 -3
- package/src/domains/dispatch/assignment-reconcile.ts +22 -5
- package/src/domains/dispatch/assignment-store.ts +151 -14
- package/src/domains/dispatch/capacity-lease.ts +98 -9
- package/src/domains/dispatch/contract.ts +26 -1
- package/src/domains/dispatch/delegation-plan.ts +2 -5
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/execution-role.ts +9 -1
- package/src/domains/dispatch/extension.ts +309 -96
- package/src/domains/dispatch/fleet-run.ts +78 -4
- package/src/domains/dispatch/gate-role-prompts.ts +38 -0
- package/src/domains/dispatch/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +6 -1
- package/src/domains/dispatch/intent-requirements.ts +40 -0
- package/src/domains/dispatch/intent.ts +84 -8
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/path-scope.ts +370 -0
- package/src/domains/dispatch/receipt-integrity.ts +2 -1
- package/src/domains/dispatch/reservation-store.ts +116 -8
- package/src/domains/dispatch/state.ts +4 -0
- package/src/domains/dispatch/types.ts +14 -7
- package/src/domains/dispatch/validation.ts +6 -3
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
- package/src/domains/dispatch/write-boundary.ts +262 -22
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +355 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/evidence.ts +79 -2
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +139 -2
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +74 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +68 -21
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/index.ts +21 -0
- package/src/domains/evidence/provenance.ts +46 -11
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/trust-projection.ts +274 -0
- package/src/domains/evidence/trust-status.ts +145 -17
- package/src/domains/evidence/types.ts +4 -0
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +126 -4
- package/src/domains/extensions/resources.ts +21 -9
- package/src/domains/extensions/state.ts +18 -5
- package/src/domains/extensions/types.ts +6 -1
- package/src/domains/lifecycle/doctor.ts +209 -2
- package/src/domains/memory/index.ts +14 -0
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +77 -8
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +2 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +69 -5
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- package/src/domains/observability/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/index.ts +7 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +192 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/prompts/contract.ts +3 -5
- package/src/domains/providers/endpoint-capacity.ts +96 -0
- package/src/domains/providers/extension.ts +30 -2
- package/src/domains/providers/index.ts +10 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/common-loader.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +184 -17
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/policy-engine.ts +5 -5
- package/src/domains/safety/run-effects.ts +96 -2
- package/src/domains/safety/scope.ts +7 -12
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -0
- package/src/engine/acp/adapter.ts +18 -3
- package/src/engine/acp/server.ts +4 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/prompt-templates.ts +18 -1
- package/src/engine/provider-payload.ts +29 -1
- package/src/engine/worker-runtime.ts +6 -3
- package/src/entry/orchestrator.ts +176 -30
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +40 -10
- package/src/interactive/cost-overlay.ts +64 -6
- package/src/interactive/dispatch-board.ts +127 -5
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +24 -1
- package/src/interactive/interactive-event-projection.ts +14 -0
- package/src/interactive/interactive-input-runtime.ts +8 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +27 -4
- package/src/interactive/memory-overlay.ts +8 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/overlay-general-openers.ts +16 -0
- package/src/interactive/overlay-key-routing.ts +38 -0
- package/src/interactive/overlay-lifecycle.ts +38 -5
- package/src/interactive/overlay-permission-lifecycle.ts +22 -2
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlays/ask-user.ts +91 -19
- package/src/interactive/overlays/help-reference.ts +4 -0
- package/src/interactive/overlays/prompts.ts +11 -1
- package/src/interactive/overlays/settings.ts +176 -48
- package/src/interactive/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +7 -2
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/turn-context.ts +299 -31
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +42 -9
- package/src/interactive/view/view-overlay.ts +43 -6
- package/src/interactive/worker-receipts.ts +14 -2
- package/src/interactive/worker-stream.ts +8 -0
- package/src/tools/ask-user.ts +43 -2
- package/src/tools/dispatch-admission.ts +12 -13
- package/src/tools/dispatch-arguments.ts +27 -0
- package/src/tools/dispatch-plan.ts +46 -9
- package/src/tools/dispatch-runner.ts +48 -13
- package/src/tools/dispatch-scout.ts +1 -1
- package/src/tools/monitor.ts +13 -0
- package/src/tools/registry.ts +16 -0
- package/src/tools/worker-evidence.ts +19 -13
- package/src/worker/spec-contract.ts +2 -1
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-R346GLFC.js +0 -31
- package/dist/chunk-ZGH7FGS5.js +0 -1079
- package/dist/doctor-RN4YKO2X.js +0 -87
- package/dist/eval-RUBJVSNQ.js +0 -2557
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { RUN_RECEIPT_INTEGRITY_VERSION } from "../dispatch/receipt-integrity.js";
|
|
2
|
+
import {
|
|
3
|
+
type CanonicalTrustStatus,
|
|
4
|
+
retiredIntegrityVersionOf,
|
|
5
|
+
TRUST_STATUS_AXES,
|
|
6
|
+
type TRUST_STATUS_STATES,
|
|
7
|
+
type TrustArtifactReference,
|
|
8
|
+
type TrustStatusAxis,
|
|
9
|
+
} from "./trust-status.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The one projection of the canonical trust status every operator surface
|
|
13
|
+
* renders. The six-axis model stays the source of truth and is never
|
|
14
|
+
* collapsed into a score here; this module only fixes the words each state is
|
|
15
|
+
* called and the order the axes are read in, so the dispatch line, the
|
|
16
|
+
* monitor block, `evidence inspect`, `findings.md`, the Alt+W board, the
|
|
17
|
+
* receipt view, the eval bridge, and the ACP wire cannot each spell the same
|
|
18
|
+
* fact differently.
|
|
19
|
+
*
|
|
20
|
+
* Two shapes leave this module. `formatTrustSummary` is the compact human
|
|
21
|
+
* line: it answers who claims the result, what was observed, what was
|
|
22
|
+
* independently checked, and what is still unknown, without receipt
|
|
23
|
+
* internals. `summarizeTrustStatus` is the bounded, versioned machine record
|
|
24
|
+
* behind that line, carrying the axis states and typed references back to
|
|
25
|
+
* the artifacts the detailed model cites.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export const TRUST_SUMMARY_VERSION = 1 as const;
|
|
29
|
+
|
|
30
|
+
/** Reference cap for the machine projection; the canonical model keeps up to 16 per axis. */
|
|
31
|
+
export const TRUST_SUMMARY_MAX_REFS = 8;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* How much the run's result can be leaned on, read off the axes in a fixed
|
|
35
|
+
* order. It is a presentation tier for styling and sorting, never a score:
|
|
36
|
+
* `reviewed` is the only tier that may be styled as independently verified.
|
|
37
|
+
*/
|
|
38
|
+
export type TrustVerdict = "reviewed" | "grounded" | "unverified" | "compromised" | "unknown";
|
|
39
|
+
|
|
40
|
+
export const TRUST_VERDICTS: ReadonlyArray<TrustVerdict> = [
|
|
41
|
+
"reviewed",
|
|
42
|
+
"grounded",
|
|
43
|
+
"unverified",
|
|
44
|
+
"compromised",
|
|
45
|
+
"unknown",
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/** Bounded, versioned machine projection with references to the detailed artifacts. */
|
|
49
|
+
export interface TrustSummaryProjection {
|
|
50
|
+
version: typeof TRUST_SUMMARY_VERSION;
|
|
51
|
+
verdict: TrustVerdict;
|
|
52
|
+
/** The compact human line, byte-identical to what the text surfaces print. */
|
|
53
|
+
text: string;
|
|
54
|
+
/** Every axis state, in canonical vocabulary, for machine consumers. */
|
|
55
|
+
axes: Record<TrustStatusAxis, string>;
|
|
56
|
+
/** Who asserts the validation fact: `<authority kind>:<id>`, or `worker` when only the run's own prose exists. */
|
|
57
|
+
claimant: string;
|
|
58
|
+
/** Axes that answer nothing, so a consumer knows what remains unknown. */
|
|
59
|
+
unknown: TrustStatusAxis[];
|
|
60
|
+
/** `<artifact kind>:<id>` pointers to the detailed records, sorted, unique, capped. */
|
|
61
|
+
refs: string[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
type AxisStates = { [Axis in TrustStatusAxis]: (typeof TRUST_STATUS_STATES)[Axis][number] };
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The standardized word for every state. A word is what an operator reads;
|
|
68
|
+
* the state id is what a machine reads. `mediated` names the `enforced`
|
|
69
|
+
* autonomy state because that is the receipt grade and the documented
|
|
70
|
+
* meaning: Clio's own safety gate mediated the run. `inferred` names an
|
|
71
|
+
* ungrounded validation claim: the worker said it validated, nothing was
|
|
72
|
+
* observed to have run.
|
|
73
|
+
*/
|
|
74
|
+
export const TRUST_STATE_WORDS: { [Axis in TrustStatusAxis]: Record<AxisStates[Axis], string> } = {
|
|
75
|
+
artifactIntegrity: {
|
|
76
|
+
verified: "sealed",
|
|
77
|
+
failed: "seal broken",
|
|
78
|
+
absent: "no receipt",
|
|
79
|
+
unknown: "seal unchecked",
|
|
80
|
+
not_applicable: "seal not applicable",
|
|
81
|
+
},
|
|
82
|
+
validationGrounding: {
|
|
83
|
+
validated: "grounded",
|
|
84
|
+
failed: "validation failed",
|
|
85
|
+
ungrounded: "inferred: validation claimed, none observed",
|
|
86
|
+
absent: "no validation observed",
|
|
87
|
+
unknown: "validation unknown",
|
|
88
|
+
not_applicable: "validation not applicable",
|
|
89
|
+
},
|
|
90
|
+
independentReview: {
|
|
91
|
+
passed: "independently reviewed: pass",
|
|
92
|
+
failed: "independently reviewed: fail",
|
|
93
|
+
inconclusive: "independent review inconclusive",
|
|
94
|
+
not_independent: "review not independent",
|
|
95
|
+
absent: "not independently reviewed",
|
|
96
|
+
unknown: "independent review unknown",
|
|
97
|
+
not_applicable: "independent review not applicable",
|
|
98
|
+
},
|
|
99
|
+
contextProvenance: {
|
|
100
|
+
recorded: "context recorded",
|
|
101
|
+
invalid: "context record invalid",
|
|
102
|
+
absent: "context not recorded",
|
|
103
|
+
unknown: "context unknown",
|
|
104
|
+
not_applicable: "context not applicable",
|
|
105
|
+
},
|
|
106
|
+
autonomyEnforcement: {
|
|
107
|
+
enforced: "mediated",
|
|
108
|
+
approximated: "approximated",
|
|
109
|
+
bypassed: "bypassed",
|
|
110
|
+
absent: "autonomy not recorded",
|
|
111
|
+
unknown: "autonomy unknown",
|
|
112
|
+
not_applicable: "autonomy not applicable",
|
|
113
|
+
},
|
|
114
|
+
completionEvidence: {
|
|
115
|
+
evidenced: "completion evidenced",
|
|
116
|
+
incomplete: "completion unevidenced",
|
|
117
|
+
limited: "completion limited",
|
|
118
|
+
absent: "completion not recorded",
|
|
119
|
+
unknown: "completion unknown",
|
|
120
|
+
not_applicable: "completion not applicable",
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/** The word for one axis state; unknown input never throws, it reads as unknown. */
|
|
125
|
+
export function trustStateWord<Axis extends TrustStatusAxis>(axis: Axis, state: string): string {
|
|
126
|
+
const words = TRUST_STATE_WORDS[axis] as Record<string, string>;
|
|
127
|
+
return words[state] ?? words.unknown ?? "unknown";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function authorityOf(status: CanonicalTrustStatus, axis: TrustStatusAxis): string | null {
|
|
131
|
+
const entry = status[axis];
|
|
132
|
+
return entry.state === "absent" ? null : `${entry.authority.kind}:${entry.authority.id}`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* A seal this build does not verify because its version is retired names
|
|
137
|
+
* that version and the one in force, so an intact receipt from the previous
|
|
138
|
+
* release never reads as "seal broken" or as merely unchecked. The state
|
|
139
|
+
* behind the clause is `unknown`, which is what it is: nothing was checked.
|
|
140
|
+
*/
|
|
141
|
+
function integrityClause(status: CanonicalTrustStatus): string {
|
|
142
|
+
const retired = retiredIntegrityVersionOf(status.artifactIntegrity);
|
|
143
|
+
if (retired !== null) return `seal v${retired} retired (this build verifies v${RUN_RECEIPT_INTEGRITY_VERSION})`;
|
|
144
|
+
return trustStateWord("artifactIntegrity", status.artifactIntegrity.state);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* The validation clause names its claimant, because "grounded" alone hides
|
|
149
|
+
* the difference between a host-run check and a self-reported one.
|
|
150
|
+
*/
|
|
151
|
+
function validationClause(status: CanonicalTrustStatus): string {
|
|
152
|
+
const entry = status.validationGrounding;
|
|
153
|
+
const word = trustStateWord("validationGrounding", entry.state);
|
|
154
|
+
if (entry.state === "absent") return word;
|
|
155
|
+
if (entry.state === "validated" || entry.state === "failed") return `${word} by ${entry.authority.id}`;
|
|
156
|
+
// A named external system that could not observe the run is worth naming;
|
|
157
|
+
// the historical-format placeholder is not an authority anyone can ask.
|
|
158
|
+
if (entry.state === "unknown" && entry.authority.kind !== "unknown") return `${word} (${entry.authority.id})`;
|
|
159
|
+
return word;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** External runtimes name themselves on the autonomy clause so approximation is never anonymous. */
|
|
163
|
+
function autonomyClause(status: CanonicalTrustStatus): string {
|
|
164
|
+
const entry = status.autonomyEnforcement;
|
|
165
|
+
const word = trustStateWord("autonomyEnforcement", entry.state);
|
|
166
|
+
if (entry.state !== "approximated" && entry.state !== "bypassed") return word;
|
|
167
|
+
return `${word} (${entry.authority.id})`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* The compact human body. Clause order is fixed: integrity, validation with
|
|
172
|
+
* its claimant, independent review, autonomy, context, completion. Every
|
|
173
|
+
* surface prints this body verbatim, so two surfaces can only disagree by
|
|
174
|
+
* reading different canonical input.
|
|
175
|
+
*/
|
|
176
|
+
export function formatTrustSummary(status: CanonicalTrustStatus): string {
|
|
177
|
+
return [
|
|
178
|
+
integrityClause(status),
|
|
179
|
+
validationClause(status),
|
|
180
|
+
trustStateWord("independentReview", status.independentReview.state),
|
|
181
|
+
autonomyClause(status),
|
|
182
|
+
trustStateWord("contextProvenance", status.contextProvenance.state),
|
|
183
|
+
trustStateWord("completionEvidence", status.completionEvidence.state),
|
|
184
|
+
].join("; ");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** The tier and body under one versioned label for receipt-facing surfaces. */
|
|
188
|
+
export function formatTrustSummaryLine(status: CanonicalTrustStatus): string {
|
|
189
|
+
return `trust v${TRUST_SUMMARY_VERSION}: ${trustVerdict(status)}; ${formatTrustSummary(status)}`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The drill-down token line: every axis in canonical state ids. This is the
|
|
194
|
+
* one machine-readable text form; `evidence inspect` and the dispatch and
|
|
195
|
+
* monitor labels all print it from here.
|
|
196
|
+
*/
|
|
197
|
+
export function formatTrustAxes(status: CanonicalTrustStatus): string {
|
|
198
|
+
return [`trust_status=v${status.version}`, ...TRUST_STATUS_AXES.map((axis) => `${axis}:${status[axis].state}`)].join(
|
|
199
|
+
" ",
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function isUnanswered(status: CanonicalTrustStatus, axis: TrustStatusAxis): boolean {
|
|
204
|
+
const state = status[axis].state;
|
|
205
|
+
return state === "absent" || state === "unknown";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Read the tier off the axes in priority order. A broken seal, a bypassed
|
|
210
|
+
* gate, a failed or inferred validation, a failed or correlated review, or a
|
|
211
|
+
* contradictory context record compromises the result whatever else holds.
|
|
212
|
+
* An unchecked or missing seal leaves it unknown. Only an authenticated
|
|
213
|
+
* independent pass is `reviewed`; observed validation without one is
|
|
214
|
+
* `grounded`; a sealed receipt with nothing observed is `unverified`.
|
|
215
|
+
*/
|
|
216
|
+
export function trustVerdict(status: CanonicalTrustStatus): TrustVerdict {
|
|
217
|
+
const integrity = status.artifactIntegrity.state;
|
|
218
|
+
const validation = status.validationGrounding.state;
|
|
219
|
+
const review = status.independentReview.state;
|
|
220
|
+
const autonomy = status.autonomyEnforcement.state;
|
|
221
|
+
if (
|
|
222
|
+
integrity === "failed" ||
|
|
223
|
+
autonomy === "bypassed" ||
|
|
224
|
+
validation === "failed" ||
|
|
225
|
+
validation === "ungrounded" ||
|
|
226
|
+
review === "failed" ||
|
|
227
|
+
review === "not_independent" ||
|
|
228
|
+
status.contextProvenance.state === "invalid"
|
|
229
|
+
) {
|
|
230
|
+
return "compromised";
|
|
231
|
+
}
|
|
232
|
+
if (integrity !== "verified") return "unknown";
|
|
233
|
+
if (review === "passed") return "reviewed";
|
|
234
|
+
if (validation === "validated") return "grounded";
|
|
235
|
+
return "unverified";
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function claimantOf(status: CanonicalTrustStatus): string {
|
|
239
|
+
const state = status.validationGrounding.state;
|
|
240
|
+
if (state === "absent" || state === "ungrounded") return "worker";
|
|
241
|
+
return authorityOf(status, "validationGrounding") ?? "worker";
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function referenceKey(reference: TrustArtifactReference): string {
|
|
245
|
+
return `${reference.kind}:${reference.id}`;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Every artifact the axes cite, as bounded pointers a consumer can resolve. */
|
|
249
|
+
export function trustSummaryReferences(status: CanonicalTrustStatus): string[] {
|
|
250
|
+
const keys = new Set<string>();
|
|
251
|
+
for (const axis of TRUST_STATUS_AXES) {
|
|
252
|
+
const entry = status[axis];
|
|
253
|
+
if (entry.state === "absent") continue;
|
|
254
|
+
for (const reference of entry.artifacts) keys.add(referenceKey(reference));
|
|
255
|
+
}
|
|
256
|
+
return [...keys].sort().slice(0, TRUST_SUMMARY_MAX_REFS);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** The bounded machine projection. Flat by design so a depth-capped wire keeps it whole. */
|
|
260
|
+
export function summarizeTrustStatus(status: CanonicalTrustStatus): TrustSummaryProjection {
|
|
261
|
+
const axes = Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, status[axis].state])) as Record<
|
|
262
|
+
TrustStatusAxis,
|
|
263
|
+
string
|
|
264
|
+
>;
|
|
265
|
+
return {
|
|
266
|
+
version: TRUST_SUMMARY_VERSION,
|
|
267
|
+
verdict: trustVerdict(status),
|
|
268
|
+
text: formatTrustSummary(status),
|
|
269
|
+
axes,
|
|
270
|
+
claimant: claimantOf(status),
|
|
271
|
+
unknown: TRUST_STATUS_AXES.filter((axis) => isUnanswered(status, axis)),
|
|
272
|
+
refs: trustSummaryReferences(status),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { GateDecisionArtifact, GateDecisionVerification } from "../dispatch/gate-decisions.js";
|
|
2
|
-
import {
|
|
2
|
+
import { RUN_RECEIPT_INTEGRITY_VERSION, verifyReceiptIntegrity } from "../dispatch/receipt-integrity.js";
|
|
3
3
|
import type {
|
|
4
4
|
RunBriefingProvenance,
|
|
5
5
|
RunEnvelope,
|
|
@@ -459,13 +459,89 @@ function compatibilitySource(receipt: PersistedRunReceiptTrustFacts, field: stri
|
|
|
459
459
|
const DISPATCH_AUTHORITY: TrustStatusAuthority = { kind: "clio", id: "dispatch" };
|
|
460
460
|
const COMPATIBILITY_AUTHORITY: TrustStatusAuthority = { kind: "unknown", id: "historical-persisted-format" };
|
|
461
461
|
|
|
462
|
+
/**
|
|
463
|
+
* A receipt sealed under an integrity version this build no longer verifies.
|
|
464
|
+
* It is not migrated and not read as evidence, on the same terms as every
|
|
465
|
+
* prior integrity bump, but it is not a tampered receipt either: nothing was
|
|
466
|
+
* checked, so nothing failed. The outcome names both versions so an operator
|
|
467
|
+
* with a store full of last release's runs can tell a retired seal from a
|
|
468
|
+
* broken one.
|
|
469
|
+
*/
|
|
470
|
+
export interface RetiredReceiptIntegrity {
|
|
471
|
+
receiptVersion: number;
|
|
472
|
+
supportedVersion: number;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* The dispatch verifier's result, widened with the retired-format diagnosis
|
|
477
|
+
* this module puts in front of it. A failure without `retired` is the
|
|
478
|
+
* verifier's own verdict: a malformed seal, a ledger mismatch, or a digest
|
|
479
|
+
* that does not match the receipt's contents.
|
|
480
|
+
*/
|
|
481
|
+
export type ReceiptIntegrityOutcome = { ok: true } | { ok: false; reason: string; retired?: RetiredReceiptIntegrity };
|
|
482
|
+
|
|
483
|
+
/** The retired-version diagnosis for a receipt's integrity block, or null when the block is current or unreadable. */
|
|
484
|
+
export function retiredReceiptIntegrity(integrity: unknown): RetiredReceiptIntegrity | null {
|
|
485
|
+
if (!isRecord(integrity)) return null;
|
|
486
|
+
const version = integrity.version;
|
|
487
|
+
if (typeof version !== "number" || !Number.isInteger(version) || version < 1) return null;
|
|
488
|
+
if (version >= RUN_RECEIPT_INTEGRITY_VERSION) return null;
|
|
489
|
+
return { receiptVersion: version, supportedVersion: RUN_RECEIPT_INTEGRITY_VERSION };
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** The one sentence every surface prints for a retired seal. It never calls the receipt invalid, broken, or corrupt. */
|
|
493
|
+
export function retiredReceiptIntegrityReason(retired: RetiredReceiptIntegrity): string {
|
|
494
|
+
return `receipt integrity v${retired.receiptVersion} is retired; this build verifies v${retired.supportedVersion}; the receipt is not read as evidence`;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Verify a receipt against its ledger row, diagnosing a retired seal before
|
|
499
|
+
* the verifier can report it as a malformed one. Every trust-bearing
|
|
500
|
+
* verification goes through here so the CLI, the bundle, and the TUI receipt
|
|
501
|
+
* view agree on what a retired receipt is.
|
|
502
|
+
*/
|
|
503
|
+
export function verifyReceiptIntegrityOutcome(receipt: RunReceipt, envelope: RunEnvelope): ReceiptIntegrityOutcome {
|
|
504
|
+
const retired = retiredReceiptIntegrity(receipt.integrity);
|
|
505
|
+
if (retired !== null) return { ok: false, reason: retiredReceiptIntegrityReason(retired), retired };
|
|
506
|
+
return verifyReceiptIntegrity(receipt, envelope);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const RETIRED_INTEGRITY_SOURCE = /:integrity-v(\d+)-retired$/u;
|
|
510
|
+
|
|
511
|
+
function retiredIntegritySourceId(runId: string, receiptVersion: number): string {
|
|
512
|
+
return `run_receipt:${runId}:integrity-v${receiptVersion}-retired`;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* The retired integrity version a projected artifact-integrity axis names, or
|
|
517
|
+
* null when the axis says something else. The compatibility source id is the
|
|
518
|
+
* only place the persisted projection carries the version, so the human clause
|
|
519
|
+
* reads it back from there rather than from the receipt.
|
|
520
|
+
*/
|
|
521
|
+
export function retiredIntegrityVersionOf(status: ArtifactIntegrityStatus): number | null {
|
|
522
|
+
if (status.state !== "unknown" || status.source.kind !== "compatibility") return null;
|
|
523
|
+
const match = RETIRED_INTEGRITY_SOURCE.exec(status.source.id);
|
|
524
|
+
return match === null ? null : Number(match[1]);
|
|
525
|
+
}
|
|
526
|
+
|
|
462
527
|
/** Adapt receipt integrity verification without reading any receipt claim as self-authenticating. */
|
|
463
528
|
export function adaptReceiptIntegrityStatus(
|
|
464
529
|
receipt: PersistedRunReceiptTrustFacts | null | undefined,
|
|
465
|
-
verification?:
|
|
530
|
+
verification?: ReceiptIntegrityOutcome,
|
|
466
531
|
): ArtifactIntegrityStatus {
|
|
467
532
|
if (receipt === null || receipt === undefined) return absentTrustStatus("artifact_missing");
|
|
468
533
|
const artifacts = [receiptReference(receipt)];
|
|
534
|
+
// A retired seal was never checked, so the axis is unknown rather than
|
|
535
|
+
// failed, and the compatibility source names the version it was sealed
|
|
536
|
+
// under. `failed` stays reserved for a seal this build verified and rejected.
|
|
537
|
+
if (verification !== undefined && !verification.ok && verification.retired !== undefined) {
|
|
538
|
+
return attributed(
|
|
539
|
+
"unknown",
|
|
540
|
+
{ kind: "compatibility", id: retiredIntegritySourceId(receipt.runId, verification.retired.receiptVersion) },
|
|
541
|
+
COMPATIBILITY_AUTHORITY,
|
|
542
|
+
artifacts,
|
|
543
|
+
);
|
|
544
|
+
}
|
|
469
545
|
if (verification === undefined || (verification.ok && receipt.integrity === undefined)) {
|
|
470
546
|
return attributed(
|
|
471
547
|
"unknown",
|
|
@@ -576,15 +652,46 @@ function validBoundedProjectContext(context: RunProjectContextProvenance): boole
|
|
|
576
652
|
);
|
|
577
653
|
}
|
|
578
654
|
|
|
655
|
+
/**
|
|
656
|
+
* The one structured message a `none`-tier run can still receive. The tier is
|
|
657
|
+
* the CLIO-CODER.md handbook policy; the workspace-root message is sent
|
|
658
|
+
* regardless of it, and the producer records the characters and hash of
|
|
659
|
+
* every structured message it sent (`projectContextProvenanceFor` in the
|
|
660
|
+
* dispatch extension). A none-tier block naming exactly this section, with
|
|
661
|
+
* a well-formed count and hash, is therefore a consistent record of a real
|
|
662
|
+
* message, not a contradiction. Anything else under a none tier cannot be
|
|
663
|
+
* explained by the policy: a handbook section the policy forbids, a hash
|
|
664
|
+
* with no section to hash, or a malformed count.
|
|
665
|
+
*/
|
|
666
|
+
const NONE_TIER_SECTIONS: ReadonlyArray<string> = ["workspace-root"];
|
|
667
|
+
|
|
668
|
+
function validNoneTierProjectContext(context: RunProjectContextProvenance): boolean {
|
|
669
|
+
return (
|
|
670
|
+
context.tier === "none" &&
|
|
671
|
+
context.sections !== undefined &&
|
|
672
|
+
context.sections.length === NONE_TIER_SECTIONS.length &&
|
|
673
|
+
context.sections.every((section) => NONE_TIER_SECTIONS.includes(section)) &&
|
|
674
|
+
Number.isSafeInteger(context.chars) &&
|
|
675
|
+
(context.chars ?? -1) >= 0 &&
|
|
676
|
+
typeof context.contentHash === "string" &&
|
|
677
|
+
/^[a-f0-9]{64}$/u.test(context.contentHash)
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
function recordedProjectContextHash(context: RunProjectContextProvenance | undefined): string | undefined {
|
|
682
|
+
if (context === undefined) return undefined;
|
|
683
|
+
if (context.tier === "bounded") return validBoundedProjectContext(context) ? context.contentHash : undefined;
|
|
684
|
+
return validNoneTierProjectContext(context) ? context.contentHash : undefined;
|
|
685
|
+
}
|
|
686
|
+
|
|
579
687
|
function contextArtifacts(receipt: PersistedRunReceiptTrustFacts): TrustArtifactReference[] {
|
|
580
688
|
const artifacts = [receiptReference(receipt)];
|
|
581
689
|
if (receipt.briefing !== undefined && validBriefing(receipt.briefing)) {
|
|
582
690
|
artifacts.push(sha256Reference("briefing", `${receipt.runId}:briefing`, receipt.briefing.contentHash));
|
|
583
691
|
}
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
);
|
|
692
|
+
const recordedHash = recordedProjectContextHash(receipt.projectContext);
|
|
693
|
+
if (recordedHash !== undefined) {
|
|
694
|
+
artifacts.push(sha256Reference("project_context", `${receipt.runId}:project-context`, recordedHash));
|
|
588
695
|
}
|
|
589
696
|
return uniqueBoundedReferences(artifacts);
|
|
590
697
|
}
|
|
@@ -604,12 +711,23 @@ export function adaptRunReceiptContextStatus(
|
|
|
604
711
|
return attributed("unknown", compatibilitySource(receipt, "projectContext"), COMPATIBILITY_AUTHORITY, artifacts);
|
|
605
712
|
}
|
|
606
713
|
if (context.tier === "none") {
|
|
607
|
-
|
|
608
|
-
|
|
714
|
+
const bare = context.chars === undefined && context.contentHash === undefined && context.sections === undefined;
|
|
715
|
+
if (bare) {
|
|
716
|
+
// Nothing structured was sent: the axis does not apply unless a
|
|
717
|
+
// briefing was recorded, which is context of its own.
|
|
718
|
+
return receipt.briefing === undefined
|
|
719
|
+
? attributed("not_applicable", source, DISPATCH_AUTHORITY, artifacts)
|
|
720
|
+
: attributed("recorded", source, DISPATCH_AUTHORITY, artifacts);
|
|
609
721
|
}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
722
|
+
// The workspace-root message is the one thing a none-tier run receives,
|
|
723
|
+
// and its record is valid; every other none-tier content shape is a
|
|
724
|
+
// record the policy cannot account for.
|
|
725
|
+
return attributed(
|
|
726
|
+
validNoneTierProjectContext(context) ? "recorded" : "invalid",
|
|
727
|
+
source,
|
|
728
|
+
DISPATCH_AUTHORITY,
|
|
729
|
+
artifacts,
|
|
730
|
+
);
|
|
613
731
|
}
|
|
614
732
|
return attributed(validBoundedProjectContext(context) ? "recorded" : "invalid", source, DISPATCH_AUTHORITY, artifacts);
|
|
615
733
|
}
|
|
@@ -639,18 +757,19 @@ export function adaptRunReceiptAutonomyStatus(
|
|
|
639
757
|
}
|
|
640
758
|
|
|
641
759
|
export interface AdaptRunReceiptTrustOptions {
|
|
642
|
-
integrity?:
|
|
760
|
+
integrity?: ReceiptIntegrityOutcome;
|
|
643
761
|
}
|
|
644
762
|
|
|
645
763
|
function receiptClaimsAreAuthenticated(
|
|
646
764
|
receipt: PersistedRunReceiptTrustFacts | null | undefined,
|
|
647
|
-
integrity:
|
|
765
|
+
integrity: ReceiptIntegrityOutcome | undefined,
|
|
648
766
|
): boolean {
|
|
649
767
|
return receipt?.integrity !== undefined && integrity?.ok === true;
|
|
650
768
|
}
|
|
651
769
|
|
|
652
770
|
function unauthenticatedReceiptProjection(
|
|
653
771
|
receipt: PersistedRunReceiptTrustFacts | null | undefined,
|
|
772
|
+
integrity: ReceiptIntegrityOutcome | undefined,
|
|
654
773
|
): TrustStatusProjection {
|
|
655
774
|
if (receipt === null || receipt === undefined) {
|
|
656
775
|
return {
|
|
@@ -682,6 +801,15 @@ function unauthenticatedReceiptProjection(
|
|
|
682
801
|
),
|
|
683
802
|
};
|
|
684
803
|
}
|
|
804
|
+
// A retired seal leaves the receipt unread rather than rejected: its axes
|
|
805
|
+
// are absent because the format is historical, not because a check failed.
|
|
806
|
+
if (integrity !== undefined && !integrity.ok && integrity.retired !== undefined) {
|
|
807
|
+
return {
|
|
808
|
+
validationGrounding: absentTrustStatus("historical_format"),
|
|
809
|
+
contextProvenance: absentTrustStatus("historical_format"),
|
|
810
|
+
autonomyEnforcement: absentTrustStatus("historical_format"),
|
|
811
|
+
};
|
|
812
|
+
}
|
|
685
813
|
// The artifact-integrity axis retains the failure diagnostic. No other
|
|
686
814
|
// axis reads a field from a receipt that failed authentication.
|
|
687
815
|
return {
|
|
@@ -703,7 +831,7 @@ export function adaptRunReceiptTrustStatus(
|
|
|
703
831
|
contextProvenance: adaptRunReceiptContextStatus(receipt),
|
|
704
832
|
autonomyEnforcement: adaptRunReceiptAutonomyStatus(receipt),
|
|
705
833
|
}
|
|
706
|
-
: unauthenticatedReceiptProjection(receipt);
|
|
834
|
+
: unauthenticatedReceiptProjection(receipt, options.integrity);
|
|
707
835
|
return composeTrustStatus({
|
|
708
836
|
artifactIntegrity: adaptReceiptIntegrityStatus(receipt, options.integrity),
|
|
709
837
|
...receiptProjection,
|
|
@@ -715,7 +843,7 @@ export function adaptRunReceiptTrustStatus(
|
|
|
715
843
|
}
|
|
716
844
|
|
|
717
845
|
export interface RunReceiptTrustInspection {
|
|
718
|
-
integrity:
|
|
846
|
+
integrity: ReceiptIntegrityOutcome;
|
|
719
847
|
status: CanonicalTrustStatus;
|
|
720
848
|
}
|
|
721
849
|
|
|
@@ -728,14 +856,14 @@ export function inspectRunReceiptTrustStatus(
|
|
|
728
856
|
receipt: RunReceipt | null | undefined,
|
|
729
857
|
envelope: RunEnvelope | null | undefined,
|
|
730
858
|
): RunReceiptTrustInspection {
|
|
731
|
-
let integrity:
|
|
859
|
+
let integrity: ReceiptIntegrityOutcome;
|
|
732
860
|
if (receipt === null || receipt === undefined) {
|
|
733
861
|
integrity = { ok: false, reason: "receipt unavailable" };
|
|
734
862
|
} else if (envelope === null || envelope === undefined) {
|
|
735
863
|
integrity = { ok: false, reason: "run ledger envelope unavailable" };
|
|
736
864
|
} else {
|
|
737
865
|
try {
|
|
738
|
-
integrity =
|
|
866
|
+
integrity = verifyReceiptIntegrityOutcome(receipt, envelope);
|
|
739
867
|
} catch (error) {
|
|
740
868
|
integrity = {
|
|
741
869
|
ok: false,
|
|
@@ -23,7 +23,11 @@ export const EVIDENCE_TAGS = [
|
|
|
23
23
|
"escalation",
|
|
24
24
|
"external-bypass",
|
|
25
25
|
"external-approximation",
|
|
26
|
+
"independent-review",
|
|
27
|
+
"context-provenance",
|
|
28
|
+
"completion-evidence",
|
|
26
29
|
"receipt-integrity",
|
|
30
|
+
"receipt-retired",
|
|
27
31
|
"protected-artifact",
|
|
28
32
|
"tool-loop",
|
|
29
33
|
"test-failure",
|