@iowarp/clio-coder 0.4.1 → 0.4.2
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/CONTRIBUTING.md +59 -36
- package/README.md +404 -472
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-TMDQZDIG.js} +7 -7
- package/dist/{agents-HYWGBGQR.js → agents-5N5NG3XG.js} +28 -28
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-Z5CCBXKQ.js} +8 -9
- package/dist/{builtins-UJLMOVOV.js → builtins-K6TNDT24.js} +4 -4
- package/dist/{chunk-GVQJ5CCZ.js → chunk-2HFQNRV3.js} +7 -7
- package/dist/{chunk-QMXC4JB7.js → chunk-2NHR3NAY.js} +163 -1401
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-Y45G3AXC.js → chunk-2Z2IKEXI.js} +6 -10
- package/dist/{chunk-EIMVLWB3.js → chunk-34BHNEE3.js} +7 -3
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/{chunk-AP73CFDC.js → chunk-3KIPBMUA.js} +2 -2
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-VEGN6WIQ.js → chunk-462T4EGZ.js} +2 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-4JDLP6ZS.js} +33 -16
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/{chunk-AKB4GYDL.js → chunk-54ODD65L.js} +5 -5
- package/dist/{chunk-BBTJOK6Y.js → chunk-5KW52TEP.js} +3 -3
- package/dist/{chunk-6CCS4G3W.js → chunk-5PFYMY2V.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-7OBGU7UB.js → chunk-7BHIY2MW.js} +7 -13
- package/dist/{chunk-3QSOM6PA.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-B74PXLU7.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-R32CLGZ6.js → chunk-BO7Y52RY.js} +81 -20
- package/dist/{chunk-UEDMSP56.js → chunk-BYMNWQ7O.js} +123 -148
- package/dist/{chunk-ZJLUDYFY.js → chunk-CRFOIAX3.js} +4 -4
- package/dist/{chunk-2NM363SV.js → chunk-CYZW7JHJ.js} +7 -7
- package/dist/{chunk-6HMJX2VU.js → chunk-DYHAXKHD.js} +38 -10
- package/dist/{chunk-THYWACCR.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-FYUN5KZ3.js → chunk-DZEK6CJN.js} +17 -17
- package/dist/{chunk-3I5NY75V.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-VKFQTNDV.js → chunk-F2I26BDK.js} +4 -4
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-IXJT6DCX.js → chunk-FVDGR2ZL.js} +3 -3
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-7EPLI7VL.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/{chunk-E67WX76H.js → chunk-HKMD33FO.js} +29 -80
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-UAPGZHYC.js → chunk-I64IFBLB.js} +9 -2
- package/dist/{chunk-XKA2ICR3.js → chunk-I66ZTYNP.js} +440 -175
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-PVAMAVBB.js → chunk-IDNA72AH.js} +102 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-2VG7KLYV.js → chunk-IKSLQ4XV.js} +5460 -3241
- package/dist/{chunk-QKIFBZKT.js → chunk-IMXMHHMQ.js} +166 -25
- package/dist/{chunk-74YWRRU5.js → chunk-JBCS7CRR.js} +2 -2
- package/dist/{chunk-BDPT6GTK.js → chunk-JWJGP5DQ.js} +2 -2
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-ABLSQ6JX.js → chunk-LJID3DYZ.js} +7 -1
- package/dist/{chunk-VKRH2TCS.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-6I5ILFOF.js → chunk-M2WXEHER.js} +2 -2
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-N5UK64DP.js → chunk-MCMZMDAC.js} +2 -2
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-HUAS7ITX.js → chunk-O3YUNJZ2.js} +13 -21
- package/dist/{chunk-MA3H6DM5.js → chunk-P75RZCJW.js} +25 -3
- package/dist/{chunk-IG7BCQBA.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-6DWBAZ5U.js → chunk-Q4XWMHX6.js} +4 -6
- package/dist/{chunk-OJTRZGR3.js → chunk-QQLGQY2A.js} +8 -8
- package/dist/{chunk-J4HBWF6Y.js → chunk-RLYRBIYQ.js} +115 -20
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/{chunk-C537JADH.js → chunk-SSEYRH53.js} +6 -7
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-MOPSG2X7.js → chunk-TPEQIQIE.js} +6 -6
- package/dist/{chunk-JA5QWE4Z.js → chunk-UBRFI4HS.js} +1879 -1650
- package/dist/{chunk-BTGG6BG2.js → chunk-UH347SHR.js} +154 -15
- package/dist/{chunk-5YHDIDBP.js → chunk-UH632ZYL.js} +2 -2
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-UXN6JT4W.js → chunk-W4YEMFBX.js} +2 -2
- package/dist/{chunk-TD3PGPQA.js → chunk-W6NIE6OW.js} +2 -2
- package/dist/{chunk-TVH4ONAM.js → chunk-X7IARSHT.js} +3 -3
- package/dist/{chunk-PJJ6MY27.js → chunk-XE3PCIXH.js} +3 -3
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-SCYB3HA4.js → chunk-XOXV5GKE.js} +51 -16
- package/dist/{chunk-QTFGO774.js → chunk-XQRY4DTA.js} +24 -11
- package/dist/{chunk-BJGUKIG4.js → chunk-YJISEZKC.js} +2 -2
- package/dist/{chunk-GPPB3JBE.js → chunk-ZGNYYXQ6.js} +2 -2
- package/dist/{chunk-SINK3QR6.js → chunk-ZNT2M6TG.js} +7 -7
- package/dist/{chunk-7RY5VZPH.js → chunk-ZW4HH5JJ.js} +6 -6
- package/dist/cli/index.js +33 -32
- package/dist/{clio-IT3G3VQH.js → clio-7VB377CC.js} +7 -7
- package/dist/{code-nav-RK6S7F6E.js → code-nav-YVLCYA7V.js} +85 -17
- package/dist/{config-3QZRWZJF.js → config-4HVOS65E.js} +88 -43
- package/dist/{configure-FL7Y3KJF.js → configure-PIWO7B24.js} +10 -10
- package/dist/{context-5HE7ODYK.js → context-IYEHL3WQ.js} +33 -31
- package/dist/{context-XNHL75JV.js → context-KQYIWPWT.js} +47 -34
- package/dist/{context-KYQFRVDC.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-N545L53A.js → context-clear-G4OGZJDS.js} +33 -31
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-BWLF6LJP.js} +7 -7
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-2QQAITS3.js} +38 -38
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-LHBD36VU.js} +23 -22
- package/dist/{eval-GXLL44RD.js → eval-C45FYRJ6.js} +21 -20
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-6DEJPLBF.js} +2 -2
- package/dist/{evidence-HWLBRH3Q.js → evidence-6SHONYAF.js} +30 -28
- package/dist/{evolve-FTZBMNVW.js → evolve-KRKMV72X.js} +30 -28
- package/dist/{extensions-VHRBEID7.js → extensions-KPZ2UHBB.js} +5 -3
- package/dist/{fleet-CKZHJWZJ.js → fleet-IVTCKDHT.js} +62 -61
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-EDWL3IT7.js} +5 -5
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-YP3YEFGK.js} +4 -4
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-ZFWKHY2M.js} +16 -14
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-FVUNCBML.js} +31 -29
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-UN5XED4R.js} +2 -2
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-XOWC4HSX.js} +17 -15
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-UN3SODEL.js} +30 -28
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-TWHJKCN6.js} +31 -29
- package/dist/{init-5XQRBOFV.js → init-T2QORQ3Y.js} +50 -49
- package/dist/{interop-34TVO25M.js → interop-IN5I2A66.js} +5 -5
- package/dist/{library-3QY6KF57.js → library-LSCATDLZ.js} +15 -13
- package/dist/{memory-L4UTIIIW.js → memory-HYOKAGGJ.js} +31 -29
- package/dist/{models-ZVX3QOWE.js → models-2GPMFYCM.js} +22 -21
- package/dist/{monitor-CEKVSYTS.js → monitor-E4ASVUJH.js} +34 -32
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-DDMPR3PY.js} +984 -583
- package/dist/{panes-7STHOAUJ.js → panes-E3RUXOW5.js} +4 -4
- package/dist/{panes-SHAUIRXY.js → panes-IXKLOKA2.js} +23 -8
- package/dist/{reset-EOLM7GVE.js → reset-OAQP3W4O.js} +4 -4
- package/dist/{resources-74GKTLSF.js → resources-OTRSN34L.js} +15 -13
- package/dist/{run-HBAUJNNZ.js → run-5DEYH5QK.js} +60 -59
- package/dist/{share-G3APVLVP.js → share-IHWTLO3M.js} +19 -15
- package/dist/{skills-35HHUKCR.js → skills-IYMXMKW4.js} +17 -15
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-DROHSJAR.js} +36 -36
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-D7X4L4ZX.js} +15 -13
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-QBM7UZ3B.js} +21 -18
- package/dist/{steer-XAVHJM22.js → steer-Z5DO23FJ.js} +2 -2
- package/dist/{targets-DSM6CY3M.js → targets-P2FUC4IL.js} +25 -28
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-YREJ3JX2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-5B7RO6MV.js} +4 -4
- package/dist/{trace-ECQ7TIYZ.js → trace-YMGMUM6A.js} +55 -7
- package/dist/{upgrade-H7TOM7YL.js → upgrade-PXK3S2YM.js} +11 -9
- package/dist/{usage-X52N3IDJ.js → usage-ME5MPXGX.js} +36 -34
- package/dist/{verifiers-EJTVVSMA.js → verifiers-BVZ7IWOO.js} +5 -5
- package/dist/{verify-YJL6XET2.js → verify-5K7ZKQFC.js} +4 -4
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-F5W5QTYY.js} +48 -47
- package/dist/{with-panes-OBOBFIIR.js → with-panes-BYOJCLAM.js} +51 -255
- package/dist/worker/entry.js +45 -30
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +50 -34
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +65 -60
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +227 -289
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +44 -13
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +2 -2
- package/package.json +9 -7
- package/skills/README.md +46 -37
- package/skills/coding/ast-grep/SKILL.md +2 -2
- package/skills/coding/coding-standards/SKILL.md +2 -2
- package/skills/coding/prototype/SKILL.md +2 -2
- package/skills/coding/tdd/SKILL.md +2 -2
- package/skills/context/context-handoff/SKILL.md +2 -2
- package/skills/context/context-prime/SKILL.md +2 -2
- package/skills/git/file-ticket/SKILL.md +2 -2
- package/skills/git/fix-issue/SKILL.md +3 -3
- package/skills/git/resolve-merge-conflicts/SKILL.md +2 -2
- package/skills/git/ship/SKILL.md +2 -2
- package/skills/git/worktree-create/SKILL.md +2 -2
- package/skills/git/worktree-merge/SKILL.md +2 -2
- package/skills/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/architecture/SKILL.md +2 -2
- package/skills/planning/backlog/SKILL.md +2 -2
- package/skills/planning/prd/SKILL.md +2 -2
- package/skills/planning/product-intent/SKILL.md +2 -2
- package/skills/planning/tech-spec/SKILL.md +2 -2
- package/skills/registry.yaml +62 -62
- package/skills/research/arxiv-literature/SKILL.md +2 -2
- package/skills/research/experiment-protocol/SKILL.md +2 -2
- package/skills/research/scientific-debugging/SKILL.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +2 -2
- package/skills/skill-marketplace.json +62 -62
- package/skills/workflow/cut-it/SKILL.md +2 -2
- package/skills/workflow/design-council/SKILL.md +2 -2
- package/skills/workflow/grill-me/SKILL.md +2 -2
- package/skills/workflow/workflow-distiller/SKILL.md +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- package/src/cli/configure.ts +0 -4
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/panes.ts +19 -5
- package/src/cli/run.ts +2 -2
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/targets.ts +2 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +5 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +12 -14
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/extension.ts +105 -22
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +55 -3
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +2 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +28 -4
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +11 -3
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +85 -21
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +669 -104
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/resources/skills/loader.ts +16 -19
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- package/src/engine/apis/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +28 -25
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +59 -35
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +10 -1
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/slash-commands.ts +129 -14
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/turn-context.ts +30 -15
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +29 -12
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +5 -1
- package/src/tools/dispatch-plan.ts +48 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# Working Set
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **Visual blueprint:** The source checkout includes the complete
|
|
4
|
+
> [Working Set visual reference](https://github.com/iowarp/clio-coder/blob/main/docs/html/context_working_set_blueprint.html).
|
|
5
|
+
|
|
6
|
+
The working set is the part of the session ledger the model actually receives on the next request. When context pressure crosses `context.compaction.threshold`, Clio narrows that view before it considers summarizing anything: selected tool-result bodies and closed-turn thinking blocks stop being replayed, and a one-line marker takes each body's place. Nothing is deleted. The ledger keeps every byte the tools produced, the transcript keeps showing them, and the model can ask for any evicted body back by ref.
|
|
4
7
|
|
|
5
8
|
Source of truth is `src/domains/context/working-set/` (`contract.ts`, `fold.ts`, `project.ts`, `marker.ts`, `protect.ts`, `engine.ts`, `recall.ts`, `policies/`), the ledger records in `src/domains/session/entries.ts`, and the compaction stage in `src/interactive/turn-context.ts` (`runAutoCompact`).
|
|
6
9
|
|
|
7
10
|
> [!WARNING]
|
|
8
|
-
> This is an experimental community alpha surface. The default policy is `structural-v1`; `age-horizon`
|
|
11
|
+
> This is an experimental community alpha surface. The default policy is `structural-v1`; `age-horizon` preserves the old age-based selection except for the current low-yield token floor and stays available.
|
|
9
12
|
|
|
10
13
|
## Vocabulary
|
|
11
14
|
|
|
@@ -109,7 +112,7 @@ Rule order is the policy. Each rung emits candidates newest-first, every candida
|
|
|
109
112
|
|
|
110
113
|
Rungs 1 through 5 are unconditional: redundant content is free to drop, whatever the pressure. Rung 6 is the only one that looks at token counts, and it stops the moment the projected size reaches `context.workingSet.target × contextWindow`. Newest-first within a rung is a cost decision: evicting the youngest safe unit keeps the cold region after the eviction point small, so the turn that pays for the event pays least.
|
|
111
114
|
|
|
112
|
-
|
|
115
|
+
A historical local long-trace sweep found that targets 0.4 and an exhaustive rung 6 produced identical results because the usable candidate pool ran out first. Relative to the 0.6 default, 0.4 reduced cold-prefix tokens by 2.8% at 64k and 7.3% at 128k, did not reduce summaries, and lowered retention covered by 0.00072 at 128k. The default therefore remained 0.6. The generated grid and reopening calculation were local artifacts and are not versioned in this repository; use the replay commands in [Commands and Modes](../guide/commands-and-modes.md#working-set-replay) to measure the current tree.
|
|
113
116
|
|
|
114
117
|
The facts the rungs read come from `path-index.ts`, one deterministic pass over the active-path entries producing one observation per tool result that names a path: which file, which line range, which paths a listing surfaced, whether the call failed, and where in the turn sequence it sits. Tools that observe no path (dispatch, web fetch, tasks, ask user, context) produce no observation. There are no content fingerprints.
|
|
115
118
|
|
|
@@ -117,13 +120,13 @@ The facts the rungs read come from `path-index.ts`, one deterministic pass over
|
|
|
117
120
|
|
|
118
121
|
Recall is explicit and by ref. There is no auto-readmission: the marker tells the model exactly which call brings the body back, and the model decides.
|
|
119
122
|
|
|
120
|
-
`resolveRecall(entries, view, ref, activeLeafTurnId)` resolves a ref against the fold at the live leaf and returns the original body byte-exact, read with the same field precedence the projection would have used. It fails in three typed ways
|
|
123
|
+
`resolveRecall(entries, view, ref, activeLeafTurnId)` resolves a ref against the fold at the live leaf and returns the original body byte-exact, read with the same field precedence the projection would have used. It fails in three typed ways:
|
|
121
124
|
|
|
122
125
|
- `invalid_ref` when the ref is empty or carries whitespace.
|
|
123
126
|
- `not_on_active_path` when the session has no such turn on this branch, which includes a ref from a branch `/tree` abandoned.
|
|
124
127
|
- `not_evicted` when the unit is still in context. An assistant turn reports separately that thinking is not recallable.
|
|
125
128
|
|
|
126
|
-
|
|
129
|
+
The `not_on_active_path` and `not_evicted` messages end with the refs that can be recalled on the active path (tool results only, up to eight, then a count). `invalid_ref` reports only the malformed value. Clio deliberately lists valid refs instead of guessing a nearest ref, because similar time-ordered identifiers can name unrelated results.
|
|
127
130
|
|
|
128
131
|
An LLM summary also preserves recall discovery across its cut. When an evicted tool result falls before `firstKeptTurnId`, the generated checkpoint carries a `<recallable-refs>` block with the same `ref (tool path)` rows used by recall failures, bounded to eight rows plus a remaining count. Results that stay after the cut keep their ordinary markers and are not repeated in the block.
|
|
129
132
|
|
|
@@ -131,7 +134,7 @@ An LLM summary also preserves recall discovery across its cut. When an evicted t
|
|
|
131
134
|
|
|
132
135
|
That also makes recall the churn signal. `churn = recalls / itemsEvicted` over the active path. A high churn number means the policy keeps evicting content the session still needs, which is a reason to change the policy rather than to raise the threshold.
|
|
133
136
|
|
|
134
|
-
The procedural replay does not synthesize churn from path reuse. Its reference graph maps each earlier observation to every later reread or discovery of the same path, while a real `contextRecall` is an explicit model choice of one ref. A later reread already returns current content at the tail, so also injecting the old body would duplicate data and misread stale or superseded observations as recall demand. Replay reports `recallTokens` as a one-time demand bound per evicted item and waits for explicit `contextRecall` records before reporting recall count, churn, or tail growth.
|
|
137
|
+
The procedural replay does not synthesize churn from path reuse. Its reference graph maps each earlier observation to every later reread or discovery of the same path, while a real `contextRecall` is an explicit model choice of one ref. A later reread already returns current content at the tail, so also injecting the old body would duplicate data and misread stale or superseded observations as recall demand. Replay reports `recallTokens` as a one-time demand bound per evicted item and waits for explicit `contextRecall` records before reporting recall count, churn, or tail growth. Graph-density measurements and reopening calculations are generated local artifacts rather than a versioned replay README.
|
|
135
138
|
|
|
136
139
|
An offloaded result returns its pointer, never the file. The model gets the same `full: <path>` promise the original tool result ended with and reads it with `read` when it wants it.
|
|
137
140
|
|
|
@@ -164,7 +167,7 @@ context:
|
|
|
164
167
|
| `context.workingSet.protectLastTurns` | `6` | integer ≥ 1 | Recent turns whose observations and thinking are never evicted. |
|
|
165
168
|
| `context.workingSet.minEvictableTokens` | `200` | integer ≥ 0 | Results below this body estimate are never evicted. The default protects low-yield bodies; marker break-even is enforced separately. |
|
|
166
169
|
|
|
167
|
-
`compaction.excludeLastTurns`
|
|
170
|
+
The retired `compaction.excludeLastTurns` key is not accepted by settings v2. The temporary legacy mask uses a compiled six-turn fallback; working-set protection uses `context.workingSet.protectLastTurns`. Settings validation is strict, so an unknown key under this block fails startup with its exact path.
|
|
168
171
|
|
|
169
172
|
`CLIO_CODER_LEGACY_MASK=1` restores the destructive stale-observation stage for one release as a compatibility escape hatch. It rewrites the ledger, and it is removed in the next release.
|
|
170
173
|
|
|
@@ -181,14 +184,14 @@ context:
|
|
|
181
184
|
These are tracked follow-ups, not available behavior:
|
|
182
185
|
|
|
183
186
|
- **Auto-readmission.** Nothing brings an evicted body back on its own. There are no path fingerprints and no registry of what the model is likely to need next.
|
|
184
|
-
- **Cost model and deferred scheduling.** Pressure is the only trigger, and it is `compaction.threshold`, not `target`.
|
|
187
|
+
- **Cost model and deferred scheduling.** Pressure is the only trigger, and it is `context.compaction.threshold`, not `target`. Historical local replay tables priced every applied event by the cold prefix it re-prefilled (about 29k tokens per event at a 64k budget), and batching from the threshold down to the target kept one event per cycle; a trigger at the target would make every turn above 60% with one newly redundant read an event of its own. Those tables are not versioned benchmark results. There is no break-even horizon, no deferred eviction plan, and no piggybacking beyond the fact that the working-set stage already runs first inside `runAutoCompact`.
|
|
185
188
|
- **Intra-turn eviction.** Eviction runs before a request is sent. A single turn whose tool results overflow the window is handled by the observation envelope's caps and by summary compaction, not by this layer.
|
|
186
189
|
- **Worker runtimes.** Dispatched workers replay their own ledgers without the working-set stage.
|
|
187
190
|
- **Digests.** A marker carries tool, size, and a first-line preview. The generated summaries from #165 are not embedded in it.
|
|
188
191
|
|
|
189
192
|
## See also
|
|
190
193
|
|
|
191
|
-
- `clio-coder context replay --sessions <path>...` replays Clio ledgers, and `--synthetic <ids>` replays the seeded procedural corpora, through the same fold, projection, and policy code with `none`, `random`, and `oracle` controls; `clio-coder context working-set --session <id|path>` prints one session's fold and path index. Both are described under [Working-set replay](commands-and-modes.md#working-set-replay). Generated replay tables are local artifacts rather than versioned benchmark results.
|
|
194
|
+
- `clio-coder context replay --sessions <path>...` replays Clio ledgers, and `--synthetic <ids>` replays the seeded procedural corpora, through the same fold, projection, and policy code with `none`, `random`, and `oracle` controls; `clio-coder context working-set --session <id|path>` prints one session's fold and path index. Both are described under [Working-set replay](../guide/commands-and-modes.md#working-set-replay). Generated replay tables are local artifacts rather than versioned benchmark results.
|
|
192
195
|
- [context-engine.md](context-engine.md) for context window resolution, token accounting, and how this stage sits ahead of summary compaction.
|
|
193
196
|
- [session-lifecycle.md](session-lifecycle.md) for the ledger format, active-path lineage, and branching.
|
|
194
|
-
- [glossary.md](glossary.md) for the one-line definitions of these terms.
|
|
197
|
+
- [glossary.md](../guide/glossary.md) for the one-line definitions of these terms.
|
package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md}
RENAMED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# Dispatch Architecture Rationale
|
|
2
2
|
|
|
3
|
+
> **Visual blueprint:** The source checkout includes the complete
|
|
4
|
+
> [Dispatch Architecture Rationale visual reference](https://github.com/iowarp/clio-coder/blob/main/docs/html/dispatch_rationale_blueprint.html).
|
|
5
|
+
|
|
3
6
|
Why `src/domains/dispatch/` is one domain, why one import out of it looks
|
|
4
7
|
irregular and is allowed to, and why the repository has no barrel-only import
|
|
5
8
|
convention. No code moved as a result of this document. It exists so that a
|
|
6
9
|
later split is argued from invariants rather than from file counts.
|
|
7
10
|
|
|
8
|
-
Counts verified against the current tree:
|
|
9
|
-
`src/domains/dispatch/`, a
|
|
11
|
+
Counts verified against the current tree: 85 TypeScript files in
|
|
12
|
+
`src/domains/dispatch/`, a 199-line barrel at `src/domains/dispatch/index.ts`,
|
|
10
13
|
and one dispatch → eval import.
|
|
11
14
|
|
|
12
15
|
---
|
|
@@ -28,7 +31,7 @@ split would use. They cross them.
|
|
|
28
31
|
| Write-boundary attribution is per scheduling *window*, so the compiler refuses a wave with two writers | scheduling, write boundaries, plan compilation | `execution-plan.ts`, `write-boundary.ts` |
|
|
29
32
|
| A loop's later nodes are `unneeded`, decided by the scheduler, not the plan | plan compilation, scheduling, receipts | `fleet-plan.ts`, `execution-scheduler.ts` |
|
|
30
33
|
| Staleness revalidation re-runs a verification a later workspace step invalidated | scheduling, plan compilation, code steps | `execution-scheduler.ts` |
|
|
31
|
-
| Receipt integrity
|
|
34
|
+
| Receipt integrity v20 seals normalized routing intent | routing, receipts | `receipt-integrity.ts`, `routing-intent.ts` |
|
|
32
35
|
|
|
33
36
|
The write-boundary and loop rows are the sharpest. Both are properties of a
|
|
34
37
|
*wave*, which is a scheduling concept computed by the plan compiler and enforced
|
|
@@ -80,7 +83,7 @@ outward, because that is the one seam the invariants above actually respect.
|
|
|
80
83
|
`../eval/artifacts/store.js`. The eval barrel does not export it. This is the
|
|
81
84
|
only dispatch → eval import in the domain.
|
|
82
85
|
|
|
83
|
-
This is coupling worth recording, not a violation. It breaks none of the
|
|
86
|
+
This is coupling worth recording, not a violation. It breaks none of the six
|
|
84
87
|
enforced boundary rules, and the direction is defensible: the routing quality
|
|
85
88
|
reducer treats an eval artifact as evidence, so it must parse one, and
|
|
86
89
|
`parseEvalArtifactV4` is the strict fail-closed parser rather than a convenience
|
|
@@ -104,10 +107,10 @@ The evidence that decides it:
|
|
|
104
107
|
|
|
105
108
|
- Measured across `src/domains/**`, counting an import as cross-domain when the
|
|
106
109
|
importing file and the resolved target sit in different `src/domains/<name>`
|
|
107
|
-
directories: **
|
|
108
|
-
barrel imports. Direct subpath import is the majority pattern by roughly
|
|
110
|
+
directories: **228** cross-domain subpath imports against **41** cross-domain
|
|
111
|
+
barrel imports. Direct subpath import is the majority pattern by roughly six
|
|
109
112
|
to one, not an exception to a rule.
|
|
110
|
-
- All
|
|
113
|
+
- All six enforced boundary rules
|
|
111
114
|
(`tests/boundaries/check-boundaries.ts`) constrain dependency **direction**:
|
|
112
115
|
who may depend on whom. Not one constrains import **form**. There is no rule
|
|
113
116
|
to be half-consistent with.
|
|
@@ -116,11 +119,11 @@ The evidence that decides it:
|
|
|
116
119
|
it. A barrel-only rule would have to widen the agents barrel for no reason but
|
|
117
120
|
import style.
|
|
118
121
|
|
|
119
|
-
A barrel-only
|
|
122
|
+
A barrel-only seventh rule would require widening many barrels to re-export
|
|
120
123
|
symbols currently reached directly. Every one of those is a public-surface
|
|
121
124
|
addition justified by nothing but import style, and it would rewrite every
|
|
122
125
|
affected import site for no behavioral gain. A boundary rule should protect an
|
|
123
126
|
invariant. "Always import through the barrel" protects a preference.
|
|
124
127
|
|
|
125
|
-
What is *not* permitted is anything the
|
|
128
|
+
What is *not* permitted is anything the six direction rules forbid, and those
|
|
126
129
|
stay enforced by the boundary checker that `npm run lint` runs.
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Typed Dispatch Intent: Migration and Refusal Policy
|
|
2
2
|
|
|
3
|
+
> **Visual blueprint:** The source checkout includes the complete
|
|
4
|
+
> [Typed Dispatch Intent: Migration and Refusal Policy visual reference](https://github.com/iowarp/clio-coder/blob/main/docs/html/dispatch_typed_intent_blueprint.html).
|
|
5
|
+
|
|
3
6
|
Typed dispatch intent is the structured declaration of what a dispatched worker
|
|
4
7
|
may read, may write, is expected to produce, and must verify. It replaces the
|
|
5
8
|
practice of reconstructing that answer from optional `writeRoots` plus path-like
|
|
@@ -11,8 +14,8 @@ omitted, partial, versioned differently, or contradictory, lists the stable
|
|
|
11
14
|
reason codes an operator or integrator can branch on, and states the measurable
|
|
12
15
|
condition under which the legacy inference fallback may be proposed for removal.
|
|
13
16
|
|
|
14
|
-
Related pages: [tool-usage.md](tool-usage.md) for the `dispatch` tool arguments,
|
|
15
|
-
[fleet-dispatch.md](fleet-dispatch.md) for fleet contracts,
|
|
17
|
+
Related pages: [tool-usage.md](../guide/tool-usage.md) for the `dispatch` tool arguments,
|
|
18
|
+
[fleet-dispatch.md](../guide/fleet-dispatch.md) for fleet contracts,
|
|
16
19
|
[artifact-versions.md](artifact-versions.md) for the serialization registry, and
|
|
17
20
|
[safety-model.md](safety-model.md) for how a resolved write boundary is enforced.
|
|
18
21
|
|
|
@@ -25,21 +28,30 @@ Related pages: [tool-usage.md](tool-usage.md) for the `dispatch` tool arguments,
|
|
|
25
28
|
"intent": {
|
|
26
29
|
"read_roots": ["src/domains/dispatch/"],
|
|
27
30
|
"write_roots": ["src/domains/dispatch/", "tests/contracts/"],
|
|
28
|
-
"relevant_paths": ["docs/dispatch-typed-intent.md"],
|
|
31
|
+
"relevant_paths": ["docs/architecture/dispatch-typed-intent.md"],
|
|
29
32
|
"expected_outputs": ["src/domains/dispatch/intent-compatibility.ts"],
|
|
30
33
|
"verification": [{ "check": "typecheck" }, { "check": "lint", "timeout_ms": 60000 }]
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
36
|
```
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
`src/core/path-boundary.ts`.
|
|
37
|
-
means
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
The three scope fields, `read_roots`, `write_roots`, and `relevant_paths`, use
|
|
39
|
+
the repository-relative POSIX boundary grammar in `src/core/path-boundary.ts`.
|
|
40
|
+
A trailing `/` means the subtree; no trailing `/` means that exact file.
|
|
41
|
+
Absolute paths, `..` segments, interior `.` segments, backslashes, and globs
|
|
42
|
+
are refused in those fields. An entry that is exactly `.` or `./` is accepted
|
|
43
|
+
as the repository root and normalizes out of the list. Expected outputs use a
|
|
44
|
+
separate normalizer: it rejects absolute paths, backslashes, root escapes, and
|
|
45
|
+
an empty normalized path, but it normalizes interior `.` and repeated `/`
|
|
46
|
+
segments and does not interpret or reject glob characters. Each list is
|
|
47
|
+
normalized, deduplicated, and sorted by
|
|
48
|
+
code point, holds at most 32 entries, and each entry is at most 512 UTF-8 bytes.
|
|
49
|
+
`verification` holds at most 8 entries and every
|
|
41
50
|
`check` is a declared id resolved from package scripts or
|
|
42
|
-
`.clio-coder/verifiers.yaml`, never a shell command.
|
|
51
|
+
`.clio-coder/verifiers.yaml`, never a shell command. The one exception is
|
|
52
|
+
`{ "check": "none" }`, which models write to mean "no verification"; it
|
|
53
|
+
normalizes to an empty list instead of costing a refused round unless the
|
|
54
|
+
workspace actually declares a verifier whose id is `none`.
|
|
43
55
|
|
|
44
56
|
Normalization is in `src/domains/dispatch/intent.ts`. The normalized object
|
|
45
57
|
carries `version: 2` and a `pathProvenance` array binding every policy-bearing
|
|
@@ -56,7 +68,7 @@ Each rule resolves to exactly one of three decisions.
|
|
|
56
68
|
| Decision | Meaning | Where it surfaces |
|
|
57
69
|
| :--- | :--- | :--- |
|
|
58
70
|
| **accept** | The request is unambiguous. | Nothing is reported. |
|
|
59
|
-
| **warn** | The request is compatible, but
|
|
71
|
+
| **warn** | The request is compatible, but the classifier identified a weaker declaration or a scope-replacement tradeoff. The dispatch runs with the authority it would have had anyway. | Current admission publishes the typed-scope replacement warning. Legacy provenance still appears in the approval artifact and sealed `pathScope`; the absent-intent and missing-verification classifier findings are not emitted as standalone warnings. |
|
|
60
72
|
| **refuse** | The request states two incompatible things about authority, or states one this build cannot interpret. | Terminal admission error carrying the reason code. The dispatch never runs. |
|
|
61
73
|
|
|
62
74
|
The invariant that separates `warn` from `refuse`: **a warning is never the
|
|
@@ -67,7 +79,7 @@ touch, the answer is a refusal, never the union of the two.
|
|
|
67
79
|
|
|
68
80
|
### 2.1 Omitted intent
|
|
69
81
|
|
|
70
|
-
Accepted
|
|
82
|
+
Accepted without a standalone runtime warning. Policy-bearing scope is resolved by
|
|
71
83
|
`legacyPathScope()`: legacy `writeRoots` become the write boundary with
|
|
72
84
|
provenance `derived`, and path-like tokens in the task (confidence `medium`) and
|
|
73
85
|
briefing (confidence `low`) become working-context paths with provenance
|
|
@@ -77,7 +89,10 @@ Inferred paths select project rules and compile worker context. They never
|
|
|
77
89
|
become write boundaries and never add a verification requirement. The only path
|
|
78
90
|
into a write boundary without a declaration is the explicit legacy `writeRoots`
|
|
79
91
|
field, which the caller had to set on purpose. This is what makes omission a
|
|
80
|
-
|
|
92
|
+
compatible rather than a refusal: nothing about it can widen authority. The pure
|
|
93
|
+
compatibility classifier can return `intent_absent_legacy_inference`, but the
|
|
94
|
+
production dispatch path deliberately treats omitted intent as ordinary. The
|
|
95
|
+
approval artifact and receipt provenance remain the operator-visible record.
|
|
81
96
|
|
|
82
97
|
An absolute or malformed path token in prose is not silently dropped. It throws
|
|
83
98
|
`DispatchPathScopeInferenceError` with code `legacy_scope_path_absolute` or
|
|
@@ -90,13 +105,15 @@ Accepted. Every field is independently optional and an omitted list normalizes
|
|
|
90
105
|
to empty. A declaration is not required to be complete to be authoritative:
|
|
91
106
|
declaring only `write_roots` is a complete statement about write scope.
|
|
92
107
|
|
|
93
|
-
|
|
108
|
+
The pure classifier identifies one partial shape as a warning. Intent that declares `write_roots` or
|
|
94
109
|
`expected_outputs` but no `verification` describes work that changes the tree
|
|
95
110
|
with nothing the orchestrator itself runs to prove the change is sound
|
|
96
|
-
(`intent_partial_verification_absent`).
|
|
111
|
+
(`intent_partial_verification_absent`). Current production admission keeps only
|
|
112
|
+
terminal refusals from this classifier, so it does not emit that finding as an
|
|
113
|
+
operator diagnostic.
|
|
97
114
|
|
|
98
|
-
One partial shape is refused. An `expected_outputs`
|
|
99
|
-
`write_root` (`intent_outputs_outside_write_roots`) means the write boundary
|
|
115
|
+
One partial shape is refused when both lists are non-empty. An `expected_outputs`
|
|
116
|
+
entry outside every declared `write_root` (`intent_outputs_outside_write_roots`) means the write boundary
|
|
100
117
|
would block exactly the artifact the task is required to produce. Refusing that
|
|
101
118
|
at admission costs a rejected call; accepting it costs a full worker run that
|
|
102
119
|
cannot succeed.
|
|
@@ -119,8 +136,9 @@ is the same: restate the fields on a fresh dispatch call.
|
|
|
119
136
|
|
|
120
137
|
Refused. Three contradictions are enumerated.
|
|
121
138
|
|
|
122
|
-
- **Legacy against declared write scope.**
|
|
123
|
-
resolving to different trees is
|
|
139
|
+
- **Legacy against declared write scope.** When both lists are non-empty,
|
|
140
|
+
`writeRoots` and `intent.write_roots` resolving to different trees is
|
|
141
|
+
`intent_write_roots_contradiction`. Neither the
|
|
124
142
|
union nor the legacy field wins; the caller drops `writeRoots` and declares
|
|
125
143
|
once.
|
|
126
144
|
- **Narrowed against enclosing scope.** A per-task intent in a batch, or any
|
|
@@ -135,19 +153,20 @@ Refused. Three contradictions are enumerated.
|
|
|
135
153
|
|
|
136
154
|
The declared-versus-inferred case is not a contradiction and is not refused.
|
|
137
155
|
When a request declares intent, prose inference stops resolving scope entirely;
|
|
138
|
-
paths mentioned only in prose
|
|
139
|
-
`typed_scope_replaced_inferred_paths`
|
|
140
|
-
|
|
156
|
+
paths mentioned only in prose take no part in rule selection or authority.
|
|
157
|
+
`typed_scope_replaced_inferred_paths` reports the useful subset that looks like
|
|
158
|
+
a source or documentation path, or ends in a directory separator, capped at 12
|
|
159
|
+
entries for the transcript. Declared always outranks inferred.
|
|
141
160
|
|
|
142
161
|
---
|
|
143
162
|
|
|
144
163
|
## 3. Producer Compatibility Table
|
|
145
164
|
|
|
146
165
|
Every producer that can reach a worker passes through `validateJobSpec()` in
|
|
147
|
-
`src/domains/dispatch/validation.ts
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
166
|
+
`src/domains/dispatch/validation.ts`. When an `intent` property is present, that
|
|
167
|
+
validator runs the classifier and retains its terminal refusals. Requests with
|
|
168
|
+
no intent skip compatibility classification and resolve scope through the legacy
|
|
169
|
+
inference path, whose malformed-path errors remain terminal.
|
|
151
170
|
|
|
152
171
|
| Dispatch producer | Source | Typed intent | Behavior without declaration | Refuses on |
|
|
153
172
|
| :--- | :--- | :--- | :--- | :--- |
|
|
@@ -155,13 +174,13 @@ when they state a contradiction.
|
|
|
155
174
|
| **`dispatch` tool, batch `tasks[]`** | `src/tools/dispatch-arguments.ts` | Declared per task, shallow-merged over the top-level default | Same as singular, per task | All codes, plus `intent_scope_widening` against the top-level ceiling |
|
|
156
175
|
| **`dispatch` modes parallel / sequential / pipeline / detached** | `src/tools/dispatch-admission.ts` | Inherited unchanged from the task that declared it | Legacy inference | All codes |
|
|
157
176
|
| **`dispatch` mode compete, candidates** | `src/tools/dispatch-admission.ts` | Inherited unchanged from the single base task | Legacy inference | All codes. `verification` is refused for the mode (`verification_unsupported_for_mode`) |
|
|
158
|
-
| **`dispatch` mode compete, judge** | `src/tools/dispatch-admission.ts` | None. The judge is a fresh read-only request | Legacy inference over the judge's own task |
|
|
177
|
+
| **`dispatch` mode compete, judge** | `src/tools/dispatch-admission.ts` | None. The judge is a fresh read-only request | Legacy inference over the judge's own task | Legacy inference errors only |
|
|
159
178
|
| **`dispatch` mode council, members** | `src/tools/dispatch-admission.ts` | Inherited, narrowed to read-only: declared write roots arrive as read roots | Legacy inference | All codes. `verification` is refused for the mode (`council_verification_unsupported`) |
|
|
160
|
-
| **`dispatch` mode council, synthesis judge** | `src/tools/dispatch-admission.ts` | None. Fresh read-only request | Legacy inference over the judge's own task |
|
|
179
|
+
| **`dispatch` mode council, synthesis judge** | `src/tools/dispatch-admission.ts` | None. Fresh read-only request | Legacy inference over the judge's own task | Legacy inference errors only |
|
|
161
180
|
| **`dispatch` review gate, builder** | `src/tools/dispatch-admission.ts` | Inherited unchanged | Legacy inference | All codes |
|
|
162
|
-
| **`dispatch` review gate, reviewer** | `src/tools/dispatch-admission.ts` | None on the request. `expected_outputs` and `verification` reach the reviewer as rendered *requirements*, never as evidence | Legacy inference over the reviewer's own task |
|
|
181
|
+
| **`dispatch` review gate, reviewer** | `src/tools/dispatch-admission.ts` | None on the request. `expected_outputs` and `verification` reach the reviewer as rendered *requirements*, never as evidence | Legacy inference over the reviewer's own task | Legacy inference errors only |
|
|
163
182
|
| **`dispatch` `apply_winner`** | `src/tools/dispatch-admission.ts` | Not applicable. Branch application runs no worker | Not applicable | Branch-shape refusals only |
|
|
164
|
-
| **`from_scout` continuation** | `src/tools/dispatch-scout-admission.ts` | **None today.** The compiled continuation plan carries no intent | Legacy inference per step |
|
|
183
|
+
| **`from_scout` continuation** | `src/tools/dispatch-scout-admission.ts` | **None today.** The compiled continuation plan carries no intent | Legacy inference per step | Legacy inference errors only |
|
|
165
184
|
| **Fleet contract agent step (v4+ `writes:`)** | `src/domains/dispatch/fleet-run.ts` | Declared. The contract's `writes:` compiles to `relevant_paths` | Legacy inference for pre-v4 contracts and readonly steps | All codes |
|
|
166
185
|
| **Fleet contract gate / plan step** | `src/domains/dispatch/fleet-run.ts` | Declared, same path (`writes` is the gate path or the plan step's boundary) | Legacy inference when undeclared | All codes |
|
|
167
186
|
| **Fleet delegation-plan spliced step** | `src/domains/dispatch/fleet-run.ts` | Declared from the validated plan task's `writes` | Legacy inference when the task declares none | All codes |
|
|
@@ -169,14 +188,14 @@ when they state a contradiction.
|
|
|
169
188
|
| **ACP delegation target** | `src/domains/dispatch/extension.ts` | Accepted and carried into the plan, but the external agent runs its own tool surface | Legacy inference | All codes, plus a hard refusal of any resolved `writeRoots` on this transport |
|
|
170
189
|
| **Custom agent recipe** | `src/domains/agents/` | Not a producer. A recipe narrows the tool surface and capability class; it never declares dispatch scope | Not applicable | Not applicable |
|
|
171
190
|
| **Extension-authored `DispatchRequest`** | Any `DispatchContract` consumer | Declared, if the extension builds one through `declaredScopeIntent()` or the normalizer | Legacy inference | All codes |
|
|
172
|
-
| **`clio-coder run --agent`** | `src/cli/run.ts` | **None today** | Legacy inference |
|
|
173
|
-
| **`clio-coder wiki generate`** | `src/cli/wiki-generate.ts` | **None today.** Sets legacy `writeRoots` | Legacy inference plus a derived write boundary |
|
|
174
|
-
| **`clio-coder bootstrap generate`** | `src/cli/bootstrap-generate.ts` | **None today** | Legacy inference |
|
|
175
|
-
| **Interactive slash commands, overlays, watchdog** | `src/interactive/` | **None today** | Legacy inference |
|
|
191
|
+
| **`clio-coder run --agent`** | `src/cli/run.ts` | **None today** | Legacy inference | Legacy inference errors only |
|
|
192
|
+
| **`clio-coder wiki generate`** | `src/cli/wiki-generate.ts` | **None today.** Sets legacy `writeRoots` | Legacy inference plus a derived write boundary | Legacy inference errors only |
|
|
193
|
+
| **`clio-coder bootstrap generate`** | `src/cli/bootstrap-generate.ts` | **None today** | Legacy inference | Legacy inference errors only |
|
|
194
|
+
| **Interactive slash commands, overlays, watchdog** | `src/interactive/` | **None today** | Legacy inference | Legacy inference errors only |
|
|
176
195
|
|
|
177
|
-
"All codes" means every code in section 5 that can apply to the row's
|
|
178
|
-
"
|
|
179
|
-
|
|
196
|
+
"All codes" means every terminal code in section 5 that can apply to the row's
|
|
197
|
+
shape. "Legacy inference errors only" means the row cannot declare intent, so
|
|
198
|
+
only malformed or absolute prose-path inference can refuse it.
|
|
180
199
|
|
|
181
200
|
---
|
|
182
201
|
|
|
@@ -208,8 +227,8 @@ filesystem, no clock, no environment, and no package layout. The supported
|
|
|
208
227
|
version set is a compiled-in constant, not a lookup. A source checkout, a global
|
|
209
228
|
npm install, and a bundled `dist/` therefore classify identical input
|
|
210
229
|
identically, which is what makes the version policy verifiable rather than
|
|
211
|
-
environmental. `tests/contracts/dispatch-
|
|
212
|
-
|
|
230
|
+
environmental. `tests/contracts/dispatch-admission.test.ts` covers the current
|
|
231
|
+
normalization and compatibility boundary.
|
|
213
232
|
|
|
214
233
|
The one input that is legitimately environmental is the *verification catalog*:
|
|
215
234
|
`check` ids resolve from the project's `package.json` scripts and
|
|
@@ -221,16 +240,18 @@ Clio installation. An undeclared id fails closed with
|
|
|
221
240
|
|
|
222
241
|
## 5. Reason Codes
|
|
223
242
|
|
|
224
|
-
|
|
225
|
-
`<code>: <what is wrong and what to do about it>`.
|
|
243
|
+
Active refusal codes are stable and appear as the prefix of their diagnostic, in
|
|
244
|
+
the form `<code>: <what is wrong and what to do about it>`. The table also marks
|
|
245
|
+
classifier-only findings and compatibility identifiers that have no current
|
|
246
|
+
producer.
|
|
226
247
|
|
|
227
248
|
| Code | Decision | Meaning |
|
|
228
249
|
| :--- | :--- | :--- |
|
|
229
|
-
| `intent_absent_legacy_inference` | warn | No typed intent; scope came from legacy inference. |
|
|
230
|
-
| `intent_partial_verification_absent` | warn | Declares tree-changing work with no verification requirement. |
|
|
250
|
+
| `intent_absent_legacy_inference` | classifier-only warn | No typed intent; scope came from legacy inference. Production admission does not emit it. |
|
|
251
|
+
| `intent_partial_verification_absent` | classifier-only warn | Declares tree-changing work with no verification requirement. Production admission does not emit it. |
|
|
231
252
|
| `typed_scope_replaced_inferred_paths` | warn | Typed intent was declared, so prose-only paths took no part in scope. |
|
|
232
|
-
| `legacy_scope_inferred` |
|
|
233
|
-
| `legacy_scope_empty` |
|
|
253
|
+
| `legacy_scope_inferred` | retained compatibility id | Accepted by the event projection for older producers; no current source emits it. |
|
|
254
|
+
| `legacy_scope_empty` | retained compatibility id | Accepted by the event projection for older producers; no current source emits it. |
|
|
234
255
|
| `intent_version_unsupported` | refuse | `intent.version` names a version this build does not speak. |
|
|
235
256
|
| `intent_malformed` | refuse | Not a normalized intent for a reason other than its version. |
|
|
236
257
|
| `intent_write_roots_contradiction` | refuse | Legacy `writeRoots` and `intent.write_roots` name different trees. |
|
|
@@ -253,7 +274,8 @@ Every code is stable and appears as the prefix of its diagnostic, in the form
|
|
|
253
274
|
## 6. Examples
|
|
254
275
|
|
|
255
276
|
Typed intent is the default for every example below. A call that omits it still
|
|
256
|
-
works; it
|
|
277
|
+
works without a dedicated warning; it resolves its scope from weaker evidence
|
|
278
|
+
recorded in the approval artifact and receipt.
|
|
257
279
|
|
|
258
280
|
### 6.1 Main-agent call, single writer
|
|
259
281
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Evidence Corpus and Long-Term Memory
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> **Visual blueprint:** The source checkout includes the complete
|
|
4
|
+
> [Evidence Corpus and Long-Term Memory visual reference](https://github.com/iowarp/clio-coder/blob/main/docs/html/memory_blueprint.html).
|
|
5
5
|
|
|
6
|
-
Clio Coder treats run claims and agent lessons as structured artifacts to support reproducibility and scientific provenance. In evaluations such as [SWE-bench](https://www.swebench.com), capturing granular execution evidence is essential for validating agent claims. Evidence corpora are deterministic directories built from run ledgers, receipts, sessions, audits, and eval artifacts.
|
|
6
|
+
Clio Coder treats run claims and agent lessons as structured artifacts to support reproducibility and scientific provenance. In evaluations such as [SWE-bench](https://www.swebench.com), capturing granular execution evidence is essential for validating agent claims. Evidence corpora are deterministic directories built from run ledgers, receipts, sessions, audits, and eval artifacts. Currently, forensic evidence auto-builds on dispatch run completion: when a run finalizes, the observability domain automatically compiles the evidence bundle under `<dataDir>/evidence/run-<id>/` and updates a compact sidecar index row in `<stateDir>/evidence-index.json`. Long-term memory records are local, evidence-linked, and only injected after explicit approval. Use the TUI [`/view`](observability.md) command for interactive inspection of receipts, dispatch output, durable tool output, compaction summaries, and session accountability before building or citing evidence.
|
|
7
7
|
|
|
8
8
|
Source of truth: `src/domains/evidence/**`, `src/domains/memory/**`, `src/cli/evidence.ts`, and `src/cli/memory.ts`.
|
|
9
9
|
|
|
@@ -15,11 +15,17 @@ Source of truth: `src/domains/evidence/**`, `src/domains/memory/**`, `src/cli/ev
|
|
|
15
15
|
clio-coder evidence build --run <runId>
|
|
16
16
|
clio-coder evidence build --session <sessionId>
|
|
17
17
|
clio-coder evidence build --eval <evalId>
|
|
18
|
-
clio-coder evidence inspect <evidenceId>
|
|
18
|
+
clio-coder evidence inspect <evidenceId> [--json]
|
|
19
19
|
clio-coder evidence list
|
|
20
|
+
clio-coder evidence inventory --json
|
|
20
21
|
```
|
|
21
22
|
|
|
22
|
-
`clio-coder evidence inspect <id>` requires a valid evidence artifact ID. If the requested artifact does not exist on disk, it
|
|
23
|
+
`clio-coder evidence inspect <id>` requires a valid evidence artifact ID. If the requested artifact does not exist on disk, it exits with code 1 and prints the error and remedy on separate lines:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
error: evidence artifact not found: <id>
|
|
27
|
+
run `clio-coder evidence list` to see local bundles
|
|
28
|
+
```
|
|
23
29
|
|
|
24
30
|
Evidence IDs are deterministic:
|
|
25
31
|
|
|
@@ -76,7 +82,7 @@ Eval evidence adds `eval-result.json` and uses empty receipt/protected-artifact
|
|
|
76
82
|
|
|
77
83
|
Session ledger entries are attributed to a run by the run id the producer stamped on the entry at write time. Rows built from those entries carry that provenance in a `runLink` field (`{ kind, confidence, candidateRunIds? }`) in `tool-events.jsonl` and `protected-artifacts.json`; a write-time stamp is `kind: "entry-run-id"`, `confidence: "exact"`. Entries written without run context fall back to timestamp windowing, labeled `kind: "timestamp-window"`, `confidence: "best-effort"`, and printed as `link=timestamp-window` in the transcript. Concurrent dispatch runs share one clock and their windows overlap, so an entry inside more than one window has no owner the bundle can name. Such an entry is reported in the bundle of every run it may belong to, with `runId: null`, `kind: "ambiguous-timestamp-window"`, and a `candidateRunIds` list, plus a `best-effort-link` finding counting them. It is never dropped and never claimed as exact.
|
|
78
84
|
|
|
79
|
-
When a run was chained (pipeline), composed with a persona override, or escalated for a permission, `transcript.md` and `trace.cleaned.jsonl` surface the receipt's provenance field sets, and `clio-coder evidence inspect` prints them as a `provenance <runId>:` block. The block is the detail behind the canonical trust projection, never a second reading of it: it is printed only for a run whose seal the projection verified, its `autonomy:` line carries the policy name, external mode, and bypass flag and never the axis word (`mediated`, `approximated`, `bypassed` are the trust summary's to print), and a run whose seal was rejected or retired gets no block at all, so the output never publishes a value the projection reported as `absent`. The field paths, types, and stability labels are documented in the [receipt provenance schema](
|
|
85
|
+
When a run was chained (pipeline), composed with a persona override, or escalated for a permission, `transcript.md` and `trace.cleaned.jsonl` surface the receipt's provenance field sets, and `clio-coder evidence inspect` prints them as a `provenance <runId>:` block. The block is the detail behind the canonical trust projection, never a second reading of it: it is printed only for a run whose seal the projection verified, its `autonomy:` line carries the policy name, external mode, and bypass flag and never the axis word (`mediated`, `approximated`, `bypassed` are the trust summary's to print), and a run whose seal was rejected or retired gets no block at all, so the output never publishes a value the projection reported as `absent`. The field paths, types, and stability labels are documented in the [receipt provenance schema](observability.md#receipt-fields-for-dispatch-provenance).
|
|
80
86
|
|
|
81
87
|
### Task and decision provenance
|
|
82
88
|
|
|
@@ -86,7 +92,7 @@ Session evidence retains the two operator-facing bookkeeping ledgers instead of
|
|
|
86
92
|
|
|
87
93
|
## Evidence Tag Taxonomy and Failure Causes
|
|
88
94
|
|
|
89
|
-
Clio Coder classifies every run, session, and eval record using a closed set of
|
|
95
|
+
Clio Coder classifies every run, session, and eval record using a closed set of 29 canonical tags. These tags distinguish general execution characteristics, such as lineage linkages, from actual failure causes.
|
|
90
96
|
|
|
91
97
|
### Complete Taxonomy
|
|
92
98
|
|
|
@@ -131,8 +137,8 @@ A subset of the taxonomy represents actual failure causes (governed by the `FAIL
|
|
|
131
137
|
1. **`timeout`**: Triggered if the run outcome is `"timed_out"` or `"stalled"`, or if the error/failure text contains `"timed out"` or `"timeout"`.
|
|
132
138
|
2. **`auth-failure`**: Triggered if failure text contains keywords like `"auth"`, `"api key"`, `"credential"`, or `"unauthorized"`.
|
|
133
139
|
3. **`missing-dependency`**: Triggered if failure logs contain `"module not found"`, `"missing package"`, or `"missing dependency"`.
|
|
134
|
-
4. **`build-failure`**: Triggered in receipt summaries when a non-zero receipt exit is paired with build tool names in `toolStats` (e.g. `build`, `compile`, `make`, `cmake`, `cargo`, `gradle`, `ninja`, `tsc`). Forensic evidence
|
|
135
|
-
5. **`test-failure`**: Triggered in receipt summaries when a non-zero receipt exit is paired with test or lint tool names in `toolStats` (e.g. `pytest`, `ctest`, `jest`, `vitest`, `test`, `lint`, `typecheck`). Forensic evidence
|
|
140
|
+
4. **`build-failure`**: Triggered in receipt summaries when a non-zero receipt exit is paired with build tool names in `toolStats` (e.g. `build`, `compile`, `make`, `cmake`, `cargo`, `gradle`, `ninja`, `tsc`). Forensic evidence may also classify it from termination diagnostics in `outcomeDetail` or the recorded failure message. The task text is never causal evidence.
|
|
141
|
+
5. **`test-failure`**: Triggered in receipt summaries when a non-zero receipt exit is paired with test or lint tool names in `toolStats` (e.g. `pytest`, `ctest`, `jest`, `vitest`, `test`, `lint`, `typecheck`). Forensic evidence may also classify it from termination diagnostics in `outcomeDetail` or the recorded failure message. Validation words in the task text are never causal evidence.
|
|
136
142
|
6. **`blocked-tool`**: Triggered if tool execution statistics show a blocked count greater than `0`.
|
|
137
143
|
|
|
138
144
|
---
|
|
@@ -152,12 +158,13 @@ Each run receipt (persisted under `<stateDir>/receipts/<runId>.json`) carries an
|
|
|
152
158
|
### Computation and Lifecycle
|
|
153
159
|
- **Circular Dependency Prevention**: To prevent circular dependencies, `findingsSummary` is calculated **cheaply in-memory** at receipt-record time using the draft envelope and tool statistics (in `src/domains/dispatch/receipt-findings.ts`). It never reads from disk or calls `buildEvidence`.
|
|
154
160
|
- **First-Pass Success**: Calculated as `true` only if the terminal outcome was `"succeeded"`, the lineage attempt was `0` (no dispatch retries), the tool stats confirm at least one successful validation tool was executed, and no failure-cause tags were detected.
|
|
155
|
-
- **Cryptographic Coverage**: Current receipts use strict
|
|
161
|
+
- **Cryptographic Coverage**: Current receipts use strict v20 and authenticate every current receipt field, including dispatch intent path provenance, resolved path scope, briefing and steering provenance, routing intent and decision, route quality, worker identity, execution role, result-contract conformance, council provenance, and fleet gate provenance, against the reconstructed ledger. Only v20 is authenticated as current evidence. Lower versions are reported as retired and are neither migrated nor read as evidence.
|
|
156
162
|
|
|
157
163
|
| Version | Verification policy | Compatibility policy |
|
|
158
164
|
|---|---|---|
|
|
159
|
-
|
|
|
160
|
-
|
|
|
165
|
+
| v20 | Current canonical projection; every current receipt and reconstructible ledger field is authenticated | Accepted |
|
|
166
|
+
| v1 through v19 | Historical sealed shape unsupported by this build | Reported as retired; not migrated and not read as evidence |
|
|
167
|
+
| Malformed, unversioned, or future version | No current reader | Invalid; archive incompatible state rather than expecting migration |
|
|
161
168
|
|
|
162
169
|
Receipt integrity and evidence verification answer different questions. The
|
|
163
170
|
former proves that a receipt matches its ledger envelope; the latter records
|
|
@@ -234,10 +241,10 @@ prints the tier, summary, and every axis before those diagnostic records, while
|
|
|
234
241
|
their detailed domain artifacts remain in the receipt, gate, audit, and trace
|
|
235
242
|
files.
|
|
236
243
|
|
|
237
|
-
The canonical aggregate is an additive projection for downstream work.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
The canonical aggregate is an additive projection for downstream work. Evidence
|
|
245
|
+
bundles remain version 1 and gate decisions remain version 2. Receipt integrity
|
|
246
|
+
is independently versioned and currently uses v20; that version adds dispatch
|
|
247
|
+
intent path provenance and resolved path scope while retaining SHA-256 sealing.
|
|
241
248
|
|
|
242
249
|
### Trust projection
|
|
243
250
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Middleware and Component Registry
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> **Visual blueprint:** The source checkout includes the complete
|
|
4
|
+
> [Middleware and Component Registry visual reference](https://github.com/iowarp/clio-coder/blob/main/docs/html/middleware_blueprint.html).
|
|
5
5
|
|
|
6
6
|
Clio Coder has two related but separate surfaces:
|
|
7
7
|
|
|
@@ -51,7 +51,10 @@ It does not execute scanned files.
|
|
|
51
51
|
| `eval-suite` | reserved kind | descriptive |
|
|
52
52
|
|
|
53
53
|
> [!WARNING]
|
|
54
|
-
> The current scanner still looks for `doc-spec` files under `docs/specs/`.
|
|
54
|
+
> The current scanner still looks for `doc-spec` files under `docs/specs/`.
|
|
55
|
+
> Public reference pages now live under `docs/guide/`, `docs/architecture/`,
|
|
56
|
+
> `docs/process/`, and `docs/history/`, so they do not appear as `doc-spec`
|
|
57
|
+
> components unless the scanner's dedicated root is updated.
|
|
55
58
|
|
|
56
59
|
### Reload classes
|
|
57
60
|
|
|
@@ -124,17 +127,20 @@ These ship in every interactive session. Each is one bounded behavior with a vis
|
|
|
124
127
|
| --- | --- | --- |
|
|
125
128
|
| `nudge.stalled-turn` | `turn_end` | The one declarative rule. A turn that called no tools and ended on an announced action ("Next I will inspect `src/cli/index.ts`") is continued once with a reminder to perform it or say plainly that it is finished. Questions, "let me know", conditional offers ("if you want me to"), and completion statements are not announcements. |
|
|
126
129
|
| `observer.skills-reminder` | `turn_start`, `turn_end` | Once per session, on the first substantive turn, when installed or installable skills exist, injects one line teaching the suggestion protocol: list with `context(scope="skills")`, open the reply with `Suggested skill: /skill <name>` when one matches, then continue the task in the same turn. Only the operator loads a skill. At `turn_end`, a reply that made the suggestion and stopped with only listing calls behind it is continued once (#184): the suggestion is not the task. Greetings do not spend the session's one reminder; a resumed or forked session never gets one. |
|
|
130
|
+
| `observer.marketplace-offer` | `turn_start`, `after_tool` | On coordinator sessions, locally matches a substantive request against undeclined, uninstalled skills in Clio's marketplace and offers each matching skill at most once per session. Ordinary autonomy asks the operator through a tag-bound `ask_user` choice; `Not now` lasts for the session and `Never offer this skill` persists for that skill version. `full-auto` installs the match at project scope without the question. Both consented and autonomous installs pass the Clio-marketplace source gate, and installation never activates the skill; activation remains operator-gated. |
|
|
127
131
|
| `observer.task-board-reminder` | `turn_start` | Once per session, when the operator's text literally enumerates three or more steps (`1)`, `2.`, `step 3:`, or three bulleted lines), injects one line asking for `tasks action="plan"` before the first edit. Prose that merely mentions numbers never counts. |
|
|
128
132
|
| `nudge.open-tasks` | `turn_end` | A settled work turn (one that called tools) that ends while the session task board still has pending or active tasks is continued once with the open list. Pure conversation turns, aborted or errored turns, and boards where every remaining task is blocked do not trigger. |
|
|
129
133
|
| `nudge.detached-dispatch` | `turn_end` | A settled turn that ends while a detached dispatch batch has every run terminal and uncollected is continued once, naming the ready batches; `monitor mode="collect"` clears it, including across resume. Batches with runs still in flight, and surfaces without `monitor`, do not trigger. |
|
|
130
134
|
| `nudge.read-only-exploration` | `after_tool`, `turn_end` | After nine or more read-only calls (`read`, `grep`, `find`, `ls`, `code_nav`, read-only shell) in one user turn without a successful Scout dispatch, injects one advisory to delegate broad reconnaissance to Scout. One advisory per user turn, and only on surfaces that have `dispatch`. |
|
|
131
135
|
| `rail.unbacked-worker-claim` | `after_tool`, `turn_end` | A reply that reports worker or Scout results in a turn with no `dispatch` call gets one warning that the claim is not backed by a receipt. A `[worker result]` note the operator shared is receipt-backed and exempt. No continuation: the operator decides. |
|
|
132
136
|
| `observer.watchdog` | `after_tool`, `turn_end` | Opt-in through `watchdog.enabled` (default off). A turn that changed the tree is reviewed by one read-only `verifier` dispatch briefed with the turn's coalesced diff (per-path last-write-wins, bounded to 12 KiB) and the task board's current scope. Its failed checks become one transcript notice naming the count and the first three; a passing report emits nothing. `watchdog.cadenceToolCalls: N` also fires it every N tool calls inside the turn. One run in flight at a time; an overlapping trigger is dropped and counted. It emits no middleware effects, never continues a turn, and never mutates. Turns with no file mutations, headless runs, and ACP runs never fire it. |
|
|
133
|
-
| `observer.memory-intervention` | `after_tool` |
|
|
137
|
+
| `observer.memory-intervention` | `before_tool`, `after_tool`, `turn_start`, `turn_end`, `on_compaction` | Tracks bounded task memory throughout the turn. Repeated failures and post-compaction knowledge can inject rules-only reminders without a model. Interval, error-streak, and loop triggers queue a detached background reflection at `turn_end`; it uses the configured memory route and can deliver a bounded reminder with the next submitted turn. Governed by the `context.memory` settings block. |
|
|
134
138
|
|
|
135
139
|
Two coded controls sit beside the registrations rather than among them. `tool-choice-control` turns `require_tool` and `lock_tools` effects into the provider's tool-choice field for the next round: a required tool clears when that tool starts, a lock lasts until the next submitted turn and outranks later requirements. `hook-receipts` is the durable ring (200 entries, throttled to one write per two seconds) of user-defined hook executions that `clio-coder config inspect` reads.
|
|
136
140
|
|
|
137
|
-
User-defined hook declarations load from three places: `<extensionRoot>/hooks.yaml`, `.clio-coder/hooks.yaml`, and `.clio-coder/hooks.local.yaml`. A hook can be `prompt`, `effect`, or `command`. Command hooks run an argv array without a shell, under the workspace with a timeout and bounded output, and every hook execution emits a receipt.
|
|
141
|
+
User-defined hook declarations load from three places: `<extensionRoot>/hooks.yaml`, `.clio-coder/hooks.yaml`, and `.clio-coder/hooks.local.yaml`. A hook can be `prompt`, `effect`, or `command`. Command hooks run an argv array without a shell, under the workspace with a timeout and bounded output, and every hook execution emits a receipt. Project files are read from disk; extension declarations come from the committed extension snapshot, which captured the `hooks.yaml` bytes during install-digest verification, so a file rewritten after verification is never reopened. A receipt for an extension hook carries the package provenance, the declarations digest, and the extension generation that admitted it.
|
|
142
|
+
|
|
143
|
+
User hooks are one owned registration set. The extensions domain publishes nothing when it starts. After the guard registrations and before the turn-end assessors, the composition root prepares boot generation 1 and its user hooks, checks that both candidates are current, and publishes their references in adjacent assignment-only calls. `/resources extensions reload` uses the same paired path for later generations. A replacement for an older or equal generation is refused during preparation; after final validation neither publication primitive can refuse or call out. Conflict diagnostics and the reload event run only after both references are live. An owned registration that would take a builtin or host id is dropped with a `registration_conflict` diagnostic; a later host registration with the same id evicts the owned one. Evaluation captures the registration list once per hook occurrence, so an asynchronous phase that started before a reload finishes against the list it started with.
|
|
138
144
|
|
|
139
145
|
---
|
|
140
146
|
|