• Extends U-006's execute_work_graph in place (same controller, being
    completed, not a parallel module):
    - ClassifierBlockedError: raised when a response's permission_denials array
      has >=3 entries (03-C §3.5 says "3 consecutive or 20 cumulative" -- true
      cross-call cumulative tracking needs persistence U-013 doesn't provide
      yet, so this is a documented, conservative per-call approximation).
    - UsageLimitReachedError (carries quota_limit_type) + a new
      execute_work_graph_with_usage_limit_retry() implementing p_usage_limit_wait
      (04-P §4.4.1): 5->10->20->30min backoff (repeating at 30) for
      session/weekly quota hits, timeout after 8h/9d -> UsageLimitWaitTimeoutError;
      opus quota hits skip backoff and fail immediately (model-downgrade retry
      is a caller decision, not this function's). sleep/now are injectable so
      tests don't block on real waits.
    
    Retry operates at the whole-work-graph-call level, not per individual
    work_node_execution row -- U-013 (c_work_node_run, which actually owns that
    table) doesn't exist yet, so node-level quota tracking isn't attempted
    here; noted explicitly in development-plan.md rather than silently
    simplified.
    
    Also corrects the same class of Done-line overreach as U-009/U-010/U-011
    (4th occurrence): REQ-07's happy case literally asks for REQ-01~06 all
    passing end to end, which needs PH2 (Validator root-cause tracing, Org-level
    Loop, breakpoint recovery) -- U-012 only owns REQ-07's boundary/failure and
    REQ-14's happy case, which was already correctly scoped.
    
    23 new/changed mocked stdlib unittest cases (existing U-006 tests untouched
    and still passing -- subclassing WorkGraphExecuteError keeps them
    backward-compatible). 107 total mocked tests across U-001-012, all passing;
    both existing real-agent tests (U-006's reused spike, U-011's planner call)
    re-verified against the refactored code.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »
  • plan_work_graph(): real `claude --agent <org_node> -p` call, produces a
    graph_manifest (4 nodes for brd/prd/sdd/benchmark, dependency-chained
    sdd->prd->brd, each edge tagged zero_token/needs_judgment per 03-C §3.4),
    recorded as a work_graph_run row (status='planning' -- 04-P
    p_work_graph_execution start_state). Does not execute the plan or produce
    real artifacts -- 03-C §3.4 says so explicitly ("不执行,只规划").
    
    Real call surfaced a genuine, undocumented constraint: --json-schema is
    silently ignored when combined with --agent (structured_output never
    appears; the identity itself works fine -- the response referenced the
    migrated SOUL.md's own principle numbering). First attempt at this Unit
    failed against the real API for exactly this reason. Fixed by asking the
    model to fence its JSON and parsing it out of `result` instead
    (_extract_graph_manifest, tolerant of bare JSON / fenced blocks / an extra
    wrapper key). Documented centrally in 05-实施约束与依赖.md §5.4.1.1 since
    this will matter for any future Unit needing agent-identity + structured
    output together, not just this one.
    
    Also corrects the same class of Done-line overreach as U-009/U-010
    (development-plan.md claimed U-011 alone satisfies REQ-02's happy case,
    but c_work_graph_plan's own contract explicitly excludes execution) and
    flags a real, previously-invisible gap found while tracing REQ-02's actual
    dependencies: no Unit in development-plan.md's 43-unit breakdown owns
    c_artifact_write (03-C §3.7), despite REQ-02's happy AND failure cases both
    requiring it directly. Not fixed here -- noted for whichever Unit (U-012/
    U-013, most likely) needs it first.
    
    15 new mocked stdlib unittest cases + 1 gated real test (re-run and passing
    after the --json-schema fix). 98 total mocked tests across U-001-011, all
    passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »
  • trigger_org_node_full(): guards (TASK_NOT_READY -- wrong task.status or
    required artifacts not validation_status=passed; CONCURRENCY_LIMIT_REACHED
    -- only on the planner/queued transition, per 04-P's guard column;
    USAGE_LIMIT_REACHED -- detected from the underlying claude error text,
    best-effort against REQ-14's cited "hit your session limit" phrasing) then
    calls U-005's trigger_org_node for the real subprocess call, then advances
    task.status: queued->planning_brd_prd_sdd (planner), planning_brd_prd_sdd
    ->coding (coder, gated on brd/prd/sdd/benchmark all passed),
    coding->validating (validator, gated on code_diff/test_report both passed).
    
    Verified for real: all three Org Agents actually triggered in sequence
    (chained claude --agent calls, ~15s/~$0.15 total) with task.status
    advancing correctly at each step -- not just planner like U-004/U-005's
    tests, all three personas confirmed invokable.
    
    Also corrects two more development-plan.md issues found while scoping
    this Unit, same class as U-002/U-009/U-036:
    - U-010's Done line cited '架构文档 §11"手工调用验证"里程碑' -- that phrase
      doesn't exist in architecture doc §11 at all. The real source is 05
      §5.5's rollout step 2 ("手工调用验证...三个 Org Agent 分别可被触发"),
      whose "分别" (separately/respectively) is the load-bearing word: verify
      each CAN be triggered, not that a full artifact-validated chain runs
      end to end. That distinction is why this Unit's scope is exactly what
      got built -- not chasing planning_failed/coding_failed retries or
      validator PASS/FAIL routing, which need real Work Graph output (U-011+)
      or Org-level Loop routing (U-015/016, PH2) that don't exist yet.
    - Added an explicit scope note spelling out exactly which 3 transitions
      this Unit owns vs. which parts of p_org_task_lifecycle it deliberately
      doesn't touch, so nobody has to re-derive this from the code later.
    
    11 new mocked stdlib unittest cases + 1 gated real chained-trigger test.
    87 total mocked tests across U-001-010, all passing; the real test
    independently re-run and confirmed passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »
  • create_task(): validates goal_text/project_id/task_type (INVALID_PARAM per
    03-C §3.1), inserts the task row (status=queued, assigned_org_node=planner,
    loop_round=0 -- 04-P p_org_task_lifecycle start_state) plus a
    task_status_changed execution_event, both in one transaction (explicit
    rollback on failure between the two inserts, tested by dropping
    execution_event mid-call). c_project_create isn't reimplemented -- it's
    already complete in U-002 (project_scaffold.create_project).
    
    Corrects another Done-line overreach found while scoping this Unit:
    development-plan.md claimed U-009 alone satisfies all three REQ-01 cases
    (happy/boundary/failure), but the happy case ("依次触发 planner/coder/
    validator...task.status 按状态机正确流转") needs c_org_node_trigger's full
    implementation -- U-010's own Done criterion is almost that exact sentence,
    and U-009 doesn't depend on U-010 or even touch org-node triggering. Same
    class of issue as the U-002/U-036 corrections earlier this session (an
    SDD/plan line claiming more than the Unit's actual dependencies support),
    judged low-stakes enough (doesn't change what code to write, just when the
    REQ-01 happy case gets marked satisfied) to fix directly rather than stop
    and ask, per the graduated caution this session has been using. Boundary
    (concurrency limit doesn't block task *creation*, only later scheduling)
    and failure (INVALID_PARAM) are both fully real at U-009's scope and
    tested; happy completes cumulatively once U-010 lands.
    
    12 new stdlib unittest cases. 75 total across U-001-009, all passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »
  • Resolves the A-2 assumption with a real `claude --agent planner -p` call
    (--permission-mode auto, $0.05) against a deployed target project: the
    migrated identity comes through correctly, not the default assistant
    persona. Verdict is "部分成立" (partially confirmed), per the criterion
    development-plan.md's U-004 line pre-registered for exactly this outcome --
    Planner/Validator's SOUL.md migrated almost verbatim, but Coder's SOUL.md
    needed real rewriting: the original hardcoded a live Feishu Base API token
    (redacted, never committed), strongly bound its task-claiming to
    `lark-cli`/Base status vocabulary, and told itself to shell out
    `claude --dangerously-skip-permissions` (conflicts directly with 05
    §5.3.1's `auto`-mode decision). All three replaced with graphlemon's own
    task table / c_org_node_trigger / task.status vocabulary.
    
    Also resolves a second, higher-stakes conflict found while scoping this
    Unit: where does `.claude/agents/<org_node>.md` actually live? Architecture
    doc §13.1 says graphlemon's own platform repo; 03-C §3.3 and 05 §5.1 (both
    core SDD, not the architecture PRD) explicitly say the target project --
    matching how Claude Code's --agent flag actually discovers subagents
    (relative to invocation cwd). User confirmed 03-C/05 win. Resolved as two
    different files, not a contradiction: agents/<org_node>/SOUL.md (+
    validator/AGENTS.md) here is the canonical migrated source (01-M 1.9
    agent_profile.soul_file_path, a singleton with no target-project
    reference); src/agent_profile.py compiles that into the deployable
    .claude/agents/<org_node>.md and writes it into a target project via
    deploy_agent_definitions(). Does not reopen the U-002 correction from the
    previous commit -- .graphlemon/ scaffolding and agent deployment are
    different, non-conflicting concerns.
    
    validator's tools/disallowedTools frontmatter encodes qa/AGENTS.md's
    original workspace-permission contract (read-only on source, no git
    mutation commands) as actual Claude Code permissions instead of prose.
    
    14 new stdlib unittest cases (test_agent_profile.py, all real) + 1 gated
    real-agent test (test_agent_e2e.py, RUN_REAL_AGENT_E2E=1, mirrors
    graphloop's pattern per CLAUDE.md's Testing constraint -- this is the first
    Unit that actually shells out to `claude`, so this is also where that
    harness gets built, per the harness-ownership decision from the earlier
    "什么还需要" review). 41 total tests across U-001-004, all passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »
  • Implements c_project_create (03-C §3.0) as a plain function for U-007 to
    wire up later: idempotent by target_folder_path, creates .graphlemon/ +
    one init commit in an existing git repo, PATH_NOT_FOUND/PATH_NOT_WRITABLE/
    GIT_INIT_DECLINED per contract, never silently `git init`s (02-V §2.1).
    
    Also corrects a real SDD-vs-plan conflict found while scoping this Unit:
    development-plan.md's U-002 line cited architecture doc §7.3's directory
    tree (.claude/agents/, skills/, top-level runs/) as what to create inside
    a target project. But §13.1 (a later, confirmed decision) states those are
    graphlemon's own platform-repo assets (U-003 scope), and 01-M's own
    graphlemon_subdir_initialized field already points at §13.2, whose target-
    project tree is only .git/ + .graphlemon/ + the target's pre-existing
    src/. §7.3 predates the "target project is an independent code space"
    pivot and was superseded by it. Corrected development-plan.md,
    unit_matrix.json, CLAUDE.md, and 05-实施约束与依赖.md accordingly (user
    confirmed, 2026-07-31).
    
    23 stdlib unittest cases (src/test_schema.py + new src/test_project_scaffold.py),
    all passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »

  • Establishes the first commit for graphlemon before U-001 work begins:
    architecture/SDD docs (including the PH5 self-hosting design already
    folded into 01-M/03-C/04-P/mvcp-contract v1.7.0), the A-1 spike results,
    the graphloop-adapted supervisor/isolation utilities, PH3 wireframe
    prototypes (now cross-referenced from 02-V), and this session's
    development-plan review (U-024 dependency split, U-035 regression
    requirement, new U-004.5 e2e-harness unit, src/ directory convention).
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse Dir »