ouroboros-ai 0.26.0b8.dev1__tar.gz → 0.26.1.dev2__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 (550) hide show
  1. ouroboros_ai-0.26.1.dev2/.claude-plugin/.mcp.json +9 -0
  2. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude-plugin/marketplace.json +1 -1
  3. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude-plugin/plugin.json +1 -1
  4. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/PKG-INFO +10 -35
  5. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/README.ko.md +1 -1
  6. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/README.md +6 -34
  7. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/pyproject.toml +3 -4
  8. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/install.sh +5 -5
  9. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/setup/SKILL.md +1 -1
  10. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/update/SKILL.md +2 -1
  11. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/_version.py +2 -2
  12. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/ambiguity.py +28 -10
  13. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/run.py +9 -1
  14. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/loop.py +9 -1
  15. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/execution_handlers.py +12 -1
  16. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/codex_cli_runtime.py +20 -0
  17. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/parallel_executor.py +165 -1
  18. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runner.py +25 -72
  19. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/session.py +7 -0
  20. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/event_store.py +7 -7
  21. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/__init__.py +8 -5
  22. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/codex_cli_adapter.py +17 -0
  23. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/session_selector.py +9 -1
  24. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_ambiguity.py +62 -0
  25. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_main.py +5 -4
  26. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_context.py +8 -0
  27. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_qa_integration.py +6 -1
  28. ouroboros_ai-0.26.1.dev2/tests/unit/orchestrator/test_codex_recursion_guard.py +90 -0
  29. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runner.py +119 -0
  30. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_session.py +78 -0
  31. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_event_store.py +64 -0
  32. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_litellm_adapter.py +1 -1
  33. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_artifact_collector.py +19 -0
  34. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_dependencies_configured.py +1 -1
  35. ouroboros_ai-0.26.1.dev2/tests/unit/tui/test_session_selector_replay.py +184 -0
  36. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/uv.lock +1051 -207
  37. ouroboros_ai-0.26.0b8.dev1/.claude-plugin/.mcp.json +0 -9
  38. ouroboros_ai-0.26.0b8.dev1/crates/ouroboros-tui/COLOR_SYSTEM.md +0 -320
  39. ouroboros_ai-0.26.0b8.dev1/docs/images/demo-evaluation.png +0 -0
  40. ouroboros_ai-0.26.0b8.dev1/docs/images/demo-interview.png +0 -0
  41. ouroboros_ai-0.26.0b8.dev1/docs/images/demo-seed.png +0 -0
  42. ouroboros_ai-0.26.0b8.dev1/docs/images/demo-tui-dashboard.png +0 -0
  43. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude/settings.json +0 -0
  44. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.env.example +0 -0
  45. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/dev-publish.yml +0 -0
  46. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/lint.yml +0 -0
  47. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/release.yml +0 -0
  48. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/test.yml +0 -0
  49. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.gitignore +0 -0
  50. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.mcp.json +0 -0
  51. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.ouroboros/mechanical.toml +0 -0
  52. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.pre-commit-config.yaml +0 -0
  53. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.python-version +0 -0
  54. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CHANGELOG.md +0 -0
  55. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CLAUDE.md +0 -0
  56. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CONTRIBUTING.md +0 -0
  57. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/HANDOFF.md +0 -0
  58. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/LICENSE +0 -0
  59. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/SECURITY.md +0 -0
  60. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/cancel.md +0 -0
  61. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/evaluate.md +0 -0
  62. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/evolve.md +0 -0
  63. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/help.md +0 -0
  64. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/interview.md +0 -0
  65. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/ralph.md +0 -0
  66. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/run.md +0 -0
  67. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/seed.md +0 -0
  68. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/setup.md +0 -0
  69. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/status.md +0 -0
  70. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/tutorial.md +0 -0
  71. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/unstuck.md +0 -0
  72. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/welcome.md +0 -0
  73. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/.gitignore +0 -0
  74. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/Cargo.lock +0 -0
  75. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/Cargo.toml +0 -0
  76. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/README.md +0 -0
  77. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/db.rs +0 -0
  78. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/main.rs +0 -0
  79. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/mock.rs +0 -0
  80. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/state.rs +0 -0
  81. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  82. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  83. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  84. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  85. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  86. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  87. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/README.md +0 -0
  88. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/README.md +0 -0
  89. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/core.md +0 -0
  90. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/mcp.md +0 -0
  91. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/architecture.md +0 -0
  92. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/cli-reference.md +0 -0
  93. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/config-reference.md +0 -0
  94. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/architecture-overview.md +0 -0
  95. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/findings-registry.md +0 -0
  96. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/key-patterns.md +0 -0
  97. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/testing-guide.md +0 -0
  98. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/examples/mcp-config.yaml +0 -0
  99. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/getting-started.md +0 -0
  100. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/evaluation-pipeline.md +0 -0
  101. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/evolution-loop.md +0 -0
  102. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  103. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/seed-authoring.md +0 -0
  104. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/tui-usage.md +0 -0
  105. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/images/PLACEHOLDER_README.md +0 -0
  106. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/images/ouroboros.png +0 -0
  107. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/platform-support.md +0 -0
  108. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-capability-matrix.md +0 -0
  109. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-guides/claude-code.md +0 -0
  110. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-guides/codex.md +0 -0
  111. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/coordinator_test_seed.yaml +0 -0
  112. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/dummy_seed.yaml +0 -0
  113. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/parallel_subac_test_seed.yaml +0 -0
  114. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/subac_test_seed.yaml +0 -0
  115. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/README.md +0 -0
  116. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/__init__.py +0 -0
  117. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/__main__.py +0 -0
  118. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/cli.py +0 -0
  119. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/models.py +0 -0
  120. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/storage.py +0 -0
  121. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/test_display.py +0 -0
  122. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/hooks/hooks.json +0 -0
  123. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/llms-full.txt +0 -0
  124. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/llms.txt +0 -0
  125. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/project-context.md +0 -0
  126. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/drift-monitor.py +0 -0
  127. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/keyword-detector.py +0 -0
  128. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/mcp-serve.sh +0 -0
  129. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph-rewind.py +0 -0
  130. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph.py +0 -0
  131. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph.sh +0 -0
  132. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/session-start.py +0 -0
  133. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/sync-plugin-version.py +0 -0
  134. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/version-check.py +0 -0
  135. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/brownfield/SKILL.md +0 -0
  136. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/cancel/SKILL.md +0 -0
  137. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/evaluate/SKILL.md +0 -0
  138. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/evolve/SKILL.md +0 -0
  139. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/help/SKILL.md +0 -0
  140. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/interview/SKILL.md +0 -0
  141. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/pm/SKILL.md +0 -0
  142. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/qa/SKILL.md +0 -0
  143. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/ralph/SKILL.md +0 -0
  144. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/run/SKILL.md +0 -0
  145. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/seed/SKILL.md +0 -0
  146. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/status/SKILL.md +0 -0
  147. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/tutorial/SKILL.md +0 -0
  148. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/unstuck/SKILL.md +0 -0
  149. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/welcome/SKILL.md +0 -0
  150. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/__init__.py +0 -0
  151. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/__main__.py +0 -0
  152. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/__init__.py +0 -0
  153. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/advocate.md +0 -0
  154. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/analysis-agent.md +0 -0
  155. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/architect.md +0 -0
  156. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/breadth-keeper.md +0 -0
  157. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/code-executor.md +0 -0
  158. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/codebase-explorer.md +0 -0
  159. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  160. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/contrarian.md +0 -0
  161. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/evaluator.md +0 -0
  162. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/hacker.md +0 -0
  163. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/judge.md +0 -0
  164. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/loader.py +0 -0
  165. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/ontologist.md +0 -0
  166. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/ontology-analyst.md +0 -0
  167. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/qa-judge.md +0 -0
  168. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/research-agent.md +0 -0
  169. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/researcher.md +0 -0
  170. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/seed-architect.md +0 -0
  171. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/seed-closer.md +0 -0
  172. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  173. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/simplifier.md +0 -0
  174. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  175. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/__init__.py +0 -0
  176. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/brownfield.py +0 -0
  177. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/explore.py +0 -0
  178. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/interview.py +0 -0
  179. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_document.py +0 -0
  180. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_interview.py +0 -0
  181. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_seed.py +0 -0
  182. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/question_classifier.py +0 -0
  183. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/seed_generator.py +0 -0
  184. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/__init__.py +0 -0
  185. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/__init__.py +0 -0
  186. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/cancel.py +0 -0
  187. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/config.py +0 -0
  188. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/init.py +0 -0
  189. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/mcp.py +0 -0
  190. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/pm.py +0 -0
  191. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/setup.py +0 -0
  192. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/status.py +0 -0
  193. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/tui.py +0 -0
  194. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/__init__.py +0 -0
  195. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/panels.py +0 -0
  196. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/progress.py +0 -0
  197. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/tables.py +0 -0
  198. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  199. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/main.py +0 -0
  200. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/__init__.py +0 -0
  201. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/artifacts.py +0 -0
  202. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/ouroboros.md +0 -0
  203. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex_permissions.py +0 -0
  204. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/__init__.py +0 -0
  205. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/loader.py +0 -0
  206. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/models.py +0 -0
  207. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/__init__.py +0 -0
  208. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ac_tree.py +0 -0
  209. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/context.py +0 -0
  210. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/errors.py +0 -0
  211. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/file_lock.py +0 -0
  212. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/git_workflow.py +0 -0
  213. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/lineage.py +0 -0
  214. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ontology_aspect.py +0 -0
  215. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ontology_questions.py +0 -0
  216. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/security.py +0 -0
  217. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/seed.py +0 -0
  218. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/text.py +0 -0
  219. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/types.py +0 -0
  220. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/__init__.py +0 -0
  221. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  222. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/consensus.py +0 -0
  223. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/json_utils.py +0 -0
  224. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/languages.py +0 -0
  225. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/mechanical.py +0 -0
  226. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/models.py +0 -0
  227. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/pipeline.py +0 -0
  228. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/semantic.py +0 -0
  229. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/trigger.py +0 -0
  230. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/__init__.py +0 -0
  231. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/base.py +0 -0
  232. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/decomposition.py +0 -0
  233. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/evaluation.py +0 -0
  234. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/interview.py +0 -0
  235. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/lineage.py +0 -0
  236. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/ontology.py +0 -0
  237. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/__init__.py +0 -0
  238. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/convergence.py +0 -0
  239. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/projector.py +0 -0
  240. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/reflect.py +0 -0
  241. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/regression.py +0 -0
  242. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/wonder.py +0 -0
  243. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/__init__.py +0 -0
  244. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/atomicity.py +0 -0
  245. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/decomposition.py +0 -0
  246. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/double_diamond.py +0 -0
  247. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/subagent.py +0 -0
  248. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/__init__.py +0 -0
  249. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/__init__.py +0 -0
  250. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/adapter.py +0 -0
  251. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/manager.py +0 -0
  252. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/protocol.py +0 -0
  253. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/errors.py +0 -0
  254. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/job_manager.py +0 -0
  255. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/resources/__init__.py +0 -0
  256. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/resources/handlers.py +0 -0
  257. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/__init__.py +0 -0
  258. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/adapter.py +0 -0
  259. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/protocol.py +0 -0
  260. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/security.py +0 -0
  261. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/__init__.py +0 -0
  262. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  263. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  264. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  265. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/definitions.py +0 -0
  266. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  267. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  268. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  269. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  270. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/qa.py +0 -0
  271. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  272. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/registry.py +0 -0
  273. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/types.py +0 -0
  274. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/__init__.py +0 -0
  275. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/drift.py +0 -0
  276. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/logging.py +0 -0
  277. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/retrospective.py +0 -0
  278. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/__init__.py +0 -0
  279. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/adapter.py +0 -0
  280. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  281. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/coordinator.py +0 -0
  282. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  283. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/events.py +0 -0
  284. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  285. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  286. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  287. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/level_context.py +0 -0
  288. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  289. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  290. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  291. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  292. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  293. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  294. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/__init__.py +0 -0
  295. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/brownfield.py +0 -0
  296. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/checkpoint.py +0 -0
  297. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  298. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/runner.py +0 -0
  299. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  300. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  301. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/schema.py +0 -0
  302. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/uow.py +0 -0
  303. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/__init__.py +0 -0
  304. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/__init__.py +0 -0
  305. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/pool.py +0 -0
  306. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/registry.py +0 -0
  307. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  308. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/router.py +0 -0
  309. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  310. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/__init__.py +0 -0
  311. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/docs.py +0 -0
  312. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/executor.py +0 -0
  313. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/keywords.py +0 -0
  314. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/registry.py +0 -0
  315. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/pm/__init__.py +0 -0
  316. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/pm/renderer.py +0 -0
  317. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  318. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/base.py +0 -0
  319. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  320. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  321. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/factory.py +0 -0
  322. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/litellm_adapter.py +0 -0
  323. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/py.typed +0 -0
  324. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/__init__.py +0 -0
  325. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/lateral.py +0 -0
  326. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/stagnation.py +0 -0
  327. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/__init__.py +0 -0
  328. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/complexity.py +0 -0
  329. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/downgrade.py +0 -0
  330. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/escalation.py +0 -0
  331. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/router.py +0 -0
  332. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/tiers.py +0 -0
  333. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/__init__.py +0 -0
  334. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/scheduler.py +0 -0
  335. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/todo_registry.py +0 -0
  336. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/strategies/__init__.py +0 -0
  337. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/strategies/devil_advocate.py +0 -0
  338. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/__init__.py +0 -0
  339. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/app.py +0 -0
  340. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/__init__.py +0 -0
  341. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/agents_panel.py +0 -0
  342. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/event_log.py +0 -0
  343. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/progress.py +0 -0
  344. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/token_tracker.py +0 -0
  345. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/events.py +0 -0
  346. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/__init__.py +0 -0
  347. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  348. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard.py +0 -0
  349. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  350. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  351. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/debug.py +0 -0
  352. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/execution.py +0 -0
  353. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  354. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  355. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  356. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/logs.py +0 -0
  357. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/__init__.py +0 -0
  358. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  359. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  360. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  361. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  362. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  363. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  364. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  365. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  366. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/__init__.py +0 -0
  367. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/extractor.py +0 -0
  368. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/models.py +0 -0
  369. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/verifier.py +0 -0
  370. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/__init__.py +0 -0
  371. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/conftest.py +0 -0
  372. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/__init__.py +0 -0
  373. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/conftest.py +0 -0
  374. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_cli_commands.py +0 -0
  375. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_full_workflow.py +0 -0
  376. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_session_persistence.py +0 -0
  377. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/fixtures/test_atomicity_seed.yml +0 -0
  378. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/__init__.py +0 -0
  379. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/conftest.py +0 -0
  380. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/__init__.py +0 -0
  381. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/conftest.py +0 -0
  382. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_client_adapter.py +0 -0
  383. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_client_manager.py +0 -0
  384. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_server_adapter.py +0 -0
  385. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/plugin/test_orchestration.py +0 -0
  386. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  387. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_skill_fallback.py +0 -0
  388. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_skill_smoke.py +0 -0
  389. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_entry_point.py +0 -0
  390. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/__init__.py +0 -0
  391. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/agents/__init__.py +0 -0
  392. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/agents/test_loader.py +0 -0
  393. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/__init__.py +0 -0
  394. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_brownfield.py +0 -0
  395. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_classifier_context.py +0 -0
  396. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  397. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_explore.py +0 -0
  398. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_interview.py +0 -0
  399. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  400. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  401. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_interview.py +0 -0
  402. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  403. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  404. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  405. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_question_classifier.py +0 -0
  406. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_seed_generator.py +0 -0
  407. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/__init__.py +0 -0
  408. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/__init__.py +0 -0
  409. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_console.py +0 -0
  410. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_panels.py +0 -0
  411. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_progress.py +0 -0
  412. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_tables.py +0 -0
  413. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  414. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_cancel.py +0 -0
  415. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  416. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_init_runtime.py +0 -0
  417. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  418. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  419. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_brownfield.py +0 -0
  420. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_overwrite.py +0 -0
  421. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_select_repos.py +0 -0
  422. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_setup.py +0 -0
  423. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/__init__.py +0 -0
  424. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/test_loader.py +0 -0
  425. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/test_models.py +0 -0
  426. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/__init__.py +0 -0
  427. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ac_tree.py +0 -0
  428. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_errors.py +0 -0
  429. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_git_workflow.py +0 -0
  430. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_lineage.py +0 -0
  431. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ontology_aspect.py +0 -0
  432. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ontology_questions.py +0 -0
  433. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_security.py +0 -0
  434. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_seed.py +0 -0
  435. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_types.py +0 -0
  436. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/__init__.py +0 -0
  437. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_consensus.py +0 -0
  438. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_json_utils.py +0 -0
  439. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_languages.py +0 -0
  440. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_mechanical.py +0 -0
  441. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_models.py +0 -0
  442. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_semantic.py +0 -0
  443. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_trigger.py +0 -0
  444. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/__init__.py +0 -0
  445. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/test_base.py +0 -0
  446. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/test_decomposition_events.py +0 -0
  447. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evolution/test_wonder_scope.py +0 -0
  448. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/__init__.py +0 -0
  449. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_atomicity.py +0 -0
  450. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_decomposition.py +0 -0
  451. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_double_diamond.py +0 -0
  452. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_subagent_isolation.py +0 -0
  453. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/__init__.py +0 -0
  454. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/__init__.py +0 -0
  455. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/test_adapter.py +0 -0
  456. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/test_manager.py +0 -0
  457. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/conftest.py +0 -0
  458. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/__init__.py +0 -0
  459. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/test_adapter.py +0 -0
  460. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/test_security.py +0 -0
  461. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_errors.py +0 -0
  462. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_job_manager.py +0 -0
  463. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_types.py +0 -0
  464. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/__init__.py +0 -0
  465. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/conftest.py +0 -0
  466. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  467. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_definitions.py +0 -0
  468. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  469. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  470. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  471. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_registry.py +0 -0
  472. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/__init__.py +0 -0
  473. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_drift.py +0 -0
  474. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_logging.py +0 -0
  475. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_retrospective.py +0 -0
  476. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/__init__.py +0 -0
  477. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_adapter.py +0 -0
  478. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  479. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  480. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_coordinator.py +0 -0
  481. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  482. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_events.py +0 -0
  483. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  484. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  485. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  486. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_level_context.py +0 -0
  487. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  488. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  489. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  490. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  491. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  492. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  493. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  494. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  495. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/__init__.py +0 -0
  496. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_brownfield_store.py +0 -0
  497. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_checkpoint.py +0 -0
  498. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_schema.py +0 -0
  499. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_uow.py +0 -0
  500. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/__init__.py +0 -0
  501. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/agents/__init__.py +0 -0
  502. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/agents/test_registry.py +0 -0
  503. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/orchestration/__init__.py +0 -0
  504. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  505. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/__init__.py +0 -0
  506. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/test_keywords.py +0 -0
  507. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/test_registry.py +0 -0
  508. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/pm/__init__.py +0 -0
  509. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/pm/test_renderer.py +0 -0
  510. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/__init__.py +0 -0
  511. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_base.py +0 -0
  512. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  513. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  514. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_factory.py +0 -0
  515. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/__init__.py +0 -0
  516. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/test_lateral.py +0 -0
  517. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/test_stagnation.py +0 -0
  518. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/__init__.py +0 -0
  519. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_complexity.py +0 -0
  520. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_downgrade.py +0 -0
  521. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_escalation.py +0 -0
  522. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_router.py +0 -0
  523. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_tiers.py +0 -0
  524. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/scripts/test_keyword_detector.py +0 -0
  525. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/scripts/test_version_check.py +0 -0
  526. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/__init__.py +0 -0
  527. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/test_scheduler.py +0 -0
  528. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/test_todo_registry.py +0 -0
  529. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_codex_artifacts.py +0 -0
  530. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_convergence.py +0 -0
  531. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_dashboard.py +0 -0
  532. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_evolve_rewind.py +0 -0
  533. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_evolve_step.py +0 -0
  534. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_main_entry_point.py +0 -0
  535. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_module_structure.py +0 -0
  536. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_project_initialization.py +0 -0
  537. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_projector_rewind.py +0 -0
  538. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_ralph_parser.py +0 -0
  539. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_ralph_rewind.py +0 -0
  540. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_regression.py +0 -0
  541. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_tooling_configuration.py +0 -0
  542. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_verification.py +0 -0
  543. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/__init__.py +0 -0
  544. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_app.py +0 -0
  545. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_cancelled_display.py +0 -0
  546. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_events.py +0 -0
  547. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_lineage_viewer.py +0 -0
  548. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_screens.py +0 -0
  549. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_widgets.py +0 -0
  550. {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tools/sync_github_project.py +0 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcpServers": {
3
+ "ouroboros": {
4
+ "command": "uvx",
5
+ "args": ["--from", "ouroboros-ai", "ouroboros", "mcp", "serve"],
6
+ "timeout": 600
7
+ }
8
+ }
9
+ }
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "ouroboros",
12
12
  "description": "Transform vague ideas into validated seed specifications through Socratic questioning and ontological analysis",
