@evo-hq/pi-evo 0.5.3 → 0.6.0
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.
- package/README.md +2 -0
- package/package.json +1 -1
- package/skills/discover/SKILL.md +41 -6
- package/skills/infra-setup/SKILL.md +1 -1
- package/skills/optimize/SKILL.md +105 -13
- package/skills/optimize/workflows/evo-optimize.js +1 -0
- package/skills/report/SKILL.md +48 -6
- package/skills/ship/SKILL.md +140 -0
- package/skills/subagent/SKILL.md +34 -2
package/README.md
CHANGED
|
@@ -25,6 +25,8 @@ skill needs one to run multiple experiments per round.
|
|
|
25
25
|
| `skills/discover/` | First-run setup: explore repo, propose optimization dimensions, build benchmark, run first experiment |
|
|
26
26
|
| `skills/optimize/` | The search loop: parallel subagents form hypotheses, edit, get scored, frontier picks next branch |
|
|
27
27
|
| `skills/subagent/` | Per-experiment brief contract for the optimize round's fanout |
|
|
28
|
+
| `skills/report/` | Terminal score chart mirroring the dashboard scatter plot |
|
|
29
|
+
| `skills/ship/` | Distill the best valid experiment into a clean mergeable change |
|
|
28
30
|
| `skills/infra-setup/` | Provider matrix for remote-sandbox backends (Modal, E2B, Daytona, etc.) |
|
|
29
31
|
|
|
30
32
|
## Versioning
|
package/package.json
CHANGED
package/skills/discover/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: discover
|
|
3
3
|
description: Initialize evo for the current repository by exploring the codebase, proposing unexplored optimization dimensions, constructing the benchmark inside a baseline worktree, and running the first experiment. Use when the user invokes /evo:discover, mentions setting up evo, wants to instrument a codebase for autonomous optimization, or asks to start a new evo run on a project.
|
|
4
4
|
argument-hint: <optional context about what to optimize>
|
|
5
|
-
evo_version: 0.
|
|
5
|
+
evo_version: 0.6.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Discover
|
|
@@ -25,6 +25,9 @@ evo plugin
|
|
|
25
25
|
│ │ ├── evo:optimize after discover commits the baseline -- drives the loop.
|
|
26
26
|
│ │ │ Args: subagents=N (read sizing-the-round FIRST),
|
|
27
27
|
│ │ │ autonomous, subagents-only, budget=N, stall=N
|
|
28
|
+
│ │ ├── evo:ship after the loop stops -- distills the best valid
|
|
29
|
+
│ │ │ experiment into a mergeable change (PR if remote,
|
|
30
|
+
│ │ │ else merge) + a mergeability report
|
|
28
31
|
│ │ ├── evo:finetuning task is finetuning / post-training / training a model
|
|
29
32
|
│ │ └── evo:infra-setup need a remote backend, pooled workspaces, lease/slot
|
|
30
33
|
│ │ management, or specific provider auth/setup
|
|
@@ -116,20 +119,20 @@ evo --version
|
|
|
116
119
|
The output must be exactly:
|
|
117
120
|
|
|
118
121
|
```
|
|
119
|
-
evo-hq-cli 0.
|
|
122
|
+
evo-hq-cli 0.6.0
|
|
120
123
|
```
|
|
121
124
|
|
|
122
125
|
Three outcomes:
|
|
123
126
|
|
|
124
127
|
1. **Matches exactly** — continue to step 1.
|
|
125
128
|
2. **Reports a different version** (`evo-hq-cli 0.4.2`, etc.) — the host refetched a newer/older skill bundle than the CLI on PATH. Drift breaks skills silently. Stop and tell the user:
|
|
126
|
-
> Your installed evo CLI is on a different version than this skill (`0.
|
|
129
|
+
> Your installed evo CLI is on a different version than this skill (`0.6.0`). Run:
|
|
127
130
|
> ```
|
|
128
|
-
> uv tool install --force evo-hq-cli==0.
|
|
131
|
+
> uv tool install --force evo-hq-cli==0.6.0
|
|
129
132
|
> ```
|
|
130
133
|
> Then re-invoke this skill.
|
|
131
134
|
3. **`command not found`, or reports a different package** (commonly `evo 1.x` — the unrelated SLAM tool) — the CLI isn't installed. Tell the user:
|
|
132
|
-
> `evo-hq-cli` isn't on your PATH. Install it: `uv tool install evo-hq-cli==0.
|
|
135
|
+
> `evo-hq-cli` isn't on your PATH. Install it: `uv tool install evo-hq-cli==0.6.0` (or `pipx install evo-hq-cli==0.6.0`). Then re-invoke this skill.
|
|
133
136
|
|
|
134
137
|
Do not try to auto-install. Host sandbox + network policy may block it; leaving the install as a user action keeps failure modes clear.
|
|
135
138
|
|
|
@@ -519,7 +522,39 @@ Document:
|
|
|
519
522
|
- Benchmark gaming risks identified during the Goodhart check
|
|
520
523
|
- Future experiment candidates (the non-picked dimensions from step 3)
|
|
521
524
|
|
|
522
|
-
## 13. Report
|
|
525
|
+
## 13. Report public-safe use case telemetry
|
|
526
|
+
|
|
527
|
+
Call the telemetry helper with a concrete but sanitized use-case summary. This
|
|
528
|
+
command is globally disabled when the user runs `evo telemetry off`; do not
|
|
529
|
+
branch on that yourself.
|
|
530
|
+
|
|
531
|
+
Write one short sentence that captures: workload/system shape, optimization
|
|
532
|
+
lever, and measured signal or failure mode. Add 3-6 lower-kebab-case tags for
|
|
533
|
+
the workload, lever, metric/failure mode, runtime category, or benchmark source.
|
|
534
|
+
Avoid filler-only tags like `optimization`, `benchmark`, or `codebase`.
|
|
535
|
+
|
|
536
|
+
```bash
|
|
537
|
+
evo telemetry usecase \
|
|
538
|
+
--description "<public-safe, concrete use case summary>" \
|
|
539
|
+
--tag <tag> --tag <tag> --tag <tag>
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Privacy rule: do not include repo names, company names, customer names, file
|
|
543
|
+
paths, benchmark commands, prompt text, task examples, secrets, URLs, internal
|
|
544
|
+
system names, environment names, raw error logs, or exact dataset/item names.
|
|
545
|
+
Generalize private nouns instead of deleting useful signal: "internal billing
|
|
546
|
+
agent" becomes "workflow agent"; "Acme support router" becomes "support-style
|
|
547
|
+
routing agent".
|
|
548
|
+
|
|
549
|
+
Good example:
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
evo telemetry usecase \
|
|
553
|
+
--description "Optimizing a tool-calling coding agent for higher task pass rate by tuning planner/retry behavior against an existing per-task eval." \
|
|
554
|
+
--tag coding-agent --tag tool-calling --tag retry-policy --tag pass-rate --tag existing-eval
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
## 14. Report to the user
|
|
523
558
|
|
|
524
559
|
End the skill by reporting in chat:
|
|
525
560
|
|
package/skills/optimize/SKILL.md
CHANGED
|
@@ -1,14 +1,51 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: optimize
|
|
3
|
-
description: Drive structured autoresearch iteration after evo:discover and the baseline commit
|
|
3
|
+
description: Drive structured autoresearch iteration after evo:discover and the baseline commit. Use when the user invokes /evo:optimize or asks to try ideas, try variants, run experiments, use available GPUs, improve the current best/frontier, continue an evo search, or compare candidate changes in an evo workspace. The orchestrator plans and spawns optimization subagents; candidate edits/runs belong to those subagents. Width is set via subagents=N (1 for serial workloads, larger for parallel); the loop's structural value applies at any width.
|
|
4
4
|
argument-hint: "[subagents=N] [budget=N] [stall=N]"
|
|
5
|
-
evo_version: 0.
|
|
5
|
+
evo_version: 0.6.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
Run the `evo` optimization loop. Each round, the orchestrator writes structured briefs and spawns subagents that execute within them. Each subagent is semi-autonomous: it reads the pointer traces, forms the concrete edit, runs experiments, and can iterate within its branch. Runs until interrupted or the stall limit is reached.
|
|
9
9
|
|
|
10
10
|
**This skill is the canonical loop for ALL post-discover work — including serial workloads.** If the workspace's resource profile forces width 1 (single GPU, single-process benchmark, etc.), you still invoke `/evo:optimize` -- just pass `subagents=1`. The loop's value is the STRUCTURE around each experiment (scan-subagent cross-cutting analysis between rounds, verifier pre/post hooks via the subagent skill, ideator spawning on stall, frontier reconciliation, stop-hook discipline), NOT just parallelism. Bypassing optimize because "I'm running serial work anyway" loses every piece of that structure -- you've reverted to ad-hoc experiment iteration with none of evo's loop benefits, just the bookkeeping.
|
|
11
11
|
|
|
12
|
+
**Plain-language trigger.** In an initialized evo workspace, casual user wording
|
|
13
|
+
like "try a couple ideas", "try different variants", "use the available GPUs",
|
|
14
|
+
"continue from the current best", or "see what improves" is an optimize request
|
|
15
|
+
unless the user explicitly asks for a read-only report. Do not treat the lack of
|
|
16
|
+
a slash command as permission to bypass this protocol. Loading this skill from
|
|
17
|
+
plain-language wording is also explicit authorization to use the host's
|
|
18
|
+
subagent mechanism for the resolved round width; the user does not have to say
|
|
19
|
+
"spawn subagents" or "parallel agents" separately.
|
|
20
|
+
|
|
21
|
+
**Candidate-work delegation invariant.** The orchestrator does not create, edit,
|
|
22
|
+
or run candidate experiments for the round. For `subagents=N`, write N briefs
|
|
23
|
+
and spawn N optimization subagents; each spawned subagent allocates its own
|
|
24
|
+
experiment with `evo new`, edits only its worktree, and runs `evo run`. Do not
|
|
25
|
+
simulate a subagent round by running `evo new`, editing files, or launching
|
|
26
|
+
multiple `evo run` commands from the orchestrator, even if that would be faster
|
|
27
|
+
or easier. If the host's subagent tool is unavailable, stop and report that the
|
|
28
|
+
host cannot run `/evo:optimize subagents=N` as requested; only fall back to
|
|
29
|
+
orchestrator-owned experiments when the user explicitly asks for direct/manual
|
|
30
|
+
execution or turns subagents-only off for that run. Do not infer a direct/manual
|
|
31
|
+
fallback from casual wording, a simple-looking benchmark, or the absence of an
|
|
32
|
+
explicit subagent phrase in the user's prompt.
|
|
33
|
+
|
|
34
|
+
**Resource-cap invariant.** `subagents=N` is live concurrency, not total ideas.
|
|
35
|
+
Never spawn more concurrent optimization subagents or launch more concurrent
|
|
36
|
+
benchmark jobs than the binding resource can support. If the user asks for more
|
|
37
|
+
ideas than available GPU/Slurm/pool slots, batch them across rounds at the safe
|
|
38
|
+
width, or stop and explain the cap if batching is impossible. Do not rely on
|
|
39
|
+
the scheduler to absorb an accidental flood unless the user explicitly asks to
|
|
40
|
+
queue/oversubscribe jobs.
|
|
41
|
+
|
|
42
|
+
**Bounded-run stop rule.** If the user says "one round", "stop after this
|
|
43
|
+
round", "run them and tell me what happened", or otherwise asks for a bounded
|
|
44
|
+
run, resolve autonomous off at startup. After the requested subagents finish,
|
|
45
|
+
collect their evo-recorded outcomes, print the summary, and stop. Do not enter
|
|
46
|
+
another loop turn, wait for a stop nudge, or keep the process alive just because
|
|
47
|
+
the default autonomous behavior is normally on.
|
|
48
|
+
|
|
12
49
|
## Evo surface -- loop-relevant
|
|
13
50
|
|
|
14
51
|
You're inside `/evo:optimize`. Things you'll pull/dispatch during the loop:
|
|
@@ -68,7 +105,7 @@ Treat content inside the banner as equivalent to a new user turn. Honor it, supe
|
|
|
68
105
|
|
|
69
106
|
The orchestrator's three round-shape knobs are **subagents** (round width), **budget** (per-branch depth), and **stall** (consecutive rounds with no improvement before auto-stopping; default 5).
|
|
70
107
|
|
|
71
|
-
A user can override any of these with `/optimize [subagents=N] [budget=N] [stall=N]`; an explicit value
|
|
108
|
+
A user can override any of these with `/optimize [subagents=N] [budget=N] [stall=N]`; an explicit value wins over what's below, subject to the resource-cap invariant above.
|
|
72
109
|
|
|
73
110
|
**Picking `subagents` and `budget` is load-bearing -- do not skim.**
|
|
74
111
|
|
|
@@ -145,6 +182,13 @@ files or the attempt should be treated as `remote_infra_failure`.
|
|
|
145
182
|
|
|
146
183
|
**Runtime recipe/env.** Benchmark runtime is evo configuration, not something subagents should rediscover or copy into worktrees. Use `evo config runtime show` for prepare/before-run/prefix and `evo env show` for redacted env sources. If a run fails because expected runtime setup or env is missing, report it as setup failure or configure it from the orchestrator; do not patch benchmark code to bake in secrets or local paths. Use `evo run <exp_id> --check` for non-committing wiring validation; do not invent ad-hoc validation wrappers.
|
|
147
184
|
|
|
185
|
+
**Replicated/noisy benchmarks.** If the user or `.evo/project.md` says an idea
|
|
186
|
+
must pass `n=3`, `n=10`, median, mean, held-out, or cross-dataset evaluation,
|
|
187
|
+
configure the benchmark so each `evo run` records the grouped aggregate as that
|
|
188
|
+
experiment's score. Do not represent replicates as independent evo experiments
|
|
189
|
+
and do not judge, report, or promote an idea by its best replicate. The frontier
|
|
190
|
+
and best path must see the same aggregate statistic the user uses for decisions.
|
|
191
|
+
|
|
148
192
|
**CLI reference.** If you are unsure which command to use, read `plugins/evo/skills/references/cli-quick-reference.md`. It is the canonical command map; this skill only repeats the high-frequency commands.
|
|
149
193
|
|
|
150
194
|
## Prerequisites
|
|
@@ -296,7 +340,15 @@ Spawn all subagents in a **single batch** using your host's parallel-subagent to
|
|
|
296
340
|
Per host, the spawn shape matters because evo's loop depends on *completion notifications* arriving turn-by-turn (so the orchestrator can review each subagent's outcome and decide round 2):
|
|
297
341
|
|
|
298
342
|
- **claude-code** — fire one `Bash(run_in_background=true)` call per brief. The bash invokes the subagent (the host's `Task` tool, or any equivalent that runs the brief to completion). Each backgrounded bash returns immediately and the runtime delivers a `<task-notification>` at a later turn when each subagent finishes. Do NOT wait on subagents inline; fan them out, then exit your current turn — notifications arrive in subsequent turns.
|
|
299
|
-
- **codex** —
|
|
343
|
+
- **codex** — call `spawn_agent` once per optimization brief. If `spawn_agent`
|
|
344
|
+
is deferred or not visible yet, first use Codex's tool-discovery tool
|
|
345
|
+
(`tool_search`) with a query like `spawn agent subagent`, then call the
|
|
346
|
+
discovered spawn tool. The optimize skill's plain-language trigger is
|
|
347
|
+
sufficient authorization for this; do not stop or fall back to direct edits
|
|
348
|
+
merely because the user did not explicitly write "spawn subagents." The
|
|
349
|
+
candidate worker prompt is the one that starts with the mandatory "First,
|
|
350
|
+
load and follow..." sentence below. A later read-only scan subagent does not
|
|
351
|
+
count toward the round width.
|
|
300
352
|
- **hermes** — `terminal(background=true)`; notifications delivered similarly.
|
|
301
353
|
- **openclaw** — `sessions_spawn deliver:false`; notifications delivered similarly.
|
|
302
354
|
- **opencode** — *batch-parallel only* (no background notifications). Fire N `task` calls in ONE assistant message; all `tool_result`s return together when the slowest finishes. Plan all parallel work (including non-task tools) in that single message — opencode cannot interleave reasoning across turns while subagents run.
|
|
@@ -318,6 +370,11 @@ Then append:
|
|
|
318
370
|
|
|
319
371
|
The opening sentence is non-negotiable — without it small models often skip the evo CLI and edit files directly, which produces no committed experiments and breaks the round.
|
|
320
372
|
|
|
373
|
+
Before leaving step 5, check yourself: the number of optimization subagents you
|
|
374
|
+
spawned must equal the resolved `subagents=N` unless the user explicitly
|
|
375
|
+
requested a smaller direct/manual run. Scan/analysis subagents are separate and
|
|
376
|
+
do not count toward this number.
|
|
377
|
+
|
|
321
378
|
### 6. Collect results and update state
|
|
322
379
|
|
|
323
380
|
After all subagents complete:
|
|
@@ -331,16 +388,18 @@ After all subagents complete:
|
|
|
331
388
|
|
|
332
389
|
**Cross-cut the round's evaluated nodes.** Before moving on, read `experiments/<id>/attempts/NNN/outcome.json` for each evaluated node from this round. The structured `gates[]` entries and `benchmark.result` let you spot shared failure modes the subagent summaries may have glossed over (e.g., three different subagents produced evaluated nodes whose gate_failures all included `refund_flow` -- that's a structural constraint the next round must confront, not three independent bad hypotheses).
|
|
333
390
|
|
|
334
|
-
Prune
|
|
391
|
+
Prune branches you have decided are exhausted:
|
|
335
392
|
```bash
|
|
336
|
-
evo prune <exp_id> --reason "exhausted:
|
|
393
|
+
evo prune <exp_id> --exhausted --reason "exhausted: <why>"
|
|
337
394
|
```
|
|
338
395
|
|
|
339
|
-
`evo prune` accepts `committed` or `evaluated` nodes
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
396
|
+
`evo prune` accepts `committed` or `evaluated` nodes:
|
|
397
|
+
- `--exhausted` (default/legacy): stop branching here; the result still counts.
|
|
398
|
+
- `--invalid`: this result is wrong; exclude it and descendants from best/frontier.
|
|
399
|
+
- `--yes`: required only with `--invalid` on the current best valid spine.
|
|
400
|
+
|
|
401
|
+
Use `--invalid --yes` when you have proven a best-spine result or ancestor is
|
|
402
|
+
wrong. **Never `evo discard` a committed node** -- prune preserves its commit.
|
|
344
403
|
|
|
345
404
|
If a previously-pruned (or discarded-then-restored) node is worth revisiting:
|
|
346
405
|
```bash
|
|
@@ -444,18 +503,51 @@ Proposals are advisory, not mandatory. If none look better than what step 3's sc
|
|
|
444
503
|
- User hasn't interrupted
|
|
445
504
|
- Score hasn't reached the theoretical maximum
|
|
446
505
|
|
|
506
|
+
To continue, go back to step 1.
|
|
507
|
+
|
|
447
508
|
**Stop** if:
|
|
448
509
|
- Stall counter >= stall limit (N consecutive rounds with no improvement)
|
|
449
510
|
- Score reached theoretical maximum (1.0 for max metric, 0.0 for min metric)
|
|
450
511
|
- User interrupted
|
|
451
512
|
|
|
452
|
-
On stop,
|
|
513
|
+
On stop, the loop is done -- do not go back to step 1. Print a final summary:
|
|
453
514
|
- Best score achieved and experiment ID
|
|
454
515
|
- Total experiments run across all rounds
|
|
455
516
|
- The winning diff: `evo diff <best_exp_id>`
|
|
456
517
|
- Suggested next steps if the score hasn't converged
|
|
518
|
+
- **How to land it:** point the user at `/evo:ship` to turn the winning
|
|
519
|
+
experiment into a mergeable change (a PR when the repo has a remote, else a
|
|
520
|
+
merge into the working branch). The raw winning diff is not the artifact to
|
|
521
|
+
merge by hand -- `/evo:ship` distills it to the minimal clean change and
|
|
522
|
+
attaches a mergeability report. Mention this whenever the run produced a
|
|
523
|
+
committed experiment that beats the baseline.
|
|
524
|
+
|
|
525
|
+
### 8. Report evo-side feedback when evo itself went wrong
|
|
526
|
+
|
|
527
|
+
Use feedback for evo product/orchestration issues, not for ordinary bad
|
|
528
|
+
experiments. Good triggers: confusing CLI behavior, subagent handoff failures,
|
|
529
|
+
workflow/meta-controller mistakes, recovery that failed, remote backend handling
|
|
530
|
+
that was hard to diagnose, or an evo policy/gate that blocked the wrong thing.
|
|
531
|
+
The command is anonymous and no-ops when telemetry is off; do not branch on that.
|
|
532
|
+
|
|
533
|
+
Keep the report public-safe but actionable enough for the evo backend team to
|
|
534
|
+
reproduce the case. Include the phase, what you expected evo to do, what it did,
|
|
535
|
+
and a generic repro shape. Do not include repo names, company names, file paths,
|
|
536
|
+
commands, prompt text, raw logs, URLs, secrets, dataset names, or exact task
|
|
537
|
+
examples. If the issue is tied to a specific evo experiment, include its
|
|
538
|
+
anonymous experiment id with `--exp-id`.
|
|
457
539
|
|
|
458
|
-
|
|
540
|
+
```bash
|
|
541
|
+
evo telemetry feedback \
|
|
542
|
+
--exp-id exp_0007 \
|
|
543
|
+
--kind orchestration \
|
|
544
|
+
--phase optimize \
|
|
545
|
+
--summary "Subagent completed but the orchestrator did not collect its evaluated result before writing the next round briefs." \
|
|
546
|
+
--expected "Round collection should wait for all dispatched subagents or clearly report the missing one." \
|
|
547
|
+
--actual "The next round was planned from partial results, leaving one evaluated node out of the pattern scan." \
|
|
548
|
+
--repro "Run optimize with multiple subagents on a workspace where one branch finishes after the first completion notification." \
|
|
549
|
+
--tag optimize-loop --tag subagent-handoff --tag collection
|
|
550
|
+
```
|
|
459
551
|
|
|
460
552
|
## Polling discipline
|
|
461
553
|
|
|
@@ -553,6 +553,7 @@ function metaPrompt(ctx, intervalS, reported, journal) {
|
|
|
553
553
|
'- Dead direction / ignored mechanism: annotations repeatedly naming a mechanism the recent work ignores, or a direction that keeps regressing. BRIEF HINT.',
|
|
554
554
|
'- Heading toward failure (STOP): an in-flight experiment that is CLEARLY doomed or wasting the budget — a divergent / NaN / flatlined progress metric; projected completion beyond the remaining time budget; or a known-fatal signature (e.g. output the scorer cannot parse; a silent resource mis-placement that tanks throughput with no error; a corrupt input/format that invalidates the result). HIGH PRECISION ONLY: default to NOT stopping — recommend a STOP only with concrete evidence that finishing is wasted, and only for an experiment still `active`. Emit a stop with: expId; failureClass (build = the build/produce step is broken; eval = artifact is fine but scoring/serving is wrong; hypothesis = it runs but won\'t help); reason (the diagnosis + the evidence you saw); fixHint (what the NEXT experiment must change).',
|
|
555
555
|
'For STOPs you stay READ-ONLY: do NOT run `evo abort` / `evo discard` yourself. A gated enforcer acts on each stop — it aborts the run + its subprocess tree, annotates your diagnosis (so it outlives the worktree and feeds the next round), and discards with the failureClass so the partial artifact is preserved. A STOP is a diagnosed, recoverable stop, never a silent kill.',
|
|
556
|
+
'If you observe an evo workflow/meta-controller defect (missed collection, wrong prompt handoff, recovery confusion, bad stop/enforcer behavior), you MAY run `evo telemetry feedback --kind workflow --phase meta ...` with public-safe summary/expected/actual/repro/tags before returning. This is anonymous and no-ops when telemetry is off. Do NOT report ordinary bad experiments, raw logs, paths, commands, repo names, URLs, secrets, or prompt text.',
|
|
556
557
|
'',
|
|
557
558
|
'HARNESS CONTROL (your distinctive power): you may restructure the optimize workflow itself, live, when you judge it will help — edits apply directly (free will) and take effect next round. Current harness state: ' + JSON.stringify(harnessSummary()) + '.',
|
|
558
559
|
'harnessEdits ops: (1) set-knob {knob: width|budget|stall|ideateEvery|ideateStall, value} — retune the loop (widen the round, deepen branches, change the stall limit or ideation cadence). (2) toggle-phase {phaseName: scan|ideate, enabled} — turn a phase off/on (e.g. skip scan when traces are uninformative; force ideation early). (3) set-prompt {target: state|scan|aggregate|brief|implement|run|ideator|collect|preverify|audit, mode: append|replace, text} — edit the prompt that step uses. Appends ACCUMULATE as standing directives (the current ones are visible in the harness state above — do not re-add them); replace swaps the base wholesale. Use preverify/audit to harden the verifier when you spot a cheat pattern the audit missed. (4) inject-step {at: before-scan|after-scan|before-brief|after-collect, text, label} — add an extra agent step at that seam each round. Every edit needs a rationale citing the evidence.',
|
package/skills/report/SKILL.md
CHANGED
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: report
|
|
3
|
-
description:
|
|
4
|
-
evo_version: 0.
|
|
3
|
+
description: Read-only evo run reporting. Use when the user invokes /evo:report, asks what happened overnight, asks what improved recently, asks for the best/frontier candidates, asks for a quick score chart without opening the dashboard, or wants the scatter plot in chat output. Never run benchmarks, gates, Slurm commands, evo run, or ad-hoc verification scripts for report requests.
|
|
4
|
+
evo_version: 0.6.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Report
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Report the current evo workspace from recorded state only. A report request is
|
|
10
|
+
read-only, even if the user phrases it casually as "what happened?", "what got
|
|
11
|
+
better?", "what should I pay attention to?", or "I just woke up".
|
|
12
|
+
|
|
13
|
+
Do not spend compute while reporting:
|
|
14
|
+
|
|
15
|
+
- Do not run `evo run`, `evo gate check`, benchmark commands, or project eval
|
|
16
|
+
scripts.
|
|
17
|
+
- Do not run `python bench.py`, `python slurm_eval.py`, `sbatch`, `srun`,
|
|
18
|
+
`squeue`, `sacct`, or `scancel` to verify a result.
|
|
19
|
+
- Do not create launcher, monitor, parsing, or analysis scripts.
|
|
20
|
+
- Do not edit files.
|
|
21
|
+
|
|
22
|
+
Use stored evo state instead: `evo report`, `evo status`, `evo tree`,
|
|
23
|
+
`evo frontier`, `evo show <id>`, `evo diff <id>`, and immutable artifacts under
|
|
24
|
+
`.evo/run_*/experiments/<exp>/attempts/<NNN>/`.
|
|
25
|
+
|
|
26
|
+
For chart requests, render the dashboard's scatter plot as a colored terminal
|
|
27
|
+
block, one chart per run, sized to the current terminal.
|
|
10
28
|
|
|
11
29
|
## What it shows
|
|
12
30
|
|
|
13
31
|
Mirrors the web dashboard's score scatter (left rail of `evo dashboard`):
|
|
14
32
|
|
|
15
33
|
- X = experiment creation order, Y = score
|
|
16
|
-
- Dot color by status: green = committed, red = failed, purple = active, grey = pending / evaluated / discarded / pruned
|
|
17
|
-
- ★ marks the current best committed experiment
|
|
34
|
+
- Dot color by status: green = committed valid result, red = failed, purple = active, grey = pending / evaluated / discarded / pruned
|
|
35
|
+
- ★ marks the current best valid committed-result experiment. `pruned` with `prune_kind=exhausted` can still be best; `prune_kind=invalid` and its descendants cannot.
|
|
18
36
|
- Yellow ring on dots that sit on the best-path spine (root → best)
|
|
19
|
-
- Yellow stair line traces cumulative-best across committed experiments
|
|
37
|
+
- Yellow stair line traces cumulative-best across valid committed-result experiments
|
|
20
38
|
- ○ at the baseline for experiments that have no score yet (active / pending)
|
|
21
39
|
|
|
22
40
|
Every run in the workspace is rendered, stacked top-to-bottom, with a header line showing `run_id · target · metric`.
|
|
@@ -41,3 +59,27 @@ Flags:
|
|
|
41
59
|
- For one-off score lookups, `evo status` or `evo show <id>` is faster.
|
|
42
60
|
- For navigating the tree shape, `evo tree` is the right command.
|
|
43
61
|
- For interactive exploration (click a dot, open a drawer), point the user at `evo dashboard` instead.
|
|
62
|
+
|
|
63
|
+
## Overnight / Improvement Reports
|
|
64
|
+
|
|
65
|
+
When the user asks what happened recently or what improved, summarize from
|
|
66
|
+
recorded evo state:
|
|
67
|
+
|
|
68
|
+
1. Run `evo status`, `evo frontier`, and `evo tree`.
|
|
69
|
+
2. Use `evo show <id>` for the best node and any recent committed/evaluated
|
|
70
|
+
nodes you mention.
|
|
71
|
+
3. Use `evo diff <id>` only to explain what changed in a recorded experiment.
|
|
72
|
+
4. If you need benchmark details, read the existing `outcome.json`,
|
|
73
|
+
`benchmark.log`, or declared artifacts for that experiment. Treat missing
|
|
74
|
+
artifacts as "not recorded", not as permission to rerun.
|
|
75
|
+
|
|
76
|
+
Report:
|
|
77
|
+
|
|
78
|
+
- best current experiment and score;
|
|
79
|
+
- score delta versus baseline or parent;
|
|
80
|
+
- top candidates/frontier if relevant;
|
|
81
|
+
- failed/evaluated nodes that need attention;
|
|
82
|
+
- any caveats about gates, missing held-out checks, or tied candidates.
|
|
83
|
+
|
|
84
|
+
If the user wants fresh validation or reruns, ask them to explicitly start a new
|
|
85
|
+
optimization or evaluation command. Do not infer that from a report request.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ship
|
|
3
|
+
description: Land the winning experiment from an evo run as a clean, mergeable change -- open a PR when the repo has a remote, otherwise merge into the working branch. Distills the best-scoring experiment down to the minimal diff that reproduces its behaviour, shaped for the qualities a maintainer merges on (scope discipline, test integrity, style adherence), then attaches an advisory mergeability report. Use when the user invokes /evo:ship, asks to land/merge/ship the best result, or wants to turn a finished optimization into a pull request.
|
|
4
|
+
evo_version: 0.6.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ship
|
|
8
|
+
|
|
9
|
+
Turn a finished evo run into a change a maintainer would merge.
|
|
10
|
+
|
|
11
|
+
The optimize loop leaves a tree of committed experiments. The winning worktree
|
|
12
|
+
diff is not mergeable as-is: it carries debug prints, search-process churn,
|
|
13
|
+
over-broad edits, and sometimes a test that was relaxed to clear a gate. Shipping
|
|
14
|
+
is the step that re-derives the *minimal clean change* reproducing the winning
|
|
15
|
+
behaviour, lands it the way the repo expects (PR or merge), and reports how
|
|
16
|
+
mergeable it is.
|
|
17
|
+
|
|
18
|
+
Correctness is the floor, not the goal. The score says the behaviour works; this
|
|
19
|
+
skill decides whether the *diff* is fit to merge.
|
|
20
|
+
|
|
21
|
+
## Invocation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
/evo:ship # ship the auto-selected winner
|
|
25
|
+
/evo:ship exp_0042 # ship a specific experiment instead
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Stage 1 -- Select the winner
|
|
29
|
+
|
|
30
|
+
Pick the experiment to ship, then confirm it with the user before touching their
|
|
31
|
+
tree.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
evo status # current best valid score + counts
|
|
35
|
+
evo report # top valid experiments table + score chart
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- The default winner is the highest-scoring valid result in the graph history,
|
|
39
|
+
not the frontier. `evo frontier` is for choosing where to branch next; it can
|
|
40
|
+
exclude an exhausted branch whose score is still the right thing to ship. An
|
|
41
|
+
explicit `exp_id` argument overrides auto-selection.
|
|
42
|
+
- A shippable winner must be valid: `committed`, or `pruned` with
|
|
43
|
+
`prune_kind=exhausted`, with a commit and score, no `gate_result === false`,
|
|
44
|
+
and no invalid-pruned ancestor. Never select `discarded`, `failed`, `active`,
|
|
45
|
+
`evaluated`, legacy-pruned nodes with no `prune_kind`, `prune_kind=invalid`, or
|
|
46
|
+
descendants of invalid-pruned nodes. If no valid candidate exists, stop and
|
|
47
|
+
report why nothing is safe to ship.
|
|
48
|
+
- Resolve the run's root (baseline) node, then show the cumulative change:
|
|
49
|
+
```bash
|
|
50
|
+
evo diff <root_id> <winner_id> # target-scoped cumulative diff, baseline -> winner
|
|
51
|
+
```
|
|
52
|
+
For changes outside the benchmark target, diff the commits directly
|
|
53
|
+
(`git diff <baseline_commit> <winner_commit>`); each node carries `.commit`.
|
|
54
|
+
- Present a one-screen summary: winner id, score baseline -> winner (delta),
|
|
55
|
+
the winning hypothesis, and a diffstat. Get a go before proceeding.
|
|
56
|
+
|
|
57
|
+
## Stage 2 -- Distill to a mergeable change
|
|
58
|
+
|
|
59
|
+
Work on a fresh branch off the user's current HEAD, not in the experiment
|
|
60
|
+
worktree. Re-derive the change so it stands on its own:
|
|
61
|
+
|
|
62
|
+
- **Scope restraint.** Keep only the files and lines the behaviour needs. Drop
|
|
63
|
+
experiment scaffolding, debug logging, commented-out attempts, and churn the
|
|
64
|
+
search introduced and then abandoned. Smaller, local diffs merge; sprawl does
|
|
65
|
+
not.
|
|
66
|
+
- **Test integrity.** If the search weakened, skipped, or deleted a test to clear
|
|
67
|
+
a gate, restore it. New behaviour that changes outputs needs a test that
|
|
68
|
+
covers it. Never ship a green benchmark that rode on a loosened test -- call it
|
|
69
|
+
out instead.
|
|
70
|
+
- **Mechanical cleanliness.** Match the repo's formatter and linter. No stray
|
|
71
|
+
whitespace, no reordered imports unless the repo does that.
|
|
72
|
+
- **Codebase adherence.** Match surrounding naming, error handling, and structure.
|
|
73
|
+
The diff should read like the file it lands in.
|
|
74
|
+
|
|
75
|
+
Then confirm the behaviour survived the distillation:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
evo run <winner_id> --check # or the project's benchmark / test command
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If the distilled change no longer reproduces the winning score, do not paper over
|
|
82
|
+
it -- report the gap (which part of the experiment diff was load-bearing) and let
|
|
83
|
+
the user decide. Best-effort means honest about what could not be cleaned up, not
|
|
84
|
+
silently shipping the raw worktree.
|
|
85
|
+
|
|
86
|
+
## Stage 3 -- Land
|
|
87
|
+
|
|
88
|
+
Detect how the repo expects changes to arrive:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git remote -v
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- **Remote present** -> open a pull request. Commit the distilled change on its
|
|
95
|
+
branch, push, and `gh pr create` with the mergeability report (Stage 4) as the
|
|
96
|
+
body. Do not push or open the PR without the user's go.
|
|
97
|
+
- **No remote** -> merge the distilled change into the user's working branch as a
|
|
98
|
+
single clean commit. Do not force, do not rewrite existing history.
|
|
99
|
+
|
|
100
|
+
The landed commit message carries provenance: the winning experiment id, the
|
|
101
|
+
score delta, and the one-line hypothesis. State what changed and why it is safe;
|
|
102
|
+
do not narrate the search process.
|
|
103
|
+
|
|
104
|
+
## Stage 4 -- Mergeability report (advisory)
|
|
105
|
+
|
|
106
|
+
Always produce the report. It never blocks the merge -- it tells the user, and a
|
|
107
|
+
future reviewer, how mergeable the change is across the axes a maintainer judges
|
|
108
|
+
on:
|
|
109
|
+
|
|
110
|
+
- **Technique** -- what the change actually does to move the score, named
|
|
111
|
+
concretely (the algorithm, data structure, or mechanism), not the search
|
|
112
|
+
story. Distilled from the winning hypothesis: "replaced the O(n^2) dedup with a
|
|
113
|
+
hash set", not "exp_0042 improved throughput". This is what a reviewer reads
|
|
114
|
+
first.
|
|
115
|
+
- **Behavioural correctness** -- score baseline -> shipped (delta); benchmark
|
|
116
|
+
status after distillation.
|
|
117
|
+
- **Regression safety** -- full test suite result on the distilled change.
|
|
118
|
+
- **Scope** -- files touched, diff size, whether the change stays local.
|
|
119
|
+
- **Test correctness** -- explicit yes/no on whether any test was modified,
|
|
120
|
+
weakened, or removed, with detail; whether new behaviour is covered.
|
|
121
|
+
- **Mechanical cleanliness** -- formatter / linter status.
|
|
122
|
+
- **Codebase adherence** -- a note on style/convention fit.
|
|
123
|
+
|
|
124
|
+
Lead with a plain-language summary: what changed and why it is safe to merge. On
|
|
125
|
+
a remote repo this is the PR body. With no remote, print it and save it alongside
|
|
126
|
+
the run so the user can paste it into a review later.
|
|
127
|
+
|
|
128
|
+
## Guardrails (firm)
|
|
129
|
+
|
|
130
|
+
Everything above is method you can adapt to the repo. These are not:
|
|
131
|
+
|
|
132
|
+
- Never weaken, skip, or delete a test to make the change land. If the experiment
|
|
133
|
+
did, restore it and report it.
|
|
134
|
+
- Never ship invalid-pruned, legacy-pruned, discarded, failed, active,
|
|
135
|
+
evaluated, gate-failed, or invalid-lineage nodes. Only exhausted pruned nodes
|
|
136
|
+
remain normal ship candidates.
|
|
137
|
+
- Never push or open a PR without the user's explicit go.
|
|
138
|
+
- Never rewrite or force-overwrite existing history on the user's branch.
|
|
139
|
+
- Never ship the raw experiment worktree diff as-is when distillation failed --
|
|
140
|
+
report the gap instead.
|
package/skills/subagent/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: subagent
|
|
3
3
|
description: Protocol that evo optimization subagents follow when dispatched from /optimize. Auto-loaded by spawned subagents via their host's skill loader. The orchestrator may also invoke this skill to understand the brief shape its dispatched subagents expect + what they're required to emit -- useful when writing briefs or debugging a subagent's behavior.
|
|
4
|
-
evo_version: 0.
|
|
4
|
+
evo_version: 0.6.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Evo Subagent Protocol
|
|
@@ -234,6 +234,13 @@ evo run <exp_id>
|
|
|
234
234
|
|
|
235
235
|
This runs benchmark + gate and prints the result.
|
|
236
236
|
|
|
237
|
+
For noisy or replicated benchmarks, one `evo run` must represent the user's
|
|
238
|
+
decision statistic for the idea. If the brief, user, or `.evo/project.md` says
|
|
239
|
+
`n=3`, `n=10`, median, mean, held-out, or cross-dataset evaluation is required,
|
|
240
|
+
use the configured grouped benchmark path so the experiment records that
|
|
241
|
+
aggregate score. Do not create separate evo experiments for replicates, and do
|
|
242
|
+
not report or promote an idea by its best single replicate.
|
|
243
|
+
|
|
237
244
|
In remote-backend workspaces, if a prior `evo run <exp_id>` was interrupted
|
|
238
245
|
or the experiment is still `active`, run `evo run <exp_id>` again first. That
|
|
239
246
|
is the recovery path: evo will try to attach to the existing remote process and
|
|
@@ -335,6 +342,30 @@ Continue if budget remains AND (last outcome was committed, OR you have a meanin
|
|
|
335
342
|
|
|
336
343
|
Stop if budget exhausted, infra failure, or you've exhausted variations with no improvement.
|
|
337
344
|
|
|
345
|
+
### 9. Report evo-side feedback when evo itself blocked you
|
|
346
|
+
|
|
347
|
+
Use feedback for evo product/orchestration issues, not for ordinary bad
|
|
348
|
+
experiments. Good triggers: confusing `evo run` behavior, remote workspace
|
|
349
|
+
commands that were hard to recover from, verifier handoff problems, missing
|
|
350
|
+
state that prevented you from following the brief, or a policy/gate that blocked
|
|
351
|
+
the wrong thing. The command is anonymous and no-ops when telemetry is off.
|
|
352
|
+
|
|
353
|
+
Keep it public-safe and reproducible. Do not include repo names, company names,
|
|
354
|
+
file paths, commands, prompt text, raw logs, URLs, secrets, dataset names, or
|
|
355
|
+
exact task examples.
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
evo telemetry feedback \
|
|
359
|
+
--exp-id <YOUR_EXP_ID> \
|
|
360
|
+
--kind orchestration \
|
|
361
|
+
--phase subagent \
|
|
362
|
+
--summary "Remote experiment recovery was unclear after the run process detached." \
|
|
363
|
+
--expected "Re-running evo run should clearly say whether it resumed or needs a fresh experiment." \
|
|
364
|
+
--actual "The subagent could not tell whether the active attempt was recoverable." \
|
|
365
|
+
--repro "Use a remote backend, interrupt a long-running experiment, then ask a subagent to continue the same exp_id." \
|
|
366
|
+
--tag remote-backend --tag recovery --tag subagent
|
|
367
|
+
```
|
|
368
|
+
|
|
338
369
|
## Enriching traces
|
|
339
370
|
|
|
340
371
|
Check `.evo/meta.json` for `"instrumentation_mode"` (`"sdk"` or `"inline"`) to see which style the benchmark uses -- **stay consistent with that choice across iterations; do not flip styles mid-run.**
|
|
@@ -357,7 +388,8 @@ If your experiment needs an artifact that is slow to produce and stable across s
|
|
|
357
388
|
|
|
358
389
|
- Do NOT run `evo init` or `evo reset`
|
|
359
390
|
- `evo discard <your_exp_id> --reason "..."` is your explicit "abandon" action — use it for any *non-committed* node you've decided not to pursue further (pre-run realization, evaluated with a bad hypothesis, or unfixable infra failure). Discard deletes the worktree and branch; the node and its per-attempt artifacts stay in `.evo/` as a record of what was tried.
|
|
360
|
-
- If `evo discard` errors with **"cannot discard committed node ... use prune"** — the experiment cleared the gate and improved the score. You shouldn't be discarding it. Don't fight the error; the orchestrator owns committed-lineage decisions via `evo prune`.
|
|
391
|
+
- If `evo discard` errors with **"cannot discard committed node ... use prune"** — the experiment cleared the gate and improved the score. You shouldn't be discarding it. Don't fight the error; the orchestrator owns committed-lineage decisions via `evo prune --exhausted` or `evo prune --invalid`.
|
|
392
|
+
- If you discover a committed result is invalid (bad score calculation, benchmark gaming, weakened/deleted tests, failed inherited gate, or failed repro), report the exact node and evidence. Do not discard it; the orchestrator should mark it with `evo prune <id> --invalid --reason "..."` and add `--yes` only if evo says the node is on the current best spine.
|
|
361
393
|
- If `evo discard` errors with **"cannot discard active node ... pass --force"** — the run is still in flight. Wait for it to finish; don't `--force` unless you know what you're doing (the running process can still write a final outcome that contradicts the discard).
|
|
362
394
|
- If `evo discard` errors with **"cannot discard ... has non-discarded children"** — sibling/child experiments depend on this node's parent reference. Discard or commit-and-prune those first.
|
|
363
395
|
- Do NOT copy `.env` files, bake secrets into source, or hard-code local runtime paths. Runtime setup/env is configured by the orchestrator (`evo config runtime ...`, `evo env ...`) and injected into benchmark/gate processes. If a missing dependency, setup step, or key blocks evaluation, report setup failure.
|