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