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,626 @@
|
|
|
1
|
+
import { type SidecarType } from './sidecar.js';
|
|
2
|
+
/**
|
|
3
|
+
* The **unified item-lock module** (prd `ledger-status-per-item-lock-refs`, ADR
|
|
4
|
+
* `ledger-status-on-per-item-lock-refs`). The runner's ONE lock primitive: ONE
|
|
5
|
+
* lock per item, on a PER-ITEM hidden ref `refs/dorfl/lock/<entry>`,
|
|
6
|
+
* acquired by an ATOMIC create-only push and released by DELETING the ref, with a
|
|
7
|
+
* two-axis (`action` × `state`) entry. It collapses the old transient status
|
|
8
|
+
* folders (`in-progress`, `needs-attention`, `tasking`, `advancing`) into ONE
|
|
9
|
+
* lock keyed by item identity; `in-progress` = lock held active for `implement`,
|
|
10
|
+
* `needs-attention` = lock held `stuck`.
|
|
11
|
+
*
|
|
12
|
+
* It GENERALISES the green tracer that proved the dangerous core end-to-end on a
|
|
13
|
+
* bare `file://` arbiter (the tracer is now this file). The one production
|
|
14
|
+
* difference from the tracer is the IDENTITY SEAM: callers pass a NAMESPACED item
|
|
15
|
+
* identity (`task:<slug>` / `prd:<slug>` / `observation:<slug>` / `obs:<slug>`,
|
|
16
|
+
* or a bare `<slug>` = task), and this module derives the type-encoded lock
|
|
17
|
+
* `<entry>` (`<type>-<slug>`) through {@link resolveSidecarIdentity} — the SAME
|
|
18
|
+
* single source of truth the sidecar (`work/questions/<type>-<slug>.md`) and the
|
|
19
|
+
* work branch (`work/<type>-<slug>`) already use. There is deliberately NO second
|
|
20
|
+
* identity scheme: a task, a prd,
|
|
21
|
+
* and an observation that share a slug get DISTINCT lock refs, and the SAME item
|
|
22
|
+
* under different actions shares ONE ref (so implement / task / advance on one
|
|
23
|
+
* item are mutually exclusive by construction).
|
|
24
|
+
*
|
|
25
|
+
* It is NOT yet wired into claim/task/advance — those are separate, dependent
|
|
26
|
+
* tasks — and deliberately does NOT touch `main`.
|
|
27
|
+
*
|
|
28
|
+
* WHY a per-item ref (not a marker on `main` or a tree on one shared ref):
|
|
29
|
+
* - **No false contention, no retry.** The ONLY writer that can contend on item
|
|
30
|
+
* X's lock is another writer FOR X — a GENUINE conflict the loser SHOULD lose.
|
|
31
|
+
* Two writers for DIFFERENT items touch DIFFERENT refs and never serialise. So
|
|
32
|
+
* acquire needs NO refetch-retry budget (contrast the shared-`main` CAS, which
|
|
33
|
+
* falsely-contends under parallelism and exhausts its retry cap → exit 3).
|
|
34
|
+
* - **Self-cleaning, no storage growth.** Acquire CREATES the ref; release
|
|
35
|
+
* DELETES it (not "empties" it), so the live ref set = currently-held items
|
|
36
|
+
* only. The lock commit is PARENTLESS (no `main` parent), so on ref-delete it
|
|
37
|
+
* is immediately unreachable and reclaimed by normal git gc — and the lock ref
|
|
38
|
+
* is fully decoupled from `main`'s object graph.
|
|
39
|
+
* - **Branch-inheritance impossible.** Nothing is in `main`'s tree, so a work
|
|
40
|
+
* branch cut from `main` inherits no lock state.
|
|
41
|
+
* - **Provider-agnostic.** A ref is a ref: the create-only / delete pushes work
|
|
42
|
+
* identically on a `--bare file://` arbiter and a real remote.
|
|
43
|
+
*
|
|
44
|
+
* ATOMICITY is the `--force-with-lease=<ref>:` (EMPTY expected) create-only push:
|
|
45
|
+
* the arbiter accepts it ONLY if the ref is still absent; a racer who lost finds
|
|
46
|
+
* the ref present and is rejected. No nonce gymnastics are needed here (unlike the
|
|
47
|
+
* shared-`main` CAS) because the ref NAME is the identity — two acquires for the
|
|
48
|
+
* same item race the SAME ref, and ref-level create-only is itself the mutex.
|
|
49
|
+
*/
|
|
50
|
+
/** The ref namespace for per-item locks. HIDDEN (not `refs/heads/*`): invisible
|
|
51
|
+
* in the GitHub UI, not swept by branch automation, not fetched by a default
|
|
52
|
+
* clone. Deletion = "all locks released" (recoverable; work is on the work
|
|
53
|
+
* branches + `main`). */
|
|
54
|
+
export declare const LOCK_REF_PREFIX = "refs/dorfl/lock";
|
|
55
|
+
/**
|
|
56
|
+
* The single IDENTITY SEAM for the lock: derive the type-encoded lock `<entry>`
|
|
57
|
+
* (`<type>-<slug>`) from a NAMESPACED item identity, through the shared
|
|
58
|
+
* {@link resolveSidecarIdentity} resolver (the single source of truth, which the
|
|
59
|
+
* sidecar filename + the advancing-lock marker also key onto). Accepts the same
|
|
60
|
+
* forms as that resolver: `task:<slug>` / `prd:<slug>` / `observation:<slug>` /
|
|
61
|
+
* `obs:<slug>`, or a bare `<slug>` (= task). Acquire/release/read ALL key
|
|
62
|
+
* through THIS function, so there is one — and only one — addressing scheme.
|
|
63
|
+
*/
|
|
64
|
+
export declare function lockEntryFor(item: string): string;
|
|
65
|
+
/** The lock ref for a type-encoded `<entry>` (`<type>-<slug>`). */
|
|
66
|
+
export declare function itemLockRef(entry: string): string;
|
|
67
|
+
/** WHAT holds the lock — the three mutually-exclusive actions over one item. */
|
|
68
|
+
export type LockAction = 'implement' | 'task' | 'advance';
|
|
69
|
+
/** Health of the hold: `active` (in-progress) or `stuck` (needs-attention). */
|
|
70
|
+
export type LockState = 'active' | 'stuck';
|
|
71
|
+
/**
|
|
72
|
+
* The two-axis lock entry. `action` and `state` are INDEPENDENT axes (so
|
|
73
|
+
* "advanced-and-stuck" and "building-and-stuck" are both representable, which a
|
|
74
|
+
* single action-field could not do). `reason` is present IFF `state === 'stuck'`.
|
|
75
|
+
*
|
|
76
|
+
* Since the lock entry is the SOLE stuck record (task
|
|
77
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`, decision i+: the
|
|
78
|
+
* `needs-attention/` folder is retired), `reason` is the FULL bounce prose (it may
|
|
79
|
+
* span multiple lines — a red-gate excerpt, a rebase-conflict report, an agent's
|
|
80
|
+
* ambiguity note), and `questions` carries any agent-surfaced questions for the
|
|
81
|
+
* human. Both ride in the lock blob BODY (not a single frontmatter field) so they
|
|
82
|
+
* round-trip richly, in a shape a future advance-surface rung (the
|
|
83
|
+
* surface-stuck-locks-as-questions direction captured in
|
|
84
|
+
* `work/notes/observations/needs-attention-may-have-no-human-visible-outcome-after-lock-cutover-surface-as-questions-2026-06-21.md`)
|
|
85
|
+
* can render into a `work/questions/` sidecar. `questions` is present (non-empty) only
|
|
86
|
+
* for a stuck entry that recorded them.
|
|
87
|
+
*/
|
|
88
|
+
export interface LockEntry {
|
|
89
|
+
entry: string;
|
|
90
|
+
action: LockAction;
|
|
91
|
+
state: LockState;
|
|
92
|
+
holder: string;
|
|
93
|
+
since: string;
|
|
94
|
+
reason?: string;
|
|
95
|
+
questions?: string[];
|
|
96
|
+
}
|
|
97
|
+
/** Outcome of an acquire attempt. `acquired` = we hold it; `lost` = someone else
|
|
98
|
+
* does (a genuine same-item conflict). `error` = environment/usage. */
|
|
99
|
+
export type AcquireOutcome = 'acquired' | 'lost' | 'error';
|
|
100
|
+
export type ReleaseOutcome = 'released' | 'not-held' | 'error';
|
|
101
|
+
export interface AcquireResult {
|
|
102
|
+
outcome: AcquireOutcome;
|
|
103
|
+
/** The type-encoded lock entry (`<type>-<slug>`) the acquire keyed onto. */
|
|
104
|
+
entry: string;
|
|
105
|
+
ref: string;
|
|
106
|
+
message: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ReleaseResult {
|
|
109
|
+
outcome: ReleaseOutcome;
|
|
110
|
+
/** The type-encoded lock entry (`<type>-<slug>`) the release keyed onto. */
|
|
111
|
+
entry: string;
|
|
112
|
+
ref: string;
|
|
113
|
+
message: string;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Outcome of an AMEND-style transition (mark-stuck / resume / requeue) — the
|
|
117
|
+
* lock-entry STATE MACHINE's interior moves (prd `ledger-status-per-item-lock-refs`,
|
|
118
|
+
* the C8 lock-entry state machine in the design trail). Each is a single CAS on the
|
|
119
|
+
* held ref (no retry loop), so the verdict is definitive:
|
|
120
|
+
* - `transitioned` — we won the CAS; the entry now holds the target `(action, state)`.
|
|
121
|
+
* - `not-held` — there is no entry to transition (the move's precondition is
|
|
122
|
+
* "a held entry in the right state"; absent ⇒ illegal here).
|
|
123
|
+
* - `wrong-state` — an entry exists but in the wrong `state` for this move
|
|
124
|
+
* (e.g. resume on an `active` entry, mark-stuck on a `stuck` one).
|
|
125
|
+
* An ILLEGAL transition, rejected, not coerced.
|
|
126
|
+
* - `lost` — the leased CAS was rejected because a CONCURRENT writer changed
|
|
127
|
+
* the ref between our read and our push (a genuine same-item race).
|
|
128
|
+
* - `error` — environment/usage (missing item, missing reason for mark-stuck, …).
|
|
129
|
+
*/
|
|
130
|
+
export type TransitionOutcome = 'transitioned' | 'not-held' | 'wrong-state' | 'lost' | 'error';
|
|
131
|
+
export interface TransitionResult {
|
|
132
|
+
outcome: TransitionOutcome;
|
|
133
|
+
/** The type-encoded lock entry (`<type>-<slug>`) the transition keyed onto. */
|
|
134
|
+
entry: string;
|
|
135
|
+
ref: string;
|
|
136
|
+
message: string;
|
|
137
|
+
/** The lock entry AFTER a successful `transitioned` (absent for requeue's removal). */
|
|
138
|
+
lock?: LockEntry;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Serialise a lock entry to the ref's blob body (markdown frontmatter, like the
|
|
142
|
+
* advancing marker, so it round-trips and is previewable). The two-axis state
|
|
143
|
+
* (`entry`/`action`/`state`/`holder`/`since`) lives in the frontmatter; a stuck
|
|
144
|
+
* entry's FULL reason prose + any surfaced questions live in the BODY (under
|
|
145
|
+
* `## Reason` / `## Questions`) so they round-trip RICHLY (multi-line reason,
|
|
146
|
+
* bulleted questions) — the lock entry is the SOLE stuck record now, in a shape a
|
|
147
|
+
* future advance-surface rung can render. {@link parseLockEntry} is the exact
|
|
148
|
+
* inverse.
|
|
149
|
+
*/
|
|
150
|
+
export declare function serialiseLockEntry(e: LockEntry): string;
|
|
151
|
+
export interface AcquireOptions {
|
|
152
|
+
/**
|
|
153
|
+
* The NAMESPACED item identity to lock (`task:<slug>` / `prd:<slug>` /
|
|
154
|
+
* `observation:<slug>` / `obs:<slug>`, or a bare `<slug>` = task). Resolved to
|
|
155
|
+
* the type-encoded lock `<entry>` through {@link lockEntryFor}.
|
|
156
|
+
*/
|
|
157
|
+
item: string;
|
|
158
|
+
action: LockAction;
|
|
159
|
+
cwd: string;
|
|
160
|
+
arbiter?: string;
|
|
161
|
+
holder?: string;
|
|
162
|
+
env?: NodeJS.ProcessEnv;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Acquire the per-item lock atomically: build a parentless lock commit and push it
|
|
166
|
+
* to `refs/dorfl/lock/<entry>` with `--force-with-lease=<ref>:` (the EMPTY
|
|
167
|
+
* expected value = create-only). The arbiter accepts ONLY if the ref is still
|
|
168
|
+
* absent. A racer who lost finds the ref present → its lease fails → `lost`. No
|
|
169
|
+
* retry loop: a rejection here is a GENUINE same-item conflict, not false
|
|
170
|
+
* contention.
|
|
171
|
+
*/
|
|
172
|
+
export declare function acquireItemLock(opts: AcquireOptions): Promise<AcquireResult>;
|
|
173
|
+
export interface ReleaseOptions {
|
|
174
|
+
/** The NAMESPACED item identity (same forms as {@link AcquireOptions.item}). */
|
|
175
|
+
item: string;
|
|
176
|
+
cwd: string;
|
|
177
|
+
arbiter?: string;
|
|
178
|
+
env?: NodeJS.ProcessEnv;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Release the per-item lock by DELETING the ref (`git push <arbiter>
|
|
182
|
+
* :refs/dorfl/lock/<entry>`). Deleting (not emptying) is what makes the
|
|
183
|
+
* lock set self-cleaning: a released item has NO ref, and its parentless commit
|
|
184
|
+
* becomes unreachable for gc. Idempotent: deleting an absent ref is `not-held`.
|
|
185
|
+
*/
|
|
186
|
+
export declare function releaseItemLock(opts: ReleaseOptions): Promise<ReleaseResult>;
|
|
187
|
+
/** Outcome of a GUARDED release ({@link releaseHeldItemLock}): the caller HELD the
|
|
188
|
+
* lock, so an absent ref is NOT benign — it is `vanished` (the ref was deleted
|
|
189
|
+
* under us, an abort signal). */
|
|
190
|
+
export type ReleaseHeldOutcome = 'released' | 'vanished' | 'error';
|
|
191
|
+
export interface ReleaseHeldResult {
|
|
192
|
+
outcome: ReleaseHeldOutcome;
|
|
193
|
+
/** The type-encoded lock entry (`<type>-<slug>`) the release keyed onto. */
|
|
194
|
+
entry: string;
|
|
195
|
+
ref: string;
|
|
196
|
+
message: string;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* GUARDED release for a runner that KNOWS it acquired and HELD the lock (prd
|
|
200
|
+
* `ledger-status-per-item-lock-refs` US #13): unlike {@link releaseItemLock} —
|
|
201
|
+
* whose `not-held` is a BENIGN idempotent case the complete/tasking/needs-attention
|
|
202
|
+
* callers tolerate (the body may predate the lock, or a crash-recovery may have
|
|
203
|
+
* already cleared it) — here the absence of OUR ref is an ABORT SIGNAL. A held
|
|
204
|
+
* runner whose own lock VANISHED mid-build (someone `release-lock`-ed it, or a
|
|
205
|
+
* `gc`/recovery cleared it) must DETECT it on release and route to
|
|
206
|
+
* needs-attention rather than silently "clean-release" a lock it no longer holds:
|
|
207
|
+
* the work it just did was NOT protected by the exclusion it thought it had.
|
|
208
|
+
*
|
|
209
|
+
* So this maps {@link releaseItemLock}'s `not-held` to a DISTINCT `vanished`
|
|
210
|
+
* outcome the caller branches on (abort / needs-attention), while a genuine
|
|
211
|
+
* `released` is the happy path and `error` stays `error`. It is otherwise the
|
|
212
|
+
* SAME leased delete (no second mechanism): a clean `released` deletes the ref we
|
|
213
|
+
* held. Use this ONLY where the caller provably HELD the lock (the in-flight
|
|
214
|
+
* runner's own release); the tolerant idempotent callers keep using
|
|
215
|
+
* {@link releaseItemLock}.
|
|
216
|
+
*/
|
|
217
|
+
export declare function releaseHeldItemLock(opts: ReleaseOptions): Promise<ReleaseHeldResult>;
|
|
218
|
+
/** Verdict of the SHARED leased delete {@link leasedDeleteLockRef}: `deleted` (the
|
|
219
|
+
* ref was removed), `lost` (a concurrent change moved the ref between the read and
|
|
220
|
+
* the delete — the lease was REJECTED, never `--force`d), or `error`. */
|
|
221
|
+
export type LeasedDeleteOutcome = 'deleted' | 'lost' | 'error';
|
|
222
|
+
export interface MarkStuckOptions {
|
|
223
|
+
/** The NAMESPACED item identity (same forms as {@link AcquireOptions.item}). */
|
|
224
|
+
item: string;
|
|
225
|
+
/** The needs-attention prose. REQUIRED — a `stuck` entry always carries a reason. */
|
|
226
|
+
reason: string;
|
|
227
|
+
/**
|
|
228
|
+
* Any agent-surfaced QUESTIONS for the human, recorded on the stuck entry's
|
|
229
|
+
* body (the lock is the SOLE stuck record now). Optional; empty/absent ⇒ no
|
|
230
|
+
* questions block. A future advance-surface rung renders these into a
|
|
231
|
+
* `work/questions/` sidecar.
|
|
232
|
+
*/
|
|
233
|
+
questions?: string[];
|
|
234
|
+
cwd: string;
|
|
235
|
+
arbiter?: string;
|
|
236
|
+
env?: NodeJS.ProcessEnv;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* mark-stuck (transition 2): `[action, active] -> [action, stuck] + reason`. The
|
|
240
|
+
* runner bounces (red gate, agent failure, decomposition-unclear). A leased CAS
|
|
241
|
+
* amend of the SAME entry's `state` + `reason`, keeping `action`/`holder`/`since`.
|
|
242
|
+
* It is the source of the needs-attention SURFACE (now read from the lock ref,
|
|
243
|
+
* not a `work/needs-attention/` folder).
|
|
244
|
+
*
|
|
245
|
+
* PRECONDITIONS (the state machine + invariants):
|
|
246
|
+
* - the entry must be HELD and `active` (`not-held` / `wrong-state` otherwise) —
|
|
247
|
+
* stuck is reachable only FROM active, never from absent or already-stuck.
|
|
248
|
+
* - `reason` must be non-empty (the `reason` PRESENT iff `state: stuck` invariant).
|
|
249
|
+
*/
|
|
250
|
+
export declare function markStuckItemLock(opts: MarkStuckOptions): Promise<TransitionResult>;
|
|
251
|
+
export interface ResumeOptions {
|
|
252
|
+
/** The NAMESPACED item identity (same forms as {@link AcquireOptions.item}). */
|
|
253
|
+
item: string;
|
|
254
|
+
cwd: string;
|
|
255
|
+
arbiter?: string;
|
|
256
|
+
/** Optionally reassign the holder on resume (a human/continue picks it up). */
|
|
257
|
+
holder?: string;
|
|
258
|
+
env?: NodeJS.ProcessEnv;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* resume (transition 3): `[action, stuck] -> [action, active]`. A human (or a
|
|
262
|
+
* `continue`) picks the stuck item up: amend `state` back to `active` and CLEAR
|
|
263
|
+
* `reason` (the `reason` iff `stuck` invariant — an active entry never carries a
|
|
264
|
+
* stuck reason). Keeps the same `action`; `holder` may be reassigned. The
|
|
265
|
+
* lock-entry analogue of the old `needs-attention -> in-progress` folder move.
|
|
266
|
+
*
|
|
267
|
+
* PRECONDITION: the entry must be HELD and `stuck` (`not-held` / `wrong-state`
|
|
268
|
+
* otherwise) — active is reachable from stuck only, not from absent.
|
|
269
|
+
*/
|
|
270
|
+
export declare function resumeItemLock(opts: ResumeOptions): Promise<TransitionResult>;
|
|
271
|
+
/**
|
|
272
|
+
* requeue (transition 4): `[action, stuck] -> (absent)`. Give up on a STUCK hold
|
|
273
|
+
* and return the item to the pool by REMOVING the entry. The body never moved
|
|
274
|
+
* (Amendment 5 — it is already resting in `backlog/` on `main`), so requeue is
|
|
275
|
+
* purely "release the lock"; the kept `work/<slug>` branch remains for recovery.
|
|
276
|
+
*
|
|
277
|
+
* Distinct from {@link releaseItemLock} (transition 6, abort from ACTIVE): requeue
|
|
278
|
+
* is the GUARDED give-up from `stuck` only, so it rejects (`wrong-state`) an
|
|
279
|
+
* `active` entry — abandoning an in-flight active hold goes through `release`, not
|
|
280
|
+
* `requeue`. The removal itself is a leased delete (a concurrent change ⇒ `lost`).
|
|
281
|
+
*/
|
|
282
|
+
export declare function requeueItemLock(opts: ReleaseOptions): Promise<TransitionResult>;
|
|
283
|
+
/**
|
|
284
|
+
* Read the current lock entry for an item from the arbiter (the `status`/`scan`
|
|
285
|
+
* read path): fetch the lock refs, read `lock.md` from the ref's tree. Returns
|
|
286
|
+
* `undefined` when the item is not locked.
|
|
287
|
+
*/
|
|
288
|
+
export declare function readItemLock(opts: ReleaseOptions): Promise<LockEntry | undefined>;
|
|
289
|
+
/**
|
|
290
|
+
* The DURABLE-`main` terminal record paths for an item, by its type — the
|
|
291
|
+
* authoritative resting records the cross-substrate reconciliation reads. An
|
|
292
|
+
* item is TERMINAL on `main` iff ANY of these paths exists on `<arbiter>/main`.
|
|
293
|
+
* The won't-proceed terminal is PER-REGIME (the slug-collision correctness fix:
|
|
294
|
+
* a dropped task and a dropped prd sharing a slug used to collide on one
|
|
295
|
+
* bare-slug `work/dropped/<slug>.md`):
|
|
296
|
+
* - a TASK: `work/tasks/done/<slug>.md` (completed) OR
|
|
297
|
+
* `work/tasks/cancelled/<slug>.md` (the task regime's won't-proceed terminal).
|
|
298
|
+
* - a PRD: `work/prds/tasked/<slug>.md` (tasked) OR `work/prds/dropped/<slug>.md`
|
|
299
|
+
* (the prd regime's won't-proceed terminal).
|
|
300
|
+
* - an OBSERVATION: NONE. A note has no durable terminal folder — it leaves by
|
|
301
|
+
* deletion (its absence, not a terminal record, is the end state). A promoted
|
|
302
|
+
* observation becomes a NEW task/prd with its own ref.
|
|
303
|
+
*/
|
|
304
|
+
export declare function terminalMainPaths(type: SidecarType, slug: string): string[];
|
|
305
|
+
/** The outcome of a cross-substrate reconciliation of one item's lock against
|
|
306
|
+
* the authoritative `main` durable record (prd `ledger-status-per-item-lock-refs`
|
|
307
|
+
* US #9/#10; ADR `ledger-status-on-per-item-lock-refs`). */
|
|
308
|
+
export type ReconcileOutcome = 'cleared-stale' | 'kept-stuck' | 'kept-in-flight' | 'no-lock' | 'error';
|
|
309
|
+
export interface ReconcileResult {
|
|
310
|
+
outcome: ReconcileOutcome;
|
|
311
|
+
/** The type-encoded lock entry (`<type>-<slug>`) reconciled. */
|
|
312
|
+
entry: string;
|
|
313
|
+
ref: string;
|
|
314
|
+
/** Whether `<arbiter>/main` shows the item terminal (per {@link terminalMainPaths}:
|
|
315
|
+
* a task at `tasks/done`/`tasks/cancelled`, a prd at `prds/tasked`/`prds/dropped`). */
|
|
316
|
+
terminalOnMain: boolean;
|
|
317
|
+
message: string;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Reconcile ONE item's per-item lock against the AUTHORITATIVE `main` durable
|
|
321
|
+
* record — the heart of complete's cross-substrate crash-safety (prd
|
|
322
|
+
* `ledger-status-per-item-lock-refs` US #9/#10; ADR
|
|
323
|
+
* `ledger-status-on-per-item-lock-refs`; the design trail's Amendment 6).
|
|
324
|
+
*
|
|
325
|
+
* complete's order is hold lock → land the DURABLE `main` move FIRST → release
|
|
326
|
+
* the lock SECOND. A crash BETWEEN the move and the release leaves a
|
|
327
|
+
* terminal-on-`main` item (a completed/cancelled task or a tasked/dropped prd,
|
|
328
|
+
* per {@link terminalMainPaths}) with a STILL-HELD lock — a stale lock with no
|
|
329
|
+
* in-flight work behind it. This is the recovery that converges it.
|
|
330
|
+
*
|
|
331
|
+
* THE RECOVERY RULE (the `main` record is authoritative over a stale lock):
|
|
332
|
+
* - `main` is TERMINAL + the held lock is `active` → the item is RESTED, the
|
|
333
|
+
* lock is STALE (the crash was after the move) → CLEAR it (`cleared-stale`).
|
|
334
|
+
* - `main` is TERMINAL + the held lock is `stuck` → KEEP it (`kept-stuck`).
|
|
335
|
+
* `done` + `stuck` may legitimately CO-EXIST (a rebase-conflict bounce of a
|
|
336
|
+
* just-completed item — US #10). The stuck lock wins the human's attention;
|
|
337
|
+
* the `main` record wins dependency resolution. NOT corruption, never cleared
|
|
338
|
+
* here (a human resolves it via `resume`/`requeue`/`release-lock`).
|
|
339
|
+
* - `main` is NOT terminal + a lock is held → the NORMAL in-flight
|
|
340
|
+
* state (`kept-in-flight`); the lock is doing its job, leave it.
|
|
341
|
+
* - no lock at all → `no-lock` (at rest).
|
|
342
|
+
*
|
|
343
|
+
* Best-effort + idempotent: it NEVER throws (a fetch/read fault degrades to
|
|
344
|
+
* `error`, leaving the lock untouched — the safe direction), and re-running it
|
|
345
|
+
* on an already-reconciled item is a clean `no-lock`. The clear is the SAME
|
|
346
|
+
* leased delete {@link releaseItemLock} uses, so it cannot race off a concurrent
|
|
347
|
+
* change.
|
|
348
|
+
*
|
|
349
|
+
* BROADENED CONTRACT (leased-delete-rejection arm, task
|
|
350
|
+
* `reaper-no-lock-outcome-benign-not-lost`, promote-slice follow-up
|
|
351
|
+
* `reconcile-item-lock-broadened-contract-audit`, review 2026-06-20): when the
|
|
352
|
+
* SHARED leased delete is REJECTED (the arbiter ref moved between our read and
|
|
353
|
+
* our write) this function performs an EXTRA `git ls-remote <arbiter> <ref>`
|
|
354
|
+
* round-trip to distinguish the two rejection sub-cases, and applies to ALL
|
|
355
|
+
* callers — NOT only the reaper:
|
|
356
|
+
* - REMOTE REF IS EMPTY (a concurrent reaper / release-lock / requeue cleared
|
|
357
|
+
* the SAME stale lock first): the desired end state — benign. This function
|
|
358
|
+
* ALSO `git update-ref -d`s the LOCAL stale tracking ref as a SIDE-EFFECT
|
|
359
|
+
* (so a subsequent read in this clone sees the correct deleted state; a
|
|
360
|
+
* non-pruning fetch would otherwise leave a dangling local ref), then
|
|
361
|
+
* returns `no-lock`. Note the outcome-shape change: this rejection USED TO
|
|
362
|
+
* surface as `error` — it now surfaces as `no-lock` for EVERY caller. A
|
|
363
|
+
* caller that keys recovery / surfacing off `error` on this arm must be
|
|
364
|
+
* audited (see the follow-up task's `## Decisions` block).
|
|
365
|
+
* - REMOTE REF STILL EXISTS AT A DIFFERENT SHA (a genuine concurrent mutation
|
|
366
|
+
* — e.g. a racer just marked it `stuck`): back off rather than force —
|
|
367
|
+
* `error`.
|
|
368
|
+
* Because the function name reads "reconcile" (read-style), the local
|
|
369
|
+
* `update-ref -d` is a deliberate SIDE-EFFECT on the local clone's refs — it
|
|
370
|
+
* only fires on this specific rejection arm and is otherwise invisible.
|
|
371
|
+
*/
|
|
372
|
+
export declare function reconcileItemLockAgainstMain(opts: ReleaseOptions): Promise<ReconcileResult>;
|
|
373
|
+
/**
|
|
374
|
+
* The READ-ONLY classifier behind {@link reconcileItemLockAgainstMain}: it derives
|
|
375
|
+
* the SAME {@link ReconcileOutcome} verdict, but NEVER mutates the arbiter — it
|
|
376
|
+
* does NOT clear a stale-active lock, it only REPORTS that the lock IS
|
|
377
|
+
* reconcilable. This is what the `gc --ledger` stuck-lock report keys off (the
|
|
378
|
+
* forward-pointer's wiring): per the no-auto-sweep ADR rule, the plain report
|
|
379
|
+
* surfaces a stale-active lock as `cleared-stale`-eligible WITHOUT clearing it —
|
|
380
|
+
* a human still asserts the clear via `release-lock` (or runs complete's recovery,
|
|
381
|
+
* which DOES clear via {@link reconcileItemLockAgainstMain}). The classification
|
|
382
|
+
* is identical so the report and the recovery never disagree about WHAT a lock is;
|
|
383
|
+
* only the ACTION differs (report vs clear).
|
|
384
|
+
*
|
|
385
|
+
* A `cleared-stale` outcome here therefore means "would be cleared by recovery /
|
|
386
|
+
* `release-lock`" (the lock is terminal-on-`main` + `active` = stale), NOT that
|
|
387
|
+
* anything was cleared. Best-effort + never throws (a fetch/read fault degrades to
|
|
388
|
+
* `error`).
|
|
389
|
+
*/
|
|
390
|
+
export declare function classifyItemLockAgainstMain(opts: ReleaseOptions): Promise<ReconcileResult>;
|
|
391
|
+
/** One lingering lock in the `gc --ledger` stuck-lock REPORT: the held entry plus
|
|
392
|
+
* the read-only cross-substrate {@link ReconcileOutcome} classification of it
|
|
393
|
+
* against the authoritative `main` durable record (held/stuck vs stale-active over
|
|
394
|
+
* a terminal item). Reported, NEVER cleared by the report itself. */
|
|
395
|
+
export interface LockReportEntry {
|
|
396
|
+
/** The full held lock entry (action × state + holder/since/reason). */
|
|
397
|
+
lock: LockEntry;
|
|
398
|
+
/** The lock ref (`refs/dorfl/lock/<entry>`). */
|
|
399
|
+
ref: string;
|
|
400
|
+
/**
|
|
401
|
+
* The READ-ONLY {@link classifyItemLockAgainstMain} verdict:
|
|
402
|
+
* - `kept-in-flight` — a normal in-flight hold (not terminal on `main`).
|
|
403
|
+
* - `kept-stuck` — terminal on `main` + `stuck` (the `done`+`stuck`
|
|
404
|
+
* co-existence; wins the human's attention, never cleared here).
|
|
405
|
+
* - `cleared-stale` — terminal on `main` + `active` = a STALE lock the report
|
|
406
|
+
* names as reconcilable; a human clears it via `release-lock` (NOT
|
|
407
|
+
* auto-cleared by the report — no auto-sweep).
|
|
408
|
+
* - `error` — a per-item classification fault (kept verbatim).
|
|
409
|
+
*/
|
|
410
|
+
reconcile: ReconcileOutcome;
|
|
411
|
+
}
|
|
412
|
+
/** The `gc --ledger` stuck/orphaned-lock REPORT (prd
|
|
413
|
+
* `ledger-status-per-item-lock-refs` US #14): every lingering per-item lock on the
|
|
414
|
+
* arbiter, each classified read-only against `main`. An EMPTY list = no locks held
|
|
415
|
+
* (an absent ref namespace reads as `[]`, the recoverable "all locks released"
|
|
416
|
+
* state — US #12). The report NEVER clears anything. */
|
|
417
|
+
export interface ItemLockReport {
|
|
418
|
+
locks: LockReportEntry[];
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Build the `gc --ledger` stuck/orphaned-lock REPORT (prd
|
|
422
|
+
* `ledger-status-per-item-lock-refs` US #12/#13/#14; ADR
|
|
423
|
+
* `ledger-status-on-per-item-lock-refs`): enumerate every per-item lock currently
|
|
424
|
+
* held on the arbiter ({@link listItemLockEntries} — held active + stuck, with
|
|
425
|
+
* holder/since/reason) and classify EACH read-only against the authoritative
|
|
426
|
+
* `main` durable record via {@link classifyItemLockAgainstMain} (the wiring the
|
|
427
|
+
* `complete-lock-then-durable-main-move-crash-safe` task's
|
|
428
|
+
* `reconcileItemLockAgainstMain` had no production caller for). This is the
|
|
429
|
+
* generalisation of the (now-retired) advancing-marker report from advancing-only
|
|
430
|
+
* to the UNIFIED lock (the `gc --ledger` stuck-lock report).
|
|
431
|
+
*
|
|
432
|
+
* It is a REPORT, never a sweep: it CLEARS nothing (no liveness heartbeat, no
|
|
433
|
+
* auto-sweep — the same trust model as the advancing report; a human asserts a
|
|
434
|
+
* lock is dead via `release-lock`). A stale-active lock over a terminal-on-`main`
|
|
435
|
+
* item is surfaced as `cleared-stale`-eligible ("reconcilable") but left in place.
|
|
436
|
+
*
|
|
437
|
+
* Best-effort + degrades safely: an absent lock-ref namespace ⇒ an EMPTY report
|
|
438
|
+
* ({@link listItemLockEntries} returns `[]`) — so a deleted lock ref reads as "all
|
|
439
|
+
* locks released" (recoverable; work is safe on the `work/<slug>` branches +
|
|
440
|
+
* `main`).
|
|
441
|
+
*/
|
|
442
|
+
export declare function reportItemLocks(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<ItemLockReport>;
|
|
443
|
+
/**
|
|
444
|
+
* Format the `gc --ledger` stuck/orphaned-lock REPORT for the terminal: one block
|
|
445
|
+
* per lingering lock (entry, action/state, holder, since, the stuck `reason`, the
|
|
446
|
+
* read-only `main`-reconciliation note, and a copy-pasteable `release-lock`
|
|
447
|
+
* hint). An EMPTY report yields NO lines (a clean lock set is silent here, like
|
|
448
|
+
* the duplicate-slug surface). It REPORTS only — the matching wording makes the
|
|
449
|
+
* no-auto-sweep contract explicit (a human asserts a lock is dead).
|
|
450
|
+
*/
|
|
451
|
+
/**
|
|
452
|
+
* Does the `gc --ledger` lock report contain a lock that NEEDS HUMAN ATTENTION
|
|
453
|
+
* (prd US#14/#21; ADR `ledger-status-on-per-item-lock-refs`: this surface is the
|
|
454
|
+
* STUCK / crash-orphaned lock, NOT every held one)? TRUE iff some lock is
|
|
455
|
+
* `kept-stuck` (terminal-on-`main` + stuck) or `cleared-stale`-eligible
|
|
456
|
+
* (terminal-on-`main` + a stale active orphan). A `kept-in-flight` (active,
|
|
457
|
+
* non-terminal) lock is the NORMAL in-flight state of a healthy concurrent build
|
|
458
|
+
* (read by `status` as healthy) and does NOT count — so a routine `gc --ledger`
|
|
459
|
+
* health check whose only locks are healthy in-flight holds exits 0. This is the
|
|
460
|
+
* fail-loud EXIT predicate for the gc lock surface (the report itself still lists
|
|
461
|
+
* every held lock, in-flight ones informationally).
|
|
462
|
+
*/
|
|
463
|
+
export declare function itemLockReportNeedsAttention(report: ItemLockReport): boolean;
|
|
464
|
+
export declare function formatItemLockReport(report: ItemLockReport): string[];
|
|
465
|
+
/** Per-lock outcome of the human-invoked {@link reapStaleItemLocks} SWEEP:
|
|
466
|
+
* - `reaped` — a `cleared-stale` lock (terminal-on-main + active) cleared
|
|
467
|
+
* via the SHARED leased delete.
|
|
468
|
+
* - `already-reaped` — BENIGN: the lock was already gone by the time the sweep
|
|
469
|
+
* re-read the ref (`no-lock`) — another reaper / a
|
|
470
|
+
* `release-lock` / a `requeue` got there first; the ref is
|
|
471
|
+
* at the desired end state. NOT `lost` and does NOT count
|
|
472
|
+
* as needs-attention (see the exit-code contract recorded
|
|
473
|
+
* in this task's done record).
|
|
474
|
+
* - `kept-stuck` — left untouched (terminal + stuck — human attention; US #10).
|
|
475
|
+
* - `kept-in-flight` — left untouched (active, non-terminal — a healthy build).
|
|
476
|
+
* - `lost` — a `cleared-stale` candidate whose leased delete was REJECTED
|
|
477
|
+
* (the ref changed concurrently to a DIFFERENT value);
|
|
478
|
+
* REPORTED, never `--force`d.
|
|
479
|
+
* - `error` — a per-item classification/clear fault (left untouched). */
|
|
480
|
+
export type ReapOutcome = 'reaped' | 'already-reaped' | 'kept-stuck' | 'kept-in-flight' | 'lost' | 'error';
|
|
481
|
+
/** One lock's disposition in the {@link ReapReport}. */
|
|
482
|
+
export interface ReapEntry {
|
|
483
|
+
/** The full lock entry as the report saw it (action × state + holder/since). */
|
|
484
|
+
lock: LockEntry;
|
|
485
|
+
/** The lock ref (`refs/dorfl/lock/<entry>`). */
|
|
486
|
+
ref: string;
|
|
487
|
+
/** What the sweep DID with this lock. */
|
|
488
|
+
outcome: ReapOutcome;
|
|
489
|
+
/** A human-readable note (the clear message, or why it was kept). */
|
|
490
|
+
message: string;
|
|
491
|
+
}
|
|
492
|
+
/** The result of {@link reapStaleItemLocks}: every held lock with what the sweep
|
|
493
|
+
* did to it, plus convenience counts. A lock NEEDS HUMAN ATTENTION after the sweep
|
|
494
|
+
* iff it is `kept-stuck` or `lost` (a `cleared-stale` whose leased delete lost the
|
|
495
|
+
* race); a `kept-in-flight` is the normal healthy state and does NOT. */
|
|
496
|
+
export interface ReapReport {
|
|
497
|
+
entries: ReapEntry[];
|
|
498
|
+
reaped: number;
|
|
499
|
+
/** BENIGN already-reaped count: the sweep found the ref already gone (`no-lock`)
|
|
500
|
+
* — another reaper / release-lock / requeue cleared it first. The desired end
|
|
501
|
+
* state; NOT `lost`, does NOT contribute to needs-attention / a non-zero exit. */
|
|
502
|
+
alreadyReaped: number;
|
|
503
|
+
kept: number;
|
|
504
|
+
lost: number;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* The OPT-IN `gc --ledger --reap-stale-locks` SWEEP (prd
|
|
508
|
+
* `ledger-status-per-item-lock-refs` US #14): a human asserting "clear the dead
|
|
509
|
+
* TERMINAL locks now", so one command sweeps every orphaned terminal lock instead
|
|
510
|
+
* of N hand-run `release-lock`s. It is the WRITE twin of {@link reportItemLocks}
|
|
511
|
+
* (the default report-only surface): it enumerates the SAME held locks, classifies
|
|
512
|
+
* each read-only, and for EXACTLY the `cleared-stale` class (terminal-on-`main` +
|
|
513
|
+
* `active` = stranded) performs the SHARED leased delete via
|
|
514
|
+
* {@link reconcileItemLockAgainstMain} (the recovery's clear, re-checked fresh per
|
|
515
|
+
* item) — there is NO parallel clear mechanism.
|
|
516
|
+
*
|
|
517
|
+
* SCOPE FENCE (the trust model the default preserves):
|
|
518
|
+
* - it clears ONLY `cleared-stale`. A `kept-stuck` (terminal + stuck — human
|
|
519
|
+
* attention) and a `kept-in-flight` (active + non-terminal — a healthy build)
|
|
520
|
+
* are NEVER reaped, even here. Because each clear goes through
|
|
521
|
+
* {@link reconcileItemLockAgainstMain}, which RE-reads + RE-classifies before
|
|
522
|
+
* deleting, a lock that turned stuck/in-flight between the report and the sweep
|
|
523
|
+
* is still safe (reconcile returns `kept-*`, not a delete).
|
|
524
|
+
* - the clear is a LEASED delete: a concurrent change to the ref makes it REJECT
|
|
525
|
+
* (`lost`), reported — never a blind `--force`.
|
|
526
|
+
*
|
|
527
|
+
* The DEFAULT `gc --ledger` (no flag) never calls this: it stays report-only,
|
|
528
|
+
* fail-loud, delete-nothing. This is gated behind the explicit `--reap-stale-locks`
|
|
529
|
+
* flag (a human authorising the clear), exactly as `release-lock`'s trust model.
|
|
530
|
+
*/
|
|
531
|
+
export declare function reapStaleItemLocks(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<ReapReport>;
|
|
532
|
+
/**
|
|
533
|
+
* Does a {@link reapStaleItemLocks} sweep leave a lock that STILL needs human
|
|
534
|
+
* attention? TRUE iff some entry is `kept-stuck` (a stuck lock the reaper rightly
|
|
535
|
+
* left) or `lost`/`error` (a `cleared-stale` whose leased delete lost the race, or
|
|
536
|
+
* an unresolvable fault). A `reaped` (successfully cleared) or a `kept-in-flight`
|
|
537
|
+
* (healthy build) lock does NOT count — so a sweep that cleared every stale lock
|
|
538
|
+
* and left only healthy in-flight holds exits 0. This is the post-sweep analogue of
|
|
539
|
+
* {@link itemLockReportNeedsAttention}.
|
|
540
|
+
*/
|
|
541
|
+
export declare function reapReportNeedsAttention(report: ReapReport): boolean;
|
|
542
|
+
/**
|
|
543
|
+
* Format the `gc --ledger --reap-stale-locks` sweep for the terminal: a header
|
|
544
|
+
* line with the reaped/kept counts, then one line per lock (what was reaped vs
|
|
545
|
+
* kept vs lost). An EMPTY sweep (no locks held) yields NO lines (silent, like the
|
|
546
|
+
* report). The wording keeps the no-blind-force contract explicit.
|
|
547
|
+
*/
|
|
548
|
+
export declare function formatReapReport(report: ReapReport): string[];
|
|
549
|
+
/**
|
|
550
|
+
* Convert a type-encoded lock `<entry>` (`<type>-<slug>`) back into the namespaced
|
|
551
|
+
* item form (`<namespace>:<slug>`) that {@link lockEntryFor} /
|
|
552
|
+
* {@link resolveSidecarIdentity} accept — so the report's suggested `release-lock`
|
|
553
|
+
* command is copy-pasteable and the classifier can re-key off the SAME identity.
|
|
554
|
+
* Unknown prefixes fall back to the raw entry (still copyable). The inverse of
|
|
555
|
+
* {@link lockEntryFor} for the three known namespaces.
|
|
556
|
+
*/
|
|
557
|
+
export declare function itemFromLockEntry(entry: string): string;
|
|
558
|
+
/** List the entries (`<type>-<slug>`) currently locked on the arbiter (the
|
|
559
|
+
* stuck-lock report / `status` read path). */
|
|
560
|
+
export declare function listItemLocks(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<string[]>;
|
|
561
|
+
/**
|
|
562
|
+
* Read the FULL lock entries currently held on the arbiter — the `status`/`scan`
|
|
563
|
+
* in-flight read path (prd `ledger-status-per-item-lock-refs` US #8; task
|
|
564
|
+
* `needs-attention-as-stuck-lock-state`). One fetch of the lock refs, then read
|
|
565
|
+
* each held entry's `lock.md` blob, returning the parsed {@link LockEntry} for
|
|
566
|
+
* every ref (so a caller can surface `active` (in-progress) and `stuck`
|
|
567
|
+
* (needs-attention) holds + their reasons WITHOUT N fetches). Sorted by `entry`.
|
|
568
|
+
* Best-effort: a fetch/read fault yields an EMPTY list, so the read-only
|
|
569
|
+
* `status`/`scan` views degrade to "no in-flight locks" rather than erroring
|
|
570
|
+
* (parity with {@link heldTaskSlugs}).
|
|
571
|
+
*/
|
|
572
|
+
export declare function listItemLockEntries(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<LockEntry[]>;
|
|
573
|
+
/**
|
|
574
|
+
* List the TASK slugs currently lock-held on the arbiter — the held-slug set the
|
|
575
|
+
* `ready/` pool readers SUBTRACT (prd `ledger-status-per-item-lock-refs` US #15;
|
|
576
|
+
* task `claim-acquires-unified-lock-no-body-move`). Enumerates {@link listItemLocks}
|
|
577
|
+
* and keeps only the `task-<slug>` entries (a prd/observation lock does not gate
|
|
578
|
+
* the TASK pool), mapping each to its bare `<slug>`.
|
|
579
|
+
*
|
|
580
|
+
* LOAD-BEARING since the lock cut-over: the claim NO LONGER moves the body to
|
|
581
|
+
* `in-progress/` (it stays in the pool on `main`; the held lock IS the claim), so
|
|
582
|
+
* this held-slug set is the ONLY signal that keeps a claimed / in-flight item out
|
|
583
|
+
* of the eligible pool, NOT the redundant subtraction it was while the body-move
|
|
584
|
+
* still removed claimed items.
|
|
585
|
+
*
|
|
586
|
+
* GRACEFUL (fail-OPEN) by design — this is the SURFACE reader: a fetch fault
|
|
587
|
+
* yields an EMPTY set so the read-only `status`/`scan` views degrade to "no
|
|
588
|
+
* in-flight locks" rather than erroring. That is WRONG for SELECTION (an empty set
|
|
589
|
+
* on a read FAULT lets a continuously-held in-flight item leak back into the
|
|
590
|
+
* eligible pool → re-claimed → empty diff → spurious `stuck`). The SELECTION path
|
|
591
|
+
* must instead use {@link heldTaskSlugsStrict}, which THROWS on a read fault so
|
|
592
|
+
* the caller can fail CLOSED (refuse to enumerate an untrusted pool) rather than
|
|
593
|
+
* subtract nothing. This graceful variant delegates to the strict one and only
|
|
594
|
+
* swallows the fault.
|
|
595
|
+
*/
|
|
596
|
+
export declare function heldTaskSlugs(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<Set<string>>;
|
|
597
|
+
/**
|
|
598
|
+
* STRICT (fail-CLOSED) twin of {@link heldTaskSlugs} for the SELECTION path: read
|
|
599
|
+
* the held TASK slugs from the arbiter and THROW on any read fault (offline / dead
|
|
600
|
+
* arbiter / unreadable lock refs) instead of degrading to an empty set. The
|
|
601
|
+
* held-lock set lives ONLY on the arbiter and is the LOAD-BEARING signal that
|
|
602
|
+
* keeps a claimed / in-flight item out of the eligible pool, so a SELECTION read
|
|
603
|
+
* that cannot reach the arbiter must NOT pretend "no locks held" — it must fail so
|
|
604
|
+
* the caller refuses to enumerate a pool it cannot trust (the
|
|
605
|
+
* `scan-cwd-selection-pool-read-local-skips-held-lock-subtraction-offline-must-fail`
|
|
606
|
+
* decision: offline selection FAILS, there is no `--local` fallback). The
|
|
607
|
+
* read-only surface keeps the graceful {@link heldTaskSlugs}.
|
|
608
|
+
*/
|
|
609
|
+
export declare function heldTaskSlugsStrict(cwd: string, arbiter?: string, env?: NodeJS.ProcessEnv): Promise<Set<string>>;
|
|
610
|
+
/**
|
|
611
|
+
* Parse a serialised lock entry body back into a {@link LockEntry} — the exact
|
|
612
|
+
* inverse of {@link serialiseLockEntry}. Reads the two-axis state from the
|
|
613
|
+
* frontmatter and, for a stuck entry, the FULL reason prose + any questions from
|
|
614
|
+
* the body (`## Reason` / `## Questions`). Tolerates a LEGACY entry whose reason
|
|
615
|
+
* lived in a one-line frontmatter `reason:` field (the pre-cutover shape) so a
|
|
616
|
+
* lock written by an older binary still reads.
|
|
617
|
+
*/
|
|
618
|
+
export declare function parseLockEntry(body: string): LockEntry | undefined;
|
|
619
|
+
/**
|
|
620
|
+
* Advisory holder id: git user.name, else $USER, else a uuid fragment. Exported
|
|
621
|
+
* as {@link resolveLockHolder} so callers (e.g. claim's stale-lock self-heal) can
|
|
622
|
+
* resolve THE SAME holder string the lock would stamp, to compare against a held
|
|
623
|
+
* entry's `holder` without duplicating the resolution order.
|
|
624
|
+
*/
|
|
625
|
+
export declare function resolveLockHolder(cwd: string, env?: NodeJS.ProcessEnv): Promise<string>;
|
|
626
|
+
//# sourceMappingURL=item-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-lock.d.ts","sourceRoot":"","sources":["../src/item-lock.ts"],"names":[],"mappings":"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"}
|