Skip to content

Commit 24be157

Browse files
Merge pull request #207 from konjoai/claude/avo-supervisor-upgrades-h0fl7y
2 parents ee1e9cf + fd28926 commit 24be157

32 files changed

Lines changed: 1036 additions & 138 deletions

CHANGELOG.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,50 @@
1+
## [0.47.0] - AVO-inspired supervisor upgrades: attempt scoring, stall detection, candidate-set view
2+
3+
Three features scoped from a Claude.ai conversation reacting to NVIDIA's AVO paper
4+
(ARC-AGI-3 100% result), mapped onto lopi's existing retry-loop architecture. The
5+
scoping brief assumed a clean slate; discovery found lopi already had most of the
6+
underlying machinery (Progress-Gating A3's `ProgressGate`/`GainDecision` comparator,
7+
Eval-Execution-1's per-attempt scoring) under different sprint names, so this sprint's
8+
real work was narrower than the brief assumed — persist what was already computed
9+
live, add the one genuinely new signal (diff-thrash), and reuse the existing run-trace
10+
API rather than adding a new MCP tool. Full reasoning in `LEDGER.md`'s
11+
`AVO-Supervisor-1` entry.
12+
13+
### Added
14+
15+
- **Feature 1 — task-local attempt scoring.** `attempts.gain_decision` (new column,
16+
`crates/lopi-memory/src/schema.sql`) durably records the gain-gate's comparator
17+
verdict per attempt — `"promoted"` for an attempt whose score passed outright,
18+
or the A3 gain gate's own `gain`/`within_noise`/`regression`/`judge_unconfirmed`
19+
for a non-passing one. Previously computed live by `ProgressGate` and discarded
20+
when `run()` returned (`crates/lopi-agent/src/runner/progress.rs`,
21+
`test_phase.rs`). "Failed to beat the prior attempt" is now a distinct, queryable
22+
outcome from "failed outright."
23+
- **Feature 2 — stall/thrash detection (`TaskStatus::Stuck`).** New status variant
24+
(`crates/lopi-core/src/task_status.rs`), orthogonal to `Retrying`/`Failed`: fires
25+
when an attempt's diff is near-identical to the previous one (line-overlap ratio,
26+
`crates/lopi-agent/src/runner/stall.rs`) or the gain gate's non-gain streak hits a
27+
small threshold — both softer, earlier signals than A3's existing
28+
`no_progress_limit` termination guard, which is unchanged. Steers the *next*
29+
attempt's planning prompt with a summary of what plateaued (appended to the
30+
existing adaptive-retry evidence, gated the same way behind
31+
`AgentRunner::adaptive_retry`) instead of resending the bare goal string.
32+
Persisted to `tasks.stuck_at`/`tasks.stuck_reason` and surfaced in
33+
`lopi_get_stack_status`'s roster (and `lopi_get_task`/`lopi_list_tasks`) as a
34+
`stuck`/`stuck_reason` field independent of `status`, which stays `"running"` the
35+
whole time a task is in flight.
36+
- **Feature 3 — candidate-set view.** `GET /api/loop-engineering/runs/:id` (the
37+
existing Loop Health run-trace endpoint) now includes each attempt's
38+
`gain_decision`, so the attempt-by-attempt trace it already returns doubles as the
39+
scored candidate-set view — no new MCP tool or archive subsystem added; see the
40+
LEDGER entry for why that was scoped out.
41+
42+
### Changed
43+
44+
- `crates/lopi-core/src/task.rs` (512 lines with the new variant) split `TaskStatus`
45+
out into `task_status.rs`, mirroring the existing `task_source.rs` split, to stay
46+
under the 500-line CI file-size gate.
47+
148
## [0.46.1] - kiban pin bump v1.14.0 -> v1.19.0
249

350
`.konjo/kiban.ref` and `konjo-gate.yml`'s three `KIBAN_REF` sites (doc-staleness,

