Skip to content

0.39.1 fat_harness_mode hardcoded ON without updating seed authoring guides — breaks all layered-AC seeds generated by ouroboros's own seed-architect #1202

@buzllightyear

Description

@buzllightyear

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.

  1. ooo interview <topic> — produce an interview state.
  2. 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.
  3. 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.
  4. 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": [...]}.
  5. _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.
  6. 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.00.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)

  1. 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.
  2. 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.
  3. 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:501fat_harness_mode = Truefat_harness_mode = False
  • cli/commands/run.py::_resolve_fat_harness_modereturn Truereturn 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugReproducible defect or broken behavior

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions