agentic-orchestrator 0.1.28 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +46 -1
- package/.cortexrc +28 -0
- package/.github/agents/copilot-instructions.md +29 -0
- package/.github/copilot-instructions.md +93 -0
- package/.vscode/settings.json +13 -0
- package/.vscode/tms.code-snippets +223 -0
- package/AGENTS.md +72 -1
- package/Agentic-Orchestrator.iml +12 -11
- package/CLAUDE.md +72 -1
- package/CONSTITUTION.md +504 -0
- package/FUTURE-ENHANCEMENTS.md +85 -0
- package/NEXT-TASKS.md +25 -0
- package/PROMPTS.md +161 -0
- package/README.md +126 -29
- package/agentic/orchestrator/agents.yaml +4 -3
- package/agentic/orchestrator/defaults/policy.defaults.yaml +39 -3
- package/agentic/orchestrator/gates.yaml +15 -3
- package/agentic/orchestrator/policy.yaml +47 -3
- package/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/agentic/orchestrator/prompts/qa.system.md +73 -18
- package/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/agentic/orchestrator/schemas/agents.schema.json +89 -1
- package/agentic/orchestrator/schemas/execution-control.schema.json +242 -0
- package/agentic/orchestrator/schemas/index.schema.json +234 -0
- package/agentic/orchestrator/schemas/intake.review.schema.json +82 -0
- package/agentic/orchestrator/schemas/organizer-ordering-artifact.schema.json +75 -0
- package/agentic/orchestrator/schemas/plan.schema.json +44 -0
- package/agentic/orchestrator/schemas/policy.schema.json +238 -9
- package/agentic/orchestrator/schemas/policy.user.schema.json +129 -1
- package/agentic/orchestrator/schemas/spec.manifest.bootstrap.schema.json +101 -0
- package/agentic/orchestrator/schemas/spec.manifest.verified.schema.json +80 -0
- package/agentic/orchestrator/schemas/state.schema.json +298 -3
- package/agentic/orchestrator/tools/catalog.json +145 -15
- package/agentic/orchestrator/tools/schemas/input/doctor.run.input.schema.json +18 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +4 -0
- package/agentic/orchestrator/tools/schemas/input/evidence.verify_chain.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.intake_submit.input.schema.json +11 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_answer.input.schema.json +15 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_create.input.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/input/feature.question_list.input.schema.json +13 -0
- package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +5 -0
- package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +1 -1
- package/agentic/orchestrator/tools/schemas/input/replay.timeline_get.input.schema.json +32 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_abort.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.conflict_files.input.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/input/repo.reconcile_mainline.input.schema.json +37 -0
- package/agentic/orchestrator/tools/schemas/input/repo.resolve_conflict.input.schema.json +40 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_list.input.schema.json +7 -0
- package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_submit.input.schema.json +25 -0
- package/agentic/orchestrator/tools/schemas/output/doctor.run.output.schema.json +34 -0
- package/agentic/orchestrator/tools/schemas/output/evidence.verify_chain.output.schema.json +23 -0
- package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +62 -2
- package/agentic/orchestrator/tools/schemas/output/feature.intake_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_answer.output.schema.json +21 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_create.output.schema.json +12 -0
- package/agentic/orchestrator/tools/schemas/output/feature.question_list.output.schema.json +14 -0
- package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +31 -0
- package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +8 -18
- package/agentic/orchestrator/tools/schemas/output/replay.timeline_get.output.schema.json +64 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_abort.output.schema.json +16 -0
- package/agentic/orchestrator/tools/schemas/output/repo.conflict_files.output.schema.json +22 -0
- package/agentic/orchestrator/tools/schemas/output/repo.reconcile_mainline.output.schema.json +61 -0
- package/agentic/orchestrator/tools/schemas/output/repo.resolve_conflict.output.schema.json +19 -0
- package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +26 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_list.output.schema.json +17 -0
- package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_submit.output.schema.json +24 -0
- package/agentic/orchestrator/tools.md +13 -0
- package/apps/control-plane/scripts/validate-mcp-contracts.ts +1 -1
- package/apps/control-plane/src/application/kernel-tool-wiring.ts +140 -2
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +44 -1
- package/apps/control-plane/src/application/services/bootstrap-manifest-generator-service.ts +251 -0
- package/apps/control-plane/src/application/services/checkpoint-service.ts +87 -27
- package/apps/control-plane/src/application/services/collision-override-service.ts +906 -0
- package/apps/control-plane/src/application/services/collision-queue-service.ts +129 -38
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +94 -0
- package/apps/control-plane/src/application/services/execution-control-service.ts +599 -0
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +37 -1
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +182 -4
- package/apps/control-plane/src/application/services/feature-send-message-service.ts +17 -8
- package/apps/control-plane/src/application/services/feature-state-service.ts +191 -6
- package/apps/control-plane/src/application/services/gate-service.ts +121 -2
- package/apps/control-plane/src/application/services/git-reconciliation-service.ts +1591 -0
- package/apps/control-plane/src/application/services/intake-service.ts +1468 -0
- package/apps/control-plane/src/application/services/merge-service.ts +308 -17
- package/apps/control-plane/src/application/services/notifier-service.ts +3 -1
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +75 -0
- package/apps/control-plane/src/application/services/plan-service.ts +336 -20
- package/apps/control-plane/src/application/services/question-service.ts +693 -0
- package/apps/control-plane/src/application/services/reactions-service.ts +73 -17
- package/apps/control-plane/src/application/services/replay-timeline-service.ts +295 -0
- package/apps/control-plane/src/application/services/reporting-service.ts +194 -10
- package/apps/control-plane/src/application/services/run-lease-service.ts +121 -5
- package/apps/control-plane/src/application/services/worktree-watchdog-service.ts +95 -8
- package/apps/control-plane/src/application/tools/tool-metadata.ts +7 -0
- package/apps/control-plane/src/application/usage-types.ts +138 -0
- package/apps/control-plane/src/cli/add-command-handler.ts +162 -0
- package/apps/control-plane/src/cli/answer-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/attach-command-handler.ts +12 -3
- package/apps/control-plane/src/cli/cli-argument-parser.ts +133 -11
- package/apps/control-plane/src/cli/collision-command-handler.ts +113 -0
- package/apps/control-plane/src/cli/command-catalog.ts +479 -0
- package/apps/control-plane/src/cli/complete-command-handler.ts +23 -0
- package/apps/control-plane/src/cli/completion-command-handler.ts +25 -0
- package/apps/control-plane/src/cli/completion-resolver.ts +319 -0
- package/apps/control-plane/src/cli/completion-shell-renderer.ts +58 -0
- package/apps/control-plane/src/cli/dashboard-command-handler.ts +111 -1
- package/apps/control-plane/src/cli/dashboard-runtime-runner.ts +1036 -0
- package/apps/control-plane/src/cli/dashboard-runtime.ts +31 -0
- package/apps/control-plane/src/cli/help-command-handler.ts +17 -185
- package/apps/control-plane/src/cli/init-command-handler.ts +51 -6
- package/apps/control-plane/src/cli/merge-command-handler.ts +200 -0
- package/apps/control-plane/src/cli/questions-command-handler.ts +70 -0
- package/apps/control-plane/src/cli/replay-command-handler.ts +98 -0
- package/apps/control-plane/src/cli/resume-command-handler.ts +231 -16
- package/apps/control-plane/src/cli/retry-command-handler.ts +229 -17
- package/apps/control-plane/src/cli/retry-resume-decision.ts +75 -0
- package/apps/control-plane/src/cli/rollback-command-handler.ts +4 -2
- package/apps/control-plane/src/cli/run-command-handler.ts +35 -1
- package/apps/control-plane/src/cli/spec-ingestion-service.ts +45 -55
- package/apps/control-plane/src/cli/spec-preparation.ts +114 -0
- package/apps/control-plane/src/cli/spec-utils.ts +90 -11
- package/apps/control-plane/src/cli/status-command-handler.ts +122 -0
- package/apps/control-plane/src/cli/types.ts +41 -3
- package/apps/control-plane/src/core/collisions.ts +150 -31
- package/apps/control-plane/src/core/constants.ts +18 -1
- package/apps/control-plane/src/core/error-codes.ts +39 -0
- package/apps/control-plane/src/core/execution-control.ts +56 -0
- package/apps/control-plane/src/core/feature-resume-phase.ts +118 -0
- package/apps/control-plane/src/core/gate-freshness.ts +359 -0
- package/apps/control-plane/src/core/gate-log-extractor.ts +97 -0
- package/apps/control-plane/src/core/gates.ts +90 -1
- package/apps/control-plane/src/core/intake-artifacts.ts +295 -0
- package/apps/control-plane/src/core/kernel-types.ts +11 -0
- package/apps/control-plane/src/core/kernel.ts +604 -16
- package/apps/control-plane/src/core/mainline-conflict.ts +22 -0
- package/apps/control-plane/src/core/merge-repair.ts +149 -0
- package/apps/control-plane/src/core/path-layout.ts +46 -2
- package/apps/control-plane/src/core/path-rules.ts +11 -3
- package/apps/control-plane/src/core/plan-submit-recovery.ts +130 -0
- package/apps/control-plane/src/core/questions.ts +49 -0
- package/apps/control-plane/src/core/runtime-sessions.ts +4 -0
- package/apps/control-plane/src/core/schemas.ts +40 -1
- package/apps/control-plane/src/core/tool-caller.ts +25 -1
- package/apps/control-plane/src/core/utils/index-normalizer.ts +25 -4
- package/apps/control-plane/src/core/worktree-diff.ts +66 -0
- package/apps/control-plane/src/index.ts +29 -1
- package/apps/control-plane/src/interfaces/cli/bootstrap.ts +300 -6
- package/apps/control-plane/src/mcp/kernel-tool-executor.ts +17 -0
- package/apps/control-plane/src/mcp/tool-runtime.ts +63 -4
- package/apps/control-plane/src/providers/api-worker-provider.ts +62 -15
- package/apps/control-plane/src/providers/cli-worker-provider.ts +1037 -61
- package/apps/control-plane/src/providers/output-parsers/generic-output-parser.ts +99 -1
- package/apps/control-plane/src/providers/output-parsers/types.ts +2 -0
- package/apps/control-plane/src/providers/provider-defaults.ts +116 -7
- package/apps/control-plane/src/providers/providers.ts +225 -21
- package/apps/control-plane/src/providers/worker-provider-factory.ts +26 -2
- package/apps/control-plane/src/supervisor/artifact-stager.ts +52 -0
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +477 -166
- package/apps/control-plane/src/supervisor/execution-enrollment-service.ts +408 -0
- package/apps/control-plane/src/supervisor/organizer-enrollment-scheduler.ts +117 -0
- package/apps/control-plane/src/supervisor/organizer-sidecar-service.ts +394 -0
- package/apps/control-plane/src/supervisor/plan-conformance-scorer.ts +2 -5
- package/apps/control-plane/src/supervisor/planner-phase.ts +85 -0
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +993 -64
- package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +20 -1
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +384 -177
- package/apps/control-plane/src/supervisor/run-coordinator.ts +723 -20
- package/apps/control-plane/src/supervisor/runtime.ts +485 -9
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +220 -1
- package/apps/control-plane/src/supervisor/types.ts +152 -1
- package/apps/control-plane/src/supervisor/worker-decision-loop.ts +1030 -92
- package/apps/control-plane/test/activity-monitor.spec.ts +76 -0
- package/apps/control-plane/test/add-command-handler.spec.ts +189 -0
- package/apps/control-plane/test/application/services/feature-state-service.spec.ts +208 -0
- package/apps/control-plane/test/artifact-stager.spec.ts +93 -0
- package/apps/control-plane/test/batch-operations.spec.ts +58 -0
- package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +50 -2
- package/apps/control-plane/test/bootstrap-manifest-generator-service.spec.ts +99 -0
- package/apps/control-plane/test/bootstrap.spec.ts +177 -4
- package/apps/control-plane/test/checkpoint-service.spec.ts +977 -29
- package/apps/control-plane/test/cli-argument-parser.spec.ts +119 -0
- package/apps/control-plane/test/cli-helpers.spec.ts +1202 -12
- package/apps/control-plane/test/cli.unit.spec.ts +797 -16
- package/apps/control-plane/test/collision-command-handler.spec.ts +182 -0
- package/apps/control-plane/test/collision-override-service.spec.ts +878 -0
- package/apps/control-plane/test/collision-queue.spec.ts +430 -2
- package/apps/control-plane/test/collisions.spec.ts +209 -1
- package/apps/control-plane/test/core-utils.spec.ts +61 -0
- package/apps/control-plane/test/cost-tracking.spec.ts +224 -0
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +185 -5
- package/apps/control-plane/test/dashboard-client.spec.ts +948 -0
- package/apps/control-plane/test/dashboard-command.spec.ts +138 -6
- package/apps/control-plane/test/dashboard-runtime-runner.spec.ts +1550 -0
- package/apps/control-plane/test/dashboard-runtime.spec.ts +138 -0
- package/apps/control-plane/test/dashboard-ui-utils.spec.ts +56 -12
- package/apps/control-plane/test/dependency-scheduler.spec.ts +7 -1
- package/apps/control-plane/test/env-file.spec.ts +76 -0
- package/apps/control-plane/test/execution-control-service.spec.ts +535 -0
- package/apps/control-plane/test/execution-enrollment-service.spec.ts +648 -0
- package/apps/control-plane/test/feature-lifecycle.spec.ts +126 -0
- package/apps/control-plane/test/feature-resume-phase.spec.ts +164 -0
- package/apps/control-plane/test/feature-send-message-service.spec.ts +161 -0
- package/apps/control-plane/test/feature-state-service.spec.ts +295 -0
- package/apps/control-plane/test/fs.spec.ts +80 -0
- package/apps/control-plane/test/gate-freshness.spec.ts +590 -0
- package/apps/control-plane/test/gate-log-extractor.spec.ts +170 -0
- package/apps/control-plane/test/gates.spec.ts +108 -0
- package/apps/control-plane/test/git-reconciliation-service.spec.ts +2307 -0
- package/apps/control-plane/test/helpers.ts +65 -0
- package/apps/control-plane/test/incremental-gates.spec.ts +271 -0
- package/apps/control-plane/test/index-normalizer.spec.ts +98 -0
- package/apps/control-plane/test/init-wizard.spec.ts +17 -0
- package/apps/control-plane/test/intake-artifacts.spec.ts +203 -0
- package/apps/control-plane/test/intake-service.spec.ts +3176 -0
- package/apps/control-plane/test/kernel-collision-replay.spec.ts +3 -2
- package/apps/control-plane/test/kernel-tool-executor.spec.ts +77 -0
- package/apps/control-plane/test/kernel-tool-wiring.spec.ts +279 -0
- package/apps/control-plane/test/kernel.branches.spec.ts +15 -2
- package/apps/control-plane/test/kernel.coverage.spec.ts +7 -3
- package/apps/control-plane/test/kernel.coverage2.spec.ts +731 -2
- package/apps/control-plane/test/kernel.spec.ts +464 -2
- package/apps/control-plane/test/mainline-conflict.spec.ts +66 -0
- package/apps/control-plane/test/mcp-helpers.spec.ts +79 -0
- package/apps/control-plane/test/mcp.spec.ts +177 -13
- package/apps/control-plane/test/merge-command-handler.spec.ts +531 -0
- package/apps/control-plane/test/merge-service.spec.ts +570 -4
- package/apps/control-plane/test/notifier-service.spec.ts +26 -0
- package/apps/control-plane/test/organizer-enrollment-scheduler.spec.ts +340 -0
- package/apps/control-plane/test/organizer-ordering-artifact.spec.ts +95 -0
- package/apps/control-plane/test/organizer-sidecar-service.spec.ts +468 -0
- package/apps/control-plane/test/output-loop-detector.spec.ts +6 -0
- package/apps/control-plane/test/path-layout.spec.ts +70 -0
- package/apps/control-plane/test/performance-analytics.spec.ts +124 -0
- package/apps/control-plane/test/plan-conformance-scorer.spec.ts +53 -0
- package/apps/control-plane/test/plan-service.spec.ts +686 -4
- package/apps/control-plane/test/planning-wave-executor.spec.ts +3272 -86
- package/apps/control-plane/test/policy-loader-service.spec.ts +5 -0
- package/apps/control-plane/test/prompt-overlay.spec.ts +65 -0
- package/apps/control-plane/test/provider-command-runner-epipe.spec.ts +64 -0
- package/apps/control-plane/test/providers/api-worker-provider.spec.ts +129 -0
- package/apps/control-plane/test/providers/cli-worker-provider.spec.ts +148 -0
- package/apps/control-plane/test/providers/usage-types.spec.ts +98 -0
- package/apps/control-plane/test/providers.spec.ts +293 -16
- package/apps/control-plane/test/question-command-handlers.spec.ts +156 -0
- package/apps/control-plane/test/question-service.spec.ts +1119 -0
- package/apps/control-plane/test/reactions.spec.ts +114 -0
- package/apps/control-plane/test/replay-command-handler.spec.ts +144 -0
- package/apps/control-plane/test/replay-timeline-service.spec.ts +459 -0
- package/apps/control-plane/test/response.spec.ts +31 -0
- package/apps/control-plane/test/resume-command.spec.ts +757 -9
- package/apps/control-plane/test/retry-resume-decision.spec.ts +133 -0
- package/apps/control-plane/test/rollback-command-handler.spec.ts +334 -0
- package/apps/control-plane/test/rollback-command.spec.ts +120 -0
- package/apps/control-plane/test/run-coordinator.spec.ts +3062 -404
- package/apps/control-plane/test/schemas/state.schema.spec.ts +71 -0
- package/apps/control-plane/test/service-retry-paths.spec.ts +112 -0
- package/apps/control-plane/test/services.spec.ts +472 -2
- package/apps/control-plane/test/session-management.spec.ts +346 -1
- package/apps/control-plane/test/spec-ingestion.spec.ts +102 -28
- package/apps/control-plane/test/spec-preparation.spec.ts +182 -0
- package/apps/control-plane/test/supervisor-collaborators.spec.ts +191 -3
- package/apps/control-plane/test/supervisor.calltool.spec.ts +198 -0
- package/apps/control-plane/test/supervisor.spec.ts +95 -16
- package/apps/control-plane/test/supervisor.unit.spec.ts +385 -18
- package/apps/control-plane/test/tool-runtime.spec.ts +122 -0
- package/apps/control-plane/test/worker-decision-loop.spec.ts +3479 -476
- package/apps/control-plane/test/worker-execution-policy.spec.ts +1416 -6
- package/apps/control-plane/test/worker-provider-adapters.spec.ts +1894 -37
- package/apps/control-plane/test/worker-provider-factory.spec.ts +81 -0
- package/apps/control-plane/test/worktree-watchdog-service.spec.ts +125 -0
- package/apps/control-plane/vitest.config.ts +5 -0
- package/config/agentic/orchestrator/agents.yaml +22 -1
- package/config/agentic/orchestrator/gates.yaml +24 -7
- package/config/agentic/orchestrator/policy.yaml +23 -1
- package/config/agentic/orchestrator/prompts/builder.system.md +69 -20
- package/config/agentic/orchestrator/prompts/organizer.system.md +85 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.claude.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/builder.codex.md +28 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.claude.md +20 -0
- package/config/agentic/orchestrator/prompts/overrides/planner.codex.md +20 -0
- package/config/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
- package/config/agentic/orchestrator/prompts/planner.system.md +113 -40
- package/config/agentic/orchestrator/prompts/qa.system.md +75 -18
- package/config/agentic/orchestrator/prompts/reconciler.system.md +119 -0
- package/dist/apps/control-plane/application/kernel-tool-wiring.d.ts +26 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js +40 -2
- package/dist/apps/control-plane/application/kernel-tool-wiring.js.map +1 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +37 -1
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.d.ts +4 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js +188 -0
- package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/checkpoint-service.js +69 -24
- package/dist/apps/control-plane/application/services/checkpoint-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-override-service.d.ts +139 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js +568 -0
- package/dist/apps/control-plane/application/services/collision-override-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +15 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.js +92 -33
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +75 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/execution-control-service.d.ts +75 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js +421 -0
- package/dist/apps/control-plane/application/services/execution-control-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +1 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +23 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +24 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +132 -3
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-send-message-service.js +16 -8
- package/dist/apps/control-plane/application/services/feature-send-message-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.d.ts +36 -0
- package/dist/apps/control-plane/application/services/feature-state-service.js +163 -6
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.d.ts +2 -1
- package/dist/apps/control-plane/application/services/gate-service.js +95 -5
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/git-reconciliation-service.d.ts +92 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js +1097 -0
- package/dist/apps/control-plane/application/services/git-reconciliation-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/intake-service.d.ts +63 -0
- package/dist/apps/control-plane/application/services/intake-service.js +1050 -0
- package/dist/apps/control-plane/application/services/intake-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/merge-service.d.ts +5 -1
- package/dist/apps/control-plane/application/services/merge-service.js +233 -18
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.d.ts +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.js +1 -0
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +11 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +59 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.d.ts +5 -0
- package/dist/apps/control-plane/application/services/plan-service.js +254 -15
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/question-service.d.ts +72 -0
- package/dist/apps/control-plane/application/services/question-service.js +507 -0
- package/dist/apps/control-plane/application/services/question-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reactions-service.d.ts +2 -0
- package/dist/apps/control-plane/application/services/reactions-service.js +60 -17
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/replay-timeline-service.d.ts +39 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js +205 -0
- package/dist/apps/control-plane/application/services/replay-timeline-service.js.map +1 -0
- package/dist/apps/control-plane/application/services/reporting-service.d.ts +59 -0
- package/dist/apps/control-plane/application/services/reporting-service.js +121 -9
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.d.ts +20 -0
- package/dist/apps/control-plane/application/services/run-lease-service.js +81 -4
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.d.ts +10 -0
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js +65 -8
- package/dist/apps/control-plane/application/services/worktree-watchdog-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-metadata.js +7 -0
- package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
- package/dist/apps/control-plane/application/usage-types.d.ts +65 -0
- package/dist/apps/control-plane/application/usage-types.js +75 -0
- package/dist/apps/control-plane/application/usage-types.js.map +1 -0
- package/dist/apps/control-plane/cli/add-command-handler.d.ts +18 -0
- package/dist/apps/control-plane/cli/add-command-handler.js +110 -0
- package/dist/apps/control-plane/cli/add-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/answer-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js +96 -0
- package/dist/apps/control-plane/cli/answer-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/attach-command-handler.js +8 -3
- package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/cli-argument-parser.js +131 -11
- package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
- package/dist/apps/control-plane/cli/collision-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js +90 -0
- package/dist/apps/control-plane/cli/collision-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/command-catalog.d.ts +21 -0
- package/dist/apps/control-plane/cli/command-catalog.js +416 -0
- package/dist/apps/control-plane/cli/command-catalog.js.map +1 -0
- package/dist/apps/control-plane/cli/complete-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js +26 -0
- package/dist/apps/control-plane/cli/complete-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js +20 -0
- package/dist/apps/control-plane/cli/completion-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.d.ts +1 -0
- package/dist/apps/control-plane/cli/completion-resolver.js +250 -0
- package/dist/apps/control-plane/cli/completion-resolver.js.map +1 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.d.ts +3 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js +53 -0
- package/dist/apps/control-plane/cli/completion-shell-renderer.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-command-handler.js +84 -1
- package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.d.ts +81 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js +724 -0
- package/dist/apps/control-plane/cli/dashboard-runtime-runner.js.map +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.d.ts +1 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js +26 -0
- package/dist/apps/control-plane/cli/dashboard-runtime.js.map +1 -0
- package/dist/apps/control-plane/cli/help-command-handler.js +13 -172
- package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/init-command-handler.js +51 -6
- package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/merge-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js +139 -0
- package/dist/apps/control-plane/cli/merge-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/questions-command-handler.d.ts +8 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js +59 -0
- package/dist/apps/control-plane/cli/questions-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/replay-command-handler.d.ts +15 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js +55 -0
- package/dist/apps/control-plane/cli/replay-command-handler.js.map +1 -0
- package/dist/apps/control-plane/cli/resume-command-handler.d.ts +2 -0
- package/dist/apps/control-plane/cli/resume-command-handler.js +180 -17
- package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-command-handler.js +202 -16
- package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/retry-resume-decision.d.ts +26 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js +61 -0
- package/dist/apps/control-plane/cli/retry-resume-decision.js.map +1 -0
- package/dist/apps/control-plane/cli/rollback-command-handler.js +3 -2
- package/dist/apps/control-plane/cli/rollback-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/run-command-handler.js +26 -2
- package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-ingestion-service.d.ts +2 -0
- package/dist/apps/control-plane/cli/spec-ingestion-service.js +37 -48
- package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
- package/dist/apps/control-plane/cli/spec-preparation.d.ts +14 -0
- package/dist/apps/control-plane/cli/spec-preparation.js +81 -0
- package/dist/apps/control-plane/cli/spec-preparation.js.map +1 -0
- package/dist/apps/control-plane/cli/spec-utils.d.ts +4 -0
- package/dist/apps/control-plane/cli/spec-utils.js +70 -11
- package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
- package/dist/apps/control-plane/cli/status-command-handler.js +69 -0
- package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
- package/dist/apps/control-plane/cli/types.d.ts +41 -4
- package/dist/apps/control-plane/cli/types.js +9 -1
- package/dist/apps/control-plane/cli/types.js.map +1 -1
- package/dist/apps/control-plane/core/collisions.d.ts +37 -19
- package/dist/apps/control-plane/core/collisions.js +87 -12
- package/dist/apps/control-plane/core/collisions.js.map +1 -1
- package/dist/apps/control-plane/core/constants.d.ts +17 -1
- package/dist/apps/control-plane/core/constants.js +18 -1
- package/dist/apps/control-plane/core/constants.js.map +1 -1
- package/dist/apps/control-plane/core/error-codes.d.ts +39 -0
- package/dist/apps/control-plane/core/error-codes.js +39 -0
- package/dist/apps/control-plane/core/error-codes.js.map +1 -1
- package/dist/apps/control-plane/core/execution-control.d.ts +45 -0
- package/dist/apps/control-plane/core/execution-control.js +2 -0
- package/dist/apps/control-plane/core/execution-control.js.map +1 -0
- package/dist/apps/control-plane/core/feature-resume-phase.d.ts +3 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js +88 -0
- package/dist/apps/control-plane/core/feature-resume-phase.js.map +1 -0
- package/dist/apps/control-plane/core/gate-freshness.d.ts +48 -0
- package/dist/apps/control-plane/core/gate-freshness.js +267 -0
- package/dist/apps/control-plane/core/gate-freshness.js.map +1 -0
- package/dist/apps/control-plane/core/gate-log-extractor.d.ts +22 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js +66 -0
- package/dist/apps/control-plane/core/gate-log-extractor.js.map +1 -0
- package/dist/apps/control-plane/core/gates.d.ts +11 -2
- package/dist/apps/control-plane/core/gates.js +67 -3
- package/dist/apps/control-plane/core/gates.js.map +1 -1
- package/dist/apps/control-plane/core/intake-artifacts.d.ts +109 -0
- package/dist/apps/control-plane/core/intake-artifacts.js +143 -0
- package/dist/apps/control-plane/core/intake-artifacts.js.map +1 -0
- package/dist/apps/control-plane/core/kernel-types.d.ts +8 -0
- package/dist/apps/control-plane/core/kernel.d.ts +256 -8
- package/dist/apps/control-plane/core/kernel.js +400 -14
- package/dist/apps/control-plane/core/kernel.js.map +1 -1
- package/dist/apps/control-plane/core/mainline-conflict.d.ts +7 -0
- package/dist/apps/control-plane/core/mainline-conflict.js +20 -0
- package/dist/apps/control-plane/core/mainline-conflict.js.map +1 -0
- package/dist/apps/control-plane/core/merge-repair.d.ts +35 -0
- package/dist/apps/control-plane/core/merge-repair.js +99 -0
- package/dist/apps/control-plane/core/merge-repair.js.map +1 -0
- package/dist/apps/control-plane/core/path-layout.d.ts +10 -0
- package/dist/apps/control-plane/core/path-layout.js +32 -2
- package/dist/apps/control-plane/core/path-layout.js.map +1 -1
- package/dist/apps/control-plane/core/path-rules.js +9 -3
- package/dist/apps/control-plane/core/path-rules.js.map +1 -1
- package/dist/apps/control-plane/core/plan-submit-recovery.d.ts +22 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js +78 -0
- package/dist/apps/control-plane/core/plan-submit-recovery.js.map +1 -0
- package/dist/apps/control-plane/core/questions.d.ts +40 -0
- package/dist/apps/control-plane/core/questions.js +2 -0
- package/dist/apps/control-plane/core/questions.js.map +1 -0
- package/dist/apps/control-plane/core/runtime-sessions.d.ts +4 -0
- package/dist/apps/control-plane/core/schemas.d.ts +2 -0
- package/dist/apps/control-plane/core/schemas.js +31 -1
- package/dist/apps/control-plane/core/schemas.js.map +1 -1
- package/dist/apps/control-plane/core/tool-caller.d.ts +18 -1
- package/dist/apps/control-plane/core/utils/index-normalizer.js +17 -4
- package/dist/apps/control-plane/core/utils/index-normalizer.js.map +1 -1
- package/dist/apps/control-plane/core/worktree-diff.d.ts +4 -0
- package/dist/apps/control-plane/core/worktree-diff.js +52 -0
- package/dist/apps/control-plane/core/worktree-diff.js.map +1 -0
- package/dist/apps/control-plane/index.d.ts +10 -2
- package/dist/apps/control-plane/index.js +9 -2
- package/dist/apps/control-plane/index.js.map +1 -1
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js +236 -6
- package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js +16 -0
- package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.d.ts +5 -0
- package/dist/apps/control-plane/mcp/tool-runtime.js +40 -5
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/providers/api-worker-provider.d.ts +2 -2
- package/dist/apps/control-plane/providers/api-worker-provider.js +40 -9
- package/dist/apps/control-plane/providers/api-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/cli-worker-provider.d.ts +59 -3
- package/dist/apps/control-plane/providers/cli-worker-provider.js +758 -46
- package/dist/apps/control-plane/providers/cli-worker-provider.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js +91 -1
- package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js.map +1 -1
- package/dist/apps/control-plane/providers/output-parsers/types.d.ts +2 -0
- package/dist/apps/control-plane/providers/provider-defaults.d.ts +12 -0
- package/dist/apps/control-plane/providers/provider-defaults.js +103 -7
- package/dist/apps/control-plane/providers/provider-defaults.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +50 -4
- package/dist/apps/control-plane/providers/providers.js +145 -14
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +2 -0
- package/dist/apps/control-plane/providers/worker-provider-factory.js +8 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
- package/dist/apps/control-plane/supervisor/artifact-stager.d.ts +5 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js +45 -0
- package/dist/apps/control-plane/supervisor/artifact-stager.js.map +1 -0
- package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +24 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +362 -150
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.d.ts +41 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js +311 -0
- package/dist/apps/control-plane/supervisor/execution-enrollment-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.d.ts +15 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js +93 -0
- package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js.map +1 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.d.ts +44 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js +311 -0
- package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js.map +1 -0
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js +2 -5
- package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planner-phase.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js +70 -0
- package/dist/apps/control-plane/supervisor/planner-phase.js.map +1 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +42 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +753 -55
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +19 -1
- package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js.map +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +21 -0
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +287 -156
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +30 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.js +561 -17
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.d.ts +84 -0
- package/dist/apps/control-plane/supervisor/runtime.js +393 -3
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +54 -0
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +176 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/types.d.ts +142 -1
- package/dist/apps/control-plane/supervisor/types.js.map +1 -1
- package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +68 -2
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js +723 -89
- package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
- package/docs/core/ARCHITECTURE.md +227 -0
- package/docs/core/DECISIONS.md +94 -0
- package/docs/core/DOMAIN-LOGIC.md +60 -0
- package/docs/core/PATTERNS.md +201 -0
- package/docs/core/TROUBLESHOOTING.md +347 -0
- package/docs/core/intentgraph-dependencies.json +39860 -0
- package/docs/core/intentgraph.index.json +46580 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair-design.md +224 -0
- package/docs/plans/2026-03-10-gate-failure-targeted-repair.md +1032 -0
- package/docs/superpowers/plans/2026-03-16-provider-cli-config.md +743 -0
- package/docs/superpowers/plans/2026-03-23-reconcile-divergence-fix.md +777 -0
- package/docs/superpowers/plans/2026-03-28-ordering-agent-implementation.md +1754 -0
- package/docs/superpowers/plans/2026-03-29-drop-zone-and-provider-optimization.md +1108 -0
- package/docs/superpowers/plans/2026-03-29-merge-target-feature-branch.md +685 -0
- package/docs/superpowers/plans/2026-03-29-organizer-sidecar-runtime-loop.md +1289 -0
- package/docs/superpowers/specs/2026-03-23-reconcile-divergence-fix-design.md +118 -0
- package/docs/superpowers/specs/2026-03-28-ordering-agent-spec-audit-design.md +50 -0
- package/docs/superpowers/specs/2026-03-29-drop-zone-and-provider-optimization-design.md +254 -0
- package/docs/superpowers/specs/2026-03-29-merge-target-feature-branch-design.md +152 -0
- package/docs/superpowers/specs/2026-03-29-organizer-sidecar-runtime-loop-design.md +225 -0
- package/package.json +3 -2
- package/packages/web-dashboard/package.json +2 -1
- package/packages/web-dashboard/src/app/analytics/page.tsx +36 -2
- package/packages/web-dashboard/src/app/api/actions/route.ts +274 -63
- package/packages/web-dashboard/src/app/api/actions/status/route.ts +35 -0
- package/packages/web-dashboard/src/app/api/analytics/provider/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/collisions/approve/route.ts +58 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoint-diff/route.ts +36 -0
- package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/abort/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/files/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/resolve/route.ts +51 -0
- package/packages/web-dashboard/src/app/api/features/[id]/conflicts/route.ts +75 -0
- package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +16 -2
- package/packages/web-dashboard/src/app/api/features/[id]/files/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/gate-history/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/genealogy/route.ts +26 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/run/[runId]/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/history/runs/route.ts +34 -0
- package/packages/web-dashboard/src/app/api/features/[id]/intake-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/live-output/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan/amend/route.ts +21 -0
- package/packages/web-dashboard/src/app/api/features/[id]/plan-progress/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-artifacts/[artifact]/route.ts +78 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planner-lifecycle/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/planning-workspace/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/[questionId]/answer/route.ts +27 -0
- package/packages/web-dashboard/src/app/api/features/[id]/questions/route.ts +18 -0
- package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +14 -7
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +57 -2
- package/packages/web-dashboard/src/app/api/features/[id]/spec/route.ts +30 -0
- package/packages/web-dashboard/src/app/api/features/[id]/triage/route.ts +83 -0
- package/packages/web-dashboard/src/app/api/features/[id]/worker-events/route.ts +40 -0
- package/packages/web-dashboard/src/app/api/launch/preview/route.ts +86 -0
- package/packages/web-dashboard/src/app/api/launch/submit/route.ts +180 -0
- package/packages/web-dashboard/src/app/api/mainline/status/route.ts +74 -0
- package/packages/web-dashboard/src/app/api/merge-queue/route.ts +13 -0
- package/packages/web-dashboard/src/app/api/policy/budget/route.ts +14 -0
- package/packages/web-dashboard/src/app/api/projects/route.ts +11 -7
- package/packages/web-dashboard/src/app/api/reconciler/queue/route.ts +47 -0
- package/packages/web-dashboard/src/app/api/run/route.ts +26 -2
- package/packages/web-dashboard/src/app/api/runtime/events/route.ts +227 -0
- package/packages/web-dashboard/src/app/api/runtime/operations/route.ts +269 -0
- package/packages/web-dashboard/src/app/api/runtime/questions/route.ts +11 -0
- package/packages/web-dashboard/src/app/api/runtime/runs/route.ts +80 -0
- package/packages/web-dashboard/src/app/api/status/route.ts +4 -2
- package/packages/web-dashboard/src/app/feature/[id]/page.tsx +32 -42
- package/packages/web-dashboard/src/app/globals.css +34 -3
- package/packages/web-dashboard/src/app/launch/page.tsx +362 -0
- package/packages/web-dashboard/src/app/layout.tsx +23 -1
- package/packages/web-dashboard/src/app/page.tsx +263 -272
- package/packages/web-dashboard/src/components/dashboard/attention-strip.tsx +52 -0
- package/packages/web-dashboard/src/components/dashboard/collision-approval-drawer.tsx +185 -0
- package/packages/web-dashboard/src/components/dashboard/command-center-header.tsx +102 -0
- package/packages/web-dashboard/src/components/dashboard/mainline-status-banner.tsx +84 -0
- package/packages/web-dashboard/src/components/dashboard/merged-archive.tsx +36 -0
- package/packages/web-dashboard/src/components/dashboard/prioritized-queues.tsx +98 -0
- package/packages/web-dashboard/src/components/dashboard/reconciler-queue-card.tsx +115 -0
- package/packages/web-dashboard/src/components/dashboard/secondary-diagnostics-rail.tsx +48 -0
- package/packages/web-dashboard/src/components/dashboard/task-filter-bar.tsx +74 -0
- package/packages/web-dashboard/src/components/dashboard/triage-drawer.tsx +455 -0
- package/packages/web-dashboard/src/components/diff-viewer.tsx +19 -3
- package/packages/web-dashboard/src/components/evidence-viewer.tsx +65 -51
- package/packages/web-dashboard/src/components/feature-card.tsx +90 -7
- package/packages/web-dashboard/src/components/feature-cost-panel.tsx +112 -11
- package/packages/web-dashboard/src/components/feature-list-view.tsx +25 -4
- package/packages/web-dashboard/src/components/features/runtime-inspector/EventsTimelineView.tsx +260 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/OperationsListView.tsx +172 -0
- package/packages/web-dashboard/src/components/features/runtime-inspector/RuntimeInspectorPanel.tsx +896 -0
- package/packages/web-dashboard/src/components/filter-bar.tsx +7 -39
- package/packages/web-dashboard/src/components/focus/ActionableRiskList.tsx +46 -0
- package/packages/web-dashboard/src/components/focus/AgentRolePerformanceCard.tsx +200 -0
- package/packages/web-dashboard/src/components/focus/BlockedGuidanceBanner.tsx +149 -0
- package/packages/web-dashboard/src/components/focus/CheckpointInspector.tsx +123 -0
- package/packages/web-dashboard/src/components/focus/CheckpointRail.tsx +118 -0
- package/packages/web-dashboard/src/components/focus/CheckpointScrubber.tsx +249 -0
- package/packages/web-dashboard/src/components/focus/CollisionApprovalBanner.tsx +192 -0
- package/packages/web-dashboard/src/components/focus/CollisionRadar.tsx +136 -0
- package/packages/web-dashboard/src/components/focus/ConflictStatusCard.tsx +52 -0
- package/packages/web-dashboard/src/components/focus/ContextSidebar.tsx +108 -0
- package/packages/web-dashboard/src/components/focus/DiagnosisPanel.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureDecisionBanner.tsx +68 -0
- package/packages/web-dashboard/src/components/focus/FeatureQuestionAnswerPanel.tsx +167 -0
- package/packages/web-dashboard/src/components/focus/FocusHeader.tsx +54 -0
- package/packages/web-dashboard/src/components/focus/FocusLayout.tsx +283 -0
- package/packages/web-dashboard/src/components/focus/GateFlakinessSummary.tsx +144 -0
- package/packages/web-dashboard/src/components/focus/GenealogyTree.tsx +34 -0
- package/packages/web-dashboard/src/components/focus/HeroBlock.tsx +67 -0
- package/packages/web-dashboard/src/components/focus/LiveAgentConsole.tsx +277 -0
- package/packages/web-dashboard/src/components/focus/MergeQueueCard.tsx +78 -0
- package/packages/web-dashboard/src/components/focus/OperationalSummaryCard.tsx +227 -0
- package/packages/web-dashboard/src/components/focus/PinnedActions.tsx +96 -0
- package/packages/web-dashboard/src/components/focus/PlanAmendmentPanel.tsx +250 -0
- package/packages/web-dashboard/src/components/focus/PlanProgressPanel.tsx +133 -0
- package/packages/web-dashboard/src/components/focus/PlannerArtifactViewer.tsx +158 -0
- package/packages/web-dashboard/src/components/focus/PlannerLifecycleHeader.tsx +141 -0
- package/packages/web-dashboard/src/components/focus/ProgressSnapshotCard.tsx +113 -0
- package/packages/web-dashboard/src/components/focus/RecentMaterialChanges.tsx +69 -0
- package/packages/web-dashboard/src/components/focus/RoleLogViewer.tsx +436 -0
- package/packages/web-dashboard/src/components/focus/RunHistoryBrowser.tsx +62 -0
- package/packages/web-dashboard/src/components/focus/SpecViewer.tsx +172 -0
- package/packages/web-dashboard/src/components/focus/TabBar.tsx +33 -0
- package/packages/web-dashboard/src/components/focus/UsageBurnChart.tsx +212 -0
- package/packages/web-dashboard/src/components/focus/VerificationSummaryCard.tsx +122 -0
- package/packages/web-dashboard/src/components/focus/tabs/ChangesTab.tsx +325 -0
- package/packages/web-dashboard/src/components/focus/tabs/ConflictsTab.tsx +395 -0
- package/packages/web-dashboard/src/components/focus/tabs/GatesQaTab.tsx +38 -0
- package/packages/web-dashboard/src/components/focus/tabs/HistoryTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/IntakeTab.tsx +429 -0
- package/packages/web-dashboard/src/components/focus/tabs/OverviewTab.tsx +217 -0
- package/packages/web-dashboard/src/components/focus/tabs/PlanningTab.tsx +390 -0
- package/packages/web-dashboard/src/components/focus/tabs/ReviewTab.tsx +497 -0
- package/packages/web-dashboard/src/components/focus/tabs/RuntimeTab.tsx +213 -0
- package/packages/web-dashboard/src/components/focus/tabs/TranscriptTab.tsx +315 -0
- package/packages/web-dashboard/src/components/gate-results.tsx +2 -2
- package/packages/web-dashboard/src/components/human-input-panel.tsx +33 -57
- package/packages/web-dashboard/src/components/kanban-board.tsx +4 -0
- package/packages/web-dashboard/src/components/launch/launch-draft-card.tsx +154 -0
- package/packages/web-dashboard/src/components/plan-viewer.tsx +147 -69
- package/packages/web-dashboard/src/components/quick-launch-panel.tsx +20 -47
- package/packages/web-dashboard/src/components/summary-bar.tsx +30 -76
- package/packages/web-dashboard/src/lib/aop-client.ts +2484 -36
- package/packages/web-dashboard/src/lib/blocked-state-guidance.ts +475 -0
- package/packages/web-dashboard/src/lib/collision-radar.ts +136 -0
- package/packages/web-dashboard/src/lib/dashboard-action-states.ts +204 -0
- package/packages/web-dashboard/src/lib/dashboard-runtime-client.ts +439 -0
- package/packages/web-dashboard/src/lib/dashboard-utils.ts +179 -18
- package/packages/web-dashboard/src/lib/drop-zone-utils.ts +92 -0
- package/packages/web-dashboard/src/lib/focus-detail-derivations.ts +958 -0
- package/packages/web-dashboard/src/lib/focus-view.ts +300 -0
- package/packages/web-dashboard/src/lib/health-diagnosis.ts +356 -0
- package/packages/web-dashboard/src/lib/launch-contracts.ts +77 -0
- package/packages/web-dashboard/src/lib/launch-markdown.ts +103 -0
- package/packages/web-dashboard/src/lib/launch-page-preview.ts +89 -0
- package/packages/web-dashboard/src/lib/live-feed.ts +1 -1
- package/packages/web-dashboard/src/lib/multi-project-config.ts +33 -0
- package/packages/web-dashboard/src/lib/orchestrator-tools.ts +881 -60
- package/packages/web-dashboard/src/lib/planner-workspace.ts +1285 -0
- package/packages/web-dashboard/src/lib/review-contracts.ts +5 -3
- package/packages/web-dashboard/src/lib/runtime-files.ts +285 -0
- package/packages/web-dashboard/src/lib/tool-catalog.ts +51 -0
- package/packages/web-dashboard/src/lib/types.ts +731 -3
- package/packages/web-dashboard/src/lib/usage-burn.ts +175 -0
- package/packages/web-dashboard/src/lib/worktree-diff.ts +128 -0
- package/packages/web-dashboard/src/styles/dashboard.module.css +1742 -459
- package/packages/web-dashboard/test/api/actions/route.spec.ts +675 -0
- package/packages/web-dashboard/test/api/features/diff.route.spec.ts +57 -0
- package/packages/web-dashboard/test/api/features/feature.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/live-output.route.spec.ts +123 -0
- package/packages/web-dashboard/test/api/features/plan-amend.route.spec.ts +95 -0
- package/packages/web-dashboard/test/api/features/planner-workspaces.route.spec.ts +162 -0
- package/packages/web-dashboard/test/api/features/question-answer.route.spec.ts +99 -0
- package/packages/web-dashboard/test/api/features/triage.route.spec.ts +195 -0
- package/packages/web-dashboard/test/api/launch/preview.route.spec.ts +149 -0
- package/packages/web-dashboard/test/api/launch/submit.route.spec.ts +382 -0
- package/packages/web-dashboard/test/api/runtime/events/route.spec.ts +164 -0
- package/packages/web-dashboard/test/api/runtime/operations/route.spec.ts +156 -0
- package/packages/web-dashboard/test/api/runtime/runs/route.spec.ts +112 -0
- package/packages/web-dashboard/test/components/changes-tab.spec.tsx +76 -0
- package/packages/web-dashboard/test/components/command-center-root.spec.tsx +87 -0
- package/packages/web-dashboard/test/components/diagnosis-panel.spec.tsx +59 -0
- package/packages/web-dashboard/test/components/feature-card.spec.tsx +45 -0
- package/packages/web-dashboard/test/components/focus-layout.spec.tsx +299 -0
- package/packages/web-dashboard/test/components/gate-results.spec.tsx +39 -0
- package/packages/web-dashboard/test/components/gates-qa-tab.spec.tsx +118 -0
- package/packages/web-dashboard/test/components/human-input-panel.spec.tsx +54 -0
- package/packages/web-dashboard/test/components/intake-tab.spec.tsx +210 -0
- package/packages/web-dashboard/test/components/kanban-board.spec.tsx +35 -0
- package/packages/web-dashboard/test/components/launch-draft-card.spec.tsx +114 -0
- package/packages/web-dashboard/test/components/launch-page.spec.tsx +79 -0
- package/packages/web-dashboard/test/components/overview-tab.spec.tsx +236 -0
- package/packages/web-dashboard/test/components/planning-tab.spec.tsx +202 -0
- package/packages/web-dashboard/test/components/review-tab.spec.tsx +169 -0
- package/packages/web-dashboard/test/components/role-log-viewer.spec.ts +42 -0
- package/packages/web-dashboard/test/components/runtime-inspector.spec.tsx +22 -0
- package/packages/web-dashboard/test/components/runtime-tab.spec.tsx +133 -0
- package/packages/web-dashboard/test/components/transcript-tab.spec.tsx +46 -0
- package/packages/web-dashboard/test/components/triage-drawer.spec.tsx +159 -0
- package/packages/web-dashboard/test/lib/aop-client.spec.ts +235 -0
- package/packages/web-dashboard/test/lib/dashboard-runtime-client.spec.ts +144 -0
- package/packages/web-dashboard/test/lib/focus-detail-derivations.spec.ts +314 -0
- package/packages/web-dashboard/test/lib/focus-view.spec.ts +248 -0
- package/packages/web-dashboard/test/lib/health-diagnosis.spec.ts +277 -0
- package/packages/web-dashboard/test/lib/launch-markdown.spec.ts +36 -0
- package/packages/web-dashboard/test/lib/multi-project-config.spec.ts +54 -0
- package/packages/web-dashboard/test/lib/orchestrator-tools.spec.ts +352 -0
- package/packages/web-dashboard/test/lib/planner-workspace.spec.ts +289 -0
- package/packages/web-dashboard/test/lib/worktree-diff.spec.ts +119 -0
- package/packages/web-dashboard/vitest.config.ts +2 -0
- package/spec-files/completed/agentic_orchestrator_add_feature_to_active_execution_spec.md +557 -0
- package/spec-files/completed/agentic_orchestrator_dashboard_command_center_redesign_spec.md +1147 -0
- package/spec-files/completed/agentic_orchestrator_execution_mode_spec.md +18 -16
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_a_spec.md +672 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_b_spec.md +794 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_c_decision_centric_remediation_spec.md +1037 -0
- package/spec-files/completed/agentic_orchestrator_feature_focus_view_ux_redesign_spec.md +1432 -0
- package/spec-files/completed/agentic_orchestrator_focus_plan_tab_intake_planning_workspace_spec.md +921 -0
- package/spec-files/completed/agentic_orchestrator_intentional_collision_override_spec.md +584 -0
- package/spec-files/completed/agentic_orchestrator_interactive_planning_intake_and_requirements_verification_spec.md +1185 -0
- package/spec-files/completed/agentic_orchestrator_reactive_execution_enrollment_spec.md +864 -0
- package/spec-files/{outstanding → completed}/agentic_orchestrator_runtime_inspection_spec.md +92 -19
- package/spec-files/completed/agentic_orchestrator_scope_aware_run_lease_spec.md +408 -0
- package/spec-files/completed/git-reconciliation-engine.md +827 -0
- package/spec-files/outstanding/agentic_orchestrator_dashboard_quick_launch_and_control_surface_spec.md +331 -0
- package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +16 -6
- package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +60 -9
- package/spec-files/outstanding/agentic_orchestrator_focus_plan_tab_execution_contract_workspace_spec.md +616 -0
- package/spec-files/outstanding/agentic_orchestrator_headless_standby_dashboard_runtime_spec.md +310 -0
- package/spec-files/outstanding/agentic_orchestrator_human_input_interaction_protocol_spec.md +175 -72
- package/spec-files/outstanding/agentic_orchestrator_interactive_rename_cleanup_spec.md +197 -0
- package/spec-files/outstanding/agentic_orchestrator_interactive_resume_and_reconciliation_disposition_spec.md +412 -0
- package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +166 -137
- package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +3 -3
- package/spec-files/outstanding/agentic_orchestrator_phase_specific_agent_profiles_and_token_telemetry_spec.md +303 -0
- package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +18 -5
- package/spec-files/outstanding/agentic_orchestrator_policy_stratification_spec.md +225 -0
- package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +77 -50
- package/spec-files/outstanding/agentic_orchestrator_ready_to_merge_branch_handoff_spec.md +724 -0
- package/spec-files/outstanding/agentic_orchestrator_remove_deterministic_mode_spec.md +263 -0
- package/spec-files/outstanding/agentic_orchestrator_request_more_context_and_dashboard_human_input_spec.md +456 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_coverage_and_reconciliation_enforcement_spec.md +1411 -0
- package/spec-files/outstanding/agentic_orchestrator_spec_ordering_agent_spec.md +370 -0
- package/spec-files/outstanding/shadow_workspace_implementation_spec.md +1 -1
- package/spec-files/progress.md +2026 -120
- package/specs/001-runtime-inspection/checklists/requirements.md +35 -0
- package/specs/001-runtime-inspection/design.md +338 -0
- package/specs/001-runtime-inspection/spec.md +95 -0
- package/specs/002-scope-aware-lease/checklists/requirements.md +35 -0
- package/specs/002-scope-aware-lease/contracts/lease-registry.schema.json +101 -0
- package/specs/002-scope-aware-lease/data-model.md +236 -0
- package/specs/002-scope-aware-lease/plan.md +766 -0
- package/specs/002-scope-aware-lease/quickstart.md +150 -0
- package/specs/002-scope-aware-lease/research.md +135 -0
- package/specs/002-scope-aware-lease/spec.md +128 -0
- package/specs/002-scope-aware-lease/tasks.md +767 -0
- package/tsconfig.json +1 -1
- package/vitest.config.ts +28 -0
- package/ARCHITECTURE_ADHERENCE_ANALYSIS.md +0 -871
- package/packages/web-dashboard/next-env.d.ts +0 -6
- package/packages/web-dashboard/src/components/detail-panel.tsx +0 -1124
- package/packages/web-dashboard/src/components/review-workspace.tsx +0 -1162
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_artifact_database_publishing_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_cli_shell_tab_completion_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_diff_and_agent_console_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_performance_improvements_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_persistent_worker_runtime_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_provider_auth_bootstrap_spec.md +0 -0
- /package/spec-files/{outstanding → completed}/agentic_orchestrator_real_worker_provider_execution_spec.md +0 -0
|
@@ -0,0 +1,767 @@
|
|
|
1
|
+
# Tasks: Scope-Aware Run Lease
|
|
2
|
+
|
|
3
|
+
**Feature**: `002-scope-aware-lease`
|
|
4
|
+
**Input**: `specs/002-scope-aware-lease/` — `spec.md`, `plan.md`, `research.md`, `data-model.md`, `contracts/lease-registry.schema.json`
|
|
5
|
+
**Branch**: `002-scope-aware-lease`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Format: `[ID] [P?] [Story?] Description — file path`
|
|
10
|
+
|
|
11
|
+
- **[P]**: Parallelizable with the immediately preceding task (different files, no data dependency between them)
|
|
12
|
+
- **[US?]**: User story this task primarily delivers (`US1`–`US4`)
|
|
13
|
+
- Ordering: **dependency-first** — foundation → services → integration → tests → docs
|
|
14
|
+
|
|
15
|
+
## User Stories (from spec.md)
|
|
16
|
+
|
|
17
|
+
| ID | Title | Priority |
|
|
18
|
+
| --- | ---------------------------------------------- | -------- |
|
|
19
|
+
| US1 | Parallel execution of non-overlapping runs | P1 |
|
|
20
|
+
| US2 | Blocking of overlapping runs | P1 |
|
|
21
|
+
| US3 | Conservative fallback for unknown scope | P2 |
|
|
22
|
+
| US4 | Scope declaration & persistence at acquisition | P2 |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Phase 1: Setup — Core Types & Infrastructure
|
|
27
|
+
|
|
28
|
+
**Purpose**: Add the three pure foundational additions (types, error code, path constant) that every other task in this feature depends on. None touch business logic; all can be verified with `npm run typecheck`.
|
|
29
|
+
|
|
30
|
+
**⚠️ All Phase 2–6 work is blocked until T001 is complete.**
|
|
31
|
+
|
|
32
|
+
- [ ] T001 Add `LeaseScope`, `LeaseScopeDeclaration`, `ActiveLeaseRecord`, and `LeaseRegistry` types to `apps/control-plane/src/core/runtime-sessions.ts`
|
|
33
|
+
|
|
34
|
+
> **Exact additions** (insert after the last existing `export interface` in the file):
|
|
35
|
+
>
|
|
36
|
+
> ```typescript
|
|
37
|
+
> export interface LeaseScope {
|
|
38
|
+
> paths: string[];
|
|
39
|
+
> plan_section_ids: string[];
|
|
40
|
+
> }
|
|
41
|
+
> export type LeaseScopeDeclaration = LeaseScope | null;
|
|
42
|
+
> export interface ActiveLeaseRecord {
|
|
43
|
+
> run_id: string;
|
|
44
|
+
> owner_instance_id: string;
|
|
45
|
+
> instance_id: string;
|
|
46
|
+
> scope: LeaseScopeDeclaration;
|
|
47
|
+
> lease_expires_at: string;
|
|
48
|
+
> acquired_at: string;
|
|
49
|
+
> }
|
|
50
|
+
> export interface LeaseRegistry {
|
|
51
|
+
> leases: ActiveLeaseRecord[];
|
|
52
|
+
> updated_at: string;
|
|
53
|
+
> }
|
|
54
|
+
> ```
|
|
55
|
+
>
|
|
56
|
+
> **Invariants** (from data-model.md): `paths` are relative repo-root paths; `plan_section_ids` are opaque strings (no hierarchy). Both arrays may be empty. `null` means unknown/undeclared scope.
|
|
57
|
+
|
|
58
|
+
- [ ] T002 [P] Add `LEASE_SCOPE_CONFLICT: 'lease_scope_conflict'` to `apps/control-plane/src/core/error-codes.ts`
|
|
59
|
+
|
|
60
|
+
> Locate the `ERROR_CODES` const object. Insert immediately after `RUN_LEASE_NOT_OWNED`:
|
|
61
|
+
>
|
|
62
|
+
> ```typescript
|
|
63
|
+
> LEASE_SCOPE_CONFLICT: 'lease_scope_conflict',
|
|
64
|
+
> ```
|
|
65
|
+
>
|
|
66
|
+
> No other changes. Verify with `npm run typecheck`.
|
|
67
|
+
|
|
68
|
+
- [ ] T003 [P] Add `leaseRegistryPath` getter to `apps/control-plane/src/core/path-layout.ts`
|
|
69
|
+
|
|
70
|
+
> Add after the existing `runLeasePath(instanceId)` method:
|
|
71
|
+
>
|
|
72
|
+
> ```typescript
|
|
73
|
+
> get leaseRegistryPath(): string {
|
|
74
|
+
> return path.join(this.runtimeDataRoot, 'lease-registry.json');
|
|
75
|
+
> }
|
|
76
|
+
> ```
|
|
77
|
+
>
|
|
78
|
+
> No new lock path needed — the registry uses the existing index lock (`.aop/features/.index.lock`).
|
|
79
|
+
|
|
80
|
+
**Checkpoint**: `npm run typecheck` passes clean. All new types compile; error code resolves; getter exists.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase 2: Foundational — Pure Scope Conflict Detection Service
|
|
85
|
+
|
|
86
|
+
**Purpose**: Implement the core conflict-detection logic as a **pure, side-effect-free class** (no file I/O, no async). This is a standalone service extracted from `RunLeaseService` for testability and SRP compliance (per plan §1.3 and research R-001/R-002/R-003). All user stories depend on this logic.
|
|
87
|
+
|
|
88
|
+
- [ ] T004 Create `apps/control-plane/src/application/services/lease-scope-conflict-detector.ts` — pure `LeaseScopeConflictDetector` class with `normalizePath`, `pathsOverlap`, `planSectionsOverlap`, and `detectConflict`
|
|
89
|
+
|
|
90
|
+
> **File skeleton** (all imports use `import type`):
|
|
91
|
+
>
|
|
92
|
+
> ```typescript
|
|
93
|
+
> import type { LeaseScopeDeclaration, ActiveLeaseRecord } from '../../core/runtime-sessions.js';
|
|
94
|
+
>
|
|
95
|
+
> export interface ScopeConflictResult {
|
|
96
|
+
> conflict: boolean;
|
|
97
|
+
> blocking_run_id?: string;
|
|
98
|
+
> blocking_owner_instance_id?: string;
|
|
99
|
+
> conflicting_scope_entry?: string;
|
|
100
|
+
> }
|
|
101
|
+
>
|
|
102
|
+
> export class LeaseScopeConflictDetector {
|
|
103
|
+
> normalizePath(p: string): string { ... }
|
|
104
|
+
> pathsOverlap(a: string[], b: string[]): boolean { ... }
|
|
105
|
+
> planSectionsOverlap(a: string[], b: string[]): boolean { ... }
|
|
106
|
+
> detectConflict(
|
|
107
|
+
> incoming: LeaseScopeDeclaration,
|
|
108
|
+
> activeLeases: ActiveLeaseRecord[],
|
|
109
|
+
> excludeRunId?: string,
|
|
110
|
+
> ): ScopeConflictResult { ... }
|
|
111
|
+
> }
|
|
112
|
+
> ```
|
|
113
|
+
>
|
|
114
|
+
> **`normalizePath(p)`** (R-001): Strip all trailing `/`, then append exactly one `/`. If the result after stripping is `''`, return `'/'` (root — overlaps everything).
|
|
115
|
+
> **`pathsOverlap(a, b)`**: Normalize every entry in both arrays. Return `true` if any `na` in `a` is a prefix of any `nb` in `b`, or any `nb` is a prefix of `na` (symmetric). Empty arrays produce no overlap.
|
|
116
|
+
> **`planSectionsOverlap(a, b)`** (R-002): Return `true` iff the set intersection of `a` and `b` is non-empty (exact case-sensitive string equality; no hierarchy).
|
|
117
|
+
> **`detectConflict` conflict matrix** (from data-model.md § State Transitions):
|
|
118
|
+
>
|
|
119
|
+
> | `incoming` | active `scope` | Result |
|
|
120
|
+
> | ----------------------------------- | ----------------------------------- | ----------------------------------------------- |
|
|
121
|
+
> | `null` | anything (any lease exists) | `{ conflict: true }` |
|
|
122
|
+
> | any value | `null` | `{ conflict: true }` |
|
|
123
|
+
> | `{ paths:[], plan_section_ids:[] }` | any | `{ conflict: false }` |
|
|
124
|
+
> | non-empty | `{ paths:[], plan_section_ids:[] }` | `{ conflict: false }` |
|
|
125
|
+
> | non-empty | non-empty | check `pathsOverlap` then `planSectionsOverlap` |
|
|
126
|
+
>
|
|
127
|
+
> `excludeRunId`: skip any `activeLease` where `activeLease.run_id === excludeRunId` (prevents same-run re-acquisition false positives).
|
|
128
|
+
> Return the **first** conflicting lease's `blocking_run_id`, `blocking_owner_instance_id`, and `conflicting_scope_entry` (the specific path or plan_section_id that triggered the conflict).
|
|
129
|
+
> No `any` types. No `console.*`. No imports other than the type import above.
|
|
130
|
+
|
|
131
|
+
**Checkpoint**: File compiles. Class can be instantiated with `new LeaseScopeConflictDetector()` and all four methods are callable.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Phase 3: US4 — Scope Declaration & Persistence (P2)
|
|
136
|
+
|
|
137
|
+
**Goal**: Capture and persist the declared scope so it survives heartbeat renewals and instance restarts. This is the data-capture prerequisite for US1–US3.
|
|
138
|
+
|
|
139
|
+
**Independent Test**: Acquire a lease with a specific `scope`, read back the lease record and registry entry, verify the scope is preserved exactly.
|
|
140
|
+
|
|
141
|
+
- [ ] T005 [US4] Add `scope?: LeaseScopeDeclaration` to `RuntimeSessionsSnapshot` in `apps/control-plane/src/core/runtime-sessions.ts`
|
|
142
|
+
|
|
143
|
+
> Locate the `RuntimeSessionsSnapshot` interface. Add at the end (before the closing `}`):
|
|
144
|
+
>
|
|
145
|
+
> ```typescript
|
|
146
|
+
> scope?: LeaseScopeDeclaration; // NEW: declared scope; undefined normalizes to null on read
|
|
147
|
+
> ```
|
|
148
|
+
>
|
|
149
|
+
> **Backward compatibility**: Field is optional. Existing persisted `.aop/runtime/<instanceId>/run-lease.json` files without this field deserialize with `scope: undefined` — treated as `null` (conservative) at the service boundary.
|
|
150
|
+
|
|
151
|
+
- [ ] T006 [P] [US4] Add `scope?: LeaseScopeDeclaration` to `AcquireRunLeaseInput` and add `ExpandRunLeaseScopeInput` interface in `apps/control-plane/src/application/services/run-lease-service.ts`
|
|
152
|
+
|
|
153
|
+
> **Two additions to `run-lease-service.ts`**:
|
|
154
|
+
>
|
|
155
|
+
> 1. In `AcquireRunLeaseInput`, append:
|
|
156
|
+
> ```typescript
|
|
157
|
+
> scope?: LeaseScopeDeclaration; // undefined normalizes to null (conservative)
|
|
158
|
+
> ```
|
|
159
|
+
> 2. Export a new interface after `AcquireRunLeaseInput`:
|
|
160
|
+
> ```typescript
|
|
161
|
+
> export interface ExpandRunLeaseScopeInput {
|
|
162
|
+
> run_id: string;
|
|
163
|
+
> owner_instance_id: string;
|
|
164
|
+
> additional_paths?: string[];
|
|
165
|
+
> additional_plan_section_ids?: string[];
|
|
166
|
+
> }
|
|
167
|
+
> ```
|
|
168
|
+
>
|
|
169
|
+
> Both interfaces must use `import type { LeaseScopeDeclaration }` from `../../core/runtime-sessions.js`. Do not modify any method implementations in this task.
|
|
170
|
+
|
|
171
|
+
**Checkpoint**: `npm run typecheck` passes. `AcquireRunLeaseInput.scope` and `ExpandRunLeaseScopeInput` are exported and reachable.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Phase 4: US1 & US2 — Registry-Backed Lease Operations (P1)
|
|
176
|
+
|
|
177
|
+
**Goal — US1**: Two runs with non-overlapping scopes both receive leases simultaneously with no artificial serialization.
|
|
178
|
+
**Goal — US2**: Two runs with overlapping scopes are serialized — the second is denied with `LEASE_SCOPE_CONFLICT` until the first releases.
|
|
179
|
+
|
|
180
|
+
**Independent Test**: Launch two runs with `packages/auth/` vs `packages/payments/` → both active simultaneously (US1). Launch two runs with identical scope → second throws `LEASE_SCOPE_CONFLICT` (US2).
|
|
181
|
+
|
|
182
|
+
- [ ] T007 [US1] [US2] Extend `RunLeaseServicePort` interface with registry methods in `apps/control-plane/src/application/services/run-lease-service.ts`
|
|
183
|
+
|
|
184
|
+
> Add three method signatures to `RunLeaseServicePort` (the port/interface the kernel implements):
|
|
185
|
+
>
|
|
186
|
+
> ```typescript
|
|
187
|
+
> readLeaseRegistry(): Promise<LeaseRegistry>;
|
|
188
|
+
> writeLeaseRegistry(registry: LeaseRegistry): Promise<void>;
|
|
189
|
+
> emptyLeaseRegistry(at?: string): LeaseRegistry;
|
|
190
|
+
> ```
|
|
191
|
+
>
|
|
192
|
+
> Add `import type { ..., LeaseRegistry }` to the existing import from `../../core/runtime-sessions.js`. These are abstract operations — no implementation here; the concrete implementation goes in T011 (kernel).
|
|
193
|
+
|
|
194
|
+
- [ ] T008 [US1] [US2] Modify `acquireRunLease` in `apps/control-plane/src/application/services/run-lease-service.ts` to integrate scope conflict detection
|
|
195
|
+
|
|
196
|
+
> **Extend the existing `withIndexLock` callback** inside `acquireRunLease`. After the existing stale-takeover check and before writing the per-instance lease file, insert:
|
|
197
|
+
>
|
|
198
|
+
> ```
|
|
199
|
+
> Step 4: const rawRegistry = await this.port.readLeaseRegistry();
|
|
200
|
+
> Step 5: const now = new Date();
|
|
201
|
+
> const prunedLeases = rawRegistry.leases.filter(
|
|
202
|
+
> (l) => new Date(l.lease_expires_at) > now,
|
|
203
|
+
> );
|
|
204
|
+
> Step 6: const result = this.conflictDetector.detectConflict(
|
|
205
|
+
> input.scope ?? null, // normalize undefined → null
|
|
206
|
+
> prunedLeases,
|
|
207
|
+
> input.run_id, // exclude same-run re-acquisition
|
|
208
|
+
> );
|
|
209
|
+
> Step 7: if (result.conflict) {
|
|
210
|
+
> console.warn(
|
|
211
|
+
> `[run-lease] scope conflict: run ${input.run_id} blocked by ` +
|
|
212
|
+
> `${result.blocking_run_id} on ${result.conflicting_scope_entry}`,
|
|
213
|
+
> );
|
|
214
|
+
> return fail(
|
|
215
|
+
> ERROR_CODES.LEASE_SCOPE_CONFLICT,
|
|
216
|
+
> `Lease acquisition deferred: scope overlaps with active run ${result.blocking_run_id}`,
|
|
217
|
+
> {
|
|
218
|
+
> incoming_scope: input.scope ?? null,
|
|
219
|
+
> blocking_run_id: result.blocking_run_id,
|
|
220
|
+
> blocking_owner_instance_id: result.blocking_owner_instance_id,
|
|
221
|
+
> conflicting_scope_entry: result.conflicting_scope_entry,
|
|
222
|
+
> retryable: true,
|
|
223
|
+
> requires_human: false,
|
|
224
|
+
> },
|
|
225
|
+
> );
|
|
226
|
+
> }
|
|
227
|
+
> ```
|
|
228
|
+
>
|
|
229
|
+
> Then **after** writing the per-instance lease file (existing step 8):
|
|
230
|
+
>
|
|
231
|
+
> ```
|
|
232
|
+
> Step 9: const newEntry: ActiveLeaseRecord = {
|
|
233
|
+
> run_id: input.run_id,
|
|
234
|
+
> owner_instance_id: input.owner_instance_id,
|
|
235
|
+
> instance_id: this.instanceId, // from kernel/service config
|
|
236
|
+
> scope: input.scope ?? null,
|
|
237
|
+
> lease_expires_at: leaseExpiresAt, // same value written to per-instance file
|
|
238
|
+
> acquired_at: nowIso(),
|
|
239
|
+
> };
|
|
240
|
+
> const updatedLeases = [
|
|
241
|
+
> ...prunedLeases.filter(
|
|
242
|
+
> (l) => !(l.run_id === input.run_id && l.owner_instance_id === input.owner_instance_id),
|
|
243
|
+
> ),
|
|
244
|
+
> newEntry,
|
|
245
|
+
> ];
|
|
246
|
+
> await this.port.writeLeaseRegistry({ leases: updatedLeases, updated_at: nowIso() });
|
|
247
|
+
> ```
|
|
248
|
+
>
|
|
249
|
+
> **Constructor change**: Inject `LeaseScopeConflictDetector` as a constructor parameter (or instantiate inline as `new LeaseScopeConflictDetector()` — it has no dependencies). The conflict detector is a pure class with no I/O; instantiating it inline is acceptable per KISS (R-001).
|
|
250
|
+
>
|
|
251
|
+
> Also persist `scope` to the per-instance file: set `snapshot.scope = input.scope ?? null` before calling `atomicWriteJson`.
|
|
252
|
+
>
|
|
253
|
+
> **Imports needed**: `ActiveLeaseRecord`, `LeaseScopeDeclaration`, `LeaseRegistry` from `../../core/runtime-sessions.js`; `ERROR_CODES` from `../../core/error-codes.js`; `LeaseScopeConflictDetector` from `./lease-scope-conflict-detector.js`.
|
|
254
|
+
> No `any`. `fail()` pattern only — never `new Error(...)`.
|
|
255
|
+
|
|
256
|
+
- [ ] T009 [US2] Modify `releaseRunLease` in `apps/control-plane/src/application/services/run-lease-service.ts` to remove the entry from the registry
|
|
257
|
+
|
|
258
|
+
> **Inside the existing `withIndexLock` callback**, after the existing ownership check and per-instance file clear, append:
|
|
259
|
+
>
|
|
260
|
+
> ```typescript
|
|
261
|
+
> const registry = await this.port.readLeaseRegistry();
|
|
262
|
+
> const pruned = registry.leases.filter(
|
|
263
|
+
> (l) => !(l.run_id === input.run_id && l.owner_instance_id === input.owner_instance_id),
|
|
264
|
+
> );
|
|
265
|
+
> await this.port.writeLeaseRegistry({ leases: pruned, updated_at: nowIso() });
|
|
266
|
+
> ```
|
|
267
|
+
>
|
|
268
|
+
> If the entry is absent (already pruned), the filter is a no-op — no error. Existing `released: false` paths (wrong owner) must NOT touch the registry.
|
|
269
|
+
|
|
270
|
+
- [ ] T010 [P] [US1] Modify `renewRunLease` in `apps/control-plane/src/application/services/run-lease-service.ts` to update `lease_expires_at` in the registry
|
|
271
|
+
|
|
272
|
+
> **Inside the existing `withIndexLock` callback**, after writing the per-instance file, append:
|
|
273
|
+
>
|
|
274
|
+
> ```typescript
|
|
275
|
+
> const registry = await this.port.readLeaseRegistry();
|
|
276
|
+
> const updatedLeases = registry.leases.map((l) =>
|
|
277
|
+
> l.run_id === input.run_id && l.owner_instance_id === input.owner_instance_id
|
|
278
|
+
> ? { ...l, lease_expires_at: newLeaseExpiresAt } // same value written to per-instance file
|
|
279
|
+
> : l,
|
|
280
|
+
> );
|
|
281
|
+
> await this.port.writeLeaseRegistry({ leases: updatedLeases, updated_at: nowIso() });
|
|
282
|
+
> ```
|
|
283
|
+
>
|
|
284
|
+
> If no matching entry exists (race/first-heartbeat), this is a no-op. Existing `RUN_LEASE_NOT_OWNED` early-return path must NOT be changed.
|
|
285
|
+
|
|
286
|
+
- [ ] T011 Implement `readLeaseRegistry`, `writeLeaseRegistry`, and `emptyLeaseRegistry` on `AopKernel` in `apps/control-plane/src/core/kernel.ts`
|
|
287
|
+
|
|
288
|
+
> **Add to the `RunLeaseServicePort` implementation section of `AopKernel`**:
|
|
289
|
+
>
|
|
290
|
+
> ```typescript
|
|
291
|
+
> async readLeaseRegistry(): Promise<LeaseRegistry> {
|
|
292
|
+
> const existing = await readJson<LeaseRegistry>(this.pathLayout.leaseRegistryPath, null);
|
|
293
|
+
> return existing ?? this.emptyLeaseRegistry();
|
|
294
|
+
> }
|
|
295
|
+
>
|
|
296
|
+
> async writeLeaseRegistry(registry: LeaseRegistry): Promise<void> {
|
|
297
|
+
> await ensureDir(path.dirname(this.pathLayout.leaseRegistryPath));
|
|
298
|
+
> await atomicWriteJson(this.pathLayout.leaseRegistryPath, registry);
|
|
299
|
+
> }
|
|
300
|
+
>
|
|
301
|
+
> emptyLeaseRegistry(at?: string): LeaseRegistry {
|
|
302
|
+
> return { leases: [], updated_at: at ?? nowIso() };
|
|
303
|
+
> }
|
|
304
|
+
> ```
|
|
305
|
+
>
|
|
306
|
+
> **Imports**: `import type { LeaseRegistry } from './runtime-sessions.js'`. Use existing `readJson`, `atomicWriteJson`, `ensureDir`, `nowIso`, `path` utilities already imported in `kernel.ts`. No new dependencies.
|
|
307
|
+
> These three methods are called exclusively inside the existing `withIndexLock` callback — they do not need their own locks.
|
|
308
|
+
|
|
309
|
+
**Checkpoint**: `npm run typecheck` passes. US1 and US2 acquisition logic is complete. Two non-overlapping runs can both acquire; overlapping run is denied with `LEASE_SCOPE_CONFLICT`.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Phase 5: US4 — Scope Expansion Mid-Run (FR-007)
|
|
314
|
+
|
|
315
|
+
**Goal**: Allow an active orchestrator to expand its declared scope after discovering additional files during the planning wave. Expansion is additive (union); no paths are ever removed.
|
|
316
|
+
|
|
317
|
+
- [ ] T012 [US4] Implement `expandRunLeaseScope` method on `RunLeaseService` in `apps/control-plane/src/application/services/run-lease-service.ts`
|
|
318
|
+
|
|
319
|
+
> **New async method** on `RunLeaseService` (add after `releaseRunLease`):
|
|
320
|
+
>
|
|
321
|
+
> ```typescript
|
|
322
|
+
> async expandRunLeaseScope(
|
|
323
|
+
> input: ExpandRunLeaseScopeInput,
|
|
324
|
+
> ): Promise<{ data: { scope: LeaseScopeDeclaration } }>
|
|
325
|
+
> ```
|
|
326
|
+
>
|
|
327
|
+
> **Flow inside `withIndexLock`**:
|
|
328
|
+
>
|
|
329
|
+
> 1. Read per-instance lease file; verify `run_id` and `owner_instance_id` match → if not, `return fail(ERROR_CODES.RUN_LEASE_NOT_OWNED, ...)`.
|
|
330
|
+
> 2. Read current `scope` from snapshot (normalize `undefined` → `null`).
|
|
331
|
+
> 3. Build merged scope:
|
|
332
|
+
> ```typescript
|
|
333
|
+
> const currentPaths = currentScope?.paths ?? [];
|
|
334
|
+
> const currentSections = currentScope?.plan_section_ids ?? [];
|
|
335
|
+
> const mergedScope: LeaseScope = {
|
|
336
|
+
> paths: [...new Set([...currentPaths, ...(input.additional_paths ?? [])])].sort(),
|
|
337
|
+
> plan_section_ids: [
|
|
338
|
+
> ...new Set([...currentSections, ...(input.additional_plan_section_ids ?? [])]),
|
|
339
|
+
> ].sort(),
|
|
340
|
+
> };
|
|
341
|
+
> ```
|
|
342
|
+
> If `currentScope` was `null`, treat it as `{ paths: [], plan_section_ids: [] }` before merging (expanding from unknown produces a declared scope).
|
|
343
|
+
> 4. Write updated snapshot with `scope: mergedScope` to per-instance file (`atomicWriteJson`).
|
|
344
|
+
> 5. Read registry; update matching entry's `scope`; write registry.
|
|
345
|
+
> 6. Return `{ data: { scope: mergedScope } }`.
|
|
346
|
+
>
|
|
347
|
+
> No `any`. The `no-floating-promises` rule applies — all `await` calls must be awaited.
|
|
348
|
+
|
|
349
|
+
- [ ] T013 [P] [US4] Add `expandRunLeaseScope` to `RunLeaseServicePort` interface and add the public kernel method in `apps/control-plane/src/core/kernel.ts`
|
|
350
|
+
|
|
351
|
+
> **In `run-lease-service.ts`**: Add to `RunLeaseServicePort`:
|
|
352
|
+
>
|
|
353
|
+
> ```typescript
|
|
354
|
+
> expandRunLeaseScope(input: ExpandRunLeaseScopeInput): Promise<{ data: { scope: LeaseScopeDeclaration } }>;
|
|
355
|
+
> ```
|
|
356
|
+
>
|
|
357
|
+
> **In `kernel.ts`**: Add public method:
|
|
358
|
+
>
|
|
359
|
+
> ```typescript
|
|
360
|
+
> async expandRunLeaseScope(
|
|
361
|
+
> input: ExpandRunLeaseScopeInput,
|
|
362
|
+
> ): Promise<{ data: { scope: LeaseScopeDeclaration } }> {
|
|
363
|
+
> return this.runLeaseService.expandRunLeaseScope(input);
|
|
364
|
+
> }
|
|
365
|
+
> ```
|
|
366
|
+
>
|
|
367
|
+
> Import `ExpandRunLeaseScopeInput` type from `../application/services/run-lease-service.js` in `kernel.ts`.
|
|
368
|
+
|
|
369
|
+
**Checkpoint**: `npm run typecheck` passes. `kernel.expandRunLeaseScope(...)` is callable and type-safe.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Phase 6: Supervisor Propagation — CLI Integration
|
|
374
|
+
|
|
375
|
+
**Purpose**: Wire the scope declaration from feature inputs through the supervisor layer so that every `acquireRunLease` call carries the correct aggregate scope.
|
|
376
|
+
|
|
377
|
+
- [ ] T014 [P] Add `scope?: LeaseScopeDeclaration` to `FeatureInput` in `apps/control-plane/src/supervisor/types.ts`
|
|
378
|
+
|
|
379
|
+
> Locate the `FeatureInput` interface. Append:
|
|
380
|
+
>
|
|
381
|
+
> ```typescript
|
|
382
|
+
> scope?: LeaseScopeDeclaration; // declared scope at launch; undefined treated as null (conservative)
|
|
383
|
+
> ```
|
|
384
|
+
>
|
|
385
|
+
> Add `import type { LeaseScopeDeclaration } from '../core/runtime-sessions.js'` at the top if not already present.
|
|
386
|
+
|
|
387
|
+
- [ ] T015 [US1] [US2] [US3] Add `deriveRunScope` and wire to `acquireRunLease` in `apps/control-plane/src/supervisor/run-coordinator.ts`
|
|
388
|
+
|
|
389
|
+
> **1. New private method** (add before `start()`):
|
|
390
|
+
>
|
|
391
|
+
> ```typescript
|
|
392
|
+
> private deriveRunScope(features: FeatureInput[]): LeaseScopeDeclaration {
|
|
393
|
+
> if (features.some((f) => f.scope === undefined || f.scope === null)) {
|
|
394
|
+
> return null; // conservative: any unknown feature → aggregate is unknown
|
|
395
|
+
> }
|
|
396
|
+
> return {
|
|
397
|
+
> paths: [...new Set(features.flatMap((f) => f.scope!.paths))].sort(),
|
|
398
|
+
> plan_section_ids: [...new Set(features.flatMap((f) => f.scope!.plan_section_ids))].sort(),
|
|
399
|
+
> };
|
|
400
|
+
> }
|
|
401
|
+
> ```
|
|
402
|
+
>
|
|
403
|
+
> **2. In `start()`**, locate the `acquireRunLease(...)` call and add `scope`:
|
|
404
|
+
>
|
|
405
|
+
> ```typescript
|
|
406
|
+
> const runScope = this.deriveRunScope(this.features); // derive before the lock
|
|
407
|
+
> // ... existing call:
|
|
408
|
+
> await this.kernel.acquireRunLease({
|
|
409
|
+
> // ... existing fields unchanged ...
|
|
410
|
+
> scope: runScope, // NEW
|
|
411
|
+
> });
|
|
412
|
+
> ```
|
|
413
|
+
>
|
|
414
|
+
> `LeaseScopeDeclaration` must be imported with `import type` from `../core/runtime-sessions.js`.
|
|
415
|
+
|
|
416
|
+
- [ ] T016 [US4] Add `expandScopesFromPlans` post-planning-wave hook in `apps/control-plane/src/supervisor/run-coordinator.ts`
|
|
417
|
+
|
|
418
|
+
> **New private async method**:
|
|
419
|
+
>
|
|
420
|
+
> ```typescript
|
|
421
|
+
> private async expandScopesFromPlans(activeFeatureIds: string[]): Promise<void> {
|
|
422
|
+
> for (const featureId of activeFeatureIds) {
|
|
423
|
+
> const planResult = await this.kernel.readPlan(featureId);
|
|
424
|
+
> if (!planResult.ok) continue;
|
|
425
|
+
> const affectedFiles: string[] = planResult.data.affected_files ?? [];
|
|
426
|
+
> if (affectedFiles.length === 0) continue;
|
|
427
|
+
> await this.kernel.expandRunLeaseScope({
|
|
428
|
+
> run_id: this.state.runId,
|
|
429
|
+
> owner_instance_id: this.state.ownerInstanceId,
|
|
430
|
+
> additional_paths: affectedFiles,
|
|
431
|
+
> });
|
|
432
|
+
> }
|
|
433
|
+
> }
|
|
434
|
+
> ```
|
|
435
|
+
>
|
|
436
|
+
> **Call site**: Inside the iteration loop, immediately after `await this.planningWaveExecutor.run(activeFeatureIds)` succeeds:
|
|
437
|
+
>
|
|
438
|
+
> ```typescript
|
|
439
|
+
> await this.expandScopesFromPlans(activeFeatureIds);
|
|
440
|
+
> ```
|
|
441
|
+
>
|
|
442
|
+
> This narrows the conservative-null window to "pre-planning only" (R-005). If `expandRunLeaseScope` throws `RUN_LEASE_NOT_OWNED`, swallow and log `console.warn` (non-fatal: the run is shutting down). All other errors propagate normally. `no-floating-promises`: the `await` is required.
|
|
443
|
+
|
|
444
|
+
**Checkpoint**: `npm run typecheck` passes. `npm run lint` clean. Supervisor propagates scope end-to-end.
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## Phase 7: New Test Files
|
|
449
|
+
|
|
450
|
+
**Coverage target**: ≥90% lines / branches / functions / statements on all new and modified files.
|
|
451
|
+
|
|
452
|
+
- [ ] T017 Create `apps/control-plane/test/lease-scope-conflict-detector.spec.ts` — 26 unit tests for pure conflict-detection logic
|
|
453
|
+
|
|
454
|
+
> **Test structure** (Vitest, no async, no mocks needed — pure functions):
|
|
455
|
+
>
|
|
456
|
+
> **Block: `normalizePath`** (4 tests, T-01→T-04)
|
|
457
|
+
> | Test | Input | Expected |
|
|
458
|
+
> |------|-------|----------|
|
|
459
|
+
> | T-01 | `"packages/auth"` | `"packages/auth/"` |
|
|
460
|
+
> | T-02 | `"packages/auth/"` | `"packages/auth/"` (idempotent) |
|
|
461
|
+
> | T-03 | `""` | `"/"` (root) |
|
|
462
|
+
> | T-04 | `"src/config.ts"` | `"src/config.ts/"` |
|
|
463
|
+
>
|
|
464
|
+
> **Block: `pathsOverlap`** (9 tests, T-05→T-13)
|
|
465
|
+
> | Test | a | b | Expected |
|
|
466
|
+
> |------|---|---|----------|
|
|
467
|
+
> | T-05 | `["packages/auth/"]` | `["packages/payments/"]` | `false` |
|
|
468
|
+
> | T-06 | `["packages/auth/"]` | `["packages/auth/"]` | `true` |
|
|
469
|
+
> | T-07 | `["packages/"]` | `["packages/auth/"]` | `true` (parent→child) |
|
|
470
|
+
> | T-08 | `["packages/auth/"]` | `["packages/"]` | `true` (symmetric) |
|
|
471
|
+
> | T-09 | `["src/"]` | `["src/config.ts"]` | `true` (file within dir) |
|
|
472
|
+
> | T-10 | `["src/"]` | `["src-old/config.ts"]` | `false` (no false positive) |
|
|
473
|
+
> | T-11 | `["packages/auth/","packages/shared/"]` | `["packages/shared/","packages/payments/"]` | `true` (partial overlap) |
|
|
474
|
+
> | T-12 | `[]` | `["packages/auth/"]` | `false` (empty set) |
|
|
475
|
+
> | T-13 | `[]` | `[]` | `false` |
|
|
476
|
+
>
|
|
477
|
+
> **Block: `planSectionsOverlap`** (4 tests, T-14→T-17)
|
|
478
|
+
> | Test | a | b | Expected |
|
|
479
|
+
> |------|---|---|----------|
|
|
480
|
+
> | T-14 | `["section-A"]` | `["section-B"]` | `false` |
|
|
481
|
+
> | T-15 | `["section-A"]` | `["section-A"]` | `true` |
|
|
482
|
+
> | T-16 | `["section-A","section-B"]` | `["section-B","section-C"]` | `true` |
|
|
483
|
+
> | T-17 | `[]` | `["section-A"]` | `false` |
|
|
484
|
+
>
|
|
485
|
+
> **Block: `detectConflict` — full conflict matrix** (9 tests, T-18→T-26)
|
|
486
|
+
> | Test | incoming | active lease(s) | Expected |
|
|
487
|
+
> |------|----------|-----------------|----------|
|
|
488
|
+
> | T-18 | `null` | `[{ scope: { paths:["packages/auth/"], plan_section_ids:[] }, run_id:"run-A", ... }]` | `{ conflict: true }` |
|
|
489
|
+
> | T-19 | `null` | `[]` (empty) | `{ conflict: false }` |
|
|
490
|
+
> | T-20 | `{ paths:["packages/auth/"], plan_section_ids:[] }` | `[{ scope: null, run_id:"run-A", ... }]` | `{ conflict: true }` |
|
|
491
|
+
> | T-21 | `{ paths:[], plan_section_ids:[] }` | `[{ scope: { paths:["packages/auth/"], ... }, run_id:"run-A", ... }]` | `{ conflict: false }` |
|
|
492
|
+
> | T-22 | `{ paths:["packages/auth/"], plan_section_ids:[] }` | `[{ scope: { paths:["packages/payments/"], ... }, run_id:"run-A", ... }]` | `{ conflict: false }` |
|
|
493
|
+
> | T-23 | `{ paths:["packages/auth/"], plan_section_ids:[] }` | `[{ scope: { paths:["packages/auth/"], ... }, run_id:"run-A", ... }]` | `{ conflict: true, blocking_run_id:"run-A" }` |
|
|
494
|
+
> | T-24 | `{ paths:["packages/auth/utils/"], plan_section_ids:[] }` | `[{ scope: { paths:["packages/"], ... }, run_id:"run-A", ... }]` | `{ conflict: true }` |
|
|
495
|
+
> | T-25 | `{ paths:[], plan_section_ids:["plan-section-1"] }` | `[{ scope: { paths:[], plan_section_ids:["plan-section-1"] }, run_id:"run-A", ... }]` | `{ conflict: true }` |
|
|
496
|
+
> | T-26 | `{ paths:["packages/auth/"], plan_section_ids:[] }` | `[{ scope: { paths:["packages/auth/"], ... }, run_id:"run-A", ... }]` with `excludeRunId:"run-A"` | `{ conflict: false }` |
|
|
497
|
+
>
|
|
498
|
+
> Use `describe`/`it` blocks. No `any`. Each test: construct `new LeaseScopeConflictDetector()`, call method, assert result.
|
|
499
|
+
|
|
500
|
+
- [ ] T018 Create `apps/control-plane/test/run-lease-service.spec.ts` — 20 integration tests using mocked `RunLeaseServicePort`
|
|
501
|
+
|
|
502
|
+
> **Mock setup**: Create a `vi.fn()`-based mock for `RunLeaseServicePort`. `readLeaseRegistry` defaults to resolving with `{ leases: [], updated_at: nowIso() }`. `writeLeaseRegistry` defaults to resolving `void`. `emptyLeaseRegistry` delegates to the real detector. Use `beforeEach` to reset mocks.
|
|
503
|
+
>
|
|
504
|
+
> **Block: Scope persistence (Story 4)** — T-30→T-33
|
|
505
|
+
>
|
|
506
|
+
> - T-30: `acquireRunLease({ scope: { paths: ["packages/auth/"], plan_section_ids: [] }, ... })` → `writeLeaseRegistry` called with entry whose `scope.paths` equals `["packages/auth/"]`
|
|
507
|
+
> - T-31: `acquireRunLease({ scope: null, ... })` → entry written with `scope: null`
|
|
508
|
+
> - T-32: `acquireRunLease({ ...no scope field... })` → entry written with `scope: null` (normalization)
|
|
509
|
+
> - T-33: `acquireRunLease(...)` → `writeLeaseRegistry` called once with `leases` array of length 1 containing correct `run_id`
|
|
510
|
+
>
|
|
511
|
+
> **Block: Parallel non-overlapping runs (Story 1)** — T-34→T-35
|
|
512
|
+
>
|
|
513
|
+
> - T-34: Registry pre-seeded with Run A (`packages/auth/`); `acquireRunLease` for Run B (`packages/payments/`) → resolves; `writeLeaseRegistry` called with 2-entry array
|
|
514
|
+
> - T-35: T-34 setup; release Run A → `writeLeaseRegistry` called with 1-entry array (Run B remains); release Run B → empty array
|
|
515
|
+
>
|
|
516
|
+
> **Block: Overlapping runs blocked (Story 2)** — T-36→T-38
|
|
517
|
+
>
|
|
518
|
+
> - T-36: Registry has Run A (`packages/auth/`); `acquireRunLease` for Run B (`packages/auth/`) → throws/rejects with error code `lease_scope_conflict`; `details.blocking_run_id` = Run A's ID
|
|
519
|
+
> - T-37: Registry has Run A (`packages/`); Run B (`packages/auth/`) → same as T-36 (parent/child overlap)
|
|
520
|
+
> - T-38: Registry has Run A (`scope: null`); Run B (any scope) → throws `lease_scope_conflict`
|
|
521
|
+
>
|
|
522
|
+
> **Block: Conservative fallback (Story 3)** — T-39→T-40
|
|
523
|
+
>
|
|
524
|
+
> - T-39: Any active lease in registry; `acquireRunLease({ scope: null })` → throws `lease_scope_conflict`
|
|
525
|
+
> - T-40: Empty registry; `acquireRunLease({ scope: null })` → resolves (no conflict, lone run)
|
|
526
|
+
>
|
|
527
|
+
> **Block: Stale takeover + scope replacement (FR-008)** — T-41→T-42
|
|
528
|
+
>
|
|
529
|
+
> - T-41: Registry has expired entry for Run A (scope `packages/auth/`, `lease_expires_at` in the past); new `acquireRunLease` for `packages/auth/` with `takeover_stale_run: true` → resolves; `writeLeaseRegistry` called without the expired entry; new entry has new `run_id`
|
|
530
|
+
> - T-42: Registry has unexpired conflicting entry; `acquireRunLease` with `takeover_stale_run: false` → throws `lease_scope_conflict`
|
|
531
|
+
>
|
|
532
|
+
> **Block: `expandRunLeaseScope` (FR-007)** — T-43→T-45
|
|
533
|
+
>
|
|
534
|
+
> - T-43: Run A holds `packages/auth/`; `expandRunLeaseScope({ additional_paths: ["packages/shared/"] })` → `writeLeaseRegistry` called with entry having `paths: ["packages/auth/", "packages/shared/"]` (sorted)
|
|
535
|
+
> - T-44: `expandRunLeaseScope` for non-existent/wrong-owner run → throws/rejects with `run_lease_not_owned`
|
|
536
|
+
> - T-45: `expandRunLeaseScope` with `additional_paths: []` and `additional_plan_section_ids: []` (no-op) → resolves with current scope unchanged
|
|
537
|
+
>
|
|
538
|
+
> **Block: `renewRunLease` updates registry TTL** — T-46→T-47
|
|
539
|
+
>
|
|
540
|
+
> - T-46: Run A has registry entry; `renewRunLease(...)` → `writeLeaseRegistry` called with same `run_id` but updated `lease_expires_at` > original
|
|
541
|
+
> - T-47: `renewRunLease` for non-owner → `writeLeaseRegistry` NOT called (existing behavior preserved)
|
|
542
|
+
>
|
|
543
|
+
> **Block: `releaseRunLease` removes registry entry** — T-48→T-49
|
|
544
|
+
>
|
|
545
|
+
> - T-48: Run A in registry; `releaseRunLease(...)` → `writeLeaseRegistry` called with empty `leases` array
|
|
546
|
+
> - T-49: Release for wrong owner → `writeLeaseRegistry` NOT called (`released: false` path)
|
|
547
|
+
|
|
548
|
+
**Checkpoint**: `npx vitest run apps/control-plane/test/lease-scope-conflict-detector.spec.ts apps/control-plane/test/run-lease-service.spec.ts` passes all 46 tests.
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Phase 8: Existing Test Updates
|
|
553
|
+
|
|
554
|
+
**Purpose**: Extend three existing test files with minimal additions to cover the new integration surface. These updates must not break any existing passing tests.
|
|
555
|
+
|
|
556
|
+
- [ ] T019 [P] Update `apps/control-plane/test/run-coordinator.spec.ts` — add 2 scope-derivation tests
|
|
557
|
+
|
|
558
|
+
> **Add two `it()` blocks** to the existing `acquireRunLease` describe block (or nearest equivalent):
|
|
559
|
+
>
|
|
560
|
+
> 1. **"passes `scope: null` when any feature has no declared scope"**: Create a `RunCoordinator` with features where at least one has `scope: undefined`; assert that the `acquireRunLease` spy is called with `{ ..., scope: null }`.
|
|
561
|
+
> 2. **"derives aggregate scope when all features declare scope"**: Features have `scope: { paths: ["packages/auth/"], plan_section_ids: [] }` and `{ paths: ["packages/shared/"], plan_section_ids: ["section-1"] }`; assert `acquireRunLease` called with `{ ..., scope: { paths: ["packages/auth/", "packages/shared/"], plan_section_ids: ["section-1"] } }`.
|
|
562
|
+
>
|
|
563
|
+
> Use existing test helpers; do not change any existing test.
|
|
564
|
+
|
|
565
|
+
- [ ] T020 [P] Update `apps/control-plane/test/supervisor.spec.ts` — add 1 `LEASE_SCOPE_CONFLICT` propagation test
|
|
566
|
+
|
|
567
|
+
> **Add one `it()` block**: Configure the kernel mock so `acquireRunLease` rejects with a `fail(ERROR_CODES.LEASE_SCOPE_CONFLICT, ...)` result; assert that the supervisor does not mask or transform the error — the rejection propagates as-is to the caller (or terminates the run with the same structured error). Do not modify any existing test.
|
|
568
|
+
|
|
569
|
+
- [ ] T021 [P] Update `apps/control-plane/test/kernel.spec.ts` — add 2 registry round-trip tests
|
|
570
|
+
|
|
571
|
+
> **Add two `it()` blocks** in a new `describe('readLeaseRegistry / writeLeaseRegistry', ...)` block:
|
|
572
|
+
>
|
|
573
|
+
> 1. **"returns empty registry when file is absent"**: Call `kernel.readLeaseRegistry()` with a temp directory where `lease-registry.json` does not exist; assert result is `{ leases: [], updated_at: <any string> }`.
|
|
574
|
+
> 2. **"round-trips registry correctly"**: Call `kernel.writeLeaseRegistry(registry)` then `kernel.readLeaseRegistry()`; assert the returned value deep-equals the written value (preserving `leases` array and `updated_at`).
|
|
575
|
+
>
|
|
576
|
+
> Use the same temp-directory setup pattern as other file-based kernel tests in the file.
|
|
577
|
+
|
|
578
|
+
**Checkpoint**: `npm run test` passes; no existing tests broken; coverage thresholds remain ≥90%.
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## Phase 9: Polish & Documentation
|
|
583
|
+
|
|
584
|
+
- [ ] T022 [P] Add Rule 19 to `docs/core/DOMAIN-LOGIC.md`
|
|
585
|
+
|
|
586
|
+
> Append a new rule after the last existing numbered rule:
|
|
587
|
+
>
|
|
588
|
+
> ```markdown
|
|
589
|
+
> ### Rule 19 — Lease Scope Semantics
|
|
590
|
+
>
|
|
591
|
+
> **Scope values**:
|
|
592
|
+
>
|
|
593
|
+
> - `null` (or `undefined`, normalized to `null` at service boundary) — unknown scope;
|
|
594
|
+
> conflicts conservatively with **all** active leases.
|
|
595
|
+
> - `{ paths: [], plan_section_ids: [] }` — explicitly touches nothing; conflicts with **no** active leases.
|
|
596
|
+
> - `{ paths: [...], plan_section_ids: [...] }` — declared scope; checked via prefix overlap / equality.
|
|
597
|
+
>
|
|
598
|
+
> **Overlap rules**:
|
|
599
|
+
>
|
|
600
|
+
> - Path overlap: trailing-slash-normalize both sides; `A` overlaps `B` iff `normalized(A)` is a prefix
|
|
601
|
+
> of `normalized(B)` or vice versa. Empty string normalizes to `/` (root).
|
|
602
|
+
> - Plan section overlap: case-sensitive string equality only (no hierarchy).
|
|
603
|
+
>
|
|
604
|
+
> **Registry lifecycle**:
|
|
605
|
+
>
|
|
606
|
+
> - Registry (`lease-registry.json`) is created on first acquisition; absent file → empty registry.
|
|
607
|
+
> - Expired entries (`lease_expires_at < now`) are pruned on every read inside `withIndexLock`.
|
|
608
|
+
> - Scope is replaced (not merged) on stale-lease takeover.
|
|
609
|
+
> - Scope expansion is additive (union); paths are never removed from a live lease.
|
|
610
|
+
> ```
|
|
611
|
+
|
|
612
|
+
- [ ] T023 [P] Add Scope-Aware Lease Registry ADR to `docs/core/DECISIONS.md`
|
|
613
|
+
|
|
614
|
+
> Append after the last existing ADR:
|
|
615
|
+
>
|
|
616
|
+
> ```markdown
|
|
617
|
+
> ## ADR-N — Scope-Aware Lease Registry
|
|
618
|
+
>
|
|
619
|
+
> **Context**: The global run lease prevents parallel orchestration of non-overlapping codebase regions.
|
|
620
|
+
>
|
|
621
|
+
> **Decision**: Replace the global exclusive lock with a scope-based conflict detector backed by a
|
|
622
|
+
> shared `.aop/runtime/lease-registry.json` file, protected by the existing index lock (`withIndexLock`).
|
|
623
|
+
>
|
|
624
|
+
> **Rationale**:
|
|
625
|
+
>
|
|
626
|
+
> - Piggybacks on the existing serialization point — no new lock primitives, no priority-inversion risk.
|
|
627
|
+
> - Registry is plain JSON; inspectable and debuggable without tooling.
|
|
628
|
+
> - Expired-entry pruning on every read is self-healing with no GC process.
|
|
629
|
+
> - Pure conflict-detector (`LeaseScopeConflictDetector`) is isolated from I/O for full unit-test coverage.
|
|
630
|
+
>
|
|
631
|
+
> **Alternatives rejected**:
|
|
632
|
+
>
|
|
633
|
+
> - Dedicated registry lock: same critical section, adds complexity with no benefit.
|
|
634
|
+
> - `index.json active_leases[]`: mixes feature-index and lease-registry concerns (SRP violation).
|
|
635
|
+
> - Per-instance files only: cannot enumerate all active leases for cross-instance detection.
|
|
636
|
+
>
|
|
637
|
+
> **Consequences**:
|
|
638
|
+
>
|
|
639
|
+
> - ✅ Non-overlapping runs proceed concurrently without artificial serialization.
|
|
640
|
+
> - ✅ Overlapping runs serialized with observable `LEASE_SCOPE_CONFLICT` error code.
|
|
641
|
+
> - ✅ Registry is crash-safe (file-based, atomic writes) and self-healing (prune-on-read).
|
|
642
|
+
> - ⚠️ Index lock hold time slightly increased. Negligible at single-digit concurrency.
|
|
643
|
+
>
|
|
644
|
+
> **Status**: Accepted
|
|
645
|
+
> ```
|
|
646
|
+
>
|
|
647
|
+
> Replace `ADR-N` with the correct sequential number based on the last existing ADR.
|
|
648
|
+
|
|
649
|
+
- [ ] T024 Append Entry 193 to `spec-files/progress.md` after all implementation tasks pass
|
|
650
|
+
|
|
651
|
+
> **Only write this entry after all T001–T023 pass `npm run test`, `npm run lint`, and `npm run typecheck`.**
|
|
652
|
+
> Follow the required format from CLAUDE.md:
|
|
653
|
+
>
|
|
654
|
+
> ```
|
|
655
|
+
> ✅ **Entry 193 — Scope-Aware Run Lease (002-scope-aware-lease)**
|
|
656
|
+
> - **Goal:** Replace the global exclusive run lease with scope-aware conflict detection
|
|
657
|
+
> so non-overlapping orchestrator runs proceed in parallel.
|
|
658
|
+
> - **Changes made:**
|
|
659
|
+
> - `apps/control-plane/src/core/runtime-sessions.ts` — added `LeaseScope`,
|
|
660
|
+
> `LeaseScopeDeclaration`, `ActiveLeaseRecord`, `LeaseRegistry` types;
|
|
661
|
+
> `scope?` on `RuntimeSessionsSnapshot`.
|
|
662
|
+
> - `apps/control-plane/src/core/error-codes.ts` — added `LEASE_SCOPE_CONFLICT`.
|
|
663
|
+
> - `apps/control-plane/src/core/path-layout.ts` — added `leaseRegistryPath` getter.
|
|
664
|
+
> - `apps/control-plane/src/application/services/lease-scope-conflict-detector.ts` — NEW;
|
|
665
|
+
> pure `LeaseScopeConflictDetector` (normalizePath, pathsOverlap, planSectionsOverlap,
|
|
666
|
+
> detectConflict); zero I/O.
|
|
667
|
+
> - `apps/control-plane/src/application/services/run-lease-service.ts` — `scope?` on
|
|
668
|
+
> `AcquireRunLeaseInput`; `ExpandRunLeaseScopeInput`; registry port methods added;
|
|
669
|
+
> `acquireRunLease`/`releaseRunLease`/`renewRunLease` extended to maintain registry;
|
|
670
|
+
> new `expandRunLeaseScope`.
|
|
671
|
+
> - `apps/control-plane/src/core/kernel.ts` — `readLeaseRegistry`, `writeLeaseRegistry`,
|
|
672
|
+
> `emptyLeaseRegistry` implemented; `expandRunLeaseScope` public method added.
|
|
673
|
+
> - `apps/control-plane/src/supervisor/types.ts` — `scope?` on `FeatureInput`.
|
|
674
|
+
> - `apps/control-plane/src/supervisor/run-coordinator.ts` — `deriveRunScope()`,
|
|
675
|
+
> `expandScopesFromPlans()`; scope wired to `acquireRunLease`.
|
|
676
|
+
> - `apps/control-plane/test/lease-scope-conflict-detector.spec.ts` — NEW; 26 unit tests.
|
|
677
|
+
> - `apps/control-plane/test/run-lease-service.spec.ts` — NEW; 20 integration tests.
|
|
678
|
+
> - `apps/control-plane/test/run-coordinator.spec.ts` — 2 tests added.
|
|
679
|
+
> - `apps/control-plane/test/supervisor.spec.ts` — 1 test added.
|
|
680
|
+
> - `apps/control-plane/test/kernel.spec.ts` — 2 tests added.
|
|
681
|
+
> - `docs/core/DOMAIN-LOGIC.md` — Rule 19 (lease scope semantics).
|
|
682
|
+
> - `docs/core/DECISIONS.md` — ADR: Scope-Aware Lease Registry.
|
|
683
|
+
> - **Result:** `npm test` ✅ (X test files / Y tests passing). `npm run lint` ✅.
|
|
684
|
+
> `npm run typecheck` ✅.
|
|
685
|
+
> ```
|
|
686
|
+
>
|
|
687
|
+
> Fill in the actual test counts from `npm run test` output before committing.
|
|
688
|
+
|
|
689
|
+
**Checkpoint**: All Definition-of-Done criteria from `plan.md` are satisfied.
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## Dependency Graph
|
|
694
|
+
|
|
695
|
+
```
|
|
696
|
+
T001 (types)
|
|
697
|
+
├── T002 [P] (error code)
|
|
698
|
+
├── T003 [P] (path layout)
|
|
699
|
+
├── T004 (conflict detector — needs types)
|
|
700
|
+
│ └── T017 (detector unit tests)
|
|
701
|
+
├── T005 [P] (scope on snapshot — needs LeaseScopeDeclaration)
|
|
702
|
+
└── T006 [P] (scope on AcquireInput + ExpandInput — needs LeaseScopeDeclaration)
|
|
703
|
+
├── T007 (port interface — needs T005, T006)
|
|
704
|
+
│ ├── T008 (acquireRunLease — needs T004, T007)
|
|
705
|
+
│ │ ├── T009 [P] (releaseRunLease — needs T007)
|
|
706
|
+
│ │ ├── T010 [P] (renewRunLease — needs T007)
|
|
707
|
+
│ │ └── T018 (integration tests — needs T008, T009, T010, T012)
|
|
708
|
+
│ └── T011 (kernel port impl — needs T001, T003, T007)
|
|
709
|
+
│ └── T021 (kernel tests — needs T011)
|
|
710
|
+
└── T012 (expandRunLeaseScope — needs T004, T006)
|
|
711
|
+
└── T013 [P] (port + kernel method — needs T011, T012)
|
|
712
|
+
├── T014 [P] (FeatureInput — needs T001)
|
|
713
|
+
├── T015 (deriveRunScope — needs T008, T014)
|
|
714
|
+
│ ├── T019 (run-coordinator tests — needs T015)
|
|
715
|
+
│ └── T020 [P] (supervisor tests — needs T008)
|
|
716
|
+
└── T016 (expandScopesFromPlans — needs T013, T015)
|
|
717
|
+
|
|
718
|
+
T022 [P] (DOMAIN-LOGIC.md — independent)
|
|
719
|
+
T023 [P] (DECISIONS.md — independent)
|
|
720
|
+
T024 (progress.md — after all above complete)
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
---
|
|
724
|
+
|
|
725
|
+
## Parallel Execution Opportunities
|
|
726
|
+
|
|
727
|
+
**After T001 completes**: T002, T003, T005, T006 can all run in parallel (different files, no inter-dependencies).
|
|
728
|
+
|
|
729
|
+
**After T007 completes**: T009 and T010 can run in parallel (both modify `run-lease-service.ts` but in different method bodies — serialize if in the same PR to avoid merge conflicts; otherwise independent).
|
|
730
|
+
|
|
731
|
+
**After T011 completes**: T012 and T013 can proceed; T014 can proceed in parallel with T012.
|
|
732
|
+
|
|
733
|
+
**Phase 8 (T019, T020, T021)**: All three test updates are fully parallel (different test files, no shared state).
|
|
734
|
+
|
|
735
|
+
**Phase 9 (T022, T023)**: Both doc updates are parallel (different files, no dependencies).
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## Implementation Strategy
|
|
740
|
+
|
|
741
|
+
| Increment | Tasks | Deliverable |
|
|
742
|
+
| ----------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
743
|
+
| **MVP — Conflict Detection Engine** | T001–T011, T017 | Core scope conflict detection fully functional; pure-logic unit tests pass; `acquireRunLease` grants or denies based on scope. US1 + US2 complete. |
|
|
744
|
+
| **Scope Expansion** | T012–T013 | Mid-run scope expansion works (FR-007). US4 expanded scope complete. |
|
|
745
|
+
| **Supervisor Wiring** | T014–T016 | Scope flows from `FeatureInput` through `RunCoordinator` to `acquireRunLease`; post-planning expansion fires automatically. Full end-to-end path live. |
|
|
746
|
+
| **Full Test Coverage** | T018–T021 | Integration and existing-test updates; ≥90% thresholds maintained. |
|
|
747
|
+
| **Documentation** | T022–T024 | DOMAIN-LOGIC.md Rule 19, DECISIONS.md ADR, progress.md Entry 193. |
|
|
748
|
+
|
|
749
|
+
> **Recommended MVP cut**: Complete T001–T011 + T017 first. This delivers US1 + US2 (the P1 stories) with full unit-test coverage and a passing typecheck. T012–T016 (US3/US4 expansion and supervisor wiring) are safe follow-on increments.
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
## Definition of Done
|
|
754
|
+
|
|
755
|
+
Mirrors `plan.md` Definition of Done — all items must be checked before marking this feature complete:
|
|
756
|
+
|
|
757
|
+
- [ ] `npm run typecheck` passes clean (zero new type errors)
|
|
758
|
+
- [ ] `npm run lint` passes with zero warnings (`--max-warnings 0`)
|
|
759
|
+
- [ ] `npm run test` passes at ≥90% lines / branches / functions / statements
|
|
760
|
+
- [ ] `lease-scope-conflict-detector.spec.ts` — all 26 tests pass (T-01 → T-26)
|
|
761
|
+
- [ ] `run-lease-service.spec.ts` — all 20 tests pass (T-30 → T-49)
|
|
762
|
+
- [ ] `run-coordinator.spec.ts` — 2 new scope tests added and passing
|
|
763
|
+
- [ ] `supervisor.spec.ts` — 1 new `LEASE_SCOPE_CONFLICT` propagation test added and passing
|
|
764
|
+
- [ ] `kernel.spec.ts` — 2 new registry round-trip tests added and passing
|
|
765
|
+
- [ ] `docs/core/DOMAIN-LOGIC.md` — Rule 19 added
|
|
766
|
+
- [ ] `docs/core/DECISIONS.md` — Scope-Aware Lease Registry ADR added
|
|
767
|
+
- [ ] `spec-files/progress.md` — Entry 193 appended with final test counts
|