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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Reconcile Mainline Divergence Detection Fix + Dashboard Notification
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-03-23
|
|
4
|
+
**Status:** Approved
|
|
5
|
+
|
|
6
|
+
## Problem
|
|
7
|
+
|
|
8
|
+
Two issues with the current `repo.reconcile_mainline` tool:
|
|
9
|
+
|
|
10
|
+
1. **False-positive divergence detection.** `checkRemoteLocalDivergence()` in `git-reconciliation-service.ts` compares local and remote HEAD SHAs directly (`localHead !== remoteHead`). When local/main is ahead of origin/main (all remote commits exist locally), the check incorrectly reports divergence and the tool fails with `remote_local_divergence`. This blocks features unnecessarily.
|
|
11
|
+
|
|
12
|
+
2. **Silent failure on dashboard.** When `remote_local_divergence` occurs during an automated run, the error is logged to stderr by the tool runtime but never surfaces to the user. The `NotificationEvent` type does not include this error, no notification is emitted, and the feature does not transition to `BLOCKED`. The user sees nothing wrong on the dashboard.
|
|
13
|
+
|
|
14
|
+
## Design
|
|
15
|
+
|
|
16
|
+
### 1. Smarter divergence detection
|
|
17
|
+
|
|
18
|
+
**File:** `apps/control-plane/src/application/services/git-reconciliation-service.ts`
|
|
19
|
+
|
|
20
|
+
Replace the SHA comparison in `checkRemoteLocalDivergence()` with a `git merge-base --is-ancestor` check:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
git merge-base --is-ancestor origin/<baseRef> <baseRef>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- **Exit code 0** -> remote HEAD is an ancestor of local HEAD -> no divergence (local is ahead or equal)
|
|
27
|
+
- **Exit code 1** -> remote has commits that local does not -> true divergence
|
|
28
|
+
|
|
29
|
+
The existing return type `RemoteLocalDivergenceResult` (`{ diverged: boolean; local_head: string; remote_head: string }`) gains an additional `local_ahead: boolean` field so callers can distinguish "local ahead" from "identical". No downstream signature changes are required since both kernel call sites only inspect `diverged`.
|
|
30
|
+
|
|
31
|
+
**Logic:**
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
fetch origin <baseRef>
|
|
35
|
+
localHead = rev-parse <baseRef>
|
|
36
|
+
remoteResult = rev-parse origin/<baseRef>
|
|
37
|
+
|
|
38
|
+
# Preserve existing fallback: if remote ref fails to resolve, treat as no divergence
|
|
39
|
+
if remoteResult.code !== 0:
|
|
40
|
+
diverged = false, local_ahead = false, remoteHead = localHead
|
|
41
|
+
return early (skip merge-base call)
|
|
42
|
+
|
|
43
|
+
remoteHead = remoteResult.stdout
|
|
44
|
+
|
|
45
|
+
if localHead === remoteHead:
|
|
46
|
+
diverged = false, local_ahead = false
|
|
47
|
+
else:
|
|
48
|
+
is_ancestor = merge-base --is-ancestor origin/<baseRef> <baseRef>
|
|
49
|
+
if is_ancestor (exit 0):
|
|
50
|
+
diverged = false, local_ahead = true
|
|
51
|
+
else:
|
|
52
|
+
diverged = true, local_ahead = false
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Note:** `--is-ancestor` exit code 1 covers both "remote strictly ahead" and "bidirectional divergence" (both sides have unique commits). For this fix, both cases correctly produce `diverged: true`. If a future feature needs to distinguish these, the result type can be extended then.
|
|
56
|
+
|
|
57
|
+
### 2. New notification event
|
|
58
|
+
|
|
59
|
+
**File:** `apps/control-plane/src/application/services/notifier-service.ts`
|
|
60
|
+
|
|
61
|
+
- Add `'remote_local_divergence'` to the `NotificationEvent` union type.
|
|
62
|
+
- Add entry in `EVENT_PRIORITY`: `remote_local_divergence: 'critical'` (requires human action to resolve).
|
|
63
|
+
|
|
64
|
+
### 3. Feature blocked transition + notification
|
|
65
|
+
|
|
66
|
+
**File:** `apps/control-plane/src/supervisor/run-coordinator.ts`
|
|
67
|
+
|
|
68
|
+
**Error propagation context:** `ToolCaller.callTool()` returns `Promise<{ ok: true; data: TData }>` — it only returns successes. On failure, the runtime adapter throws an error. Currently, `prepareFeaturesForPhase()` (line 854) calls `callTool('orchestrator', TOOLS.REPO_RECONCILE_MAINLINE, ...)` with **no try/catch**, so a `remote_local_divergence` error crashes the entire feature eligibility loop.
|
|
69
|
+
|
|
70
|
+
**Fix:** Wrap the `callTool` for `REPO_RECONCILE_MAINLINE` in `prepareFeaturesForPhase()` in a try/catch:
|
|
71
|
+
|
|
72
|
+
1. **Catch the thrown error** and inspect its error code.
|
|
73
|
+
2. **If `remote_local_divergence`:** Patch the feature to `BLOCKED` status via `callTool('orchestrator', TOOLS.FEATURE_STATE_PATCH, ...)` with `status_reason` set to the divergence details.
|
|
74
|
+
3. **Emit the notification** via `this.notifier.notify('remote_local_divergence', ...)` with message: _"Local main diverges from origin/main for feature '<id>' — pull or sync remote changes to unblock."_
|
|
75
|
+
4. **Continue the loop** — other features in the same phase must still be processed. The caught feature is excluded from the eligible list.
|
|
76
|
+
5. **For non-divergence errors**, re-throw to preserve existing behavior.
|
|
77
|
+
|
|
78
|
+
The existing `notifyStatusTransitions()` method (line 945) will then also detect the BLOCKED transition and handle dashboard status cache updates. However, `notifyStatusTransitions` currently maps BLOCKED to either `collision_detected` or `gate_failed`. We update it to check for `status_reason` containing the divergence code and emit `remote_local_divergence` instead when appropriate.
|
|
79
|
+
|
|
80
|
+
This ensures:
|
|
81
|
+
|
|
82
|
+
- The dashboard triage panel shows the feature as blocked.
|
|
83
|
+
- Desktop/Slack/webhook notifications fire per the user's routing config.
|
|
84
|
+
- The user has a clear, actionable message explaining what to do.
|
|
85
|
+
- Other features in the same phase continue processing normally.
|
|
86
|
+
- The notifier's 5-minute throttle window deduplicates repeated errors for the same feature.
|
|
87
|
+
|
|
88
|
+
### 4. Tests
|
|
89
|
+
|
|
90
|
+
| Test | File | Description |
|
|
91
|
+
| --------------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
|
|
92
|
+
| Local-ahead returns no divergence | `git-reconciliation-service.spec.ts` | Mock `merge-base --is-ancestor` exit 0; assert `diverged: false, local_ahead: true` |
|
|
93
|
+
| True divergence still detected | `git-reconciliation-service.spec.ts` | Mock `merge-base --is-ancestor` exit 1; assert `diverged: true` |
|
|
94
|
+
| Identical SHAs short-circuit | `git-reconciliation-service.spec.ts` | Same local/remote SHA; assert `diverged: false, local_ahead: false`, no `merge-base` call |
|
|
95
|
+
| Remote ref resolution failure fallback | `git-reconciliation-service.spec.ts` | Mock `rev-parse origin/<base>` exit non-zero; assert `diverged: false`, no `merge-base` call |
|
|
96
|
+
| Notification event routes as critical | `notifier-service.spec.ts` | Assert `remote_local_divergence` maps to `critical` priority |
|
|
97
|
+
| Reconcile succeeds when local ahead | `kernel.coverage2.spec.ts` | Update existing divergence test to cover local-ahead scenario |
|
|
98
|
+
| Feature blocks on divergence error | `run-coordinator.spec.ts` | Assert `prepareFeaturesForPhase` catches thrown error, patches feature to BLOCKED, emits notification |
|
|
99
|
+
| Other features still processed after one divergence | `run-coordinator.spec.ts` | Assert that when one feature throws `remote_local_divergence`, remaining features in the loop are still evaluated |
|
|
100
|
+
|
|
101
|
+
### 5. Files changed
|
|
102
|
+
|
|
103
|
+
| File | Change |
|
|
104
|
+
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
105
|
+
| `apps/control-plane/src/application/services/git-reconciliation-service.ts` | Replace SHA comparison with `--is-ancestor` check; add `local_ahead` to result type |
|
|
106
|
+
| `apps/control-plane/src/application/services/notifier-service.ts` | Add `remote_local_divergence` event and `critical` priority mapping |
|
|
107
|
+
| `apps/control-plane/src/supervisor/run-coordinator.ts` | Add try/catch in `prepareFeaturesForPhase`, patch to BLOCKED, emit notification |
|
|
108
|
+
| `apps/control-plane/src/core/kernel.ts` | Verify — no changes needed, both call sites (lines 1060, 1267) only inspect `diverged` |
|
|
109
|
+
| `apps/control-plane/test/git-reconciliation-service.spec.ts` | Add local-ahead, identical SHA, and remote-ref-failure test cases |
|
|
110
|
+
| `apps/control-plane/test/notifier-service.spec.ts` | Add event routing test |
|
|
111
|
+
| `apps/control-plane/test/kernel.coverage2.spec.ts` | Update divergence test for local-ahead |
|
|
112
|
+
| `apps/control-plane/test/run-coordinator.spec.ts` | Add blocked transition, notification, and loop-continuation tests |
|
|
113
|
+
|
|
114
|
+
## Out of scope
|
|
115
|
+
|
|
116
|
+
- Automatic remote sync without user opt-in (the `--sync-remote auto` flag already exists for this).
|
|
117
|
+
- Dashboard UI changes beyond what the existing triage panel provides for BLOCKED features.
|
|
118
|
+
- Changes to `featureReadyToMerge` divergence check — it shares the same `checkRemoteLocalDivergence()` call, so the fix propagates automatically.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Design: Ordering Agent Spec Audit & Defect Fixes
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-03-28
|
|
4
|
+
**Status:** Applied
|
|
5
|
+
**Target:** `spec-files/outstanding/agentic_orchestrator_spec_ordering_agent_spec.md` (v1.1 → v1.2)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
Critical audit of the ordering agent spec (M54) against the actual codebase. Found 11 defects — 3 critical, 3 high, 5 moderate. All fixed in-place via targeted patches to preserve spec review history.
|
|
12
|
+
|
|
13
|
+
## Defects Found and Fixed
|
|
14
|
+
|
|
15
|
+
### Critical
|
|
16
|
+
|
|
17
|
+
| ID | Defect | Fix |
|
|
18
|
+
| :-- | :---------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
+
| D1 | Per-request `schedule()` interface vs batch backlog analysis — spec didn't clarify how the two-speed design works | Added §4.2 paragraph explaining batch sidecar → artifact → per-request adapter lookup separation |
|
|
20
|
+
| D2 | No terminal-state trigger — deferred features never re-evaluated when blocking deps merge | Added explicit `notifyNewRequestHint()` requirement on terminal transitions in §4.5; added artifact expiry backstop trigger |
|
|
21
|
+
| D3 | Artifact lifecycle underspecified — no atomic writes, staleness detection, or corruption handling | Added `completion_status`, `backlog_fingerprint`, `expires_at` fields; atomic write requirement; fallback conditions in §4.4 |
|
|
22
|
+
|
|
23
|
+
### High
|
|
24
|
+
|
|
25
|
+
| ID | Defect | Fix |
|
|
26
|
+
| :-- | :------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
27
|
+
| D4 | No JSON schema for ordering artifact | Added `organizer-ordering-artifact.schema.json` to §5 file targets |
|
|
28
|
+
| D5 | `concurrency_groups` undefined semantics and no consumer | Removed from artifact and ordering strategy; ready_set already serves concurrency purpose |
|
|
29
|
+
| D6 | Terminal states listed as `merged, deleted` — `deleted` doesn't exist in state machine | Replaced with actual `ENROLLMENT_TERMINAL_STATUSES`: `merged, failed, paused_budget, ready_to_merge` |
|
|
30
|
+
|
|
31
|
+
### Moderate
|
|
32
|
+
|
|
33
|
+
| ID | Defect | Fix |
|
|
34
|
+
| :-- | :-------------------------------------------------------------- | :----------------------------------------------------------------------------------------- |
|
|
35
|
+
| D7 | §7.2 reference inaccuracy — class name is in §3.1, not §7.2 | Corrected citation in §1 and §2.4 |
|
|
36
|
+
| D8 | Error handling underspecified for adapter fallback | Added 5 explicit fallback conditions with logging requirement in §4.4 |
|
|
37
|
+
| D9 | Intra-request dependency ordering undefined | Noted as addressed by batch sidecar design — sidecar sees all features across all requests |
|
|
38
|
+
| D10 | `PromptBundle` type and `prompt-bundle-loader.ts` not mentioned | Added both to §5 file targets |
|
|
39
|
+
| D11 | `SupervisorRuntimeState.organizerSessionId` not mentioned | Added to §5 file targets alongside `RuntimeSessionsSnapshot` |
|
|
40
|
+
|
|
41
|
+
## Additional Fixes (Same Session)
|
|
42
|
+
|
|
43
|
+
| Item | Description |
|
|
44
|
+
| :------------------------ | :----------------------------------------------------------------------------------------------- |
|
|
45
|
+
| `review-tab.spec.tsx:122` | Test expected `>Approve<` but component renders `Approve & Merge` — updated assertion |
|
|
46
|
+
| Divergence fix formatting | Verified all 5 implementation commits merged; remaining working tree changes are formatting-only |
|
|
47
|
+
|
|
48
|
+
## Approach
|
|
49
|
+
|
|
50
|
+
Targeted patch (Approach A) — fixed all defects in-place within the existing spec structure. The two-layer architecture (sidecar + adapter) is sound; defects were in missing details, incorrect references, and underspecified interactions.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Drop Zone File Loading & Provider-Specific Agent Optimization
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Two enhancements in one spec:
|
|
6
|
+
|
|
7
|
+
1. **Bulk drag-and-drop file loading** — extend the Launch Workspace UI with a full-page drop zone that accepts `.md` files and folders (recursively extracting `.md` files from folders)
|
|
8
|
+
2. **Provider-specific agent optimization** — a prompt overlay system that tailors agent behavior per provider (e.g., Claude's planner uses `/plan` mode, builders reference staged plan artifacts), plus an artifact stager that copies specs and plans into the builder's worktree
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
- Launch Workspace drop zone (frontend only — `packages/web-dashboard/`)
|
|
13
|
+
- Prompt overlay resolver (control plane — `cli-worker-provider.ts`)
|
|
14
|
+
- Artifact stager service (control plane — new service in `supervisor/`)
|
|
15
|
+
- Initial overlay files for Claude and Codex (planner + builder roles)
|
|
16
|
+
- `agents.yaml` schema update for `prompt_overlay_dir`
|
|
17
|
+
|
|
18
|
+
Out of scope: QA/reconciler/organizer overlays, push-to-remote behavior, provider capability flags.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Section 1: Drag-and-Drop File Loading
|
|
23
|
+
|
|
24
|
+
### Current State
|
|
25
|
+
|
|
26
|
+
The Launch Workspace (`packages/web-dashboard/src/app/launch/page.tsx`) supports click-to-upload multiple `.md` files via a hidden `<input type="file">`. Files are read as text and converted to draft cards with markdown content preserved. The existing `handleFileSelection(files: FileList)` function handles the conversion.
|
|
27
|
+
|
|
28
|
+
### Design
|
|
29
|
+
|
|
30
|
+
Add HTML5 drag-and-drop event handlers to the `LaunchPageContent` component's root element.
|
|
31
|
+
|
|
32
|
+
**Drop zone overlay:**
|
|
33
|
+
|
|
34
|
+
- Full-page overlay appears on `dragenter` event
|
|
35
|
+
- Semi-transparent green background with dashed border
|
|
36
|
+
- Existing content dims behind the overlay
|
|
37
|
+
- Overlay disappears on `dragleave` (with counter to handle child element events) or `drop`
|
|
38
|
+
- Prompt text: "Drop .md files or folders" with subtitle "Folders will be scanned for .md files"
|
|
39
|
+
|
|
40
|
+
**File handling on drop:**
|
|
41
|
+
|
|
42
|
+
- Direct `.md` files: read via `File.text()`, create draft via existing `createDraft(name, markdown, 'upload')` path
|
|
43
|
+
- Folders: use `DataTransferItem.webkitGetAsEntry()` to get `FileSystemDirectoryEntry`, then recursively walk with `createReader().readEntries()` collecting all `.md` files
|
|
44
|
+
- Non-`.md` files dropped directly (not inside a folder) trigger a status banner: "Skipped N non-markdown files"
|
|
45
|
+
- Non-`.md` files inside folders are silently skipped
|
|
46
|
+
- Status banner after processing: "Added N drafts from drop"
|
|
47
|
+
|
|
48
|
+
**Browser fallback:**
|
|
49
|
+
|
|
50
|
+
- If `webkitGetAsEntry()` is not available (rare — unsupported in some older Firefox builds), folders are ignored and a toast explains: "Folder drop not supported in this browser — use the Upload button instead"
|
|
51
|
+
- Individual `.md` file drops work in all modern browsers
|
|
52
|
+
|
|
53
|
+
**Utility extraction:**
|
|
54
|
+
|
|
55
|
+
- Extract folder traversal into a pure async function: `collectMarkdownFiles(entries: FileSystemEntry[]): Promise<File[]>`
|
|
56
|
+
- This function recursively walks directory entries and collects `.md` files
|
|
57
|
+
- Testable independently of DOM events
|
|
58
|
+
|
|
59
|
+
**State flow:**
|
|
60
|
+
All new drafts feed into the existing `setDrafts()` pipeline via `setState`, triggering the preview debounce automatically. No changes to the preview or submission APIs.
|
|
61
|
+
|
|
62
|
+
**New state:**
|
|
63
|
+
|
|
64
|
+
- `dragActive: boolean` — controls overlay visibility
|
|
65
|
+
- `dragCounter: number` — ref to handle nested `dragenter`/`dragleave` events (increment on enter, decrement on leave, show overlay when > 0)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Section 2: Prompt Overlay System
|
|
70
|
+
|
|
71
|
+
### Current State
|
|
72
|
+
|
|
73
|
+
Role prompts live in `config/agentic/orchestrator/prompts/` (e.g., `planner.system.md`, `builder.system.md`). They are provider-agnostic. `PromptBundleLoader` reads them from disk and caches them. The final prompt is assembled in `cli-worker-provider.ts`'s `buildWorkerPrompt()` function, which already has access to the provider name.
|
|
74
|
+
|
|
75
|
+
### Design
|
|
76
|
+
|
|
77
|
+
**New directory:** `config/agentic/orchestrator/prompts/overrides/`
|
|
78
|
+
|
|
79
|
+
**Naming convention:** `<role>.<provider>.md` — e.g.:
|
|
80
|
+
|
|
81
|
+
- `planner.claude.md`
|
|
82
|
+
- `builder.claude.md`
|
|
83
|
+
- `builder.codex.md`
|
|
84
|
+
- `planner.codex.md`
|
|
85
|
+
|
|
86
|
+
**Resolution location:** In `cli-worker-provider.ts`'s `buildWorkerPrompt()` function. This is where the provider name is already known and the system prompt is being assembled. This avoids changing the `PromptBundleLoader` interface (which would need per-role provider information it doesn't currently have, since different roles can use different providers via `role_provider_overrides`).
|
|
87
|
+
|
|
88
|
+
**Resolution logic:**
|
|
89
|
+
|
|
90
|
+
1. After loading the base system prompt, check if `<overlayDir>/<role>.<provider>.md` exists
|
|
91
|
+
2. If it exists, read the file and append to the base prompt with separator: `\n\n---\n\n## Provider-Specific Instructions\n\n<overlay content>`
|
|
92
|
+
3. If not, use the base prompt unchanged
|
|
93
|
+
4. Cache the resolved overlay per `(role, provider)` pair to avoid repeated disk reads
|
|
94
|
+
|
|
95
|
+
**`agents.yaml` schema change:**
|
|
96
|
+
Add an optional `prompt_overlay_dir` field under `runtime`:
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
runtime:
|
|
100
|
+
prompt_overlay_dir: config/agentic/orchestrator/prompts/overrides
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Default value: `config/agentic/orchestrator/prompts/overrides` (relative to repo root). If the directory doesn't exist, overlay resolution is silently skipped.
|
|
104
|
+
|
|
105
|
+
**Where the overlay dir config is read:**
|
|
106
|
+
The `cli-worker-provider.ts` receives the repo root and agents config through its constructor dependencies. It resolves the overlay directory path as `path.join(repoRoot, agentsConfig.runtime.prompt_overlay_dir ?? 'config/agentic/orchestrator/prompts/overrides')`.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Section 3: Artifact Staging for Builders
|
|
111
|
+
|
|
112
|
+
### Current State
|
|
113
|
+
|
|
114
|
+
In interactive mode, the builder works in a git worktree. The builder's prompt mentions on-disk files (`state.md`, `plan.md`, `plan.json`, `evidence/`) that live in `.aop/features/<id>/` in the main repo. The builder must navigate to these paths to read them.
|
|
115
|
+
|
|
116
|
+
### Design
|
|
117
|
+
|
|
118
|
+
**New service: `ArtifactStager`** — a small, focused service called by `build-wave-executor.ts` before dispatching the builder in interactive mode.
|
|
119
|
+
|
|
120
|
+
**What it copies into the worktree:**
|
|
121
|
+
|
|
122
|
+
| Source (canonical) | Destination (worktree) |
|
|
123
|
+
| --------------------------------------- | --------------------------------------------- |
|
|
124
|
+
| `.aop/features/<id>/spec.md` | `.aop/context/spec.md` |
|
|
125
|
+
| `.aop/features/<id>/plan.md` | `.aop/context/plan.md` |
|
|
126
|
+
| `.aop/features/<id>/plan.json` | `.aop/context/plan.json` |
|
|
127
|
+
| `.aop/features/<id>/qa_test_index.json` | `.aop/context/qa_test_index.json` (if exists) |
|
|
128
|
+
|
|
129
|
+
**Additional file created:**
|
|
130
|
+
|
|
131
|
+
- `.aop/context/README.md` — explains what each file is and that these are read-only copies staged for the builder's reference
|
|
132
|
+
|
|
133
|
+
**Lifecycle:**
|
|
134
|
+
|
|
135
|
+
1. `build-wave-executor.ts` calls `artifactStager.stage(featureId, worktreePath)` before dispatching the worker
|
|
136
|
+
2. Stager reads artifacts from canonical `.aop/features/<id>/` paths
|
|
137
|
+
3. Creates `.aop/context/` directory in worktree if it doesn't exist
|
|
138
|
+
4. Copies files (atomic: write to temp, rename)
|
|
139
|
+
5. After the builder finishes, no explicit cleanup — worktree cleanup handles it
|
|
140
|
+
|
|
141
|
+
**Deterministic mode:** Staging is skipped. The context bundle already includes the full plan/spec inline in the prompt.
|
|
142
|
+
|
|
143
|
+
**Builder prompt update:**
|
|
144
|
+
The on-disk file guidance in `buildInteractiveWorkerPrompt()` is updated to include the staged artifacts:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
.aop/context/spec.md — Original feature specification (read this first)
|
|
148
|
+
.aop/context/plan.md — Human-readable implementation plan
|
|
149
|
+
.aop/context/plan.json — Structured plan with tasks and acceptance criteria
|
|
150
|
+
.aop/context/qa_test_index.json — Test expectations (if available)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This replaces the current builder file guidance (which points to `.aop/features/<id>/` paths) with the simpler `.aop/context/` paths.
|
|
154
|
+
|
|
155
|
+
**Service interface:**
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
interface ArtifactStager {
|
|
159
|
+
stage(featureId: string, worktreePath: string): Promise<void>;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Dependencies: `repoRoot` (to resolve canonical paths), filesystem access. No kernel or state dependencies.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Section 4: Provider-Specific Prompt Content
|
|
168
|
+
|
|
169
|
+
### Initial Overlay Files
|
|
170
|
+
|
|
171
|
+
**`planner.claude.md`:**
|
|
172
|
+
|
|
173
|
+
- Instruct the planner to use Claude Code's `/plan` mode when formulating implementation plans
|
|
174
|
+
- Leverage extended thinking for complex architectural decisions
|
|
175
|
+
- Create a structured plan document that maps directly to the `PLAN_SUBMISSION` format
|
|
176
|
+
- Reference `.aop/context/spec.md` as the source of truth for requirements
|
|
177
|
+
|
|
178
|
+
**`planner.codex.md`:**
|
|
179
|
+
|
|
180
|
+
- Instruct the planner to use Codex's structured task decomposition model
|
|
181
|
+
- Emphasize file-level granularity in plan tasks (Codex works well with explicit file lists)
|
|
182
|
+
|
|
183
|
+
**`builder.claude.md`:**
|
|
184
|
+
|
|
185
|
+
- Instruct the builder to read `.aop/context/plan.md` and `.aop/context/plan.json` before starting work
|
|
186
|
+
- Treat the plan as a task checklist — work through tasks sequentially, committing after each
|
|
187
|
+
- Read `.aop/context/spec.md` to understand the "why" behind each task
|
|
188
|
+
- Use Claude Code's native file editing tools rather than emitting raw patches
|
|
189
|
+
- Acceptance criteria from the plan are the definition of done
|
|
190
|
+
|
|
191
|
+
**`builder.codex.md`:**
|
|
192
|
+
|
|
193
|
+
- Same artifact references (`.aop/context/` files)
|
|
194
|
+
- Use Codex's apply-patch model for changes
|
|
195
|
+
- Emphasize working within `allowed_areas` from the plan
|
|
196
|
+
|
|
197
|
+
**No overlays needed initially for:** QA, reconciler, organizer. These roles are already well-structured and provider-agnostic. Overlays can be added later if needed.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Section 5: Testing Strategy
|
|
202
|
+
|
|
203
|
+
### Drag-and-Drop (Frontend)
|
|
204
|
+
|
|
205
|
+
- **Unit test:** Extract `collectMarkdownFiles(entries)` into a testable utility. Test with mock `FileSystemEntry` objects: single `.md` file, nested folder with mixed files, empty folder, deeply nested `.md` files.
|
|
206
|
+
- **Manual test matrix:** Drag single `.md`, drag multiple `.md` files, drag folder with mixed files, drag non-`.md` file (should show skip banner), drag folder in browser without `webkitGetAsEntry()` support (should show fallback toast).
|
|
207
|
+
|
|
208
|
+
### Prompt Overlay Resolver
|
|
209
|
+
|
|
210
|
+
- **Unit test:** Given provider `claude` and role `builder`, resolves `prompts/overrides/builder.claude.md` and appends to base prompt after separator.
|
|
211
|
+
- **Unit test:** Given provider `codex` and role `builder` with no overlay file present, returns base prompt unchanged.
|
|
212
|
+
- **Unit test:** Overlay content is appended after `---\n\n## Provider-Specific Instructions\n\n` separator, not prepended.
|
|
213
|
+
- **Unit test:** Overlay resolution is cached — second call for same `(role, provider)` doesn't re-read disk.
|
|
214
|
+
- **Unit test:** Missing overlay directory doesn't cause errors (silently skipped).
|
|
215
|
+
|
|
216
|
+
### Artifact Stager
|
|
217
|
+
|
|
218
|
+
- **Unit test:** `stage(featureId, worktreePath)` copies expected files to `.aop/context/`.
|
|
219
|
+
- **Unit test:** Missing optional files (e.g., no `qa_test_index.json`) don't cause errors — only available files are copied.
|
|
220
|
+
- **Unit test:** `.aop/context/README.md` is created with descriptive content.
|
|
221
|
+
- **Unit test:** Staging is idempotent — calling twice overwrites cleanly.
|
|
222
|
+
|
|
223
|
+
### Schema Validation
|
|
224
|
+
|
|
225
|
+
- **Unit test:** `agents.yaml` with `prompt_overlay_dir` field validates against updated schema.
|
|
226
|
+
- **Unit test:** `agents.yaml` without `prompt_overlay_dir` field validates (field is optional, default applies).
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## File Map
|
|
231
|
+
|
|
232
|
+
### New Files
|
|
233
|
+
|
|
234
|
+
| File | Purpose |
|
|
235
|
+
| ----------------------------------------------------------------- | ----------------------------------------------------- |
|
|
236
|
+
| `packages/web-dashboard/src/lib/drop-zone-utils.ts` | `collectMarkdownFiles()` utility for folder traversal |
|
|
237
|
+
| `apps/control-plane/src/supervisor/artifact-stager.ts` | Copies spec/plan artifacts to builder worktree |
|
|
238
|
+
| `config/agentic/orchestrator/prompts/overrides/planner.claude.md` | Claude planner overlay |
|
|
239
|
+
| `config/agentic/orchestrator/prompts/overrides/planner.codex.md` | Codex planner overlay |
|
|
240
|
+
| `config/agentic/orchestrator/prompts/overrides/builder.claude.md` | Claude builder overlay |
|
|
241
|
+
| `config/agentic/orchestrator/prompts/overrides/builder.codex.md` | Codex builder overlay |
|
|
242
|
+
| `apps/control-plane/test/artifact-stager.spec.ts` | Artifact stager unit tests |
|
|
243
|
+
| `apps/control-plane/test/prompt-overlay.spec.ts` | Prompt overlay resolver unit tests |
|
|
244
|
+
|
|
245
|
+
### Modified Files
|
|
246
|
+
|
|
247
|
+
| File | Change |
|
|
248
|
+
| ---------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
249
|
+
| `packages/web-dashboard/src/app/launch/page.tsx` | Add drag-and-drop event handlers, drop zone overlay, `dragActive` state |
|
|
250
|
+
| `packages/web-dashboard/src/styles/dashboard.module.css` | Add `.dropZoneOverlay`, `.dropZoneActive` styles |
|
|
251
|
+
| `apps/control-plane/src/providers/cli-worker-provider.ts` | Add overlay resolution in `buildWorkerPrompt()`, update builder file guidance |
|
|
252
|
+
| `apps/control-plane/src/supervisor/build-wave-executor.ts` | Call `artifactStager.stage()` before builder dispatch in interactive mode |
|
|
253
|
+
| `config/agentic/orchestrator/agents.yaml` | Add optional `prompt_overlay_dir` field |
|
|
254
|
+
| `agentic/orchestrator/schemas/agents.schema.json` | Add `prompt_overlay_dir` property to runtime object |
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Merge Target: Feature Branch Mode — Design Spec
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-03-29
|
|
4
|
+
**Status:** Draft
|
|
5
|
+
**Scope:** Add a `merge_target` policy field that controls whether features merge directly to the base branch or to a new `aop/<feature-id>` branch for PR-based workflows.
|
|
6
|
+
|
|
7
|
+
## 1. Context
|
|
8
|
+
|
|
9
|
+
Currently, when a feature reaches `ready_to_merge`, the merge service always merges it directly into the configured base branch (e.g. `main`). This works for fully automated workflows but doesn't fit teams that want the tool to do the development work while keeping final integration under human control via pull requests.
|
|
10
|
+
|
|
11
|
+
This spec adds a `merge_target` policy field with two modes:
|
|
12
|
+
|
|
13
|
+
- `base_branch` (default): Current behavior — merge directly to main.
|
|
14
|
+
- `feature_branch`: Create a new `aop/<feature-id>` branch off main, merge the feature worktree into that branch. Main is untouched. The user can then push the branch and create a PR through their normal workflow.
|
|
15
|
+
|
|
16
|
+
## 2. Policy Configuration
|
|
17
|
+
|
|
18
|
+
### 2.1 New field: `merge_target`
|
|
19
|
+
|
|
20
|
+
Added to `merge_policy` in `policy.yaml`:
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
merge_policy:
|
|
24
|
+
require_user_approval: true
|
|
25
|
+
allowed_strategies:
|
|
26
|
+
- merge_commit
|
|
27
|
+
- squash
|
|
28
|
+
- rebase
|
|
29
|
+
merge_target: feature_branch # or "base_branch" (default)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2.2 Values
|
|
33
|
+
|
|
34
|
+
- **`base_branch`** (default): Merges directly to the configured `worktree.base_branch`. Current behavior, fully backward compatible.
|
|
35
|
+
- **`feature_branch`**: Creates a new branch `aop/<feature-id>` from the base branch head, then merges the feature worktree into that branch. The base branch is never checked out or modified.
|
|
36
|
+
|
|
37
|
+
### 2.3 Branch naming
|
|
38
|
+
|
|
39
|
+
Fixed convention: `aop/<feature-id>`. Not configurable.
|
|
40
|
+
|
|
41
|
+
## 3. Merge Service Changes
|
|
42
|
+
|
|
43
|
+
### 3.1 Current flow (merge_target: base_branch)
|
|
44
|
+
|
|
45
|
+
1. Stage and commit feature worktree changes
|
|
46
|
+
2. Verify feature branch has material changes
|
|
47
|
+
3. `git checkout <baseBranch>`
|
|
48
|
+
4. `git merge --no-ff <featureId>` (or squash/rebase variant)
|
|
49
|
+
5. Record merge SHA on base branch
|
|
50
|
+
6. Update status to MERGED
|
|
51
|
+
7. Cleanup (optional)
|
|
52
|
+
|
|
53
|
+
### 3.2 New flow (merge_target: feature_branch)
|
|
54
|
+
|
|
55
|
+
1. Stage and commit feature worktree changes (unchanged)
|
|
56
|
+
2. Verify feature branch has material changes (unchanged)
|
|
57
|
+
3. `git branch aop/<featureId> <baseBranch>` — create target branch from base branch head
|
|
58
|
+
4. `git checkout aop/<featureId>`
|
|
59
|
+
5. `git merge --no-ff <featureId>` (or squash/rebase variant) — merge into target branch
|
|
60
|
+
6. Record merge SHA on `aop/<featureId>`
|
|
61
|
+
7. Update status to MERGED
|
|
62
|
+
8. Cleanup — remove feature worktree and feature branch, but **preserve** `aop/<featureId>` (the deliverable)
|
|
63
|
+
|
|
64
|
+
### 3.3 Branch collision
|
|
65
|
+
|
|
66
|
+
If `aop/<featureId>` already exists (e.g. from a previous failed merge attempt), delete it before creating the new one. This is safe because the branch is a derived artifact, not user work.
|
|
67
|
+
|
|
68
|
+
### 3.4 Validation phases
|
|
69
|
+
|
|
70
|
+
All pre-merge validation is identical for both modes: gate checks, approval token verification, staging, committing. The only difference is which branch receives the merge.
|
|
71
|
+
|
|
72
|
+
### 3.5 Merge evidence
|
|
73
|
+
|
|
74
|
+
The merge evidence recorded after completion includes a `target_branch` field:
|
|
75
|
+
|
|
76
|
+
- `base_branch` mode: `target_branch` is the base branch name (e.g. `main`)
|
|
77
|
+
- `feature_branch` mode: `target_branch` is `aop/<featureId>`
|
|
78
|
+
|
|
79
|
+
### 3.6 Cleanup behavior
|
|
80
|
+
|
|
81
|
+
When `merge_target: feature_branch`:
|
|
82
|
+
|
|
83
|
+
- The feature worktree is removed (same as today)
|
|
84
|
+
- The feature branch (`<featureId>`) is deleted (same as today)
|
|
85
|
+
- The target branch (`aop/<featureId>`) is **NOT** deleted — the user needs it for their PR
|
|
86
|
+
|
|
87
|
+
## 4. Schema Changes
|
|
88
|
+
|
|
89
|
+
### 4.1 policy.schema.json
|
|
90
|
+
|
|
91
|
+
Add `merge_target` to the `merge_policy` object properties:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
"merge_target": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"enum": ["base_branch", "feature_branch"],
|
|
97
|
+
"description": "Where to land the merge. 'base_branch' merges directly to the base branch (e.g. main). 'feature_branch' creates an aop/<feature-id> branch off the base branch and merges there, leaving the base branch untouched."
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Not added to `required` — defaults to `base_branch` when omitted.
|
|
102
|
+
|
|
103
|
+
### 4.2 policy.user.schema.json
|
|
104
|
+
|
|
105
|
+
Add the same `merge_target` field to the user-facing schema so lean policy authors can set it.
|
|
106
|
+
|
|
107
|
+
### 4.3 policy.defaults.yaml
|
|
108
|
+
|
|
109
|
+
Add to the `merge_policy` section:
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
merge_policy:
|
|
113
|
+
merge_target: base_branch
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 5. Init Command Changes
|
|
117
|
+
|
|
118
|
+
Add `merge_target: base_branch` to both `generateLeanPolicyYaml()` and `generateFullPolicyYaml()` in the `merge_policy` block of `init-command-handler.ts`.
|
|
119
|
+
|
|
120
|
+
## 6. File Map
|
|
121
|
+
|
|
122
|
+
| File | Action | Description |
|
|
123
|
+
| :------------------------------------------------------------- | :------------ | :--------------------------------------- |
|
|
124
|
+
| `apps/control-plane/src/application/services/merge-service.ts` | Modify | Branch creation and merge target routing |
|
|
125
|
+
| `agentic/orchestrator/schemas/policy.schema.json` | Modify | Add `merge_target` enum |
|
|
126
|
+
| `agentic/orchestrator/schemas/policy.user.schema.json` | Modify | Add `merge_target` enum |
|
|
127
|
+
| `agentic/orchestrator/defaults/policy.defaults.yaml` | Modify | Add `merge_target: base_branch` |
|
|
128
|
+
| `apps/control-plane/src/cli/init-command-handler.ts` | Modify | Add `merge_target` to policy generators |
|
|
129
|
+
| `apps/control-plane/test/` (merge tests) | Modify/Create | Tests for feature_branch merge target |
|
|
130
|
+
|
|
131
|
+
## 7. Testing Strategy
|
|
132
|
+
|
|
133
|
+
### 7.1 Unit tests
|
|
134
|
+
|
|
135
|
+
1. GIVEN merge_target is base_branch WHEN feature merges THEN merges directly to main.
|
|
136
|
+
2. GIVEN merge_target is feature_branch WHEN feature merges THEN creates aop/<featureId> branch from main and merges there.
|
|
137
|
+
3. GIVEN merge_target is feature_branch WHEN merge completes THEN main is untouched.
|
|
138
|
+
4. GIVEN merge_target is feature_branch WHEN cleanup runs THEN aop/<featureId> branch is preserved.
|
|
139
|
+
5. GIVEN merge_target is feature_branch WHEN cleanup runs THEN feature worktree and feature branch are removed.
|
|
140
|
+
6. GIVEN merge_target omitted WHEN feature merges THEN defaults to base_branch behavior.
|
|
141
|
+
7. GIVEN merge_target is feature_branch with squash strategy WHEN feature merges THEN squash merge lands on aop/<featureId>.
|
|
142
|
+
|
|
143
|
+
### 7.2 Schema validation tests
|
|
144
|
+
|
|
145
|
+
Verify `merge_target` accepts `base_branch` and `feature_branch`, rejects invalid values.
|
|
146
|
+
|
|
147
|
+
## 8. Out of Scope
|
|
148
|
+
|
|
149
|
+
- Pushing the target branch to remote (user does this manually).
|
|
150
|
+
- Auto-creating PRs via SCM provider.
|
|
151
|
+
- Configurable branch naming patterns (fixed `aop/<feature-id>` convention).
|
|
152
|
+
- Changes to kernel.ts (policy is passed through to merge service).
|