fix(spawn): forbid the Agent tool's name parameter at every voyage spawn site
akashic-intelligence lost /trekplan Phase 9 twice to reviewer agents that never returned. Reproduced here and measured: the cause is the Agent tool's `name` parameter, not the agent definitions. Passing `name` does not label a subagent - it changes its kind. The spawn is recorded as taskKind "in_process_teammate" (spawnDepth 0) instead of a real subagent (spawnDepth 1). A teammate's final assistant text is not a return value; it reaches the parent only if the teammate itself calls SendMessage(to: "main"). plan-critic and scope-guardian declare tools: [Read, Glob, Grep] - no SendMessage - so as teammates they are structurally incapable of returning, whatever the prompt says. Denominators: named 0/5 returned; named + explicit SendMessage 1/1; unnamed 3/3 (plan-critic and scope-guardian each returned full findings + the JSON block in ~110s). Model override 2/2 non-returning, so the override is not the variable. All 5 named agents produced correct final text in their transcripts - only delivery failed, and that output is recoverable on disk. The defect is a harness behaviour, so it is documented rather than silently worked around: docs/agent-return-channel-defect.md carries the mechanism, every denominator, the two broken queries that nearly became facts, the unmeasured cells, and a recommended working shape for consumers (use agents, drop `name`; do not fall back to inline review, which costs the dedup step). Prevention is pinned, TDD red->green: the four spawning commands each state the rule and name the mechanism, and doc-consistency derives the spawning set from the command files so the pin cannot go vacuous. Suite 1013 (1011/0/2), +5 from baseline 1008. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MfB5Ecp8vvGyou8uFGxBV
This commit is contained in:
parent
4b261db005
commit
f79c5f6606
6 changed files with 297 additions and 0 deletions
|
|
@ -507,6 +507,18 @@ is available, pass nothing — the reviewer scores the memory-alignment dimensio
|
|||
|
||||
Launch the `brief-reviewer` agent (foreground, blocking) with the prompt:
|
||||
|
||||
> **Never pass the Agent tool's `name` parameter — at this or any other spawn
|
||||
> site in this command.** `name` does not label a subagent, it changes its kind:
|
||||
> the spawn is recorded as `taskKind: "in_process_teammate"` (`spawnDepth: 0`)
|
||||
> instead of a subagent (`spawnDepth: 1`). A teammate's final assistant text is
|
||||
> not a return value — it reaches the orchestrator only if the teammate itself
|
||||
> calls `SendMessage(to: "main")`, and every agent in `agents/` declares a
|
||||
> `tools:` allowlist without SendMessage. The agent still runs and still
|
||||
> produces correct output; the result is simply never delivered, so the phase
|
||||
> presents as a hung agent that no re-prompting can revive. Measured
|
||||
> 2026-08-17: named 0/5 returned, unnamed 3/3. Mechanism, denominators, and the
|
||||
> on-disk recovery path: `docs/agent-return-channel-defect.md`.
|
||||
|
||||
> "Review this task brief for quality: `{PROJECT_DIR}/brief.md.draft`.
|
||||
> Check completeness, consistency, testability, scope clarity,
|
||||
> research-plan validity, and memory alignment. Report findings, verdict, and
|
||||
|
|
|
|||
|
|
@ -406,6 +406,18 @@ the quick-scan results.
|
|||
**All other modes:** Launch exploration agents **in parallel** (all in a single
|
||||
message). Use the specialized agents from the `agents/` directory.
|
||||
|
||||
> **Never pass the Agent tool's `name` parameter — at this or any other spawn
|
||||
> site in this command.** `name` does not label a subagent, it changes its kind:
|
||||
> the spawn is recorded as `taskKind: "in_process_teammate"` (`spawnDepth: 0`)
|
||||
> instead of a subagent (`spawnDepth: 1`). A teammate's final assistant text is
|
||||
> not a return value — it reaches the orchestrator only if the teammate itself
|
||||
> calls `SendMessage(to: "main")`, and every agent in `agents/` declares a
|
||||
> `tools:` allowlist without SendMessage. The agent still runs and still
|
||||
> produces correct output; the result is simply never delivered, so the phase
|
||||
> presents as a hung agent that no re-prompting can revive. Measured
|
||||
> 2026-08-17: named 0/5 returned, unnamed 3/3. Mechanism, denominators, and the
|
||||
> on-disk recovery path: `docs/agent-return-channel-defect.md`.
|
||||
|
||||
**All agents run for all codebase sizes.** Scale `maxTurns` by size (small: halved,
|
||||
medium: default, large: default) instead of dropping agents.
|
||||
|
||||
|
|
|
|||
|
|
@ -387,6 +387,18 @@ other agents — the value of Gemini is independence.
|
|||
|
||||
- Launch ALL selected agents **in parallel** in a single message
|
||||
- Use model: "opus" for all sub-agents (the orchestrator runs on Opus)
|
||||
- **Never pass the Agent tool's `name` parameter — at this or any other spawn
|
||||
site in this command.** `name` does not label a subagent, it changes its
|
||||
kind: the spawn is recorded as `taskKind: "in_process_teammate"`
|
||||
(`spawnDepth: 0`) instead of a subagent (`spawnDepth: 1`). A teammate's final
|
||||
assistant text is not a return value — it reaches the orchestrator only if
|
||||
the teammate itself calls `SendMessage(to: "main")`, and every agent in
|
||||
`agents/` declares a `tools:` allowlist without SendMessage. The agent still
|
||||
runs and still produces correct output; the result is simply never delivered,
|
||||
so the phase presents as a hung agent that no re-prompting can revive.
|
||||
Measured 2026-08-17: named 0/5 returned, unnamed 3/3. Mechanism,
|
||||
denominators, and the on-disk recovery path:
|
||||
`docs/agent-return-channel-defect.md`.
|
||||
- Scale maxTurns by codebase size for local agents (same as trekplan):
|
||||
small = halved, medium/large = default
|
||||
- convention-scanner: medium+ codebases only (50+ files)
|
||||
|
|
|
|||
|
|
@ -199,6 +199,18 @@ described in the rest of this phase.
|
|||
Launch two reviewer agents **in parallel** via the Agent tool — one
|
||||
message, multiple tool calls.
|
||||
|
||||
> **Never pass the Agent tool's `name` parameter — at this or any other spawn
|
||||
> site in this command.** `name` does not label a subagent, it changes its kind:
|
||||
> the spawn is recorded as `taskKind: "in_process_teammate"` (`spawnDepth: 0`)
|
||||
> instead of a subagent (`spawnDepth: 1`). A teammate's final assistant text is
|
||||
> not a return value — it reaches the orchestrator only if the teammate itself
|
||||
> calls `SendMessage(to: "main")`, and every agent in `agents/` declares a
|
||||
> `tools:` allowlist without SendMessage. The agent still runs and still
|
||||
> produces correct output; the result is simply never delivered, so the phase
|
||||
> presents as a hung agent that no re-prompting can revive. Measured
|
||||
> 2026-08-17: named 0/5 returned, unnamed 3/3. Mechanism, denominators, and the
|
||||
> on-disk recovery path: `docs/agent-return-channel-defect.md`.
|
||||
|
||||
Reviewers run independently. Do NOT pre-feed findings between them.
|
||||
|
||||
| Agent | Mode-gated | Purpose |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue