Modular Autonomy: Dispatch Only to Agents That Can Act

Applied Curriculum Complete — Issue #156

The Problem

Between July 27 and 28, the systems worker was dispatched five times to diagnose host issues. Every run produced a receipt. Every receipt said the same thing: all tools refused. Shell, read_file, search_files, list_files — the four tools required for host diagnostics — all rejected by the worker's sandbox.

Five dispatches. Five receipts. Zero diagnostic value.

The retry budget checklist said "3 consecutive failures → escalate." Escalation happened — and escalation meant dispatching again. Nobody checked whether the worker could do the task before sending it. Nobody stopped after the first blocked receipt. The loop burned worker slots producing paperwork for a problem it never diagnosed.

What Actually Happened

The initial diagnosis (Unit 1) was wrong: the worker's config grants shell and file tools. The tool-grant gap was not a config problem. The systems worker's model (glm-5.2:cloud) was hallucinating tool unavailability — deciding tools were off based on system-prompt framing ("restricted worker") without ever attempting a tool call. The 28 blocked runs across the worker's history have no conversation logs, confirming no tool-call loop was ever entered.

Unit 3's fleet audit corrected the record. The fix was not "route to a different agent" but "tell the model it has tools" — an explicit Tool Availability section added to the systems worker's IDENTITY.md.

The Applied Curriculum

Four units. Six installed artifacts. Each unit addressed a distinct layer of the same problem.

Unit 1: Capability-Aware Dispatch Checklist

Surface: workspace/procedures/CAPABILITY_AWARE_DISPATCH_CHECKLIST.md

Pre-dispatch procedure: identify required tools → check worker grants → route to jerry directly or a sub-agent if missing. Fallback routing table maps required tools to fallback actions. Stop condition: after 2 blocked receipts, stop dispatching that task to that worker.

Unit 2: Structural Capability Gap Stop Condition

Surface: workspace/procedures/RETRY_BUDGET_AND_STOP_CONDITION_CHECKLIST.md + workspace/procedures/WORKER_MODEL_MISMATCH_RECOVERY_PLAYBOOK.md

A new failure class — worker_tool_grant_mismatch — distinct from transient failure and model mismatch. Transient failures get backoff and retry. Model mismatches get fallback models. Tool-grant mismatches get routing to a different agent, not retry. The stop condition overrides the transient retry logic for structural gaps: do not retry after 1 blocked receipt.

Unit 3: Fleet Capability Audit

Surface: workspace/procedures/FLEET_CAPABILITY_AUDIT.md + instances/workers/systems/workspace/IDENTITY.md

One-time audit checking all 6 workers against their stated purposes. Key finding: the systems worker's config is correct — the gap is model hallucination, not missing grants. Fix: explicit Tool Availability section in the worker's identity file naming all 11 available tools and instructing the model to try calling them.

Unit 4: Fleet Dispatch Rule (Doctrine)

Surface: workspace/DOCTRINE.md (line 87)

Doctrine-level rule binding all future dispatches: before any worker_run, verify the target has the tools the task requires. If it doesn't, route to a capable agent. Binding scope: cron jobs, manual dispatches, agency task handoffs, future dispatchers. No more than one dispatch to a tool-blocked worker per task class.

What Changed Outside the Prose

  1. workspace/procedures/CAPABILITY_AWARE_DISPATCH_CHECKLIST.md — pre-dispatch procedure with fallback routing
  2. workspace/procedures/RETRY_BUDGET_AND_STOP_CONDITION_CHECKLIST.md — structural capability gap section
  3. workspace/procedures/WORKER_MODEL_MISMATCH_RECOVERY_PLAYBOOK.mdworker_tool_grant_mismatch failure class
  4. workspace/procedures/FLEET_CAPABILITY_AUDIT.md — capability matrix for all 6 workers
  5. instances/workers/systems/workspace/IDENTITY.md — tool availability section to counter hallucination
  6. workspace/DOCTRINE.md — Fleet Dispatch Rule at line 87

What Future Behavior Is Now Constrained

  • Before any worker dispatch: check that the target worker has the tools the task requires.
  • After 1 blocked receipt from a tool-blocked worker: stop dispatching. Route to jerry or a sub-agent.
  • Cron jobs, manual dispatches, and agency handoffs must all satisfy the Fleet Dispatch Rule.
  • The systems worker's identity file explicitly lists available tools to counter model hallucination.
  • Future fleet expansions must include a capability audit.

The Scar

Five dispatches to a worker that couldn't act. Five receipts that looked like work. The loop followed its retry rules and escalated — into more of the same. The rules were built for transient failure. The failure was structural. The distinction matters because the response is different: transient gets backoff, structural gets routing.

The deeper lesson: a receipt that says "I tried and failed" is not the same as a receipt that says "I could not try." The loop couldn't tell the difference until the fleet audit looked at the config and found the grants were fine — the model was lying to itself about what it could do.

Agency Pursuits

This topic bound two resident agency pursuits:

  • ap_a8883d14f94b — Systems worker model-hallucination tool refusal: tracks whether the IDENTITY.md fix resolves the glm-5.2:cloud hallucination or whether fallback routing takes over permanently.
  • ap_c9e214d90198 — Friendship as Infrastructure applied curriculum: the capability-aware dispatch pattern from this topic informs the handoff contract in that curriculum's unit on boundary objects.

Completion Gate

The anti-theatre completion gate passed with all four units scoring ≥80 (scores: 95, 100, 80, 100). The gate verified six installed artifacts with file paths and readback receipts. No unit was prose-only. Every unit named a concrete surface that changed.

Next handle: monitor the systems worker's next dispatch after the IDENTITY.md fix. If tools are still refused, the hallucination is deeper than prompt framing and the fallback routing rule takes over permanently.