server-desktop-01/docs/orchestration-audit-prd.md

98 lines
6.7 KiB
Markdown
Raw Permalink Normal View History

# PRD — Deeper orchestration audit
**Status:** ready to run (new session) · **Created:** 2026-06-30
**Predecessor:** `docs/cc-tool-audit.md` (§ Addendum — orchestration audit)
**Note:** No issue tracker/remote on this repo, so this PRD lives as a doc. The
`/to-prd` "publish + `ready-for-agent` label" step was adapted to a file.
---
## Problem Statement
Sessions feel slow and over-spend on model cost. A prior audit
(`docs/cc-tool-audit.md`) traced this less to loaded tools/skills/hooks (all small)
and more to the **orchestrator-subagent delegation pattern**. A first-pass audit of
1,962 subagent transcripts found that **27% of subagents run on Opus**, the majority
of them doing mechanical file-edit/shell work that Haiku/Sonnet would handle faster
and cheaper. The CLAUDE.md "Session Orchestration" routing table is **advisory**
when an `Agent` spawn omits `model`, the subagent inherits the parent (Opus). The
rule also mandates delegation with **no minimum complexity threshold**, so trivial
one-line edits pay a full subagent prefill + sequential wait.
An interim fix is already applied (`CLAUDE_CODE_SUBAGENT_MODEL=haiku` in global
settings). What's missing is the **quantified evidence** needed to safely revise the
orchestration *instructions* across many CLAUDE.md files — not just the default model.
## Solution
A deeper, repeatable audit of the existing session transcripts that produces the
numbers to ground a **pilot** revision of the Session Orchestration rules on one
project, before any broad rollout. The audit answers: how often is the wrong model
chosen, is delegation itself wasteful for small tasks, and is work being decomposed
well before hand-off. Output is a short findings report + a proposed pilot rule diff.
## User Stories
1. As the operator, I want the subagent model distribution broken down per project, so that I can see which repos leak Opus most.
2. As the operator, I want the "file-edit/shell" subagent bucket split into *trivial* (12 calls, single file) vs *substantial* (multi-file, many calls), so that I can tell genuine Sonnet/Opus work from Haiku-appropriate work instead of relying on a coarse bucket.
3. As the operator, I want each subagent's spawn traced to whether its model was **explicitly passed** by the orchestrator or **inherited** from the parent, so that I can measure the routing-leak rate directly.
4. As the operator, I want a count of subagents that did near-zero work (01 tool calls, or returned trivially), so that I can quantify wasted delegations caused by the "no threshold" rule.
5. As the operator, I want to see how many orchestrator turns spawned a single subagent for a single small op (delegation that a direct op would beat on latency), so that I can justify a complexity threshold.
6. As the operator, I want parallelism measured — how often independent subagents were batched concurrently vs. spawned sequentially — so that I can see if decomposition exploits the parallel-batch guidance.
7. As the operator, I want examples of good and bad decomposition (a clean parallel batch vs. a needless single-op delegation), so that the pilot rule change is illustrated, not just asserted.
8. As the operator, I want the audit limited to delegation-heavy projects (cc-os, llf-schema, proxmox, philly-seo, ovh-prod), so that it runs on the relevant sample, not every repo.
9. As the operator, I want the interim `CLAUDE_CODE_SUBAGENT_MODEL=haiku` effect measurable in future sessions (a before/after marker), so that I can confirm the env var actually shifted the distribution.
10. As the operator, I want a proposed pilot diff to one project's "Session Orchestration" section (threshold + enforced routing + allow orienting reads), so that I can try it on a single repo and measure wall-clock/cost before rolling out.
11. As the operator, I want the audit scripted/repeatable (saved under the repo), so that I can re-run it after the pilot to compare.
## Implementation Decisions
- **Data source:** existing JSONL transcripts in `~/.claude/projects/*/` (main) and
`~/.claude/projects/*/<session-id>/subagents/agent-*.jsonl` (subagents). Model is in
each subagent message's `model` field; tool calls are `type:"tool_use"` blocks
(walk recursively). Project dir names start with `-` — use python `glob`, never
shell `find`/`ls`.
- **Trivial vs substantial classifier:** trivial = ≤2 tool calls and ≤1 distinct file
touched; substantial = otherwise. Tune threshold against spot-checked examples.
- **Inherited vs explicit model trace:** match parent `Agent` tool_use input (does it
carry a `model`/`subagent_type`?) to the child transcript via agent id, then compare
requested vs actual model. Where the parent omitted model and child==parent model,
classify as "inherited (leak)."
- **Parallelism metric:** within a main session, detect `Agent` tool_use blocks issued
in the same assistant turn (concurrent) vs separate turns (sequential).
- **Scope:** the 5 delegation-heavy projects above; report per-project and pooled.
- **Output:** append a "Deep audit" section to `docs/cc-tool-audit.md` (or a sibling
doc) with tables + 35 examples, plus a proposed pilot rule diff for ONE project.
- **No production change** beyond the already-applied env var until the pilot is
reviewed.
## Testing Decisions
- This is an analysis task, not a shipped feature — "tests" = sanity checks on the
parser: total subagent count matches the prior audit (~1,962 with a model), model
totals reconcile, and the trivial/substantial split sums to the file-edit bucket.
- Spot-verify the classifier on 5 hand-read transcripts (one per project) before
trusting the aggregate.
- Re-run the same script post-pilot to confirm the distribution shifted (regression
baseline = today's numbers).
## Out of Scope
- Editing every CLAUDE.md (this is assessment → single-project pilot only).
- Changing tool/skill/hook config (prior audit showed negligible payoff).
- Building any new tooling, MCP, or harness changes.
- Touching the live orchestration behavior beyond the env var already set.
## Further Notes
- Interim change already live: `env.CLAUDE_CODE_SUBAGENT_MODEL=haiku` in
`~/.claude/settings.json` (applies to sessions launched after 2026-06-30).
- Prior-audit baseline to beat: Opus 26.6% / Sonnet 36.7% / Haiku 36.5% of subagents;
Opus subagents 53% file-edit/shell.
- Reusable scratch scripts from the first pass:
`/tmp/claude-1000/.../scratchpad/{full,cat,orch}.py` (ephemeral — recreate or
promote into the repo when running the deep audit).
- Open instruction-design questions for the pilot: where to set the complexity
threshold; whether to allow N orienting reads before delegating; how to phrase
"always pass model on spawn" given the env var now provides a cheap default.