From 1e1e49b1b979c982d35c231f83d07f90058be7b1 Mon Sep 17 00:00:00 2001
From: Bryan Helmkamp
Date: Thu, 7 May 2026 22:39:14 -0700
Subject: [PATCH] refactor(workflow): remove retro stage
Delete the retro pipeline stage and related types, config, API fields, generated clients, UI flags, and active docs. Retired retro events now deserialize as unknown so old event logs remain readable without keeping typed runtime support.
---
AGENTS.md | 3 +-
Cargo.lock | 22 -
README.md | 6 +-
apps/fabro-web/app/routes/start.tsx | 1 -
apps/fabro-web/app/routes/workflow-detail.tsx | 2 +-
apps/marketing/font-comparison.html | 8 +-
apps/marketing/public/llms.txt | 1 -
.../src/content/blog/introducing-fabro.md | 2 +-
.../roadmap/automatic-retrospectives.yaml | 4 -
.../src/content/roadmap/web-app.yaml | 2 +-
apps/marketing/src/pages/index.astro | 10 +-
docs/internal/events-strategy.md | 3 +-
docs/internal/events.md | 62 --
docs/internal/product/business-problem.md | 2 +-
docs/internal/product/current-state.md | 2 +-
docs/internal/product/product-description.md | 2 +-
docs/internal/product/success-metrics.md | 1 -
.../product/technical-requirements.md | 2 +-
docs/internal/run-directory-keys.md | 5 +-
docs/internal/updating-web-screenshots.md | 4 -
docs/public/agents/outputs.mdx | 2 -
docs/public/api-reference/demo-mode.mdx | 1 -
docs/public/api-reference/fabro-api.yaml | 16 +-
docs/public/core-concepts/how-fabro-works.mdx | 2 +-
docs/public/core-concepts/workflows.mdx | 2 +-
docs/public/docs.json | 1 -
docs/public/execution/checkpoints.mdx | 3 +-
docs/public/execution/observability.mdx | 7 +-
docs/public/execution/retros.mdx | 146 -----
docs/public/execution/run-configuration.mdx | 2 +-
docs/public/getting-started/dark-factory.mdx | 8 +-
docs/public/getting-started/introduction.mdx | 2 +-
docs/public/getting-started/why-fabro.mdx | 2 +-
docs/public/images/web/retros-list.png | Bin 3161440 -> 0 bytes
docs/public/images/web/run-retro.png | Bin 3810387 -> 0 bytes
docs/public/reference/cli.mdx | 2 -
docs/public/reference/dot-language.mdx | 2 +-
docs/public/reference/run-directory.mdx | 3 +-
docs/public/tutorials/hello-world.mdx | 2 +-
evals/swe-bench/evaluate_daytona.py | 1 -
evals/swe-bench/run_eval.py | 1 -
.../tests/run_projection_round_trip.rs | 6 -
lib/crates/fabro-cli/Cargo.toml | 1 -
lib/crates/fabro-cli/src/args.rs | 4 -
.../fabro-cli/src/commands/run/attach.rs | 3 -
.../fabro-cli/src/commands/run/events.rs | 25 -
.../fabro-cli/src/commands/run/overrides.rs | 15 +-
.../src/commands/run/run_progress/event.rs | 14 -
.../src/commands/run/run_progress/mod.rs | 9 -
.../run/run_progress/stage_display.rs | 24 -
lib/crates/fabro-cli/src/manifest_builder.rs | 3 -
lib/crates/fabro-cli/tests/it/cmd/attach.rs | 6 +-
lib/crates/fabro-cli/tests/it/cmd/create.rs | 4 -
lib/crates/fabro-cli/tests/it/cmd/dump.rs | 9 +-
lib/crates/fabro-cli/tests/it/cmd/ps.rs | 16 +-
lib/crates/fabro-cli/tests/it/cmd/run.rs | 8 -
lib/crates/fabro-cli/tests/it/cmd/runner.rs | 78 ---
lib/crates/fabro-cli/tests/it/cmd/start.rs | 2 -
lib/crates/fabro-cli/tests/it/cmd/support.rs | 13 +-
.../fabro-cli/tests/it/cmd/worker_auth.rs | 2 -
.../fabro-cli/tests/it/scenario/lifecycle.rs | 1 -
.../fabro-cli/tests/it/scenario/smoke.rs | 3 -
.../tests/it/workflow/agent_linear.rs | 1 -
.../tests/it/workflow/command_agent_mixed.rs | 1 -
.../tests/it/workflow/command_pipeline.rs | 2 +-
.../it/workflow/conditional_branching.rs | 2 +-
.../fabro-cli/tests/it/workflow/full_stack.rs | 1 -
.../fabro-cli/tests/it/workflow/hooks.rs | 1 -
.../fabro-cli/tests/it/workflow/human_gate.rs | 1 -
lib/crates/fabro-config/src/builders.rs | 2 -
lib/crates/fabro-config/src/defaults.toml | 1 -
lib/crates/fabro-config/src/layers/run.rs | 3 -
lib/crates/fabro-config/src/parse.rs | 1 -
lib/crates/fabro-config/src/project.rs | 39 --
lib/crates/fabro-config/src/resolve/run.rs | 3 -
.../fabro-config/src/tests/resolve_run.rs | 1 -
lib/crates/fabro-dump/src/lib.rs | 15 -
lib/crates/fabro-retro/Cargo.toml | 31 -
lib/crates/fabro-retro/src/lib.rs | 2 -
lib/crates/fabro-retro/src/retro.rs | 101 ---
lib/crates/fabro-retro/src/retro_agent.rs | 605 ------------------
lib/crates/fabro-server/Cargo.toml | 3 +-
lib/crates/fabro-server/src/demo/mod.rs | 2 +-
lib/crates/fabro-server/src/run_manifest.rs | 5 +-
lib/crates/fabro-server/src/server.rs | 6 +-
lib/crates/fabro-server/src/server/tests.rs | 7 +-
.../fabro-server/tests/it/api/system.rs | 6 +-
lib/crates/fabro-store/src/run_state.rs | 12 -
lib/crates/fabro-telemetry/src/sanitize.rs | 4 +-
lib/crates/fabro-types/src/lib.rs | 5 -
lib/crates/fabro-types/src/retro.rs | 164 -----
lib/crates/fabro-types/src/run_event/misc.rs | 27 -
lib/crates/fabro-types/src/run_event/mod.rs | 57 +-
lib/crates/fabro-types/src/run_projection.rs | 7 +-
lib/crates/fabro-types/src/settings/run.rs | 2 -
lib/crates/fabro-workflow/Cargo.toml | 1 -
lib/crates/fabro-workflow/README.md | 2 +-
.../fabro-workflow/src/event/convert.rs | 45 --
lib/crates/fabro-workflow/src/event/events.rs | 52 --
lib/crates/fabro-workflow/src/event/names.rs | 11 -
.../fabro-workflow/src/event/redaction.rs | 12 +-
lib/crates/fabro-workflow/src/lib.rs | 62 +-
.../fabro-workflow/src/operations/fork.rs | 3 -
.../fabro-workflow/src/operations/start.rs | 46 +-
.../fabro-workflow/src/pipeline/finalize.rs | 68 +-
lib/crates/fabro-workflow/src/pipeline/mod.rs | 6 +-
.../src/pipeline/prompts/pr_body.md | 2 +-
.../src/pipeline/pull_request.rs | 247 +------
.../fabro-workflow/src/pipeline/retro.rs | 445 -------------
.../fabro-workflow/src/pipeline/types.rs | 24 -
.../src/models/manifest-args.ts | 1 -
.../src/models/run-execution-settings.ts | 1 -
.../src/models/run-projection.ts | 3 -
.../src/models/system-features.ts | 4 -
test/retro-e2e.fabro | 12 -
115 files changed, 170 insertions(+), 2592 deletions(-)
delete mode 100644 apps/marketing/src/content/roadmap/automatic-retrospectives.yaml
delete mode 100644 docs/public/execution/retros.mdx
delete mode 100644 docs/public/images/web/retros-list.png
delete mode 100644 docs/public/images/web/run-retro.png
delete mode 100644 lib/crates/fabro-retro/Cargo.toml
delete mode 100644 lib/crates/fabro-retro/src/lib.rs
delete mode 100644 lib/crates/fabro-retro/src/retro.rs
delete mode 100644 lib/crates/fabro-retro/src/retro_agent.rs
delete mode 100644 lib/crates/fabro-types/src/retro.rs
delete mode 100644 lib/crates/fabro-workflow/src/pipeline/retro.rs
delete mode 100644 test/retro-e2e.fabro
diff --git a/AGENTS.md b/AGENTS.md
index a62c665b2..61b329f67 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -109,7 +109,7 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as
### Rust crates (`lib/crates/`)
- **fabro-cli** — CLI entry point. Commands: `run`, `exec`, `serve`, `validate`, `parse`, `cp`, `model`, `doctor`, `install`, `ps`, `system prune`
-- **fabro-workflow** — Core workflow engine. Parses Graphviz graphs, runs stages, manages checkpoints/resume, hooks, retros, and human-in-the-loop interactions
+- **fabro-workflow** — Core workflow engine. Parses Graphviz graphs, runs stages, manages checkpoints/resume, hooks, and human-in-the-loop interactions
- **fabro-agent** — AI coding agent with tool use (Bash, Read, Write, Edit, Glob, Grep, WebFetch). `Sandbox` trait abstracts execution environments
- **fabro-sandbox** — Local, Docker, and Daytona sandbox providers. Docker is the default runtime provider and creates clone-based `/workspace` containers through the operator's Docker daemon; Daytona uses the same GitHub-only clone-source contract. Docker daemon access is host-root-equivalent and assumes trusted callers/payloads.
- **fabro-server** — Axum HTTP server. Routes for runs, sessions, models, completions, usage. SSE event streaming. Demo mode via header
@@ -180,7 +180,6 @@ Never run `cargo insta accept` without first checking what's pending — it acce
## Testing workflows
- `fabro run ` — run a workflow by name (resolves `.fabro/workflows//workflow.toml`), e.g. `fabro run repl`
-- Use `--no-retro` to skip the retro step and finish faster
- `#[e2e_test(twin, live("VAR"))]` — dual-mode test that runs against twin-openai or real API. `#[e2e_test(twin)]` for twin-only tests (e.g., scripted failures). `#[e2e_test(live("VAR"))]` for live-only tests requiring secrets. `#[e2e_test()]` for sandbox tests with no API deps. Behavior is controlled by `FABRO_TEST_MODE` (`live`, `strict`; default is `twin`), and `cargo nextest run --profile e2e ...` implies `strict`. Use `fabro_test::e2e_openai!()` in twin/dual-mode tests to get `(base_url, api_key)`.
- Local test HTTP clients must use `.no_proxy()`. Prefer shared helpers like `fabro_test::test_http_client()` or crate-local equivalents instead of `reqwest::Client::new()`, bare `Client::builder().build()`, or `reqwest::get(...)`.
- This is not cosmetic: macOS proxy discovery adds hidden startup overhead to repeated localhost reqwest clients and can surface as misleading nextest timeouts.
diff --git a/Cargo.lock b/Cargo.lock
index 2c14ddc8a..e9e0bd94b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1675,7 +1675,6 @@ dependencies = [
"fabro-oauth",
"fabro-proc",
"fabro-redact",
- "fabro-retro",
"fabro-sandbox",
"fabro-server",
"fabro-static",
@@ -2076,25 +2075,6 @@ dependencies = [
"url",
]
-[[package]]
-name = "fabro-retro"
-version = "0.225.0-nightly.0"
-dependencies = [
- "anyhow",
- "chrono",
- "fabro-agent",
- "fabro-dump",
- "fabro-llm",
- "fabro-store",
- "fabro-types",
- "fabro-util",
- "serde",
- "serde_json",
- "tempfile",
- "tokio",
- "tracing",
-]
-
[[package]]
name = "fabro-sandbox"
version = "0.225.0-nightly.0"
@@ -2164,7 +2144,6 @@ dependencies = [
"fabro-model",
"fabro-proc",
"fabro-redact",
- "fabro-retro",
"fabro-sandbox",
"fabro-slack",
"fabro-spa",
@@ -2441,7 +2420,6 @@ dependencies = [
"fabro-mcp",
"fabro-model",
"fabro-redact",
- "fabro-retro",
"fabro-sandbox",
"fabro-static",
"fabro-store",
diff --git a/README.md b/README.md
index 0a3caeec9..7cc53e30a 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ Then run `fabro server start` to finish setup in your browser. The server opens
- **Run agents 24/7** — Fabro's API server queues and executes runs continuously. Close your laptop — workflows keep running and results are waiting when you return.
- **Scale infinitely** — Move execution off your laptop and into cloud sandboxes. Run as many concurrent workflows as your infrastructure allows.
- **Guarantee code quality** — Layer deterministic verifications — test suites, linters, type checkers, LLM-as-judge — into your workflow graph. Failures trigger fix loops automatically.
-- **Achieve compounding engineering** — Automatic retrospectives after every run feed a continuous improvement loop. Your workflows get better over time, not just your code.
+- **Inspect every run** — Query durable event streams, checkpoints, conclusions, and stage outputs to understand what happened and improve the workflow.
- **Specify in natural language** — Define requirements as natural-language specs and let Fabro generate — and regenerate — implementations that conform to them.
---
@@ -56,7 +56,7 @@ Then run `fabro server start` to finish setup in your browser. The server opens
| ☁️ | Cloud sandboxes | Run agents in isolated Daytona cloud VMs with snapshot-based setup, network controls, and automatic cleanup |
| 🔌 | SSH access and preview links | Shell into running sandboxes with `fabro sandbox ssh` and expose ports with `fabro sandbox preview` for live debugging |
| 🌲 | Git checkpointing | Every stage commits code changes and execution metadata to Git branches. Resume, revert, or trace any change |
-| 📊 | Automatic retros | Each run generates a retrospective with cost, duration, files touched, and an LLM-written narrative |
+| 📊 | Run observability | Durable events, checkpoints, conclusions, and stage outputs make every run inspectable and exportable |
| ⚡ | Comprehensive API | REST API with SSE event streaming and a React web UI. Run workflows programmatically or as a service |
| 🦀 | Single binary, no runtime | One compiled Rust executable with zero dependencies. No Python, no Node, no Docker required |
| ⚖️ | Open source (MIT) | Full source code, no vendor lock-in. Self-host, fork, or extend to fit your workflow |
@@ -104,7 +104,7 @@ Fabro ships with [comprehensive documentation](https://docs.fabro.sh) covering e
- [**Getting Started**](https://docs.fabro.sh/getting-started/introduction) -- Installation, first workflow, and why Fabro exists
- [**Defining Workflows**](https://docs.fabro.sh/workflows/stages-and-nodes) -- Node types, transitions, variables, stylesheets, and human gates
-- [**Executing Workflows**](https://docs.fabro.sh/execution/run-configuration) -- Run configuration, sandboxes, checkpoints, retros, and failure handling
+- [**Executing Workflows**](https://docs.fabro.sh/execution/run-configuration) -- Run configuration, sandboxes, checkpoints, observability, and failure handling
- [**Tutorials**](https://docs.fabro.sh/tutorials/hello-world) -- Step-by-step guides from hello world to parallel multi-model ensembles
- [**API Reference**](https://docs.fabro.sh/api-reference/overview) -- Full OpenAPI spec with authentication, SSE events, and client SDKs
diff --git a/apps/fabro-web/app/routes/start.tsx b/apps/fabro-web/app/routes/start.tsx
index cb08ba57f..aba31a025 100644
--- a/apps/fabro-web/app/routes/start.tsx
+++ b/apps/fabro-web/app/routes/start.tsx
@@ -48,7 +48,6 @@ export default function Start() {
const systemInfo = useSystemInfo();
const features = systemInfo.data?.features ?? {
session_sandboxes: false,
- retros: false,
};
const [prompt, setPrompt] = useState("");
const [project, setProject] = useState(projects[0]);
diff --git a/apps/fabro-web/app/routes/workflow-detail.tsx b/apps/fabro-web/app/routes/workflow-detail.tsx
index 03d988279..01fb440c4 100644
--- a/apps/fabro-web/app/routes/workflow-detail.tsx
+++ b/apps/fabro-web/app/routes/workflow-detail.tsx
@@ -61,7 +61,7 @@ function sampleSettings({
model: { provider: null, name: "claude-sonnet", fallbacks: [] },
git: { author: null },
prepare: { commands: prepareCommands, timeout_ms: 120_000 },
- execution: { mode: "normal", approval: "prompt", retros: true },
+ execution: { mode: "normal", approval: "prompt" },
checkpoint: { exclude_globs: [] },
sandbox: {
provider: "daytona",
diff --git a/apps/marketing/font-comparison.html b/apps/marketing/font-comparison.html
index 3774d805a..9c770cebc 100644
--- a/apps/marketing/font-comparison.html
+++ b/apps/marketing/font-comparison.html
@@ -453,7 +453,7 @@
Verification is a first-class concept
Every workflow can include build gates, test assertions, and human approval stages. When a stage fails, Fabro routes back to the appropriate fix loop — no manual re-runs, no git stash gymnastics.
-
The retrospective engine runs after every workflow, surfacing what went wrong and why. Over time, your workflows get smarter.
+
The event stream captures every workflow, surfacing what happened and why. Over time, your workflows get easier to inspect.
@@ -498,7 +498,7 @@
Verification is a first-class concept
Every workflow can include build gates, test assertions, and human approval stages. When a stage fails, Fabro routes back to the appropriate fix loop — no manual re-runs, no git stash gymnastics.
-
The retrospective engine runs after every workflow, surfacing what went wrong and why. Over time, your workflows get smarter.
+
The event stream captures every workflow, surfacing what happened and why. Over time, your workflows get easier to inspect.
@@ -543,7 +543,7 @@
Verification is a first-class concept
Every workflow can include build gates, test assertions, and human approval stages. When a stage fails, Fabro routes back to the appropriate fix loop — no manual re-runs, no git stash gymnastics.
-
The retrospective engine runs after every workflow, surfacing what went wrong and why. Over time, your workflows get smarter.
+
The event stream captures every workflow, surfacing what happened and why. Over time, your workflows get easier to inspect.
@@ -588,7 +588,7 @@
Verification is a first-class concept
Every workflow can include build gates, test assertions, and human approval stages. When a stage fails, Fabro routes back to the appropriate fix loop — no manual re-runs, no git stash gymnastics.
-
The retrospective engine runs after every workflow, surfacing what went wrong and why. Over time, your workflows get smarter.
+
The event stream captures every workflow, surfacing what happened and why. Over time, your workflows get easier to inspect.
diff --git a/apps/marketing/public/llms.txt b/apps/marketing/public/llms.txt
index d775edc0d..79f4f8cf5 100644
--- a/apps/marketing/public/llms.txt
+++ b/apps/marketing/public/llms.txt
@@ -57,7 +57,6 @@ Fabro replaces the prompt-wait-review loop with version-controlled workflow grap
- [Environments](https://docs.fabro.sh/execution/environments): Sandbox providers for workflow execution
- [Run Configuration](https://docs.fabro.sh/execution/run-configuration): Configure runs with TOML files
- [Checkpoints](https://docs.fabro.sh/execution/checkpoints): Git-based checkpoint and resume
-- [Retros](https://docs.fabro.sh/execution/retros): Automatic retrospectives for every run
- [Observability](https://docs.fabro.sh/execution/observability): Monitor, inspect, and analyze runs
## Integrations
diff --git a/apps/marketing/src/content/blog/introducing-fabro.md b/apps/marketing/src/content/blog/introducing-fabro.md
index a95e0e32d..44e6517b5 100644
--- a/apps/marketing/src/content/blog/introducing-fabro.md
+++ b/apps/marketing/src/content/blog/introducing-fabro.md
@@ -90,4 +90,4 @@ curl -fsSL https://fabro.sh/install.sh | bash
fabro run implement
```
-Check the [roadmap](/roadmap) to see what we're building — including automatic retrospectives, a REST API server, and analytics — and join us on [Discord](/discord) to shape what comes next.
+Check the [roadmap](/roadmap) to see what we're building — including the REST API server, analytics, and web workflows — and join us on [Discord](/discord) to shape what comes next.
diff --git a/apps/marketing/src/content/roadmap/automatic-retrospectives.yaml b/apps/marketing/src/content/roadmap/automatic-retrospectives.yaml
deleted file mode 100644
index b58f9963d..000000000
--- a/apps/marketing/src/content/roadmap/automatic-retrospectives.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-title: Compounding with auto-retrospectives
-description: Structured post-run analysis with cost, duration, smoothness ratings, friction points, and LLM-generated narratives.
-status: building
-date: 2026-04-03
diff --git a/apps/marketing/src/content/roadmap/web-app.yaml b/apps/marketing/src/content/roadmap/web-app.yaml
index e3e7f7814..738ca09fb 100644
--- a/apps/marketing/src/content/roadmap/web-app.yaml
+++ b/apps/marketing/src/content/roadmap/web-app.yaml
@@ -1,4 +1,4 @@
title: Web app
-description: React dashboard for managing workflows, viewing runs, approving human gates, and browsing retrospectives.
+description: React dashboard for managing workflows, viewing runs, approving human gates, and inspecting execution traces.
status: next
date: 2026-06-03
diff --git a/apps/marketing/src/pages/index.astro b/apps/marketing/src/pages/index.astro
index ba997edba..1dd0de89c 100644
--- a/apps/marketing/src/pages/index.astro
+++ b/apps/marketing/src/pages/index.astro
@@ -283,7 +283,7 @@ const cssExample = `/* All nodes default to fast + ch
-
+
@@ -293,9 +293,9 @@ const cssExample = `/* All nodes default to fast + ch
Analytics
-
Automatic retrospectives
+
Run observability
- Each run generates a retro with cost, duration, files touched, and an LLM-written narrative. Your workflows improve over time.
+ Durable event streams, checkpoints, conclusions, and stage outputs make every run inspectable and exportable.
@@ -524,7 +524,7 @@ const cssExample = `/* All nodes default to fast + ch
Full traceability across runs — every model call, every tool invocation, every decision point.
- Query run data with SQL. Automatic retrospectives rate each run and surface friction points.
+ Query run data with SQL and inspect the full execution trail.
@@ -568,7 +568,7 @@ const cssExample = `/* All nodes default to fast + ch
-
retro
+
verify
3.3s
diff --git a/docs/internal/events-strategy.md b/docs/internal/events-strategy.md
index b2e931bfb..e2931a060 100644
--- a/docs/internal/events-strategy.md
+++ b/docs/internal/events-strategy.md
@@ -1,6 +1,6 @@
# Fabro Events Strategy
-Fabro emits structured **workflow run events** during execution for observability. Events are the durable audit trail for a run: they drive the run store, SSE streaming, CLI progress rendering, retro analysis, and optional JSONL sinks.
+Fabro emits structured **workflow run events** during execution for observability. Events are the durable audit trail for a run: they drive the run store, SSE streaming, CLI progress rendering, and optional JSONL sinks.
Events are distinct from tracing logs. Tracing is developer diagnostics; events are product-facing state transitions and activity records that other systems consume.
@@ -159,7 +159,6 @@ Check:
- CLI progress parsing
- `fabro events`
-- retro duration extraction
- store validation
- tests or fixtures that inspect event names or fields
diff --git a/docs/internal/events.md b/docs/internal/events.md
index 580de2349..ce4c37d3f 100644
--- a/docs/internal/events.md
+++ b/docs/internal/events.md
@@ -2263,65 +2263,3 @@ Emitted when the stall watchdog detects no progress.
| Property | Type | Description |
|----------|------|-------------|
| `idle_seconds` | number | Seconds since last activity |
-
----
-
-## Retro events
-
-### `retro.started`
-
-```json
-{
- "id": "...", "ts": "...", "run_id": "...",
- "event": "retro.started",
- "properties": {
- "prompt": "Analyze the workflow run data at `/tmp/retro_data/` ...",
- "provider": "anthropic",
- "model": "claude-sonnet-4-20250514"
- }
-}
-```
-
-| Property | Type | Description |
-|----------|------|-------------|
-| `prompt` | string? | Prompt sent to the retro agent |
-| `provider` | string? | LLM provider for the retro agent |
-| `model` | string? | Model used for the retro agent |
-
-### `retro.completed`
-
-```json
-{
- "id": "...", "ts": "...", "run_id": "...",
- "event": "retro.completed",
- "properties": {
- "duration_ms": 5000,
- "response": "The run was mostly smooth...",
- "retro": {"smoothness": "smooth"}
- }
-}
-```
-
-| Property | Type | Description |
-|----------|------|-------------|
-| `duration_ms` | number | Retro duration |
-| `response` | string? | Raw assistant response from the retro agent |
-| `retro` | object? | Parsed `Retro` payload |
-
-### `retro.failed`
-
-```json
-{
- "id": "...", "ts": "...", "run_id": "...",
- "event": "retro.failed",
- "properties": {
- "error": "LLM request failed",
- "duration_ms": 3000
- }
-}
-```
-
-| Property | Type | Description |
-|----------|------|-------------|
-| `error` | string | Error message |
-| `duration_ms` | number | Duration before failure |
diff --git a/docs/internal/product/business-problem.md b/docs/internal/product/business-problem.md
index f5286f4dd..094ba1ccf 100644
--- a/docs/internal/product/business-problem.md
+++ b/docs/internal/product/business-problem.md
@@ -18,7 +18,7 @@ Fabro treats the process itself as code:
- Workflow graphs define stages, branching, loops, parallelism, and human gates.
- Model stylesheets route different stages to different models and providers.
- Sandboxes and Git checkpoints make runs isolated, resumable, and inspectable.
-- Event logs, verifications, and retros create a feedback loop after execution.
+- Event logs, verifications, and run state create a feedback loop after execution.
## Product direction
diff --git a/docs/internal/product/current-state.md b/docs/internal/product/current-state.md
index b878e4178..355cb272c 100644
--- a/docs/internal/product/current-state.md
+++ b/docs/internal/product/current-state.md
@@ -19,7 +19,7 @@ Fabro currently presents as:
- Git checkpointing for resume, rewind, fork, and auditability
- structured run artifacts and event streams for observability
- verifications and insights in the broader product surface
-- retrospectives, documented as experimental
+- observability surfaces for event streams, run state, and verification data
## Current positioning
diff --git a/docs/internal/product/product-description.md b/docs/internal/product/product-description.md
index 5eb363b65..c381283d2 100644
--- a/docs/internal/product/product-description.md
+++ b/docs/internal/product/product-description.md
@@ -18,7 +18,7 @@ A workflow can combine:
- model stylesheets choose models and providers per stage
- sandboxes isolate execution from the host
- Git checkpoints make runs resumable and auditable
-- event logs, verifications, and optional retros help teams inspect outcomes
+- event logs, verifications, and run state help teams inspect outcomes
## Interfaces
diff --git a/docs/internal/product/success-metrics.md b/docs/internal/product/success-metrics.md
index 7fcba1c7f..8f702390f 100644
--- a/docs/internal/product/success-metrics.md
+++ b/docs/internal/product/success-metrics.md
@@ -7,7 +7,6 @@ For product work, measure trust and useful outcomes, not just command execution.
- CLI telemetry for command success and failure
- per-run event streams in `progress.jsonl`
- run artifacts such as `checkpoint.json`, `conclusion.json`, and verification data
-- `retro.json` when retros are enabled
- API and web data for runs, workflows, usage, verifications, and insights
## Metrics that matter most
diff --git a/docs/internal/product/technical-requirements.md b/docs/internal/product/technical-requirements.md
index abbc1cd70..b6d62b9b4 100644
--- a/docs/internal/product/technical-requirements.md
+++ b/docs/internal/product/technical-requirements.md
@@ -10,7 +10,7 @@ This note captures stable constraints that product changes should respect.
- Model routing is per-stage and provider-agnostic through stylesheets and config.
- Execution happens through sandbox providers rather than assuming direct host access.
- Git checkpointing is central to resume, rewind, fork, and auditability.
-- Runs produce structured artifacts such as `progress.jsonl`, `live.json`, `checkpoint.json`, and optional `retro.json`.
+- Runs produce structured artifacts such as `progress.jsonl`, `live.json`, `checkpoint.json`, and `conclusion.json`.
- The HTTP API is OpenAPI-based, and the web app depends on that contract.
## Operational constraints
diff --git a/docs/internal/run-directory-keys.md b/docs/internal/run-directory-keys.md
index 74eda074c..91ceeb2a8 100644
--- a/docs/internal/run-directory-keys.md
+++ b/docs/internal/run-directory-keys.md
@@ -32,9 +32,8 @@ These paths are local runtime state, not canonical event projections.
These names are still real, but they are no longer live scratch files by default:
-- Metadata branch files such as `run.json`, `start.json`, `checkpoint.json`, and `retro.json`
-- `fabro dump` exports such as `run.json`, `start.json`, `status.json`, `checkpoint.json`, `conclusion.json`, `retro.json`, `events.jsonl`, and per-node prompt/response/status/stdout/stderr files
-- Retro-agent temp uploads named `events.jsonl`, `run.json`, `graph.fabro`, `checkpoints/{seq:04}.json`, `run.log` when available, and per-stage files under `stages/{rank:03}-{node_id}@{visit}/...` inside the retro sandbox
+- Metadata branch files such as `run.json`, `start.json`, and `checkpoint.json`
+- `fabro dump` exports such as `run.json`, `start.json`, `status.json`, `checkpoint.json`, `conclusion.json`, `events.jsonl`, and per-node prompt/response/status/stdout/stderr files
## Notes
diff --git a/docs/internal/updating-web-screenshots.md b/docs/internal/updating-web-screenshots.md
index 42d5d44d5..0b311c16a 100644
--- a/docs/internal/updating-web-screenshots.md
+++ b/docs/internal/updating-web-screenshots.md
@@ -57,9 +57,7 @@ Screenshots live in `docs/public/images/web/`. Each screenshot maps to a specifi
| `run-overview.png` | `/runs/run-1` |
| `run-stages.png` | `/runs/run-1/stages/detect-drift` |
| `run-files-changed.png` | `/runs/run-1/compare` |
-| `run-retro.png` | `/runs/run-1/retro` |
| `run-usage.png` | `/runs/run-1/usage` |
-| `retros-list.png` | `/retros` |
### Verification checklist
@@ -96,8 +94,6 @@ Current placements:
| `workflow-runs.png` | `core-concepts/workflows.mdx` |
| `run-stages.png` | `execution/observability.mdx` |
| `run-usage.png` | `execution/observability.mdx` |
-| `retros-list.png` | `execution/retros.mdx` |
-| `run-retro.png` | `execution/retros.mdx` |
| `run-files-changed.png` | `human-tools/steering.mdx` |
## Cleanup
diff --git a/docs/public/agents/outputs.mdx b/docs/public/agents/outputs.mdx
index ac0bdffe7..effbe67a5 100644
--- a/docs/public/agents/outputs.mdx
+++ b/docs/public/agents/outputs.mdx
@@ -121,7 +121,6 @@ The tracked paths are stored as `files_touched` on the stage outcome:
|---|---|
| `StageCompleted` event | Emitted with `files_touched` in the event stream and surfaced by `fabro events` / exported event streams |
| Preambles | Listed under each completed stage so downstream agents know what changed |
-| Retros | Included per-stage and aggregated across the full run |
| `status.json` | Written to the stage's logs directory after each node completes |
### How tracking works
@@ -239,6 +238,5 @@ Outputs and artifacts appear in several observability surfaces:
|---|---|
| `StageCompleted` event | `files_touched` list for the stage |
| `WorkflowRunCompleted` event | `artifact_count` -- total number of offloaded artifacts across the run |
-| [Retros](/execution/retros) | Per-stage `files_touched` and aggregate `files_touched` across all stages |
| [Preambles](/execution/context#preamble-construction) | File list and artifact pointer references for completed stages |
| Stage logs | `status.json` in each stage's run directory contains the full outcome including `files_touched` |
diff --git a/docs/public/api-reference/demo-mode.mdx b/docs/public/api-reference/demo-mode.mdx
index 380f0414b..5d3670c0a 100644
--- a/docs/public/api-reference/demo-mode.mdx
+++ b/docs/public/api-reference/demo-mode.mdx
@@ -47,7 +47,6 @@ Demo mode implements every API endpoint. Read endpoints return static data repre
| Run Internals | Stages, turns, checkpoints, context, and configuration all return static data |
| Verifications | Categories and controls with pass/fail examples |
| Insights | Saved queries and history; execute returns a canned result |
-| Retros | Retrospective data for completed runs |
| Projects | Sample projects and branches |
| Settings | Platform configuration |
diff --git a/docs/public/api-reference/fabro-api.yaml b/docs/public/api-reference/fabro-api.yaml
index 08991e412..bd7b9423b 100644
--- a/docs/public/api-reference/fabro-api.yaml
+++ b/docs/public/api-reference/fabro-api.yaml
@@ -4393,8 +4393,6 @@ components:
type: boolean
auto_approve:
type: boolean
- no_retro:
- type: boolean
preserve_sandbox:
type: boolean
worktree_mode:
@@ -5640,13 +5638,6 @@ components:
conclusion:
type: ["object", "null"]
additionalProperties: true
- retro:
- type: ["object", "null"]
- additionalProperties: true
- retro_prompt:
- type: ["string", "null"]
- retro_response:
- type: ["string", "null"]
sandbox:
type: ["object", "null"]
additionalProperties: true
@@ -7568,14 +7559,12 @@ components:
RunExecutionSettings:
type: object
- required: [mode, approval, retros]
+ required: [mode, approval]
properties:
mode:
$ref: "#/components/schemas/RunMode"
approval:
$ref: "#/components/schemas/ApprovalMode"
- retros:
- type: boolean
RunMode:
type: string
@@ -8028,9 +8017,6 @@ components:
session_sandboxes:
type: boolean
description: Whether session sandboxes are enabled.
- retros:
- type: boolean
- description: Whether workflow retros are enabled.
SystemRunCounts:
description: Counts of known runs in the active server process.
diff --git a/docs/public/core-concepts/how-fabro-works.mdx b/docs/public/core-concepts/how-fabro-works.mdx
index de33adec5..9a7c34def 100644
--- a/docs/public/core-concepts/how-fabro-works.mdx
+++ b/docs/public/core-concepts/how-fabro-works.mdx
@@ -82,7 +82,7 @@ The sandbox is configured per-run via CLI flags (`--sandbox docker`) or the run
Every significant action — stage starts, LLM calls, tool invocations, edge selections, stage completions — is emitted as a structured event. These events power:
- The **web UI** for real-time run monitoring
-- **Retrospectives** generated automatically after each run
+- **Run summaries** built from durable events, checkpoints, conclusions, and stage outputs
- **DuckDB queries** via `fabro insights` for SQL-based analysis across runs
See [Observability](/execution/observability) for more on querying run data.
diff --git a/docs/public/core-concepts/workflows.mdx b/docs/public/core-concepts/workflows.mdx
index d1f6baa27..558334219 100644
--- a/docs/public/core-concepts/workflows.mdx
+++ b/docs/public/core-concepts/workflows.mdx
@@ -28,7 +28,7 @@ digraph MyWorkflow {
}
```
-The `goal` attribute describes what the workflow accomplishes. Fabro uses it to guide agent behavior and generate retrospectives.
+The `goal` attribute describes what the workflow accomplishes. Fabro uses it to guide agent behavior.
## Key node types
diff --git a/docs/public/docs.json b/docs/public/docs.json
index f7ff620fa..746a55b73 100644
--- a/docs/public/docs.json
+++ b/docs/public/docs.json
@@ -55,7 +55,6 @@
"execution/checkpoints",
"execution/outcomes",
"execution/failures",
- "execution/retros",
"execution/observability",
"execution/devcontainers"
]
diff --git a/docs/public/execution/checkpoints.mdx b/docs/public/execution/checkpoints.mdx
index 2bf801f3d..809883129 100644
--- a/docs/public/execution/checkpoints.mdx
+++ b/docs/public/execution/checkpoints.mdx
@@ -45,14 +45,13 @@ Fabro disables Git commit and tag signing for checkpoint commits created inside
The metadata branch (`fabro/meta/{run_id}`) is an orphan branch that stores structured run data using Git's object storage directly. Fabro writes it from inside the sandbox with Git plumbing commands, without checking out a metadata worktree. It is initialized at run start with:
-- **`run.json`** — Current projection snapshot: run spec, start/status records, current checkpoint, conclusion, sandbox, retro state, and other run-level metadata
+- **`run.json`** — Current projection snapshot: run spec, start/status records, current checkpoint, conclusion, sandbox, and other run-level metadata
- **`graph.fabro`** — Workflow source for the run
After each node, the metadata branch is updated with:
- **`run.json`** — Refreshed projection snapshot with the new current checkpoint
- **`stages/{rank:03}-{node_id}@{visit}/...`** — Execution-order-prefixed per-stage trace files (prompts, responses, status, diffs, stdout/stderr, and tool metadata)
-- **`stages/retro/*.md`** — Retro prompt/response text when present
## What's in a checkpoint
diff --git a/docs/public/execution/observability.mdx b/docs/public/execution/observability.mdx
index 2e0926b73..15720d4d4 100644
--- a/docs/public/execution/observability.mdx
+++ b/docs/public/execution/observability.mdx
@@ -3,7 +3,7 @@ title: "Observability"
description: "How to monitor, inspect, and analyze workflow runs"
---
-Fabro captures a structured event for every significant action during a workflow run. These events cover stage execution, agent tool calls, retries, routing, sandbox lifecycle, git checkpoints, retro generation, and more.
+Fabro captures a structured event for every significant action during a workflow run. These events cover stage execution, agent tool calls, retries, routing, sandbox lifecycle, git checkpoints, and more.
## Event stream
@@ -11,7 +11,7 @@ Every workflow run emits a sequence of canonical **run event envelopes** that ar
- Stored durably in the run store
- Broadcast over SSE to connected API clients
-- Stored for later analysis and retro generation
+- Stored for later analysis
- Rendered by CLI progress and log tooling
- Optionally materialized into JSONL by export/debug paths
@@ -95,7 +95,6 @@ Common categories include:
| Routing | `edge.selected`, `loop.restart`, `parallel.started` |
| Git and checkpoints | `checkpoint.completed`, `git.commit`, `git.push` |
| Setup and sandbox | `sandbox.initializing`, `sandbox.ready`, `setup.started` |
-| Retro | `retro.started`, `retro.completed`, `retro.failed` |
## Sub-agent visibility
@@ -135,4 +134,4 @@ Post-run analysis surfaces include:
| `fabro inspect
` | Current durable run state, including run/start/checkpoint/conclusion records |
| `fabro dump --output ` | Exported `events.jsonl` plus reconstructed JSON and node files |
-See [retros](/execution/retros), [stages](/api-reference/run-internals/list-run-stages), and [turns](/api-reference/run-internals/list-stage-turns) for higher-level analysis views built on top of this event stream.
+See [stages](/api-reference/run-internals/list-run-stages) and [turns](/api-reference/run-internals/list-stage-turns) for higher-level analysis views built on top of this event stream.
diff --git a/docs/public/execution/retros.mdx b/docs/public/execution/retros.mdx
deleted file mode 100644
index 9c8c65019..000000000
--- a/docs/public/execution/retros.mdx
+++ /dev/null
@@ -1,146 +0,0 @@
----
-title: "Retros"
-description: "Automatic retrospectives that analyze every workflow run"
----
-
-
-**Experimental feature.** Retros are disabled by default. Enable them by setting `retros = true` under `[run.execution]` in your project or workflow config.
-
-
-After every workflow run, Fabro can generate a **retro** — a structured retrospective that captures what happened, what went well, and what didn't. Retros combine deterministic metrics extracted from the run's checkpoint with a qualitative narrative produced by an LLM agent that analyzes the full event stream.
-
-The goal is continuous improvement. Retros give you a searchable history of how your workflows perform over time, surface friction patterns that would otherwise go unnoticed, and identify follow-up work before it falls through the cracks.
-
-
-
-
-
-## What's in a retro
-
-A retro has two layers: **quantitative stats** derived cheaply from checkpoint data, and an **agent-generated narrative** that interprets the run holistically.
-
-### Quantitative layer
-
-The quantitative layer is extracted directly from the [checkpoint](/execution/checkpoints) and event stream — no LLM calls required:
-
-| Field | Description |
-|---|---|
-| **Per-stage breakdown** | Duration, retry count, cost, files touched, status, and failure reason for each stage |
-| **Aggregate stats** | Total duration, total cost, total retries, all files touched, stages completed vs. failed |
-
-### Narrative layer
-
-An LLM agent reads the run's full event stream and produces a structured analysis:
-
-| Field | Description |
-|---|---|
-| **Smoothness** | Overall rating on a 5-point scale (see below) |
-| **Intent** | What the run was trying to accomplish |
-| **Outcome** | What actually happened |
-| **Learnings** | What was discovered about the repo, code, workflow, or tools |
-| **Friction points** | Where things got stuck and why |
-| **Open items** | Follow-up work, tech debt, test gaps, or investigations identified |
-
-The agent has tool access to grep and read the event stream, so it can inspect actual tool call patterns, error messages, and approach pivots — not just pass/fail signals.
-
-## Smoothness ratings
-
-Every retro includes a smoothness rating that grades the overall quality of the run's execution:
-
-| Rating | Meaning |
-|---|---|
-| **Effortless** | Goal achieved on the first try. No retries, no wrong approaches. Agent moved efficiently from start to finish. |
-| **Smooth** | Goal achieved with minor hiccups — 1–2 retries or a brief wrong approach quickly corrected. No human intervention needed. |
-| **Bumpy** | Goal achieved but with notable friction: multiple retries, at least one significant wrong approach, or substantial time on dead ends. |
-| **Struggled** | Goal achieved only with difficulty: many retries, major approach changes, human intervention, or partial failures requiring recovery. |
-| **Failed** | Run did not achieve its stated goal. Some stages may have completed, but the overall intent was not fulfilled. |
-
-The rating considers the full context visible in agent events — tool call patterns, error recovery sequences, approach pivots — not just stage pass/fail counts.
-
-## Learnings, friction points, and open items
-
-### Learnings
-
-Learnings capture what was discovered during the run, categorized by type:
-
-| Category | Examples |
-|---|---|
-| `repo` | Repository structure, build system quirks, CI configuration |
-| `code` | Bug root causes, module boundaries, API contracts |
-| `workflow` | Node ordering issues, missing stages, prompt improvements |
-| `tool` | Tool limitations, MCP server behavior, command output parsing |
-
-### Friction points
-
-Friction points identify where the run got stuck and what caused the slowdown:
-
-| Kind | Description |
-|---|---|
-| `retry` | A stage needed multiple attempts |
-| `timeout` | A stage or tool call hit a time limit |
-| `wrong_approach` | The agent pursued a dead end before pivoting |
-| `tool_failure` | A tool or command failed unexpectedly |
-| `ambiguity` | Unclear requirements or conflicting signals caused confusion |
-
-Each friction point can optionally reference the `stage_id` where it occurred.
-
-### Open items
-
-Open items capture follow-up work identified during the run:
-
-| Kind | Description |
-|---|---|
-| `tech_debt` | Code quality issues worth addressing later |
-| `follow_up` | Work that's related but out of scope for this run |
-| `investigation` | Unknowns that need further research |
-| `test_gap` | Missing test coverage discovered during the run |
-
-## How retros are generated
-
-Retro generation happens in two phases after a run completes:
-
-1. **Derive** — Fabro extracts stage durations from durable run events and builds a retro from the checkpoint data. This is deterministic, fast, and produces the quantitative layer.
-
-2. **Narrate** — An LLM agent session analyzes the run data. The agent receives `events.jsonl`, `run.json`, `graph.fabro`, checkpoint snapshots under `checkpoints/{seq:04}.json`, `run.log` when available, and per-stage files under `stages/{rank:03}-{node_id}@{visit}/...` inside its sandbox so it can grep and read the event stream, run snapshot, workflow source, checkpoints, logs, and full stage payloads. The narrative fields are merged back into durable retro state.
-
-Both phases run automatically at the end of every CLI run. The API server derives the quantitative layer but does not currently run the narrative agent.
-
-
-
-
-
-## Accessing retros
-
-### CLI
-
-To enable retros for your project, set `retros = true` under `[run.execution]` in your `.fabro/project.toml`:
-
-```toml title=".fabro/project.toml"
-_version = 1
-
-[run.execution]
-retros = true
-```
-
-To skip retro generation for a single run when retros are enabled, pass `--no-retro`:
-
-```bash
-fabro run workflow.fabro --no-retro
-```
-
-Retros can also be enabled server-wide in `settings.toml`:
-
-```toml title="settings.toml"
-_version = 1
-
-[run.execution]
-retros = true
-```
-
-### API
-
-Retros are also available via the REST API. See the [list retros](/api-reference/retros/list-retros) and [retrieve retro](/api-reference/retros/retrieve-retro) API reference pages.
-
-## Storage
-
-Retros are stored in durable run state. If you need files on disk, `fabro dump` materializes retro text under `stages/retro/` alongside `run.json`, stage files, and the rest of the exported run data.
diff --git a/docs/public/execution/run-configuration.mdx b/docs/public/execution/run-configuration.mdx
index d499e95b7..e5ceb53b6 100644
--- a/docs/public/execution/run-configuration.mdx
+++ b/docs/public/execution/run-configuration.mdx
@@ -27,7 +27,7 @@ goal = "Implement the login feature"
|---|---|---|
| `_version` | No (defaults to `1`) | Schema version. Must be `1` in the first pass. |
| `[workflow].graph` | No | Path to the Graphviz workflow file, relative to the TOML file's directory. Defaults to `workflow.fabro`. |
-| `[run].goal` | No | What the workflow should accomplish. Passed to agents and used in retrospectives. Can also be provided via `--goal` CLI flag or Graphviz graph `goal` attribute. |
+| `[run].goal` | No | What the workflow should accomplish. Passed to agents and available via `--goal` CLI flag or Graphviz graph `goal` attribute. |
Goal precedence: CLI `--goal` > `[run].goal` > Graphviz graph attribute.
diff --git a/docs/public/getting-started/dark-factory.mdx b/docs/public/getting-started/dark-factory.mdx
index 53a9bcf07..b078f4d81 100644
--- a/docs/public/getting-started/dark-factory.mdx
+++ b/docs/public/getting-started/dark-factory.mdx
@@ -25,7 +25,7 @@ The dark factory isn't a single tool or practice. It's a set of capabilities tha
**Checkpointed execution over black-box runs.** Git commits after every stage create an audit trail. When something goes wrong, you can inspect, revert, or fork from any point — without having watched the run live.
-**Continuous improvement over static processes.** Automatic retrospectives after every run feed a learning loop. Workflows get better over time, not just the code they produce.
+**Observability over black-box automation.** Durable event streams, checkpoints, conclusions, and stage outputs make each run inspectable after the fact. Workflows get better when teams can see what happened and adjust the graph.
## The human role in a dark factory
@@ -36,7 +36,7 @@ The dark factory doesn't eliminate engineering judgment. It redirects it:
| Writing code | Defining workflows and prompts |
| Reviewing diffs | Defining verification criteria |
| Debugging test failures | Designing fix loops |
-| Watching agent sessions | Reviewing retrospectives |
+| Watching agent sessions | Inspecting run traces |
| Manual quality checks | Tuning goal gates and evals |
The goal is to spend your time on the parts that require human judgment — what to build, how to verify it, and when something doesn't look right — while the factory handles the rest.
@@ -53,7 +53,7 @@ The goal is to spend your time on the parts that require human judgment — what
Build verification into your workflows.
-
- Automatic retrospectives for continuous improvement.
+
+ Inspect event streams, logs, and exported run state.
diff --git a/docs/public/getting-started/introduction.mdx b/docs/public/getting-started/introduction.mdx
index d8f74e30b..6e19969dc 100644
--- a/docs/public/getting-started/introduction.mdx
+++ b/docs/public/getting-started/introduction.mdx
@@ -16,7 +16,7 @@ Fabro replaces the prompt-wait-review loop with version-controlled workflow grap
- **Improve agent security** — Run agents in cloud sandboxes with full network and filesystem isolation. Keep untrusted code off your laptop and out of your production environment.
- **Run agents 24/7 at scale** — Fabro's API server queues and executes runs continuously in cloud sandboxes. Close your laptop — workflows keep running across as many concurrent runs as your infrastructure allows.
- **Guarantee code quality** — Layer deterministic verifications — test suites, linters, type checkers, LLM-as-judge — into your workflow graph. Failures trigger fix loops automatically.
-- **Achieve compounding engineering** — Automatic retrospectives after every run feed a continuous improvement loop. Your workflows get better over time, not just your code.
+- **Inspect every run** — Query durable event streams, checkpoints, conclusions, and stage outputs to understand what happened and improve the workflow.
- **Specify in natural language** — Define requirements as natural-language specs and let Fabro generate — and regenerate — implementations that conform to them.
diff --git a/docs/public/getting-started/why-fabro.mdx b/docs/public/getting-started/why-fabro.mdx
index e77605872..162ff4b8e 100644
--- a/docs/public/getting-started/why-fabro.mdx
+++ b/docs/public/getting-started/why-fabro.mdx
@@ -35,7 +35,7 @@ Fabro gives you a deterministic harness around non-deterministic AI. You define
Combine LLM-as-judge, test suites, third-party tools, and human review. Verifications act as an eval suite tailored to your organization, building confidence over time.
- Every tool call, agent turn, and shell command is captured in a unified event stream. Query run data with SQL via DuckDB and generate automatic retrospectives.
+ Every tool call, agent turn, and shell command is captured in a unified event stream. Query run data with SQL via DuckDB and inspect the full execution trail.
Licensed under MIT. Written in Rust with minimal dependencies. Runs on a single node with no databases to set up.
diff --git a/docs/public/images/web/retros-list.png b/docs/public/images/web/retros-list.png
deleted file mode 100644
index ded9ee2e8c7aa1883abd260594cf548731af51d9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3161440
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