Provider inference bug in Archon itself.
Root Cause
The implement-tasks node specifies model: opus[1m] (Opus with extended thinking). But the Codex provider's compatibility check in registry.ts only rejects exact matches for 'opus', 'sonnet', 'haiku' — it doesn't recognize opus[1m] as a Claude model.
So when inferProviderFromModel() runs, Codex claims compatibility first, the node gets routed to Codex instead of Claude, and Codex completes in ~3 seconds with empty output. The rest of the DAG continues against zero changes.
Evidence from DB logs
implement-tasks | node_started | {"provider":"codex"} ← WRONG, should be "claude"
implement-tasks | node_completed | {"duration_ms":2832, "node_output":""} ← empty
The fix
In /Users/jgnip/github/Archon/packages/providers/src/registry.ts (lines 126-130), the Codex isModelCompatible check needs to handle extended model syntax:
// Current (broken): only rejects exact 'opus', 'sonnet', 'haiku'
!claudeAliases.includes(model)
// Should also reject: 'opus[1m]', 'sonnet[500k]', etc.
!claudeAliases.some(alias => model.startsWith(alias))
This is an Archon framework bug,
Provider inference bug in Archon itself.
Root Cause
The implement-tasks node specifies model: opus[1m] (Opus with extended thinking). But the Codex provider's compatibility check in registry.ts only rejects exact matches for 'opus', 'sonnet', 'haiku' — it doesn't recognize opus[1m] as a Claude model.
So when inferProviderFromModel() runs, Codex claims compatibility first, the node gets routed to Codex instead of Claude, and Codex completes in ~3 seconds with empty output. The rest of the DAG continues against zero changes.
Evidence from DB logs
implement-tasks | node_started | {"provider":"codex"} ← WRONG, should be "claude"
implement-tasks | node_completed | {"duration_ms":2832, "node_output":""} ← empty
The fix
In /Users/jgnip/github/Archon/packages/providers/src/registry.ts (lines 126-130), the Codex isModelCompatible check needs to handle extended model syntax:
// Current (broken): only rejects exact 'opus', 'sonnet', 'haiku'
!claudeAliases.includes(model)
// Should also reject: 'opus[1m]', 'sonnet[500k]', etc.
!claudeAliases.some(alias => model.startsWith(alias))
This is an Archon framework bug,