dorfl 0.0.0 → 0.1.0
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/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { type Harness } from './harness.js';
|
|
2
|
+
import { ReviewParseError, type ReviewFinding, type ReviewVerdict, type UncertainTask } from './review-verdict.js';
|
|
3
|
+
export type { TaskEdit, UncertainTask } from './review-verdict.js';
|
|
4
|
+
export { parseReviewVerdict as parseTaskReviewVerdict } from './review-verdict.js';
|
|
5
|
+
/**
|
|
6
|
+
* **The tasker review→edit→re-review→converge LOOP** (`slicer-review-edit-loop`,
|
|
7
|
+
* GATES prd `work/prds/ready/review.md` RESOLVED DESIGN — Shape 2 / insertion point A).
|
|
8
|
+
*
|
|
9
|
+
* On the `do prd:<slug>` tasking path (`tasking.ts`/`performTask`), AFTER the
|
|
10
|
+
* agent produces a candidate set of `work/tasks/backlog/<slug>.md` tasks and BEFORE the
|
|
11
|
+
* runner finalises/lands them, this loop RUNS the `review` SKILL
|
|
12
|
+
* (`skills/review/SKILL.md`), APPLIES its findings as EDITS to the candidate task
|
|
13
|
+
* files, then re-reviews — until a pass finds NO NEW blocking issue (the natural
|
|
14
|
+
* terminator) or the `taskerLoopMax` hard cap is hit. It is an IMPROVER, NOT a one-shot
|
|
15
|
+
* gate: tasks measurably keep getting better when reviewed, so the findings feed
|
|
16
|
+
* back into edits, repeatedly. The destination/goal check is part of the SAME
|
|
17
|
+
* review pass (it can itself trigger edits — which is why it is a loop).
|
|
18
|
+
*
|
|
19
|
+
* Two axes (the M×N grid from the idea file):
|
|
20
|
+
* - **N** — the in-context multipass: ONE agent reviews AND edits in a single
|
|
21
|
+
* context, accumulating findings across angle-switched passes. `taskerLoopMax` caps
|
|
22
|
+
* N so the loop can never run forever.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ ASPIRATION-VS-BUILT (2026-06-10): the "single context" wording above is the
|
|
25
|
+
* prd's ASPIRATION, NOT what this module does at runtime. The ACTUAL N loop is
|
|
26
|
+
* RUNNER-DRIVEN and PER-PASS: `runOneExecution` does `for (pass …) { gate(…);
|
|
27
|
+
* applyEdits(…to disk…) }` — ONE agent LAUNCH per pass, the runner writing the
|
|
28
|
+
* agent's edits to the candidate task FILES (`work/tasks/backlog/`) between passes, the
|
|
29
|
+
* next pass's agent re-reading the edited files. Accumulation is via DISK +
|
|
30
|
+
* re-launch, NOT one agent retaining context. `prd/review.md` §Shape 2 is internally
|
|
31
|
+
* contradictory on this (single-context headline vs "edit the files" operative spec);
|
|
32
|
+
* this code implements the operative reading. See
|
|
33
|
+
* `work/findings/review-edit-loop-single-context-is-unbuilt-aspiration-vs-per-pass-disk-impl.md`.
|
|
34
|
+
* (Relevant to intake: PR #62's lone-task loop mirrors this per-pass STRUCTURE but
|
|
35
|
+
* accumulates IN-MEMORY, because intake must not write to `work/tasks/backlog/` pre-emit.)
|
|
36
|
+
* - **M** — fresh-context re-executions: a fresh context is simply a NEW EXECUTION
|
|
37
|
+
* of that same loop in a fresh harness launch (like the Gate-2 reviewer). The
|
|
38
|
+
* loop is implemented ONCE; M is invoking it again. `M=1` is the cheap default;
|
|
39
|
+
* `M=k` runs k independent fresh loops.
|
|
40
|
+
*
|
|
41
|
+
* This module wires the loop + edit-application + verdict routing AROUND the
|
|
42
|
+
* `review` SKILL — it does NOT re-author the protocol (the lenses + the destination
|
|
43
|
+
* check live in the skill). The agent makes the review/edit JUDGEMENTS through the
|
|
44
|
+
* {@link TaskReviewGate} seam; this module applies the edits to disk and routes
|
|
45
|
+
* the final verdict to the THREE outcomes (folded in from the deleted
|
|
46
|
+
* `autotask-confidence`, decision B):
|
|
47
|
+
*
|
|
48
|
+
* - **converge** (a pass found no NEW blocking issue) → the improved tasks land
|
|
49
|
+
* claimable.
|
|
50
|
+
* - **a specific uncertain task** → emit it `needsAnswers: true` with the
|
|
51
|
+
* questions in its body (created, not agent-buildable until a human answers).
|
|
52
|
+
* - **the whole decomposition unclear / `taskerLoopMax` exhausted with blockers** →
|
|
53
|
+
* route the prd to `work/needs-attention/<slug>.md` with the questions as the
|
|
54
|
+
* reason, emitting NO guessed tasks.
|
|
55
|
+
*
|
|
56
|
+
* The verdict sink itself (the git transitions for those three outcomes) is the
|
|
57
|
+
* caller's (`tasking.ts`): this module decides WHICH outcome and prepares the
|
|
58
|
+
* edits/questions; the runner owns every git-state transition (the agent does no
|
|
59
|
+
* git, here as everywhere).
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* Backwards-compatible alias for {@link ReviewFinding}. Existing imports keep
|
|
63
|
+
* compiling; new code should reach for `ReviewFinding` from `review-verdict.ts`.
|
|
64
|
+
*/
|
|
65
|
+
export type TaskReviewFinding = ReviewFinding;
|
|
66
|
+
/**
|
|
67
|
+
* The tasker-loop verdict shape is now the UNIFIED {@link ReviewVerdict}
|
|
68
|
+
* (task `review-protocol-doc-and-shared-machinery`). The tasker consumes the
|
|
69
|
+
* `edits` / `uncertainTasks` / `decompositionUnclear` channels; other review
|
|
70
|
+
* callers consume different channels of the same wide type. This alias keeps
|
|
71
|
+
* existing imports compiling; the standalone `TaskReviewVerdict` is retired.
|
|
72
|
+
*/
|
|
73
|
+
export type TaskReviewVerdict = ReviewVerdict;
|
|
74
|
+
/** What the review gate needs to launch a fresh-context review+edit pass. */
|
|
75
|
+
export interface TaskReviewGateInput {
|
|
76
|
+
/** The prd slug whose candidate tasks are under review. */
|
|
77
|
+
slug: string;
|
|
78
|
+
/** The working clone/checkout the loop runs in (candidate tasks live here). */
|
|
79
|
+
cwd: string;
|
|
80
|
+
/** Repo-relative paths of the candidate tasks currently on disk. */
|
|
81
|
+
candidateTasks: string[];
|
|
82
|
+
/** Which review PASS this is (1-based) within the current fresh context (the N). */
|
|
83
|
+
pass: number;
|
|
84
|
+
/** Which fresh-context EXECUTION this is (1-based) — the M. */
|
|
85
|
+
execution: number;
|
|
86
|
+
/**
|
|
87
|
+
* The model the IMPROVER-loop REVIEW agent runs on (de-correlated from the
|
|
88
|
+
* tasker; the `--tasker-loop-model` family). `undefined` ⇒ no forced model.
|
|
89
|
+
* Flows through `LaunchInput.model` / `substituteModel`. DISTINCT from the
|
|
90
|
+
* acceptance gate's `reviewModel`.
|
|
91
|
+
*/
|
|
92
|
+
taskerLoopModel?: string;
|
|
93
|
+
/** The HOST-ONLY sessions root the review session FILE is generated under. */
|
|
94
|
+
sessionsDir?: string;
|
|
95
|
+
/** Environment for the review-agent launch. */
|
|
96
|
+
env?: NodeJS.ProcessEnv;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The tasker-review-loop SEAM: run ONE fresh-context review+edit pass of the
|
|
100
|
+
* candidate tasks and return a parsed verdict (incl. the edits to apply). Injected
|
|
101
|
+
* by tests (a canned verdict+edits, no real model); production uses
|
|
102
|
+
* {@link harnessTaskReviewGate}. Mirrors `do`'s `DoDorfl` / Gate-2's
|
|
103
|
+
* `ReviewGate` injectable-seam shape so the loop wiring is testable as pure logic.
|
|
104
|
+
*/
|
|
105
|
+
export type TaskReviewGate = (input: TaskReviewGateInput) => Promise<TaskReviewVerdict>;
|
|
106
|
+
/** The terminal disposition of the loop — the three RESOLVED-DESIGN outcomes. */
|
|
107
|
+
export type LoopOutcome =
|
|
108
|
+
/** A pass found no NEW blocking issue: the improved tasks land claimable. */
|
|
109
|
+
'converged'
|
|
110
|
+
/** `taskerLoopMax` hit with blockers → specific uncertain task(s) → needsAnswers. */
|
|
111
|
+
| 'uncertain-tasks'
|
|
112
|
+
/** `taskerLoopMax` hit / decomposition unclear → route the prd to needs-attention. */
|
|
113
|
+
| 'decomposition-unclear';
|
|
114
|
+
/** The result of running the loop — the disposition the caller's sink routes. */
|
|
115
|
+
export interface RunTaskReviewLoopResult {
|
|
116
|
+
/** Which of the three outcomes the loop reached. */
|
|
117
|
+
outcome: LoopOutcome;
|
|
118
|
+
/**
|
|
119
|
+
* The candidate tasks as they stand AFTER all applied edits, keyed by
|
|
120
|
+
* repo-relative path → final content. The caller commits these (on
|
|
121
|
+
* `converged`/`uncertain-tasks`) — on `decomposition-unclear` it emits NO
|
|
122
|
+
* tasks, so this is informational only.
|
|
123
|
+
*/
|
|
124
|
+
tasks: Record<string, string>;
|
|
125
|
+
/**
|
|
126
|
+
* On `uncertain-tasks`: the specific tasks to emit `needsAnswers: true` with
|
|
127
|
+
* the questions recorded in their bodies. Empty otherwise.
|
|
128
|
+
*/
|
|
129
|
+
uncertainTasks: UncertainTask[];
|
|
130
|
+
/**
|
|
131
|
+
* On `decomposition-unclear`: the questions to record as the spec's
|
|
132
|
+
* needs-attention reason (no guessed tasks emitted). Empty otherwise.
|
|
133
|
+
*/
|
|
134
|
+
specQuestions: string[];
|
|
135
|
+
/** How many review passes ran in total across all M executions. */
|
|
136
|
+
passes: number;
|
|
137
|
+
/** How many fresh-context executions (M) ran. */
|
|
138
|
+
executions: number;
|
|
139
|
+
/** Human-readable summary of the terminal condition. */
|
|
140
|
+
message: string;
|
|
141
|
+
}
|
|
142
|
+
export interface RunTaskReviewLoopOptions {
|
|
143
|
+
/** The prd slug whose candidate tasks are being improved. */
|
|
144
|
+
slug: string;
|
|
145
|
+
/** The working clone/checkout the loop runs in. */
|
|
146
|
+
cwd: string;
|
|
147
|
+
/** The review+edit gate seam (tests inject a canned verdict; production: harness). */
|
|
148
|
+
gate: TaskReviewGate;
|
|
149
|
+
/**
|
|
150
|
+
* **The SCOPING FENCE (the requeue fix).** A snapshot of `work/tasks/backlog/` taken
|
|
151
|
+
* BEFORE this tasking run produced its candidate tasks (filename → content;
|
|
152
|
+
* the `before` map `performTask` already computes at step 3). The loop reviews,
|
|
153
|
+
* edits, and flags ONLY the tasks that are NEW or CHANGED vs this snapshot —
|
|
154
|
+
* i.e. THIS run's own output — NEVER the pre-existing, already-landed tasks
|
|
155
|
+
* that share the same `work/tasks/backlog/` directory (the normal steady state). On a
|
|
156
|
+
* populated backlog this is what keeps the loop from editing / `needsAnswers`-
|
|
157
|
+
* flagging unrelated tasks and sweeping them into the runner-owned tasking
|
|
158
|
+
* commit. Omitted ⇒ an EMPTY snapshot (every `work/tasks/backlog/*.md` is treated as
|
|
159
|
+
* this run's output — the legacy whole-directory behaviour, kept only for the
|
|
160
|
+
* degenerate empty-backlog case / direct callers that pass none).
|
|
161
|
+
*/
|
|
162
|
+
before?: Map<string, string>;
|
|
163
|
+
/**
|
|
164
|
+
* The HARD CAP on in-context review passes (N) per fresh context. Reaching it
|
|
165
|
+
* with unresolved blockers REJECTS via the sink (never an infinite loop). The
|
|
166
|
+
* natural terminator (no new blocking issue) usually fires first.
|
|
167
|
+
*/
|
|
168
|
+
taskerLoopMax: number;
|
|
169
|
+
/**
|
|
170
|
+
* How many fresh-context EXECUTIONS (M) to run — each a NEW launch of the same
|
|
171
|
+
* loop in a fresh context. Default 1 (the cheap degenerate case). `M>1` runs M
|
|
172
|
+
* independent fresh loops; the first that converges wins, else the last
|
|
173
|
+
* execution's blocking verdict is routed.
|
|
174
|
+
*/
|
|
175
|
+
executions?: number;
|
|
176
|
+
/** The model the improver-loop review agent runs on (de-correlation; `--tasker-loop-model`). */
|
|
177
|
+
taskerLoopModel?: string;
|
|
178
|
+
/** The HOST-ONLY sessions root for the review session file. */
|
|
179
|
+
sessionsDir?: string;
|
|
180
|
+
/** Environment for child processes. */
|
|
181
|
+
env?: NodeJS.ProcessEnv;
|
|
182
|
+
/** Sink for human-readable progress notes. */
|
|
183
|
+
note?: (message: string) => void;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Run the tasker review→edit→converge loop over the candidate tasks currently on
|
|
187
|
+
* disk under `work/tasks/backlog/`. Implements the loop ONCE; M (fresh-context
|
|
188
|
+
* re-executions) is just invoking the inner loop again with a fresh launch.
|
|
189
|
+
*
|
|
190
|
+
* Within ONE execution (the N): run the gate (a review+edit pass), APPLY its edits
|
|
191
|
+
* to the candidate task files, then re-review — until `verdict === 'approve'` (no
|
|
192
|
+
* NEW blocking issue → converged) or the pass count reaches `taskerLoopMax`. On the cap
|
|
193
|
+
* with a still-`block` verdict, ROUTE per the verdict's channels:
|
|
194
|
+
* - `decompositionUnclear` set ⇒ `decomposition-unclear` (prd → needs-attention,
|
|
195
|
+
* no guessed tasks);
|
|
196
|
+
* - else `uncertainTasks` (or, as a floor, every candidate task) ⇒
|
|
197
|
+
* `uncertain-tasks` (those tasks emitted `needsAnswers: true` + questions).
|
|
198
|
+
*
|
|
199
|
+
* With `executions > 1`, the WHOLE loop is re-run in a fresh context; the first
|
|
200
|
+
* execution that converges short-circuits and lands, otherwise the LAST
|
|
201
|
+
* execution's blocking routing is taken (a persistent block across M fresh
|
|
202
|
+
* contexts is a strong signal).
|
|
203
|
+
*/
|
|
204
|
+
export declare function runTaskReviewLoop(options: RunTaskReviewLoopOptions): Promise<RunTaskReviewLoopResult>;
|
|
205
|
+
/** What a harness-backed task-review gate needs to launch the review agent. */
|
|
206
|
+
export interface HarnessTaskReviewGateOptions {
|
|
207
|
+
/** The harness seam used to launch the fresh-context review+edit agent. */
|
|
208
|
+
harness?: Harness;
|
|
209
|
+
/** The agent command the null/shell adapter shells out to (`{model}`-aware). */
|
|
210
|
+
agentCmd?: string;
|
|
211
|
+
/**
|
|
212
|
+
* Read the review agent's textual output for parsing. Production reads
|
|
213
|
+
* `launched.output` (the harness seam's ANSWER channel, task
|
|
214
|
+
* `harness-agent-output`); tests inject `readOutput` to stub a canned verdict
|
|
215
|
+
* string. Defaults to the launch's `output` verbatim.
|
|
216
|
+
*/
|
|
217
|
+
readOutput?: (output: string | undefined) => string;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Backwards-compatible alias for {@link ReviewParseError} — unified across all
|
|
221
|
+
* review callers. New code should reach for `ReviewParseError` directly.
|
|
222
|
+
*/
|
|
223
|
+
export declare const TaskReviewParseError: typeof ReviewParseError;
|
|
224
|
+
export type TaskReviewParseError = ReviewParseError;
|
|
225
|
+
/**
|
|
226
|
+
* The PRODUCTION tasker-review gate: launch the `review` SKILL as a fresh-context
|
|
227
|
+
* agent through the EXISTING harness seam (a fresh context per pass = a fresh
|
|
228
|
+
* launch, like the Gate-2 reviewer), routing the `reviewModel` override via
|
|
229
|
+
* `LaunchInput.model` (the §13 model-routing intent — NOT a new mechanism), then
|
|
230
|
+
* parse the emitted `{verdict, findings, edits, …}`.
|
|
231
|
+
*
|
|
232
|
+
* The agent makes the review/edit JUDGEMENTS (it runs the skill's lenses + the
|
|
233
|
+
* destination check and proposes edits); this gate only launches it and parses its
|
|
234
|
+
* verdict. The runner (the loop) applies the edits to disk and routes the verdict —
|
|
235
|
+
* the agent does no git / no escaping disk writes.
|
|
236
|
+
*/
|
|
237
|
+
export declare function harnessTaskReviewGate(options?: HarnessTaskReviewGateOptions): TaskReviewGate;
|
|
238
|
+
/**
|
|
239
|
+
* Render the task-review-loop PROMPT: instruct a fresh-context agent to run the
|
|
240
|
+
* `review` SKILL on the candidate tasks for `slug` (the lenses IN ORDER, ENDING in
|
|
241
|
+
* the destination/goal check — which may itself trigger edits), and to EMIT a
|
|
242
|
+
* single JSON object carrying the verdict, the findings, the EDITS to apply, and
|
|
243
|
+
* the routing channels (so {@link parseTaskReviewVerdict} can read it). The skill
|
|
244
|
+
* carries the protocol; this prompt frames the artifact (a candidate decomposition)
|
|
245
|
+
* + the required output shape (incl. the improver `edits` and the two non-converge
|
|
246
|
+
* routing channels).
|
|
247
|
+
*/
|
|
248
|
+
export declare function buildTaskReviewPrompt(input: TaskReviewGateInput): string;
|
|
249
|
+
//# sourceMappingURL=tasker-review-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasker-review-loop.d.ts","sourceRoot":"","sources":["../src/tasker-review-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { workFolderPrefix, workFolderPath, workItemRel, stripWorkFolderPrefix, isWorkItemFile, } from './work-layout.js';
|
|
4
|
+
import { NullHarness } from './harness.js';
|
|
5
|
+
import { launchWithOptionalWatch } from './agent-launch.js';
|
|
6
|
+
import { parseReviewVerdict, ReviewParseError, reviewDisciplinePrompt, verdictContractPrompt, } from './review-verdict.js';
|
|
7
|
+
export { parseReviewVerdict as parseTaskReviewVerdict } from './review-verdict.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run the tasker review→edit→converge loop over the candidate tasks currently on
|
|
10
|
+
* disk under `work/tasks/backlog/`. Implements the loop ONCE; M (fresh-context
|
|
11
|
+
* re-executions) is just invoking the inner loop again with a fresh launch.
|
|
12
|
+
*
|
|
13
|
+
* Within ONE execution (the N): run the gate (a review+edit pass), APPLY its edits
|
|
14
|
+
* to the candidate task files, then re-review — until `verdict === 'approve'` (no
|
|
15
|
+
* NEW blocking issue → converged) or the pass count reaches `taskerLoopMax`. On the cap
|
|
16
|
+
* with a still-`block` verdict, ROUTE per the verdict's channels:
|
|
17
|
+
* - `decompositionUnclear` set ⇒ `decomposition-unclear` (prd → needs-attention,
|
|
18
|
+
* no guessed tasks);
|
|
19
|
+
* - else `uncertainTasks` (or, as a floor, every candidate task) ⇒
|
|
20
|
+
* `uncertain-tasks` (those tasks emitted `needsAnswers: true` + questions).
|
|
21
|
+
*
|
|
22
|
+
* With `executions > 1`, the WHOLE loop is re-run in a fresh context; the first
|
|
23
|
+
* execution that converges short-circuits and lands, otherwise the LAST
|
|
24
|
+
* execution's blocking routing is taken (a persistent block across M fresh
|
|
25
|
+
* contexts is a strong signal).
|
|
26
|
+
*/
|
|
27
|
+
export async function runTaskReviewLoop(options) {
|
|
28
|
+
const note = options.note ?? (() => { });
|
|
29
|
+
const executions = Math.max(1, options.executions ?? 1);
|
|
30
|
+
const taskerLoopMax = Math.max(1, options.taskerLoopMax);
|
|
31
|
+
// The SCOPING FENCE: review/edit/flag ONLY this run's own new-or-changed
|
|
32
|
+
// tasks, never pre-existing landed ones (the requeue fix). No snapshot ⇒ an
|
|
33
|
+
// empty one (the legacy whole-directory behaviour for the empty-backlog case).
|
|
34
|
+
const before = options.before ?? new Map();
|
|
35
|
+
let totalPasses = 0;
|
|
36
|
+
let last;
|
|
37
|
+
for (let m = 1; m <= executions; m++) {
|
|
38
|
+
if (executions > 1) {
|
|
39
|
+
note(`Tasker review loop — fresh context ${m}/${executions}.`);
|
|
40
|
+
}
|
|
41
|
+
const exec = await runOneExecution({
|
|
42
|
+
slug: options.slug,
|
|
43
|
+
cwd: options.cwd,
|
|
44
|
+
gate: options.gate,
|
|
45
|
+
taskerLoopMax,
|
|
46
|
+
execution: m,
|
|
47
|
+
before,
|
|
48
|
+
taskerLoopModel: options.taskerLoopModel,
|
|
49
|
+
sessionsDir: options.sessionsDir,
|
|
50
|
+
env: options.env,
|
|
51
|
+
note,
|
|
52
|
+
});
|
|
53
|
+
totalPasses += exec.passes;
|
|
54
|
+
last = exec;
|
|
55
|
+
if (exec.converged) {
|
|
56
|
+
note(`Tasker review loop converged after ${exec.passes} pass(es)` +
|
|
57
|
+
(executions > 1 ? ` in fresh context ${m}/${executions}` : '') +
|
|
58
|
+
'; the improved tasks land.');
|
|
59
|
+
return {
|
|
60
|
+
outcome: 'converged',
|
|
61
|
+
tasks: readCandidates(options.cwd, before),
|
|
62
|
+
uncertainTasks: [],
|
|
63
|
+
specQuestions: [],
|
|
64
|
+
passes: totalPasses,
|
|
65
|
+
executions: m,
|
|
66
|
+
message: `Tasked '${options.slug}' — the review→edit loop converged ` +
|
|
67
|
+
`(${totalPasses} pass(es), ${m} fresh context(s)); no new blocking ` +
|
|
68
|
+
'issue. The improved tasks land claimable.',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Every execution hit `taskerLoopMax` with unresolved blockers — REJECT via the
|
|
73
|
+
// sink. The LAST execution's verdict carries the routing channels.
|
|
74
|
+
const verdict = last.lastVerdict;
|
|
75
|
+
if (verdict.decompositionUnclear) {
|
|
76
|
+
const questions = verdict.decompositionUnclear.questions;
|
|
77
|
+
note(`Tasker review loop did not converge within taskerLoopMax=${taskerLoopMax} ` +
|
|
78
|
+
`across ${executions} fresh context(s); the whole decomposition is ` +
|
|
79
|
+
'unclear — routing the prd to needs-attention (no guessed tasks).');
|
|
80
|
+
return {
|
|
81
|
+
outcome: 'decomposition-unclear',
|
|
82
|
+
tasks: readCandidates(options.cwd, before),
|
|
83
|
+
uncertainTasks: [],
|
|
84
|
+
specQuestions: questions,
|
|
85
|
+
passes: totalPasses,
|
|
86
|
+
executions,
|
|
87
|
+
message: `The decomposition of '${options.slug}' is still unclear after ` +
|
|
88
|
+
`taskerLoopMax=${taskerLoopMax} review pass(es) across ${executions} fresh ` +
|
|
89
|
+
'context(s); routing the prd to needs-attention with the open ' +
|
|
90
|
+
'questions, emitting no guessed tasks.',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// A specific-task rejection: emit the uncertain task(s) `needsAnswers: true`.
|
|
94
|
+
// SCOPED to THIS run's own output (the requeue fix): an agent-named uncertain
|
|
95
|
+
// task that is NOT one of this run's new-or-changed tasks is DROPPED (the
|
|
96
|
+
// agent must never flag a pre-existing landed task). Floor: if the agent named
|
|
97
|
+
// none (or named only out-of-scope ones) but still blocks, treat THIS run's own
|
|
98
|
+
// candidates as uncertain — never land a task the loop could not approve, never
|
|
99
|
+
// silently drop the rejection, but never escape to unrelated tasks.
|
|
100
|
+
const ownPaths = new Set(newOrChangedBacklog(options.cwd, before));
|
|
101
|
+
const named = (verdict.uncertainTasks ?? []).filter((u) => {
|
|
102
|
+
const normalized = u.path.replace(/\\/g, '/');
|
|
103
|
+
if (ownPaths.has(normalized)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
note(`Dropped an uncertain-task flag on ${u.path} — not one of THIS run’s ` +
|
|
107
|
+
'own candidate tasks (the loop never flags pre-existing landed tasks).');
|
|
108
|
+
return false;
|
|
109
|
+
});
|
|
110
|
+
const uncertain = named.length > 0
|
|
111
|
+
? named
|
|
112
|
+
: [...ownPaths].sort().map((path) => ({
|
|
113
|
+
path,
|
|
114
|
+
questions: blockingQuestions(verdict),
|
|
115
|
+
}));
|
|
116
|
+
note(`Tasker review loop did not converge within taskerLoopMax=${taskerLoopMax} across ` +
|
|
117
|
+
`${executions} fresh context(s); emitting ${uncertain.length} uncertain ` +
|
|
118
|
+
'task(s) with needsAnswers + questions.');
|
|
119
|
+
return {
|
|
120
|
+
outcome: 'uncertain-tasks',
|
|
121
|
+
tasks: readCandidates(options.cwd, before),
|
|
122
|
+
uncertainTasks: uncertain,
|
|
123
|
+
specQuestions: [],
|
|
124
|
+
passes: totalPasses,
|
|
125
|
+
executions,
|
|
126
|
+
message: `Tasking '${options.slug}' did not converge after taskerLoopMax=${taskerLoopMax} ` +
|
|
127
|
+
`review pass(es) across ${executions} fresh context(s); ` +
|
|
128
|
+
`${uncertain.length} task(s) emitted needsAnswers: true with the open ` +
|
|
129
|
+
'questions in their bodies (a human must answer before they are buildable).',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Run ONE fresh-context execution of the in-context (N) review→edit loop. */
|
|
133
|
+
async function runOneExecution(params) {
|
|
134
|
+
const { slug, cwd, gate, taskerLoopMax, execution, before, note } = params;
|
|
135
|
+
let lastVerdict = { verdict: 'block', findings: [] };
|
|
136
|
+
let passes = 0;
|
|
137
|
+
for (let pass = 1; pass <= taskerLoopMax; pass++) {
|
|
138
|
+
// SCOPED: only THIS run's own new-or-changed tasks are reviewed — a task
|
|
139
|
+
// the loop CREATED in an earlier pass is new-vs-`before` so it is in scope;
|
|
140
|
+
// a pre-existing landed task is unchanged so it is NOT (the requeue fix).
|
|
141
|
+
const candidateTasks = newOrChangedBacklog(cwd, before);
|
|
142
|
+
const verdict = await gate({
|
|
143
|
+
slug,
|
|
144
|
+
cwd,
|
|
145
|
+
candidateTasks,
|
|
146
|
+
pass,
|
|
147
|
+
execution,
|
|
148
|
+
taskerLoopModel: params.taskerLoopModel,
|
|
149
|
+
sessionsDir: params.sessionsDir,
|
|
150
|
+
env: params.env,
|
|
151
|
+
});
|
|
152
|
+
passes = pass;
|
|
153
|
+
lastVerdict = verdict;
|
|
154
|
+
// APPLY the edits to the candidate task files (the improver step) — the
|
|
155
|
+
// runner writes the agent's full-content edits; the agent does no disk/git.
|
|
156
|
+
// SCOPED to this run's own output: an edit may improve a task THIS run
|
|
157
|
+
// produced or CREATE a new candidate, but NEVER overwrite a pre-existing
|
|
158
|
+
// landed task (the requeue fix).
|
|
159
|
+
if (verdict.edits && verdict.edits.length > 0) {
|
|
160
|
+
applyEdits(cwd, verdict.edits, before, note);
|
|
161
|
+
}
|
|
162
|
+
if (verdict.verdict === 'approve') {
|
|
163
|
+
return { converged: true, lastVerdict: verdict, passes };
|
|
164
|
+
}
|
|
165
|
+
note(`Tasker review pass ${pass}/${taskerLoopMax} (context ${execution}) found ` +
|
|
166
|
+
`${blockingCount(verdict)} blocking issue(s); ` +
|
|
167
|
+
`${verdict.edits?.length ?? 0} edit(s) applied — re-reviewing.`);
|
|
168
|
+
}
|
|
169
|
+
return { converged: false, lastVerdict, passes };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Apply the review agent's full-content edits to the candidate task files. ONLY
|
|
173
|
+
* paths under `work/tasks/backlog/` are written — the loop improves the CANDIDATE TASKS,
|
|
174
|
+
* never escapes to other parts of the tree (a defensive scope fence; the runner,
|
|
175
|
+
* not the agent, performs the write). An edit may CREATE a new candidate task file
|
|
176
|
+
* (e.g. the review split one task into two) — that is in-scope.
|
|
177
|
+
*
|
|
178
|
+
* **SCOPED to this run's own output (the requeue fix).** Beyond the
|
|
179
|
+
* `work/tasks/backlog/` prefix fence, an edit is only applied when its target is THIS
|
|
180
|
+
* run's own task: either a path NOT present in the `before` snapshot (a task this
|
|
181
|
+
* run created, or a new file the review is splitting out) OR one this run already
|
|
182
|
+
* changed vs `before`. A pre-existing, unchanged landed task (present in `before`
|
|
183
|
+
* with identical content) is REFUSED — the loop must never edit an unrelated,
|
|
184
|
+
* already-landed task and sweep it into the runner-owned tasking commit.
|
|
185
|
+
*/
|
|
186
|
+
function applyEdits(cwd, edits, before, note) {
|
|
187
|
+
for (const edit of edits) {
|
|
188
|
+
const normalized = edit.path.replace(/\\/g, '/');
|
|
189
|
+
const filename = stripWorkFolderPrefix(normalized, 'tasks-backlog');
|
|
190
|
+
if (filename === undefined || normalized.includes('..')) {
|
|
191
|
+
note(`Skipped a review edit outside ${workFolderPrefix('tasks-backlog')} (${edit.path}) — the ` +
|
|
192
|
+
'loop only improves candidate tasks.');
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// A pre-existing task this run did NOT touch must not be overwritten: it is
|
|
196
|
+
// in `before` and the current on-disk content still equals the snapshot.
|
|
197
|
+
if (before.has(filename)) {
|
|
198
|
+
const abs = join(cwd, normalized);
|
|
199
|
+
let current;
|
|
200
|
+
try {
|
|
201
|
+
current = readFileSync(abs, 'utf8');
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
current = undefined;
|
|
205
|
+
}
|
|
206
|
+
if (current !== undefined && current === before.get(filename)) {
|
|
207
|
+
note(`Skipped a review edit to the pre-existing landed task ${edit.path} ` +
|
|
208
|
+
'— the loop only improves THIS run’s own candidate tasks.');
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const abs = join(cwd, normalized);
|
|
213
|
+
writeFileSync(abs, edit.content);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Repo-relative paths of the `work/tasks/backlog/*.md` files that are NEW or CHANGED vs
|
|
218
|
+
* the `before` snapshot — exactly THIS tasking run's own output (the requeue-fix
|
|
219
|
+
* scoping fence). A pre-existing task present in `before` with identical content
|
|
220
|
+
* is excluded; a file the loop created (absent from `before`) or improved (content
|
|
221
|
+
* differs) is included. Mirrors `tasking.ts`'s `newOrChangedBacklog`.
|
|
222
|
+
*/
|
|
223
|
+
function newOrChangedBacklog(cwd, before) {
|
|
224
|
+
const dir = workFolderPath(cwd, 'tasks-backlog');
|
|
225
|
+
let entries;
|
|
226
|
+
try {
|
|
227
|
+
entries = readdirSync(dir);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
const out = [];
|
|
233
|
+
for (const name of entries) {
|
|
234
|
+
if (!isWorkItemFile(name)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const content = readFileSync(join(dir, name), 'utf8');
|
|
238
|
+
if (before.get(name) !== content) {
|
|
239
|
+
out.push(workItemRel('tasks-backlog', name));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return out.sort();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* THIS run's candidate tasks keyed by repo-relative path → current content —
|
|
246
|
+
* scoped to the new-or-changed set (never the pre-existing landed tasks).
|
|
247
|
+
*/
|
|
248
|
+
function readCandidates(cwd, before) {
|
|
249
|
+
const out = {};
|
|
250
|
+
for (const rel of newOrChangedBacklog(cwd, before)) {
|
|
251
|
+
out[rel] = readFileSync(join(cwd, rel), 'utf8');
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
/** Count blocking findings in a verdict. */
|
|
256
|
+
function blockingCount(verdict) {
|
|
257
|
+
return verdict.findings.filter((f) => f.severity === 'blocking').length;
|
|
258
|
+
}
|
|
259
|
+
/** The blocking findings' questions (the floor questions for an unnamed rejection). */
|
|
260
|
+
function blockingQuestions(verdict) {
|
|
261
|
+
const blocking = verdict.findings.filter((f) => f.severity === 'blocking');
|
|
262
|
+
const source = blocking.length > 0 ? blocking : verdict.findings;
|
|
263
|
+
return source.map((f) => f.context ? `${f.question} (${f.context})` : f.question);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Backwards-compatible alias for {@link ReviewParseError} — unified across all
|
|
267
|
+
* review callers. New code should reach for `ReviewParseError` directly.
|
|
268
|
+
*/
|
|
269
|
+
export const TaskReviewParseError = ReviewParseError;
|
|
270
|
+
/**
|
|
271
|
+
* The PRODUCTION tasker-review gate: launch the `review` SKILL as a fresh-context
|
|
272
|
+
* agent through the EXISTING harness seam (a fresh context per pass = a fresh
|
|
273
|
+
* launch, like the Gate-2 reviewer), routing the `reviewModel` override via
|
|
274
|
+
* `LaunchInput.model` (the §13 model-routing intent — NOT a new mechanism), then
|
|
275
|
+
* parse the emitted `{verdict, findings, edits, …}`.
|
|
276
|
+
*
|
|
277
|
+
* The agent makes the review/edit JUDGEMENTS (it runs the skill's lenses + the
|
|
278
|
+
* destination check and proposes edits); this gate only launches it and parses its
|
|
279
|
+
* verdict. The runner (the loop) applies the edits to disk and routes the verdict —
|
|
280
|
+
* the agent does no git / no escaping disk writes.
|
|
281
|
+
*/
|
|
282
|
+
export function harnessTaskReviewGate(options = {}) {
|
|
283
|
+
const harness = options.harness ?? new NullHarness();
|
|
284
|
+
const readOutput = options.readOutput ?? ((output) => output ?? '');
|
|
285
|
+
return async (input) => {
|
|
286
|
+
const launched = await launchWithOptionalWatch({
|
|
287
|
+
harness,
|
|
288
|
+
dir: input.cwd,
|
|
289
|
+
slug: input.slug,
|
|
290
|
+
command: options.agentCmd ?? '',
|
|
291
|
+
prompt: buildTaskReviewPrompt(input),
|
|
292
|
+
model: input.taskerLoopModel,
|
|
293
|
+
// A DISTINCT session id per pass + fresh context so launches never collide.
|
|
294
|
+
sessionId: `task-review-${input.slug}-m${input.execution}-n${input.pass}`,
|
|
295
|
+
sessionsDir: input.sessionsDir,
|
|
296
|
+
env: input.env,
|
|
297
|
+
});
|
|
298
|
+
if (!launched.ok) {
|
|
299
|
+
throw new ReviewParseError(`task review agent launch failed${launched.detail ? `: ${launched.detail}` : ''}`);
|
|
300
|
+
}
|
|
301
|
+
return parseReviewVerdict(readOutput(launched.output));
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Render the task-review-loop PROMPT: instruct a fresh-context agent to run the
|
|
306
|
+
* `review` SKILL on the candidate tasks for `slug` (the lenses IN ORDER, ENDING in
|
|
307
|
+
* the destination/goal check — which may itself trigger edits), and to EMIT a
|
|
308
|
+
* single JSON object carrying the verdict, the findings, the EDITS to apply, and
|
|
309
|
+
* the routing channels (so {@link parseTaskReviewVerdict} can read it). The skill
|
|
310
|
+
* carries the protocol; this prompt frames the artifact (a candidate decomposition)
|
|
311
|
+
* + the required output shape (incl. the improver `edits` and the two non-converge
|
|
312
|
+
* routing channels).
|
|
313
|
+
*/
|
|
314
|
+
export function buildTaskReviewPrompt(input) {
|
|
315
|
+
const list = input.candidateTasks.map((p) => ` - ${p}`).join('\n');
|
|
316
|
+
return [
|
|
317
|
+
`You are a FRESH-CONTEXT reviewer in the TASKER review→edit→converge LOOP`,
|
|
318
|
+
`(insertion point A). Review the CANDIDATE TASKS just produced for the prd`,
|
|
319
|
+
`"${input.slug}":`,
|
|
320
|
+
list || ' (no candidate tasks found)',
|
|
321
|
+
``,
|
|
322
|
+
reviewDisciplinePrompt(),
|
|
323
|
+
``,
|
|
324
|
+
`Read the source prd (work/prds/ready/${input.slug}.md) and review the candidate`,
|
|
325
|
+
`decomposition ADVERSARIALLY. Review the WHOLE SET — graph coherence / gaps /`,
|
|
326
|
+
`overlap / goal-composition (dependency-graph coherence, set-level gaps,`,
|
|
327
|
+
`overlapping/duplicated tasks, and "does the set compose into the prd goal")`,
|
|
328
|
+
`— not just per-task well-formedness. The DESTINATION CHECK ("if every task`,
|
|
329
|
+
`is built exactly as written, do we end up with the system the prd describes?")`,
|
|
330
|
+
`is PART OF this pass and may ITSELF trigger edits — that is why this is a`,
|
|
331
|
+
`loop, not a one-shot gate.`,
|
|
332
|
+
``,
|
|
333
|
+
`This is review pass ${input.pass} (fresh context ${input.execution}). You`,
|
|
334
|
+
`do NOT edit files or run git yourself — you EMIT the edits to apply as FULL`,
|
|
335
|
+
`replacement content and the runner applies them, then re-reviews. Tasks`,
|
|
336
|
+
`measurably keep improving when reviewed, so propose edits that fix the`,
|
|
337
|
+
`findings; converge when a pass finds NO NEW blocking issue.`,
|
|
338
|
+
``,
|
|
339
|
+
verdictContractPrompt(),
|
|
340
|
+
``,
|
|
341
|
+
`Fill the channels appropriate to THIS caller (the tasker improver loop):`,
|
|
342
|
+
` - "edits" — full-content replacements for candidate task files when you`,
|
|
343
|
+
` can FIX a finding by editing (the natural improver step).`,
|
|
344
|
+
` - "uncertainTasks" — specific tasks you cannot make buildable (each gets`,
|
|
345
|
+
` \`needsAnswers: true\` with the questions in its body).`,
|
|
346
|
+
` - "decompositionUnclear" — the WHOLE decomposition is unsound (the prd is`,
|
|
347
|
+
` routed to needs-attention; emit no guessed tasks).`,
|
|
348
|
+
`Do NOT fill "review" / "edit" / "questions" — those are other callers'`,
|
|
349
|
+
`channels. Flag, do not guess: a flagged question costs one human glance; a`,
|
|
350
|
+
`guessed task ships wrong-but-compiling work.`,
|
|
351
|
+
``,
|
|
352
|
+
`TASK \`humanOnly\` IS NARROW. Only edit a task to add \`humanOnly: true\``,
|
|
353
|
+
`when building THAT task is genuinely never-for-agents BY NATURE (secrets/`,
|
|
354
|
+
`release/security/AGENTS.md prohibition) — a \`humanOnly\` task is not agent-`,
|
|
355
|
+
`claimable EVEN from the pool \`work/tasks/ready/\`. Do NOT stamp \`humanOnly\` to`,
|
|
356
|
+
`mean "a human should review this first": that is the POSITION's job — every`,
|
|
357
|
+
`candidate task is BIRTHED STAGED in \`work/tasks/backlog/\` (not eligible) and a`,
|
|
358
|
+
`human promotes the approved ones into the pool.`,
|
|
359
|
+
`Review-first is the staging position; the overloaded "stamp \`humanOnly\` for`,
|
|
360
|
+
`review" reading is retired.`,
|
|
361
|
+
].join('\n');
|
|
362
|
+
}
|
|
363
|
+
// Parsing of the tasker-loop verdict is now the SHARED `parseReviewVerdict`
|
|
364
|
+
// from `review-verdict.ts` (re-exported above as `parseTaskReviewVerdict` for
|
|
365
|
+
// backwards compatibility). The unified parser validates the SAME shape this
|
|
366
|
+
// loop's prompt asks for; routing reads `findings` / `edits` /
|
|
367
|
+
// `uncertainTasks` / `decompositionUnclear` off the unified `ReviewVerdict`,
|
|
368
|
+
// identical to the old typed-narrow validator.
|
|
369
|
+
//# sourceMappingURL=tasker-review-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasker-review-loop.js","sourceRoot":"","sources":["../src/tasker-review-loop.ts"],"names":[],"mappings":"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"}
|