cc-os/docs/orchestration-audit/auditor-reports/S7-report.md

248 lines
15 KiB
Markdown
Raw Permalink Normal View History

# Audit Report: Session 3771b288 (~/servers ops work)
**Date:** 2026-07-06
**Session:** 3771b288-eb9d-4398-9e75-e1ff0ba6af03
**Project:** /home/jared/servers (ops/infrastructure)
**Duration:** 16:05:40 to 17:14:47 UTC (69 min)
**Turns:** 144 assistant turns, 11 human prompts
**Policy Audited:** ORCHESTRATION.md (global rollout 2026-07-04)
---
## SEVEN-QUESTION RUBRIC VERDICTS
### 1. Are subagents getting called when they should be?
**Verdict:** MIXED
**Evidence:**
- Lines 241, 243, 245: Three Explore agents spawned for read-only discovery tasks:
- Line 241: Explore ovh-prod service setup conventions (2282 chars prompt)
- Line 243: Explore desktop backup bug specifics (2725 chars prompt)
- Line 245: Explore proxmox VM 101 and umbrella structure (2126 chars prompt)
- Explores are appropriate for their scope (file discovery, grep, schema extraction)
- Pattern: Orchestrator conducted 32 pre-spawn Bash commands + 4 Reads (74KB total) **before** delegating to agents
**Concern:**
Lines 1-240 show orchestrator performing extensive diagnostic work itself:
- 32 Bash commands: grep across servers for n8n, systemctl status checks, journalctl log inspection, SSH diagnostics to ovh-prod
- 4 Reads: project memory, n8n config, spec files, services inventory
- This exploratory work (grep, find, systemctl, journalctl, ssh) is exactly what Explore agents are designed to do
The orchestrator briefed three agents with comprehensive prompts (2.22.7 KB each), suggesting it already understood the context. This is valid if the pre-spawn diagnostics were necessary to formulate good agent prompts, but it shifts exploratory token cost into the orchestrator's session window rather than the agent's. The policy allows "A short orienting Read before delegating is fine" — but 32 Bash + 4 Read is beyond "orienting."
**Missed Delegation Trigger:**
"When orchestrator must diagnose a multi-faceted situation across multiple machines/services, spawn Explore agents early with open-ended discovery prompts rather than conducting detailed diagnostics in-session first, unless the diagnostics are sub-1-minute or ≤2 tool calls."
---
### 2. Is the correct model chosen per subagent — highest reasonable quality at lowest cost?
**Verdict:** FAIL
**Evidence:**
- Line 241: `"model": null` (ABSENT), resolved to `claude-haiku-4-5-20251001`
- Line 243: `"model": null` (ABSENT), resolved to `claude-haiku-4-5-20251001`
- Line 245: `"model": null` (ABSENT), resolved to `claude-haiku-4-5-20251001`
**Policy Violation:**
ORCHESTRATION.md states: "Every `Agent` spawn passes `model` explicitly. Default `haiku` for mechanical file-edit/shell work; `sonnet` for anything requiring judgment; `opus` only for genuinely hard reasoning."
All three spawns violate this by omitting the `model` parameter entirely. The model resolved to haiku via the Explore agent's own default, not via explicit orchestrator choice.
**Assessment of Haiku as the Actual Choice:**
- All three tasks are read-only discovery (appropriate for haiku)
- Tasks: (1) schema extraction from ovh-prod docs, (2) file location and diagnostics from desktop, (3) directory structure and grep across umbrella project
- None require judgment-layer reasoning (schema extraction is mechanical; file discovery is mechanical; structure understanding is verification, not judgment)
- **Haiku is the correct choice**, but the policy requires the orchestrator to **state it explicitly**, not rely on agent defaults
**Missed Enforcement Trigger:**
"Every Agent() call must include `model: "haiku"` (or sonnet/opus) as an explicit parameter, even when the default matches the intended choice."
---
### 3. Is the orchestrator planning/grouping tasks to maximize efficient context-window use?
**Verdict:** PASS
**Evidence:**
- Lines 294+: Single `ExitPlanMode()` call with detailed plan covering three distinct domains:
- Part 1: Fix desktop bug 1 (notify_backup.rb bare command → full path)
- Part 2: Fix desktop bug 2 (systemd-inhibit fallback on polkit auth failure)
- Part 3: Stand up proxmox-ubuntu project scaffold
- Part 4: Record deferred items (ovh-prod cron instrumentation, n8n on proxmox)
- Plan synthesis: Root cause analysis grouped related bugs (two desktop bugs from single diagnosis session) and separated them from unrelated work (proxmox project, ovh-prod deferral)
- Three agents spawned in parallel (line 241245 are sequential calls but agents run async) to explore three independent domains, avoiding redundant reads
- After agents return, orchestrator executes plan in correct sequence (fixes before scaffolding, deferred items recorded separately)
**Task Grouping Logic:**
The plan efficiently batches work by separating:
- Immediate fixes (desktop bugs) — quick, specific file edits
- Project scaffolding (proxmox-ubuntu) — multi-file writes, template-driven
- Deferred tracking (incidents log, roadmap) — documentation updates
This avoids interleaving unrelated work and keeps context coherent.
---
### 4. Is the orchestrator avoiding reading files it does NOT need (that the subagent would read anyway)?
**Verdict:** FAIL
**Evidence:**
- Pre-spawn (lines 1240): Orchestrator reads `/home/jared/.n8n_instances.yml`, `/home/jared/servers/desktop/docs/superpowers/specs/2026-05-07-n8n-backup-monitor-design.md`, grepped `/home/jared/servers/ovh-prod/docs/services-inventory.md`
- Line 241 Explore prompt explicitly lists "Read `/home/jared/servers/ovh-prod/docs/services-inventory.md`" as one of the items for the agent to read
- Line 243 Explore prompt asks the agent to "Read `/home/jared/.local/bin/backup.sh` in full"
**Overlap Found:**
- Orchestrator read parts of `services-inventory.md` (grep for n8n entries) before delegating Explore task that would read the entire file
- Orchestrator examined `backup.sh` in-session (Bash cat command) before delegating agent to read it fully
This is redundant reading — the orchestrator read files that the Explore agents would subsequently read. The files were read to formulate the agent prompts, but the prompt content shows the agents were asked to read the same files independently.
**Missed Efficiency Trigger:**
"If an orchestrator prompt to an Explore agent lists 'Read file X' as a task, don't Read file X in-session first — let the agent do it and summarize findings back."
---
### 5. Is the orchestrator sharing too much context with subagents (filling their windows / clouding judgment)?
**Verdict:** PASS
**Evidence:**
- Line 241 prompt: 2282 chars (~570 tokens) — substantial but focused
- Line 243 prompt: 2725 chars (~680 tokens) — includes detailed diagnosis context (symptom, root cause, diagnosis result) from pre-spawn work
- Line 245 prompt: 2126 chars (~530 tokens) — structured multi-part discovery task
Each prompt is well-bounded and task-oriented:
- Prompt 1: "Read these 12 specific files in ovh-prod and summarize the step-by-step pattern"
- Prompt 2: "Given the diagnosis in incidents.md (which I've already logged), find the exact lines in backup.sh and systemd files that implement the two bugs"
- Prompt 3: "Read umbrella CLAUDE.md, proxmox-hermes template, grep for ubuntu-server references, check ~/.ssh/config"
None of these prompts dump the orchestrator's entire diagnostic session (which would have been 10+ KB of systemctl output, logs, ssh diagnostics). They're filtered to task-relevant context.
**Context Quality:**
Prompts are specific enough to give agents clear direction without forcing them through the orchestrator's entire reasoning path.
---
### 6. Is the orchestrator even following the ORCHESTRATION.md instructions?
**Verdict:** FAIL (Model param explicitly required)
**Evidence:**
- Policy: "Every `Agent` spawn passes `model` explicitly."
- Observation: All 3 Agent spawns (lines 241, 243, 245) have `"model": null` (parameter omitted entirely)
- Fact-sheet confirms: "model param | (ABSENT)" for all three rows
- Fallback resolution: Explore agent's own default (haiku) was used instead of orchestrator choice
**Additional Compliance Check:**
- Policy says haiku default is for "mechanical file-edit/shell work" — Explores are read-only, mechanical, haiku is correct
- Policy does NOT say orchestrators can omit the model param if they think the default is right; it explicitly requires the param be passed
**Secondary Issue (Model Param, Not Violation But Efficiency Concern):**
- The 32 pre-spawn Bash commands + diagnostics should have been minimal; orchestrator appears to have over-briefed itself before delegating
---
### 7. Is the orchestrator requesting/receiving back only the context it needs, rather than a full context dump from the subagent?
**Verdict:** PASS
**Evidence:**
- Line 241 result: 7537 chars (~1884 tokens) — summary of ovh-prod structure, step-by-step pattern, file inventories
- Line 243 result: 3562 chars (~890 tokens) — exact line numbers, code snippets for bugs, analysis of failures
- Line 245 result: 4776 chars (~1194 tokens) — umbrella context, proxmox-hermes template, umbrella file inventory, VM 101 references
Results are task-focused summaries, not dumps:
- Agent 1 returned pattern + inventory, not full file contents of 12 files
- Agent 2 returned bug locations + explanations, not raw logs/journalctl output
- Agent 3 returned references + template structure, not entire directory trees
After agents return, orchestrator synthesizes results into a plan (line 294) without re-reading files, indicating the agent summaries were sufficient.
---
## SUMMARY TABLE
| # | Verdict | Issue | Severity |
|---|---------|-------|----------|
| 1 | MIXED | Pre-spawn diagnostics could have been delegated to Explore; 32 Bash + 4 Read in-session | Medium |
| 2 | **FAIL** | **All 3 Agent spawns omit `model` param; policy requires explicit param** | High |
| 3 | PASS | Plan synthesis and task grouping are efficient | — |
| 4 | FAIL | Orchestrator read files before delegating Explore agents to read the same files | Medium |
| 5 | PASS | Prompt context is focused and bounded, not excessive | — |
| 6 | **FAIL** | **Model param violation = ORCHESTRATION.md non-compliance** | High |
| 7 | PASS | Subagent results are summaries, not full dumps | — |
---
## MISSED DELEGATION CANDIDATES
### Write x5 (lines 345353)
**Files written:**
1. `/home/jared/servers/proxmox-ubuntu/CLAUDE.md`
2. `/home/jared/servers/proxmox-ubuntu/README.md`
3. `/home/jared/servers/proxmox-ubuntu/docs/services-inventory.md`
4. `/home/jared/servers/proxmox-ubuntu/docs/roadmap.md`
5. `/home/jared/servers/ovh-prod/docs/incidents.md`
**Content pattern:** Multi-file project scaffold + incident logging, drawing on Explore agent summaries
**Judgment involved:** Yes — each file cross-references ovh-prod patterns, templates from proxmox-hermes, and specific decisions about what to defer (n8n, ovh-prod cron instrumentation)
**Delegation assessment:** Technically a "spans many files" candidate per policy, but:
- Files are contextually dependent (CLAUDE.md references README references services-inventory)
- This is plan **execution**, not exploration — orchestrator is synthesizing Explore results into a single coherent scaffold
- Sequential scaffolding logic (CLAUDE.md must define context before README can reference it) makes parallelization unclear
**Verdict:** Not a violation. Write x5 is a valid in-session execution phase after exploration, especially given the multi-file interdependencies and the need to synthesize Explore results. If the Write sequence were purely mechanical templating with zero judgment, it would be a delegation candidate; here, it involves template selection, cross-project pattern alignment, and deferral routing.
---
## KEY FINDINGS
1. **Model param violation is the primary issue.** All three Agent spawns violate the explicit ORCHESTRATION.md requirement. The policy is clear: every spawn must include the `model` parameter. Even if haiku is the right choice, it must be stated. Recommend a lint rule: `Agent(...) without model: param → error before tool execution`.
2. **Pre-spawn diagnostics could be better scoped.** The orchestrator spent 74 KB and 36 tool calls on diagnostics before delegating exploration. A tighter pattern would be: read the umbrella context + problem statement (≤1 KB), then spawn Explore agents with open-ended discovery prompts and let them do the diagnostic work. The 32-Bash diagnostic session (systemctl, journalctl, ssh, grep) is exactly what Explore is for.
3. **File read overlap.** The orchestrator read `services-inventory.md` and `backup.sh` in-session, then asked Explore agents to read the same files. Tighter scoping would avoid this redundancy.
4. **Plan synthesis is strong.** The orchestrator correctly bundled three conceptually separate tasks (desktop bugs, proxmox project, deferred tracking) into a single coherent plan, with good separation between immediate fixes and deferred work. Plan execution (the Writes) was appropriate in-session.
5. **Explore agents received well-bounded prompts.** Despite the pre-spawn diagnostic work, the prompts given to agents were focused and didn't dump the full session history on them.
---
## RECOMMENDATIONS
**Immediate (High Priority):**
1. Enforce `model: "haiku"` (or explicit model choice) on every `Agent()` call. This is a hard requirement per ORCHESTRATION.md and was violated on all 3 spawns in this session.
**Near-term (Medium Priority):**
2. Reduce pre-delegation diagnostics. When spawning Explore agents, provide umbrella context + clear task description; don't pre-diagnose. Let Explore agents handle discovery.
3. Add a "no redundant reads" check: if you're about to delegate a task that includes "Read file X," don't Read file X in the orchestrator session first.
**Process (Optional):**
4. Consider a linting/validation layer that catches model-param omissions before agent spawn.
---
## TIMELINE
- **16:0516:47** (42 min): Orchestrator diagnostic work (32 Bash, 4 Read) + plan synthesis
- **16:47:03** (line 241): Explore spawn 1 (ovh-prod conventions) — async, model=null
- **16:47:14** (line 243): Explore spawn 2 (desktop backup bugs) — async, model=null
- **16:47:24** (line 245): Explore spawn 3 (proxmox VM 101) — async, model=null
- **16:47:27**: Orchestrator synthesis turn (awaiting agent results)
- **After agent completion** (not timestamped in fact-sheet but ~line 294+): Plan exited, execution begins (Write x5)
- **17:14:47**: Session ends
---
## CONCLUSION
The session demonstrates **strong plan design and synthesis** but **violates the core ORCHESTRATION.md policy** on explicit model parameterization. The orchestrator should have passed `model: "haiku"` to all three Explore spawns. Additionally, 74 KB of pre-delegation diagnostic work could have been better scoped, with more delegated to the Explore agents. The Write x5 execution was appropriate given the multi-file scaffold context.
**Overall Verdict:** Policy non-compliant (model param violation), efficiency improvable (pre-spawn diagnostics), but execution and planning logic sound.