FEATURES

Experiments.

Group branches into experiments, score outcomes, rank candidates, promote winners, and see exactly what changed.

Experiment groups

An experiment group collects channels that test the same question — e.g. "does a refined step fix the failure?" Each member is typically a fork from a shared source boundary, so every candidate starts from identical state and diverges only in what you changed.

  • Create an experiment, add members (channels), and let each candidate evolve independently.
  • Because forks share a recorded boundary, comparisons between members are fair by construction.

Outcomes and scoring

Each channel carries an outcome (e.g. success/failure, pass/fail) you set via PATCH /channels/{id}/outcome. Scores are computed from the events, tool results, and outcomes in the channel — the ranking is evidence-based, not vibes-based.

OperationWhat it does
set_outcomeMarks a channel's result (scored + ranked)
rank_experimentRanks the group's members by score
promote_channelPromotes a winner: marks outcome, closes the channel

Promotion

When a candidate wins, promotion records the decision durably — outcome, score, and lineage — and closes the channel. Actae does not merge branches back into the parent; promotion is the recorded verdict, and merging the code remains application-owned. The closed winner stays fully auditable.

What changed? The comparison view

For any two channels, Actae produces the structural diff: diff_states(left, right) collapses shared ancestry and shows per-side divergence (added, removed, changed), and the compare view assembles the combined document — state, config, tools, outputs, metrics — per side. This is the answer to "which fix worked?" as a diff, not a screenshot.

Complement it with the decision trail: lineage chain, immutable fork boundary, and tool-execution ledger per run.

Retention

Experiment and channel data follows deployment retention policy. Promote what you keep, delete what you don't — DELETE /channels/{id} removes a channel and its events.