Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions skills/auto/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ mcp_args:
max_interview_rounds: "$max_interview_rounds"
max_repair_rounds: "$max_repair_rounds"
skip_run: "$skip_run"
driver: "$driver"
brake: "$brake"
---

# /ouroboros:auto
Expand All @@ -30,6 +32,7 @@ is unavailable. A manual fallback is not an `ooo auto` run.
ooo auto "Build a local-first habit tracker CLI"
ooo auto --resume auto_abc123
ooo auto "Build a local-first habit tracker CLI" --skip-run
ooo auto "Build a local-first habit tracker CLI" --driver hermes --brake on
/ouroboros:auto "Build a local-first habit tracker CLI"
```

Expand All @@ -42,3 +45,10 @@ ooo auto "Build a local-first habit tracker CLI" --skip-run
5. Starts execution only after A-grade.

The pipeline must not hang indefinitely: all loops are bounded and timeout failures return a resumable `auto_session_id`. Resume with `ooo auto --resume <auto_session_id>`. Use `--skip-run` to stop after the A-grade Seed. The CLI-only `--show-ledger` flag prints assumptions/non-goals; MCP skill responses already include the same ledger summary when available.

When invoked through the interactive CLI without `--driver` or a configured
default driver, `ooo auto` asks whether to use a selected interview driver if
one of the supported driver CLIs is installed. Declining that prompt, or having
no installed driver CLI, keeps the deterministic auto answerer. Use
`--driver <backend>` to select a driver explicitly; use `--brake on|off` to
control whether risky driver answers block for approval.
3 changes: 2 additions & 1 deletion src/ouroboros/auto/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
before starting execution.
"""

from ouroboros.auto.answerer import AutoAnswer, AutoAnswerer, AutoAnswerSource
from ouroboros.auto.answerer import AutoAnswer, AutoAnswerer, AutoAnswerMetadata, AutoAnswerSource
from ouroboros.auto.grading import GradeGate, GradeResult, SeedGrade
from ouroboros.auto.interview_driver import AutoInterviewDriver, AutoInterviewResult, InterviewTurn
from ouroboros.auto.ledger import LedgerEntry, LedgerSection, SeedDraftLedger
Expand All @@ -17,6 +17,7 @@

__all__ = [
"AutoAnswer",
"AutoAnswerMetadata",
"AutoAnswerSource",
"AutoAnswerer",
"AutoInterviewDriver",
Expand Down
11 changes: 11 additions & 0 deletions src/ouroboros/auto/answerer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class AutoAnswerSource(StrEnum):
EXISTING_CONVENTION = "existing_convention"
CONSERVATIVE_DEFAULT = "conservative_default"
ASSUMPTION = "assumption"
DRIVER = "driver"
NON_GOAL = "non_goal"
BLOCKER = "blocker"

Expand Down Expand Up @@ -64,6 +65,15 @@ class AutoBlocker:
question: str


@dataclass(frozen=True, slots=True)
class AutoAnswerMetadata:
"""Structured provenance for auto answers that need audit context."""

risk: str | None = None
confidence: float | None = None
provenance: tuple[str, ...] = ()


@dataclass(frozen=True, slots=True)
class AutoAnswer:
"""Answer plus structured ledger updates."""
Expand All @@ -75,6 +85,7 @@ class AutoAnswer:
assumptions: list[str] = field(default_factory=list)
non_goals: list[str] = field(default_factory=list)
blocker: AutoBlocker | None = None
metadata: AutoAnswerMetadata = field(default_factory=AutoAnswerMetadata)

@property
def prefixed_text(self) -> str:
Expand Down
Loading