ouroboros-ai 0.25.3.dev91__tar.gz → 0.25.3.dev93__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.
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/CONTRIBUTING.md +2 -2
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/PKG-INFO +24 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/README.md +23 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/cli-reference.md +9 -5
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/guides/seed-authoring.md +15 -11
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/runtime-guides/claude-code.md +9 -9
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/ambiguity.py +28 -10
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/init.py +51 -35
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/run.py +9 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/loop.py +9 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/execution_handlers.py +12 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/__init__.py +5 -4
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/parallel_executor.py +164 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/runner.py +25 -72
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_ambiguity.py +62 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_init_runtime.py +6 -3
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_qa_integration.py +6 -1
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_runner.py +119 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_artifact_collector.py +19 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.claude/settings.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.env.example +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/.python-version +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/CLAUDE.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/HANDOFF.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/LICENSE +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/README.ko.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/SECURITY.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/cancel.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/evolve.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/help.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/interview.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/ralph.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/run.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/seed.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/setup.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/status.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/commands/welcome.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/README.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/api/README.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/api/core.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/architecture.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/demo-evaluation.png +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/demo-interview.png +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/demo-seed.png +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/demo-tui-dashboard.png +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/examples/test_display.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/llms-full.txt +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/llms.txt +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/project-context.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/pyproject.toml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/install.sh +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/uv.lock +0 -0
|
@@ -452,7 +452,7 @@ Any change to a file under `src/ouroboros/cli/commands/` requires reviewing and
|
|
|
452
452
|
|
|
453
453
|
#### `init.py` — `ouroboros init` / `ouroboros init start`
|
|
454
454
|
|
|
455
|
-
Flags covered: `--resume`, `--state-dir`, `--runtime`, `--llm-backend`, `--debug`
|
|
455
|
+
Flags covered: `--resume`, `--state-dir`, `--orchestrator`, `--runtime`, `--llm-backend`, `--debug`
|
|
456
456
|
|
|
457
457
|
**Must update:**
|
|
458
458
|
- `docs/cli-reference.md` — `init` command section (flags, examples)
|
|
@@ -461,7 +461,7 @@ Flags covered: `--resume`, `--state-dir`, `--runtime`, `--llm-backend`, `--debug
|
|
|
461
461
|
- `docs/getting-started.md` — onboarding flow
|
|
462
462
|
|
|
463
463
|
**Also check:**
|
|
464
|
-
- `docs/runtime-guides/claude-code.md` and `docs/runtime-guides/codex.md` — if `--
|
|
464
|
+
- `docs/runtime-guides/claude-code.md` and `docs/runtime-guides/codex.md` — if `--orchestrator` or `--runtime` behavior changes
|
|
465
465
|
|
|
466
466
|
#### `run.py` — `ouroboros run workflow`
|
|
467
467
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ouroboros-ai
|
|
3
|
-
Version: 0.25.3.
|
|
3
|
+
Version: 0.25.3.dev93
|
|
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
|
|
@@ -105,6 +105,11 @@ Description-Content-Type: text/markdown
|
|
|
105
105
|
|
|
106
106
|
Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
|
|
107
107
|
|
|
108
|
+
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
109
|
+
<p align="center">
|
|
110
|
+
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
111
|
+
</p>
|
|
112
|
+
|
|
108
113
|
---
|
|
109
114
|
|
|
110
115
|
## Why Ouroboros?
|
|
@@ -170,6 +175,24 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
170
175
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
171
176
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
172
177
|
|
|
178
|
+
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
179
|
+
<p align="center">
|
|
180
|
+
<strong>Interview Transcript</strong><br/>
|
|
181
|
+
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
182
|
+
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
183
|
+
</p>
|
|
184
|
+
|
|
185
|
+
<p align="center">
|
|
186
|
+
<strong>Seed Artifact</strong><br/>
|
|
187
|
+
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
188
|
+
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
189
|
+
</p>
|
|
190
|
+
|
|
191
|
+
<p align="center">
|
|
192
|
+
<strong>Evaluation Verdict</strong><br/>
|
|
193
|
+
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
194
|
+
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
195
|
+
</p>
|
|
173
196
|
|
|
174
197
|
<details>
|
|
175
198
|
<summary><strong>What just happened?</strong></summary>
|
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
|
|
66
66
|
Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
|
|
67
67
|
|
|
68
|
+
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
69
|
+
<p align="center">
|
|
70
|
+
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
71
|
+
</p>
|
|
72
|
+
|
|
68
73
|
---
|
|
69
74
|
|
|
70
75
|
## Why Ouroboros?
|
|
@@ -130,6 +135,24 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
130
135
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
131
136
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
132
137
|
|
|
138
|
+
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
139
|
+
<p align="center">
|
|
140
|
+
<strong>Interview Transcript</strong><br/>
|
|
141
|
+
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
142
|
+
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
143
|
+
</p>
|
|
144
|
+
|
|
145
|
+
<p align="center">
|
|
146
|
+
<strong>Seed Artifact</strong><br/>
|
|
147
|
+
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
148
|
+
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
149
|
+
</p>
|
|
150
|
+
|
|
151
|
+
<p align="center">
|
|
152
|
+
<strong>Evaluation Verdict</strong><br/>
|
|
153
|
+
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
154
|
+
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
155
|
+
</p>
|
|
133
156
|
|
|
134
157
|
<details>
|
|
135
158
|
<summary><strong>What just happened?</strong></summary>
|
|
@@ -130,8 +130,9 @@ ouroboros init [start] [OPTIONS] [CONTEXT]
|
|
|
130
130
|
|--------|-------------|
|
|
131
131
|
| `-r, --resume TEXT` | Resume an existing interview by ID |
|
|
132
132
|
| `--state-dir DIRECTORY` | Custom directory for interview state files |
|
|
133
|
-
|
|
|
134
|
-
| `--
|
|
133
|
+
| `-o, --orchestrator` | Use Claude Code for the interview/seed flow; combine with `--runtime` to choose the workflow handoff backend |
|
|
134
|
+
| `--runtime TEXT` | Agent runtime backend for the workflow execution step after seed generation. Shipped values: `claude`, `codex`. `opencode` appears in the CLI enum but is out of scope. Custom adapters registered in `runtime_factory.py` are also accepted. |
|
|
135
|
+
| `--llm-backend TEXT` | LLM backend for interview, ambiguity scoring, and seed generation (`claude_code`, `litellm`, `codex`). `opencode` appears in the CLI enum but is out of scope |
|
|
135
136
|
| `-d, --debug` | Show verbose logs including debug messages |
|
|
136
137
|
|
|
137
138
|
**Examples:**
|
|
@@ -143,10 +144,13 @@ ouroboros init "I want to build a task management CLI tool"
|
|
|
143
144
|
# Explicit subcommand (equivalent)
|
|
144
145
|
ouroboros init start "I want to build a task management CLI tool"
|
|
145
146
|
|
|
147
|
+
# Start with Claude Code (no API key needed)
|
|
148
|
+
ouroboros init --orchestrator "Build a REST API"
|
|
149
|
+
|
|
146
150
|
# Specify runtime backend for the workflow step
|
|
147
|
-
ouroboros init --runtime codex "Build a REST API"
|
|
151
|
+
ouroboros init --orchestrator --runtime codex "Build a REST API"
|
|
148
152
|
|
|
149
|
-
#
|
|
153
|
+
# Use Codex as the LLM backend for interview and seed generation
|
|
150
154
|
ouroboros init --llm-backend codex "Build a REST API"
|
|
151
155
|
|
|
152
156
|
# Resume an interrupted interview
|
|
@@ -199,7 +203,7 @@ ouroboros run [workflow] [OPTIONS] SEED_FILE
|
|
|
199
203
|
|
|
200
204
|
| Option | Description |
|
|
201
205
|
|--------|-------------|
|
|
202
|
-
| `-o/-O, --orchestrator/--no-orchestrator` |
|
|
206
|
+
| `-o/-O, --orchestrator/--no-orchestrator` | Use the agent-runtime orchestrator for execution (default: enabled) |
|
|
203
207
|
| `--runtime TEXT` | Agent runtime backend override (`claude`, `codex`). Uses configured default if omitted. (`opencode` is in the CLI enum but out of scope) |
|
|
204
208
|
| `-r, --resume TEXT` | Resume a previous orchestrator session by ID |
|
|
205
209
|
| `--mcp-config PATH` | Path to MCP client configuration YAML file |
|
|
@@ -335,7 +335,7 @@ acceptance_criteria:
|
|
|
335
335
|
|
|
336
336
|
## Validation
|
|
337
337
|
|
|
338
|
-
> **Note — `--dry-run` is not functional in the current implementation.** In the default orchestrator mode, the `--dry-run` flag is silently ignored and execution proceeds normally. In
|
|
338
|
+
> **Note — `--dry-run` is not functional in the current implementation.** In the default orchestrator mode (`--orchestrator` is `True` by default), the `--dry-run` flag is silently ignored and execution proceeds normally. In non-orchestrator mode (`--no-orchestrator`), `--dry-run` prints a placeholder message without performing any YAML or schema checks. This limitation is tracked for a future release.
|
|
339
339
|
|
|
340
340
|
**Current approach to pre-run validation:** Run the workflow normally. Schema validation errors surface *before* any agent sessions start, so an invalid seed will print an error and exit without executing:
|
|
341
341
|
|
|
@@ -394,10 +394,10 @@ export ANTHROPIC_API_KEY="sk-ant-..."
|
|
|
394
394
|
# or
|
|
395
395
|
export OPENAI_API_KEY="sk-..."
|
|
396
396
|
|
|
397
|
-
# To avoid needing an API key, use Claude Code
|
|
397
|
+
# To avoid needing an API key, use Claude Code (Max Plan):
|
|
398
398
|
ooo interview "Build a REST API"
|
|
399
399
|
# or standalone:
|
|
400
|
-
ouroboros init start "Build a REST API"
|
|
400
|
+
ouroboros init start --orchestrator "Build a REST API"
|
|
401
401
|
```
|
|
402
402
|
|
|
403
403
|
#### LLM rate-limit or transient API error during questioning
|
|
@@ -708,18 +708,22 @@ ouroboros run minimal_seed.yaml
|
|
|
708
708
|
|
|
709
709
|
---
|
|
710
710
|
|
|
711
|
-
### CLI Flag
|
|
711
|
+
### CLI Flag Warnings
|
|
712
712
|
|
|
713
|
-
#### `--orchestrator` (init command)
|
|
713
|
+
#### `--runtime` without `--orchestrator` (init command)
|
|
714
714
|
|
|
715
|
-
|
|
715
|
+
**Symptom:**
|
|
716
|
+
```
|
|
717
|
+
Warning: --runtime only affects the workflow execution step when --orchestrator is enabled.
|
|
718
|
+
```
|
|
716
719
|
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
+
**Cause:** `--runtime` (e.g., `--runtime codex`) was passed to `ouroboros init` without `--orchestrator`. The `--runtime` flag only controls which agent runtime backend is used when the generated seed is immediately handed off to workflow execution. Without `--orchestrator`, the workflow handoff step uses a placeholder.
|
|
721
|
+
|
|
722
|
+
**Behavior:** This is a **warning only** — the interview and seed generation proceed normally. The runtime flag has no effect.
|
|
720
723
|
|
|
721
|
-
|
|
722
|
-
|
|
724
|
+
**Fix:** Add `--orchestrator` if you want to use the specified runtime backend for the post-generation workflow step:
|
|
725
|
+
```bash
|
|
726
|
+
ouroboros init start --orchestrator --runtime codex "Build a REST API"
|
|
723
727
|
```
|
|
724
728
|
|
|
725
729
|
---
|
|
@@ -32,7 +32,7 @@ orchestrator:
|
|
|
32
32
|
runtime_backend: claude
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
When
|
|
35
|
+
When using the `--orchestrator` CLI flag, Claude Code is the default runtime backend.
|
|
36
36
|
|
|
37
37
|
## How It Works
|
|
38
38
|
|
|
@@ -72,8 +72,8 @@ All commands in this section run in your **regular terminal** (shell), not insid
|
|
|
72
72
|
|
|
73
73
|
**Terminal:**
|
|
74
74
|
```bash
|
|
75
|
-
# Start interactive interview
|
|
76
|
-
uv run ouroboros init start "Your idea here"
|
|
75
|
+
# Start interactive interview (Claude Code runtime)
|
|
76
|
+
uv run ouroboros init start --orchestrator "Your idea here"
|
|
77
77
|
|
|
78
78
|
# Resume an interrupted interview
|
|
79
79
|
uv run ouroboros init start --resume interview_20260127_120000
|
|
@@ -86,24 +86,24 @@ uv run ouroboros init list
|
|
|
86
86
|
|
|
87
87
|
**Terminal:**
|
|
88
88
|
```bash
|
|
89
|
-
# Execute workflow
|
|
90
|
-
uv run ouroboros run workflow seed.yaml
|
|
89
|
+
# Execute workflow (Claude Code runtime)
|
|
90
|
+
uv run ouroboros run workflow --orchestrator seed.yaml
|
|
91
91
|
|
|
92
92
|
# Dry run (validate seed without executing)
|
|
93
93
|
uv run ouroboros run workflow --dry-run seed.yaml
|
|
94
94
|
|
|
95
95
|
# Debug output (show logs and agent thinking)
|
|
96
|
-
uv run ouroboros run workflow --debug seed.yaml
|
|
96
|
+
uv run ouroboros run workflow --orchestrator --debug seed.yaml
|
|
97
97
|
|
|
98
98
|
# Resume a previous session
|
|
99
|
-
uv run ouroboros run workflow --resume <session_id> seed.yaml
|
|
99
|
+
uv run ouroboros run workflow --orchestrator --resume <session_id> seed.yaml
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
## Troubleshooting
|
|
103
103
|
|
|
104
104
|
### "Providers: warning" in health check
|
|
105
105
|
|
|
106
|
-
This is normal when not using LiteLLM providers. The orchestrator mode uses
|
|
106
|
+
This is normal when not using LiteLLM providers. The orchestrator mode uses Claude Code directly.
|
|
107
107
|
|
|
108
108
|
### Session fails with empty error
|
|
109
109
|
|
|
@@ -112,7 +112,7 @@ Ensure you're running from the project directory:
|
|
|
112
112
|
**Terminal:**
|
|
113
113
|
```bash
|
|
114
114
|
cd /path/to/ouroboros
|
|
115
|
-
uv run ouroboros run workflow seed.yaml
|
|
115
|
+
uv run ouroboros run workflow --orchestrator seed.yaml
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
### "EventStore not initialized"
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.25.3.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 25, 3, '
|
|
31
|
+
__version__ = version = '0.25.3.dev93'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 25, 3, 'dev93')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -448,17 +448,14 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
448
448
|
except json.JSONDecodeError as e:
|
|
449
449
|
raise ValueError(f"Invalid JSON response: {e}") from e
|
|
450
450
|
|
|
451
|
-
#
|
|
452
|
-
|
|
451
|
+
# Numeric score fields must be present. Missing justifications are recoverable.
|
|
452
|
+
required_score_fields = [
|
|
453
453
|
"goal_clarity_score",
|
|
454
|
-
"goal_clarity_justification",
|
|
455
454
|
"constraint_clarity_score",
|
|
456
|
-
"constraint_clarity_justification",
|
|
457
455
|
"success_criteria_clarity_score",
|
|
458
|
-
"success_criteria_clarity_justification",
|
|
459
456
|
]
|
|
460
457
|
|
|
461
|
-
for field_name in
|
|
458
|
+
for field_name in required_score_fields:
|
|
462
459
|
if field_name not in data:
|
|
463
460
|
raise ValueError(f"Missing required field: {field_name}")
|
|
464
461
|
|
|
@@ -467,6 +464,15 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
467
464
|
score = float(value)
|
|
468
465
|
return max(0.0, min(1.0, score))
|
|
469
466
|
|
|
467
|
+
def justification_for(field_name: str, component_name: str) -> str:
|
|
468
|
+
value = data.get(field_name)
|
|
469
|
+
if value is None:
|
|
470
|
+
return f"{component_name} justification not provided by model."
|
|
471
|
+
text = str(value).strip()
|
|
472
|
+
if not text:
|
|
473
|
+
return f"{component_name} justification not provided by model."
|
|
474
|
+
return text
|
|
475
|
+
|
|
470
476
|
# Select weights based on project type
|
|
471
477
|
if is_brownfield:
|
|
472
478
|
goal_weight = BROWNFIELD_GOAL_CLARITY_WEIGHT
|
|
@@ -484,7 +490,10 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
484
490
|
name="Context Clarity",
|
|
485
491
|
clarity_score=clamp_score(data["context_clarity_score"]),
|
|
486
492
|
weight=BROWNFIELD_CONTEXT_CLARITY_WEIGHT,
|
|
487
|
-
justification=
|
|
493
|
+
justification=justification_for(
|
|
494
|
+
"context_clarity_justification",
|
|
495
|
+
"Context Clarity",
|
|
496
|
+
),
|
|
488
497
|
)
|
|
489
498
|
|
|
490
499
|
return ScoreBreakdown(
|
|
@@ -492,19 +501,28 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
492
501
|
name="Goal Clarity",
|
|
493
502
|
clarity_score=clamp_score(data["goal_clarity_score"]),
|
|
494
503
|
weight=goal_weight,
|
|
495
|
-
justification=
|
|
504
|
+
justification=justification_for(
|
|
505
|
+
"goal_clarity_justification",
|
|
506
|
+
"Goal Clarity",
|
|
507
|
+
),
|
|
496
508
|
),
|
|
497
509
|
constraint_clarity=ComponentScore(
|
|
498
510
|
name="Constraint Clarity",
|
|
499
511
|
clarity_score=clamp_score(data["constraint_clarity_score"]),
|
|
500
512
|
weight=constraint_weight,
|
|
501
|
-
justification=
|
|
513
|
+
justification=justification_for(
|
|
514
|
+
"constraint_clarity_justification",
|
|
515
|
+
"Constraint Clarity",
|
|
516
|
+
),
|
|
502
517
|
),
|
|
503
518
|
success_criteria_clarity=ComponentScore(
|
|
504
519
|
name="Success Criteria Clarity",
|
|
505
520
|
clarity_score=clamp_score(data["success_criteria_clarity_score"]),
|
|
506
521
|
weight=criteria_weight,
|
|
507
|
-
justification=
|
|
522
|
+
justification=justification_for(
|
|
523
|
+
"success_criteria_clarity_justification",
|
|
524
|
+
"Success Criteria Clarity",
|
|
525
|
+
),
|
|
508
526
|
),
|
|
509
527
|
context_clarity=context_clarity,
|
|
510
528
|
)
|
|
@@ -26,7 +26,7 @@ from ouroboros.bigbang.interview import (
|
|
|
26
26
|
from ouroboros.bigbang.seed_generator import SeedGenerator
|
|
27
27
|
from ouroboros.cli.formatters import console
|
|
28
28
|
from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning
|
|
29
|
-
from ouroboros.config import get_clarification_model
|
|
29
|
+
from ouroboros.config import get_clarification_model
|
|
30
30
|
from ouroboros.observability import LoggingConfig, configure_logging
|
|
31
31
|
from ouroboros.providers import create_llm_adapter
|
|
32
32
|
from ouroboros.providers.base import LLMAdapter
|
|
@@ -145,15 +145,15 @@ async def _multiline_prompt_async(prompt_text: str) -> str:
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
def _get_adapter(
|
|
148
|
+
use_orchestrator: bool,
|
|
148
149
|
backend: str | None = None,
|
|
149
150
|
for_interview: bool = False,
|
|
150
151
|
debug: bool = False,
|
|
151
152
|
) -> LLMAdapter:
|
|
152
153
|
"""Get the appropriate LLM adapter.
|
|
153
154
|
|
|
154
|
-
Resolution order: explicit backend arg > config llm.backend > "claude_code".
|
|
155
|
-
|
|
156
155
|
Args:
|
|
156
|
+
use_orchestrator: If True, default to Claude Code for compatibility.
|
|
157
157
|
backend: Optional explicit LLM backend override.
|
|
158
158
|
for_interview: If True, enable Read/Glob/Grep tools for codebase exploration.
|
|
159
159
|
debug: If True, show streaming messages (thinking, tool use).
|
|
@@ -161,7 +161,7 @@ def _get_adapter(
|
|
|
161
161
|
Returns:
|
|
162
162
|
LLM adapter instance.
|
|
163
163
|
"""
|
|
164
|
-
resolved_backend = backend or
|
|
164
|
+
resolved_backend = backend or ("claude_code" if use_orchestrator else "litellm")
|
|
165
165
|
|
|
166
166
|
if for_interview:
|
|
167
167
|
# Interview mode: request the interview-specific permission policy and
|
|
@@ -260,6 +260,7 @@ async def _run_interview(
|
|
|
260
260
|
initial_context: str,
|
|
261
261
|
resume_id: str | None = None,
|
|
262
262
|
state_dir: Path | None = None,
|
|
263
|
+
use_orchestrator: bool = False,
|
|
263
264
|
debug: bool = False,
|
|
264
265
|
workflow_runtime_backend: str | None = None,
|
|
265
266
|
llm_backend: str | None = None,
|
|
@@ -270,11 +271,13 @@ async def _run_interview(
|
|
|
270
271
|
initial_context: Initial context or idea for the interview.
|
|
271
272
|
resume_id: Optional interview ID to resume.
|
|
272
273
|
state_dir: Optional custom state directory.
|
|
274
|
+
use_orchestrator: If True, use Claude Code (Max Plan) instead of LiteLLM.
|
|
273
275
|
workflow_runtime_backend: Optional agent runtime backend for the workflow handoff.
|
|
274
276
|
llm_backend: Optional LLM backend override for interview and seed generation.
|
|
275
277
|
"""
|
|
276
278
|
# Initialize components
|
|
277
279
|
llm_adapter = _get_adapter(
|
|
280
|
+
use_orchestrator,
|
|
278
281
|
backend=llm_backend,
|
|
279
282
|
for_interview=True,
|
|
280
283
|
debug=debug,
|
|
@@ -367,6 +370,7 @@ async def _run_interview(
|
|
|
367
370
|
if should_start_workflow:
|
|
368
371
|
await _start_workflow(
|
|
369
372
|
seed_path,
|
|
373
|
+
use_orchestrator,
|
|
370
374
|
runtime_backend=workflow_runtime_backend,
|
|
371
375
|
)
|
|
372
376
|
|
|
@@ -468,32 +472,40 @@ async def _generate_seed_from_interview(
|
|
|
468
472
|
|
|
469
473
|
async def _start_workflow(
|
|
470
474
|
seed_path: Path,
|
|
475
|
+
use_orchestrator: bool = False,
|
|
471
476
|
parallel: bool = True,
|
|
472
477
|
runtime_backend: str | None = None,
|
|
473
478
|
) -> None:
|
|
474
|
-
"""Start workflow from generated seed
|
|
479
|
+
"""Start workflow from generated seed.
|
|
475
480
|
|
|
476
481
|
Args:
|
|
477
482
|
seed_path: Path to the seed YAML file.
|
|
483
|
+
use_orchestrator: Whether to use Claude Code orchestrator.
|
|
478
484
|
parallel: Execute independent ACs in parallel. Default: True.
|
|
479
485
|
runtime_backend: Optional runtime backend for orchestrator execution.
|
|
480
486
|
"""
|
|
481
487
|
console.print()
|
|
482
488
|
console.print("[bold cyan]Starting workflow...[/]")
|
|
483
489
|
|
|
484
|
-
|
|
490
|
+
if use_orchestrator:
|
|
491
|
+
# Direct function call instead of subprocess
|
|
492
|
+
from ouroboros.cli.commands.run import _run_orchestrator
|
|
485
493
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
494
|
+
try:
|
|
495
|
+
await _run_orchestrator(
|
|
496
|
+
seed_path,
|
|
497
|
+
resume_session=None,
|
|
498
|
+
parallel=parallel,
|
|
499
|
+
runtime_backend=runtime_backend,
|
|
500
|
+
)
|
|
501
|
+
except typer.Exit:
|
|
502
|
+
pass # Normal exit
|
|
503
|
+
except KeyboardInterrupt:
|
|
504
|
+
print_info("Workflow interrupted.")
|
|
505
|
+
else:
|
|
506
|
+
# Standard workflow (placeholder for now)
|
|
507
|
+
print_info(f"Would execute workflow from: {seed_path}")
|
|
508
|
+
print_info("Standard workflow execution not yet implemented.")
|
|
497
509
|
|
|
498
510
|
|
|
499
511
|
def _find_pm_seeds(seeds_dir: Path | None = None) -> list[Path]:
|
|
@@ -681,13 +693,12 @@ def start(
|
|
|
681
693
|
dir_okay=True,
|
|
682
694
|
),
|
|
683
695
|
] = None,
|
|
684
|
-
orchestrator: Annotated[
|
|
696
|
+
orchestrator: Annotated[
|
|
685
697
|
bool,
|
|
686
698
|
typer.Option(
|
|
687
699
|
"--orchestrator",
|
|
688
700
|
"-o",
|
|
689
|
-
help="
|
|
690
|
-
hidden=True,
|
|
701
|
+
help="Use Claude Code (Max Plan) instead of LiteLLM. No API key required.",
|
|
691
702
|
),
|
|
692
703
|
] = False,
|
|
693
704
|
runtime: Annotated[
|
|
@@ -726,13 +737,12 @@ def start(
|
|
|
726
737
|
This command initiates the Big Bang phase, which transforms vague ideas
|
|
727
738
|
into clear, executable requirements through iterative questioning.
|
|
728
739
|
|
|
729
|
-
The LLM backend is resolved from config (llm.backend) by default.
|
|
730
|
-
Override with --llm-backend if needed.
|
|
731
|
-
|
|
732
740
|
Example:
|
|
733
741
|
ouroboros init start "I want to build a task management CLI tool"
|
|
734
742
|
|
|
735
|
-
ouroboros init start --
|
|
743
|
+
ouroboros init start --orchestrator "Build a REST API"
|
|
744
|
+
|
|
745
|
+
ouroboros init start --orchestrator --runtime codex "Build a REST API"
|
|
736
746
|
|
|
737
747
|
ouroboros init start --llm-backend codex "Build a REST API"
|
|
738
748
|
|
|
@@ -792,16 +802,21 @@ def start(
|
|
|
792
802
|
configure_logging(LoggingConfig(log_level="DEBUG"))
|
|
793
803
|
print_info("Debug mode enabled - showing verbose logs")
|
|
794
804
|
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
+
if runtime and not orchestrator:
|
|
806
|
+
print_warning(
|
|
807
|
+
"--runtime only affects the workflow execution step when --orchestrator is enabled."
|
|
808
|
+
)
|
|
809
|
+
|
|
810
|
+
# Show mode info
|
|
811
|
+
if orchestrator:
|
|
812
|
+
print_info("Using Claude Code (Max Plan) - no API key required")
|
|
813
|
+
if runtime:
|
|
814
|
+
print_info(f"Workflow runtime backend: {runtime.value}")
|
|
815
|
+
else:
|
|
816
|
+
print_info("Using LiteLLM - API key required")
|
|
817
|
+
|
|
818
|
+
if llm_backend:
|
|
819
|
+
print_info(f"Interview LLM backend: {llm_backend.value}")
|
|
805
820
|
|
|
806
821
|
# Run interview
|
|
807
822
|
try:
|
|
@@ -810,6 +825,7 @@ def start(
|
|
|
810
825
|
context or "",
|
|
811
826
|
resume,
|
|
812
827
|
state_dir,
|
|
828
|
+
orchestrator,
|
|
813
829
|
debug,
|
|
814
830
|
runtime.value if runtime else None,
|
|
815
831
|
llm_backend.value if llm_backend else None,
|
|
@@ -838,7 +854,7 @@ def list_interviews(
|
|
|
838
854
|
] = None,
|
|
839
855
|
) -> None:
|
|
840
856
|
"""List all interview sessions."""
|
|
841
|
-
llm_adapter = create_llm_adapter(backend=
|
|
857
|
+
llm_adapter = create_llm_adapter(backend="litellm")
|
|
842
858
|
engine = InterviewEngine(
|
|
843
859
|
llm_adapter=llm_adapter,
|
|
844
860
|
state_dir=state_dir or Path.home() / ".ouroboros" / "data",
|
|
@@ -58,6 +58,14 @@ def _derive_quality_bar(seed: "Seed") -> str:
|
|
|
58
58
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
62
|
+
"""Prefer the structured verification report when present."""
|
|
63
|
+
verification_report = summary.get("verification_report")
|
|
64
|
+
if isinstance(verification_report, str) and verification_report:
|
|
65
|
+
return verification_report
|
|
66
|
+
return final_message or ""
|
|
67
|
+
|
|
68
|
+
|
|
61
69
|
def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
|
|
62
70
|
"""Load seed configuration from YAML file.
|
|
63
71
|
|
|
@@ -249,7 +257,7 @@ async def _run_orchestrator(
|
|
|
249
257
|
|
|
250
258
|
qa_result = await qa_handler.handle(
|
|
251
259
|
{
|
|
252
|
-
"artifact": res.final_message
|
|
260
|
+
"artifact": _get_verification_artifact(res.summary, res.final_message),
|
|
253
261
|
"artifact_type": "test_output",
|
|
254
262
|
"quality_bar": quality_bar,
|
|
255
263
|
"seed_content": yaml.dump(seed_data, default_flow_style=False),
|
|
@@ -889,7 +889,15 @@ class EvolutionaryLoop:
|
|
|
889
889
|
exec_result = await self.executor(current_seed, parallel=parallel)
|
|
890
890
|
if hasattr(exec_result, "is_ok") and exec_result.is_ok:
|
|
891
891
|
orch_result = exec_result.value
|
|
892
|
-
|
|
892
|
+
summary = getattr(orch_result, "summary", {})
|
|
893
|
+
verification_report = (
|
|
894
|
+
summary.get("verification_report") if isinstance(summary, dict) else None
|
|
895
|
+
)
|
|
896
|
+
execution_output = (
|
|
897
|
+
verification_report
|
|
898
|
+
if isinstance(verification_report, str) and verification_report
|
|
899
|
+
else getattr(orch_result, "final_message", str(orch_result))
|
|
900
|
+
)
|
|
893
901
|
# Log structured metadata for observability
|
|
894
902
|
logger.info(
|
|
895
903
|
"evolution.generation.executed",
|
|
@@ -409,7 +409,10 @@ class ExecuteSeedHandler:
|
|
|
409
409
|
quality_bar = self._derive_quality_bar(_seed)
|
|
410
410
|
await qa_handler.handle(
|
|
411
411
|
{
|
|
412
|
-
"artifact":
|
|
412
|
+
"artifact": self._get_verification_artifact(
|
|
413
|
+
result.value.summary,
|
|
414
|
+
result.value.final_message,
|
|
415
|
+
),
|
|
413
416
|
"artifact_type": "test_output",
|
|
414
417
|
"quality_bar": quality_bar,
|
|
415
418
|
"seed_content": _seed_content,
|
|
@@ -500,6 +503,14 @@ class ExecuteSeedHandler:
|
|
|
500
503
|
ac_lines = [f"- {ac}" for ac in seed.acceptance_criteria]
|
|
501
504
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
502
505
|
|
|
506
|
+
@staticmethod
|
|
507
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
508
|
+
"""Prefer the structured verification report when present."""
|
|
509
|
+
verification_report = summary.get("verification_report")
|
|
510
|
+
if isinstance(verification_report, str) and verification_report:
|
|
511
|
+
return verification_report
|
|
512
|
+
return final_message or ""
|
|
513
|
+
|
|
503
514
|
@staticmethod
|
|
504
515
|
def _format_execution_result(exec_result, seed: Seed) -> str:
|
|
505
516
|
"""Format execution result as human-readable text.
|
{ouroboros_ai-0.25.3.dev91 → ouroboros_ai-0.25.3.dev93}/src/ouroboros/orchestrator/__init__.py
RENAMED
|
@@ -25,10 +25,11 @@ Usage:
|
|
|
25
25
|
runner = OrchestratorRunner(adapter, event_store, mcp_manager=mcp_manager)
|
|
26
26
|
|
|
27
27
|
CLI Usage:
|
|
28
|
-
ouroboros run seed.yaml
|
|
29
|
-
ouroboros run seed.yaml --
|
|
30
|
-
ouroboros run seed.yaml --resume <session_id>
|
|
31
|
-
ouroboros run seed.yaml --
|
|
28
|
+
ouroboros run --orchestrator seed.yaml
|
|
29
|
+
ouroboros run --orchestrator seed.yaml --parallel # Parallel AC execution
|
|
30
|
+
ouroboros run --orchestrator seed.yaml --resume <session_id>
|
|
31
|
+
ouroboros run --orchestrator seed.yaml --runtime codex
|
|
32
|
+
ouroboros run --orchestrator seed.yaml --mcp-config mcp.yaml
|
|
32
33
|
"""
|
|
33
34
|
|
|
34
35
|
from ouroboros.orchestrator.adapter import (
|