Summary
In 0.39.1, the MCP execution handler hardcodes fat_harness_mode = True for all new sessions while the upstream seed authoring / QA / interview / closure components remain unchanged since 0.36. The result: seeds that follow the still-shipping seed-architect.md guidance (e.g. a layered AC pattern with a scaffold AC followed by verification ACs) fail at the very first AC because the code.yaml profile's evidence_schema.rejected_if: ["tests_passed == []"] rule rejects scaffold-only deliverables. Every downstream AC then cascade-skips with dependency_failed, and the entire run terminates with Success: 0/N.
This is a horizontal-incoherence regression: one pipeline stage's contract was tightened, the others were not, and no migration guidance / changelog warning / regression test prevented the gap from shipping.
Repro
Tested against ouroboros-ai 0.39.1 installed via uv tool install 'ouroboros-ai[mcp,claude]', Claude Code MCP host, Python 3.12 environment.
ooo interview <topic> — produce an interview state.
ooo seed — let the seed-architect agent generate the seed YAML. The agent (still using agents/seed-architect.md unchanged since 0.36) naturally produces a layered AC pattern: AC1 = scaffold (file presence + dep declaration), AC2..ACN = behavior + verification with tests.
ouroboros_qa passes the seed (e.g. score 0.93 / threshold 0.90). Quality bar checks internal consistency, AC measurability, ontology coverage — but not profile evidence_schema compatibility.
ouroboros_execute_seed (or ooo run) starts. AC1 implementation session succeeds, the worker emits [AC_COMPLETE: 1] plus a free-form JSON like {"files_touched": [...]}.
_fat_harness_acceptance_error rejects AC1 because typed evidence is missing commands_run / tests_passed, and rejected_if: tests_passed == [] blocks even a correctly-shaped scaffold report.
parallel_executor marks AC1 as failed, cascades dependency_failed to AC2..ACN, and reports Success: 0/N.
Expected vs Actual
|
Expected |
Actual |
| Authoring contract |
seed-architect should be told that every AC must emit non-empty tests_passed when task_type=code, or scaffold-evidence-kind ACs should be representable in the schema |
seed-architect is unchanged since 0.36, has no awareness of fat-harness requirements |
| QA contract |
ouroboros_qa should reject seeds whose ACs cannot satisfy the active profile's evidence_schema.rejected_if rules |
qa-judge dimensions are correctness / completeness / quality / intent_alignment / domain_specific — no profile_evidence_compatibility dimension |
| Execution contract |
Accept seeds produced by the matching version's authoring pipeline |
Hardcoded fat_harness_mode = True rejects layered-AC seeds even when produced by Ouroboros's own seed-architect |
| Release migration |
Breaking change should be flagged in CHANGELOG with migration guide, or shipped as MAJOR / MINOR bump |
Shipped as 0.39.0 → 0.39.1 PATCH bump, no migration guide, no deprecation period |
Evidence (byte-level diff across cached versions 0.36.0 / 0.38.2 / 0.39.1)
| File |
0.36 → 0.39.1 change |
fat-harness compatibility guidance added? |
mcp/tools/execution_handlers.py:501 (fat_harness_mode = True literal) |
added in 0.39.1 (0 occurrences in 0.36 + 0.38.2, 1 in 0.39.1) |
n/a (this is the enforcement site) |
profiles/code.yaml (evidence_schema with rejected_if: tests_passed == []) |
introduced after 0.36 (file did not exist in 0.36.0 plugin cache) |
n/a |
agents/seed-architect.md |
0 changes |
❌ |
agents/qa-judge.md |
0 changes |
❌ |
agents/seed-closer.md |
0 changes |
❌ |
mcp/tools/subagent.py::build_generate_seed_subagent |
0 changes |
❌ |
skills/interview/SKILL.md |
changed |
❌ (grep "fat_harness|profile|tests_passed|rejected_if|scaffold" → 0 matches) |
skills/seed/SKILL.md |
changed |
❌ (same grep → 0 matches; "evidence" hits are about interview/dialectical evidence, not typed evidence) |
skills/run/SKILL.md |
0 changes |
❌ |
Repro of the diff (reproducible locally if any of these plugin caches are kept):
PLG=~/.claude/plugins/cache/ouroboros/ouroboros
diff -q "$PLG/0.36.0/src/ouroboros/agents/seed-architect.md" "$PLG/0.39.1/src/ouroboros/agents/seed-architect.md" # files identical
diff -q "$PLG/0.38.2/src/ouroboros/agents/seed-architect.md" "$PLG/0.39.1/src/ouroboros/agents/seed-architect.md" # files identical
grep -c 'fat_harness_mode = True' "$PLG/0.36.0/src/ouroboros/mcp/tools/execution_handlers.py" # → 0
grep -c 'fat_harness_mode = True' "$PLG/0.38.2/src/ouroboros/mcp/tools/execution_handlers.py" # → 0
grep -c 'fat_harness_mode = True' "$PLG/0.39.1/src/ouroboros/mcp/tools/execution_handlers.py" # → 1
diff "$PLG/0.36.0/skills/seed/SKILL.md" "$PLG/0.39.1/skills/seed/SKILL.md" | grep -iE 'fat_harness|profile|tests_passed|rejected_if|scaffold' # → 0
Asks (any one is sufficient)
- Tighten authoring — Update
agents/seed-architect.md + agents/qa-judge.md + mcp/tools/subagent.py::build_generate_seed_subagent to enforce per-AC "non-empty tests_passed is required when task_type=code" guidance. Add a profile_evidence_compatibility dimension to qa-judge.
- Relax fat-harness — Allow scaffold-evidence-kind ACs in
_fat_harness_acceptance_error: if tests_passed == [] AND the AC text matches a scaffold heuristic (no "test"/"assert"/"verify" keyword AND files_touched != []), accept. Or add an explicit evidence_kind: scaffold | verification field to the seed AC schema.
- Revert default — Make
fat_harness_mode opt-in via seed.orchestrator.execution_mode: fat_harness (the inverse of the deleted legacy opt-in), and default to False until the authoring pipeline can produce fat-harness-compatible seeds reliably. Document the migration in CHANGELOG.
The minimal acceptable fix is #3 (single-file revert with documentation), but #1 is the structurally correct solution that closes the loop between authoring and execution.
Workaround
Two-line patch in the installed package:
mcp/tools/execution_handlers.py:501 — fat_harness_mode = True → fat_harness_mode = False
cli/commands/run.py::_resolve_fat_harness_mode — return True → return False
Survives runtime but is wiped by every uv tool upgrade ouroboros-ai. Also patches ~/.claude/plugins/cache/ouroboros/ouroboros/0.39.1/.mcp.json to add --python 3.12 to the uvx args (separate, unrelated issue: uvx picks system Python 3.10 by default which fails to resolve the >=3.12 requirement).
Environment
- ouroboros-ai 0.39.1 (uv tool install)
- Claude Code MCP host
- macOS Darwin 25.5.0 / Python 3.13 (uvx pinned to 3.12 for ouroboros)
- Affected project: 4 prior phases (3.1, 3.2, 3.3, 3.4) of a brownfield FastAPI/RN monorepo successfully executed on 0.36/0.38 with the same seed-architect output style; first phase attempted on 0.39.1 (4.1) fails reproducibly on AC1.
Summary
In
0.39.1, the MCP execution handler hardcodesfat_harness_mode = Truefor all new sessions while the upstream seed authoring / QA / interview / closure components remain unchanged since0.36. The result: seeds that follow the still-shippingseed-architect.mdguidance (e.g. a layered AC pattern with ascaffold ACfollowed byverification ACs) fail at the very first AC because thecode.yamlprofile'sevidence_schema.rejected_if: ["tests_passed == []"]rule rejects scaffold-only deliverables. Every downstream AC then cascade-skips withdependency_failed, and the entire run terminates withSuccess: 0/N.This is a horizontal-incoherence regression: one pipeline stage's contract was tightened, the others were not, and no migration guidance / changelog warning / regression test prevented the gap from shipping.
Repro
Tested against ouroboros-ai
0.39.1installed viauv tool install 'ouroboros-ai[mcp,claude]', Claude Code MCP host, Python 3.12 environment.ooo interview <topic>— produce an interview state.ooo seed— let the seed-architect agent generate the seed YAML. The agent (still usingagents/seed-architect.mdunchanged since0.36) naturally produces a layered AC pattern: AC1 = scaffold (file presence + dep declaration), AC2..ACN = behavior + verification with tests.ouroboros_qapasses the seed (e.g. score 0.93 / threshold 0.90). Quality bar checks internal consistency, AC measurability, ontology coverage — but not profile evidence_schema compatibility.ouroboros_execute_seed(orooo run) starts. AC1 implementation session succeeds, the worker emits[AC_COMPLETE: 1]plus a free-form JSON like{"files_touched": [...]}._fat_harness_acceptance_errorrejects AC1 because typed evidence is missingcommands_run/tests_passed, andrejected_if: tests_passed == []blocks even a correctly-shaped scaffold report.parallel_executormarks AC1 asfailed, cascadesdependency_failedto AC2..ACN, and reportsSuccess: 0/N.Expected vs Actual
tests_passedwhentask_type=code, or scaffold-evidence-kind ACs should be representable in the schemaouroboros_qashould reject seeds whose ACs cannot satisfy the active profile'sevidence_schema.rejected_ifrulesprofile_evidence_compatibilitydimensionfat_harness_mode = Truerejects layered-AC seeds even when produced by Ouroboros's own seed-architect0.39.0→0.39.1PATCH bump, no migration guide, no deprecation periodEvidence (byte-level diff across cached versions 0.36.0 / 0.38.2 / 0.39.1)
mcp/tools/execution_handlers.py:501(fat_harness_mode = Trueliteral)profiles/code.yaml(evidence_schema withrejected_if: tests_passed == [])agents/seed-architect.mdagents/qa-judge.mdagents/seed-closer.mdmcp/tools/subagent.py::build_generate_seed_subagentskills/interview/SKILL.mdskills/seed/SKILL.mdskills/run/SKILL.mdRepro of the diff (reproducible locally if any of these plugin caches are kept):
Asks (any one is sufficient)
agents/seed-architect.md+agents/qa-judge.md+mcp/tools/subagent.py::build_generate_seed_subagentto enforce per-AC "non-emptytests_passedis required whentask_type=code" guidance. Add aprofile_evidence_compatibilitydimension to qa-judge._fat_harness_acceptance_error: iftests_passed == []AND the AC text matches a scaffold heuristic (no "test"/"assert"/"verify" keyword ANDfiles_touched != []), accept. Or add an explicitevidence_kind: scaffold | verificationfield to the seed AC schema.fat_harness_modeopt-in viaseed.orchestrator.execution_mode: fat_harness(the inverse of the deletedlegacyopt-in), and default toFalseuntil the authoring pipeline can produce fat-harness-compatible seeds reliably. Document the migration in CHANGELOG.The minimal acceptable fix is #3 (single-file revert with documentation), but #1 is the structurally correct solution that closes the loop between authoring and execution.
Workaround
Two-line patch in the installed package:
mcp/tools/execution_handlers.py:501—fat_harness_mode = True→fat_harness_mode = Falsecli/commands/run.py::_resolve_fat_harness_mode—return True→return FalseSurvives runtime but is wiped by every
uv tool upgrade ouroboros-ai. Also patches~/.claude/plugins/cache/ouroboros/ouroboros/0.39.1/.mcp.jsonto add--python 3.12to the uvx args (separate, unrelated issue: uvx picks system Python 3.10 by default which fails to resolve the>=3.12requirement).Environment