@iowarp/clio-coder 0.3.9 → 0.4.1
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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/response-schema.ts +44 -4
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +24 -27
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of the eval reports this installation stored.
|
|
3
|
+
*
|
|
4
|
+
* Neither existing read works as a transport. `eval report <evalId>` and
|
|
5
|
+
* `eval compare <a> <b>` both require the operator to already name the reports
|
|
6
|
+
* they want, and nothing enumerated the store, so a GUI host had nowhere to
|
|
7
|
+
* start. This command accepts no identifier, no path, and no limit; it selects
|
|
8
|
+
* a bounded newest-first window itself and emits each report's identity,
|
|
9
|
+
* provenance, serving facts, accounting, and per-scenario outcome counts.
|
|
10
|
+
*
|
|
11
|
+
* An eval artifact is the largest single host-only payload in this harness, and
|
|
12
|
+
* the reason is worth stating rather than discovering. `results[].artifacts`
|
|
13
|
+
* holds whatever the runner attached, which for the `clio-coder-run` runner is the
|
|
14
|
+
* entire session transcript: the operator's task text, every tool argument and
|
|
15
|
+
* result, the model's replies, provider endpoint URLs, error prose, and the
|
|
16
|
+
* prepared workspace path. There is no width at which a projection of that is
|
|
17
|
+
* safe, so it does not cross at any width and its per-report count crosses
|
|
18
|
+
* instead. That is the same class as a trace event's payload and a process
|
|
19
|
+
* command line, and it is why this read is a summary rather than a viewer.
|
|
20
|
+
*
|
|
21
|
+
* Held back for the same reason or the next one down: the eval entry path, the
|
|
22
|
+
* per-result metric map (open-keyed, and its string values include content
|
|
23
|
+
* hashes and a workspace's own structural digest), the compiled prompt hash,
|
|
24
|
+
* the suite hash, the terminal receipt digests, and the behavioral judge's
|
|
25
|
+
* facts and excerpts. What crosses instead is how many of each there are, and
|
|
26
|
+
* the closed vocabularies the harness mints itself.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { clioDataDir } from "../core/xdg.js";
|
|
30
|
+
import { listEvalReports } from "../domains/eval/inventory.js";
|
|
31
|
+
import type { EvalArtifactResultV4, EvalArtifactV4 } from "../domains/eval/schema/artifact.js";
|
|
32
|
+
import { EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 } from "../domains/eval/schema/execution-envelope.js";
|
|
33
|
+
import { evalServingConfigurationOf, sameEvalServingConfiguration } from "../domains/eval/schema/serving.js";
|
|
34
|
+
import { CANONICAL_METRIC_PREFIXES, CANONICAL_METRICS } from "../domains/eval/schema/suite.js";
|
|
35
|
+
|
|
36
|
+
/** Wire bound on the report window. */
|
|
37
|
+
export const EVAL_INVENTORY_MAX_REPORTS = 8;
|
|
38
|
+
/** Wire bound on each report's per-scenario roll-up. */
|
|
39
|
+
export const EVAL_INVENTORY_MAX_SCENARIOS = 16;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Every failure class the suite runner mints, and nothing else.
|
|
43
|
+
*
|
|
44
|
+
* The legacy v1 runner also has `timeout` and `cwd_missing`, and they are
|
|
45
|
+
* deliberately absent: routing accepts artifact v4 only, so this read can never
|
|
46
|
+
* emit them and carrying them would state a distinction it never establishes.
|
|
47
|
+
*/
|
|
48
|
+
const FAILURE_CLASSES = [
|
|
49
|
+
"budget_exhausted",
|
|
50
|
+
"runner_failed",
|
|
51
|
+
"grader_failed",
|
|
52
|
+
"verifier_failed",
|
|
53
|
+
"forbidden_path",
|
|
54
|
+
"assertion_unresolved",
|
|
55
|
+
"assertion_failed",
|
|
56
|
+
"setup_failed",
|
|
57
|
+
"command_error",
|
|
58
|
+
] as const;
|
|
59
|
+
|
|
60
|
+
/** A class outside the set is a real answer: the result still failed, and the operator still learns that. */
|
|
61
|
+
type EvalInventoryFailureClass = (typeof FAILURE_CLASSES)[number] | "other";
|
|
62
|
+
|
|
63
|
+
const REPORTED_FAILURE_CLASSES: readonly EvalInventoryFailureClass[] = [...FAILURE_CLASSES, "other"];
|
|
64
|
+
|
|
65
|
+
const BEHAVIOR_OUTCOMES = ["pass", "behavioral_failure", "unknown", "unmeasured", "infrastructure_failure"] as const;
|
|
66
|
+
type EvalInventoryBehaviorOutcome = (typeof BEHAVIOR_OUTCOMES)[number];
|
|
67
|
+
|
|
68
|
+
const IDENTIFIER_PATTERN = /^[A-Za-z0-9._-]{1,128}$/u;
|
|
69
|
+
const VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/u;
|
|
70
|
+
const COMMIT_PATTERN = /^[0-9a-f]{7,64}$/u;
|
|
71
|
+
|
|
72
|
+
export interface EvalInventoryTokens {
|
|
73
|
+
/** False when no run reported provider usage. The counts are then absent rather than zero. */
|
|
74
|
+
readonly measured: boolean;
|
|
75
|
+
readonly runs: number;
|
|
76
|
+
readonly measuredRuns: number;
|
|
77
|
+
readonly input: number | null;
|
|
78
|
+
readonly output: number | null;
|
|
79
|
+
readonly total: number | null;
|
|
80
|
+
readonly cacheRead: number | null;
|
|
81
|
+
readonly cacheWrite: number | null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface EvalInventoryScenario {
|
|
85
|
+
readonly scenarioId: string;
|
|
86
|
+
readonly trials: number;
|
|
87
|
+
readonly passed: number;
|
|
88
|
+
readonly failed: number;
|
|
89
|
+
readonly unmeasured: number;
|
|
90
|
+
readonly machineryFailures: number;
|
|
91
|
+
readonly passAtK: number;
|
|
92
|
+
readonly passPowK: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface EvalInventoryReport {
|
|
96
|
+
readonly evalId: string;
|
|
97
|
+
readonly startedAt: string | null;
|
|
98
|
+
readonly suiteId: string;
|
|
99
|
+
/**
|
|
100
|
+
* A 1-based ordinal over `sameEvalServingConfiguration`, the rule `eval
|
|
101
|
+
* compare` itself uses to decide two runs are comparable.
|
|
102
|
+
*
|
|
103
|
+
* The fields that rule compares include the compiled prompt hash, which is a
|
|
104
|
+
* fingerprint and does not cross. The relation it establishes does: two
|
|
105
|
+
* reports sharing an ordinal are two `eval compare` will accept without
|
|
106
|
+
* `--allow-config-drift`, which is the fact an operator picking a baseline
|
|
107
|
+
* needs, and the ordinal reveals nothing about the values behind it.
|
|
108
|
+
*/
|
|
109
|
+
readonly servingGroup: number;
|
|
110
|
+
readonly clioCoderVersion: string | null;
|
|
111
|
+
readonly clioCoderCommit: string | null;
|
|
112
|
+
readonly platform: string | null;
|
|
113
|
+
readonly node: string | null;
|
|
114
|
+
readonly matrix: {
|
|
115
|
+
readonly target: string | null;
|
|
116
|
+
readonly model: string | null;
|
|
117
|
+
readonly thinking: string | null;
|
|
118
|
+
readonly dimensions: readonly string[];
|
|
119
|
+
};
|
|
120
|
+
readonly serving: {
|
|
121
|
+
/** False when the artifact recorded none and the matrix it declared is standing in. */
|
|
122
|
+
readonly observed: boolean;
|
|
123
|
+
readonly targetId: string | null;
|
|
124
|
+
readonly runtimeId: string | null;
|
|
125
|
+
readonly modelId: string | null;
|
|
126
|
+
readonly serverBuild: string | null;
|
|
127
|
+
readonly thinkingLevel: string | null;
|
|
128
|
+
readonly totalSlots: number | null;
|
|
129
|
+
/** Whether a compiled prompt hash was recorded. The hash itself stays on the host. */
|
|
130
|
+
readonly compiledPromptPinned: boolean;
|
|
131
|
+
};
|
|
132
|
+
readonly summary: {
|
|
133
|
+
readonly runs: number;
|
|
134
|
+
readonly passed: number;
|
|
135
|
+
readonly failed: number;
|
|
136
|
+
readonly passRate: number;
|
|
137
|
+
readonly wallTimeMs: number;
|
|
138
|
+
readonly tokens: EvalInventoryTokens;
|
|
139
|
+
};
|
|
140
|
+
readonly results: {
|
|
141
|
+
readonly total: number;
|
|
142
|
+
readonly withAssignment: number;
|
|
143
|
+
readonly withTerminalReceipt: number;
|
|
144
|
+
readonly withVerdict: number;
|
|
145
|
+
readonly withBehavioral: number;
|
|
146
|
+
readonly withExecutionEnvelope: number;
|
|
147
|
+
readonly machineryFailures: number;
|
|
148
|
+
/** Runner attachments across the report. Their contents are host-only at any width. */
|
|
149
|
+
readonly attachments: number;
|
|
150
|
+
/** Metric readings whose name the suite schema declares, and readings whose name it does not. */
|
|
151
|
+
readonly canonicalMetrics: number;
|
|
152
|
+
readonly otherMetrics: number;
|
|
153
|
+
};
|
|
154
|
+
readonly failureClasses: readonly { readonly failureClass: EvalInventoryFailureClass; readonly count: number }[];
|
|
155
|
+
readonly behaviorOutcomes: readonly {
|
|
156
|
+
readonly outcome: EvalInventoryBehaviorOutcome;
|
|
157
|
+
readonly count: number;
|
|
158
|
+
}[];
|
|
159
|
+
/** Null when the artifact carried no scenario reductions at all, which is not the same as carrying none. */
|
|
160
|
+
readonly scenarios: readonly EvalInventoryScenario[] | null;
|
|
161
|
+
readonly scenariosTruncated: boolean;
|
|
162
|
+
/** Reductions refused because their own counts did not add up, counted rather than hidden. */
|
|
163
|
+
readonly scenariosDropped: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface EvalInventorySnapshot {
|
|
167
|
+
readonly version: 1;
|
|
168
|
+
readonly generatedAt: string;
|
|
169
|
+
readonly available: boolean;
|
|
170
|
+
readonly stored: number;
|
|
171
|
+
readonly unreadable: number;
|
|
172
|
+
readonly reports: readonly EvalInventoryReport[];
|
|
173
|
+
readonly truncated: boolean;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const CANONICAL_METRIC_NAMES: ReadonlySet<string> = new Set(CANONICAL_METRICS);
|
|
177
|
+
|
|
178
|
+
function isCanonicalMetric(name: string): boolean {
|
|
179
|
+
return CANONICAL_METRIC_NAMES.has(name) || CANONICAL_METRIC_PREFIXES.some((prefix) => name.startsWith(prefix));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function identifier(value: string | null): string | null {
|
|
183
|
+
return value !== null && IDENTIFIER_PATTERN.test(value) ? value : null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function tally(value: unknown): number {
|
|
187
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
191
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* `parseEvalArtifactV4` casts the aggregates array through without checking its
|
|
196
|
+
* entries, so this is the first thing that looks at them. A scenario whose id
|
|
197
|
+
* or counts are not what the reducer produces is dropped rather than repaired:
|
|
198
|
+
* a scenario roll-up is a derived number, and a wrong one is worse than a
|
|
199
|
+
* missing one.
|
|
200
|
+
*/
|
|
201
|
+
function projectScenarios(artifact: EvalArtifactV4): {
|
|
202
|
+
scenarios: EvalInventoryScenario[] | null;
|
|
203
|
+
truncated: boolean;
|
|
204
|
+
dropped: number;
|
|
205
|
+
} {
|
|
206
|
+
if (artifact.aggregates === undefined) return { scenarios: null, truncated: false, dropped: 0 };
|
|
207
|
+
const projected: EvalInventoryScenario[] = [];
|
|
208
|
+
let dropped = 0;
|
|
209
|
+
for (const entry of artifact.aggregates) {
|
|
210
|
+
if (!isRecord(entry)) {
|
|
211
|
+
dropped += 1;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const scenarioId = identifier(typeof entry.scenarioId === "string" ? entry.scenarioId : null);
|
|
215
|
+
if (scenarioId === null) {
|
|
216
|
+
dropped += 1;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const trials = tally(entry.trials);
|
|
220
|
+
const passed = tally(entry.passed);
|
|
221
|
+
const failed = tally(entry.failed);
|
|
222
|
+
const unmeasured = tally(entry.unmeasured);
|
|
223
|
+
const machineryFailures = tally(entry.machineryFailures);
|
|
224
|
+
// The reducer partitions one scenario's trials into exactly three outcomes
|
|
225
|
+
// and counts machinery failures inside them, so anything else did not come
|
|
226
|
+
// out of `aggregateEvalVerdicts`. It is counted rather than hidden, because
|
|
227
|
+
// a scenario list that looks whole while a reduction was refused would let
|
|
228
|
+
// the wire cross-check read as satisfied.
|
|
229
|
+
if (passed + failed + unmeasured !== trials || machineryFailures > failed) {
|
|
230
|
+
dropped += 1;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
projected.push({
|
|
234
|
+
scenarioId,
|
|
235
|
+
trials,
|
|
236
|
+
passed,
|
|
237
|
+
failed,
|
|
238
|
+
unmeasured,
|
|
239
|
+
machineryFailures,
|
|
240
|
+
// Re-derived rather than read, because both are pure functions of the
|
|
241
|
+
// counts beside them and a stored disagreement is not a second opinion.
|
|
242
|
+
passAtK: trials > 0 && passed > 0 ? 1 : 0,
|
|
243
|
+
passPowK: trials > 0 && passed === trials ? 1 : 0,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const scenarios = projected.slice(0, EVAL_INVENTORY_MAX_SCENARIOS);
|
|
247
|
+
return { scenarios, truncated: scenarios.length < projected.length, dropped };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function projectTokens(artifact: EvalArtifactV4): EvalInventoryTokens {
|
|
251
|
+
const tokens = artifact.summary.tokens;
|
|
252
|
+
if (!tokens.measured) {
|
|
253
|
+
return {
|
|
254
|
+
measured: false,
|
|
255
|
+
runs: tally(tokens.runs),
|
|
256
|
+
measuredRuns: 0,
|
|
257
|
+
input: null,
|
|
258
|
+
output: null,
|
|
259
|
+
total: null,
|
|
260
|
+
cacheRead: null,
|
|
261
|
+
cacheWrite: null,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
measured: true,
|
|
266
|
+
runs: tally(tokens.runs),
|
|
267
|
+
measuredRuns: tally(tokens.measuredRuns),
|
|
268
|
+
input: tally(tokens.input),
|
|
269
|
+
output: tally(tokens.output),
|
|
270
|
+
total: tally(tokens.total),
|
|
271
|
+
cacheRead: tally(tokens.cacheRead),
|
|
272
|
+
cacheWrite: tally(tokens.cacheWrite),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function classifyFailure(failureClass: string | null): EvalInventoryFailureClass | null {
|
|
277
|
+
if (failureClass === null) return null;
|
|
278
|
+
return (FAILURE_CLASSES as readonly string[]).includes(failureClass)
|
|
279
|
+
? (failureClass as EvalInventoryFailureClass)
|
|
280
|
+
: "other";
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function countResults(results: readonly EvalArtifactResultV4[]): {
|
|
284
|
+
counts: EvalInventoryReport["results"];
|
|
285
|
+
failureClasses: EvalInventoryReport["failureClasses"];
|
|
286
|
+
behaviorOutcomes: EvalInventoryReport["behaviorOutcomes"];
|
|
287
|
+
} {
|
|
288
|
+
let withAssignment = 0;
|
|
289
|
+
let withTerminalReceipt = 0;
|
|
290
|
+
let withVerdict = 0;
|
|
291
|
+
let withBehavioral = 0;
|
|
292
|
+
let withExecutionEnvelope = 0;
|
|
293
|
+
let machineryFailures = 0;
|
|
294
|
+
let attachments = 0;
|
|
295
|
+
let canonicalMetrics = 0;
|
|
296
|
+
let otherMetrics = 0;
|
|
297
|
+
const failures = new Map<EvalInventoryFailureClass, number>();
|
|
298
|
+
const outcomes = new Map<EvalInventoryBehaviorOutcome, number>();
|
|
299
|
+
for (const result of results) {
|
|
300
|
+
if (result.assignmentId !== null) withAssignment += 1;
|
|
301
|
+
if (result.terminalReceiptDigest !== null) withTerminalReceipt += 1;
|
|
302
|
+
if (result.verdict !== undefined) withVerdict += 1;
|
|
303
|
+
if (result.verdict?.machinery === "infrastructure_failure") machineryFailures += 1;
|
|
304
|
+
if (result.behavioral !== undefined) withBehavioral += 1;
|
|
305
|
+
if (result.executionEnvelope !== undefined) withExecutionEnvelope += 1;
|
|
306
|
+
attachments += Object.keys(result.artifacts).length;
|
|
307
|
+
for (const name of Object.keys(result.metrics)) {
|
|
308
|
+
if (isCanonicalMetric(name)) canonicalMetrics += 1;
|
|
309
|
+
else otherMetrics += 1;
|
|
310
|
+
}
|
|
311
|
+
const failureClass = classifyFailure(result.failureClass);
|
|
312
|
+
if (failureClass !== null) failures.set(failureClass, (failures.get(failureClass) ?? 0) + 1);
|
|
313
|
+
const outcome = result.behavioral?.outcome;
|
|
314
|
+
if (outcome !== undefined && (BEHAVIOR_OUTCOMES as readonly string[]).includes(outcome)) {
|
|
315
|
+
outcomes.set(outcome, (outcomes.get(outcome) ?? 0) + 1);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
counts: {
|
|
320
|
+
total: results.length,
|
|
321
|
+
withAssignment,
|
|
322
|
+
withTerminalReceipt,
|
|
323
|
+
withVerdict,
|
|
324
|
+
withBehavioral,
|
|
325
|
+
withExecutionEnvelope,
|
|
326
|
+
machineryFailures,
|
|
327
|
+
attachments,
|
|
328
|
+
canonicalMetrics,
|
|
329
|
+
otherMetrics,
|
|
330
|
+
},
|
|
331
|
+
failureClasses: REPORTED_FAILURE_CLASSES.flatMap((failureClass) => {
|
|
332
|
+
const count = failures.get(failureClass) ?? 0;
|
|
333
|
+
return count === 0 ? [] : [{ failureClass, count }];
|
|
334
|
+
}),
|
|
335
|
+
behaviorOutcomes: BEHAVIOR_OUTCOMES.flatMap((outcome) => {
|
|
336
|
+
const count = outcomes.get(outcome) ?? 0;
|
|
337
|
+
return count === 0 ? [] : [{ outcome, count }];
|
|
338
|
+
}),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function projectReport(
|
|
343
|
+
evalId: string,
|
|
344
|
+
startedAt: string | null,
|
|
345
|
+
artifact: EvalArtifactV4,
|
|
346
|
+
servingGroup: number,
|
|
347
|
+
): EvalInventoryReport {
|
|
348
|
+
const serving = evalServingConfigurationOf(artifact);
|
|
349
|
+
const { counts, failureClasses, behaviorOutcomes } = countResults(artifact.results);
|
|
350
|
+
const { scenarios, truncated, dropped } = projectScenarios(artifact);
|
|
351
|
+
const version = artifact.clioCoder.version;
|
|
352
|
+
const commit = artifact.clioCoder.commit;
|
|
353
|
+
return {
|
|
354
|
+
evalId,
|
|
355
|
+
startedAt,
|
|
356
|
+
suiteId: identifier(artifact.suite.id) ?? "unavailable",
|
|
357
|
+
servingGroup,
|
|
358
|
+
clioCoderVersion: VERSION_PATTERN.test(version) ? version : null,
|
|
359
|
+
clioCoderCommit: commit !== null && COMMIT_PATTERN.test(commit) ? commit : null,
|
|
360
|
+
platform: identifier(artifact.environment.platform),
|
|
361
|
+
node: identifier(artifact.environment.node),
|
|
362
|
+
matrix: {
|
|
363
|
+
target: identifier(artifact.matrix.target),
|
|
364
|
+
model: identifier(artifact.matrix.model),
|
|
365
|
+
thinking: identifier(artifact.matrix.thinking),
|
|
366
|
+
dimensions: (artifact.matrix.dimensions ?? []).filter((dimension) =>
|
|
367
|
+
(EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 as readonly string[]).includes(dimension),
|
|
368
|
+
),
|
|
369
|
+
},
|
|
370
|
+
serving: {
|
|
371
|
+
observed: artifact.servingConfiguration !== undefined,
|
|
372
|
+
targetId: identifier(serving.targetId),
|
|
373
|
+
runtimeId: identifier(serving.runtimeId),
|
|
374
|
+
modelId: identifier(serving.modelId),
|
|
375
|
+
serverBuild: identifier(serving.serverBuild),
|
|
376
|
+
thinkingLevel: identifier(serving.thinkingLevel),
|
|
377
|
+
totalSlots: serving.total_slots === null ? null : tally(serving.total_slots),
|
|
378
|
+
compiledPromptPinned: serving.compiledPromptHash !== null,
|
|
379
|
+
},
|
|
380
|
+
summary: {
|
|
381
|
+
runs: tally(artifact.summary.runs),
|
|
382
|
+
passed: tally(artifact.summary.passed),
|
|
383
|
+
failed: tally(artifact.summary.failed),
|
|
384
|
+
passRate: Number.isFinite(artifact.summary.passRate) ? Math.min(1, Math.max(0, artifact.summary.passRate)) : 0,
|
|
385
|
+
wallTimeMs: tally(artifact.summary.wallTimeMs),
|
|
386
|
+
tokens: projectTokens(artifact),
|
|
387
|
+
},
|
|
388
|
+
results: counts,
|
|
389
|
+
failureClasses,
|
|
390
|
+
behaviorOutcomes,
|
|
391
|
+
scenarios,
|
|
392
|
+
scenariosTruncated: truncated,
|
|
393
|
+
scenariosDropped: dropped,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
async function evalInventorySnapshot(
|
|
398
|
+
now: () => number = Date.now,
|
|
399
|
+
dataDir: string = clioDataDir(),
|
|
400
|
+
): Promise<EvalInventorySnapshot> {
|
|
401
|
+
const listing = await listEvalReports(dataDir, EVAL_INVENTORY_MAX_REPORTS);
|
|
402
|
+
// One group per distinct serving configuration, numbered in the order the
|
|
403
|
+
// window meets them, so the newest report is always in group 1.
|
|
404
|
+
const groups: ReturnType<typeof evalServingConfigurationOf>[] = [];
|
|
405
|
+
const reports = listing.reports.map((stored) => {
|
|
406
|
+
const serving = evalServingConfigurationOf(stored.artifact);
|
|
407
|
+
let index = groups.findIndex((candidate) => sameEvalServingConfiguration(candidate, serving));
|
|
408
|
+
if (index === -1) index = groups.push(serving) - 1;
|
|
409
|
+
return projectReport(stored.evalId, stored.startedAt, stored.artifact, index + 1);
|
|
410
|
+
});
|
|
411
|
+
return {
|
|
412
|
+
version: 1,
|
|
413
|
+
generatedAt: new Date(now()).toISOString(),
|
|
414
|
+
available: listing.available,
|
|
415
|
+
stored: listing.stored,
|
|
416
|
+
unreadable: listing.unreadable,
|
|
417
|
+
reports,
|
|
418
|
+
truncated: listing.stored > listing.reports.length + listing.unreadable,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* `clio-coder eval inventory --json`, and nothing else.
|
|
424
|
+
*
|
|
425
|
+
* Anything but the exact argv is a usage error, so a GUI host starts this
|
|
426
|
+
* process knowing it cannot be steered into reading a different store, a wider
|
|
427
|
+
* window, or one named report.
|
|
428
|
+
*/
|
|
429
|
+
export async function runEvalInventory(args: ReadonlyArray<string>): Promise<number> {
|
|
430
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
431
|
+
process.stderr.write("clio-coder eval inventory: usage: clio-coder eval inventory --json\n");
|
|
432
|
+
return 2;
|
|
433
|
+
}
|
|
434
|
+
process.stdout.write(`${JSON.stringify(await evalInventorySnapshot(), null, 2)}\n`);
|
|
435
|
+
return 0;
|
|
436
|
+
}
|
package/src/cli/eval.ts
CHANGED
|
@@ -27,6 +27,13 @@ Commands:
|
|
|
27
27
|
clio-coder eval report <evalId> --format text|json|md|swe-jsonl|junit
|
|
28
28
|
clio-coder eval compare <baselineEvalId> <candidateEvalId> [--metric <name>] [--format text|json|md|junit] [--allow-config-drift]
|
|
29
29
|
clio-coder eval gate <candidateEvalId> --baseline <baselineEvalId> [--thresholds <file>]
|
|
30
|
+
clio-coder eval inventory --json
|
|
31
|
+
|
|
32
|
+
inventory is the fixed machine-readable read a GUI host may run. Unlike report
|
|
33
|
+
and compare it names no eval id, so the process it starts cannot be steered to a
|
|
34
|
+
different report or a wider window. It carries each stored report's identity,
|
|
35
|
+
provenance, serving facts, accounting, and per-scenario outcomes, and none of
|
|
36
|
+
the runner attachments a report holds.
|
|
30
37
|
`;
|
|
31
38
|
|
|
32
39
|
type EvalCommand = "validate" | "run" | "report" | "compare" | "gate";
|
|
@@ -194,6 +201,12 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
|
|
|
194
201
|
}
|
|
195
202
|
|
|
196
203
|
export async function runEvalCommand(args: ReadonlyArray<string>): Promise<number> {
|
|
204
|
+
// Routed before the shared parser so the fixed read stays exactly fixed: no
|
|
205
|
+
// eval flag can reach it, and no flag it does not name can be spent on it.
|
|
206
|
+
if (args[0] === "inventory") {
|
|
207
|
+
const { runEvalInventory } = await import("./eval-inventory.js");
|
|
208
|
+
return runEvalInventory(args.slice(1));
|
|
209
|
+
}
|
|
197
210
|
let parsed: ParsedEvalArgs;
|
|
198
211
|
try {
|
|
199
212
|
parsed = parseEvalArgs(args);
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of one evidence bundle's trust record.
|
|
3
|
+
*
|
|
4
|
+
* `evidence inspect <id>` prints an operator record that quotes the task text,
|
|
5
|
+
* the bundle's file list, and per-finding prose. This is the same bundle read
|
|
6
|
+
* down to the one thing a GUI can carry safely and usefully: which runs the
|
|
7
|
+
* bundle covers, what verdict each run earned, and which axis produced it.
|
|
8
|
+
*
|
|
9
|
+
* Every value here comes from a closed vocabulary. The axis names, the axis
|
|
10
|
+
* states, and the verdicts are all enumerations the harness owns, so there is
|
|
11
|
+
* no free-form text on this surface at all, which is what lets it answer the
|
|
12
|
+
* question the inventory raises without reopening the boundary the inventory
|
|
13
|
+
* closed.
|
|
14
|
+
*
|
|
15
|
+
* Unlike the other fixed reads this one takes an identifier, because an
|
|
16
|
+
* operator names the bundle. The GUI host may only pass back an id it served
|
|
17
|
+
* inside its current bounded window; see `apps/workbench/artifact-allowlist.ts`.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { clioDataDir } from "../core/xdg.js";
|
|
21
|
+
import {
|
|
22
|
+
inspectEvidence,
|
|
23
|
+
TRUST_STATUS_AXES,
|
|
24
|
+
type TrustStatusAxis,
|
|
25
|
+
type TrustVerdict,
|
|
26
|
+
trustVerdict,
|
|
27
|
+
} from "../domains/evidence/index.js";
|
|
28
|
+
|
|
29
|
+
export const EVIDENCE_DETAIL_MAX_RUNS = 16;
|
|
30
|
+
|
|
31
|
+
export interface EvidenceDetailRun {
|
|
32
|
+
readonly runId: string;
|
|
33
|
+
readonly verdict: TrustVerdict;
|
|
34
|
+
/** Every axis, always all six, so an absent axis is stated rather than missing. */
|
|
35
|
+
readonly axes: Readonly<Record<TrustStatusAxis, string>>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface EvidenceDetailSnapshot {
|
|
39
|
+
readonly version: 1;
|
|
40
|
+
readonly generatedAt: string;
|
|
41
|
+
readonly evidenceId: string;
|
|
42
|
+
readonly sourceKind: "run" | "session" | "eval";
|
|
43
|
+
/** False when the bundle predates the canonical trust projection. */
|
|
44
|
+
readonly canonical: boolean;
|
|
45
|
+
readonly runs: readonly EvidenceDetailRun[];
|
|
46
|
+
readonly runsTruncated: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function evidenceDetailSnapshot(
|
|
50
|
+
evidenceId: string,
|
|
51
|
+
now: () => number = Date.now,
|
|
52
|
+
dataDir: string = clioDataDir(),
|
|
53
|
+
): Promise<EvidenceDetailSnapshot> {
|
|
54
|
+
const inspected = await inspectEvidence(dataDir, evidenceId);
|
|
55
|
+
const all = inspected.trustStatus.runs;
|
|
56
|
+
const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
|
|
57
|
+
return {
|
|
58
|
+
version: 1,
|
|
59
|
+
generatedAt: new Date(now()).toISOString(),
|
|
60
|
+
evidenceId: inspected.overview.evidenceId,
|
|
61
|
+
sourceKind: inspected.overview.source.kind,
|
|
62
|
+
canonical: inspected.trustStatus.projection === "canonical",
|
|
63
|
+
runs: window.map(
|
|
64
|
+
(run): EvidenceDetailRun => ({
|
|
65
|
+
runId: run.runId,
|
|
66
|
+
verdict: trustVerdict(run.status),
|
|
67
|
+
axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
|
|
68
|
+
TrustStatusAxis,
|
|
69
|
+
string
|
|
70
|
+
>,
|
|
71
|
+
}),
|
|
72
|
+
),
|
|
73
|
+
runsTruncated: all.length > window.length,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* `clio-coder evidence inspect <id> --json`.
|
|
79
|
+
*
|
|
80
|
+
* The id is the only argument, and the caller supplies it. A GUI host is bound
|
|
81
|
+
* by its own allowlist rather than by this command, because an operator typing
|
|
82
|
+
* an id at a terminal is naming something on their own machine, which is a
|
|
83
|
+
* different act from a browser frame naming it.
|
|
84
|
+
*/
|
|
85
|
+
export async function runEvidenceDetail(evidenceId: string): Promise<number> {
|
|
86
|
+
process.stdout.write(`${JSON.stringify(await evidenceDetailSnapshot(evidenceId), null, 2)}\n`);
|
|
87
|
+
return 0;
|
|
88
|
+
}
|