13
- "version": "0.26.0b7",
13
+ "version": "0.26.0",
14
14
  "author": {
15
15
  "name": "Q00",
16
16
  "email": "jqyu.lee@gmail.com"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ouroboros",
3
- "version": "0.26.0b7",
3
+ "version": "0.26.0",
4
4
  "description": "Self-improving AI workflow system. Crystallize requirements before execution with Socratic interview, ambiguity scoring, and 3-stage evaluation.",
5
5
  "author": {
6
6
  "name": "Q00",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.26.0b8.dev1
3
+ Version: 0.26.1.dev2
4
4
  Summary: Specification-first workflow engine for AI coding agents. Works with Claude Code and Codex CLI.
5
5
  Author-email: Q00 <jqyu.lee@gmail.com>
6
6
  License-File: LICENSE
@@ -23,6 +23,7 @@ Requires-Dist: typer>=0.12.0
23
23
  Provides-Extra: all
24
24
  Requires-Dist: anthropic>=0.52.0; extra == 'all'
25
25
  Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'all'
26
+ Requires-Dist: litellm<=1.82.6,>=1.80.0; extra == 'all'
26
27
  Requires-Dist: pandas>=2.2.0; extra == 'all'
27
28
  Requires-Dist: plotly>=5.24.0; extra == 'all'
28
29
  Requires-Dist: streamlit>=1.40.0; extra == 'all'
@@ -33,6 +34,8 @@ Provides-Extra: dashboard
33
34
  Requires-Dist: pandas>=2.2.0; extra == 'dashboard'
34
35
  Requires-Dist: plotly>=5.24.0; extra == 'dashboard'
35
36
  Requires-Dist: streamlit>=1.40.0; extra == 'dashboard'
37
+ Provides-Extra: litellm
38
+ Requires-Dist: litellm<=1.82.6,>=1.80.0; extra == 'litellm'
36
39
  Description-Content-Type: text/markdown
37
40
 
38
41
  <p align="right">
@@ -77,18 +80,14 @@ Description-Content-Type: text/markdown
77
80
 
78
81
  > **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
79
82
  >
80
- > LiteLLM versions 1.82.7 and 1.82.8 on PyPI contained a malicious `.pth` file that **auto-executes on every Python startup** (no `import` needed), exfiltrating environment variables, API keys, SSH keys, and cloud credentials to an external server.
83
+ > LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
81
84
  >
82
- > **Am I affected?** You are at risk if, **after March 23, 2026**, you either:
83
- > - Fresh-installed Ouroboros (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`), or
84
- > - Upgraded an existing install (`pip install --upgrade ouroboros-ai`)
85
+ > **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
85
86
  >
86
- > In both cases, `litellm>=1.80.0` was a dependency, and your package manager would have resolved it to the malicious 1.82.7/1.82.8. If you installed before that date and haven't reinstalled or upgraded since, you are likely safe.
87
- >
88
- > **Ouroboros has removed litellm entirely** as of v0.25.2 (stable) and v0.26.0b7 (beta). However, **upgrading Ouroboros only removes litellm from the dependency list — it does NOT uninstall litellm itself or delete the malicious `.pth` file already on your system.** You must clean up manually:
87
+ > **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
89
88
  >
90
89
  > ```bash
91
- > # 1. Find the malicious file — delete any results
90
+ > # 1. Find and delete the malicious file
92
91
  > find / -name "litellm_init.pth" 2>/dev/null
93
92
  >
94
93
  > # 2. Clean package manager caches
@@ -98,7 +97,7 @@ Description-Content-Type: text/markdown
98
97
  > # 3. Rotate ALL credentials that were on your system during the exposure window
99
98
  > ```
100
99
  >
101
- > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [Analysis](https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/)
100
+ > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
102
101
 
103
102
  ---
104
103
 
@@ -106,11 +105,6 @@ Description-Content-Type: text/markdown
106
105
 
107
106
  Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
108
107
 
109
- <!-- TODO: Replace with demo GIF or asciicast -->
110
- <p align="center">
111
- <em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
112
- </p>
113
-
114
108
  ---
115
109
 
116
110
  ## Why Ouroboros?
@@ -130,7 +124,7 @@ Most AI coding fails at the **input**, not the output. The bottleneck is not AI
130
124
  **Install** — one command, everything auto-detected:
131
125
 
132
126
  ```bash
133
- curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/release/0.26.0-beta/scripts/install.sh | bash
127
+ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
134
128
  ```
135
129
 
136
130
  **Build** — open your AI coding agent and go:
@@ -176,25 +170,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
176
170
  | **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
177
171
  | **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
178
172
 
179
- <!-- Screenshots: replace placeholder paths with actual images after recording -->
180
- <p align="center">
181
- <strong>Interview Transcript</strong><br/>
182
- <img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
183
- <sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
184
- </p>
185
-
186
- <p align="center">
187
- <strong>Seed Artifact</strong><br/>
188
- <img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
189
- <sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
190
- </p>
191
-
192
- <p align="center">
193
- <strong>Evaluation Verdict</strong><br/>
194
- <img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
195
- <sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
196
- </p>
197
-
198
173
  <details>
199
174
  <summary><strong>What just happened?</strong></summary>
200
175
 
@@ -112,7 +112,7 @@ Ouroboros는 이 철학을 **Double Diamond** 구조로 풀어냅니다:
112
112
  **설치** — 한 줄이면 전부 자동:
113
113
 
114
114
  ```bash
115
- curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/release/0.26.0-beta/scripts/install.sh | bash
115
+ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
116
116
  ```
117
117
 
118
118
  **시작** — AI 코딩 에이전트를 열고 바로:
@@ -40,18 +40,14 @@
40
40
 
41
41
  > **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
42
42
  >
43
- > LiteLLM versions 1.82.7 and 1.82.8 on PyPI contained a malicious `.pth` file that **auto-executes on every Python startup** (no `import` needed), exfiltrating environment variables, API keys, SSH keys, and cloud credentials to an external server.
43
+ > LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
44
44
  >
45
- > **Am I affected?** You are at risk if, **after March 23, 2026**, you either:
46
- > - Fresh-installed Ouroboros (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`), or
47
- > - Upgraded an existing install (`pip install --upgrade ouroboros-ai`)
45
+ > **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
48
46
  >
49
- > In both cases, `litellm>=1.80.0` was a dependency, and your package manager would have resolved it to the malicious 1.82.7/1.82.8. If you installed before that date and haven't reinstalled or upgraded since, you are likely safe.
50
- >
51
- > **Ouroboros has removed litellm entirely** as of v0.25.2 (stable) and v0.26.0b7 (beta). However, **upgrading Ouroboros only removes litellm from the dependency list — it does NOT uninstall litellm itself or delete the malicious `.pth` file already on your system.** You must clean up manually:
47
+ > **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
52
48
  >
53
49
  > ```bash
54
- > # 1. Find the malicious file — delete any results
50
+ > # 1. Find and delete the malicious file
55
51
  > find / -name "litellm_init.pth" 2>/dev/null
56
52
  >
57
53
  > # 2. Clean package manager caches
@@ -61,7 +57,7 @@
61
57
  > # 3. Rotate ALL credentials that were on your system during the exposure window
62
58
  > ```
63
59
  >
64
- > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [Analysis](https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/)
60
+ > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
65
61
 
66
62
  ---
67
63
 
@@ -69,11 +65,6 @@
69
65
 
70
66
  Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
71
67
 
72
- <!-- TODO: Replace with demo GIF or asciicast -->
73
- <p align="center">
74
- <em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
75
- </p>
76
-
77
68
  ---
78
69
 
79
70
  ## Why Ouroboros?
@@ -93,7 +84,7 @@ Most AI coding fails at the **input**, not the output. The bottleneck is not AI
93
84
  **Install** — one command, everything auto-detected:
94
85
 
95
86
  ```bash
96
- curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/release/0.26.0-beta/scripts/install.sh | bash
87
+ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
97
88
  ```
98
89
 
99
90
  **Build** — open your AI coding agent and go:
@@ -139,25 +130,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
139
130
  | **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
140
131
  | **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
141
132
 
142
- <!-- Screenshots: replace placeholder paths with actual images after recording -->
143
- <p align="center">
144
- <strong>Interview Transcript</strong><br/>
145
- <img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
146
- <sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
147
- </p>
148
-
149
- <p align="center">
150
- <strong>Seed Artifact</strong><br/>
151
- <img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
152
- <sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
153
- </p>
154
-
155
- <p align="center">
156
- <strong>Evaluation Verdict</strong><br/>
157
- <img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
158
- <sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
159
- </p>
160
-
161
133
  <details>
162
134
  <summary><strong>What just happened?</strong></summary>
163
135
 
@@ -12,7 +12,6 @@ dependencies = [
12
12
  "cachetools>=5.0.0",
13
13
  "filelock>=3.13.0",
14
14
  "httpx>=0.27.0",
15
- # "litellm>=1.80.0", # Removed: PyPI supply chain attack (issue #195)
16
15
  "mcp>=1.26.0",
17
16
  "prompt-toolkit>=3.0.0",
18
17
  "pydantic>=2.0.0",
@@ -28,8 +27,8 @@ dependencies = [
28
27
 
29
28
  [project.optional-dependencies]
30
29
  claude = ["claude-agent-sdk>=0.1.0", "anthropic>=0.52.0"]
31
- # litellm = ["litellm>=1.80.0"] # Removed: PyPI supply chain attack (issue #195)
32
- all = ["ouroboros-ai[claude,dashboard]"]
30
+ litellm = ["litellm>=1.80.0,<=1.82.6"]
31
+ all = ["ouroboros-ai[claude,litellm,dashboard]"]
33
32
  dashboard = [
34
33
  "streamlit>=1.40.0",
35
34
  "plotly>=5.24.0",
@@ -66,7 +65,7 @@ packages = ["src/ouroboros"]
66
65
 
67
66
  [dependency-groups]
68
67
  dev = [
69
- "ouroboros-ai[claude]",
68
+ "ouroboros-ai[claude,litellm]",
70
69
  "mypy>=1.19.1",
71
70
  "pre-commit>=4.5.1",
72
71
  "pytest>=9.0.2",
@@ -1,7 +1,6 @@
1
1
  #!/bin/bash
2
2
  # Ouroboros installer — auto-detects runtime and installs accordingly.
3
- # Usage: curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/release/0.26.0-beta/scripts/install.sh | bash
4
- # TODO: Change URL back to main branch when 0.26.0 is officially released
3
+ # Usage: curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
5
4
  set -euo pipefail
6
5
 
7
6
  PACKAGE_NAME="ouroboros-ai"
@@ -211,10 +210,11 @@ with open(mcp_file, 'w') as f:
211
210
  echo " MCP: skipped (no python3 found — add manually to $MCP_FILE)"
212
211
  fi
213
212
 
214
- # 5b. Install Ouroboros skills (claude plugin)
213
+ # 5b. Install/update Ouroboros skills (claude plugin)
215
214
  echo " Installing Ouroboros skills..."
216
- if claude plugin marketplace add Q00/ouroboros 2>/dev/null \
217
- && claude plugin install ouroboros@ouroboros 2>/dev/null; then
215
+ claude plugin marketplace add Q00/ouroboros 2>/dev/null || true
216
+ claude plugin marketplace update ouroboros 2>/dev/null || true
217
+ if claude plugin install ouroboros@ouroboros 2>/dev/null; then
218
218
  echo " Skills: installed"
219
219
  else
220
220
  echo " Skills: skipped (install manually: claude plugin marketplace add Q00/ouroboros && claude plugin install ouroboros@ouroboros)"
@@ -217,7 +217,7 @@ A backup will be created: CLAUDE.md.bak
217
217
  **If "Preview first", show:**
218
218
  ````markdown
219
219
  <!-- ooo:START -->
220
- <!-- ooo:VERSION:0.26.0b7 -->
220
+ <!-- ooo:VERSION:0.26.0 -->
221
221
  # Ouroboros — Specification-First AI Development
222
222
 
223
223
  > Before telling AI what to build, define what should be built.
@@ -116,7 +116,8 @@ When the user invokes this skill:
116
116
 
117
117
  For Claude Code:
118
118
  ```bash
119
- claude plugin update ouroboros@ouroboros
119
+ claude plugin marketplace update ouroboros 2>/dev/null || true
120
+ claude plugin install ouroboros@ouroboros
120
121
  ```
121
122
 
122
123
  For Codex CLI (re-install skills/rules to ~/.codex/):
@@ -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.26.0b8.dev1'
32
- __version_tuple__ = version_tuple = (0, 26, 0, 'b8', 'dev1')
31
+ __version__ = version = '0.26.1.dev2'
32
+ __version_tuple__ = version_tuple = (0, 26, 1, 'dev2')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -448,17 +448,14 @@ Additional context (intentional deferrals — do not penalise):
448
448
  except json.JSONDecodeError as e:
449
449
  raise ValueError(f"Invalid JSON response: {e}") from e
450
450
 
451
- # Validate all required fields are present
452
- required_fields = [
451
+ # Numeric score fields must be present. Missing justifications are recoverable.
452
+ required_score_fields = [
453
453
  "goal_clarity_score",
454
- "goal_clarity_justification",
455
454
  "constraint_clarity_score",
456
- "constraint_clarity_justification",
457
455
  "success_criteria_clarity_score",
458
- "success_criteria_clarity_justification",
459
456
  ]
460
457
 
461
- for field_name in required_fields:
458
+ for field_name in required_score_fields:
462
459
  if field_name not in data:
463
460
  raise ValueError(f"Missing required field: {field_name}")
464
461
 
@@ -467,6 +464,15 @@ Additional context (intentional deferrals — do not penalise):
467
464
  score = float(value)
468
465
  return max(0.0, min(1.0, score))
469
466
 
467
+ def justification_for(field_name: str, component_name: str) -> str:
468
+ value = data.get(field_name)
469
+ if value is None:
470
+ return f"{component_name} justification not provided by model."
471
+ text = str(value).strip()
472
+ if not text:
473
+ return f"{component_name} justification not provided by model."
474
+ return text
475
+
470
476
  # Select weights based on project type
471
477
  if is_brownfield:
472
478
  goal_weight = BROWNFIELD_GOAL_CLARITY_WEIGHT
@@ -484,7 +490,10 @@ Additional context (intentional deferrals — do not penalise):
484
490
  name="Context Clarity",
485
491
  clarity_score=clamp_score(data["context_clarity_score"]),
486
492
  weight=BROWNFIELD_CONTEXT_CLARITY_WEIGHT,
487
- justification=str(data.get("context_clarity_justification", "")),
493
+ justification=justification_for(
494
+ "context_clarity_justification",
495
+ "Context Clarity",
496
+ ),
488
497
  )
489
498
 
490
499
  return ScoreBreakdown(
@@ -492,19 +501,28 @@ Additional context (intentional deferrals — do not penalise):
492
501
  name="Goal Clarity",
493
502
  clarity_score=clamp_score(data["goal_clarity_score"]),
494
503
  weight=goal_weight,
495
- justification=str(data["goal_clarity_justification"]),
504
+ justification=justification_for(
505
+ "goal_clarity_justification",
506
+ "Goal Clarity",
507
+ ),
496
508
  ),
497
509
  constraint_clarity=ComponentScore(
498
510
  name="Constraint Clarity",
499
511
  clarity_score=clamp_score(data["constraint_clarity_score"]),
500
512
  weight=constraint_weight,
501
- justification=str(data["constraint_clarity_justification"]),
513
+ justification=justification_for(
514
+ "constraint_clarity_justification",
515
+ "Constraint Clarity",
516
+ ),
502
517
  ),
503
518
  success_criteria_clarity=ComponentScore(
504
519
  name="Success Criteria Clarity",
505
520
  clarity_score=clamp_score(data["success_criteria_clarity_score"]),
506
521
  weight=criteria_weight,
507
- justification=str(data["success_criteria_clarity_justification"]),
522
+ justification=justification_for(
523
+ "success_criteria_clarity_justification",
524
+ "Success Criteria Clarity",
525
+ ),
508
526
  ),
509
527
  context_clarity=context_clarity,
510
528
  )
@@ -58,6 +58,14 @@ def _derive_quality_bar(seed: "Seed") -> str:
58
58
  return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
59
59
 
60
60
 
61
+ def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
62
+ """Prefer the structured verification report when present."""
63
+ verification_report = summary.get("verification_report")
64
+ if isinstance(verification_report, str) and verification_report:
65
+ return verification_report
66
+ return final_message or ""
67
+
68
+
61
69
  def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
62
70
  """Load seed configuration from YAML file.
63
71
 
@@ -249,7 +257,7 @@ async def _run_orchestrator(
249
257
 
250
258
  qa_result = await qa_handler.handle(
251
259
  {
252
- "artifact": res.final_message or "",
260
+ "artifact": _get_verification_artifact(res.summary, res.final_message),
253
261
  "artifact_type": "test_output",
254
262
  "quality_bar": quality_bar,
255
263
  "seed_content": yaml.dump(seed_data, default_flow_style=False),
@@ -889,7 +889,15 @@ class EvolutionaryLoop:
889
889
  exec_result = await self.executor(current_seed, parallel=parallel)
890
890
  if hasattr(exec_result, "is_ok") and exec_result.is_ok:
891
891
  orch_result = exec_result.value
892
- execution_output = getattr(orch_result, "final_message", str(orch_result))
892
+ summary = getattr(orch_result, "summary", {})
893
+ verification_report = (
894
+ summary.get("verification_report") if isinstance(summary, dict) else None
895
+ )
896
+ execution_output = (
897
+ verification_report
898
+ if isinstance(verification_report, str) and verification_report
899
+ else getattr(orch_result, "final_message", str(orch_result))
900
+ )
893
901
  # Log structured metadata for observability
894
902
  logger.info(
895
903
  "evolution.generation.executed",
@@ -409,7 +409,10 @@ class ExecuteSeedHandler:
409
409
  quality_bar = self._derive_quality_bar(_seed)
410
410
  await qa_handler.handle(
411
411
  {
412
- "artifact": result.value.final_message or "",
412
+ "artifact": self._get_verification_artifact(
413
+ result.value.summary,
414
+ result.value.final_message,
415
+ ),
413
416
  "artifact_type": "test_output",
414
417
  "quality_bar": quality_bar,
415
418
  "seed_content": _seed_content,
@@ -500,6 +503,14 @@ class ExecuteSeedHandler:
500
503
  ac_lines = [f"- {ac}" for ac in seed.acceptance_criteria]
501
504
  return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
502
505
 
506
+ @staticmethod
507
+ def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
508
+ """Prefer the structured verification report when present."""
509
+ verification_report = summary.get("verification_report")
510
+ if isinstance(verification_report, str) and verification_report:
511
+ return verification_report
512
+ return final_message or ""
513
+
503
514
  @staticmethod
504
515
  def _format_execution_result(exec_result, seed: Seed) -> str:
505
516
  """Format execution result as human-readable text.
@@ -728,6 +728,25 @@ class CodexCliRuntime:
728
728
  return None
729
729
  return current_handle.native_session_id
730
730
 
731
+ def _build_child_env(self) -> dict[str, str]:
732
+ """Build an isolated environment for child runtime processes.
733
+
734
+ Strips ``OUROBOROS_AGENT_RUNTIME`` and ``OUROBOROS_LLM_BACKEND`` so
735
+ that a child Codex process does not re-load the Ouroboros MCP server,
736
+ preventing the recursive startup loop described in #185.
737
+ """
738
+ env = os.environ.copy()
739
+ # Prevent child from re-entering Ouroboros MCP
740
+ for key in ("OUROBOROS_AGENT_RUNTIME", "OUROBOROS_LLM_BACKEND"):
741
+ env.pop(key, None)
742
+ # Track recursion depth for diagnostics (defensive: ignore malformed values)
743
+ try:
744
+ depth = int(env.get("_OUROBOROS_DEPTH", "0")) + 1
745
+ except (ValueError, TypeError):
746
+ depth = 1
747
+ env["_OUROBOROS_DEPTH"] = str(depth)
748
+ return env
749
+
731
750
  def _requires_process_stdin(self) -> bool:
732
751
  """Return True when the runtime needs a writable stdin pipe."""
733
752
  return True
@@ -1441,6 +1460,7 @@ class CodexCliRuntime:
1441
1460
  stdin=(asyncio.subprocess.PIPE if self._requires_process_stdin() else None),
1442
1461
  stdout=asyncio.subprocess.PIPE,
1443
1462
  stderr=asyncio.subprocess.PIPE,
1463
+ env=self._build_child_env(),
1444
1464
  )
1445
1465
  except FileNotFoundError as e:
1446
1466
  yield AgentMessage(