diff --git a/.claude/agent-memory/planner/MEMORY.md b/.claude/agent-memory/planner/MEMORY.md index 39cc9d4..e0b8b19 100644 --- a/.claude/agent-memory/planner/MEMORY.md +++ b/.claude/agent-memory/planner/MEMORY.md @@ -6,3 +6,4 @@ - [org-strip click-through bug: 3 render sites, not 1](project_org_strip_click_through_bug.md) — renderOrgStrip (dashboard), v_task_detail's inline org-strip, and #/graph's renderOrgGraphTopology all share the same no-click gap; DAG/log/artifact display mechanisms already exist and must be reused, not rebuilt; no new backend endpoint needed - [run-history click → missing run detail page](project_run_history_click_missing_detail_page.md) — gc_runs_list click only switches task selector, no #/runs/:run_id route exists (documented trade-off, not a bug regression); DAG-panel+log-viewer funcs are run-object-generic and reusable verbatim; backend needs one new by-run_id query since _work_nodes_for_run already exists keyed by run_id - [nav current-project-context PRD: consistent](project_nav_current_project_context_prd.md) — reviewed 2026-08-06, no contradictions; FR-5's "query-string parsing fix" is actually an add (render() has no query-string parsing today, only hash-path regex) — flag as accuracy issue at SDD stage, not a PRD contradiction +- [deploy_stage.py ConcurrentDeploymentError PRD: consistent](project_deploy_stage_concurrent_conflict_prd.md) — reviewed 2026-08-07, no contradictions; all facts (staged→candidate_starting transition, ux_deployment_active terminal set) verified against code diff --git a/.claude/agent-memory/planner/project_deploy_stage_concurrent_conflict_prd.md b/.claude/agent-memory/planner/project_deploy_stage_concurrent_conflict_prd.md new file mode 100644 index 0000000..c150b7f --- /dev/null +++ b/.claude/agent-memory/planner/project_deploy_stage_concurrent_conflict_prd.md @@ -0,0 +1,28 @@ +--- +name: deploy-stage-concurrent-conflict-prd +description: PRD for supervisor/deploy_stage.py ConcurrentDeploymentError (G1/G2) reviewed 2026-08-07 -- consistent, no contradictions found +metadata: + type: project +--- + +Reviewed the PRD "supervisor/deploy_stage.py 并发部署冲突的诊断化处理" (adds a named +`ConcurrentDeploymentError` with `git_commit_hash`/`blocking_deployment_id`/`blocking_status` +attributes, replacing the raw `sqlite3.IntegrityError` that currently escapes when +`ux_deployment_active` rejects a concurrent `INSERT`; also backfills regression tests for the +`rolled_back`/`blocked_pending_human` terminal-state release paths that +`test_only_one_non_terminal_deployment_allowed` doesn't cover). + +**Why:** verified against the real code (`supervisor/deploy_stage.py:143-201`, +`src/schema.py:305-306,332-333`, `supervisor/test_deploy_stage.py:171-180`) -- every factual claim +in the PRD's background/已知事实 section matches current code exactly, including the +staged→candidate_starting status transition sequencing and the exact set of terminal states +excluded by `ux_deployment_active` (`finalized`/`rolled_back`/`blocked_pending_human`, with +`health_check_failed`/`rollback_failed` explicitly and correctly called out as still non-terminal). +No self-contradiction found between Non-Goals (no return-value/CheckoutFailedError changes, no +app-level locking) and the FRs/ACs. + +**How to apply:** if this PRD or a follow-up SDD/task references G1/G2/G3 again, treat the facts as +re-verified as of 2026-08-07; re-check `stage_deployment()`'s try/except structure before trusting +this if it has been edited since. See also [[project_deploy_health_check_startup_timeout_comment_missing]] +and [[project_deploy_health_check_http_timeout_comment_missing]] for other Deploy Supervisor PRD +review history in this same area of the codebase.