ouroboros-ai 0.25.3.dev1__tar.gz → 0.25.3.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ouroboros-ai might be problematic. Click here for more details.

Files changed (470) hide show
  1. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/cli-reference.md +8 -8
  3. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/running-with-claude-code.md +1 -1
  4. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/_version.py +2 -2
  5. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/ambiguity.py +31 -18
  6. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/init.py +8 -13
  7. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/run.py +9 -1
  8. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/loop.py +9 -1
  9. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/definitions.py +12 -1
  10. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/parallel_executor.py +164 -1
  11. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/runner.py +25 -41
  12. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_cli_commands.py +3 -3
  13. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_ambiguity.py +62 -0
  14. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_main.py +1 -1
  15. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_qa_integration.py +6 -1
  16. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_runner.py +116 -0
  17. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_artifact_collector.py +19 -0
  18. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude/settings.json +0 -0
  19. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/.mcp.json +0 -0
  20. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/marketplace.json +0 -0
  21. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/plugin.json +0 -0
  22. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.env.example +0 -0
  23. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/dev-publish.yml +0 -0
  24. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/lint.yml +0 -0
  25. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/release.yml +0 -0
  26. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/test.yml +0 -0
  27. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.gitignore +0 -0
  28. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.mcp.json +0 -0
  29. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.pre-commit-config.yaml +0 -0
  30. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.python-version +0 -0
  31. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CHANGELOG.md +0 -0
  32. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CLAUDE.md +0 -0
  33. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CONTRIBUTING.md +0 -0
  34. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/HANDOFF.md +0 -0
  35. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/LICENSE +0 -0
  36. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/README.ko.md +0 -0
  37. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/README.md +0 -0
  38. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/architect.md +0 -0
  39. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/contrarian.md +0 -0
  40. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/evaluator.md +0 -0
  41. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/hacker.md +0 -0
  42. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/ontologist.md +0 -0
  43. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/qa-judge.md +0 -0
  44. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/researcher.md +0 -0
  45. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/seed-architect.md +0 -0
  46. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/simplifier.md +0 -0
  47. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/socratic-interviewer.md +0 -0
  48. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/cancel.md +0 -0
  49. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/evaluate.md +0 -0
  50. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/evolve.md +0 -0
  51. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/help.md +0 -0
  52. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/interview.md +0 -0
  53. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/ralph.md +0 -0
  54. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/run.md +0 -0
  55. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/seed.md +0 -0
  56. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/setup.md +0 -0
  57. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/status.md +0 -0
  58. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/tutorial.md +0 -0
  59. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/unstuck.md +0 -0
  60. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/welcome.md +0 -0
  61. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/.gitignore +0 -0
  62. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/Cargo.lock +0 -0
  63. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/Cargo.toml +0 -0
  64. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/README.md +0 -0
  65. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/db.rs +0 -0
  66. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/main.rs +0 -0
  67. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/mock.rs +0 -0
  68. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/state.rs +0 -0
  69. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  70. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  71. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  72. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  73. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  74. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  75. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/README.md +0 -0
  76. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/README.md +0 -0
  77. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/coordinator-agent-design.md +0 -0
  78. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/core.md +0 -0
  79. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/mcp.md +0 -0
  80. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/parallel-dx-design.md +0 -0
  81. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/parallel-execution.md +0 -0
  82. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/architecture.md +0 -0
  83. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/architecture-overview.md +0 -0
  84. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/key-patterns.md +0 -0
  85. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/testing-guide.md +0 -0
  86. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/examples/mcp-config.yaml +0 -0
  87. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/getting-started.md +0 -0
  88. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/cli-usage.md +0 -0
  89. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/common-workflows.md +0 -0
  90. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  91. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/language-support.md +0 -0
  92. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/quick-start.md +0 -0
  93. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/seed-authoring.md +0 -0
  94. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/tui-usage.md +0 -0
  95. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/images/ouroboros.png +0 -0
  96. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/HANDOFF.md +0 -0
  97. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/aop-design.md +0 -0
  98. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/architecture.md +0 -0
  99. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/requirements.md +0 -0
  100. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/coordinator_test_seed.yaml +0 -0
  101. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/dummy_seed.yaml +0 -0
  102. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/parallel_subac_test_seed.yaml +0 -0
  103. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/subac_test_seed.yaml +0 -0
  104. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/README.md +0 -0
  105. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/__init__.py +0 -0
  106. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/__main__.py +0 -0
  107. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/cli.py +0 -0
  108. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/models.py +0 -0
  109. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/storage.py +0 -0
  110. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/test_display.py +0 -0
  111. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/hooks/hooks.json +0 -0
  112. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/__init__.py +0 -0
  113. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/config.py +0 -0
  114. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/models.py +0 -0
  115. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/project-context.md +0 -0
  116. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/pyproject.toml +0 -0
  117. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/drift-monitor.py +0 -0
  118. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/keyword-detector.py +0 -0
  119. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph-rewind.py +0 -0
  120. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph.py +0 -0
  121. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph.sh +0 -0
  122. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/session-start.py +0 -0
  123. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/version-check.py +0 -0
  124. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/cancel/SKILL.md +0 -0
  125. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/evaluate/SKILL.md +0 -0
  126. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/evolve/SKILL.md +0 -0
  127. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/help/SKILL.md +0 -0
  128. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/interview/SKILL.md +0 -0
  129. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/qa/SKILL.md +0 -0
  130. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/ralph/SKILL.md +0 -0
  131. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/run/SKILL.md +0 -0
  132. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/seed/SKILL.md +0 -0
  133. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/setup/SKILL.md +0 -0
  134. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/status/SKILL.md +0 -0
  135. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/tutorial/SKILL.md +0 -0
  136. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/unstuck/SKILL.md +0 -0
  137. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/update/SKILL.md +0 -0
  138. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/welcome/SKILL.md +0 -0
  139. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/__init__.py +0 -0
  140. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/__main__.py +0 -0
  141. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/__init__.py +0 -0
  142. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/advocate.md +0 -0
  143. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/analysis-agent.md +0 -0
  144. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/architect.md +0 -0
  145. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/code-executor.md +0 -0
  146. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/codebase-explorer.md +0 -0
  147. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  148. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/contrarian.md +0 -0
  149. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/evaluator.md +0 -0
  150. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/hacker.md +0 -0
  151. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/judge.md +0 -0
  152. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/loader.py +0 -0
  153. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/ontologist.md +0 -0
  154. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/ontology-analyst.md +0 -0
  155. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/qa-judge.md +0 -0
  156. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/research-agent.md +0 -0
  157. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/researcher.md +0 -0
  158. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/seed-architect.md +0 -0
  159. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  160. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/simplifier.md +0 -0
  161. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  162. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/__init__.py +0 -0
  163. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/explore.py +0 -0
  164. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/interview.py +0 -0
  165. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/seed_generator.py +0 -0
  166. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/__init__.py +0 -0
  167. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/__init__.py +0 -0
  168. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/cancel.py +0 -0
  169. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/config.py +0 -0
  170. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/mcp.py +0 -0
  171. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/status.py +0 -0
  172. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/tui.py +0 -0
  173. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/__init__.py +0 -0
  174. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/panels.py +0 -0
  175. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/progress.py +0 -0
  176. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/tables.py +0 -0
  177. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  178. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/main.py +0 -0
  179. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/__init__.py +0 -0
  180. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/loader.py +0 -0
  181. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/models.py +0 -0
  182. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/__init__.py +0 -0
  183. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ac_tree.py +0 -0
  184. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/context.py +0 -0
  185. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/errors.py +0 -0
  186. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/file_lock.py +0 -0
  187. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/git_workflow.py +0 -0
  188. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/lineage.py +0 -0
  189. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ontology_aspect.py +0 -0
  190. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ontology_questions.py +0 -0
  191. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/security.py +0 -0
  192. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/seed.py +0 -0
  193. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/text.py +0 -0
  194. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/types.py +0 -0
  195. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/__init__.py +0 -0
  196. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  197. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/consensus.py +0 -0
  198. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/json_utils.py +0 -0
  199. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/languages.py +0 -0
  200. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/mechanical.py +0 -0
  201. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/models.py +0 -0
  202. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/pipeline.py +0 -0
  203. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/semantic.py +0 -0
  204. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/trigger.py +0 -0
  205. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/__init__.py +0 -0
  206. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/base.py +0 -0
  207. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/decomposition.py +0 -0
  208. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/evaluation.py +0 -0
  209. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/interview.py +0 -0
  210. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/lineage.py +0 -0
  211. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/ontology.py +0 -0
  212. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/__init__.py +0 -0
  213. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/convergence.py +0 -0
  214. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/projector.py +0 -0
  215. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/reflect.py +0 -0
  216. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/regression.py +0 -0
  217. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/wonder.py +0 -0
  218. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/__init__.py +0 -0
  219. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/atomicity.py +0 -0
  220. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/decomposition.py +0 -0
  221. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/double_diamond.py +0 -0
  222. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/subagent.py +0 -0
  223. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/__init__.py +0 -0
  224. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/__init__.py +0 -0
  225. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/adapter.py +0 -0
  226. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/manager.py +0 -0
  227. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/protocol.py +0 -0
  228. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/errors.py +0 -0
  229. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/job_manager.py +0 -0
  230. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/resources/__init__.py +0 -0
  231. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/resources/handlers.py +0 -0
  232. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/__init__.py +0 -0
  233. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/adapter.py +0 -0
  234. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/protocol.py +0 -0
  235. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/security.py +0 -0
  236. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/__init__.py +0 -0
  237. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  238. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/qa.py +0 -0
  239. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/registry.py +0 -0
  240. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/types.py +0 -0
  241. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/__init__.py +0 -0
  242. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/drift.py +0 -0
  243. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/logging.py +0 -0
  244. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/retrospective.py +0 -0
  245. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/__init__.py +0 -0
  246. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/adapter.py +0 -0
  247. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/coordinator.py +0 -0
  248. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  249. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/events.py +0 -0
  250. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  251. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/level_context.py +0 -0
  252. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  253. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  254. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/session.py +0 -0
  255. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  256. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/__init__.py +0 -0
  257. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/checkpoint.py +0 -0
  258. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/event_store.py +0 -0
  259. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  260. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/runner.py +0 -0
  261. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  262. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/schema.py +0 -0
  263. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/uow.py +0 -0
  264. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/__init__.py +0 -0
  265. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/__init__.py +0 -0
  266. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/pool.py +0 -0
  267. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/registry.py +0 -0
  268. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  269. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/router.py +0 -0
  270. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  271. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/__init__.py +0 -0
  272. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/docs.py +0 -0
  273. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/executor.py +0 -0
  274. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/keywords.py +0 -0
  275. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/registry.py +0 -0
  276. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/__init__.py +0 -0
  277. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  278. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/base.py +0 -0
  279. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  280. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/litellm_adapter.py +0 -0
  281. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/py.typed +0 -0
  282. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/__init__.py +0 -0
  283. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/lateral.py +0 -0
  284. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/stagnation.py +0 -0
  285. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/__init__.py +0 -0
  286. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/complexity.py +0 -0
  287. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/downgrade.py +0 -0
  288. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/escalation.py +0 -0
  289. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/router.py +0 -0
  290. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/tiers.py +0 -0
  291. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/__init__.py +0 -0
  292. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/scheduler.py +0 -0
  293. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/todo_registry.py +0 -0
  294. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/strategies/__init__.py +0 -0
  295. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/strategies/devil_advocate.py +0 -0
  296. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/__init__.py +0 -0
  297. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/app.py +0 -0
  298. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/__init__.py +0 -0
  299. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/agents_panel.py +0 -0
  300. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/event_log.py +0 -0
  301. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/progress.py +0 -0
  302. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/token_tracker.py +0 -0
  303. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/events.py +0 -0
  304. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/__init__.py +0 -0
  305. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  306. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard.py +0 -0
  307. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  308. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  309. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/debug.py +0 -0
  310. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/execution.py +0 -0
  311. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  312. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  313. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  314. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/logs.py +0 -0
  315. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/session_selector.py +0 -0
  316. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/__init__.py +0 -0
  317. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  318. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  319. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  320. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  321. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  322. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  323. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  324. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  325. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/__init__.py +0 -0
  326. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/extractor.py +0 -0
  327. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/models.py +0 -0
  328. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/verifier.py +0 -0
  329. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/__init__.py +0 -0
  330. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/conftest.py +0 -0
  331. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/__init__.py +0 -0
  332. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/conftest.py +0 -0
  333. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_full_workflow.py +0 -0
  334. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_session_persistence.py +0 -0
  335. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/fixtures/test_atomicity_seed.yml +0 -0
  336. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/__init__.py +0 -0
  337. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/__init__.py +0 -0
  338. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/conftest.py +0 -0
  339. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_client_adapter.py +0 -0
  340. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_client_manager.py +0 -0
  341. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_server_adapter.py +0 -0
  342. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/plugin/test_orchestration.py +0 -0
  343. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/test_entry_point.py +0 -0
  344. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/__init__.py +0 -0
  345. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/agents/__init__.py +0 -0
  346. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/agents/test_loader.py +0 -0
  347. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/__init__.py +0 -0
  348. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_explore.py +0 -0
  349. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_interview.py +0 -0
  350. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_seed_generator.py +0 -0
  351. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/__init__.py +0 -0
  352. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/__init__.py +0 -0
  353. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_console.py +0 -0
  354. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_panels.py +0 -0
  355. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_progress.py +0 -0
  356. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_tables.py +0 -0
  357. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  358. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_cancel.py +0 -0
  359. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  360. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/__init__.py +0 -0
  361. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/test_loader.py +0 -0
  362. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/test_models.py +0 -0
  363. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/__init__.py +0 -0
  364. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ac_tree.py +0 -0
  365. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_context.py +0 -0
  366. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_errors.py +0 -0
  367. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_git_workflow.py +0 -0
  368. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ontology_aspect.py +0 -0
  369. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ontology_questions.py +0 -0
  370. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_security.py +0 -0
  371. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_seed.py +0 -0
  372. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_types.py +0 -0
  373. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/__init__.py +0 -0
  374. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_consensus.py +0 -0
  375. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_languages.py +0 -0
  376. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_mechanical.py +0 -0
  377. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_models.py +0 -0
  378. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_semantic.py +0 -0
  379. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_trigger.py +0 -0
  380. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/__init__.py +0 -0
  381. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/test_base.py +0 -0
  382. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/test_decomposition_events.py +0 -0
  383. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/__init__.py +0 -0
  384. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_atomicity.py +0 -0
  385. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_decomposition.py +0 -0
  386. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_double_diamond.py +0 -0
  387. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_subagent_isolation.py +0 -0
  388. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/__init__.py +0 -0
  389. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/__init__.py +0 -0
  390. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/test_adapter.py +0 -0
  391. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/test_manager.py +0 -0
  392. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/conftest.py +0 -0
  393. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/__init__.py +0 -0
  394. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/test_adapter.py +0 -0
  395. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/test_security.py +0 -0
  396. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_errors.py +0 -0
  397. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_job_manager.py +0 -0
  398. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_types.py +0 -0
  399. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/__init__.py +0 -0
  400. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_definitions.py +0 -0
  401. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_registry.py +0 -0
  402. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/__init__.py +0 -0
  403. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_drift.py +0 -0
  404. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_logging.py +0 -0
  405. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_retrospective.py +0 -0
  406. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/__init__.py +0 -0
  407. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_adapter.py +0 -0
  408. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_coordinator.py +0 -0
  409. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_events.py +0 -0
  410. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  411. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  412. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_level_context.py +0 -0
  413. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  414. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  415. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  416. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_session.py +0 -0
  417. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  418. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/__init__.py +0 -0
  419. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_checkpoint.py +0 -0
  420. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_event_store.py +0 -0
  421. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_schema.py +0 -0
  422. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_uow.py +0 -0
  423. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/__init__.py +0 -0
  424. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/agents/__init__.py +0 -0
  425. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/agents/test_registry.py +0 -0
  426. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/orchestration/__init__.py +0 -0
  427. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  428. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/skills/__init__.py +0 -0
  429. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/skills/test_registry.py +0 -0
  430. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/__init__.py +0 -0
  431. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_base.py +0 -0
  432. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  433. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_litellm_adapter.py +0 -0
  434. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/__init__.py +0 -0
  435. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/test_lateral.py +0 -0
  436. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/test_stagnation.py +0 -0
  437. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/__init__.py +0 -0
  438. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_complexity.py +0 -0
  439. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_downgrade.py +0 -0
  440. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_escalation.py +0 -0
  441. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_router.py +0 -0
  442. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_tiers.py +0 -0
  443. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/scripts/test_keyword_detector.py +0 -0
  444. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/scripts/test_version_check.py +0 -0
  445. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/__init__.py +0 -0
  446. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/test_scheduler.py +0 -0
  447. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/test_todo_registry.py +0 -0
  448. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_convergence.py +0 -0
  449. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_dashboard.py +0 -0
  450. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_dependencies_configured.py +0 -0
  451. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_evolve_rewind.py +0 -0
  452. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_evolve_step.py +0 -0
  453. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_main_entry_point.py +0 -0
  454. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_module_structure.py +0 -0
  455. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_project_initialization.py +0 -0
  456. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_projector_rewind.py +0 -0
  457. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_ralph_parser.py +0 -0
  458. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_ralph_rewind.py +0 -0
  459. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_regression.py +0 -0
  460. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_tooling_configuration.py +0 -0
  461. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_verification.py +0 -0
  462. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/__init__.py +0 -0
  463. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_app.py +0 -0
  464. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_cancelled_display.py +0 -0
  465. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_events.py +0 -0
  466. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_lineage_viewer.py +0 -0
  467. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_screens.py +0 -0
  468. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_widgets.py +0 -0
  469. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tools/sync_github_project.py +0 -0
  470. {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.25.3.dev1
3
+ Version: 0.25.3.dev3
4
4
  Summary: Self-Improving AI Workflow System
5
5
  Author-email: Q00 <jqyu.lee@gmail.com>
6
6
  License-File: LICENSE
@@ -83,7 +83,7 @@ ouroboros init [start] [OPTIONS] [CONTEXT]
83
83
  |--------|-------------|
84
84
  | `-r, --resume TEXT` | Resume an existing interview by ID |
85
85
  | `--state-dir DIRECTORY` | Custom directory for interview state files |
86
- | `-o, --orchestrator` | Use Claude Code (Max Plan) instead of LiteLLM. No API key required |
86
+ | `-o, --orchestrator` | Use Claude Code (Max Plan) instead of Anthropic API. No API key required |
87
87
  | `-d, --debug` | Show verbose logs including debug messages |
88
88
 
89
89
  **Examples:**
@@ -493,21 +493,21 @@ ouroboros run seed.yaml
493
493
  ouroboros monitor
494
494
  ```
495
495
 
496
- ### Using LiteLLM (External API)
496
+ ### Using Anthropic API (Default Non-Orchestrator Path)
497
497
 
498
- Requires API key (OPENROUTER_API_KEY, ANTHROPIC_API_KEY, etc.)
498
+ Requires `ANTHROPIC_API_KEY`.
499
499
 
500
500
  ```bash
501
501
  # 1. Initialize configuration
502
502
  ouroboros config init
503
503
 
504
- # 2. Set your API key
505
- ouroboros config set providers.openrouter.api_key $OPENROUTER_API_KEY
504
+ # 2. Export your API key
505
+ export ANTHROPIC_API_KEY=your-key-here
506
506
 
507
507
  # 3. Start interview
508
508
  ouroboros init "Build a REST API for task management"
509
509
 
510
- # 4. Execute workflow (use --no-orchestrator for LiteLLM path)
510
+ # 4. Execute workflow (use --no-orchestrator for the standard path)
511
511
  ouroboros run seed.yaml --no-orchestrator
512
512
  ```
513
513
 
@@ -517,8 +517,8 @@ ouroboros run seed.yaml --no-orchestrator
517
517
 
518
518
  | Variable | Description |
519
519
  |----------|-------------|
520
- | `OPENROUTER_API_KEY` | OpenRouter API key for LiteLLM |
521
- | `ANTHROPIC_API_KEY` | Anthropic API key for LiteLLM |
520
+ | `OPENROUTER_API_KEY` | OpenRouter API key for optional LiteLLM-based integrations |
521
+ | `ANTHROPIC_API_KEY` | Anthropic API key for direct Anthropic-backed interview mode |
522
522
  | `OPENAI_API_KEY` | OpenAI API key for LiteLLM |
523
523
 
524
524
  ---
@@ -136,7 +136,7 @@ The orchestrator uses `claude-agent-sdk` which connects directly to your authent
136
136
  # Start interactive interview (Claude Code)
137
137
  uv run ouroboros init start --orchestrator "Your idea here"
138
138
 
139
- # Start interactive interview (LiteLLM - needs API key)
139
+ # Start interactive interview (Anthropic API - needs ANTHROPIC_API_KEY)
140
140
  uv run ouroboros init start "Your idea here"
141
141
 
142
142
  # Resume an interrupted interview
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.25.3.dev1'
32
- __version_tuple__ = version_tuple = (0, 25, 3, 'dev1')
31
+ __version__ = version = '0.25.3.dev3'
32
+ __version_tuple__ = version_tuple = (0, 25, 3, 'dev3')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -20,12 +20,7 @@ import structlog
20
20
  from ouroboros.bigbang.interview import InterviewState
21
21
  from ouroboros.core.errors import ProviderError
22
22
  from ouroboros.core.types import Result
23
- from ouroboros.providers.base import CompletionConfig, Message, MessageRole
24
-
25
- try:
26
- from ouroboros.providers.litellm_adapter import LiteLLMAdapter
27
- except ImportError:
28
- LiteLLMAdapter = None # type: ignore[assignment,misc]
23
+ from ouroboros.providers.base import CompletionConfig, LLMAdapter, Message, MessageRole
29
24
 
30
25
  log = structlog.get_logger()
31
26
 
@@ -138,7 +133,7 @@ class AmbiguityScorer:
138
133
  max_retries: Maximum retry attempts, or None for unlimited (default).
139
134
 
140
135
  Example:
141
- scorer = AmbiguityScorer(llm_adapter=LiteLLMAdapter())
136
+ scorer = AmbiguityScorer(llm_adapter=some_adapter)
142
137
 
143
138
  result = await scorer.score(interview_state)
144
139
  if result.is_ok:
@@ -151,7 +146,7 @@ class AmbiguityScorer:
151
146
  questions = scorer.generate_clarification_questions(ambiguity.breakdown)
152
147
  """
153
148
 
154
- llm_adapter: LiteLLMAdapter
149
+ llm_adapter: LLMAdapter
155
150
  model: str = DEFAULT_MODEL
156
151
  temperature: float = SCORING_TEMPERATURE
157
152
  initial_max_tokens: int = 2048
@@ -414,17 +409,14 @@ Analyze each component and provide scores with justifications."""
414
409
  except json.JSONDecodeError as e:
415
410
  raise ValueError(f"Invalid JSON response: {e}") from e
416
411
 
417
- # Validate all required fields are present
418
- required_fields = [
412
+ # Numeric score fields must be present. Missing justifications are recoverable.
413
+ required_score_fields = [
419
414
  "goal_clarity_score",
420
- "goal_clarity_justification",
421
415
  "constraint_clarity_score",
422
- "constraint_clarity_justification",
423
416
  "success_criteria_clarity_score",
424
- "success_criteria_clarity_justification",
425
417
  ]
426
418
 
427
- for field_name in required_fields:
419
+ for field_name in required_score_fields:
428
420
  if field_name not in data:
429
421
  raise ValueError(f"Missing required field: {field_name}")
430
422
 
@@ -433,6 +425,15 @@ Analyze each component and provide scores with justifications."""
433
425
  score = float(value)
434
426
  return max(0.0, min(1.0, score))
435
427
 
428
+ def justification_for(field_name: str, component_name: str) -> str:
429
+ value = data.get(field_name)
430
+ if value is None:
431
+ return f"{component_name} justification not provided by model."
432
+ text = str(value).strip()
433
+ if not text:
434
+ return f"{component_name} justification not provided by model."
435
+ return text
436
+
436
437
  # Select weights based on project type
437
438
  if is_brownfield:
438
439
  goal_weight = BROWNFIELD_GOAL_CLARITY_WEIGHT
@@ -450,7 +451,10 @@ Analyze each component and provide scores with justifications."""
450
451
  name="Context Clarity",
451
452
  clarity_score=clamp_score(data["context_clarity_score"]),
452
453
  weight=BROWNFIELD_CONTEXT_CLARITY_WEIGHT,
453
- justification=str(data.get("context_clarity_justification", "")),
454
+ justification=justification_for(
455
+ "context_clarity_justification",
456
+ "Context Clarity",
457
+ ),
454
458
  )
455
459
 
456
460
  return ScoreBreakdown(
@@ -458,19 +462,28 @@ Analyze each component and provide scores with justifications."""
458
462
  name="Goal Clarity",
459
463
  clarity_score=clamp_score(data["goal_clarity_score"]),
460
464
  weight=goal_weight,
461
- justification=str(data["goal_clarity_justification"]),
465
+ justification=justification_for(
466
+ "goal_clarity_justification",
467
+ "Goal Clarity",
468
+ ),
462
469
  ),
463
470
  constraint_clarity=ComponentScore(
464
471
  name="Constraint Clarity",
465
472
  clarity_score=clamp_score(data["constraint_clarity_score"]),
466
473
  weight=constraint_weight,
467
- justification=str(data["constraint_clarity_justification"]),
474
+ justification=justification_for(
475
+ "constraint_clarity_justification",
476
+ "Constraint Clarity",
477
+ ),
468
478
  ),
469
479
  success_criteria_clarity=ComponentScore(
470
480
  name="Success Criteria Clarity",
471
481
  clarity_score=clamp_score(data["success_criteria_clarity_score"]),
472
482
  weight=criteria_weight,
473
- justification=str(data["success_criteria_clarity_justification"]),
483
+ justification=justification_for(
484
+ "success_criteria_clarity_justification",
485
+ "Success Criteria Clarity",
486
+ ),
474
487
  ),
475
488
  context_clarity=context_clarity,
476
489
  )
@@ -1,7 +1,7 @@
1
1
  """Init command for starting interactive interview.
2
2
 
3
3
  This command initiates the Big Bang phase interview process.
4
- Supports both LiteLLM (external API) and Claude Code (Max Plan) modes.
4
+ Supports both direct Anthropic API and Claude Code (Max Plan) modes.
5
5
  """
6
6
 
7
7
  import asyncio
@@ -27,13 +27,9 @@ from ouroboros.bigbang.seed_generator import SeedGenerator
27
27
  from ouroboros.cli.formatters import console
28
28
  from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning
29
29
  from ouroboros.observability import LoggingConfig, configure_logging
30
+ from ouroboros.providers.anthropic_adapter import AnthropicAdapter
30
31
  from ouroboros.providers.base import LLMAdapter
31
32
 
32
- try:
33
- from ouroboros.providers.litellm_adapter import LiteLLMAdapter
34
- except ImportError:
35
- LiteLLMAdapter = None # type: ignore[assignment,misc]
36
-
37
33
 
38
34
  class SeedGenerationResult(Enum):
39
35
  """Result of seed generation attempt."""
@@ -140,7 +136,7 @@ def _get_adapter(
140
136
  """Get the appropriate LLM adapter.
141
137
 
142
138
  Args:
143
- use_orchestrator: If True, use Claude Code (Max Plan). Otherwise LiteLLM.
139
+ use_orchestrator: If True, use Claude Code (Max Plan). Otherwise Anthropic API.
144
140
  for_interview: If True, enable Read/Glob/Grep tools for codebase exploration.
145
141
  debug: If True, show streaming messages (thinking, tool use).
146
142
 
@@ -160,8 +156,7 @@ def _get_adapter(
160
156
  on_message=_make_message_callback(debug),
161
157
  )
162
158
  return ClaudeCodeAdapter()
163
- else:
164
- return LiteLLMAdapter()
159
+ return AnthropicAdapter()
165
160
 
166
161
 
167
162
  async def _run_interview_loop(
@@ -262,7 +257,7 @@ async def _run_interview(
262
257
  initial_context: Initial context or idea for the interview.
263
258
  resume_id: Optional interview ID to resume.
264
259
  state_dir: Optional custom state directory.
265
- use_orchestrator: If True, use Claude Code (Max Plan) instead of LiteLLM.
260
+ use_orchestrator: If True, use Claude Code (Max Plan) instead of Anthropic API.
266
261
  """
267
262
  # Initialize components
268
263
  llm_adapter = _get_adapter(use_orchestrator, for_interview=True, debug=debug)
@@ -500,7 +495,7 @@ def start(
500
495
  typer.Option(
501
496
  "--orchestrator",
502
497
  "-o",
503
- help="Use Claude Code (Max Plan) instead of LiteLLM. No API key required.",
498
+ help="Use Claude Code (Max Plan) instead of Anthropic API. No API key required.",
504
499
  ),
505
500
  ] = False,
506
501
  debug: Annotated[
@@ -553,7 +548,7 @@ def start(
553
548
  if orchestrator:
554
549
  print_info("Using Claude Code (Max Plan) - no API key required")
555
550
  else:
556
- print_info("Using LiteLLM - API key required")
551
+ print_info("Using Anthropic API - ANTHROPIC_API_KEY required")
557
552
 
558
553
  # Run interview
559
554
  try:
@@ -581,7 +576,7 @@ def list_interviews(
581
576
  ] = None,
582
577
  ) -> None:
583
578
  """List all interview sessions."""
584
- llm_adapter = LiteLLMAdapter()
579
+ llm_adapter = AnthropicAdapter()
585
580
  engine = InterviewEngine(
586
581
  llm_adapter=llm_adapter,
587
582
  state_dir=state_dir or Path.home() / ".ouroboros" / "data",
@@ -52,6 +52,14 @@ def _derive_quality_bar(seed: Seed) -> str:
52
52
  return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
53
53
 
54
54
 
55
+ def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
56
+ """Prefer the structured verification report when present."""
57
+ verification_report = summary.get("verification_report")
58
+ if isinstance(verification_report, str) and verification_report:
59
+ return verification_report
60
+ return final_message or ""
61
+
62
+
55
63
  def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
56
64
  """Load seed configuration from YAML file.
57
65
 
@@ -238,7 +246,7 @@ async def _run_orchestrator(
238
246
 
239
247
  qa_result = await qa_handler.handle(
240
248
  {
241
- "artifact": res.final_message or "",
249
+ "artifact": _get_verification_artifact(res.summary, res.final_message),
242
250
  "artifact_type": "test_output",
243
251
  "quality_bar": quality_bar,
244
252
  "seed_content": yaml.dump(seed_data, default_flow_style=False),
@@ -888,7 +888,15 @@ class EvolutionaryLoop:
888
888
  exec_result = await self.executor(current_seed, parallel=parallel)
889
889
  if hasattr(exec_result, "is_ok") and exec_result.is_ok:
890
890
  orch_result = exec_result.value
891
- execution_output = getattr(orch_result, "final_message", str(orch_result))
891
+ summary = getattr(orch_result, "summary", {})
892
+ verification_report = (
893
+ summary.get("verification_report") if isinstance(summary, dict) else None
894
+ )
895
+ execution_output = (
896
+ verification_report
897
+ if isinstance(verification_report, str) and verification_report
898
+ else getattr(orch_result, "final_message", str(orch_result))
899
+ )
892
900
  # Log structured metadata for observability
893
901
  logger.info(
894
902
  "evolution.generation.executed",
@@ -290,7 +290,10 @@ class ExecuteSeedHandler:
290
290
  quality_bar = self._derive_quality_bar(seed)
291
291
  qa_result = await qa_handler.handle(
292
292
  {
293
- "artifact": exec_result.final_message or "",
293
+ "artifact": self._get_verification_artifact(
294
+ exec_result.summary,
295
+ exec_result.final_message,
296
+ ),
294
297
  "artifact_type": "test_output",
295
298
  "quality_bar": quality_bar,
296
299
  "seed_content": seed_content,
@@ -335,6 +338,14 @@ class ExecuteSeedHandler:
335
338
  ac_lines = [f"- {ac}" for ac in seed.acceptance_criteria]
336
339
  return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
337
340
 
341
+ @staticmethod
342
+ def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
343
+ """Prefer the structured verification report when present."""
344
+ verification_report = summary.get("verification_report")
345
+ if isinstance(verification_report, str) and verification_report:
346
+ return verification_report
347
+ return final_message or ""
348
+
338
349
  @staticmethod
339
350
  def _format_execution_result(exec_result, seed: Seed) -> str:
340
351
  """Format execution result as human-readable text.
@@ -78,6 +78,7 @@ _STALL_SENTINEL = "__STALL_DETECTED__" # Sentinel error for stall results
78
78
  _MIN_FREE_MEMORY_GB = 2.0
79
79
  _MEMORY_CHECK_INTERVAL_SECONDS = 5.0
80
80
  _MEMORY_WAIT_MAX_SECONDS = 120.0
81
+ _MAX_LEAF_RESULT_CHARS = 1200
81
82
 
82
83
 
83
84
  def _get_available_memory_gb() -> float | None:
@@ -189,6 +190,152 @@ class ParallelExecutionResult:
189
190
  return self.success_count > 0
190
191
 
191
192
 
193
+ def _normalize_command(command: str) -> str:
194
+ """Normalize Bash commands for stable audit output."""
195
+ return " ".join(command.split())
196
+
197
+
198
+ def _truncate_text(text: str, limit: int = _MAX_LEAF_RESULT_CHARS) -> str:
199
+ """Truncate long evidence blocks while preserving their beginning."""
200
+ stripped = text.strip()
201
+ if len(stripped) <= limit:
202
+ return stripped
203
+ return stripped[:limit].rstrip() + "\n[TRUNCATED]"
204
+
205
+
206
+ def _extract_leaf_evidence_lines(result: ACExecutionResult) -> list[str]:
207
+ """Extract normalized command, file, and result evidence for a leaf AC."""
208
+ lines: list[str] = []
209
+ seen_commands: set[str] = set()
210
+ seen_file_ops: set[tuple[str, str]] = set()
211
+
212
+ for message in result.messages:
213
+ if not message.tool_name:
214
+ continue
215
+ tool_input = message.data.get("tool_input", {})
216
+ if not isinstance(tool_input, dict):
217
+ tool_input = {}
218
+
219
+ if message.tool_name == "Bash":
220
+ command = tool_input.get("command")
221
+ if isinstance(command, str):
222
+ normalized = _normalize_command(command)
223
+ if normalized and normalized not in seen_commands:
224
+ if not lines:
225
+ lines.append("Commands Run:")
226
+ lines.append(f"- Bash: {normalized}")
227
+ seen_commands.add(normalized)
228
+ continue
229
+
230
+ if message.tool_name in ("Write", "Edit", "NotebookEdit"):
231
+ path_key = "notebook_path" if message.tool_name == "NotebookEdit" else "file_path"
232
+ file_path = tool_input.get(path_key)
233
+ if isinstance(file_path, str) and file_path:
234
+ file_op = (message.tool_name, file_path)
235
+ if file_op not in seen_file_ops:
236
+ if "File Changes:" not in lines:
237
+ lines.append("File Changes:")
238
+ lines.append(f"- {message.tool_name}: {file_path}")
239
+ seen_file_ops.add(file_op)
240
+
241
+ result_text = result.final_message or (f"Error: {result.error}" if result.error else "")
242
+ if result_text:
243
+ lines.append("Result:")
244
+ lines.append(_truncate_text(result_text))
245
+ return lines
246
+
247
+
248
+ def _render_ac_section(
249
+ result: ACExecutionResult,
250
+ *,
251
+ index_path: tuple[int, ...],
252
+ heading_level: int,
253
+ include_header: bool = True,
254
+ ) -> list[str]:
255
+ """Render a single AC or Sub-AC section for verification/audit output."""
256
+ lines: list[str] = []
257
+ if include_header:
258
+ status = "PASS" if result.success else "FAIL"
259
+ label = "AC" if len(index_path) == 1 else "Sub-AC"
260
+ lines.append(
261
+ f"{'#' * heading_level} {label} {'.'.join(str(i) for i in index_path)}: "
262
+ f"[{status}] {result.ac_content}"
263
+ )
264
+
265
+ if result.is_decomposed and result.sub_results:
266
+ lines.append(f"Decomposed into {len(result.sub_results)} Sub-ACs")
267
+ for idx, sub_result in enumerate(result.sub_results, start=1):
268
+ if lines:
269
+ lines.append("")
270
+ lines.extend(
271
+ _render_ac_section(
272
+ sub_result,
273
+ index_path=index_path + (idx,),
274
+ heading_level=min(heading_level + 1, 6),
275
+ )
276
+ )
277
+ return lines
278
+
279
+ evidence_lines = _extract_leaf_evidence_lines(result)
280
+ if evidence_lines:
281
+ lines.extend(evidence_lines)
282
+ else:
283
+ lines.append("Result:")
284
+ lines.append("No final result message captured.")
285
+ return lines
286
+
287
+
288
+ def render_parallel_verification_report(
289
+ parallel_result: ParallelExecutionResult,
290
+ total_acceptance_criteria: int,
291
+ ) -> str:
292
+ """Build the canonical QA artifact for parallel execution results."""
293
+ lines = [
294
+ "Parallel Execution Verification Report",
295
+ f"Success: {parallel_result.success_count}/{total_acceptance_criteria}",
296
+ ]
297
+ if parallel_result.failure_count > 0:
298
+ lines.append(f"Failed: {parallel_result.failure_count}")
299
+ if parallel_result.skipped_count > 0:
300
+ lines.append(f"Skipped: {parallel_result.skipped_count}")
301
+
302
+ lines.append("")
303
+ lines.append("## AC Results")
304
+ for result in parallel_result.results:
305
+ lines.append("")
306
+ lines.extend(
307
+ _render_ac_section(
308
+ result,
309
+ index_path=(result.ac_index + 1,),
310
+ heading_level=3,
311
+ )
312
+ )
313
+ return "\n".join(lines)
314
+
315
+
316
+ def render_parallel_completion_message(
317
+ parallel_result: ParallelExecutionResult,
318
+ total_acceptance_criteria: int,
319
+ ) -> str:
320
+ """Build a concise operator-facing completion summary."""
321
+ lines = [
322
+ "Parallel Execution Complete",
323
+ f"Success: {parallel_result.success_count}/{total_acceptance_criteria}",
324
+ ]
325
+ if parallel_result.failure_count > 0:
326
+ lines.append(f"Failed: {parallel_result.failure_count}")
327
+ if parallel_result.skipped_count > 0:
328
+ lines.append(f"Skipped: {parallel_result.skipped_count}")
329
+
330
+ lines.append("")
331
+ lines.append("AC Status:")
332
+ for result in parallel_result.results:
333
+ status = "PASS" if result.success else "FAIL"
334
+ suffix = f" ({len(result.sub_results)} sub-ACs)" if result.is_decomposed else ""
335
+ lines.append(f"- AC {result.ac_index + 1}: [{status}] {result.ac_content}{suffix}")
336
+ return "\n".join(lines)
337
+
338
+
192
339
  # =============================================================================
193
340
  # Parallel Executor
194
341
  # =============================================================================
@@ -988,7 +1135,23 @@ class ParallelACExecutor:
988
1135
  ac_content=ac_content,
989
1136
  success=all_success,
990
1137
  messages=(),
991
- final_message=f"Decomposed into {len(sub_acs)} Sub-ACs",
1138
+ final_message="\n".join(
1139
+ _render_ac_section(
1140
+ ACExecutionResult(
1141
+ ac_index=ac_index,
1142
+ ac_content=ac_content,
1143
+ success=all_success,
1144
+ messages=(),
1145
+ duration_seconds=duration,
1146
+ is_decomposed=True,
1147
+ sub_results=tuple(sub_results),
1148
+ depth=depth,
1149
+ ),
1150
+ index_path=(ac_index + 1,),
1151
+ heading_level=3,
1152
+ include_header=False,
1153
+ )
1154
+ ),
992
1155
  duration_seconds=duration,
993
1156
  is_decomposed=True,
994
1157
  sub_results=tuple(sub_results),
@@ -1144,7 +1144,11 @@ class OrchestratorRunner:
1144
1144
  Result containing OrchestratorResult on success.
1145
1145
  """
1146
1146
  from ouroboros.orchestrator.dependency_analyzer import DependencyAnalyzer
1147
- from ouroboros.orchestrator.parallel_executor import ParallelACExecutor
1147
+ from ouroboros.orchestrator.parallel_executor import (
1148
+ ParallelACExecutor,
1149
+ render_parallel_completion_message,
1150
+ render_parallel_verification_report,
1151
+ )
1148
1152
 
1149
1153
  log.info(
1150
1154
  "orchestrator.runner.parallel_mode_enabled",
@@ -1234,43 +1238,30 @@ class OrchestratorRunner:
1234
1238
  # Determine overall success
1235
1239
  success = parallel_result.all_succeeded
1236
1240
 
1237
- # Build summary message with per-AC results for downstream evaluation.
1238
- # The evaluator uses final_message as the artifact to judge compliance,
1239
- # so a bare "Success: 6/6" gives it no evidence to work with.
1240
- summary_parts = [
1241
- "Parallel Execution Complete",
1242
- f"Success: {parallel_result.success_count}/{len(seed.acceptance_criteria)}",
1243
- ]
1244
- if parallel_result.failure_count > 0:
1245
- summary_parts.append(f"Failed: {parallel_result.failure_count}")
1246
- if parallel_result.skipped_count > 0:
1247
- summary_parts.append(f"Skipped: {parallel_result.skipped_count}")
1248
-
1249
- summary_parts.append("\n## AC Results")
1250
- for r in parallel_result.results:
1251
- status = "PASS" if r.success else "FAIL"
1252
- ac_label = f"AC {r.ac_index + 1}"
1253
- summary_parts.append(f"\n### {ac_label}: [{status}] {r.ac_content}")
1254
- if r.final_message:
1255
- # Include last 500 chars of agent output as evidence
1256
- evidence = r.final_message[-500:] if len(r.final_message) > 500 else r.final_message
1257
- summary_parts.append(evidence)
1258
- elif r.error:
1259
- summary_parts.append(f"Error: {r.error}")
1260
-
1261
- final_message = "\n".join(summary_parts)
1241
+ final_message = render_parallel_completion_message(
1242
+ parallel_result,
1243
+ len(seed.acceptance_criteria),
1244
+ )
1245
+ verification_report = render_parallel_verification_report(
1246
+ parallel_result,
1247
+ len(seed.acceptance_criteria),
1248
+ )
1249
+ execution_summary = {
1250
+ "goal": seed.goal,
1251
+ "acceptance_criteria_count": len(seed.acceptance_criteria),
1252
+ "parallel_execution": True,
1253
+ "success_count": parallel_result.success_count,
1254
+ "failure_count": parallel_result.failure_count,
1255
+ "skipped_count": parallel_result.skipped_count,
1256
+ "total_levels": dependency_graph.total_levels,
1257
+ "verification_report": verification_report,
1258
+ }
1262
1259
 
1263
1260
  # Emit completion event
1264
1261
  if success:
1265
1262
  completed_event = create_session_completed_event(
1266
1263
  session_id=tracker.session_id,
1267
- summary={
1268
- "parallel_execution": True,
1269
- "success_count": parallel_result.success_count,
1270
- "failure_count": parallel_result.failure_count,
1271
- "skipped_count": parallel_result.skipped_count,
1272
- "total_levels": dependency_graph.total_levels,
1273
- },
1264
+ summary=execution_summary,
1274
1265
  messages_processed=parallel_result.total_messages,
1275
1266
  )
1276
1267
  await self._event_store.append(completed_event)
@@ -1327,14 +1318,7 @@ class OrchestratorRunner:
1327
1318
  success=success,
1328
1319
  session_id=tracker.session_id,
1329
1320
  execution_id=exec_id,
1330
- summary={
1331
- "goal": seed.goal,
1332
- "acceptance_criteria_count": len(seed.acceptance_criteria),
1333
- "parallel_execution": True,
1334
- "success_count": parallel_result.success_count,
1335
- "failure_count": parallel_result.failure_count,
1336
- "skipped_count": parallel_result.skipped_count,
1337
- },
1321
+ summary=execution_summary,
1338
1322
  messages_processed=parallel_result.total_messages,
1339
1323
  final_message=final_message,
1340
1324
  duration_seconds=duration,
@@ -74,7 +74,7 @@ class TestInitCommand:
74
74
  ) -> None:
75
75
  """Test init start with context argument."""
76
76
  # Mock the LLM adapter and asyncio.run
77
- with patch("ouroboros.cli.commands.init.LiteLLMAdapter") as mock_adapter_class:
77
+ with patch("ouroboros.cli.commands.init.AnthropicAdapter") as mock_adapter_class:
78
78
  mock_adapter = MagicMock()
79
79
  mock_adapter.complete = mock_interview_llm_provider.complete
80
80
  mock_adapter_class.return_value = mock_adapter
@@ -107,7 +107,7 @@ class TestInitCommand:
107
107
 
108
108
  def test_init_list_no_interviews(self, temp_state_dir: Path) -> None:
109
109
  """Test init list when no interviews exist."""
110
- with patch("ouroboros.cli.commands.init.LiteLLMAdapter"):
110
+ with patch("ouroboros.cli.commands.init.AnthropicAdapter"):
111
111
  with patch("ouroboros.cli.commands.init.asyncio.run") as mock_run:
112
112
  mock_run.return_value = []
113
113
 
@@ -121,7 +121,7 @@ class TestInitCommand:
121
121
 
122
122
  def test_init_resume_missing_interview(self, temp_state_dir: Path) -> None:
123
123
  """Test init resume with non-existent interview ID."""
124
- with patch("ouroboros.cli.commands.init.LiteLLMAdapter") as mock_adapter_class:
124
+ with patch("ouroboros.cli.commands.init.AnthropicAdapter") as mock_adapter_class:
125
125
  mock_adapter = MagicMock()
126
126
  mock_adapter_class.return_value = mock_adapter
127
127