• A merged graph's one run genuinely spans several org_nodes now (Planner/
    Coder/Validator all append their own nodes into the SAME run) -- a single
    run-level org_node column was never accurate once Phase 2b/2c landed, and
    real per-node ownership already lives in work_node_execution.subagent_type.
    
    Schema: work_graph_run.org_node column removed; ux_work_graph_run_active
    narrowed from UNIQUE(task_id, org_node) to UNIQUE(task_id) WHERE status
    NOT IN ('done', 'failed') -- 'blocked' now counts as active on purpose,
    since resuming a blocked run always appends into the same row rather than
    inserting a fresh one. New migrate_drop_work_graph_run_org_node() handles
    already-populated databases, wired into backend_server.py's startup path.
    
    Call sites updated: work_graph_plan.py/work_graph_fork.py/
    root_cause_trace.py's INSERTs; work_graph_run_query.py/task_query.py now
    return "org_nodes_involved" (derived from work_node_execution.subagent_type)
    instead of the removed single-value "org_node"; frontend/app.js's org-strip
    and run-list rendering updated to the list-based shape.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse File »

  • Closes the c_artifact_write gap U-011 flagged (03-C §3.7, unowned by any
    Unit despite REQ-02 needing it directly): src/artifact_write.py writes
    content to the target project, commits it to the target's own git history,
    validates depends_on_artifact_ids against existing rows before writing
    anything (REQ-02's failure case), creates the immutable artifact row.
    validation_status is set to 'passed' unconditionally -- noted as a real
    simplification (semantic content review, e.g. REQ-02's "PRD 里出现矛盾" boundary
    case, needs its own LLM-judgment step this codebase doesn't build yet).
    
    src/e2e_pipeline.py orchestrates architecture doc §11's MVP criteria 1-3:
    plan_documents() makes 4 real sequential Planner calls (BRD, then PRD
    referencing BRD, then SDD referencing PRD, then Benchmark referencing SDD),
    writing each via c_artifact_write with correct lineage. implement_code()
    calls Coder once, captures the resulting `git diff` as code_diff and the
    Coder's own response as test_report. validate_implementation() calls
    Validator once and parses an explicit 'VERDICT: PASS|FAIL|INCONCLUSIVE'
    line. run_end_to_end() chains create_task -> plan -> implement -> validate,
    using U-010's trigger_org_node_full only for task.status bookkeeping (a
    lightweight "confirm ready" call per phase) and plain org_node_trigger
    calls for actual content generation, since trigger_org_node_full's
    contract returns a status dict, not text.
    
    Real-verified: plan_documents ran for real against "实现贪吃蛇游戏" -- all 4
    documents produced, correctly lineaged, validation_status=passed, real
    content (>100 chars each), ~5m45s total for the 4 sequential calls.
    Deliberately NOT run for real: run_end_to_end's Coder/Validator half (real
    code generation + real test execution) is a different order of magnitude
    in cost/time/uncertainty than every other real call this session -- built
    and mock-tested, but not executed without checking first.
    
    19 new mocked stdlib unittest cases (4 for artifact_write, 5 for the
    pipeline orchestration, all real/unmocked for artifact_write since git
    operations are fast/free/local same as U-013's worktree tests) + 1 gated
    real test. 127 total mocked/real-local tests across U-001-014, all passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse File »