Skip to content

Warn against a named extraction subagent (#2847) - #3629

Open
ayushcodes10 wants to merge 4 commits into
Graphify-Labs:v8from
ayushcodes10:fix-2847-no-name-subagent-guidance
Open

ayushcodes10 wants to merge 4 commits into
Graphify-Labs:v8from
ayushcodes10:fix-2847-no-name-subagent-guidance

Conversation

@ayushcodes10

Copy link
Copy Markdown
Contributor

Summary

Fixes #2847. graphify install replaces SKILL.md/references/ wholesale with no backup, so local skill edits are silently lost on every upgrade. The reporter kept having to re-add one specific rule they'd lost three capture agents to: spawn extraction subagents WITHOUT the name parameter.

Root cause

A named Agent call in Claude Code can turn the subagent into a teammate whose report is delivered only via SendMessage. When that return path is unavailable, the caller gets a bare idle notification carrying zero findings — indistinguishable from a chunk that was silently dropped. The orchestrator has no way to tell "this chunk returned nothing" from "this chunk was never extracted," and Part C's merge quietly proceeds with missing nodes. SKILL.md already warns against the analogous subagent_type="Explore" failure one line above where this guidance needs to live, but carried nothing about name.

Fix

Adds an explicit warning immediately after the existing "subagent type" note in Step B2, on every host that dispatches via the Claude Code Agent tool (the shared dispatch/agent-tool-disk.md fragment and its PowerShell counterpart — this covers claude, claw, and other Agent-tool hosts). Hosts with a structurally different dispatch mechanism (opencode's @mention, codex's AgentTask, kilo/trae's Task tool, devin/aider's inline subagent model) don't carry a name-vs-subagent_type concept at all and are correctly unaffected.

This issue's secondary suggestion (backing up SKILL.md on overwrite, or warning when local edits would be lost) is a separate, larger feature proposal and isn't addressed here — this PR is scoped to the one concrete rule the reporter asked to see shipped.

Test plan

  • New test_agent_tool_hosts_warn_against_a_named_subagent in tests/test_install.py, asserting every Agent-tool host (claude, claw) carries the warning in its Step B2 slot and names SendMessage as the failure mode.
  • Confirmed the existing test_claw_skill_uses_agent_tool_dispatch still passes unmodified.
  • python3 -m tools.skillgen --check / --audit-coverage / --monolith-roundtrip / --schema-singleton — all OK.
  • Full suite: python3 -m pytest -q — 5622 passed, 68 skipped, no regressions.

🤖 Generated with Claude Code

ayushcodes10 and others added 4 commits September 17, 2026 16:15
A named Agent call's report can return only through SendMessage. When
that return path is unavailable, the caller receives a bare idle
notification carrying zero findings, which looks identical to a
chunk that silently failed rather than one that was never spawned
that way at all. The orchestrator then has no way to tell "this
chunk returned nothing" from "this chunk was never extracted", and
Part C's merge quietly proceeds with missing nodes.

Step B2 now carries an explicit warning immediately after the
existing subagent type note, on every host that dispatches through
the Claude Code Agent tool, telling the agent to spawn every
extraction subagent without the name parameter.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Asserts every Agent tool host (claude, claw) carries the warning in
its Step B2 slot alongside the existing subagent type guidance, and
that it names SendMessage as the failure mode.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).


Graphify review — findings

Adds a "no name" warning to Step B2 of every /graphify skill variant, instructing that extraction subagents be spawned without the name parameter because a named Agent call's report can return only via SendMessage — when that path is unavailable the caller sees a bare idle notification with zero findings, indistinguishable from a silently failed chunk that lets Part C merge with missing nodes. Guards this with test_agent_tool_hosts_warn_against_a_named_subagent, which requires the warning and its SendMessage rationale in the B2 block of every Agent-tool host, and records it in the changelog.

No blocking issues surfaced. 4 lower-confidence candidates did not survive cross-model review.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 727 functions depend on the 727 functions this change touches.

Health — grade A; no new coupling hotspots.

Verification — 727 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 727 function(s) in the blast radius were not formally verified this run

