ouroboros-ai 0.2.1__tar.gz → 0.2.2__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.
Files changed (202) hide show
  1. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/pyproject.toml +1 -1
  3. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/bigbang/ambiguity.py +21 -14
  4. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/bigbang/test_ambiguity.py +1 -1
  5. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/.gitignore +0 -0
  6. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/.pre-commit-config.yaml +0 -0
  7. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/.python-version +0 -0
  8. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/CHANGELOG.md +0 -0
  9. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/LICENSE +0 -0
  10. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/PR-43-CODE-REVIEW-REPORT.md +0 -0
  11. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/README.md +0 -0
  12. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/github-issue-mapping.yaml +0 -0
  13. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/sprint-status.yaml +0 -0
  14. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-1-project-initialization-with-uv.md +0 -0
  15. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-2-core-types-and-error-handling.md +0 -0
  16. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-3-event-store-with-sqlalchemy-core.md +0 -0
  17. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-4-configuration-and-credentials-management.md +0 -0
  18. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-5-llm-provider-adapter-with-litellm.md +0 -0
  19. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-6-cli-skeleton-with-typer-and-rich.md +0 -0
  20. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-7-structured-logging-with-structlog.md +0 -0
  21. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-8-checkpoint-and-recovery-system.md +0 -0
  22. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/0-9-context-compression-engine.md +0 -0
  23. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/1-1-interview-protocol-engine.md +0 -0
  24. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/1-2-ambiguity-score-calculation.md +0 -0
  25. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/1-3-immutable-seed-generation.md +0 -0
  26. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/2-1-three-tier-model-configuration.md +0 -0
  27. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/2-2-complexity-based-routing.md +0 -0
  28. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/2-3-escalation-on-failure.md +0 -0
  29. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/2-4-downgrade-on-success.md +0 -0
  30. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/3-1-double-diamond-cycle-implementation.md +0 -0
  31. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/3-2-hierarchical-ac-decomposition.md +0 -0
  32. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/3-3-atomicity-detection.md +0 -0
  33. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/3-4-subagent-isolation.md +0 -0
  34. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/4-1-stagnation-detection-4-patterns.md +0 -0
  35. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/4-2-lateral-thinking-personas.md +0 -0
  36. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/4-3-persona-rotation-strategy.md +0 -0
  37. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/5-1-stage-1-mechanical-verification.md +0 -0
  38. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/5-2-stage-2-semantic-evaluation.md +0 -0
  39. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/5-3-stage-3-multi-model-consensus.md +0 -0
  40. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/5-4-consensus-trigger-matrix.md +0 -0
  41. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/6-1-drift-measurement-engine.md +0 -0
  42. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/6-2-automatic-retrospective.md +0 -0
  43. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/7-1-todo-registry.md +0 -0
  44. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/implementation-artifacts/stories/7-2-secondary-loop-batch-processing.md +0 -0
  45. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/planning-artifacts/architecture.md +0 -0
  46. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/planning-artifacts/bmm-workflow-status.yaml +0 -0
  47. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/planning-artifacts/epics.md +0 -0
  48. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/_bmad-output/update-stories.sh +0 -0
  49. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/docs/running-with-claude-code.md +0 -0
  50. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/project-context.md +0 -0
  51. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/requirement/1_EXECUTIVE_SUMMARY.md +0 -0
  52. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/requirement/2_FULL_SPECIFICATION.md +0 -0
  53. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/requirement/3_CONFIG_TEMPLATE.yaml +0 -0
  54. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/requirement/4_REDDIT_EXAMPLE.md +0 -0
  55. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/__init__.py +0 -0
  56. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/__main__.py +0 -0
  57. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/bigbang/__init__.py +0 -0
  58. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/bigbang/interview.py +0 -0
  59. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/bigbang/seed_generator.py +0 -0
  60. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/__init__.py +0 -0
  61. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/commands/__init__.py +0 -0
  62. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/commands/config.py +0 -0
  63. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/commands/init.py +0 -0
  64. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/commands/run.py +0 -0
  65. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/commands/status.py +0 -0
  66. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/formatters/__init__.py +0 -0
  67. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/formatters/panels.py +0 -0
  68. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/formatters/progress.py +0 -0
  69. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/formatters/tables.py +0 -0
  70. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/cli/main.py +0 -0
  71. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/config/__init__.py +0 -0
  72. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/config/loader.py +0 -0
  73. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/config/models.py +0 -0
  74. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/__init__.py +0 -0
  75. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/ac_tree.py +0 -0
  76. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/context.py +0 -0
  77. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/errors.py +0 -0
  78. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/security.py +0 -0
  79. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/seed.py +0 -0
  80. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/core/types.py +0 -0
  81. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/__init__.py +0 -0
  82. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/consensus.py +0 -0
  83. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/mechanical.py +0 -0
  84. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/models.py +0 -0
  85. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/pipeline.py +0 -0
  86. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/semantic.py +0 -0
  87. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/evaluation/trigger.py +0 -0
  88. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/events/__init__.py +0 -0
  89. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/events/base.py +0 -0
  90. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/events/decomposition.py +0 -0
  91. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/events/evaluation.py +0 -0
  92. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/execution/__init__.py +0 -0
  93. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/execution/atomicity.py +0 -0
  94. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/execution/decomposition.py +0 -0
  95. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/execution/double_diamond.py +0 -0
  96. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/execution/subagent.py +0 -0
  97. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/observability/__init__.py +0 -0
  98. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/observability/drift.py +0 -0
  99. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/observability/logging.py +0 -0
  100. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/observability/retrospective.py +0 -0
  101. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/orchestrator/__init__.py +0 -0
  102. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/orchestrator/adapter.py +0 -0
  103. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/orchestrator/events.py +0 -0
  104. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/orchestrator/runner.py +0 -0
  105. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/orchestrator/session.py +0 -0
  106. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/__init__.py +0 -0
  107. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/checkpoint.py +0 -0
  108. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/event_store.py +0 -0
  109. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  110. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/migrations/runner.py +0 -0
  111. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  112. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/schema.py +0 -0
  113. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/persistence/uow.py +0 -0
  114. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/providers/__init__.py +0 -0
  115. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/providers/base.py +0 -0
  116. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  117. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/providers/litellm_adapter.py +0 -0
  118. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/py.typed +0 -0
  119. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/resilience/__init__.py +0 -0
  120. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/resilience/lateral.py +0 -0
  121. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/resilience/stagnation.py +0 -0
  122. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/__init__.py +0 -0
  123. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/complexity.py +0 -0
  124. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/downgrade.py +0 -0
  125. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/escalation.py +0 -0
  126. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/router.py +0 -0
  127. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/routing/tiers.py +0 -0
  128. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/secondary/__init__.py +0 -0
  129. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/secondary/scheduler.py +0 -0
  130. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/src/ouroboros/secondary/todo_registry.py +0 -0
  131. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/conftest.py +0 -0
  132. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/integration/test_entry_point.py +0 -0
  133. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/bigbang/__init__.py +0 -0
  134. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/bigbang/test_interview.py +0 -0
  135. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/bigbang/test_seed_generator.py +0 -0
  136. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/__init__.py +0 -0
  137. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/formatters/__init__.py +0 -0
  138. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/formatters/test_console.py +0 -0
  139. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/formatters/test_panels.py +0 -0
  140. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/formatters/test_progress.py +0 -0
  141. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/formatters/test_tables.py +0 -0
  142. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/cli/test_main.py +0 -0
  143. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/config/__init__.py +0 -0
  144. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/config/test_loader.py +0 -0
  145. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/config/test_models.py +0 -0
  146. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/__init__.py +0 -0
  147. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_ac_tree.py +0 -0
  148. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_context.py +0 -0
  149. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_errors.py +0 -0
  150. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_security.py +0 -0
  151. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_seed.py +0 -0
  152. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/core/test_types.py +0 -0
  153. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/__init__.py +0 -0
  154. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/test_consensus.py +0 -0
  155. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/test_mechanical.py +0 -0
  156. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/test_models.py +0 -0
  157. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/test_semantic.py +0 -0
  158. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/evaluation/test_trigger.py +0 -0
  159. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/events/__init__.py +0 -0
  160. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/events/test_base.py +0 -0
  161. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/events/test_decomposition_events.py +0 -0
  162. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/execution/__init__.py +0 -0
  163. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/execution/test_atomicity.py +0 -0
  164. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/execution/test_decomposition.py +0 -0
  165. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/execution/test_double_diamond.py +0 -0
  166. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/execution/test_subagent_isolation.py +0 -0
  167. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/observability/__init__.py +0 -0
  168. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/observability/test_drift.py +0 -0
  169. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/observability/test_logging.py +0 -0
  170. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/observability/test_retrospective.py +0 -0
  171. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/orchestrator/__init__.py +0 -0
  172. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/orchestrator/test_adapter.py +0 -0
  173. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/orchestrator/test_events.py +0 -0
  174. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/orchestrator/test_runner.py +0 -0
  175. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/orchestrator/test_session.py +0 -0
  176. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/persistence/__init__.py +0 -0
  177. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/persistence/test_checkpoint.py +0 -0
  178. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/persistence/test_event_store.py +0 -0
  179. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/persistence/test_schema.py +0 -0
  180. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/persistence/test_uow.py +0 -0
  181. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/providers/__init__.py +0 -0
  182. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/providers/test_base.py +0 -0
  183. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/providers/test_litellm_adapter.py +0 -0
  184. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/resilience/__init__.py +0 -0
  185. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/resilience/test_lateral.py +0 -0
  186. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/resilience/test_stagnation.py +0 -0
  187. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/__init__.py +0 -0
  188. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/test_complexity.py +0 -0
  189. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/test_downgrade.py +0 -0
  190. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/test_escalation.py +0 -0
  191. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/test_router.py +0 -0
  192. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/routing/test_tiers.py +0 -0
  193. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/secondary/__init__.py +0 -0
  194. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/secondary/test_scheduler.py +0 -0
  195. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/secondary/test_todo_registry.py +0 -0
  196. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/test_dependencies_configured.py +0 -0
  197. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/test_main_entry_point.py +0 -0
  198. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/test_module_structure.py +0 -0
  199. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/test_project_initialization.py +0 -0
  200. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tests/unit/test_tooling_configuration.py +0 -0
  201. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/tools/sync_github_project.py +0 -0
  202. {ouroboros_ai-0.2.1 → ouroboros_ai-0.2.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Self-Improving AI Workflow System
5
5
  Author-email: Q00 <jqyu.lee@gmail.com>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ouroboros-ai"
3
- version = "0.2.1"
3
+ version = "0.2.2"
4
4
  description = "Self-Improving AI Workflow System"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -110,15 +110,15 @@ class AmbiguityScorer:
110
110
  from interview conversation, producing reproducible scores.
111
111
 
112
112
  Uses adaptive token allocation: starts with `initial_max_tokens` and
113
- doubles on truncation up to `MAX_TOKEN_LIMIT`. Retries up to `max_retries`
114
- times on both provider errors and parse failures.
113
+ doubles on truncation up to `MAX_TOKEN_LIMIT`. Retries until success
114
+ by default (unlimited), or up to `max_retries` if specified.
115
115
 
116
116
  Attributes:
117
117
  llm_adapter: The LLM adapter for completions.
118
118
  model: Model identifier to use.
119
119
  temperature: Temperature for reproducibility (default 0.1).
120
120
  initial_max_tokens: Starting token limit (default 2048).
121
- max_retries: Maximum retry attempts (default 3).
121
+ max_retries: Maximum retry attempts, or None for unlimited (default).
122
122
 
123
123
  Example:
124
124
  scorer = AmbiguityScorer(llm_adapter=LiteLLMAdapter())
@@ -138,7 +138,7 @@ class AmbiguityScorer:
138
138
  model: str = DEFAULT_MODEL
139
139
  temperature: float = SCORING_TEMPERATURE
140
140
  initial_max_tokens: int = 2048
141
- max_retries: int = 3
141
+ max_retries: int | None = None # None = unlimited retries
142
142
 
143
143
  async def score(
144
144
  self, state: InterviewState
@@ -180,8 +180,15 @@ class AmbiguityScorer:
180
180
  current_max_tokens = self.initial_max_tokens
181
181
  last_error: Exception | ProviderError | None = None
182
182
  last_response: str = ""
183
+ attempt = 0
184
+
185
+ while True:
186
+ # Check retry limit if set
187
+ if self.max_retries is not None and attempt >= self.max_retries:
188
+ break
189
+
190
+ attempt += 1
183
191
 
184
- for attempt in range(self.max_retries):
185
192
  config = CompletionConfig(
186
193
  model=self.model,
187
194
  temperature=self.temperature,
@@ -190,15 +197,15 @@ class AmbiguityScorer:
190
197
 
191
198
  result = await self.llm_adapter.complete(messages, config)
192
199
 
193
- # Fix #3: Retry on provider errors (rate limits, transient failures)
200
+ # Retry on provider errors (rate limits, transient failures)
194
201
  if result.is_err:
195
202
  last_error = result.error
196
203
  log.warning(
197
204
  "ambiguity.scoring.provider_error_retrying",
198
205
  interview_id=state.interview_id,
199
206
  error=str(result.error),
200
- attempt=attempt + 1,
201
- max_retries=self.max_retries,
207
+ attempt=attempt,
208
+ max_retries=self.max_retries or "unlimited",
202
209
  )
203
210
  continue
204
211
 
@@ -221,7 +228,7 @@ class AmbiguityScorer:
221
228
  constraint_clarity=breakdown.constraint_clarity.clarity_score,
222
229
  success_criteria_clarity=breakdown.success_criteria_clarity.clarity_score,
223
230
  tokens_used=current_max_tokens,
224
- attempt=attempt + 1,
231
+ attempt=attempt,
225
232
  )
226
233
 
227
234
  return Result.ok(ambiguity_score)
@@ -230,11 +237,11 @@ class AmbiguityScorer:
230
237
  last_error = e
231
238
  last_response = result.value.content
232
239
 
233
- # Fix #2: Only increase tokens if response was truncated
240
+ # Only increase tokens if response was truncated
234
241
  is_truncated = result.value.finish_reason == "length"
235
242
 
236
243
  if is_truncated:
237
- # Double tokens on truncation (no upper limit)
244
+ # Double tokens on truncation, capped at MAX_TOKEN_LIMIT if set
238
245
  next_tokens = current_max_tokens * 2
239
246
  if MAX_TOKEN_LIMIT is not None:
240
247
  next_tokens = min(next_tokens, MAX_TOKEN_LIMIT)
@@ -242,7 +249,7 @@ class AmbiguityScorer:
242
249
  "ambiguity.scoring.truncated_retrying",
243
250
  interview_id=state.interview_id,
244
251
  error=str(e),
245
- attempt=attempt + 1,
252
+ attempt=attempt,
246
253
  current_tokens=current_max_tokens,
247
254
  next_tokens=next_tokens,
248
255
  )
@@ -253,11 +260,11 @@ class AmbiguityScorer:
253
260
  "ambiguity.scoring.format_error_retrying",
254
261
  interview_id=state.interview_id,
255
262
  error=str(e),
256
- attempt=attempt + 1,
263
+ attempt=attempt,
257
264
  finish_reason=result.value.finish_reason,
258
265
  )
259
266
 
260
- # All retries exhausted
267
+ # All retries exhausted (only reached if max_retries is set)
261
268
  log.warning(
262
269
  "ambiguity.scoring.failed",
263
270
  interview_id=state.interview_id,
@@ -302,7 +302,7 @@ class TestAmbiguityScorerInit:
302
302
  assert scorer.model == "openrouter/google/gemini-2.0-flash-001"
303
303
  assert scorer.temperature == SCORING_TEMPERATURE
304
304
  assert scorer.initial_max_tokens == 2048
305
- assert scorer.max_retries == 3
305
+ assert scorer.max_retries is None # Unlimited by default
306
306
 
307
307
  def test_scorer_custom_values(self) -> None:
308
308
  """AmbiguityScorer accepts custom values."""
File without changes
File without changes
File without changes
File without changes
File without changes