ouroboros-ai 0.29.2.dev3__tar.gz → 0.29.3.dev6__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 (716) hide show
  1. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/marketplace.json +1 -1
  2. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/plugin.json +1 -1
  3. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/CLAUDE.md +1 -0
  4. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/PKG-INFO +1 -1
  5. ouroboros_ai-0.29.3.dev6/skills/resume/SKILL.md +116 -0
  6. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/setup/SKILL.md +1 -1
  7. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/_version.py +2 -2
  8. ouroboros_ai-0.29.3.dev6/src/ouroboros/cli/commands/resume.py +333 -0
  9. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/main.py +2 -0
  10. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evaluation_handlers.py +65 -1
  11. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runner.py +110 -12
  12. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/event_store.py +90 -16
  13. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/__init__.py +20 -0
  14. ouroboros_ai-0.29.3.dev6/src/ouroboros/resilience/recovery.py +232 -0
  15. ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_doc_commands.py +187 -0
  16. ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_resume.py +660 -0
  17. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_lateral_think_handler.py +115 -0
  18. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner.py +78 -0
  19. ouroboros_ai-0.29.3.dev6/tests/unit/resilience/test_recovery.py +71 -0
  20. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.claude/settings.json +0 -0
  21. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/.mcp.json +0 -0
  22. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.env.example +0 -0
  23. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  27. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/workflows/dev-publish.yml +0 -0
  28. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/workflows/lint.yml +0 -0
  29. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/workflows/release.yml +0 -0
  30. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.github/workflows/test.yml +0 -0
  31. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.gitignore +0 -0
  32. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.mcp.json +0 -0
  33. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.ouroboros/mechanical.toml +0 -0
  34. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  35. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  36. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.pre-commit-config.yaml +0 -0
  37. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/.python-version +0 -0
  38. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/CHANGELOG.md +0 -0
  39. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/CODE_OF_CONDUCT.md +0 -0
  40. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/CONTRIBUTING.md +0 -0
  41. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/Code-Review-Claude.md +0 -0
  42. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/Code-Review-Codex.md +0 -0
  43. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/HANDOFF.md +0 -0
  44. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/LICENSE +0 -0
  45. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/README.ko.md +0 -0
  46. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/README.md +0 -0
  47. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/SECURITY.md +0 -0
  48. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/UNINSTALL.md +0 -0
  49. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/cancel.md +0 -0
  50. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/evaluate.md +0 -0
  51. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/evolve.md +0 -0
  52. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/help.md +0 -0
  53. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/interview.md +0 -0
  54. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/ralph.md +0 -0
  55. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/run.md +0 -0
  56. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/seed.md +0 -0
  57. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/setup.md +0 -0
  58. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/status.md +0 -0
  59. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/tutorial.md +0 -0
  60. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/unstuck.md +0 -0
  61. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/commands/welcome.md +0 -0
  62. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/.gitignore +0 -0
  63. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.lock +0 -0
  64. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.toml +0 -0
  65. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/README.md +0 -0
  66. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/db.rs +0 -0
  67. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/main.rs +0 -0
  68. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/mock.rs +0 -0
  69. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/state.rs +0 -0
  70. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  71. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  72. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  73. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  74. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  75. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  76. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/README.md +0 -0
  77. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/api/README.md +0 -0
  78. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/api/core.md +0 -0
  79. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/api/mcp.md +0 -0
  80. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/architecture.md +0 -0
  81. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/cli-reference.md +0 -0
  82. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/config-reference.md +0 -0
  83. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/contributing/architecture-overview.md +0 -0
  84. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/contributing/findings-registry.md +0 -0
  85. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/contributing/issue-quality-policy.md +0 -0
  86. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/contributing/key-patterns.md +0 -0
  87. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/contributing/testing-guide.md +0 -0
  88. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/events.md +0 -0
  89. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/examples/mcp-config.yaml +0 -0
  90. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/getting-started.md +0 -0
  91. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/evaluation-pipeline.md +0 -0
  92. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/evolution-loop.md +0 -0
  93. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  94. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/mcp-bridge.md +0 -0
  95. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  96. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/opencode-subagent-bridge.md +0 -0
  97. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/seed-authoring.md +0 -0
  98. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/guides/tui-usage.md +0 -0
  99. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/images/PLACEHOLDER_README.md +0 -0
  100. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/images/ouroboros.png +0 -0
  101. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/platform-support.md +0 -0
  102. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/runtime-capability-matrix.md +0 -0
  103. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/claude-code.md +0 -0
  104. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/codex.md +0 -0
  105. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/hermes.md +0 -0
  106. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/opencode.md +0 -0
  107. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/coordinator_test_seed.yaml +0 -0
  108. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/dummy_seed.yaml +0 -0
  109. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/parallel_subac_test_seed.yaml +0 -0
  110. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/subac_test_seed.yaml +0 -0
  111. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/README.md +0 -0
  112. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__init__.py +0 -0
  113. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__main__.py +0 -0
  114. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/cli.py +0 -0
  115. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/models.py +0 -0
  116. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/storage.py +0 -0
  117. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/examples/test_display.py +0 -0
  118. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/hooks/hooks.json +0 -0
  119. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/llms-full.txt +0 -0
  120. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/llms.txt +0 -0
  121. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/project-context.md +0 -0
  122. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/pyproject.toml +0 -0
  123. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/drift-monitor.py +0 -0
  124. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/install.sh +0 -0
  125. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/keyword-detector.py +0 -0
  126. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/mcp-serve.sh +0 -0
  127. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/ralph-rewind.py +0 -0
  128. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.py +0 -0
  129. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.sh +0 -0
  130. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/session-start.py +0 -0
  131. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/sync-plugin-version.py +0 -0
  132. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/scripts/version-check.py +0 -0
  133. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/brownfield/SKILL.md +0 -0
  134. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/cancel/SKILL.md +0 -0
  135. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/evaluate/SKILL.md +0 -0
  136. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/evolve/SKILL.md +0 -0
  137. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/help/SKILL.md +0 -0
  138. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/interview/SKILL.md +0 -0
  139. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/pm/SKILL.md +0 -0
  140. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/publish/SKILL.md +0 -0
  141. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/qa/SKILL.md +0 -0
  142. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/ralph/SKILL.md +0 -0
  143. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/run/SKILL.md +0 -0
  144. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/seed/SKILL.md +0 -0
  145. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/status/SKILL.md +0 -0
  146. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/tutorial/SKILL.md +0 -0
  147. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/unstuck/SKILL.md +0 -0
  148. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/update/SKILL.md +0 -0
  149. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/skills/welcome/SKILL.md +0 -0
  150. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__init__.py +0 -0
  151. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__main__.py +0 -0
  152. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/__init__.py +0 -0
  153. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/advocate.md +0 -0
  154. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/analysis-agent.md +0 -0
  155. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/architect.md +0 -0
  156. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/breadth-keeper.md +0 -0
  157. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/code-executor.md +0 -0
  158. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/codebase-explorer.md +0 -0
  159. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  160. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/contrarian.md +0 -0
  161. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/evaluator.md +0 -0
  162. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/hacker.md +0 -0
  163. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/judge.md +0 -0
  164. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/loader.py +0 -0
  165. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontologist.md +0 -0
  166. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontology-analyst.md +0 -0
  167. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/qa-judge.md +0 -0
  168. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/research-agent.md +0 -0
  169. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/researcher.md +0 -0
  170. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-architect.md +0 -0
  171. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-closer.md +0 -0
  172. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  173. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/simplifier.md +0 -0
  174. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  175. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/__init__.py +0 -0
  176. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/ambiguity.py +0 -0
  177. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/brownfield.py +0 -0
  178. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/explore.py +0 -0
  179. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/interview.py +0 -0
  180. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_completion.py +0 -0
  181. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_document.py +0 -0
  182. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_interview.py +0 -0
  183. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_seed.py +0 -0
  184. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/question_classifier.py +0 -0
  185. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/seed_generator.py +0 -0
  186. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/claude_permissions.py +0 -0
  187. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/__init__.py +0 -0
  188. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/__init__.py +0 -0
  189. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/cancel.py +0 -0
  190. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/config.py +0 -0
  191. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/detect.py +0 -0
  192. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/init.py +0 -0
  193. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp.py +0 -0
  194. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  195. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/pm.py +0 -0
  196. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/run.py +0 -0
  197. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/setup.py +0 -0
  198. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/status.py +0 -0
  199. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/tui.py +0 -0
  200. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/uninstall.py +0 -0
  201. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/__init__.py +0 -0
  202. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/panels.py +0 -0
  203. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/progress.py +0 -0
  204. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/prompting.py +0 -0
  205. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/tables.py +0 -0
  206. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  207. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/jsonc.py +0 -0
  208. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/opencode_config.py +0 -0
  209. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/__init__.py +0 -0
  210. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/artifacts.py +0 -0
  211. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/cli_policy.py +0 -0
  212. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/ouroboros.md +0 -0
  213. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex_permissions.py +0 -0
  214. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/__init__.py +0 -0
  215. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/loader.py +0 -0
  216. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/models.py +0 -0
  217. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/__init__.py +0 -0
  218. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ac_tree.py +0 -0
  219. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/context.py +0 -0
  220. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/errors.py +0 -0
  221. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/file_lock.py +0 -0
  222. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/git_workflow.py +0 -0
  223. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/initial_context.py +0 -0
  224. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/json_utils.py +0 -0
  225. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/lineage.py +0 -0
  226. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_aspect.py +0 -0
  227. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_questions.py +0 -0
  228. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/project_paths.py +0 -0
  229. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/retry.py +0 -0
  230. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/security.py +0 -0
  231. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/seed.py +0 -0
  232. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/text.py +0 -0
  233. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ttl_cache.py +0 -0
  234. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/types.py +0 -0
  235. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/worktree.py +0 -0
  236. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/__init__.py +0 -0
  237. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  238. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/checklist.py +0 -0
  239. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/consensus.py +0 -0
  240. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/detector.py +0 -0
  241. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/json_utils.py +0 -0
  242. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/languages.py +0 -0
  243. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/mechanical.py +0 -0
  244. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/models.py +0 -0
  245. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/pipeline.py +0 -0
  246. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/semantic.py +0 -0
  247. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/trigger.py +0 -0
  248. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  249. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/__init__.py +0 -0
  250. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/base.py +0 -0
  251. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/decomposition.py +0 -0
  252. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/evaluation.py +0 -0
  253. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/interview.py +0 -0
  254. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/lineage.py +0 -0
  255. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/ontology.py +0 -0
  256. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/__init__.py +0 -0
  257. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/convergence.py +0 -0
  258. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/loop.py +0 -0
  259. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/projector.py +0 -0
  260. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/reflect.py +0 -0
  261. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/regression.py +0 -0
  262. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/wonder.py +0 -0
  263. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/__init__.py +0 -0
  264. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/atomicity.py +0 -0
  265. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/decomposition.py +0 -0
  266. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/double_diamond.py +0 -0
  267. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/subagent.py +0 -0
  268. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/__init__.py +0 -0
  269. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/artifacts.py +0 -0
  270. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/__init__.py +0 -0
  271. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  272. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  273. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/config.py +0 -0
  274. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/factory.py +0 -0
  275. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/__init__.py +0 -0
  276. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/adapter.py +0 -0
  277. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/manager.py +0 -0
  278. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/protocol.py +0 -0
  279. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/errors.py +0 -0
  280. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/job_manager.py +0 -0
  281. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/__init__.py +0 -0
  282. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/handlers.py +0 -0
  283. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/__init__.py +0 -0
  284. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/adapter.py +0 -0
  285. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/protocol.py +0 -0
  286. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/security.py +0 -0
  287. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/__init__.py +0 -0
  288. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  289. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  290. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  291. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  292. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  293. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  294. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/definitions.py +0 -0
  295. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  296. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  297. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  298. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  299. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/qa.py +0 -0
  300. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  301. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/registry.py +0 -0
  302. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/subagent.py +0 -0
  303. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/types.py +0 -0
  304. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/__init__.py +0 -0
  305. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/drift.py +0 -0
  306. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/logging.py +0 -0
  307. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/retrospective.py +0 -0
  308. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/__init__.py +0 -0
  309. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  310. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  311. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
  312. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
  313. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/package.json +0 -0
  314. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  315. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/__init__.py +0 -0
  316. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/adapter.py +0 -0
  317. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/capabilities.py +0 -0
  318. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  319. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  320. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/control_plane.py +0 -0
  321. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/coordinator.py +0 -0
  322. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  323. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/events.py +0 -0
  324. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  325. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  326. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  327. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  328. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/level_context.py +0 -0
  329. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  330. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  331. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  332. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  333. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  334. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  335. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/policy.py +0 -0
  336. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  337. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  338. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  339. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/session.py +0 -0
  340. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  341. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/__init__.py +0 -0
  342. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/brownfield.py +0 -0
  343. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/checkpoint.py +0 -0
  344. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  345. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/runner.py +0 -0
  346. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  347. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  348. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/schema.py +0 -0
  349. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/uow.py +0 -0
  350. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/__init__.py +0 -0
  351. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/__init__.py +0 -0
  352. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/pool.py +0 -0
  353. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/registry.py +0 -0
  354. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  355. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/router.py +0 -0
  356. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  357. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/__init__.py +0 -0
  358. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/docs.py +0 -0
  359. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/executor.py +0 -0
  360. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/keywords.py +0 -0
  361. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/registry.py +0 -0
  362. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/__init__.py +0 -0
  363. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/handoff.py +0 -0
  364. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/renderer.py +0 -0
  365. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/__init__.py +0 -0
  366. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  367. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/base.py +0 -0
  368. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  369. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  370. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  371. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/factory.py +0 -0
  372. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  373. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/litellm_adapter.py +0 -0
  374. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/opencode_adapter.py +0 -0
  375. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/py.typed +0 -0
  376. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/lateral.py +0 -0
  377. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/stagnation.py +0 -0
  378. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/__init__.py +0 -0
  379. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/command_parser.py +0 -0
  380. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/dispatch.py +0 -0
  381. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/registry.py +0 -0
  382. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/types.py +0 -0
  383. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/__init__.py +0 -0
  384. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/complexity.py +0 -0
  385. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/downgrade.py +0 -0
  386. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/escalation.py +0 -0
  387. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/router.py +0 -0
  388. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/tiers.py +0 -0
  389. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/sandbox.py +0 -0
  390. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/__init__.py +0 -0
  391. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/scheduler.py +0 -0
  392. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/todo_registry.py +0 -0
  393. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/__init__.py +0 -0
  394. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/artifacts.py +0 -0
  395. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/__init__.py +0 -0
  396. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/devil_advocate.py +0 -0
  397. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/__init__.py +0 -0
  398. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/app.py +0 -0
  399. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/__init__.py +0 -0
  400. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/agents_panel.py +0 -0
  401. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/event_log.py +0 -0
  402. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/progress.py +0 -0
  403. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/token_tracker.py +0 -0
  404. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/events.py +0 -0
  405. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/__init__.py +0 -0
  406. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  407. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard.py +0 -0
  408. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  409. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  410. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/debug.py +0 -0
  411. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/execution.py +0 -0
  412. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  413. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  414. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  415. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/logs.py +0 -0
  416. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/session_selector.py +0 -0
  417. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/__init__.py +0 -0
  418. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  419. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  420. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  421. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  422. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  423. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  424. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  425. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  426. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/__init__.py +0 -0
  427. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/extractor.py +0 -0
  428. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/models.py +0 -0
  429. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/verifier.py +0 -0
  430. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/__init__.py +0 -0
  431. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/conftest.py +0 -0
  432. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/__init__.py +0 -0
  433. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/conftest.py +0 -0
  434. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  435. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_cli_commands.py +0 -0
  436. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_full_workflow.py +0 -0
  437. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_session_persistence.py +0 -0
  438. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  439. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/test_atomicity_seed.yml +0 -0
  440. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/__init__.py +0 -0
  441. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/conftest.py +0 -0
  442. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/__init__.py +0 -0
  443. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/__init__.py +0 -0
  444. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  445. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/conftest.py +0 -0
  446. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_adapter.py +0 -0
  447. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_manager.py +0 -0
  448. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_server_adapter.py +0 -0
  449. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/plugin/test_orchestration.py +0 -0
  450. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  451. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_fallback.py +0 -0
  452. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_smoke.py +0 -0
  453. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_entry_point.py +0 -0
  454. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/test-execution-plan.md +0 -0
  455. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/__init__.py +0 -0
  456. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/__init__.py +0 -0
  457. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/test_loader.py +0 -0
  458. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/__init__.py +0 -0
  459. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_ambiguity.py +0 -0
  460. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_brownfield.py +0 -0
  461. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_classifier_context.py +0 -0
  462. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  463. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_explore.py +0 -0
  464. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview.py +0 -0
  465. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  466. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  467. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  468. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_completion.py +0 -0
  469. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  470. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  471. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview.py +0 -0
  472. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  473. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  474. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  475. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_question_classifier.py +0 -0
  476. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_seed_generator.py +0 -0
  477. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/__init__.py +0 -0
  478. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/commands/test_tui_command.py +0 -0
  479. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/conftest.py +0 -0
  480. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/__init__.py +0 -0
  481. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_console.py +0 -0
  482. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_panels.py +0 -0
  483. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_progress.py +0 -0
  484. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_prompting.py +0 -0
  485. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_tables.py +0 -0
  486. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  487. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  488. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  489. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_cancel.py +0 -0
  490. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_config.py +0 -0
  491. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  492. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_runtime.py +0 -0
  493. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_jsonc.py +0 -0
  494. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_main.py +0 -0
  495. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_doctor.py +0 -0
  496. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  497. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_shell_env.py +0 -0
  498. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  499. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  500. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_opencode_config.py +0 -0
  501. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm.py +0 -0
  502. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_brownfield.py +0 -0
  503. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_completion.py +0 -0
  504. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  505. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  506. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_overwrite.py +0 -0
  507. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  508. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_select_repos.py +0 -0
  509. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_run_qa.py +0 -0
  510. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_setup.py +0 -0
  511. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_uninstall.py +0 -0
  512. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/codex/test_cli_policy.py +0 -0
  513. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/__init__.py +0 -0
  514. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader.py +0 -0
  515. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader_env.py +0 -0
  516. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_models.py +0 -0
  517. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/__init__.py +0 -0
  518. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ac_tree.py +0 -0
  519. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_context.py +0 -0
  520. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_errors.py +0 -0
  521. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_file_lock.py +0 -0
  522. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_git_workflow.py +0 -0
  523. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_initial_context.py +0 -0
  524. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_lineage.py +0 -0
  525. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_aspect.py +0 -0
  526. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_questions.py +0 -0
  527. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_retry.py +0 -0
  528. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_security.py +0 -0
  529. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_seed.py +0 -0
  530. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ttl_cache.py +0 -0
  531. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_types.py +0 -0
  532. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_worktree.py +0 -0
  533. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/__init__.py +0 -0
  534. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  535. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_checklist.py +0 -0
  536. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_consensus.py +0 -0
  537. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_detector.py +0 -0
  538. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_json_utils.py +0 -0
  539. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_languages.py +0 -0
  540. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_mechanical.py +0 -0
  541. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_models.py +0 -0
  542. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  543. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  544. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_review_fixes.py +0 -0
  545. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_semantic.py +0 -0
  546. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger.py +0 -0
  547. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  548. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  549. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/__init__.py +0 -0
  550. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_base.py +0 -0
  551. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_decomposition_events.py +0 -0
  552. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/evolution/test_wonder_scope.py +0 -0
  553. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/__init__.py +0 -0
  554. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_atomicity.py +0 -0
  555. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_decomposition.py +0 -0
  556. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_double_diamond.py +0 -0
  557. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_subagent_isolation.py +0 -0
  558. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/hermes/test_artifacts.py +0 -0
  559. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/__init__.py +0 -0
  560. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/__init__.py +0 -0
  561. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  562. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_config.py +0 -0
  563. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_factory.py +0 -0
  564. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  565. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_stability.py +0 -0
  566. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/__init__.py +0 -0
  567. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter.py +0 -0
  568. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  569. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_manager.py +0 -0
  570. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/conftest.py +0 -0
  571. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/__init__.py +0 -0
  572. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_adapter.py +0 -0
  573. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_security.py +0 -0
  574. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_errors.py +0 -0
  575. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_job_manager.py +0 -0
  576. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_types.py +0 -0
  577. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/__init__.py +0 -0
  578. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/conftest.py +0 -0
  579. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  580. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  581. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  582. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  583. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  584. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  585. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  586. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  587. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  588. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  589. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  590. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  591. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  592. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  593. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_definitions.py +0 -0
  594. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  595. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  596. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  597. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  598. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  599. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  600. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_registry.py +0 -0
  601. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  602. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_subagent.py +0 -0
  603. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/__init__.py +0 -0
  604. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_drift.py +0 -0
  605. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_logging.py +0 -0
  606. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_retrospective.py +0 -0
  607. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/__init__.py +0 -0
  608. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_adapter.py +0 -0
  609. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_capabilities.py +0 -0
  610. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  611. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  612. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  613. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_control_plane.py +0 -0
  614. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_coordinator.py +0 -0
  615. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  616. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_events.py +0 -0
  617. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  618. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  619. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  620. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  621. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_level_context.py +0 -0
  622. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  623. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  624. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  625. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  626. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  627. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  628. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  629. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_policy.py +0 -0
  630. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  631. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  632. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  633. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  634. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  635. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_session.py +0 -0
  636. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  637. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/__init__.py +0 -0
  638. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_brownfield_store.py +0 -0
  639. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_checkpoint.py +0 -0
  640. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_event_store.py +0 -0
  641. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_schema.py +0 -0
  642. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_uow.py +0 -0
  643. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/__init__.py +0 -0
  644. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/__init__.py +0 -0
  645. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/test_registry.py +0 -0
  646. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/__init__.py +0 -0
  647. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  648. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/__init__.py +0 -0
  649. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_keywords.py +0 -0
  650. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_registry.py +0 -0
  651. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/__init__.py +0 -0
  652. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/test_renderer.py +0 -0
  653. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/__init__.py +0 -0
  654. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_base.py +0 -0
  655. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  656. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  657. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_factory.py +0 -0
  658. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  659. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_litellm_adapter.py +0 -0
  660. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_opencode_adapter.py +0 -0
  661. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/__init__.py +0 -0
  662. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_lateral.py +0 -0
  663. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_stagnation.py +0 -0
  664. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/__init__.py +0 -0
  665. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_command_parser.py +0 -0
  666. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch.py +0 -0
  667. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  668. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_extract_first_argument.py +0 -0
  669. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  670. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  671. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_not_handled_resolution.py +0 -0
  672. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_registry.py +0 -0
  673. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  674. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  675. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  676. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  677. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/__init__.py +0 -0
  678. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_complexity.py +0 -0
  679. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_downgrade.py +0 -0
  680. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_escalation.py +0 -0
  681. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_router.py +0 -0
  682. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_tiers.py +0 -0
  683. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_keyword_detector.py +0 -0
  684. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_session_start.py +0 -0
  685. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_version_check.py +0 -0
  686. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/__init__.py +0 -0
  687. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_scheduler.py +0 -0
  688. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_todo_registry.py +0 -0
  689. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/skills/test_skill_artifacts.py +0 -0
  690. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_artifact_collector.py +0 -0
  691. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_codex_artifacts.py +0 -0
  692. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_convergence.py +0 -0
  693. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dashboard.py +0 -0
  694. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dependencies_configured.py +0 -0
  695. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_rewind.py +0 -0
  696. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_step.py +0 -0
  697. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_graceful_shutdown.py +0 -0
  698. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_main_entry_point.py +0 -0
  699. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_module_structure.py +0 -0
  700. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_project_initialization.py +0 -0
  701. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_projector_rewind.py +0 -0
  702. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_parser.py +0 -0
  703. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_rewind.py +0 -0
  704. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_regression.py +0 -0
  705. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_tooling_configuration.py +0 -0
  706. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_verification.py +0 -0
  707. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/__init__.py +0 -0
  708. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_app.py +0 -0
  709. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_cancelled_display.py +0 -0
  710. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_events.py +0 -0
  711. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_lineage_viewer.py +0 -0
  712. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_screens.py +0 -0
  713. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_session_selector_replay.py +0 -0
  714. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_widgets.py +0 -0
  715. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/tools/sync_github_project.py +0 -0
  716. {ouroboros_ai-0.29.2.dev3 → ouroboros_ai-0.29.3.dev6}/uv.lock +0 -0
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "ouroboros",
12
12
  "description": "Transform vague ideas into validated seed specifications through Socratic questioning and ontological analysis",
