• Implements docs/todo/dynamic-work-graph-design-skill-design.md. G already
    answered FR-2 (how to mark a parallel-eligible node group): no new field
    needed -- topological_layers() infers independence purely from
    depends_on/edges, so the new Skill's job is just "express real
    dependencies honestly, don't add fake ones."
    
    New Skill skills/design-dynamic-work-graph/SKILL.md: the node-boundary /
    zero_token-vs-needs_judgment / per-node self-contained task_prompt
    methodology, wired into agent_profile.py's FRONTMATTER for coder and
    validator (Planner's own doc-chain path is untouched -- FR-4 only names
    Coder/Validator).
    
    work_graph_plan.py: new _GENERIC_PROMPT_TEMPLATE + generic_node_prompt_builder(),
    used whenever org_node != 'planner'. Planner keeps its existing fixed
    brd/prd/sdd/benchmark/... chain (_PROMPT_TEMPLATE) completely unchanged --
    zero regression risk to the one real production planning path.
    
    Scoped per the requirements doc's non-goal #1 ("prove the mechanism works,
    don't cover every real scenario yet"): does NOT wire into
    e2e_pipeline.py::implement_code()'s existing single-node production path.
    New tests prove the mechanism itself: a Coder scenario that naturally
    splits into 3 independent modules produces a correctly-shaped
    graph_manifest, topological_layers() puts all three in one concurrent
    layer (ties E directly to G), and generic_node_prompt_builder drives it
    through run_graph() to completion.
    
    Full src suite (580 tests) passes with zero regressions.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse File »

  • Found running U-014's full real closed loop: the Validator gave an
    INCONCLUSIVE verdict and explicitly said it had no Bash tool, despite its
    frontmatter granting one. Isolated with a minimal test subagent: any
    "Bash(...)" scoped pattern (e.g. "Bash(git commit:*)") in a subagent's
    disallowedTools frontmatter field disables Bash *entirely*, not just that
    subcommand -- confirmed by comparing a disallowedTools=[Edit,Write] agent
    (Bash works) against one adding a single Bash(git commit:*) entry (Bash
    breaks completely). The CLI's own --disallowedTools flag documents this
    exact scoped syntax as supported; subagent frontmatter just doesn't honor
    it the same way, and nothing in the docs says so.
    
    Fixed agent_profile.py's validator FRONTMATTER to disallowedTools=
    [Edit, Write] only -- dropping the four Bash(git *) entries that were
    silently breaking test execution. The "don't commit/push/reset/clean"
    constraint now relies on the prose instruction already in the migrated
    AGENTS.md instead of a tool-level block that never actually worked; fixed
    that file's own (now-false) claim that it was enforced at the tool level,
    and documented the finding centrally in 05-实施约束与依赖.md §5.4.1.2 since
    it'll matter for any future agent definition, not just this one.
    
    Verified for real, redeployed: Bash now works for the actual Validator
    identity, Edit/Write remain correctly blocked.
    
    1 test fixed (was asserting the now-removed scoped pattern) + 1 new test
    (disallowedTools frontmatter must never contain "Bash(" again). 174 total
    across U-001-019, all passing.
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    bboonnee authored
     
    Browse File »
  • 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 File »