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>