agentic-orchestrator 0.1.28 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +110 -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 +83 -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 +357 -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 +131 -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 +107 -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 +845 -59
- 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 +54 -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
package/spec-files/{outstanding → completed}/agentic_orchestrator_runtime_inspection_spec.md
RENAMED
|
@@ -94,7 +94,7 @@ run_history:
|
|
|
94
94
|
},
|
|
95
95
|
"status": {
|
|
96
96
|
"type": "string",
|
|
97
|
-
"enum": ["active", "completed", "failed", "timeout"],
|
|
97
|
+
"enum": ["active", "completed", "failed", "timeout", "interrupted"],
|
|
98
98
|
"description": "Final status of this run for this feature"
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -106,8 +106,11 @@ run_history:
|
|
|
106
106
|
**Update Behavior:**
|
|
107
107
|
|
|
108
108
|
- **On feature.init:** Create `run_history` with current run_id, status `active`
|
|
109
|
-
- **On supervisor start:**
|
|
110
|
-
|
|
109
|
+
- **On supervisor start:**
|
|
110
|
+
1. Read existing `run_history`.
|
|
111
|
+
2. If the latest entry (index 0) has `status: 'active'` or `ended_at: null`, mark it as `status: 'interrupted'` and set `ended_at` to the current timestamp. This handles crashes or manual restarts where the previous run didn't exit cleanly.
|
|
112
|
+
3. Append the _new_ current run_id to `run_history` with `status: 'active'`.
|
|
113
|
+
- **On supervisor stop/complete:** Update latest run_history entry with `ended_at` and final `status` (`completed`, `failed`, or `timeout`).
|
|
111
114
|
- **On feature.delete:** Archive run_history before deletion (optional)
|
|
112
115
|
|
|
113
116
|
### 1.2 Operation Ledger Files
|
|
@@ -166,6 +169,8 @@ run_history:
|
|
|
166
169
|
|
|
167
170
|
## 2. API Contract
|
|
168
171
|
|
|
172
|
+
**Note:** The API routes in `packages/web-dashboard` must use Node.js `fs` module to directly read artifacts from the `.aop` directory. Ensure proper error handling for file access.
|
|
173
|
+
|
|
169
174
|
### 2.1 Operation Ledger Endpoint
|
|
170
175
|
|
|
171
176
|
**Route:** `GET /api/runtime/operations`
|
|
@@ -197,7 +202,7 @@ run_history:
|
|
|
197
202
|
run_info: {
|
|
198
203
|
started_at: string;
|
|
199
204
|
ended_at: string | null;
|
|
200
|
-
status: 'active' | 'completed' | 'failed' | 'timeout';
|
|
205
|
+
status: 'active' | 'completed' | 'failed' | 'timeout' | 'interrupted';
|
|
201
206
|
};
|
|
202
207
|
operations: Array<{
|
|
203
208
|
operation_id: string;
|
|
@@ -262,7 +267,7 @@ run_history:
|
|
|
262
267
|
run_info: {
|
|
263
268
|
started_at: string;
|
|
264
269
|
ended_at: string | null;
|
|
265
|
-
status: 'active' | 'completed' | 'failed' | 'timeout';
|
|
270
|
+
status: 'active' | 'completed' | 'failed' | 'timeout' | 'interrupted';
|
|
266
271
|
};
|
|
267
272
|
events: Array<{
|
|
268
273
|
ts: string;
|
|
@@ -322,7 +327,7 @@ run_history:
|
|
|
322
327
|
run_id: string;
|
|
323
328
|
started_at: string;
|
|
324
329
|
ended_at: string | null;
|
|
325
|
-
status: 'active' | 'completed' | 'failed' | 'timeout';
|
|
330
|
+
status: 'active' | 'completed' | 'failed' | 'timeout' | 'interrupted';
|
|
326
331
|
has_operations: boolean;
|
|
327
332
|
has_events: boolean;
|
|
328
333
|
}>;
|
|
@@ -349,6 +354,8 @@ run_history:
|
|
|
349
354
|
|
|
350
355
|
**File:** `packages/web-dashboard/src/components/runtime-inspector.tsx`
|
|
351
356
|
|
|
357
|
+
**Type:** Client Component (`"use client"`)
|
|
358
|
+
|
|
352
359
|
**Location:** Appears in Feature Detail Panel (right side) as a new tab
|
|
353
360
|
|
|
354
361
|
**Tabs:**
|
|
@@ -380,6 +387,11 @@ run_history:
|
|
|
380
387
|
- Filter by success/failure (toggle)
|
|
381
388
|
- Pagination controls at bottom
|
|
382
389
|
|
|
390
|
+
**Error & Loading States:**
|
|
391
|
+
|
|
392
|
+
- **Loading:** Display skeleton rows while fetching data.
|
|
393
|
+
- **Error:** Display user-friendly error message ("Failed to load runtime data") with a "Retry" button.
|
|
394
|
+
|
|
383
395
|
### 3.2 Operations List View
|
|
384
396
|
|
|
385
397
|
**Requirements:**
|
|
@@ -527,7 +539,7 @@ Notes: <note_count>
|
|
|
527
539
|
},
|
|
528
540
|
"status": {
|
|
529
541
|
"type": "string",
|
|
530
|
-
"enum": ["active", "completed", "failed", "timeout"],
|
|
542
|
+
"enum": ["active", "completed", "failed", "timeout", "interrupted"],
|
|
531
543
|
"description": "Final status of this run for this feature"
|
|
532
544
|
}
|
|
533
545
|
}
|
|
@@ -548,9 +560,13 @@ Notes: <note_count>
|
|
|
548
560
|
|
|
549
561
|
**Changes:**
|
|
550
562
|
|
|
551
|
-
- On feature start
|
|
552
|
-
-
|
|
553
|
-
-
|
|
563
|
+
- **On feature start:**
|
|
564
|
+
- Retrieve current feature state.
|
|
565
|
+
- Check `run_history[0]`. If it exists and `status === 'active'` or `ended_at` is null:
|
|
566
|
+
- Call `featureStateService.updateRunHistory(featureId, oldRunId, new Date().toISOString(), 'interrupted')`
|
|
567
|
+
- Call `featureStateService.appendRunHistory(featureId, this.runId, new Date().toISOString())`
|
|
568
|
+
- **On feature complete/fail:** Call `featureStateService.updateRunHistory(featureId, this.runId, new Date().toISOString(), status)`
|
|
569
|
+
- **On recovery:** Check if current run_id exists in run_history, append if missing.
|
|
554
570
|
|
|
555
571
|
**Migration Strategy:**
|
|
556
572
|
|
|
@@ -565,9 +581,9 @@ Notes: <note_count>
|
|
|
565
581
|
**Logic:**
|
|
566
582
|
|
|
567
583
|
1. Resolve `feature_id` and `project` from query params
|
|
568
|
-
2. Read `.aop/features/<feature_id>/state.md`
|
|
584
|
+
2. Read `.aop/features/<feature_id>/state.md` using `fs`
|
|
569
585
|
3. Parse YAML frontmatter to extract `run_history`
|
|
570
|
-
4. For each run, check if ledger/events files exist
|
|
586
|
+
4. For each run, check if ledger/events files exist (using `fs.existsSync`)
|
|
571
587
|
5. Return formatted response with run list
|
|
572
588
|
|
|
573
589
|
**File:** `packages/web-dashboard/src/app/api/runtime/operations/route.ts`
|
|
@@ -577,7 +593,7 @@ Notes: <note_count>
|
|
|
577
593
|
1. Resolve `feature_id` and `project` from query params
|
|
578
594
|
2. If `run_id` provided, use it; else read state.md and extract `run_history[0].run_id`
|
|
579
595
|
3. If no run_history, return `run_not_found`
|
|
580
|
-
4. Read `.aop/runtime/operation-ledger/run:<run_id>.json`
|
|
596
|
+
4. Read `.aop/runtime/operation-ledger/run:<run_id>.json` using `fs`
|
|
581
597
|
5. Parse JSON and extract operations
|
|
582
598
|
6. Filter operations by `feature_id` (check operation_id contains feature_id)
|
|
583
599
|
7. Sort by timestamp (extract from operation_id or use file `updated_at`)
|
|
@@ -591,7 +607,7 @@ Notes: <note_count>
|
|
|
591
607
|
1. Resolve `feature_id` and `project` from query params
|
|
592
608
|
2. If `run_id` provided, use it; else read state.md and extract `run_history[0].run_id`
|
|
593
609
|
3. If no run_history, return `run_not_found`
|
|
594
|
-
4. Read `.aop/runtime/worker-events/run:<run_id>.jsonl`
|
|
610
|
+
4. Read `.aop/runtime/worker-events/run:<run_id>.jsonl` using `fs`
|
|
595
611
|
5. Parse JSONL (split by newline, parse each line as JSON)
|
|
596
612
|
6. Filter events by `feature_id`
|
|
597
613
|
7. Apply filters (event_type, role, valid)
|
|
@@ -642,7 +658,7 @@ interface RunHistoryEntry {
|
|
|
642
658
|
run_id: string;
|
|
643
659
|
started_at: string;
|
|
644
660
|
ended_at: string | null;
|
|
645
|
-
status: 'active' | 'completed' | 'failed' | 'timeout';
|
|
661
|
+
status: 'active' | 'completed' | 'failed' | 'timeout' | 'interrupted';
|
|
646
662
|
has_operations: boolean;
|
|
647
663
|
has_events: boolean;
|
|
648
664
|
}
|
|
@@ -797,10 +813,11 @@ interface RunHistoryEntry {
|
|
|
797
813
|
|
|
798
814
|
- [ ] Schema change: Add `run_history` field to `state.schema.json`
|
|
799
815
|
- [ ] Supervisor: Update run_history on feature start/stop
|
|
816
|
+
- [ ] Supervisor: Correctly mark interrupted runs on startup
|
|
800
817
|
- [ ] FeatureStateService: Support run_history read/write
|
|
801
|
-
- [ ] `GET /api/runtime/runs` endpoint implemented
|
|
802
|
-
- [ ] `GET /api/runtime/operations` endpoint implemented
|
|
803
|
-
- [ ] `GET /api/runtime/events` endpoint implemented
|
|
818
|
+
- [ ] `GET /api/runtime/runs` endpoint implemented with `fs` access
|
|
819
|
+
- [ ] `GET /api/runtime/operations` endpoint implemented with `fs` access
|
|
820
|
+
- [ ] `GET /api/runtime/events` endpoint implemented with `fs` access
|
|
804
821
|
- [ ] Run ID resolution from run_history (latest by default)
|
|
805
822
|
- [ ] RuntimeInspector component renders in detail panel
|
|
806
823
|
- [ ] Run selector dropdown with all historical runs
|
|
@@ -861,6 +878,7 @@ interface RunHistoryEntry {
|
|
|
861
878
|
- Update FeatureStateService to read/write run_history
|
|
862
879
|
- Update SupervisorRuntime to append run_id on feature start
|
|
863
880
|
- Update SupervisorRuntime to update run status on feature end
|
|
881
|
+
- Implement robust crash detection (mark interrupted runs)
|
|
864
882
|
- Add migration for existing features (backfill empty run_history)
|
|
865
883
|
- Add unit tests for schema validation
|
|
866
884
|
- Add unit tests for state service
|
|
@@ -911,6 +929,7 @@ interface RunHistoryEntry {
|
|
|
911
929
|
- UI render time < 100ms (p95)
|
|
912
930
|
- Zero crashes on large files (< 10MB)
|
|
913
931
|
- 100% test coverage for new code
|
|
932
|
+
- 100% accurate identification of interrupted/crashed runs
|
|
914
933
|
|
|
915
934
|
### 9.2 User Metrics
|
|
916
935
|
|
|
@@ -937,4 +956,58 @@ interface RunHistoryEntry {
|
|
|
937
956
|
|
|
938
957
|
---
|
|
939
958
|
|
|
940
|
-
|
|
959
|
+
## 11. Implementation Tasks
|
|
960
|
+
|
|
961
|
+
## Phase 1: Foundational State Management
|
|
962
|
+
|
|
963
|
+
> **Goal:** Ensure all feature runs are reliably tracked in `feature_state.run_history` to enable historical inspection.
|
|
964
|
+
|
|
965
|
+
- [ ] T001 [P] Implement `appendRunHistory` method in `apps/control-plane/src/application/services/feature-state-service.ts` to add new runs to the history list.
|
|
966
|
+
- [ ] T002 [P] Implement `updateRunHistory` method in `apps/control-plane/src/application/services/feature-state-service.ts` to update status/end time of existing runs.
|
|
967
|
+
- [ ] T003 Update `SupervisorRuntime` in `apps/control-plane/src/supervisor/runtime.ts` to call `appendRunHistory` on startup for the current run.
|
|
968
|
+
- [ ] T004 Update `SupervisorRuntime` in `apps/control-plane/src/supervisor/runtime.ts` to call `updateRunHistory` on graceful shutdown or completion.
|
|
969
|
+
- [ ] T005 [P] Update `FeatureLifecycleService` in `apps/control-plane/src/application/services/feature-lifecycle-service.ts` to initialize `run_history` with the creation run ID during `feature.init`.
|
|
970
|
+
- [ ] T006 Verify state updates by inspecting `.aop/features/<feature_id>/state.md` after a supervisor run.
|
|
971
|
+
|
|
972
|
+
## Phase 2: Backend API Endpoints
|
|
973
|
+
|
|
974
|
+
> **Goal:** Expose runtime artifacts (ledger, events, run history) to the frontend via Next.js API routes.
|
|
975
|
+
|
|
976
|
+
- [ ] T007 [P] Create utility `packages/web-dashboard/src/lib/runtime-files.ts` to resolve paths and read JSON/JSONL files from `.aop/runtime`.
|
|
977
|
+
- [ ] T008 [P] [US1] Create API route `GET /api/runtime/runs` in `packages/web-dashboard/src/app/api/runtime/runs/route.ts` to return run history for a feature.
|
|
978
|
+
- [ ] T009 [P] [US1] Create API route `GET /api/runtime/operations` in `packages/web-dashboard/src/app/api/runtime/operations/route.ts` to return operation ledger data.
|
|
979
|
+
- [ ] T010 [P] [US1] Create API route `GET /api/runtime/events` in `packages/web-dashboard/src/app/api/runtime/events/route.ts` to return worker events (parsing JSONL).
|
|
980
|
+
- [ ] T011 [US1] Implement run ID resolution logic in API routes: if `run_id` is missing, fetch latest from feature state.
|
|
981
|
+
- [ ] T012 [P] Add error handling for missing files (404) and permission errors in all runtime API routes.
|
|
982
|
+
|
|
983
|
+
## Phase 3: UI Components & Integration
|
|
984
|
+
|
|
985
|
+
> **Goal:** Visualize the runtime data in the dashboard with a user-friendly inspector panel.
|
|
986
|
+
|
|
987
|
+
- [ ] T013 [P] [US1] Create `RuntimeInspectorPanel` container component in `packages/web-dashboard/src/components/features/runtime-inspector/RuntimeInspectorPanel.tsx`.
|
|
988
|
+
- [ ] T014 [P] [US1] Create `OperationsListView` component in `packages/web-dashboard/src/components/features/runtime-inspector/OperationsListView.tsx` to display tool calls.
|
|
989
|
+
- [ ] T015 [P] [US1] Create `EventsTimelineView` component in `packages/web-dashboard/src/components/features/runtime-inspector/EventsTimelineView.tsx` to display worker events.
|
|
990
|
+
- [ ] T016 [US1] Implement run selection dropdown in `RuntimeInspectorPanel` to switch between historical runs.
|
|
991
|
+
- [ ] T017 [US1] Add "Load More" or pagination support for large event logs (progressive loading).
|
|
992
|
+
- [ ] T018 [US1] Integrate `RuntimeInspectorPanel` into the Feature Detail page (`packages/web-dashboard/src/app/features/[id]/page.tsx` or equivalent).
|
|
993
|
+
|
|
994
|
+
## Phase 4: Polish & UX Refinements
|
|
995
|
+
|
|
996
|
+
> **Goal:** Ensure the inspector is performant, responsive, and handles edge cases gracefully.
|
|
997
|
+
|
|
998
|
+
- [ ] T019 [P] Add collapsible JSON views for request/response payloads in `OperationsListView`.
|
|
999
|
+
- [ ] T020 [P] Add filtering controls (by event type: `worker_started`, `worker_failed`, etc.) to `EventsTimelineView`.
|
|
1000
|
+
- [ ] T021 [P] specific styling for error states (red highlights for failed operations/events).
|
|
1001
|
+
- [ ] T022 [P] Ensure timestamp formatting is consistent (local time vs UTC toggle if needed).
|
|
1002
|
+
- [ ] T023 Run `npm run verify` to ensure all new code meets quality standards (linting, types).
|
|
1003
|
+
|
|
1004
|
+
## Dependencies
|
|
1005
|
+
|
|
1006
|
+
1. **Foundational State Management** must complete before **Backend API Endpoints** (specifically for `runs` endpoint).
|
|
1007
|
+
2. **Backend API Endpoints** must complete before **UI Components**.
|
|
1008
|
+
3. **UI Components** integration depends on the existence of the Feature Detail page.
|
|
1009
|
+
|
|
1010
|
+
## Implementation Strategy
|
|
1011
|
+
|
|
1012
|
+
- **MVP**: Focus on the _latest_ run first. Get the `run_history` tracking working, then the APIs for the current run, then the UI.
|
|
1013
|
+
- **Incremental**: You can build the API routes in parallel with the State Management updates, using mock data or manually edited state files for testing.
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
# Agentic Orchestrator: Scope-Aware Run Lease
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `002-scope-aware-lease`
|
|
4
|
+
**Status**: Ready for Implementation
|
|
5
|
+
**Priority**: P1 (US1 + US2) / P2 (US3 + US4)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Currently, when an orchestrator instance acquires a run lease it creates a global exclusive lock that prevents any other orchestrator from starting — regardless of whether the two would actually touch the same files or plan sections. This serializes all orchestration work even when runs target entirely different parts of the codebase.
|
|
12
|
+
|
|
13
|
+
This feature replaces that global execution barrier with a scope-aware one. When a new execution attempts to start, the system compares its declared codebase scope against the scopes of all currently active leases. Execution is only blocked when an overlap exists. Runs that target different sections of the codebase proceed concurrently.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## User Stories
|
|
18
|
+
|
|
19
|
+
### User Story 1 — Parallel Execution of Non-Overlapping Runs (Priority: P1)
|
|
20
|
+
|
|
21
|
+
An operator triggers two orchestrator runs simultaneously. One targets the authentication subsystem; the other targets the payment processing subsystem. Because these runs touch disjoint parts of the codebase, both should be allowed to proceed in parallel.
|
|
22
|
+
|
|
23
|
+
**Acceptance Scenarios**:
|
|
24
|
+
|
|
25
|
+
1. **Given** no active leases exist, **When** Run A declares scope `[packages/auth/]` and acquires a lease, **Then** Run A is granted the lease immediately.
|
|
26
|
+
2. **Given** Run A holds a lease for scope `[packages/auth/]`, **When** Run B attempts to acquire a lease for scope `[packages/payments/]`, **Then** Run B is granted its lease without waiting.
|
|
27
|
+
3. **Given** Run A and Run B are both active with non-overlapping scopes, **When** both complete, **Then** each releases its own lease without affecting the other.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### User Story 2 — Blocking of Overlapping Runs (Priority: P1)
|
|
32
|
+
|
|
33
|
+
Two orchestrator runs that both target the same directory or plan section — the second run must not be allowed to proceed until the first completes.
|
|
34
|
+
|
|
35
|
+
**Acceptance Scenarios**:
|
|
36
|
+
|
|
37
|
+
1. **Given** Run A holds a lease for scope `[packages/auth/]`, **When** Run B attempts to acquire a lease for scope `[packages/auth/]`, **Then** Run B is blocked until Run A releases its lease.
|
|
38
|
+
2. **Given** Run A holds a lease for scope `[packages/]`, **When** Run B attempts to acquire a lease for scope `[packages/auth/]`, **Then** Run B is blocked (path prefix containment).
|
|
39
|
+
3. **Given** Run A holds a lease for scope `[packages/auth/, packages/shared/]`, **When** Run B declares scope `[packages/shared/, packages/payments/]`, **Then** Run B is blocked because `packages/shared/` appears in both scopes.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
### User Story 3 — Conservative Fallback for Unknown Scope (Priority: P2)
|
|
44
|
+
|
|
45
|
+
A run started before a plan is established has no declared scope. The system must not allow an unknown-scope run to proceed concurrently with any other active run.
|
|
46
|
+
|
|
47
|
+
**Acceptance Scenarios**:
|
|
48
|
+
|
|
49
|
+
1. **Given** Run A holds a lease for any declared scope, **When** Run B attempts to acquire a lease with no declared scope, **Then** Run B is blocked.
|
|
50
|
+
2. **Given** Run A holds a lease with no declared scope, **When** Run B attempts to acquire a lease for any scope, **Then** Run B is blocked.
|
|
51
|
+
3. **Given** no active leases exist and Run A has no declared scope, **When** Run A acquires the lease, **Then** Run A is granted the lease immediately.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
### User Story 4 — Scope Declaration & Persistence at Acquisition (Priority: P2)
|
|
56
|
+
|
|
57
|
+
Orchestrators can supply a set of codebase paths or plan section identifiers when requesting a lease. This declared scope is persisted in the lease record and used for conflict detection.
|
|
58
|
+
|
|
59
|
+
**Acceptance Scenarios**:
|
|
60
|
+
|
|
61
|
+
1. **Given** an orchestrator supplies directory paths when requesting a lease, **When** the lease is granted, **Then** the lease record contains exactly those paths.
|
|
62
|
+
2. **Given** an orchestrator supplies plan section identifiers, **When** the lease is granted, **Then** the record contains those identifiers alongside any path-based scope.
|
|
63
|
+
3. **Given** a stale lease is taken over by a new orchestrator, **When** the takeover completes, **Then** the new orchestrator's scope replaces the previous lease's scope in the record.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Functional Requirements
|
|
68
|
+
|
|
69
|
+
- **FR-001**: The system MUST allow two orchestrator runs to hold active leases simultaneously when their declared codebase scopes do not overlap.
|
|
70
|
+
- **FR-002**: The system MUST deny or defer lease acquisition when the requesting run's scope overlaps with any currently active lease's scope.
|
|
71
|
+
- **FR-003**: Scope overlap MUST be evaluated using path-prefix containment — a scope entry overlaps another if one is a prefix of (or equal to) the other.
|
|
72
|
+
- **FR-004**: The system MUST treat a run with an undeclared or unknown scope as conflicting with all other active leases (conservative blocking).
|
|
73
|
+
- **FR-005**: The system MUST persist the declared scope as part of the lease record so it survives across heartbeat renewals and instance restarts.
|
|
74
|
+
- **FR-006**: The system MUST support scope declarations consisting of file-system paths, feature/plan section identifiers, or both.
|
|
75
|
+
- **FR-007**: An active orchestrator MUST be able to expand its declared scope during a run (e.g., after discovering additional affected files), and the updated scope MUST be used for subsequent conflict evaluations.
|
|
76
|
+
- **FR-008**: When a stale lease is taken over, the system MUST replace the expired scope with the new orchestrator's declared scope before evaluating conflicts.
|
|
77
|
+
- **FR-009**: The system MUST continue to use short-duration atomic locks for mutating the lease registry itself, ensuring conflict comparison and lease grant/deny decisions are race-condition free.
|
|
78
|
+
- **FR-010**: The system MUST produce an observable record (log entry or status field) when a lease acquisition is deferred due to scope conflict, identifying which active lease caused the block.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Data Model
|
|
83
|
+
|
|
84
|
+
### New Types (`apps/control-plane/src/core/runtime-sessions.ts`)
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export interface LeaseScope {
|
|
88
|
+
paths: string[]; // file-system paths relative to repoRoot (prefix-matched)
|
|
89
|
+
plan_section_ids: string[]; // opaque plan section identifiers (equality-matched)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type LeaseScopeDeclaration = LeaseScope | null;
|
|
93
|
+
// null → unknown/undeclared → conflicts with ALL active leases
|
|
94
|
+
// { paths: [], plan_section_ids: [] } → explicitly empty → conflicts with NOTHING
|
|
95
|
+
// { paths: [...], ... } → declared scope → prefix-overlap / equality check
|
|
96
|
+
|
|
97
|
+
export interface ActiveLeaseRecord {
|
|
98
|
+
run_id: string;
|
|
99
|
+
owner_instance_id: string;
|
|
100
|
+
instance_id: string;
|
|
101
|
+
scope: LeaseScopeDeclaration;
|
|
102
|
+
lease_expires_at: string; // ISO-8601; entries with expiry < now are pruned on read
|
|
103
|
+
acquired_at: string; // ISO-8601
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface LeaseRegistry {
|
|
107
|
+
leases: ActiveLeaseRecord[];
|
|
108
|
+
updated_at: string; // ISO-8601; last write timestamp (informational)
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Modified Types
|
|
113
|
+
|
|
114
|
+
**`RuntimeSessionsSnapshot`** — add `scope?: LeaseScopeDeclaration` (optional, backward-compatible; missing field normalizes to `null`).
|
|
115
|
+
|
|
116
|
+
**`AcquireRunLeaseInput`** — add `scope?: LeaseScopeDeclaration` (optional; `undefined` normalizes to `null`).
|
|
117
|
+
|
|
118
|
+
**New: `ExpandRunLeaseScopeInput`**:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
export interface ExpandRunLeaseScopeInput {
|
|
122
|
+
run_id: string;
|
|
123
|
+
owner_instance_id: string;
|
|
124
|
+
additional_paths?: string[];
|
|
125
|
+
additional_plan_section_ids?: string[];
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### New Error Code (`apps/control-plane/src/core/error-codes.ts`)
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
LEASE_SCOPE_CONFLICT: 'lease_scope_conflict',
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Error details shape:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
{
|
|
139
|
+
incoming_scope: LeaseScopeDeclaration;
|
|
140
|
+
blocking_run_id: string;
|
|
141
|
+
blocking_owner_instance_id: string;
|
|
142
|
+
conflicting_scope_entry: string; // first conflicting path or plan_section_id
|
|
143
|
+
retryable: true;
|
|
144
|
+
requires_human: false;
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Persistence
|
|
149
|
+
|
|
150
|
+
| Artifact | Path | Protected By |
|
|
151
|
+
| ----------------------- | ------------------------------------------ | --------------------------- |
|
|
152
|
+
| Per-instance lease file | `.aop/runtime/<instanceId>/run-lease.json` | `withIndexLock` |
|
|
153
|
+
| Global lease registry | `.aop/runtime/lease-registry.json` | `withIndexLock` (same lock) |
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Architecture
|
|
158
|
+
|
|
159
|
+
### Conflict Detection Logic (Scope Overlap Rules)
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
acquireRunLease(input):
|
|
163
|
+
scope = input.scope ?? null ← normalize undefined → null
|
|
164
|
+
|
|
165
|
+
active = registry.leases (pruned of expired entries)
|
|
166
|
+
|
|
167
|
+
for each activeLease in active (excluding same run_id re-acquire):
|
|
168
|
+
if activeLease.scope === null OR scope === null → CONFLICT
|
|
169
|
+
if scope is empty AND activeLease.scope is empty → no conflict
|
|
170
|
+
if scope is empty → no conflict (touches nothing)
|
|
171
|
+
if activeLease.scope is empty → no conflict
|
|
172
|
+
if pathsOverlap(scope.paths, activeLease.scope.paths) → CONFLICT
|
|
173
|
+
if planSectionsOverlap(...) → CONFLICT
|
|
174
|
+
→ GRANT
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Path normalization** (R-001): Strip trailing `/`, append exactly one `/`. Empty string after strip → `'/'` (root, overlaps everything). `packages/auth` and `packages/authentication` do NOT overlap.
|
|
178
|
+
|
|
179
|
+
**Plan section overlap** (R-002): Case-sensitive string equality only. No hierarchy between section IDs.
|
|
180
|
+
|
|
181
|
+
**Conflict matrix**:
|
|
182
|
+
|
|
183
|
+
| Incoming | Active | Result |
|
|
184
|
+
| ----------------------------------- | --------------------------- | -------------------------- |
|
|
185
|
+
| `null` | anything (any lease exists) | CONFLICT |
|
|
186
|
+
| anything | `null` | CONFLICT |
|
|
187
|
+
| `{ paths:[], plan_section_ids:[] }` | any | No conflict |
|
|
188
|
+
| non-empty | `{ paths:[], ... }` | No conflict |
|
|
189
|
+
| `packages/auth/` | `packages/payments/` | No conflict |
|
|
190
|
+
| `packages/auth/` | `packages/auth/` | CONFLICT |
|
|
191
|
+
| `packages/` | `packages/auth/utils/` | CONFLICT (parent/child) |
|
|
192
|
+
| `src/` | `src/config.ts` | CONFLICT (file within dir) |
|
|
193
|
+
| `src/` | `src-old/config.ts` | No conflict |
|
|
194
|
+
|
|
195
|
+
### New Files
|
|
196
|
+
|
|
197
|
+
- **`apps/control-plane/src/application/services/lease-scope-conflict-detector.ts`** — Pure logic class, zero I/O, zero side effects. Methods: `normalizePath`, `pathsOverlap`, `planSectionsOverlap`, `detectConflict`.
|
|
198
|
+
- **`apps/control-plane/test/lease-scope-conflict-detector.spec.ts`** — 26 unit tests.
|
|
199
|
+
- **`apps/control-plane/test/run-lease-service.spec.ts`** — 20 integration tests.
|
|
200
|
+
|
|
201
|
+
### Modified Files
|
|
202
|
+
|
|
203
|
+
| File | Change |
|
|
204
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
205
|
+
| `core/runtime-sessions.ts` | 4 new types, `scope?` on snapshot |
|
|
206
|
+
| `core/error-codes.ts` | `LEASE_SCOPE_CONFLICT` added |
|
|
207
|
+
| `core/path-layout.ts` | `leaseRegistryPath` getter |
|
|
208
|
+
| `application/services/run-lease-service.ts` | Scope conflict integration, `expandRunLeaseScope`, port interface extensions |
|
|
209
|
+
| `core/kernel.ts` | `readLeaseRegistry`, `writeLeaseRegistry`, `emptyLeaseRegistry`, `expandRunLeaseScope` |
|
|
210
|
+
| `supervisor/types.ts` | `scope?` on `FeatureInput` |
|
|
211
|
+
| `supervisor/run-coordinator.ts` | `deriveRunScope()`, `expandScopesFromPlans()`, scope wired to `acquireRunLease` |
|
|
212
|
+
| `test/run-coordinator.spec.ts` | 2 scope propagation tests |
|
|
213
|
+
| `test/supervisor.spec.ts` | 1 `LEASE_SCOPE_CONFLICT` propagation test |
|
|
214
|
+
| `test/kernel.spec.ts` | 2 registry round-trip tests |
|
|
215
|
+
| `docs/core/DOMAIN-LOGIC.md` | Rule 19 — Lease Scope Semantics |
|
|
216
|
+
| `docs/core/DECISIONS.md` | ADR: Scope-Aware Lease Registry |
|
|
217
|
+
|
|
218
|
+
### Key Design Decisions
|
|
219
|
+
|
|
220
|
+
- **Existing index lock reused**: The new Lease Registry (`lease-registry.json`) uses the existing `withIndexLock` (`.aop/features/.index.lock`). No new lock primitives, no priority-inversion risk.
|
|
221
|
+
- **Prune-on-read**: Expired entries are removed inside every `withIndexLock` callback. Self-healing, no background GC process.
|
|
222
|
+
- **Conservative by default**: Any caller that doesn't pass `scope` gets `null` (conservative behavior), which is identical to the current global-lock behavior. Parallelism must be explicitly opted into.
|
|
223
|
+
- **Pure conflict detector**: `LeaseScopeConflictDetector` has zero I/O and is independently unit-testable.
|
|
224
|
+
- **Scope expansion is additive**: Paths can only be added to a live lease, never removed.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Implementation Tasks
|
|
229
|
+
|
|
230
|
+
### Phase 1: Core Types & Infrastructure
|
|
231
|
+
|
|
232
|
+
- **T001** — Add `LeaseScope`, `LeaseScopeDeclaration`, `ActiveLeaseRecord`, `LeaseRegistry` to `core/runtime-sessions.ts`
|
|
233
|
+
- **T002** [P] — Add `LEASE_SCOPE_CONFLICT` to `core/error-codes.ts`
|
|
234
|
+
- **T003** [P] — Add `leaseRegistryPath` getter to `core/path-layout.ts`
|
|
235
|
+
|
|
236
|
+
### Phase 2: Pure Conflict Detection Service
|
|
237
|
+
|
|
238
|
+
- **T004** — Create `application/services/lease-scope-conflict-detector.ts` — pure `LeaseScopeConflictDetector` class with `normalizePath`, `pathsOverlap`, `planSectionsOverlap`, `detectConflict`
|
|
239
|
+
|
|
240
|
+
### Phase 3: Scope Declaration & Persistence (US4)
|
|
241
|
+
|
|
242
|
+
- **T005** [US4] — Add `scope?: LeaseScopeDeclaration` to `RuntimeSessionsSnapshot`
|
|
243
|
+
- **T006** [P] [US4] — Add `scope?` to `AcquireRunLeaseInput` and add `ExpandRunLeaseScopeInput` interface
|
|
244
|
+
|
|
245
|
+
### Phase 4: Registry-Backed Lease Operations (US1 & US2)
|
|
246
|
+
|
|
247
|
+
- **T007** [US1/US2] — Extend `RunLeaseServicePort` with `readLeaseRegistry`, `writeLeaseRegistry`, `emptyLeaseRegistry`
|
|
248
|
+
- **T008** [US1/US2] — Modify `acquireRunLease` to consult registry, run conflict detection, write registry entry on grant, emit `LEASE_SCOPE_CONFLICT` on deny
|
|
249
|
+
- **T009** [US2] — Modify `releaseRunLease` to remove entry from registry
|
|
250
|
+
- **T010** [P] [US1] — Modify `renewRunLease` to update `lease_expires_at` in registry
|
|
251
|
+
- **T011** — Implement `readLeaseRegistry`, `writeLeaseRegistry`, `emptyLeaseRegistry` on `AopKernel`
|
|
252
|
+
|
|
253
|
+
### Phase 5: Scope Expansion (FR-007)
|
|
254
|
+
|
|
255
|
+
- **T012** — Add `expandRunLeaseScope` to `RunLeaseService` (additive merge, ownership check, registry update)
|
|
256
|
+
- **T013** [P] — Add `expandRunLeaseScope` to `RunLeaseServicePort` and implement in `AopKernel`
|
|
257
|
+
|
|
258
|
+
### Phase 6: Supervisor Wiring
|
|
259
|
+
|
|
260
|
+
- **T014** [P] — Add `scope?: LeaseScopeDeclaration` to `FeatureInput` in `supervisor/types.ts`
|
|
261
|
+
- **T015** — Add `deriveRunScope()` to `RunCoordinator` (aggregate feature scopes; `null` if any unknown); wire to `acquireRunLease`
|
|
262
|
+
- **T016** — Add `expandScopesFromPlans()` to `RunCoordinator` (call `expandRunLeaseScope` after planning wave with plan's `affected_files`)
|
|
263
|
+
|
|
264
|
+
### Phase 7: New Test Files
|
|
265
|
+
|
|
266
|
+
- **T017** — Create `test/lease-scope-conflict-detector.spec.ts` — 26 unit tests covering all conflict matrix quadrants:
|
|
267
|
+
- `normalizePath` (4 tests: T-01→T-04)
|
|
268
|
+
- `pathsOverlap` (9 tests: T-05→T-13, including prefix/suffix false-positive guards)
|
|
269
|
+
- `planSectionsOverlap` (4 tests: T-14→T-17)
|
|
270
|
+
- `detectConflict` full matrix (9 tests: T-18→T-26, including `excludeRunId`)
|
|
271
|
+
- **T018** — Create `test/run-lease-service.spec.ts` — 20 integration tests with mocked port:
|
|
272
|
+
- Scope persistence (T-30→T-33)
|
|
273
|
+
- Parallel non-overlapping runs (T-34→T-35)
|
|
274
|
+
- Overlapping runs blocked (T-36→T-38)
|
|
275
|
+
- Conservative fallback (T-39→T-40)
|
|
276
|
+
- Stale takeover + scope replacement (T-41→T-42)
|
|
277
|
+
- `expandRunLeaseScope` (T-43→T-45)
|
|
278
|
+
- `renewRunLease` registry TTL update (T-46→T-47)
|
|
279
|
+
- `releaseRunLease` registry removal (T-48→T-49)
|
|
280
|
+
|
|
281
|
+
### Phase 8: Existing Test Updates
|
|
282
|
+
|
|
283
|
+
- **T019** [P] — `test/run-coordinator.spec.ts` — 2 scope-derivation tests
|
|
284
|
+
- **T020** [P] — `test/supervisor.spec.ts` — 1 `LEASE_SCOPE_CONFLICT` propagation test
|
|
285
|
+
- **T021** [P] — `test/kernel.spec.ts` — 2 registry round-trip tests
|
|
286
|
+
|
|
287
|
+
### Phase 9: Documentation
|
|
288
|
+
|
|
289
|
+
- **T022** [P] — Add Rule 19 (Lease Scope Semantics) to `docs/core/DOMAIN-LOGIC.md`
|
|
290
|
+
- **T023** [P] — Add Scope-Aware Lease Registry ADR to `docs/core/DECISIONS.md`
|
|
291
|
+
- **T024** — Append Entry 193 to `spec-files/progress.md` after all tests pass
|
|
292
|
+
|
|
293
|
+
### Task Dependency Graph
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
T001 (types)
|
|
297
|
+
├── T002 [P] (error code)
|
|
298
|
+
├── T003 [P] (path layout)
|
|
299
|
+
├── T004 (conflict detector)
|
|
300
|
+
│ └── T017 (detector unit tests)
|
|
301
|
+
├── T005 [P] (scope on snapshot)
|
|
302
|
+
└── T006 [P] (scope on AcquireInput + ExpandInput)
|
|
303
|
+
├── T007 (port interface)
|
|
304
|
+
│ ├── T008 (acquireRunLease)
|
|
305
|
+
│ │ ├── T009 [P] (releaseRunLease)
|
|
306
|
+
│ │ ├── T010 [P] (renewRunLease)
|
|
307
|
+
│ │ └── T018 (integration tests)
|
|
308
|
+
│ └── T011 (kernel port impl)
|
|
309
|
+
│ └── T021 (kernel tests)
|
|
310
|
+
└── T012 (expandRunLeaseScope service)
|
|
311
|
+
└── T013 [P] (port + kernel method)
|
|
312
|
+
├── T014 [P] (FeatureInput)
|
|
313
|
+
├── T015 (deriveRunScope)
|
|
314
|
+
│ ├── T019 (run-coordinator tests)
|
|
315
|
+
│ └── T020 [P] (supervisor tests)
|
|
316
|
+
└── T016 (expandScopesFromPlans)
|
|
317
|
+
|
|
318
|
+
T022 [P], T023 [P] (docs — independent)
|
|
319
|
+
T024 (progress.md — after all above)
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### MVP Cut
|
|
323
|
+
|
|
324
|
+
Complete **T001–T011 + T017** first. This delivers US1 + US2 (P1 stories) with full unit-test coverage and a passing typecheck before touching supervisor or expansion paths.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Observability
|
|
329
|
+
|
|
330
|
+
### Warning log on conflict
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
[run-lease] scope conflict: run run_123 blocked by run_456 on packages/auth/
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Structured error response
|
|
337
|
+
|
|
338
|
+
```json
|
|
339
|
+
{
|
|
340
|
+
"ok": false,
|
|
341
|
+
"error": {
|
|
342
|
+
"code": "lease_scope_conflict",
|
|
343
|
+
"message": "Lease acquisition deferred: scope overlaps with active run run_456",
|
|
344
|
+
"details": {
|
|
345
|
+
"incoming_scope": { "paths": ["packages/auth/"], "plan_section_ids": [] },
|
|
346
|
+
"blocking_run_id": "run_456",
|
|
347
|
+
"blocking_owner_instance_id": "supervisor:12345:abc",
|
|
348
|
+
"conflicting_scope_entry": "packages/auth/",
|
|
349
|
+
"retryable": true,
|
|
350
|
+
"requires_human": false
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Registry inspection
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
cat .aop/runtime/lease-registry.json | jq '.leases[] | {run_id, scope, lease_expires_at}'
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Edge Cases
|
|
365
|
+
|
|
366
|
+
- **Nested path prefixes**: `packages/` and `packages/auth/utils/` — prefix containment is detected; these conflict.
|
|
367
|
+
- **No false positive on similar names**: `src/` and `src-old/` do NOT overlap (trailing-slash normalization prevents this).
|
|
368
|
+
- **Scope expansion mid-run**: Expansion is additive; runs that started with `null` scope cannot become non-conflicting by expanding (initial acquisition is the binding decision).
|
|
369
|
+
- **Empty scope vs. unknown**: Explicitly `{ paths: [], plan_section_ids: [] }` (touches nothing) is distinct from `null` (unknown). Empty never conflicts; null always conflicts.
|
|
370
|
+
- **Simultaneous acquisition race**: Protected by `withIndexLock`; only one writer at a time.
|
|
371
|
+
- **Stale lease takeover**: Expired entries are pruned on every registry read; stale scope is replaced by new owner's scope.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Success Criteria
|
|
376
|
+
|
|
377
|
+
- **SC-001**: Two runs with non-overlapping scopes both reach active state within the same elapsed time as a single run — true parallelism with no artificial serialization.
|
|
378
|
+
- **SC-002**: Zero instances of concurrent lease holders with overlapping scopes in any test scenario.
|
|
379
|
+
- **SC-003**: A run with unknown/undeclared scope is never permitted to run concurrently with any other active run.
|
|
380
|
+
- **SC-004**: Declared scope is accurately reflected in the lease record immediately after acquisition and after any scope expansion.
|
|
381
|
+
- **SC-005**: Scope conflict detection adds negligible overhead to lease acquisition when zero competing leases exist.
|
|
382
|
+
- **SC-006**: Prefix-overlap blocking is correct in 100% of cases, including nested path relationships.
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Definition of Done
|
|
387
|
+
|
|
388
|
+
- [ ] `npm run typecheck` passes clean
|
|
389
|
+
- [ ] `npm run lint` passes with zero warnings (`--max-warnings 0`)
|
|
390
|
+
- [ ] `npm run test` passes at ≥90% lines / branches / functions / statements
|
|
391
|
+
- [ ] `lease-scope-conflict-detector.spec.ts` — all 26 tests pass (T-01→T-26)
|
|
392
|
+
- [ ] `run-lease-service.spec.ts` — all 20 tests pass (T-30→T-49)
|
|
393
|
+
- [ ] `run-coordinator.spec.ts` — 2 new scope tests passing
|
|
394
|
+
- [ ] `supervisor.spec.ts` — 1 new `LEASE_SCOPE_CONFLICT` propagation test passing
|
|
395
|
+
- [ ] `kernel.spec.ts` — 2 new registry round-trip tests passing
|
|
396
|
+
- [ ] `docs/core/DOMAIN-LOGIC.md` — Rule 19 added
|
|
397
|
+
- [ ] `docs/core/DECISIONS.md` — Scope-Aware Lease Registry ADR added
|
|
398
|
+
- [ ] `spec-files/progress.md` — Entry 193 appended with final test counts
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## Assumptions
|
|
403
|
+
|
|
404
|
+
- The codebase sections a run will touch are partially knowable before execution begins (derivable from the feature plan or spec file paths). Runs that genuinely cannot declare any scope use the conservative unknown-scope path.
|
|
405
|
+
- Path-prefix matching is sufficient for scope overlap detection; symbolic links and aliased paths are out of scope.
|
|
406
|
+
- Scope expansion is infrequent. Frequent mid-run expansion is not an expected pattern and does not need high-throughput optimization.
|
|
407
|
+
- The lease registry remains small (single-digit concurrent runs); exhaustive pairwise comparison is acceptable without an indexing strategy.
|
|
408
|
+
- Plan section identifiers are opaque strings; two identifiers overlap only if equal (no hierarchy between plan sections).
|