@cleocode/core 2026.10.21 → 2026.10.22
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/STABILITY.md +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/docs/document-edges.d.ts +38 -0
- package/dist/docs/document-edges.d.ts.map +1 -0
- package/dist/docs/document-edges.js +62 -0
- package/dist/docs/document-edges.js.map +1 -0
- package/dist/docs/projection.d.ts +3 -2
- package/dist/docs/projection.d.ts.map +1 -1
- package/dist/docs/projection.js +33 -36
- package/dist/docs/projection.js.map +1 -1
- package/dist/events/event-bus.d.ts +6 -5
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/event-bus.js +9 -8
- package/dist/events/event-bus.js.map +1 -1
- package/dist/gateway-client/generated/index.d.ts +2 -2
- package/dist/gateway-client/generated/index.d.ts.map +1 -1
- package/dist/gateway-client/generated/index.js +1 -1
- package/dist/gateway-client/generated/index.js.map +1 -1
- package/dist/gateway-client/generated/namespaces.gen.d.ts +1 -0
- package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -1
- package/dist/gateway-client/generated/namespaces.gen.js +2 -1
- package/dist/gateway-client/generated/namespaces.gen.js.map +1 -1
- package/dist/gateway-client/generated/sdk.gen.d.ts +5 -1
- package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -1
- package/dist/gateway-client/generated/sdk.gen.js +11 -0
- package/dist/gateway-client/generated/sdk.gen.js.map +1 -1
- package/dist/gateway-client/generated/types.gen.d.ts +34 -0
- package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
- package/dist/git/base-ref.d.ts +81 -0
- package/dist/git/base-ref.d.ts.map +1 -0
- package/dist/git/base-ref.js +135 -0
- package/dist/git/base-ref.js.map +1 -0
- package/dist/git/hooks-install.d.ts +1 -1
- package/dist/git/hooks-install.d.ts.map +1 -1
- package/dist/git/work-tree.d.ts +40 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +62 -7
- package/dist/git/work-tree.js.map +1 -1
- package/dist/hooks/handlers/conduit-hooks.d.ts +2 -1
- package/dist/hooks/handlers/conduit-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/conduit-hooks.js +9 -23
- package/dist/hooks/handlers/conduit-hooks.js.map +1 -1
- package/dist/hooks/handlers/index.d.ts +0 -1
- package/dist/hooks/handlers/index.d.ts.map +1 -1
- package/dist/hooks/handlers/index.js +0 -2
- package/dist/hooks/handlers/index.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -12
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +2 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/lifecycle/index.d.ts +15 -1
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +12 -6
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/stage-guidance.js +1 -1
- package/dist/lifecycle/stage-guidance.js.map +1 -1
- package/dist/memory/auto-row-quarantine.d.ts +196 -0
- package/dist/memory/auto-row-quarantine.d.ts.map +1 -0
- package/dist/memory/auto-row-quarantine.js +363 -0
- package/dist/memory/auto-row-quarantine.js.map +1 -0
- package/dist/memory/auto-row-rules.d.ts +29 -0
- package/dist/memory/auto-row-rules.d.ts.map +1 -0
- package/dist/memory/auto-row-rules.js +55 -0
- package/dist/memory/auto-row-rules.js.map +1 -0
- package/dist/memory/brain-lifecycle.d.ts.map +1 -1
- package/dist/memory/brain-lifecycle.js +13 -8
- package/dist/memory/brain-lifecycle.js.map +1 -1
- package/dist/memory/brain-search.d.ts +49 -29
- package/dist/memory/brain-search.d.ts.map +1 -1
- package/dist/memory/brain-search.js +159 -156
- package/dist/memory/brain-search.js.map +1 -1
- package/dist/memory/brain-similarity.d.ts +27 -4
- package/dist/memory/brain-similarity.d.ts.map +1 -1
- package/dist/memory/brain-similarity.js +41 -20
- package/dist/memory/brain-similarity.js.map +1 -1
- package/dist/memory/brain-stub-prune.d.ts +13 -0
- package/dist/memory/brain-stub-prune.d.ts.map +1 -1
- package/dist/memory/brain-stub-prune.js +14 -3
- package/dist/memory/brain-stub-prune.js.map +1 -1
- package/dist/memory/brain-writer-handlers.d.ts +3 -7
- package/dist/memory/brain-writer-handlers.d.ts.map +1 -1
- package/dist/memory/brain-writer-handlers.js +5 -20
- package/dist/memory/brain-writer-handlers.js.map +1 -1
- package/dist/memory/brain-writer-thread.d.ts +2 -11
- package/dist/memory/brain-writer-thread.d.ts.map +1 -1
- package/dist/memory/brain-writer-thread.js +20 -78
- package/dist/memory/brain-writer-thread.js.map +1 -1
- package/dist/memory/brain-writer-worker.js +1 -8
- package/dist/memory/brain-writer-worker.js.map +1 -1
- package/dist/memory/dispatch-trace-format.d.ts +13 -14
- package/dist/memory/dispatch-trace-format.d.ts.map +1 -1
- package/dist/memory/dispatch-trace-format.js +13 -14
- package/dist/memory/dispatch-trace-format.js.map +1 -1
- package/dist/memory/eligibility.d.ts +22 -0
- package/dist/memory/eligibility.d.ts.map +1 -1
- package/dist/memory/eligibility.js +36 -0
- package/dist/memory/eligibility.js.map +1 -1
- package/dist/memory/engine-compat.d.ts.map +1 -1
- package/dist/memory/engine-compat.js +11 -1
- package/dist/memory/engine-compat.js.map +1 -1
- package/dist/memory/evidence-graph-links.d.ts +253 -0
- package/dist/memory/evidence-graph-links.d.ts.map +1 -0
- package/dist/memory/evidence-graph-links.js +554 -0
- package/dist/memory/evidence-graph-links.js.map +1 -0
- package/dist/memory/extraction-gate.d.ts +7 -0
- package/dist/memory/extraction-gate.d.ts.map +1 -1
- package/dist/memory/extraction-gate.js +20 -8
- package/dist/memory/extraction-gate.js.map +1 -1
- package/dist/memory/global-brain.d.ts +4 -6
- package/dist/memory/global-brain.d.ts.map +1 -1
- package/dist/memory/global-brain.js +15 -2
- package/dist/memory/global-brain.js.map +1 -1
- package/dist/memory/graph-auto-populate.d.ts +73 -1
- package/dist/memory/graph-auto-populate.d.ts.map +1 -1
- package/dist/memory/graph-auto-populate.js +111 -8
- package/dist/memory/graph-auto-populate.js.map +1 -1
- package/dist/memory/import-from-provider.d.ts +19 -6
- package/dist/memory/import-from-provider.d.ts.map +1 -1
- package/dist/memory/import-from-provider.js +28 -15
- package/dist/memory/import-from-provider.js.map +1 -1
- package/dist/memory/lessons-import.d.ts +175 -0
- package/dist/memory/lessons-import.d.ts.map +1 -0
- package/dist/memory/lessons-import.js +233 -0
- package/dist/memory/lessons-import.js.map +1 -0
- package/dist/memory/lessons.d.ts +67 -0
- package/dist/memory/lessons.d.ts.map +1 -0
- package/dist/memory/lessons.js +121 -0
- package/dist/memory/lessons.js.map +1 -0
- package/dist/memory/memory-bridge.d.ts.map +1 -1
- package/dist/memory/memory-bridge.js +3 -2
- package/dist/memory/memory-bridge.js.map +1 -1
- package/dist/memory/public-api.d.ts.map +1 -1
- package/dist/memory/public-api.js +7 -6
- package/dist/memory/public-api.js.map +1 -1
- package/dist/memory/recall-ranking.d.ts +88 -0
- package/dist/memory/recall-ranking.d.ts.map +1 -0
- package/dist/memory/recall-ranking.js +130 -0
- package/dist/memory/recall-ranking.js.map +1 -0
- package/dist/memory/retrieval/build-retrieval-bundle.js +5 -5
- package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
- package/dist/memory/retrieval/fetch.d.ts +3 -2
- package/dist/memory/retrieval/fetch.d.ts.map +1 -1
- package/dist/memory/retrieval/fetch.js +4 -3
- package/dist/memory/retrieval/fetch.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts +1 -7
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +9 -58
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/memory/retrieval/search.d.ts +5 -6
- package/dist/memory/retrieval/search.d.ts.map +1 -1
- package/dist/memory/retrieval/search.js +38 -102
- package/dist/memory/retrieval/search.js.map +1 -1
- package/dist/memory/retrieval/telemetry.d.ts +5 -16
- package/dist/memory/retrieval/telemetry.d.ts.map +1 -1
- package/dist/memory/retrieval/telemetry.js +5 -22
- package/dist/memory/retrieval/telemetry.js.map +1 -1
- package/dist/nexus/analyze-orchestrator.d.ts +15 -0
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +53 -6
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/brief-map.d.ts +60 -0
- package/dist/nexus/brief-map.d.ts.map +1 -0
- package/dist/nexus/brief-map.js +234 -0
- package/dist/nexus/brief-map.js.map +1 -0
- package/dist/nexus/freshness.d.ts +128 -13
- package/dist/nexus/freshness.d.ts.map +1 -1
- package/dist/nexus/freshness.js +374 -86
- package/dist/nexus/freshness.js.map +1 -1
- package/dist/nexus/graph-manifest.d.ts +47 -0
- package/dist/nexus/graph-manifest.d.ts.map +1 -1
- package/dist/nexus/graph-manifest.js +69 -0
- package/dist/nexus/graph-manifest.js.map +1 -1
- package/dist/nexus/hooks-augment.d.ts.map +1 -1
- package/dist/nexus/hooks-augment.js +7 -3
- package/dist/nexus/hooks-augment.js.map +1 -1
- package/dist/nexus/index-health.d.ts +112 -0
- package/dist/nexus/index-health.d.ts.map +1 -0
- package/dist/nexus/index-health.js +199 -0
- package/dist/nexus/index-health.js.map +1 -0
- package/dist/nexus/living-brain.d.ts.map +1 -1
- package/dist/nexus/living-brain.js +2 -15
- package/dist/nexus/living-brain.js.map +1 -1
- package/dist/nexus/pid-lock.d.ts +50 -0
- package/dist/nexus/pid-lock.d.ts.map +1 -0
- package/dist/nexus/pid-lock.js +135 -0
- package/dist/nexus/pid-lock.js.map +1 -0
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +33 -2
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/refresh-child.js +4 -0
- package/dist/nexus/refresh-child.js.map +1 -1
- package/dist/nexus/registry-host.d.ts +70 -0
- package/dist/nexus/registry-host.d.ts.map +1 -0
- package/dist/nexus/registry-host.js +79 -0
- package/dist/nexus/registry-host.js.map +1 -0
- package/dist/nexus/registry.d.ts +37 -0
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +49 -1
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/reindex-on-merge.d.ts +94 -0
- package/dist/nexus/reindex-on-merge.d.ts.map +1 -0
- package/dist/nexus/reindex-on-merge.js +192 -0
- package/dist/nexus/reindex-on-merge.js.map +1 -0
- package/dist/orchestrate/handoff-ops.d.ts.map +1 -1
- package/dist/orchestrate/handoff-ops.js +1 -13
- package/dist/orchestrate/handoff-ops.js.map +1 -1
- package/dist/orchestrate/index.d.ts +2 -3
- package/dist/orchestrate/index.d.ts.map +1 -1
- package/dist/orchestrate/index.js +2 -2
- package/dist/orchestrate/index.js.map +1 -1
- package/dist/orchestrate/lifecycle-ops.d.ts +3 -0
- package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
- package/dist/orchestrate/lifecycle-ops.js +5 -5
- package/dist/orchestrate/lifecycle-ops.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts +8 -28
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +8 -67
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestration/lead-rollup.d.ts +7 -0
- package/dist/orchestration/lead-rollup.d.ts.map +1 -1
- package/dist/orchestration/lead-rollup.js.map +1 -1
- package/dist/orchestration/spawn-prompt.d.ts +8 -29
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +44 -112
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/orchestration/spawn.d.ts +7 -14
- package/dist/orchestration/spawn.d.ts.map +1 -1
- package/dist/orchestration/spawn.js +2 -5
- package/dist/orchestration/spawn.js.map +1 -1
- package/dist/orchestration/wave-topic.d.ts +0 -13
- package/dist/orchestration/wave-topic.d.ts.map +1 -1
- package/dist/orchestration/wave-topic.js +0 -20
- package/dist/orchestration/wave-topic.js.map +1 -1
- package/dist/release/engine-ops.js +2 -2
- package/dist/release/engine-ops.js.map +1 -1
- package/dist/release/github-pr.d.ts +8 -5
- package/dist/release/github-pr.d.ts.map +1 -1
- package/dist/release/github-pr.js +11 -16
- package/dist/release/github-pr.js.map +1 -1
- package/dist/release/plan.d.ts +4 -2
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +11 -4
- package/dist/release/plan.js.map +1 -1
- package/dist/release/pr-evidence.d.ts +39 -11
- package/dist/release/pr-evidence.d.ts.map +1 -1
- package/dist/release/pr-evidence.js +122 -31
- package/dist/release/pr-evidence.js.map +1 -1
- package/dist/release/reconcile.d.ts +15 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +36 -0
- package/dist/release/reconcile.js.map +1 -1
- package/dist/render/brain/index.d.ts +3 -2
- package/dist/render/brain/index.d.ts.map +1 -1
- package/dist/render/brain/index.js +4 -2
- package/dist/render/brain/index.js.map +1 -1
- package/dist/render/brain/migrate-repo-ids.d.ts +19 -0
- package/dist/render/brain/migrate-repo-ids.d.ts.map +1 -0
- package/dist/render/brain/migrate-repo-ids.js +41 -0
- package/dist/render/brain/migrate-repo-ids.js.map +1 -0
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +10 -1
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/resources/admission-ledger.d.ts +39 -4
- package/dist/resources/admission-ledger.d.ts.map +1 -1
- package/dist/resources/admission-ledger.js +147 -32
- package/dist/resources/admission-ledger.js.map +1 -1
- package/dist/resources/hook-footprint.d.ts +90 -0
- package/dist/resources/hook-footprint.d.ts.map +1 -0
- package/dist/resources/hook-footprint.js +245 -0
- package/dist/resources/hook-footprint.js.map +1 -0
- package/dist/resources/pressure-gate.d.ts +3 -2
- package/dist/resources/pressure-gate.d.ts.map +1 -1
- package/dist/resources/pressure-gate.js +8 -5
- package/dist/resources/pressure-gate.js.map +1 -1
- package/dist/resources/run-admission.d.ts +23 -3
- package/dist/resources/run-admission.d.ts.map +1 -1
- package/dist/resources/run-admission.js +70 -8
- package/dist/resources/run-admission.js.map +1 -1
- package/dist/resources/run-class.d.ts +1 -0
- package/dist/resources/run-class.d.ts.map +1 -1
- package/dist/resources/run-class.js +7 -0
- package/dist/resources/run-class.js.map +1 -1
- package/dist/resources/run-governed.d.ts +13 -1
- package/dist/resources/run-governed.d.ts.map +1 -1
- package/dist/resources/run-governed.js +29 -6
- package/dist/resources/run-governed.js.map +1 -1
- package/dist/resources/top-memory.d.ts +67 -0
- package/dist/resources/top-memory.d.ts.map +1 -0
- package/dist/resources/top-memory.js +143 -0
- package/dist/resources/top-memory.js.map +1 -0
- package/dist/scaffold/global-scaffold.d.ts +6 -1
- package/dist/scaffold/global-scaffold.d.ts.map +1 -1
- package/dist/scaffold/global-scaffold.js +11 -2
- package/dist/scaffold/global-scaffold.js.map +1 -1
- package/dist/scaffold/scaffold-global.d.ts +3 -2
- package/dist/scaffold/scaffold-global.d.ts.map +1 -1
- package/dist/scaffold/scaffold-global.js +3 -2
- package/dist/scaffold/scaffold-global.js.map +1 -1
- package/dist/sentient/ingesters/brain-ingester.d.ts.map +1 -1
- package/dist/sentient/ingesters/brain-ingester.js +2 -1
- package/dist/sentient/ingesters/brain-ingester.js.map +1 -1
- package/dist/session/engine-ops.js +1 -1
- package/dist/session/engine-ops.js.map +1 -1
- package/dist/sessions/briefing.d.ts +26 -0
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +46 -0
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/session-end-snapshot.d.ts +1 -1
- package/dist/sessions/session-end-snapshot.js +1 -1
- package/dist/sessions/session-id.d.ts +2 -1
- package/dist/sessions/session-id.d.ts.map +1 -1
- package/dist/sessions/session-id.js +3 -2
- package/dist/sessions/session-id.js.map +1 -1
- package/dist/store/agent-resolver.d.ts +0 -6
- package/dist/store/agent-resolver.d.ts.map +1 -1
- package/dist/store/agent-resolver.js +0 -31
- package/dist/store/agent-resolver.js.map +1 -1
- package/dist/store/memory-accessor.d.ts +45 -2
- package/dist/store/memory-accessor.d.ts.map +1 -1
- package/dist/store/memory-accessor.js +81 -7
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
- package/dist/store/schema/memory-schema.d.ts +3 -3
- package/dist/store/schema/memory-schema.d.ts.map +1 -1
- package/dist/store/schema/memory-schema.js +2 -0
- package/dist/store/schema/memory-schema.js.map +1 -1
- package/dist/store/session-store.d.ts +5 -2
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +10 -5
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sqlite-native.d.ts +5 -4
- package/dist/store/sqlite-native.d.ts.map +1 -1
- package/dist/store/sqlite-native.js +5 -4
- package/dist/store/sqlite-native.js.map +1 -1
- package/dist/store/sync/merge/rules.d.ts.map +1 -1
- package/dist/store/sync/merge/rules.js +4 -3
- package/dist/store/sync/merge/rules.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +1 -0
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/vault-manifest.js +1 -1
- package/dist/store/vault-manifest.js.map +1 -1
- package/dist/system/project-health.d.ts +7 -0
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +13 -0
- package/dist/system/project-health.js.map +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +0 -15
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +26 -11
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +54 -17
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +24 -0
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +57 -0
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +72 -9
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +227 -20
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/complete-ci.d.ts.map +1 -1
- package/dist/tasks/complete-ci.js +2 -0
- package/dist/tasks/complete-ci.js.map +1 -1
- package/dist/tasks/complete.d.ts +2 -2
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +38 -17
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +66 -18
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/epic-enforcement.d.ts +39 -1
- package/dist/tasks/epic-enforcement.d.ts.map +1 -1
- package/dist/tasks/epic-enforcement.js +46 -2
- package/dist/tasks/epic-enforcement.js.map +1 -1
- package/dist/tasks/evidence.d.ts +74 -22
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +221 -35
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +2 -12
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/qa-run-binding.d.ts +2 -0
- package/dist/tasks/qa-run-binding.d.ts.map +1 -1
- package/dist/tasks/qa-run-binding.js +6 -2
- package/dist/tasks/qa-run-binding.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +2 -0
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +8 -3
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/tasks/verification-policy.d.ts +57 -1
- package/dist/tasks/verification-policy.d.ts.map +1 -1
- package/dist/tasks/verification-policy.js +94 -1
- package/dist/tasks/verification-policy.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +2 -15
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +39 -19
- package/dist/validation/engine-ops.js.map +1 -1
- package/package.json +13 -13
- package/schemas/config.schema.json +69 -0
- package/templates/CLEO-INJECTION.md +4 -5
- package/templates/CLEO-REFERENCE.md +2 -4
- package/templates/git-hooks/post-merge +25 -0
- package/dist/memory/dispatch-trace.d.ts +0 -44
- package/dist/memory/dispatch-trace.d.ts.map +0 -1
- package/dist/memory/dispatch-trace.js +0 -65
- package/dist/memory/dispatch-trace.js.map +0 -1
- package/dist/memory/retrieval/increment-citation-counts.d.ts +0 -11
- package/dist/memory/retrieval/increment-citation-counts.d.ts.map +0 -1
- package/dist/memory/retrieval/increment-citation-counts.js +0 -43
- package/dist/memory/retrieval/increment-citation-counts.js.map +0 -1
package/dist/tasks/evidence.js
CHANGED
|
@@ -40,6 +40,7 @@ import { bindTestRunReport, configSchemaCompositionGap, coveredTestFiles, TEST_R
|
|
|
40
40
|
import { captureHead, captureTree, resolveSpawnTimeoutMs, runToolCached, } from './tool-cache.js';
|
|
41
41
|
import { CANONICAL_TOOLS, canonicalToolName, listValidToolNames, resolveToolCommand, } from './tool-resolver.js';
|
|
42
42
|
import { detectStaticVacuity, probeTscFileCount, VACUOUS_TOOL_FIX } from './tool-vacuity.js';
|
|
43
|
+
import { classifyEvidenceTask, isDocumentArtifact, isDocumentEvidencePath, } from './verification-policy.js';
|
|
43
44
|
/**
|
|
44
45
|
* Valid tool names recognised by the `tool:<name>` evidence atom.
|
|
45
46
|
*
|
|
@@ -203,6 +204,27 @@ siblingCommitSha, context) {
|
|
|
203
204
|
storeRoot: projectRoot,
|
|
204
205
|
executionRoot: resolveEvidenceExecutionRoot(projectRoot, undefined, executionRootHints),
|
|
205
206
|
};
|
|
207
|
+
// T13912: `pr:<owner>/<repo>#<n>` names the repository the number belongs
|
|
208
|
+
// to; it must be the evidence git root's origin, never another repo's PR #n.
|
|
209
|
+
if ((parsed.kind === 'pr' || parsed.kind === 'ci') && parsed.repo !== undefined) {
|
|
210
|
+
const { originRepoSlug } = await import('../release/pr-evidence.js');
|
|
211
|
+
const origin = originRepoSlug(roots.executionRoot);
|
|
212
|
+
if (origin !== parsed.repo) {
|
|
213
|
+
return {
|
|
214
|
+
ok: false,
|
|
215
|
+
codeName: 'E_EVIDENCE_INVALID',
|
|
216
|
+
reason: `${parsed.kind}:${parsed.repo}#${parsed.prNumber} names ${parsed.repo}, but the evidence ` +
|
|
217
|
+
`git root (${roots.executionRoot}) has origin ${origin ?? 'none on GitHub'}. Run it from ` +
|
|
218
|
+
"that repository's checkout, or declare it with CLEO_EVIDENCE_GIT_ROOT / evidence.gitRoot.",
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const { repo, ...bare } = parsed;
|
|
222
|
+
const named = await validateAtom(bare, projectRoot, taskId, siblingCommitSha, context);
|
|
223
|
+
if (named.ok && (named.atom.kind === 'pr' || named.atom.kind === 'ci')) {
|
|
224
|
+
return { ...named, atom: { ...named.atom, repo } };
|
|
225
|
+
}
|
|
226
|
+
return named;
|
|
227
|
+
}
|
|
206
228
|
switch (parsed.kind) {
|
|
207
229
|
case 'commit':
|
|
208
230
|
return validateCommit(parsed.sha, roots, taskId);
|
|
@@ -797,6 +819,18 @@ export function extractTaskAcFilesWithProvenance(task) {
|
|
|
797
819
|
* @task T11959 (DHQ-083 companion b — merge-commit first-parent diff)
|
|
798
820
|
*/
|
|
799
821
|
async function gitShowFiles(sha, projectRoot) {
|
|
822
|
+
return (await commitFilesOrNull(sha, projectRoot)) ?? [];
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* {@link gitShowFiles}, but null when git fails, so a caller can tell an
|
|
826
|
+
* unreadable commit from one that touched nothing (T14001, review of #2413).
|
|
827
|
+
*
|
|
828
|
+
* @param sha - Commit SHA to inspect.
|
|
829
|
+
* @param projectRoot - Working directory for git operations.
|
|
830
|
+
* @returns File paths touched by the commit, or null on git failure.
|
|
831
|
+
* @task T14001
|
|
832
|
+
*/
|
|
833
|
+
async function commitFilesOrNull(sha, projectRoot) {
|
|
800
834
|
// diff-tree with --first-parent gives a clean single-parent diff for both
|
|
801
835
|
// regular commits and merge commits (compares merge result to first parent,
|
|
802
836
|
// i.e. the branch tip before the PR was merged).
|
|
@@ -809,7 +843,7 @@ async function gitShowFiles(sha, projectRoot) {
|
|
|
809
843
|
// evidence commit happens to be the very first commit in the repo (T11959).
|
|
810
844
|
const r = await runCommand('git', ['diff-tree', '--root', '--no-commit-id', '-r', '--name-only', '-m', '--first-parent', sha], projectRoot);
|
|
811
845
|
if (r.exitCode !== 0)
|
|
812
|
-
return
|
|
846
|
+
return null;
|
|
813
847
|
return r.stdout
|
|
814
848
|
.split('\n')
|
|
815
849
|
.map((s) => s.trim())
|
|
@@ -1666,6 +1700,7 @@ async function validateTestRun(path, roots, taskId) {
|
|
|
1666
1700
|
let runHeadSha;
|
|
1667
1701
|
let configPaths = [];
|
|
1668
1702
|
let typecheckDirs = [];
|
|
1703
|
+
let untrackedSetAside = [];
|
|
1669
1704
|
if (identity) {
|
|
1670
1705
|
const binding = bindTestRunReport(parsed, abs, bindRoot, testFiles);
|
|
1671
1706
|
if (!binding.ok)
|
|
@@ -1674,6 +1709,7 @@ async function validateTestRun(path, roots, taskId) {
|
|
|
1674
1709
|
runHeadSha = binding.runHeadSha;
|
|
1675
1710
|
configPaths = binding.configPaths ?? [];
|
|
1676
1711
|
typecheckDirs = binding.typecheckDirs ?? [];
|
|
1712
|
+
untrackedSetAside = binding.untrackedSetAside ?? [];
|
|
1677
1713
|
}
|
|
1678
1714
|
return {
|
|
1679
1715
|
ok: true,
|
|
@@ -1702,6 +1738,7 @@ async function validateTestRun(path, roots, taskId) {
|
|
|
1702
1738
|
...(capture.runtimeExcluded.length > 0
|
|
1703
1739
|
? { runtimeExcluded: [...capture.runtimeExcluded] }
|
|
1704
1740
|
: {}),
|
|
1741
|
+
...(untrackedSetAside.length > 0 ? { untrackedSetAside } : {}),
|
|
1705
1742
|
},
|
|
1706
1743
|
};
|
|
1707
1744
|
}
|
|
@@ -1792,6 +1829,7 @@ async function validateQaRun(path, roots, taskId) {
|
|
|
1792
1829
|
: {}),
|
|
1793
1830
|
...(gaps?.nonCodeChange ? { nonCodeChange: true } : {}),
|
|
1794
1831
|
...(gaps?.configPaths ? { configPaths: gaps.configPaths } : {}),
|
|
1832
|
+
...(gaps?.untrackedSetAside ? { untrackedSetAside: gaps.untrackedSetAside } : {}),
|
|
1795
1833
|
},
|
|
1796
1834
|
};
|
|
1797
1835
|
}
|
|
@@ -2697,6 +2735,9 @@ async function validatePrAtom(prNumber, roots, context, componentPrNumber) {
|
|
|
2697
2735
|
kind: 'pr',
|
|
2698
2736
|
prNumber: result.prNumber,
|
|
2699
2737
|
mergeCommitSha: result.mergeCommitSha,
|
|
2738
|
+
...(componentPrNumber === undefined && result.headRefOid
|
|
2739
|
+
? { headSha: result.headRefOid }
|
|
2740
|
+
: {}),
|
|
2700
2741
|
mergedAt: result.mergedAt,
|
|
2701
2742
|
successCount: result.successCount,
|
|
2702
2743
|
totalChecks: result.totalChecks,
|
|
@@ -2747,40 +2788,9 @@ export async function linkedPrChange(prNumber, landing, roots, componentPrNumber
|
|
|
2747
2788
|
},
|
|
2748
2789
|
};
|
|
2749
2790
|
}
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
* as implementation of a code task.
|
|
2754
|
-
*
|
|
2755
|
-
* @param path - Repo-relative path.
|
|
2756
|
-
* @returns True for a documentation artifact.
|
|
2757
|
-
*/
|
|
2758
|
-
export function isDocumentArtifact(path) {
|
|
2759
|
-
return (/\.(md|mdx|rst|adoc|txt)$/i.test(path) ||
|
|
2760
|
-
/(?:^|\/)(README|LICENSE|CHANGELOG)(?:\.[^/]*)?$/i.test(path));
|
|
2761
|
-
}
|
|
2762
|
-
/**
|
|
2763
|
-
* Classify a task for evidence purposes: `research` (research/spike kind),
|
|
2764
|
-
* `documentation` (docs-only declared files or a docs label) or `code`.
|
|
2765
|
-
*
|
|
2766
|
-
* Exported so the read-only `cleo done --plan` planner chooses the same
|
|
2767
|
-
* documentary path the validators accept — one classification, not two.
|
|
2768
|
-
*
|
|
2769
|
-
* @param context - Task context; only `task` is read.
|
|
2770
|
-
* @returns The evidence classification.
|
|
2771
|
-
* @task T12624
|
|
2772
|
-
*/
|
|
2773
|
-
export function classifyEvidenceTask(context) {
|
|
2774
|
-
if (context.task.kind === 'research' || context.task.kind === 'spike')
|
|
2775
|
-
return 'research';
|
|
2776
|
-
if (context.task.files?.length && context.task.files.every(isDocumentArtifact))
|
|
2777
|
-
return 'documentation';
|
|
2778
|
-
if (context.task.kind === 'bug')
|
|
2779
|
-
return 'code';
|
|
2780
|
-
if (context.task.labels?.some((label) => label === 'docs' || label === 'documentation'))
|
|
2781
|
-
return 'documentation';
|
|
2782
|
-
return 'code';
|
|
2783
|
-
}
|
|
2791
|
+
// T14001: the evidence kind and the document rule live with the gate policy,
|
|
2792
|
+
// which every gate reader (verify, done --plan, complete, release plan) shares.
|
|
2793
|
+
export { classifyEvidenceTask, isDocumentArtifact };
|
|
2784
2794
|
/**
|
|
2785
2795
|
* Normalise an evidence path for comparison with PR changed paths: strip a
|
|
2786
2796
|
* leading `./` and trailing slashes. One normaliser for anchoring, PR
|
|
@@ -3140,6 +3150,180 @@ export function composeGateEvidence(atoms, capturedBy, override, overrideReason,
|
|
|
3140
3150
|
}
|
|
3141
3151
|
return result;
|
|
3142
3152
|
}
|
|
3153
|
+
/**
|
|
3154
|
+
* Why a `test-run:`/`qa-run:` result does not describe this task's work
|
|
3155
|
+
* (T14004), or null. The binding records the HEAD it was bound to, and that
|
|
3156
|
+
* HEAD must have seen the task's `implemented` work:
|
|
3157
|
+
*
|
|
3158
|
+
* - `commit:` — the run head is that commit or contains it. An older commit
|
|
3159
|
+
* (the branch base, main before the work) never saw the work.
|
|
3160
|
+
* - `pr:` — the run head is, or contains, the merge commit or the PR's final
|
|
3161
|
+
* head: its recorded `headSha` (a squash merge too), else the merge's second
|
|
3162
|
+
* parent. An earlier branch commit never saw the whole change.
|
|
3163
|
+
*
|
|
3164
|
+
* Evidence bound in another task's worktree is refused even when `cleo
|
|
3165
|
+
* complete` runs from that same worktree. A commit git cannot read (a shallow
|
|
3166
|
+
* clone) is refused and said so. Skipped while no implemented commit is
|
|
3167
|
+
* recorded, or for an atom with no HEAD.
|
|
3168
|
+
*
|
|
3169
|
+
* @param task - The task (its recorded `implemented` evidence is read).
|
|
3170
|
+
* @param atoms - The gate's atoms.
|
|
3171
|
+
* @param projectRoot - The CLEO store root (the task's checkout is resolved from it).
|
|
3172
|
+
* @returns The refusal, or null.
|
|
3173
|
+
* @task T14004
|
|
3174
|
+
*/
|
|
3175
|
+
export async function boundHeadGapReason(task, atoms, projectRoot) {
|
|
3176
|
+
const runs = atoms.filter((a) => (a.kind === 'test-run' || a.kind === 'qa-run') && typeof a.headSha === 'string');
|
|
3177
|
+
if (runs.length === 0)
|
|
3178
|
+
return null;
|
|
3179
|
+
const implemented = (task.verification?.evidence?.implemented?.atoms ?? []).filter((a) => a.kind === 'commit' || a.kind === 'pr');
|
|
3180
|
+
if (implemented.length === 0)
|
|
3181
|
+
return null;
|
|
3182
|
+
const { resolveChangeSetRoot } = await import('./change-set.js');
|
|
3183
|
+
const root = resolveChangeSetRoot(projectRoot, task.id).root;
|
|
3184
|
+
const gitOut = (args) => {
|
|
3185
|
+
try {
|
|
3186
|
+
return execFileSync('git', args, {
|
|
3187
|
+
cwd: root,
|
|
3188
|
+
encoding: 'utf-8',
|
|
3189
|
+
env: discoveryEnv(),
|
|
3190
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
3191
|
+
}).trim();
|
|
3192
|
+
}
|
|
3193
|
+
catch {
|
|
3194
|
+
return null;
|
|
3195
|
+
}
|
|
3196
|
+
};
|
|
3197
|
+
// Exit 1 is "not an ancestor"; anything else (128) is an object git lacks.
|
|
3198
|
+
let missing = null;
|
|
3199
|
+
const contains = (descendant, ancestor) => {
|
|
3200
|
+
try {
|
|
3201
|
+
execFileSync('git', ['merge-base', '--is-ancestor', ancestor, descendant], {
|
|
3202
|
+
cwd: root,
|
|
3203
|
+
env: discoveryEnv(),
|
|
3204
|
+
stdio: 'ignore',
|
|
3205
|
+
});
|
|
3206
|
+
return true;
|
|
3207
|
+
}
|
|
3208
|
+
catch (err) {
|
|
3209
|
+
const status = err instanceof Error && 'status' in err ? err.status : undefined;
|
|
3210
|
+
if (status !== 1)
|
|
3211
|
+
missing ??= `${ancestor}..${descendant}`;
|
|
3212
|
+
return false;
|
|
3213
|
+
}
|
|
3214
|
+
};
|
|
3215
|
+
// A prefix match needs at least 7 hex characters on both sides: '' matches everything.
|
|
3216
|
+
const sameCommit = (a, b) => a.length >= 7 && b.length >= 7 && (a.startsWith(b) || b.startsWith(a));
|
|
3217
|
+
const reached = (head, sha) => sameCommit(head, sha) || contains(head, sha);
|
|
3218
|
+
// Only positive checks accept: the run head is, or contains, the work's tip.
|
|
3219
|
+
const sawWork = (head, atom) => {
|
|
3220
|
+
if (atom.kind === 'commit')
|
|
3221
|
+
return reached(head, atom.sha);
|
|
3222
|
+
const merge = atom.mergeCommitSha;
|
|
3223
|
+
if (reached(head, merge))
|
|
3224
|
+
return true;
|
|
3225
|
+
// The PR's final head; a legacy atom without it falls back to the merge's
|
|
3226
|
+
// second parent. An ancestor of either (an earlier branch commit) never
|
|
3227
|
+
// saw the whole change.
|
|
3228
|
+
const tip = atom.headSha ?? gitOut(['rev-parse', '--verify', '--quiet', `${merge}^2`]);
|
|
3229
|
+
return tip !== null && tip !== '' && reached(head, tip);
|
|
3230
|
+
};
|
|
3231
|
+
const shas = implemented
|
|
3232
|
+
.map((a) => (a.kind === 'commit' ? a.sha : a.mergeCommitSha).slice(0, 12))
|
|
3233
|
+
.join(', ');
|
|
3234
|
+
for (const run of runs) {
|
|
3235
|
+
const head = run.headSha;
|
|
3236
|
+
missing = null;
|
|
3237
|
+
if (implemented.every((atom) => sawWork(head, atom)))
|
|
3238
|
+
continue;
|
|
3239
|
+
const bound = `${run.kind}:${run.path} was bound at ${head.slice(0, 12)}`;
|
|
3240
|
+
if (missing !== null) {
|
|
3241
|
+
return (`${bound}, and git cannot read the commits that relate it to ${task.id}'s implemented ` +
|
|
3242
|
+
`commit ${shas} (missing object, or a shallow clone: ${missing}). ` +
|
|
3243
|
+
'Fetch the full history (git fetch --unshallow) and verify again.');
|
|
3244
|
+
}
|
|
3245
|
+
// A head carrying this task's own work, but not the recorded commit: the
|
|
3246
|
+
// implemented evidence went stale (a rebase, an amend, or a squash merge
|
|
3247
|
+
// recorded before the PR head was).
|
|
3248
|
+
const message = gitOut(['log', '-n', '20', '--format=%B', head]) ?? '';
|
|
3249
|
+
if (new RegExp(`\\b${task.id}\\b`).test(message)) {
|
|
3250
|
+
return (`${bound}, which carries ${task.id}'s work but not its implemented commit ${shas}: ` +
|
|
3251
|
+
'the branch was rebased, amended or squash-merged after implemented was recorded. ' +
|
|
3252
|
+
`Re-record implemented (cleo verify ${task.id} --gate implemented ...), then the run.`);
|
|
3253
|
+
}
|
|
3254
|
+
return (`${bound}, which never saw ${task.id}'s implemented commit ${shas}: it tested other ` +
|
|
3255
|
+
"work (another task's checkout, or a commit before the change). Run the tests on this " +
|
|
3256
|
+
"task's checkout and record that report.");
|
|
3257
|
+
}
|
|
3258
|
+
return null;
|
|
3259
|
+
}
|
|
3260
|
+
/**
|
|
3261
|
+
* The evidence kind whose gates a task owes now (T14001, reviews of #2413):
|
|
3262
|
+
* {@link classifyEvidenceTask}, raised to `code` when its recorded
|
|
3263
|
+
* `implemented` evidence or `extraPaths` (a change set) touch any
|
|
3264
|
+
* non-document path — `files:` paths, a `pr:` atom's changed paths, a
|
|
3265
|
+
* `commit:` atom's diff (merge and root commits included) — or when the
|
|
3266
|
+
* task's own work does ({@link taskOwnWorkPaths}: branches citing it, commits
|
|
3267
|
+
* on the default branch whose subject cites it, and its merged PRs). A kind
|
|
3268
|
+
* or label set by any agent never lets a code change skip its tests, and
|
|
3269
|
+
* work that cannot be inspected fails closed to `code`, with the reason.
|
|
3270
|
+
*
|
|
3271
|
+
* @param task - The task (kind, files, labels and recorded evidence are read).
|
|
3272
|
+
* @param projectRoot - The CLEO store root (commits are read in the task's checkout).
|
|
3273
|
+
* @param extraPaths - Further paths the work touched (a derived change set).
|
|
3274
|
+
* @param cwd - Invocation directory, which locates the task's worktree.
|
|
3275
|
+
* @param deps - Merged-PR discovery (tests inject; defaults to `gh`).
|
|
3276
|
+
* @returns The kind, and the reason when a non-code kind owes the code gates.
|
|
3277
|
+
* @task T14001
|
|
3278
|
+
*/
|
|
3279
|
+
export async function taskEvidenceKindReport(task, projectRoot, extraPaths = [], cwd, deps = {}) {
|
|
3280
|
+
const kind = classifyEvidenceTask({ task });
|
|
3281
|
+
if (kind === 'code')
|
|
3282
|
+
return { kind };
|
|
3283
|
+
const code = (reason) => ({ kind: 'code', reason });
|
|
3284
|
+
const { resolveChangeSetRoot, taskOwnWorkPaths } = await import('./change-set.js');
|
|
3285
|
+
// The task's own branches, commits and merged PRs, whatever its evidence
|
|
3286
|
+
// cites: a spike that commits code and records `decision:` owes tests.
|
|
3287
|
+
const ownWork = await taskOwnWorkPaths(projectRoot, task.id, cwd, deps);
|
|
3288
|
+
if (!ownWork.ok)
|
|
3289
|
+
return code(`its work could not be inspected: ${ownWork.reason}`);
|
|
3290
|
+
const paths = [...extraPaths, ...ownWork.paths];
|
|
3291
|
+
const atoms = task.verification?.evidence?.implemented?.atoms ?? [];
|
|
3292
|
+
const root = resolveChangeSetRoot(projectRoot, task.id, cwd).root;
|
|
3293
|
+
for (const atom of atoms) {
|
|
3294
|
+
if (atom.kind === 'files')
|
|
3295
|
+
paths.push(...atom.files.map((f) => f.path));
|
|
3296
|
+
// A legacy `pr:` atom without its changed paths proves nothing about documents.
|
|
3297
|
+
else if (atom.kind === 'pr') {
|
|
3298
|
+
if (atom.changedPaths === undefined) {
|
|
3299
|
+
return code(`pr:${atom.prNumber} was recorded without its changed files`);
|
|
3300
|
+
}
|
|
3301
|
+
paths.push(...atom.changedPaths);
|
|
3302
|
+
}
|
|
3303
|
+
else if (atom.kind === 'commit') {
|
|
3304
|
+
// An unreadable commit proves nothing about documents: owe the code gates.
|
|
3305
|
+
const files = await commitFilesOrNull(atom.sha, root);
|
|
3306
|
+
if (files === null)
|
|
3307
|
+
return code(`git cannot read commit:${atom.sha} in ${root}`);
|
|
3308
|
+
paths.push(...files);
|
|
3309
|
+
}
|
|
3310
|
+
}
|
|
3311
|
+
const codePath = paths.find((path) => !isDocumentEvidencePath(path));
|
|
3312
|
+
return codePath === undefined ? { kind } : code(`its work touches ${codePath}`);
|
|
3313
|
+
}
|
|
3314
|
+
/**
|
|
3315
|
+
* {@link taskEvidenceKindReport}'s kind alone.
|
|
3316
|
+
*
|
|
3317
|
+
* @param task - The task (kind, files, labels and recorded evidence are read).
|
|
3318
|
+
* @param projectRoot - The CLEO store root.
|
|
3319
|
+
* @param extraPaths - Further paths the work touched (a derived change set).
|
|
3320
|
+
* @param cwd - Invocation directory, which locates the task's worktree.
|
|
3321
|
+
* @returns The kind to read {@link requiredGatesFor} with.
|
|
3322
|
+
* @task T14001
|
|
3323
|
+
*/
|
|
3324
|
+
export async function taskEvidenceKind(task, projectRoot, extraPaths = [], cwd) {
|
|
3325
|
+
return (await taskEvidenceKindReport(task, projectRoot, extraPaths, cwd)).kind;
|
|
3326
|
+
}
|
|
3143
3327
|
/**
|
|
3144
3328
|
* Critical gates for which `override`-only evidence is NEVER accepted. Closes
|
|
3145
3329
|
* the override-loophole proven 2026-05-12 — 13 mis-completed tasks in the
|
|
@@ -3258,6 +3442,8 @@ export async function revalidateEvidence(evidence, projectRoot, gate, taskId, op
|
|
|
3258
3442
|
criteria: await accessor.getAcRows(taskId),
|
|
3259
3443
|
};
|
|
3260
3444
|
let reason = checkTaskEvidenceContext(context, gate, evidence.atoms);
|
|
3445
|
+
// T14004: a run bound in another task's checkout is not this task's evidence.
|
|
3446
|
+
reason ??= await boundHeadGapReason(task, evidence.atoms, projectRoot);
|
|
3261
3447
|
if (!reason &&
|
|
3262
3448
|
!(classifyEvidenceTask(context) !== 'code' &&
|
|
3263
3449
|
isDecisionOnlyImplementation(task.verification?.evidence?.implemented) &&
|