Test selection

Test selection

286 of 286 test file(s) selected (100%) via static blast radius.

Escalated to a full run for safety — the selection is not trustworthy on its own (see below). CI should run the whole suite.

  • tests/test_affected_cli.py — full-run-safety
  • tests/test_affected_member_seed.py — full-run-safety
  • tests/test_agents_platform.py — full-run-safety
  • tests/test_analyze.py — full-run-safety
  • tests/test_anthropic_custom_endpoint.py — full-run-safety
  • tests/test_antigravity_install.py — full-run-safety
  • tests/test_apm_fallback_version.py — full-run-safety
  • tests/test_architecture_doc.py — full-run-safety
  • tests/test_astro_extraction.py — full-run-safety
  • tests/test_astro_import_ids.py — full-run-safety
  • tests/test_atomic_canvas_export.py — full-run-safety
  • tests/test_atomic_version_stamp.py — full-run-safety
  • tests/test_atomic_writes.py — full-run-safety
  • tests/test_backend_env_isolation.py — full-run-safety
  • tests/test_backend_extras.py — full-run-safety
  • tests/test_benchmark.py — full-run-safety
  • tests/test_benchmark_raw_graph.py — full-run-safety
  • tests/test_build.py — full-run-safety
  • tests/test_build_merge_dedup_scope.py — full-run-safety
  • tests/test_build_merge_hyperedges_and_prune.py — full-run-safety
  • tests/test_build_merge_shrink_guard.py — full-run-safety
  • tests/test_builtin_global_type_refs.py — full-run-safety
  • tests/test_cache.py — full-run-safety
  • tests/test_callflow_html.py — full-run-safety
  • tests/test_cargo_introspect.py — full-run-safety
  • tests/test_carried_hyperedge_remap.py — full-run-safety
  • tests/test_case_sensitive_resolution.py — full-run-safety
  • tests/test_charmap_encoding.py — full-run-safety
  • tests/test_chunking.py — full-run-safety
  • tests/test_cjs_module_extension.py — full-run-safety
  • tests/test_claude_cli_backend.py — full-run-safety
  • tests/test_claude_md.py — full-run-safety
  • tests/test_cli_broken_pipe.py — full-run-safety
  • tests/test_cli_export.py — full-run-safety
  • tests/test_cli_help.py — full-run-safety
  • tests/test_cluster.py — full-run-safety
  • tests/test_codebuddy.py — full-run-safety
  • tests/test_community_hub_labels.py — full-run-safety
  • tests/test_community_labels_skill.py — full-run-safety
  • tests/test_confidence.py — full-run-safety
  • tests/test_corrupt_graph_json.py — full-run-safety
  • tests/test_cpp_nested_and_cli.py — full-run-safety
  • tests/test_cpp_objc_cross_file_calls.py — full-run-safety
  • tests/test_cpp_preprocess.py — full-run-safety
  • tests/test_cross_extension_reexport_self_cycle.py — full-run-safety
  • tests/test_cross_language_call_resolution.py — full-run-safety
  • tests/test_cross_repo_external_call_guards.py — full-run-safety
  • tests/test_cross_repo_member_calls.py — full-run-safety
  • tests/test_cross_repo_shared_types.py — full-run-safety
  • tests/test_csharp_call_site_generic_args.py — full-run-safety
  • … and 236 more

non-code file(s) changed (CHANGELOG.md, graphify/skill-claw.md, graphify/skill-copilot.md, graphify/skill-kilo.md, graphify/skill-kiro.md …) → running the full suite for safety (a code graph can't see config/fixture/data deps)

changed code file(s) with no mapped test (CHANGELOG.md, graphify/skill-claw.md, graphify/skill-copilot.md, graphify/skill-kilo.md, graphify/skill-kiro.md …) — a coverage gap or a missing link — running the full suite rather than only the selected tests

Selection is safe under the controlled-regression assumption; always-run tests + a periodic full run are the backstops. Advisory — it never changes the check verdict.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ship the "spawn extraction subagents without name" warning in SKILL.md - local hand-edits are destroyed by graphify install

1 participant