Cargo.lock

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ members = [
2424
resolver = "2"
2525

2626
[workspace.package]
27-
version = "0.46.0"
27+
version = "0.47.0"
2828
edition = "2021"
2929
# MSRV, by bisection — see rust-toolchain.toml's comment for the exact method
3030
# and the transitive dependency (`home` via `which`) that sets it.
@@ -101,25 +101,25 @@ tokio-util = { version = "0.7", features = ["rt"] }
101101
mimalloc = { version = "0.1", default-features = false }
102102
rand = "0.8"
103103

104-
lopi-core = { path = "crates/lopi-core", version = "0.46.0" }
105-
lopi-context = { path = "crates/lopi-context", version = "0.46.0" }
106-
lopi-git = { path = "crates/lopi-git", version = "0.46.0" }
107-
lopi-agent = { path = "crates/lopi-agent", version = "0.46.0" }
108-
lopi-memory = { path = "crates/lopi-memory", version = "0.46.0" }
109-
lopi-orchestrator = { path = "crates/lopi-orchestrator", version = "0.46.0" }
110-
lopi-ui = { path = "crates/lopi-ui", version = "0.46.0" }
111-
lopi-remote = { path = "crates/lopi-remote", version = "0.46.0" }
112-
lopi-webhook = { path = "crates/lopi-webhook", version = "0.46.0" }
113-
lopi-toon = { path = "crates/lopi-toon", version = "0.46.0" }
114-
lopi-ratelimit = { path = "crates/lopi-ratelimit", version = "0.46.0" }
115-
lopi-github = { path = "crates/lopi-github", version = "0.46.0" }
116-
lopi-spec = { path = "crates/lopi-spec", version = "0.46.0" }
117-
lopi-tools = { path = "crates/lopi-tools", version = "0.46.0" }
118-
lopi-skill = { path = "crates/lopi-skill", version = "0.46.0" }
119-
lopi-mcp = { path = "crates/lopi-mcp", version = "0.46.0" }
120-
lopi-index = { path = "crates/lopi-index", version = "0.46.0" }
121-
lopi-demo = { path = "crates/lopi-demo", version = "0.46.0" }
122-
lopi-oracle = { path = "crates/lopi-oracle", version = "0.46.0" }
104+
lopi-core = { path = "crates/lopi-core", version = "0.47.0" }
105+
lopi-context = { path = "crates/lopi-context", version = "0.47.0" }
106+
lopi-git = { path = "crates/lopi-git", version = "0.47.0" }
107+
lopi-agent = { path = "crates/lopi-agent", version = "0.47.0" }
108+
lopi-memory = { path = "crates/lopi-memory", version = "0.47.0" }
109+
lopi-orchestrator = { path = "crates/lopi-orchestrator", version = "0.47.0" }
110+
lopi-ui = { path = "crates/lopi-ui", version = "0.47.0" }
111+
lopi-remote = { path = "crates/lopi-remote", version = "0.47.0" }
112+
lopi-webhook = { path = "crates/lopi-webhook", version = "0.47.0" }
113+
lopi-toon = { path = "crates/lopi-toon", version = "0.47.0" }
114+
lopi-ratelimit = { path = "crates/lopi-ratelimit", version = "0.47.0" }
115+
lopi-github = { path = "crates/lopi-github", version = "0.47.0" }
116+
lopi-spec = { path = "crates/lopi-spec", version = "0.47.0" }
117+
lopi-tools = { path = "crates/lopi-tools", version = "0.47.0" }
118+
lopi-skill = { path = "crates/lopi-skill", version = "0.47.0" }
119+
lopi-mcp = { path = "crates/lopi-mcp", version = "0.47.0" }
120+
lopi-index = { path = "crates/lopi-index", version = "0.47.0" }
121+
lopi-demo = { path = "crates/lopi-demo", version = "0.47.0" }
122+
lopi-oracle = { path = "crates/lopi-oracle", version = "0.47.0" }
123123

124124
[package]
125125
name = "lopi"

0 commit comments

Comments
 (0)