13
- "version": "0.29.1",
13
+ "version": "0.29.2",
14
14
  "author": {
15
15
  "name": "Q00",
16
16
  "email": "jqyu.lee@gmail.com"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ouroboros",
3
- "version": "0.29.1",
3
+ "version": "0.29.2",
4
4
  "description": "Self-improving AI workflow system. Crystallize requirements before execution with Socratic interview, ambiguity scoring, and 3-stage evaluation.",
5
5
  "author": {
6
6
  "name": "Q00",
@@ -32,6 +32,7 @@ When the user types any of these commands, read the corresponding SKILL.md file
32
32
  | `ooo pm` or `ooo pm ...` | Read `skills/pm/SKILL.md` and follow it |
33
33
  | `ooo brownfield` or `ooo brownfield ...` | Read `skills/brownfield/SKILL.md` and follow it |
34
34
  | `ooo publish` or `ooo publish ...` | Read `skills/publish/SKILL.md` and follow it |
35
+ | `ooo resume` | Read `skills/resume/SKILL.md` and follow it |
35
36
 
36
37
  **Important**: Do NOT use the Skill tool. Read the file with the Read tool and execute its instructions directly.
37
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.29.2.dev3
3
+ Version: 0.29.3.dev6
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
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: resume
3
+ description: "List in-flight sessions and show the commands needed to re-attach after MCP disconnect"
4
+ ---
5
+
6
+ # /ouroboros:resume
7
+
8
+ Recover in-flight sessions after an unexpected MCP server disconnect.
9
+
10
+ ## Usage
11
+
12
+ ```
13
+ ooo resume
14
+ ooo resume --all
15
+ ```
16
+
17
+ **Trigger keywords:** "resume session", "re-attach", "mcp disconnected", "lost session", "in-flight"
18
+
19
+ ## How It Works
20
+
21
+ `ooo resume` reads the EventStore directly (no MCP server required) and lists
22
+ every session that is still in a `running` or `paused` state. The command is
23
+ strictly read-only — it never creates the data directory, never writes
24
+ schema, and never appends events. Its job is to surface the identifiers you
25
+ need to re-attach.
26
+
27
+ - `ooo resume` shows the 20 most recent active sessions.
28
+ - `ooo resume --all` shows every active session.
29
+
30
+ ## Instructions
31
+
32
+ When the user invokes this skill:
33
+
34
+ 1. Run the CLI command:
35
+
36
+ ```
37
+ ouroboros resume
38
+ ```
39
+
40
+ This reads `~/.ouroboros/ouroboros.db` directly — the MCP server does **not**
41
+ need to be running.
42
+
43
+ 2. If sessions are listed, enter the number of the session you want to work
44
+ with. The command prints both the `session_id` and the `exec_id`, along
45
+ with the two re-attach paths.
46
+
47
+ 3. Pick the right re-attach path:
48
+
49
+ - **Inspect only** (read-only interactive monitor):
50
+
51
+ ```
52
+ ouroboros tui monitor
53
+ ```
54
+
55
+ Launches the TUI and lets you pick the session to inspect. The
56
+ `ouroboros status execution <exec_id>` command is *registered* but its
57
+ handler is still a placeholder in `src/ouroboros/cli/commands/status.py`
58
+ (it only prints "Would show details for execution: …"), so it is
59
+ intentionally not surfaced here. Follow-up tracked as a separate issue.
60
+
61
+ - **Resume execution** (requires the original seed file):
62
+
63
+ ```
64
+ ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
65
+ ```
66
+
67
+ ## Exit codes
68
+
69
+ | Code | Meaning |
70
+ |------|---------|
71
+ | `0` | Success — sessions listed, or no sessions found |
72
+ | `1` | Invalid user selection (non-numeric or out-of-range) |
73
+ | `2` | EventStore exists but could not be opened or read |
74
+
75
+ ## Fallback (No sessions found)
76
+
77
+ If the command reports "No in-flight sessions found", the execution either
78
+ completed, failed, was cancelled, or the EventStore has never been created.
79
+ To browse historical sessions interactively, use the TUI monitor:
80
+
81
+ ```
82
+ ouroboros tui monitor
83
+ ```
84
+
85
+ ## Example
86
+
87
+ ```
88
+ User: ooo resume
89
+
90
+ ┌─────────────────────── In-Flight Sessions ───────────────────────┐
91
+ │ # Session ID Execution ID Status Started │
92
+ │ 1 sess-abc123 exec-xyz789 running 2026-04-15 │
93
+ └───────────────────────────────────────────────────────────────────┘
94
+
95
+ Enter number to re-attach (1-1), or 'q' to quit: 1
96
+
97
+ ╭─ Re-attach ────────────────────────────────────────────────────────────────╮
98
+ │ Session ID: sess-abc123 │
99
+ │ Execution ID: exec-xyz789 │
100
+ │ │
101
+ │ Inspect (read-only interactive monitor): │
102
+ │ ouroboros tui monitor │
103
+ │ │
104
+ │ Resume execution (requires the original seed file): │
105
+ │ ouroboros run workflow --orchestrator --resume sess-abc123 seed-001 │
106
+ ╰────────────────────────────────────────────────────────────────────────────╯
107
+ ```
108
+
109
+ ## Next Steps
110
+
111
+ After you have the identifiers:
112
+
113
+ - `ouroboros tui monitor` — launch the TUI and pick the session to inspect
114
+ - `ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>` — resume execution
115
+ - `ooo evaluate` — evaluate results once the execution completes
116
+ - `ooo cancel execution <exec_id>` — cancel if the session is stuck
@@ -246,7 +246,7 @@ A backup will be created: CLAUDE.md.bak
246
246
  **If "Preview first", show:**
247
247
  ````markdown
248
248
  <!-- ooo:START -->
249
- <!-- ooo:VERSION:0.29.1 -->
249
+ <!-- ooo:VERSION:0.29.2 -->
250
250
  # Ouroboros — Specification-First AI Development
251
251
 
252
252
  > Before telling AI what to build, define what should be built.
@@ -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.dev3'
22
- __version_tuple__ = version_tuple = (0, 29, 2, 'dev3')
21
+ __version__ = version = '0.29.3.dev6'
22
+ __version_tuple__ = version_tuple = (0, 29, 3, 'dev6')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,333 @@
1
+ """Resume command for Ouroboros.
2
+
3
+ List in-flight sessions directly from the EventStore (no MCP dependency).
4
+ The command is intentionally read-only: it never creates the data directory,
5
+ never writes schema, and never appends events. Read-only is enforced at the
6
+ SQLite connection layer via ``EventStore(..., read_only=True)`` so even
7
+ unexpected write paths fail fast with ``attempt to write a readonly
8
+ database``. Its only job is to surface the identifiers a user needs to
9
+ re-attach (inspect with ``ouroboros tui monitor`` or resume execution with
10
+ ``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``).
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import os
17
+ from pathlib import Path
18
+ from typing import Annotated
19
+
20
+ import typer
21
+
22
+ from ouroboros.cli.formatters import console
23
+ from ouroboros.cli.formatters.panels import print_error, print_info, print_success
24
+ from ouroboros.cli.formatters.tables import create_table, print_table
25
+
26
+ app = typer.Typer(
27
+ name="resume",
28
+ help="List in-flight sessions and re-attach after MCP disconnect.",
29
+ invoke_without_command=True,
30
+ )
31
+
32
+
33
+ # Default cap on rows shown when many stale sessions accumulate. The user can
34
+ # opt into the full list with ``--all``.
35
+ DEFAULT_DISPLAY_LIMIT = 20
36
+
37
+ # Exit code surfaced when the EventStore exists but is unreadable. Pinned so
38
+ # users/scripts can branch on it (distinct from the happy "no sessions" path
39
+ # which exits 0).
40
+ EXIT_CORRUPTED_DB = 2
41
+
42
+
43
+ def _default_db_path() -> str:
44
+ """Return the canonical SQLite path used by the running CLI."""
45
+ return os.path.expanduser("~/.ouroboros/ouroboros.db")
46
+
47
+
48
+ async def _get_event_store(db_path: str | None = None):
49
+ """Open the EventStore read-only.
50
+
51
+ Returns ``None`` if the database file does not exist. Intentionally does
52
+ not create ``~/.ouroboros/`` or run ``metadata.create_all`` — this command
53
+ is a recovery tool and must not mutate user state. Read-only is enforced
54
+ at the SQLite connection layer via ``EventStore(..., read_only=True)``
55
+ so any accidental write path raises
56
+ ``sqlite3.OperationalError: attempt to write a readonly database``.
57
+ """
58
+ from ouroboros.persistence.event_store import EventStore
59
+
60
+ resolved = db_path or _default_db_path()
61
+ if not Path(resolved).exists():
62
+ return None
63
+
64
+ event_store = EventStore(
65
+ f"sqlite+aiosqlite:///{resolved}",
66
+ read_only=True,
67
+ )
68
+ try:
69
+ await event_store.initialize()
70
+ except Exception:
71
+ # Ensure the partially constructed engine is disposed before we bail
72
+ # out — otherwise the outer ``finally`` cannot close it (the variable
73
+ # was never bound in the caller).
74
+ try:
75
+ await event_store.close()
76
+ finally:
77
+ raise
78
+ return event_store
79
+
80
+
81
+ def _is_active_snapshot(snapshot) -> bool:
82
+ """Return True when a snapshot is plausibly running or paused.
83
+
84
+ Terminal ``status_event_type`` values short-circuit the expensive replay.
85
+ Non-terminal or progress-only snapshots fall through to reconstruction.
86
+ """
87
+ terminal = {
88
+ "orchestrator.session.completed",
89
+ "orchestrator.session.failed",
90
+ "orchestrator.session.cancelled",
91
+ }
92
+ return snapshot.status_event_type not in terminal
93
+
94
+
95
+ async def _get_in_flight_sessions(event_store, limit: int | None = DEFAULT_DISPLAY_LIMIT) -> list:
96
+ """Return running or paused session trackers, most-recent-first.
97
+
98
+ Uses ``get_session_activity_snapshots`` to narrow candidates without
99
+ replaying every event for every session, then reconstructs only the
100
+ snapshots whose latest status is non-terminal.
101
+ """
102
+ from ouroboros.orchestrator.session import SessionRepository, SessionStatus
103
+
104
+ repo = SessionRepository(event_store)
105
+
106
+ try:
107
+ snapshots = await event_store.get_session_activity_snapshots()
108
+ except AttributeError:
109
+ # Older EventStore builds may lack the snapshot helper. Fall back to
110
+ # the full replay path so the command still works.
111
+ return await _get_in_flight_sessions_fallback(event_store)
112
+
113
+ candidates = [s for s in snapshots if _is_active_snapshot(s)]
114
+
115
+ def _activity_key(snapshot) -> str:
116
+ return str(snapshot.last_activity or snapshot.start_time or "")
117
+
118
+ candidates.sort(key=_activity_key, reverse=True)
119
+
120
+ in_flight: list = []
121
+ for snapshot in candidates:
122
+ result = await repo.reconstruct_session(snapshot.session_id)
123
+ if result.is_err:
124
+ continue
125
+ tracker = result.value
126
+ if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
127
+ in_flight.append(tracker)
128
+ if limit is not None and len(in_flight) >= limit:
129
+ break
130
+
131
+ return in_flight
132
+
133
+
134
+ async def _get_in_flight_sessions_fallback(event_store) -> list:
135
+ """Legacy path: replay every session. Retained only for API compatibility."""
136
+ from ouroboros.orchestrator.session import SessionRepository, SessionStatus
137
+
138
+ repo = SessionRepository(event_store)
139
+ session_events = await event_store.get_all_sessions()
140
+ if not session_events:
141
+ return []
142
+
143
+ seen: set[str] = set()
144
+ in_flight: list = []
145
+ for event in session_events:
146
+ session_id = event.aggregate_id
147
+ if session_id in seen:
148
+ continue
149
+ seen.add(session_id)
150
+ result = await repo.reconstruct_session(session_id)
151
+ if result.is_err:
152
+ continue
153
+ tracker = result.value
154
+ if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
155
+ in_flight.append(tracker)
156
+ return in_flight
157
+
158
+
159
+ def _display_sessions(sessions: list) -> None:
160
+ """Render in-flight sessions in a numbered table."""
161
+ table = create_table("In-Flight Sessions")
162
+ table.add_column("#", style="bold", no_wrap=True, justify="right")
163
+ table.add_column("Session ID", style="cyan", no_wrap=True)
164
+ table.add_column("Execution ID", style="dim")
165
+ table.add_column("Seed ID", style="dim")
166
+ table.add_column("Status", justify="center")
167
+ table.add_column("Started", style="dim")
168
+
169
+ for idx, tracker in enumerate(sessions, 1):
170
+ status = tracker.status.value
171
+ status_style = "success" if status == "running" else "warning"
172
+ table.add_row(
173
+ str(idx),
174
+ tracker.session_id,
175
+ tracker.execution_id or "-",
176
+ tracker.seed_id or "-",
177
+ f"[{status_style}]{status}[/]",
178
+ tracker.start_time.isoformat(),
179
+ )
180
+
181
+ print_table(table)
182
+
183
+
184
+ def _format_reattach_guidance(tracker) -> str:
185
+ """Build the post-selection guidance block.
186
+
187
+ Prints two commands, matching the real CLI contracts:
188
+
189
+ - Inspect: ``ouroboros tui monitor`` (functional TUI; select the session)
190
+ - Resume: ``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``
191
+
192
+ ``run workflow --resume`` takes a *session_id* (not an execution_id) and
193
+ also requires the seed file, so both identifiers are surfaced explicitly.
194
+
195
+ Note: ``ouroboros status execution <exec_id>`` is *registered* but its
196
+ implementation is still a placeholder (see src/ouroboros/cli/commands/status.py),
197
+ so we deliberately do not surface it as an inspection path — it would
198
+ print misleading "Would show details" output.
199
+ """
200
+ exec_id = tracker.execution_id or "<unknown>"
201
+ seed_hint = tracker.seed_id or "<seed.yaml>"
202
+
203
+ inspect_line = "ouroboros tui monitor"
204
+ resume_line = f"ouroboros run workflow --orchestrator --resume {tracker.session_id} {seed_hint}"
205
+
206
+ lines = [
207
+ f"Session ID: [bold cyan]{tracker.session_id}[/]",
208
+ f"Execution ID: [bold cyan]{exec_id}[/]",
209
+ "",
210
+ "[bold]Inspect[/] (read-only interactive monitor):",
211
+ f" {inspect_line}",
212
+ "",
213
+ "[bold]Resume execution[/] (requires the original seed file):",
214
+ f" {resume_line}",
215
+ ]
216
+ if not tracker.seed_id:
217
+ lines.append(
218
+ "[dim]Seed ID was not recorded for this session — replace "
219
+ "<seed.yaml> with the original seed path.[/]"
220
+ )
221
+ return "\n".join(lines)
222
+
223
+
224
+ async def _interactive_resume(show_all: bool = False) -> int:
225
+ """List in-flight sessions and prompt the user to pick one to re-attach.
226
+
227
+ Returns the integer exit code the CLI should emit so callers can pin
228
+ distinct codes for missing DB vs. corrupted DB vs. happy path.
229
+ """
230
+ limit = None if show_all else DEFAULT_DISPLAY_LIMIT
231
+
232
+ try:
233
+ event_store = await _get_event_store()
234
+ except Exception as exc: # noqa: BLE001 — surface any open error verbatim
235
+ print_error(f"Failed to open EventStore: {exc}")
236
+ return EXIT_CORRUPTED_DB
237
+
238
+ if event_store is None:
239
+ print_info("No in-flight sessions found.", "Resume")
240
+ console.print(
241
+ "[dim]EventStore does not exist yet. "
242
+ "Sessions appear here after the MCP server has started at least one run.[/]"
243
+ )
244
+ return 0
245
+
246
+ try:
247
+ try:
248
+ sessions = await _get_in_flight_sessions(event_store, limit=limit)
249
+ except Exception as exc: # noqa: BLE001
250
+ print_error(f"Failed to read EventStore: {exc}")
251
+ return EXIT_CORRUPTED_DB
252
+ finally:
253
+ await event_store.close()
254
+
255
+ if not sessions:
256
+ print_info("No in-flight sessions found.", "Resume")
257
+ console.print(
258
+ "[dim]Sessions appear here when the MCP server was disconnected mid-execution.[/]"
259
+ )
260
+ return 0
261
+
262
+ _display_sessions(sessions)
263
+ console.print()
264
+
265
+ choice = typer.prompt(
266
+ f"Enter number to re-attach (1-{len(sessions)}), or 'q' to quit",
267
+ default="q",
268
+ )
269
+
270
+ if choice.strip().lower() == "q":
271
+ print_info("No session selected.", "Resume")
272
+ return 0
273
+
274
+ try:
275
+ index = int(choice) - 1
276
+ except ValueError:
277
+ print_error(f"Invalid selection: {choice!r}")
278
+ return 1
279
+
280
+ if index < 0 or index >= len(sessions):
281
+ print_error(f"Selection out of range: {choice}. Expected 1-{len(sessions)}.")
282
+ return 1
283
+
284
+ selected = sessions[index]
285
+ print_success(_format_reattach_guidance(selected), "Re-attach")
286
+ return 0
287
+
288
+
289
+ @app.callback(invoke_without_command=True)
290
+ def resume(
291
+ ctx: typer.Context,
292
+ show_all: Annotated[
293
+ bool,
294
+ typer.Option(
295
+ "--all",
296
+ "-a",
297
+ help=(
298
+ f"Show every in-flight session instead of the most recent {DEFAULT_DISPLAY_LIMIT}."
299
+ ),
300
+ ),
301
+ ] = False,
302
+ ) -> None:
303
+ """List in-flight sessions and get re-attach instructions.
304
+
305
+ Reads the EventStore directly — no MCP server required. Use this command
306
+ after an unexpected MCP disconnect to recover the session/execution IDs
307
+ and re-attach.
308
+
309
+ Re-attach paths surfaced after selection:
310
+
311
+ # Inspect (interactive monitor — the `status execution` placeholder is
312
+ # not wired up yet)
313
+ ouroboros tui monitor
314
+
315
+ # Resume execution (requires the original seed file)
316
+ ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
317
+
318
+ Examples:
319
+
320
+ # Interactive: list in-flight sessions and pick one
321
+ ouroboros resume
322
+
323
+ # Show every stale active session, not just the 20 most recent
324
+ ouroboros resume --all
325
+ """
326
+ if ctx.invoked_subcommand is not None:
327
+ return
328
+ exit_code = asyncio.run(_interactive_resume(show_all=show_all))
329
+ if exit_code != 0:
330
+ raise typer.Exit(exit_code)
331
+
332
+
333
+ __all__ = ["app"]
@@ -21,6 +21,7 @@ from ouroboros.cli.commands import (
21
21
  init,
22
22
  mcp,
23
23
  pm,
24
+ resume,
24
25
  run,
25
26
  setup,
26
27
  status,
@@ -48,6 +49,7 @@ app.add_typer(setup.app, name="setup")
48
49
  app.add_typer(detect.app, name="detect")
49
50
  app.add_typer(tui.app, name="tui")
50
51
  app.add_typer(pm.app, name="pm")
52
+ app.add_typer(resume.app, name="resume")
51
53
  app.add_typer(uninstall.app, name="uninstall")
52
54
 
53
55
 
@@ -1252,6 +1252,21 @@ class LateralThinkHandler:
1252
1252
  "all",
1253
1253
  ),
1254
1254
  ),
1255
+ MCPToolParameter(
1256
+ name="stagnation_pattern",
1257
+ type=ToolInputType.STRING,
1258
+ description=(
1259
+ "Detected stagnation pattern used to suggest a persona when "
1260
+ "persona is omitted."
1261
+ ),
1262
+ required=False,
1263
+ enum=(
1264
+ "spinning",
1265
+ "oscillation",
1266
+ "no_drift",
1267
+ "diminishing_returns",
1268
+ ),
1269
+ ),
1255
1270
  MCPToolParameter(
1256
1271
  name="personas",
1257
1272
  type=ToolInputType.ARRAY,
@@ -1292,6 +1307,7 @@ class LateralThinkHandler:
1292
1307
  Result containing lateral thinking prompt(s) or error.
1293
1308
  """
1294
1309
  from ouroboros.resilience.lateral import LateralThinker, ThinkingPersona
1310
+ from ouroboros.resilience.stagnation import StagnationPattern
1295
1311
 
1296
1312
  problem_context = arguments.get("problem_context")
1297
1313
  if not problem_context:
@@ -1316,7 +1332,18 @@ class LateralThinkHandler:
1316
1332
 
1317
1333
  # --- Parallel multi-persona dispatch path ---
1318
1334
  explicit_list = arguments.get("personas")
1319
- persona_arg = arguments.get("persona", "contrarian")
1335
+ raw_persona_arg = arguments.get("persona")
1336
+ if explicit_list or raw_persona_arg is None:
1337
+ persona_arg = ""
1338
+ else:
1339
+ persona_arg = str(raw_persona_arg).strip()
1340
+ if not persona_arg:
1341
+ return Result.err(
1342
+ MCPToolError(
1343
+ "persona cannot be blank",
1344
+ tool_name="ouroboros_lateral_think",
1345
+ )
1346
+ )
1320
1347
  dispatch_all = persona_arg == "all"
1321
1348
 
1322
1349
  if explicit_list or dispatch_all:
@@ -1435,6 +1462,43 @@ class LateralThinkHandler:
1435
1462
  )
1436
1463
 
1437
1464
  # --- Single-persona path ---
1465
+ if not persona_arg:
1466
+ stagnation_pattern_arg = arguments.get("stagnation_pattern")
1467
+ if stagnation_pattern_arg:
1468
+ try:
1469
+ stagnation_pattern = StagnationPattern(str(stagnation_pattern_arg))
1470
+ except ValueError:
1471
+ return Result.err(
1472
+ MCPToolError(
1473
+ (
1474
+ f"Invalid stagnation_pattern: {stagnation_pattern_arg}. "
1475
+ "Must be one of: spinning, oscillation, no_drift, "
1476
+ "diminishing_returns"
1477
+ ),
1478
+ tool_name="ouroboros_lateral_think",
1479
+ )
1480
+ )
1481
+
1482
+ from ouroboros.resilience.recovery import suggest_lateral_persona_for_pattern
1483
+
1484
+ suggested = suggest_lateral_persona_for_pattern(
1485
+ stagnation_pattern,
1486
+ failed_attempts=failed_attempts,
1487
+ )
1488
+ if suggested is None:
1489
+ return Result.err(
1490
+ MCPToolError(
1491
+ (
1492
+ "No available lateral thinking persona remains after "
1493
+ "applying failed_attempts exclusions"
1494
+ ),
1495
+ tool_name="ouroboros_lateral_think",
1496
+ )
1497
+ )
1498
+ persona_arg = suggested.value
1499
+ else:
1500
+ persona_arg = ThinkingPersona.CONTRARIAN.value
1501
+
1438
1502
  try:
1439
1503
  persona = ThinkingPersona(persona_arg)
1440
1504
  except ValueError: