ouroboros-ai 0.29.2.dev1__tar.gz → 0.29.2.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 (710) hide show
  1. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/interview/SKILL.md +21 -5
  3. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/_version.py +2 -2
  4. ouroboros_ai-0.29.2.dev2/src/ouroboros/agents/seed-closer.md +54 -0
  5. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/subagent.py +147 -4
  6. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_subagent.py +128 -0
  7. ouroboros_ai-0.29.2.dev1/src/ouroboros/agents/seed-closer.md +0 -39
  8. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.claude/settings.json +0 -0
  9. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.claude-plugin/.mcp.json +0 -0
  10. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.claude-plugin/marketplace.json +0 -0
  11. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.claude-plugin/plugin.json +0 -0
  12. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.env.example +0 -0
  13. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  14. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  16. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  17. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/workflows/dev-publish.yml +0 -0
  18. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/workflows/lint.yml +0 -0
  19. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/workflows/release.yml +0 -0
  20. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.github/workflows/test.yml +0 -0
  21. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.gitignore +0 -0
  22. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.mcp.json +0 -0
  23. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.ouroboros/mechanical.toml +0 -0
  24. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  25. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  26. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.pre-commit-config.yaml +0 -0
  27. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/.python-version +0 -0
  28. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/CHANGELOG.md +0 -0
  29. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/CLAUDE.md +0 -0
  30. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/CODE_OF_CONDUCT.md +0 -0
  31. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/CONTRIBUTING.md +0 -0
  32. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/Code-Review-Claude.md +0 -0
  33. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/Code-Review-Codex.md +0 -0
  34. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/HANDOFF.md +0 -0
  35. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/LICENSE +0 -0
  36. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/README.ko.md +0 -0
  37. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/README.md +0 -0
  38. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/SECURITY.md +0 -0
  39. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/UNINSTALL.md +0 -0
  40. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/cancel.md +0 -0
  41. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/evaluate.md +0 -0
  42. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/evolve.md +0 -0
  43. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/help.md +0 -0
  44. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/interview.md +0 -0
  45. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/ralph.md +0 -0
  46. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/run.md +0 -0
  47. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/seed.md +0 -0
  48. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/setup.md +0 -0
  49. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/status.md +0 -0
  50. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/tutorial.md +0 -0
  51. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/unstuck.md +0 -0
  52. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/commands/welcome.md +0 -0
  53. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/.gitignore +0 -0
  54. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/Cargo.lock +0 -0
  55. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/Cargo.toml +0 -0
  56. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/README.md +0 -0
  57. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/db.rs +0 -0
  58. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/main.rs +0 -0
  59. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/mock.rs +0 -0
  60. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/state.rs +0 -0
  61. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  62. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  63. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  64. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  65. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  66. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  67. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/README.md +0 -0
  68. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/api/README.md +0 -0
  69. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/api/core.md +0 -0
  70. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/api/mcp.md +0 -0
  71. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/architecture.md +0 -0
  72. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/cli-reference.md +0 -0
  73. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/config-reference.md +0 -0
  74. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/contributing/architecture-overview.md +0 -0
  75. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/contributing/findings-registry.md +0 -0
  76. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/contributing/issue-quality-policy.md +0 -0
  77. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/contributing/key-patterns.md +0 -0
  78. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/contributing/testing-guide.md +0 -0
  79. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/events.md +0 -0
  80. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/examples/mcp-config.yaml +0 -0
  81. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/getting-started.md +0 -0
  82. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/evaluation-pipeline.md +0 -0
  83. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/evolution-loop.md +0 -0
  84. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  85. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/mcp-bridge.md +0 -0
  86. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  87. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/opencode-subagent-bridge.md +0 -0
  88. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/seed-authoring.md +0 -0
  89. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/guides/tui-usage.md +0 -0
  90. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/images/PLACEHOLDER_README.md +0 -0
  91. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/images/ouroboros.png +0 -0
  92. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/platform-support.md +0 -0
  93. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/runtime-capability-matrix.md +0 -0
  94. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/runtime-guides/claude-code.md +0 -0
  95. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/runtime-guides/codex.md +0 -0
  96. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/runtime-guides/hermes.md +0 -0
  97. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/docs/runtime-guides/opencode.md +0 -0
  98. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/coordinator_test_seed.yaml +0 -0
  99. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/dummy_seed.yaml +0 -0
  100. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/parallel_subac_test_seed.yaml +0 -0
  101. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/subac_test_seed.yaml +0 -0
  102. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/README.md +0 -0
  103. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/__init__.py +0 -0
  104. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/__main__.py +0 -0
  105. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/cli.py +0 -0
  106. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/models.py +0 -0
  107. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/task_manager/storage.py +0 -0
  108. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/examples/test_display.py +0 -0
  109. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/hooks/hooks.json +0 -0
  110. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/llms-full.txt +0 -0
  111. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/llms.txt +0 -0
  112. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/project-context.md +0 -0
  113. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/pyproject.toml +0 -0
  114. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/drift-monitor.py +0 -0
  115. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/install.sh +0 -0
  116. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/keyword-detector.py +0 -0
  117. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/mcp-serve.sh +0 -0
  118. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/ralph-rewind.py +0 -0
  119. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/ralph.py +0 -0
  120. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/ralph.sh +0 -0
  121. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/session-start.py +0 -0
  122. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/sync-plugin-version.py +0 -0
  123. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/scripts/version-check.py +0 -0
  124. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/brownfield/SKILL.md +0 -0
  125. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/cancel/SKILL.md +0 -0
  126. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/evaluate/SKILL.md +0 -0
  127. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/evolve/SKILL.md +0 -0
  128. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/help/SKILL.md +0 -0
  129. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/pm/SKILL.md +0 -0
  130. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/publish/SKILL.md +0 -0
  131. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/qa/SKILL.md +0 -0
  132. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/ralph/SKILL.md +0 -0
  133. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/run/SKILL.md +0 -0
  134. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/seed/SKILL.md +0 -0
  135. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/setup/SKILL.md +0 -0
  136. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/status/SKILL.md +0 -0
  137. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/tutorial/SKILL.md +0 -0
  138. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/unstuck/SKILL.md +0 -0
  139. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/update/SKILL.md +0 -0
  140. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/skills/welcome/SKILL.md +0 -0
  141. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/__init__.py +0 -0
  142. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/__main__.py +0 -0
  143. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/__init__.py +0 -0
  144. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/advocate.md +0 -0
  145. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/analysis-agent.md +0 -0
  146. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/architect.md +0 -0
  147. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/breadth-keeper.md +0 -0
  148. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/code-executor.md +0 -0
  149. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/codebase-explorer.md +0 -0
  150. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  151. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/contrarian.md +0 -0
  152. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/evaluator.md +0 -0
  153. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/hacker.md +0 -0
  154. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/judge.md +0 -0
  155. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/loader.py +0 -0
  156. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/ontologist.md +0 -0
  157. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/ontology-analyst.md +0 -0
  158. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/qa-judge.md +0 -0
  159. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/research-agent.md +0 -0
  160. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/researcher.md +0 -0
  161. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/seed-architect.md +0 -0
  162. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  163. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/simplifier.md +0 -0
  164. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  165. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/__init__.py +0 -0
  166. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/ambiguity.py +0 -0
  167. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/brownfield.py +0 -0
  168. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/explore.py +0 -0
  169. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/interview.py +0 -0
  170. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/pm_completion.py +0 -0
  171. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/pm_document.py +0 -0
  172. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/pm_interview.py +0 -0
  173. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/pm_seed.py +0 -0
  174. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/question_classifier.py +0 -0
  175. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/bigbang/seed_generator.py +0 -0
  176. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/claude_permissions.py +0 -0
  177. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/__init__.py +0 -0
  178. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/__init__.py +0 -0
  179. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/cancel.py +0 -0
  180. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/config.py +0 -0
  181. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/detect.py +0 -0
  182. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/init.py +0 -0
  183. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/mcp.py +0 -0
  184. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  185. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/pm.py +0 -0
  186. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/run.py +0 -0
  187. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/setup.py +0 -0
  188. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/status.py +0 -0
  189. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/tui.py +0 -0
  190. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/commands/uninstall.py +0 -0
  191. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/__init__.py +0 -0
  192. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/panels.py +0 -0
  193. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/progress.py +0 -0
  194. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/prompting.py +0 -0
  195. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/tables.py +0 -0
  196. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  197. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/jsonc.py +0 -0
  198. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/main.py +0 -0
  199. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/cli/opencode_config.py +0 -0
  200. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/codex/__init__.py +0 -0
  201. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/codex/artifacts.py +0 -0
  202. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/codex/cli_policy.py +0 -0
  203. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/codex/ouroboros.md +0 -0
  204. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/codex_permissions.py +0 -0
  205. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/config/__init__.py +0 -0
  206. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/config/loader.py +0 -0
  207. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/config/models.py +0 -0
  208. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/__init__.py +0 -0
  209. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/ac_tree.py +0 -0
  210. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/context.py +0 -0
  211. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/errors.py +0 -0
  212. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/file_lock.py +0 -0
  213. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/git_workflow.py +0 -0
  214. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/initial_context.py +0 -0
  215. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/json_utils.py +0 -0
  216. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/lineage.py +0 -0
  217. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/ontology_aspect.py +0 -0
  218. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/ontology_questions.py +0 -0
  219. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/project_paths.py +0 -0
  220. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/retry.py +0 -0
  221. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/security.py +0 -0
  222. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/seed.py +0 -0
  223. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/text.py +0 -0
  224. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/ttl_cache.py +0 -0
  225. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/types.py +0 -0
  226. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/core/worktree.py +0 -0
  227. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/__init__.py +0 -0
  228. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  229. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/checklist.py +0 -0
  230. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/consensus.py +0 -0
  231. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/detector.py +0 -0
  232. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/json_utils.py +0 -0
  233. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/languages.py +0 -0
  234. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/mechanical.py +0 -0
  235. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/models.py +0 -0
  236. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/pipeline.py +0 -0
  237. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/semantic.py +0 -0
  238. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/trigger.py +0 -0
  239. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  240. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/__init__.py +0 -0
  241. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/base.py +0 -0
  242. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/decomposition.py +0 -0
  243. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/evaluation.py +0 -0
  244. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/interview.py +0 -0
  245. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/lineage.py +0 -0
  246. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/events/ontology.py +0 -0
  247. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/__init__.py +0 -0
  248. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/convergence.py +0 -0
  249. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/loop.py +0 -0
  250. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/projector.py +0 -0
  251. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/reflect.py +0 -0
  252. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/regression.py +0 -0
  253. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/evolution/wonder.py +0 -0
  254. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/execution/__init__.py +0 -0
  255. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/execution/atomicity.py +0 -0
  256. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/execution/decomposition.py +0 -0
  257. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/execution/double_diamond.py +0 -0
  258. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/execution/subagent.py +0 -0
  259. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/hermes/__init__.py +0 -0
  260. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/hermes/artifacts.py +0 -0
  261. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/__init__.py +0 -0
  262. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  263. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  264. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/bridge/config.py +0 -0
  265. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/bridge/factory.py +0 -0
  266. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/client/__init__.py +0 -0
  267. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/client/adapter.py +0 -0
  268. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/client/manager.py +0 -0
  269. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/client/protocol.py +0 -0
  270. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/errors.py +0 -0
  271. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/job_manager.py +0 -0
  272. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/resources/__init__.py +0 -0
  273. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/resources/handlers.py +0 -0
  274. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/server/__init__.py +0 -0
  275. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/server/adapter.py +0 -0
  276. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/server/protocol.py +0 -0
  277. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/server/security.py +0 -0
  278. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/__init__.py +0 -0
  279. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  280. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  281. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  282. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  283. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  284. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  285. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/definitions.py +0 -0
  286. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  287. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  288. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  289. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  290. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  291. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/qa.py +0 -0
  292. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  293. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/tools/registry.py +0 -0
  294. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/mcp/types.py +0 -0
  295. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/observability/__init__.py +0 -0
  296. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/observability/drift.py +0 -0
  297. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/observability/logging.py +0 -0
  298. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/observability/retrospective.py +0 -0
  299. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/__init__.py +0 -0
  300. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  301. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  302. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
  303. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
  304. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/package.json +0 -0
  305. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  306. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/__init__.py +0 -0
  307. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/adapter.py +0 -0
  308. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/capabilities.py +0 -0
  309. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  310. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  311. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/control_plane.py +0 -0
  312. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/coordinator.py +0 -0
  313. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  314. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/events.py +0 -0
  315. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  316. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  317. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  318. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  319. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/level_context.py +0 -0
  320. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  321. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  322. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  323. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  324. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  325. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  326. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/policy.py +0 -0
  327. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  328. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/runner.py +0 -0
  329. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  330. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  331. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/session.py +0 -0
  332. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  333. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/__init__.py +0 -0
  334. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/brownfield.py +0 -0
  335. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/checkpoint.py +0 -0
  336. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/event_store.py +0 -0
  337. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  338. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/migrations/runner.py +0 -0
  339. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  340. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  341. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/schema.py +0 -0
  342. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/persistence/uow.py +0 -0
  343. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/__init__.py +0 -0
  344. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/agents/__init__.py +0 -0
  345. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/agents/pool.py +0 -0
  346. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/agents/registry.py +0 -0
  347. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  348. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/orchestration/router.py +0 -0
  349. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  350. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/skills/__init__.py +0 -0
  351. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/skills/docs.py +0 -0
  352. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/skills/executor.py +0 -0
  353. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/skills/keywords.py +0 -0
  354. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/plugin/skills/registry.py +0 -0
  355. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/pm/__init__.py +0 -0
  356. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/pm/handoff.py +0 -0
  357. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/pm/renderer.py +0 -0
  358. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/__init__.py +0 -0
  359. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  360. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/base.py +0 -0
  361. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  362. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  363. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  364. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/factory.py +0 -0
  365. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  366. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/litellm_adapter.py +0 -0
  367. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/providers/opencode_adapter.py +0 -0
  368. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/py.typed +0 -0
  369. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/resilience/__init__.py +0 -0
  370. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/resilience/lateral.py +0 -0
  371. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/resilience/stagnation.py +0 -0
  372. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/router/__init__.py +0 -0
  373. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/router/command_parser.py +0 -0
  374. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/router/dispatch.py +0 -0
  375. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/router/registry.py +0 -0
  376. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/router/types.py +0 -0
  377. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/__init__.py +0 -0
  378. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/complexity.py +0 -0
  379. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/downgrade.py +0 -0
  380. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/escalation.py +0 -0
  381. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/router.py +0 -0
  382. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/routing/tiers.py +0 -0
  383. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/sandbox.py +0 -0
  384. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/secondary/__init__.py +0 -0
  385. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/secondary/scheduler.py +0 -0
  386. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/secondary/todo_registry.py +0 -0
  387. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/skills/__init__.py +0 -0
  388. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/skills/artifacts.py +0 -0
  389. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/strategies/__init__.py +0 -0
  390. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/strategies/devil_advocate.py +0 -0
  391. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/__init__.py +0 -0
  392. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/app.py +0 -0
  393. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/components/__init__.py +0 -0
  394. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/components/agents_panel.py +0 -0
  395. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/components/event_log.py +0 -0
  396. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/components/progress.py +0 -0
  397. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/components/token_tracker.py +0 -0
  398. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/events.py +0 -0
  399. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/__init__.py +0 -0
  400. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  401. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/dashboard.py +0 -0
  402. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  403. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  404. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/debug.py +0 -0
  405. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/execution.py +0 -0
  406. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  407. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  408. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  409. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/logs.py +0 -0
  410. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/screens/session_selector.py +0 -0
  411. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/__init__.py +0 -0
  412. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  413. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  414. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  415. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  416. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  417. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  418. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  419. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  420. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/verification/__init__.py +0 -0
  421. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/verification/extractor.py +0 -0
  422. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/verification/models.py +0 -0
  423. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/src/ouroboros/verification/verifier.py +0 -0
  424. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/__init__.py +0 -0
  425. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/conftest.py +0 -0
  426. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/__init__.py +0 -0
  427. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/conftest.py +0 -0
  428. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  429. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/test_cli_commands.py +0 -0
  430. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/test_full_workflow.py +0 -0
  431. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/e2e/test_session_persistence.py +0 -0
  432. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  433. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/fixtures/test_atomicity_seed.yml +0 -0
  434. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/__init__.py +0 -0
  435. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/conftest.py +0 -0
  436. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/__init__.py +0 -0
  437. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/bridge/__init__.py +0 -0
  438. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  439. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/conftest.py +0 -0
  440. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/test_client_adapter.py +0 -0
  441. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/test_client_manager.py +0 -0
  442. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/mcp/test_server_adapter.py +0 -0
  443. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/plugin/test_orchestration.py +0 -0
  444. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  445. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/test_codex_skill_fallback.py +0 -0
  446. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/test_codex_skill_smoke.py +0 -0
  447. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/integration/test_entry_point.py +0 -0
  448. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/test-execution-plan.md +0 -0
  449. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/__init__.py +0 -0
  450. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/agents/__init__.py +0 -0
  451. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/agents/test_loader.py +0 -0
  452. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/__init__.py +0 -0
  453. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_ambiguity.py +0 -0
  454. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_brownfield.py +0 -0
  455. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_classifier_context.py +0 -0
  456. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  457. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_explore.py +0 -0
  458. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_interview.py +0 -0
  459. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  460. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  461. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  462. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_completion.py +0 -0
  463. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  464. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  465. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_interview.py +0 -0
  466. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  467. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  468. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  469. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_question_classifier.py +0 -0
  470. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/bigbang/test_seed_generator.py +0 -0
  471. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/__init__.py +0 -0
  472. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/commands/test_tui_command.py +0 -0
  473. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/conftest.py +0 -0
  474. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/__init__.py +0 -0
  475. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_console.py +0 -0
  476. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_panels.py +0 -0
  477. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_progress.py +0 -0
  478. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_prompting.py +0 -0
  479. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_tables.py +0 -0
  480. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  481. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  482. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  483. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_cancel.py +0 -0
  484. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_config.py +0 -0
  485. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  486. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_init_runtime.py +0 -0
  487. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_jsonc.py +0 -0
  488. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_main.py +0 -0
  489. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_mcp_doctor.py +0 -0
  490. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  491. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  492. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  493. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_opencode_config.py +0 -0
  494. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm.py +0 -0
  495. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_brownfield.py +0 -0
  496. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_completion.py +0 -0
  497. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  498. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  499. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_overwrite.py +0 -0
  500. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  501. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_pm_select_repos.py +0 -0
  502. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_run_qa.py +0 -0
  503. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_setup.py +0 -0
  504. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/cli/test_uninstall.py +0 -0
  505. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/codex/test_cli_policy.py +0 -0
  506. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/config/__init__.py +0 -0
  507. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/config/test_loader.py +0 -0
  508. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/config/test_loader_env.py +0 -0
  509. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/config/test_models.py +0 -0
  510. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/__init__.py +0 -0
  511. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_ac_tree.py +0 -0
  512. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_context.py +0 -0
  513. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_errors.py +0 -0
  514. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_file_lock.py +0 -0
  515. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_git_workflow.py +0 -0
  516. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_initial_context.py +0 -0
  517. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_lineage.py +0 -0
  518. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_ontology_aspect.py +0 -0
  519. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_ontology_questions.py +0 -0
  520. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_retry.py +0 -0
  521. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_security.py +0 -0
  522. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_seed.py +0 -0
  523. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_ttl_cache.py +0 -0
  524. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_types.py +0 -0
  525. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/core/test_worktree.py +0 -0
  526. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/__init__.py +0 -0
  527. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  528. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_checklist.py +0 -0
  529. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_consensus.py +0 -0
  530. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_detector.py +0 -0
  531. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_json_utils.py +0 -0
  532. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_languages.py +0 -0
  533. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_mechanical.py +0 -0
  534. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_models.py +0 -0
  535. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  536. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  537. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_review_fixes.py +0 -0
  538. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_semantic.py +0 -0
  539. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_trigger.py +0 -0
  540. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  541. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  542. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/events/__init__.py +0 -0
  543. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/events/test_base.py +0 -0
  544. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/events/test_decomposition_events.py +0 -0
  545. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/evolution/test_wonder_scope.py +0 -0
  546. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/execution/__init__.py +0 -0
  547. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/execution/test_atomicity.py +0 -0
  548. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/execution/test_decomposition.py +0 -0
  549. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/execution/test_double_diamond.py +0 -0
  550. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/execution/test_subagent_isolation.py +0 -0
  551. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/hermes/test_artifacts.py +0 -0
  552. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/__init__.py +0 -0
  553. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/__init__.py +0 -0
  554. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  555. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/test_config.py +0 -0
  556. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/test_factory.py +0 -0
  557. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  558. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/bridge/test_stability.py +0 -0
  559. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/client/__init__.py +0 -0
  560. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/client/test_adapter.py +0 -0
  561. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  562. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/client/test_manager.py +0 -0
  563. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/conftest.py +0 -0
  564. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/server/__init__.py +0 -0
  565. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/server/test_adapter.py +0 -0
  566. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/server/test_security.py +0 -0
  567. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/test_errors.py +0 -0
  568. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/test_job_manager.py +0 -0
  569. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/test_types.py +0 -0
  570. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/__init__.py +0 -0
  571. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/conftest.py +0 -0
  572. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  573. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  574. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  575. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  576. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  577. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  578. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  579. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  580. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  581. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  582. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  583. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  584. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  585. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  586. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_definitions.py +0 -0
  587. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  588. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  589. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
  590. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  591. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  592. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  593. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  594. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_registry.py +0 -0
  595. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  596. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/observability/__init__.py +0 -0
  597. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/observability/test_drift.py +0 -0
  598. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/observability/test_logging.py +0 -0
  599. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/observability/test_retrospective.py +0 -0
  600. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/__init__.py +0 -0
  601. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_adapter.py +0 -0
  602. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_capabilities.py +0 -0
  603. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  604. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  605. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  606. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_control_plane.py +0 -0
  607. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_coordinator.py +0 -0
  608. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  609. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_events.py +0 -0
  610. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  611. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  612. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  613. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  614. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_level_context.py +0 -0
  615. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  616. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  617. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  618. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  619. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  620. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  621. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  622. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_policy.py +0 -0
  623. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  624. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_runner.py +0 -0
  625. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  626. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  627. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  628. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  629. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_session.py +0 -0
  630. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  631. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/__init__.py +0 -0
  632. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/test_brownfield_store.py +0 -0
  633. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/test_checkpoint.py +0 -0
  634. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/test_event_store.py +0 -0
  635. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/test_schema.py +0 -0
  636. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/persistence/test_uow.py +0 -0
  637. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/__init__.py +0 -0
  638. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/agents/__init__.py +0 -0
  639. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/agents/test_registry.py +0 -0
  640. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/orchestration/__init__.py +0 -0
  641. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  642. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/skills/__init__.py +0 -0
  643. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/skills/test_keywords.py +0 -0
  644. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/plugin/skills/test_registry.py +0 -0
  645. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/pm/__init__.py +0 -0
  646. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/pm/test_renderer.py +0 -0
  647. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/__init__.py +0 -0
  648. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_base.py +0 -0
  649. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  650. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  651. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_factory.py +0 -0
  652. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  653. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_litellm_adapter.py +0 -0
  654. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/providers/test_opencode_adapter.py +0 -0
  655. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/resilience/__init__.py +0 -0
  656. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/resilience/test_lateral.py +0 -0
  657. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/resilience/test_stagnation.py +0 -0
  658. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/__init__.py +0 -0
  659. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_command_parser.py +0 -0
  660. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_dispatch.py +0 -0
  661. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  662. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_extract_first_argument.py +0 -0
  663. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  664. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  665. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_not_handled_resolution.py +0 -0
  666. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_registry.py +0 -0
  667. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  668. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  669. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  670. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  671. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/__init__.py +0 -0
  672. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/test_complexity.py +0 -0
  673. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/test_downgrade.py +0 -0
  674. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/test_escalation.py +0 -0
  675. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/test_router.py +0 -0
  676. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/routing/test_tiers.py +0 -0
  677. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/scripts/test_keyword_detector.py +0 -0
  678. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/scripts/test_session_start.py +0 -0
  679. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/scripts/test_version_check.py +0 -0
  680. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/secondary/__init__.py +0 -0
  681. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/secondary/test_scheduler.py +0 -0
  682. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/secondary/test_todo_registry.py +0 -0
  683. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/skills/test_skill_artifacts.py +0 -0
  684. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_artifact_collector.py +0 -0
  685. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_codex_artifacts.py +0 -0
  686. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_convergence.py +0 -0
  687. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_dashboard.py +0 -0
  688. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_dependencies_configured.py +0 -0
  689. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_evolve_rewind.py +0 -0
  690. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_evolve_step.py +0 -0
  691. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_graceful_shutdown.py +0 -0
  692. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_main_entry_point.py +0 -0
  693. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_module_structure.py +0 -0
  694. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_project_initialization.py +0 -0
  695. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_projector_rewind.py +0 -0
  696. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_ralph_parser.py +0 -0
  697. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_ralph_rewind.py +0 -0
  698. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_regression.py +0 -0
  699. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_tooling_configuration.py +0 -0
  700. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/test_verification.py +0 -0
  701. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/__init__.py +0 -0
  702. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_app.py +0 -0
  703. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_cancelled_display.py +0 -0
  704. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_events.py +0 -0
  705. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_lineage_viewer.py +0 -0
  706. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_screens.py +0 -0
  707. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_session_selector_replay.py +0 -0
  708. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tests/unit/tui/test_widgets.py +0 -0
  709. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/tools/sync_github_project.py +0 -0
  710. {ouroboros_ai-0.29.2.dev1 → ouroboros_ai-0.29.2.dev2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.29.2.dev1
3
+ Version: 0.29.2.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
@@ -215,10 +215,24 @@ MCP (question generator) ←→ You (answerer + router) ←→ User (human judgm
215
215
 
216
216
  7. **Repeat steps 2-6** until the user says "done" or MCP signals seed-ready.
217
217
 
218
- 8. **Prefer stopping over over-interviewing**:
219
- When scope, outputs, AC, and non-goals are clear, suggest `ooo seed`.
220
-
221
- 9. After completion, suggest the next step:
218
+ 8. **Seed-ready Acceptance Guard**:
219
+ When MCP signals seed-ready, do NOT relay completion blindly. Before
220
+ announcing completion or suggesting `ooo seed`, apply the canonical Seed
221
+ Closer criteria from `src/ouroboros/agents/seed-closer.md` as the single
222
+ source of truth for closure readiness. Run the check from the main session's
223
+ perspective, including any code, research, or brownfield context MCP did not
224
+ see.
225
+
226
+ If any material decision remains unresolved, do not announce seed-ready.
227
+ If the local challenge finds a material gap, explicitly override the MCP
228
+ signal: `"MCP says seed-ready, but I am not accepting it yet because <gap>."`
229
+ Explain the gap briefly and ask the single highest-impact follow-up question,
230
+ routed through PATH 2 or PATH 3 as appropriate.
231
+
232
+ 9. **Prefer stopping over over-interviewing**:
233
+ When the Seed-ready Acceptance Guard passes, suggest `ooo seed`.
234
+
235
+ 10. After completion, suggest the next step:
222
236
  `📍 Next: ooo seed to crystallize these requirements into a specification`
223
237
 
224
238
  #### Dialectic Rhythm Guard
@@ -261,7 +275,7 @@ If the MCP tool is NOT available, fall back to agent-based interview:
261
275
  - Track multiple independent ambiguity threads
262
276
  - Revisit unresolved threads every few rounds
263
277
  - Do not let one detailed subtopic crowd out the rest of the original request
264
- 7. Prefer closure when the request already has stable scope, outputs, verification, and non-goals. Ask whether to move to `ooo seed` rather than continuing to generate narrower questions.
278
+ 7. Prefer closure only after applying the Seed-ready Acceptance Guard above. Ask whether to move to `ooo seed` rather than continuing to generate narrower questions.
265
279
  8. Continue until the user says "done"
266
280
  9. Interview results live in conversation context (not persisted)
267
281
  10. After completion, suggest the next step in `📍 Next:` format:
@@ -280,6 +294,8 @@ If the MCP tool is NOT available, fall back to agent-based interview:
280
294
  - For high-confidence factual questions (PATH 1a), auto-confirm and notify the user
281
295
  - For all other questions, present to user as confirmation or direct question
282
296
  - You NEVER make decisions on behalf of the user — auto-confirm is for FACTS only
297
+ - You are the final gate on MCP seed-ready signals: apply the canonical Seed
298
+ Closer criteria before suggesting `ooo seed`
283
299
  - The Dialectic Rhythm Guard prevents over-automation: after 3 consecutive
284
300
  non-user answers, the next question MUST go directly to the user
285
301
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.29.2.dev1'
22
- __version_tuple__ = version_tuple = (0, 29, 2, 'dev1')
21
+ __version__ = version = '0.29.2.dev2'
22
+ __version_tuple__ = version_tuple = (0, 29, 2, 'dev2')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,54 @@
1
+ # Seed Closer
2
+
3
+ You decide when the interview is actually safe to stop and convert into a Seed instead of asking one more clever question.
4
+
5
+ ## YOUR PHILOSOPHY
6
+
7
+ "A good interview ends on time, but not before unresolved decisions that would change execution are exposed."
8
+
9
+ You optimize for executable clarity, not endless refinement or premature closure.
10
+
11
+ ## CLOSURE GATE SUMMARY
12
+
13
+ - Treat a low ambiguity score as permission to audit closure, not permission to close.
14
+ - Do not close if any unresolved decision would materially change implementation.
15
+ - For brownfield or system-level work, check ownership/SSoT, protocol or API contract, lifecycle/recovery, migration, cross-client impact, and verification.
16
+ - If code, research, or architecture context reveals a materially different path, ask for the needed human decision instead of closing.
17
+
18
+ ## YOUR APPROACH
19
+
20
+ ### 1. Check The Decision Boundary
21
+ - Ask whether scope, non-goals, outputs, and verification expectations are already explicit
22
+ - Distinguish true ambiguity from minor wording polish
23
+ - Prefer stopping once the remaining uncertainty would not change execution materially
24
+ - Treat a low ambiguity score as permission to audit closure, not permission to close
25
+
26
+ ### 2. Sweep For Material Blockers
27
+ - For brownfield or system-level work, check whether ownership/SSoT, protocol or API contract, lifecycle/recovery, migration, cross-client impact, and verification are clear enough to execute
28
+ - Look for unasked alternatives from code, research, or architecture context that would materially change the implementation
29
+ - If a human/product/architecture decision remains open, ask that question instead of closing
30
+
31
+ ### 3. Reject Over-Interviewing
32
+ - Notice when new questions only produce stylistic refinement or edge-case bikeshedding
33
+ - Treat repeated restatement as a sign that the interview may already be done
34
+ - Avoid opening new branches when the current information is already seed-worthy and no material blocker remains
35
+
36
+ ### 4. Ask For Closure Directly
37
+ - Convert late-stage refinement into a closure question
38
+ - Confirm whether the current constraints are sufficient to proceed
39
+ - Move the conversation toward seed generation instead of another exploratory detour only after material blockers are resolved
40
+
41
+ ### 5. Preserve Practical Momentum
42
+ - Favor "good enough to execute" over theoretical completeness
43
+ - Accept that implementation mechanics belong to execution, but decisions that change architecture, ownership, protocol, lifecycle, or verification belong in the interview
44
+ - End the interview once the next useful action is seed generation
45
+
46
+ ## YOUR QUESTIONS
47
+
48
+ - Is there any ambiguity left that would materially change implementation?
49
+ - Are scope, non-goals, outputs, and verification expectations already clear enough for a Seed?
50
+ - For brownfield or system-level work, are ownership, protocol/API contract, lifecycle/recovery, migration, cross-client impact, and verification clear enough to execute?
51
+ - Did code or research reveal an alternative path that would change implementation and needs a human decision?
52
+ - Would another question change execution, or just polish wording?
53
+ - Should we stop the interview here and move to seed generation?
54
+ - What is the smallest remaining clarification needed before we can proceed?
@@ -33,6 +33,7 @@ from __future__ import annotations
33
33
 
34
34
  from dataclasses import dataclass, field
35
35
  import json
36
+ import re
36
37
  from typing import Any
37
38
 
38
39
  import structlog
@@ -46,6 +47,12 @@ from ouroboros.mcp.types import (
46
47
 
47
48
  log = structlog.get_logger(__name__)
48
49
 
50
+ _INTERVIEW_SUBAGENT_MAX_CONTEXT_CHARS = 600
51
+ _INTERVIEW_SUBAGENT_MAX_PREVIOUS_TRANSCRIPT_CHARS = 200
52
+ _INTERVIEW_SUBAGENT_MAX_TRANSCRIPT_QUESTION_CHARS = 900
53
+ _INTERVIEW_SUBAGENT_MAX_TRANSCRIPT_ANSWER_CHARS = 220
54
+ _INTERVIEW_SUBAGENT_MAX_ANSWER_CHARS = 300
55
+
49
56
  # ---------------------------------------------------------------------------
50
57
  # SubagentPayload dataclass
51
58
  # ---------------------------------------------------------------------------
@@ -211,6 +218,123 @@ def should_dispatch_via_plugin(
211
218
  return mode == "plugin"
212
219
 
213
220
 
221
+ def _truncate_tail(text: str | None, max_chars: int) -> str:
222
+ """Keep prompt inputs bounded while preserving the most recent context."""
223
+ if not text:
224
+ return ""
225
+ if len(text) <= max_chars:
226
+ return text
227
+ return "[truncated]\n" + text[-max_chars:]
228
+
229
+
230
+ def _truncate_head(text: str | None, max_chars: int) -> str:
231
+ """Keep prompt inputs bounded while preserving the opening context."""
232
+ if not text:
233
+ return ""
234
+ if len(text) <= max_chars:
235
+ return text
236
+ return text[:max_chars] + "\n[truncated]"
237
+
238
+
239
+ def _truncate_prompt_line(line: str, max_content_chars: int) -> str:
240
+ """Bound one formatted transcript line without losing its Q/A label."""
241
+ marker = ":** "
242
+ if marker not in line:
243
+ return line if len(line) <= max_content_chars else line[:max_content_chars] + "..."
244
+
245
+ prefix, content = line.split(marker, 1)
246
+ prefix = f"{prefix}{marker}"
247
+ if len(content) <= max_content_chars:
248
+ return line
249
+ return f"{prefix}{content[:max_content_chars]}... [truncated]"
250
+
251
+
252
+ _TRANSCRIPT_Q_MARKER_RE = re.compile(r"(?m)^\*\*Q\d+:\*\* ")
253
+ _TRANSCRIPT_A_MARKER_RE = re.compile(r"(?m)^\*\*A\d+:\*\* ")
254
+
255
+
256
+ def _compact_transcript_section(section: str, max_content_chars: int) -> str:
257
+ """Compact a marked Q/A section while preserving the marker."""
258
+ lines = section.splitlines()
259
+ if not lines:
260
+ return ""
261
+
262
+ marker = ":** "
263
+ first_line = lines[0]
264
+ if marker not in first_line:
265
+ return _truncate_tail(section, max_content_chars)
266
+
267
+ prefix, first_content = first_line.split(marker, 1)
268
+ prefix = f"{prefix}{marker}"
269
+ content_parts = [first_content, *lines[1:]]
270
+ content = "\n".join(content_parts).rstrip()
271
+ if len(content) <= max_content_chars:
272
+ return section
273
+ return f"{prefix}{content[:max_content_chars]}... [truncated]"
274
+
275
+
276
+ def _compact_latest_transcript_round(round_text: str) -> str:
277
+ """Preserve the latest transcript round as Q/A sections while bounding content."""
278
+ answer_match = _TRANSCRIPT_A_MARKER_RE.search(round_text)
279
+ if answer_match is None:
280
+ return _compact_transcript_section(
281
+ round_text,
282
+ _INTERVIEW_SUBAGENT_MAX_TRANSCRIPT_QUESTION_CHARS,
283
+ )
284
+
285
+ question_section = round_text[: answer_match.start()].rstrip()
286
+ answer_section = round_text[answer_match.start() :].rstrip()
287
+ compacted_question = _compact_transcript_section(
288
+ question_section,
289
+ _INTERVIEW_SUBAGENT_MAX_TRANSCRIPT_QUESTION_CHARS,
290
+ )
291
+ compacted_answer = _compact_transcript_section(
292
+ answer_section,
293
+ _INTERVIEW_SUBAGENT_MAX_TRANSCRIPT_ANSWER_CHARS,
294
+ )
295
+ return f"{compacted_question}\n{compacted_answer}"
296
+
297
+
298
+ def _compact_interview_transcript(transcript: str) -> str:
299
+ """Compact transcript history without splitting the latest Q/A block."""
300
+ question_matches = list(_TRANSCRIPT_Q_MARKER_RE.finditer(transcript))
301
+ if not question_matches:
302
+ return _truncate_tail(transcript, _INTERVIEW_SUBAGENT_MAX_PREVIOUS_TRANSCRIPT_CHARS)
303
+
304
+ latest_start = question_matches[-1].start()
305
+ latest_round = transcript[latest_start:].strip()
306
+ if not latest_round:
307
+ return ""
308
+
309
+ compacted_latest_round = _compact_latest_transcript_round(latest_round)
310
+ previous = transcript[:latest_start].strip()
311
+ if not previous:
312
+ return compacted_latest_round
313
+
314
+ previous_tail = _truncate_tail(
315
+ previous,
316
+ _INTERVIEW_SUBAGENT_MAX_PREVIOUS_TRANSCRIPT_CHARS,
317
+ )
318
+ return f"{previous_tail}\n\n{compacted_latest_round}"
319
+
320
+
321
+ def _load_seed_closer_summary() -> str:
322
+ """Load the compact Seed Closer guard, tolerating older custom prompt overrides."""
323
+ from ouroboros.agents.loader import load_agent_section
324
+
325
+ try:
326
+ return load_agent_section("seed-closer", "CLOSURE GATE SUMMARY")
327
+ except (FileNotFoundError, KeyError):
328
+ try:
329
+ return _truncate_tail(load_agent_section("seed-closer", "YOUR APPROACH"), 900)
330
+ except (FileNotFoundError, KeyError):
331
+ return (
332
+ "- Do not treat ambiguity <= 0.2 as sufficient for closure.\n"
333
+ "- Do not close if unresolved decisions would materially change implementation.\n"
334
+ "- Ask the highest-impact follow-up question when a material gap remains."
335
+ )
336
+
337
+
214
338
  async def emit_subagent_dispatched_event(
215
339
  event_store: Any | None,
216
340
  *,
@@ -381,10 +505,25 @@ def build_interview_subagent(
381
505
  from ouroboros.agents.loader import load_agent_prompt
382
506
 
383
507
  system_prompt = load_agent_prompt("socratic-interviewer")
508
+ seed_closer_summary = _load_seed_closer_summary()
384
509
 
385
510
  transcript_section = ""
386
511
  if transcript:
387
- transcript_section = f"\n## Conversation History\n{transcript}\n"
512
+ bounded_transcript = _compact_interview_transcript(transcript)
513
+ transcript_section = f"\n## Conversation History\n{bounded_transcript}\n"
514
+
515
+ bounded_initial_context = _truncate_head(
516
+ initial_context,
517
+ _INTERVIEW_SUBAGENT_MAX_CONTEXT_CHARS,
518
+ )
519
+ bounded_answer = _truncate_tail(answer, _INTERVIEW_SUBAGENT_MAX_ANSWER_CHARS)
520
+
521
+ seed_ready_guard = f"""
522
+ ## Seed-ready Guard
523
+ Before declaring ready, apply the canonical Seed Closer closure gate summary.
524
+ Do not treat ambiguity <= 0.2 as sufficient for closure.
525
+
526
+ {seed_closer_summary}"""
388
527
 
389
528
  if action == "start" and initial_context:
390
529
  prompt = f"""{system_prompt}
@@ -395,9 +534,10 @@ def build_interview_subagent(
395
534
 
396
535
  Start a Socratic interview to clarify requirements for the following project idea.
397
536
  Ask probing questions to reduce ambiguity. Score ambiguity after each exchange.
537
+ {seed_ready_guard}
398
538
 
399
539
  ## Initial Context
400
- {initial_context}
540
+ {bounded_initial_context}
401
541
 
402
542
  ## Session ID
403
543
  {session_id}
@@ -413,13 +553,14 @@ Begin the interview. Ask your first clarifying question."""
413
553
 
414
554
  Continue the Socratic interview. The user has answered your previous question.
415
555
  Analyze their answer, update your understanding, score current ambiguity,
416
- and ask the next clarifying question (or declare ready if ambiguity <= 0.2).
556
+ and ask the next clarifying question or declare ready only after the Seed-ready Guard passes.
557
+ {seed_ready_guard}
417
558
 
418
559
  ## Session ID
419
560
  {session_id}
420
561
  {transcript_section}
421
562
  ## User's Latest Answer
422
- {answer}
563
+ {bounded_answer}
423
564
 
424
565
  Continue the interview."""
425
566
 
@@ -433,6 +574,8 @@ Continue the interview."""
433
574
  Resume the Socratic interview for session {session_id}.
434
575
  Review the conversation history and continue from where we left off.
435
576
  {transcript_section}
577
+ {seed_ready_guard}
578
+
436
579
  ## Action: {action}
437
580
 
438
581
  Continue the interview."""
@@ -390,6 +390,17 @@ class TestBuildInterviewSubagent:
390
390
  )
391
391
  assert "Build a REST API" in p.prompt
392
392
 
393
+ def test_start_prompt_bounds_initial_context_from_head(self) -> None:
394
+ p = build_interview_subagent(
395
+ session_id="sess-123",
396
+ action="start",
397
+ initial_context="PRIMARY GOAL: Build a REST API. " + ("details " * 1_000),
398
+ )
399
+ assert "PRIMARY GOAL: Build a REST API." in p.prompt
400
+ assert "[truncated]" in p.prompt
401
+ assert "details " * 200 not in p.prompt
402
+ assert len(p.prompt) < 5_000
403
+
393
404
  def test_answer_prompt_includes_answer(self) -> None:
394
405
  p = build_interview_subagent(
395
406
  session_id="sess-123",
@@ -398,6 +409,123 @@ class TestBuildInterviewSubagent:
398
409
  )
399
410
  assert "Python with FastAPI" in p.prompt
400
411
 
412
+ def test_answer_prompt_requires_seed_ready_guard(self) -> None:
413
+ p = build_interview_subagent(
414
+ session_id="sess-123",
415
+ action="answer",
416
+ answer="Python with FastAPI",
417
+ )
418
+ assert "Do not treat ambiguity <= 0.2 as sufficient for closure" in p.prompt
419
+ assert "ownership/SSoT" in p.prompt
420
+ assert "declare ready if ambiguity <= 0.2" not in p.prompt
421
+
422
+ def test_answer_prompt_uses_seed_closer_as_guard_ssot(self, monkeypatch) -> None:
423
+ from ouroboros.agents import loader
424
+
425
+ def fake_load_agent_prompt(agent_name: str) -> str:
426
+ if agent_name == "socratic-interviewer":
427
+ return "SOCRATIC INTERVIEWER PROMPT"
428
+ raise FileNotFoundError(agent_name)
429
+
430
+ def fake_load_agent_section(agent_name: str, section: str) -> str:
431
+ if agent_name == "seed-closer" and section == "CLOSURE GATE SUMMARY":
432
+ return "CANONICAL SEED CLOSER SUMMARY"
433
+ raise KeyError(section)
434
+
435
+ monkeypatch.setattr(loader, "load_agent_prompt", fake_load_agent_prompt)
436
+ monkeypatch.setattr(loader, "load_agent_section", fake_load_agent_section)
437
+
438
+ p = build_interview_subagent(
439
+ session_id="sess-123",
440
+ action="answer",
441
+ answer="Python with FastAPI",
442
+ )
443
+
444
+ assert "SOCRATIC INTERVIEWER PROMPT" in p.prompt
445
+ assert "CANONICAL SEED CLOSER SUMMARY" in p.prompt
446
+
447
+ def test_answer_prompt_bounds_large_transcript_and_answer(self) -> None:
448
+ p = build_interview_subagent(
449
+ session_id="sess-123",
450
+ action="answer",
451
+ answer="A" * 5_000,
452
+ transcript="T" * 5_000,
453
+ )
454
+
455
+ assert "[truncated]" in p.prompt
456
+ assert "A" * 1_000 not in p.prompt
457
+ assert "T" * 1_000 not in p.prompt
458
+ assert len(p.prompt) < 5_000
459
+
460
+ def test_answer_prompt_preserves_latest_transcript_round(self) -> None:
461
+ latest_question = "**Q7:** Should subscription control be server-side or client-side?"
462
+ latest_answer = "**A7:** Server-side should own the final decision."
463
+ transcript = (
464
+ f"**Q6:** {'older context ' * 80}\n"
465
+ f"**A6:** {'older answer ' * 80}\n\n"
466
+ f"{latest_question}\n{latest_answer}"
467
+ )
468
+
469
+ p = build_interview_subagent(
470
+ session_id="sess-123",
471
+ action="answer",
472
+ answer="Server-side should own the final decision.",
473
+ transcript=transcript,
474
+ )
475
+
476
+ assert latest_question in p.prompt
477
+ assert latest_answer in p.prompt
478
+ assert "older context " * 20 not in p.prompt
479
+
480
+ def test_answer_prompt_compacts_multiline_latest_round_by_markers(self) -> None:
481
+ latest_question = (
482
+ "**Q7:** Should subscription control be server-side or client-side?\n"
483
+ "Please decide this before Seed generation."
484
+ )
485
+ transcript = (
486
+ "**Q6:** Previous question\n"
487
+ "**A6:** Previous answer\n\n"
488
+ f"{latest_question}\n"
489
+ f"**A7:** Server-side should own it.\n\n{'code line\\n' * 500}"
490
+ )
491
+
492
+ p = build_interview_subagent(
493
+ session_id="sess-123",
494
+ action="answer",
495
+ answer="Server-side should own it.",
496
+ transcript=transcript,
497
+ )
498
+
499
+ assert "**Q7:** Should subscription control be server-side or client-side?" in p.prompt
500
+ assert "Please decide this before Seed generation." in p.prompt
501
+ assert "**A7:** Server-side should own it." in p.prompt
502
+ assert "code line\n" * 100 not in p.prompt
503
+ assert len(p.prompt) < 5_000
504
+
505
+ def test_answer_prompt_falls_back_when_seed_closer_summary_missing(self, monkeypatch) -> None:
506
+ from ouroboros.agents import loader
507
+
508
+ def fake_load_agent_prompt(agent_name: str) -> str:
509
+ if agent_name == "socratic-interviewer":
510
+ return "SOCRATIC INTERVIEWER PROMPT"
511
+ raise FileNotFoundError(agent_name)
512
+
513
+ def fake_load_agent_section(agent_name: str, section: str) -> str:
514
+ if agent_name == "seed-closer" and section == "YOUR APPROACH":
515
+ return "FALLBACK SEED CLOSER APPROACH"
516
+ raise KeyError(section)
517
+
518
+ monkeypatch.setattr(loader, "load_agent_prompt", fake_load_agent_prompt)
519
+ monkeypatch.setattr(loader, "load_agent_section", fake_load_agent_section)
520
+
521
+ p = build_interview_subagent(
522
+ session_id="sess-123",
523
+ action="answer",
524
+ answer="Python with FastAPI",
525
+ )
526
+
527
+ assert "FALLBACK SEED CLOSER APPROACH" in p.prompt
528
+
401
529
  def test_context_preserves_session_id(self) -> None:
402
530
  p = build_interview_subagent(
403
531
  session_id="sess-123",
@@ -1,39 +0,0 @@
1
- # Seed Closer
2
-
3
- You decide when the interview is already clear enough to stop and convert into a Seed instead of asking one more clever question.
4
-
5
- ## YOUR PHILOSOPHY
6
-
7
- "A good interview ends on time. Extra precision after the decision boundary is waste."
8
-
9
- You optimize for actionable clarity, not endless refinement.
10
-
11
- ## YOUR APPROACH
12
-
13
- ### 1. Check The Decision Boundary
14
- - Ask whether scope, non-goals, outputs, and verification expectations are already explicit
15
- - Distinguish true ambiguity from minor wording polish
16
- - Prefer stopping once the remaining uncertainty would not change execution materially
17
-
18
- ### 2. Reject Over-Interviewing
19
- - Notice when new questions only produce stylistic refinement or edge-case bikeshedding
20
- - Treat repeated restatement as a sign that the interview may already be done
21
- - Avoid opening new branches when the current information is already seed-worthy
22
-
23
- ### 3. Ask For Closure Directly
24
- - Convert late-stage refinement into a closure question
25
- - Confirm whether the current constraints are sufficient to proceed
26
- - Move the conversation toward seed generation instead of another exploratory detour
27
-
28
- ### 4. Preserve Practical Momentum
29
- - Favor "good enough to execute" over theoretical completeness
30
- - Accept that some implementation details belong to execution, not interview
31
- - End the interview once the next useful action is seed generation
32
-
33
- ## YOUR QUESTIONS
34
-
35
- - Is there any ambiguity left that would materially change implementation?
36
- - Are scope, non-goals, outputs, and verification expectations already clear enough for a Seed?
37
- - Would another question change execution, or just polish wording?
38
- - Should we stop the interview here and move to seed generation?
39
- - What is the smallest remaining clarification needed before we can proceed?