-
Adds the two Deploy Supervisor entities from 01-M §1.15/§1.16 (17 tables total): deployment (full 15-value blue-green state machine, per 01-M's own text rather than supervisor-auto-rollback-design.md §3's abbreviated summary table) and deploy_health_signal (append-only health/monitoring samples). ux_deployment_active enforces 01-M's "only one non-terminal deployment at a time" constraint via an expression-based unique index (CREATE UNIQUE INDEX ... ON deployment((1)) WHERE status NOT IN (...)) -- the same partial-unique-index idiom work_graph_run already uses, just with a constant instead of a real grouping column since there's exactly one graphlemon self-target. bug_record.root_cause_category's schema-level CHECK now accepts core_engine, but bug_record.py's own application-layer whitelist deliberately does not follow yet -- classifying a bug as core_engine is a file-path-based rule (05 §5.8), not something the Validator's existing 3-perspective judge_root_cause can produce, and wiring that classification + c_org_loop_route's routing is U-035's job. 392 tests green. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
c_task_create(U-009 已实现的 task_create.create_task())第一次接上 POST /api/tasks。c_bug_report_create 此前完全没有实现,新增 bug_record.create_bug_report() + POST /api/bug-reports。 发现并订正 03-C 一处输入契约遗漏:c_bug_report_create 的 input_contract 没写 project_id,但 execution_event.project_id 是 NOT NULL、bug_record 表自己没有 project_id 列可以在 related_task_id 留空时兜底推导,字面上无法满足约束——按 c_task_create 同款处理方式把 project_id 变成必填,03-C 已订正。 frontend/app.js 补上 #/goals/new、#/bugs/new 真实交互;控制台还没有 "当前项目"状态的正式载体(v_dashboard 是 U-025 才做),project_id 暂存 localStorage,v_project_setup 创建成功时写入。related_task_id 因为 c_task_list 未被任何 Unit 认领,简化成文本输入而非下拉,等 U-025 补上 任务列表后再换。提交成功后原型写的是跳转 v_task_detail,该页面也是 U-025 才建,暂时改成原页面内展示确认信息。 端到端冒烟时额外发现一个真 bug:create_bug_report() 原本没校验 project_id/related_task_id 是否存在,坏 project_id 会在 execution_event 插入时触发未捕获的 IntegrityError,请求直接 500——补了存在性校验, 改为干净的 INVALID_PARAM/400。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
judge_root_cause(): runs 3 perspective_fns (correctness/requirement- completeness/skill-defect, 04-P §4.3), requires >=2/3 agreement on a category or raises InconclusiveEscalateError with all raw judgments attached (REQ-04's failure case). trace_root_cause_test_failed() creates a brand-new bug_record on agreement; trace_root_cause_human_reported() field-completes an existing one instead (04-P's explicit distinction between the two origins, not a new record either way). c_bug_record_create (bug_record.py): validates root_cause_category against {planning, coder, skill_defect} -- core_engine deliberately excluded, matching U-001's schema CHECK constraint (PH5/U-034 scope). Known, deliberately-unenforced gap noted rather than guessed at: 03-C §3.10's "skill_defect requires creating a skill_iteration_suggestion" constraint can't be satisfied yet (skill_iteration.before/after_git_commit_sha are NOT NULL but don't exist until a real skill rewrite happens in U-018) -- REQ-04's three cases never exercise skill_defect, so nothing here needs it resolved yet. real_validator_perspective() builds a real claude --agent validator call framed from one of the three perspectives, parsing a CATEGORY:/DETAIL: response format. Also fixes a real diagnostic bug found investigating an unrelated failure: org_node_trigger.py/work_graph_plan.py/work_graph_execute.py's nonzero-exit error paths only included stderr in the raised exception, silently dropping stdout -- which is where a real `claude` failure's actual detail often lives. A real Coder call failed with exit 1 and empty stderr, giving zero diagnostic signal; fixed to include both streams (truncated). 18 new mocked stdlib unittest cases + 1 gated real test (3 real Validator perspective calls judging a deliberately-injected wall-collision bug, expecting agreement on root_cause_category=coder). 146 total mocked tests across U-001-015, all passing. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>