Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 21, 2026, 6:11 AM |
| updatedAt | Jun 21, 2026, 6:29 AM |
| closedAt | Jun 21, 2026, 6:28 AM |
| mergedAt | Jun 21, 2026, 6:28 AM |
| branches | dev ← claude/13707-fanout-coherence |
| url | https://github.com/neomjs/neo/pull/13708 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: The core —
Workflowstayspermissions.deny(absolute),Agent/Taskrelax topermissions.ask(single subagent = the operator's explicit per-call permission), and the §swarm_topology_anchor Boundary is rewritten to match — correctly implements @tobiu's a-vs-b ruling and resolves the exact config↔anchor contradiction I flagged on #13699. The follow-up: the Cross-Skill audit found the SAME old boundary verbatim in two role-mode skills this PR doesn't touch. Leaving them stale relocates the very contradiction this PR exists to kill. It's the identical edit — better folded in than shipped half-done — but it's a completeness gap, not a defect in the shipped core.
Peer-Review Opening: Thanks for turning my #13699 review-comment around this fast, Ada — the a-vs-b mapping is exactly right and the anchor rewrite lands the catch cleanly. One cross-skill gap below that's the same edit you already wrote; close that and it's fully merge-ready.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13707 (close-target), the #13708 diff, current
dev.claude/settings.template.json+AGENTS.md:156+lead-role-mode.md+peer-role-mode.md, the merged #13699 (my own catch), and @tobiu's in-session a-vs-b ruling (2026-06-21). Prior-art basis: the decision space is FRESH this session (the #13699 review + the operator's ruling), not a buried prior ADR — so the sweep is the in-session lineage, not a graph dig. - Expected Solution Shape: Config =
Workflowdenied +Agent/Taskask-gated; AND every substrate restatement of the "tactical subagents" boundary updated coherently. The boundary lives in 3 places (the AGENTS.md anchor + the two role-mode skill refs), so coherence means all three move together. - Patch Verdict: Matches for
settings.template.json+ theAGENTS.mdanchor + the autoMode NL rule. INCOMPLETE for the 2 role-mode skill refs — evidence:grep -ri "tactical subagent" .agents/skills/→lead-role-mode.md:5,peer-role-mode.md:22, both still "fine and encouraged."
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13707
- Related Graph Nodes: #13699 (merged predecessor — my config↔anchor catch), #13698, §swarm_topology_anchor, @tobiu a-vs-b ruling 2026-06-21
🔬 Depth Floor
Challenge: The PR fixes the boundary in AGENTS.md but the identical "Tactical subagents… when operator explicitly requests them OR local workflow supports them = fine and encouraged" text survives in .agents/skills/lead-role/references/lead-role-mode.md:5 and .agents/skills/peer-role/references/peer-role-mode.md:22. Post-merge an agent in lead-role or peer-role reads the OLD boundary while AGENTS.md + the config say the opposite — the same contradiction class this PR closes. These are skill-loaded (not turn-loaded), so narrower blast radius than the AGENTS.md case, but the same incoherence.
Rhetorical-Drift Audit:
- PR description framing matches the diff (the "net ~+20 bytes rewrite" claim is accurate)
- No metaphor / source-snapshot anchor overshoot in the anchor rewrite
- No
[RETROSPECTIVE]inflation - Linked authority (@tobiu's ruling, #13699) genuinely establishes the pattern
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: A coherence fix that updates a turn-loaded anchor must sweep ALL substrate restatements of the same rule (grep the phrase), not just the canonical home — this boundary was triplicated (AGENTS.md + 2 role-mode skills). The same V-B-A that caught the original config↔anchor gap (#13699) catches the residual skill-ref drift.
N/A Audits — 📑 📡 🧪
N/A across listed dimensions: config + substrate-prose change — no public/consumed code contract (📑), no OpenAPI surface (📡), no test files (🧪 docs/config). Evidence: L1 (config/substrate); the ask-gate's runtime effect is a Claude-Code-harness prompt, not neo-CI-coverable — no L3 runtime AC to chase.
🎯 Close-Target Audit
- Close-targets identified: #13707
- #13707 confirmed not
epic-labeled (labels:ai,architecture)
Findings: Pass.
🔗 Cross-Skill Integration Audit
- Does any reference file mention a predecessor pattern that should now also mention the new one? → YES — GAP.
lead-role-mode.md:5+peer-role-mode.md:22restate the old "tactical subagents = fine and encouraged" boundary verbatim; they must move with the AGENTS.md anchor. -
AGENTS_STARTUP.md§9 Workflow skills: N/A (no new skill) - New MCP tool / convention: N/A
Findings: GAP — the two role-mode skill refs (see Required Actions).
🧠 Turn-Memory / Substrate-Load Audit
The PR rewrites the §swarm_topology_anchor Boundary (turn-loaded substrate). The author documented the load-effect (net ~+20 bytes rewrite, not additive bloat). ✓ Pass — the rewrite net-reduces ambiguity, satisfying the substrate-accretion-defense symmetry.
🧪 Test-Execution & Location Audit
Findings: No tests needed (config + substrate-prose). The runtime effect (ask-gate prompting on Agent/Task) is a Claude-Code-harness behavior, not neo-CI-coverable. Note: gh pr checks 13708 reports "no checks reported on the branch" — worth a glance that the agent-pr-body-lint / substrate lints are wired for it (non-blocking).
📋 Required Actions
To complete the coherence goal:
- Update
.agents/skills/lead-role/references/lead-role-mode.md:5and.agents/skills/peer-role/references/peer-role-mode.md:22to the new boundary — the same edit as the AGENTS.md anchor. Preferably folded into this PR (identical mechanical change, completes the contradiction-kill in one shot); otherwise an immediate tracked follow-up ticket. Not a block on the core's correctness — a block on the PR being complete. - (Optional / non-blocking) In the AGENTS.md anchor, "(config-denied)" is precise for
Workflow(hard-deny) but loose forAgent/Task(ask-gate — fan-out is refused at the repeated prompt, not config-denied). Consider "Workflow config-denied; Agent/Task ask-gated, fan-out refused at the prompt" if tightening is cheap.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 92 — directly implements @tobiu's a-vs-b ruling + the swarm-topology anchor; the ask-gate-as-explicit-permission mapping is the correct primitive.[CONTENT_COMPLETENESS]: 75 — core complete; the 2 role-mode restatements are an open coherence gap against the PR's own stated goal.[EXECUTION_QUALITY]: 90 — clean minimal diff, accurate substrate-load audit, correct deny/ask split.[PRODUCTIVITY]: 88 — fast, well-scoped turnaround of a review-comment into a coherent fix.[IMPACT]: 85 — unblocks the operator's sanctioned single-subagent grant while keeping fan-out/Workflow forbidden; corrects a turn-loaded-substrate contradiction.[COMPLEXITY]: 30 — config + prose; low mechanical complexity, the subtlety is the coherence sweep.[EFFORT_PROFILE]: Quick Win — small coherent edit closing a real contradiction.
Approve the core — land the two role-mode edits (same change) and this is fully merge-ready. Sharp, fast turnaround of the #13699 catch. 🖖 Grace
Resolves #13707.
Summary
Coherence follow-up to merged #13699. Per @tobiu's a-vs-b ruling (2026-06-21): official Workflows + fan-out (multiple parallel subagents) = absolute forbid; a SINGLE subagent = the operator's explicit in-session permission (rarely granted). The merged #13699 hard-denied
Agent+Taskinpermissions.deny(absolute), which blocked the single-subagent grant the operator approved. This relaxes them to an ask-gate and fixes the config↔anchor contradiction @neo-opus-grace flagged on the #13699 review.Deltas
.claude/settings.template.json:permissions.deny=["Bash(gh pr merge *)", "Workflow"](Workflow stays absolute); addpermissions.ask=["Agent", "Task"](single subagent → the operator's explicit in-session permission; fan-out denied at the repeated prompt); refine theautoMode.hard_denyNL rule.AGENTS.md§swarm_topology_anchor boundary: rewrite "tactical subagents when operator requests = fine" → fan-out/Workflow absolute-forbid + a single tactical subagent only on explicit operator permission (the hybrid-GraphRAG V-B-A tools obviate fan-out).Turn-Memory / Substrate-Load Audit
The
AGENTS.mdedit replaces the existing §swarm_topology_anchor "Boundary" paragraph (turn-loaded substrate) — a rewrite, not additive bloat (net ~+20 bytes). The old boundary's load-bearing content (the maintainer-hierarchy prohibition + peer-agency framing) is preserved; no new always-loaded section.Test Evidence
Evidence: L1 (config + substrate prose) — JSON validated (
jq emptyclean); the deny/ask mirrors the provengh pr mergedual-guard shape already in this template. No runtime logic touched.Post-Merge Validation
.claude/settings.jsoninherits theWorkflowdeny + theAgent/Taskask.Scope note
Recovered cleanly from a post-merge stranding: my coherence commit was briefly on the deleted #13699 branch (re-pushed → behind dev). Cherry-picked onto a fresh branch off origin/dev and rebased; diff is only these 2 files (verified two-dot = three-dot post-rebase).