Repository navigation
Releases: dxn111/EVOLV
Release list
v0.30.0
v0.30.0 — the mind gets a playbook, the pipeline gets a gate
This release gives the organism an explicit operating loop, a discoverable skill library, and a CI pipeline that refuses to ship unverified code.
System prompt + skills
- The base prompt is now an operating manual: frame → plan → inspect → mutate → verify → report, with a definition of done, failure recovery, and a decision guide for picking the right action.
- Action signatures are accurate (
move {from,to},edit_filehash requirement,complete_task.files,promote_candidate confirm,stage_candidatehash pinning). - Skills are discovered through a compact trigger index (bounded, profile-filtered); the full playbook is read only when it matches. Seven seeded skills ship with new and existing genomes:
systematic-debugging,test-driven-change,self-evolution-playbook,frontend-craft,repo-cartography,secure-by-default,workspace-steward.
Bugs fixed
move {"from": ...}works (the kernel only readpathbefore).complete_task {"files": ["a.go"]}no longer fails JSON decoding; both path lists and mutation objects are accepted.delete_filewith an empty path can no longer wipe the organism; organism root, source root, launcher, home and filesystem roots are refused for delete/move.- Plugin reload and re-evolve now retire old sandboxes instead of leaking timers and handlers.
evolve_toolreports JavaScript compile failures instead of claiming success and leaving a stale tool callable.- Typed tool-schema validation is deterministic (was map-order random).
promote_candidaterequires explicitconfirm:true; staging and testing do not.- The heartbeat loop is stoppable and waits for an in-flight dream, fixing a race in test teardown.
Release engineering
- New CI workflow: gofmt,
go vet, full tests, race detector on the core packages, and cross-builds for Linux/macOS/Windows. - Release builds now use
go.mod's Go version (the old workflow pinned Go 1.24 against a 1.26 module), run the test suite before publishing, validate the version, and support manual dispatch. make checkruns the same gate locally.
Verified
make checkgreen;go test -race ./internal/agent ./internal/server ./internal/workspacegreen.- Shuffled full suite green across repeated runs.
- Published Linux binary reports
evolv 0.30.0.
PR: #16
Full changelog: v0.29.0...v0.30.0
Binaries: Linux (amd64/arm64), macOS (amd64/arm64), Windows (amd64/arm64).
v0.29.0 — project-wide search
⌕ Search the whole project from the Workbench
- New search box in the Workbench sidebar: type → live results from every text file under the project root
- Case-insensitive, skip-list respected (
.git,node_modules,vendor, …), files > 1 MB skipped, capped at 200 hits with a clear "showing first 200" hint - Click a result → the file opens with the caret exactly on the match line, the match selected and the editor scrolled there
- New
/api/wb/searchendpoint + test
Verified live: 14/14 browser E2E (full workbench round-trip + search + jump-to-line + loop guard). go build + go vet + go test green across internal/...
Full Changelog: v0.28.0...v0.29.0
v0.28.0 — THE WORKBENCH (+ recompile loop fix)
🛠 The Workbench — a real dev environment for your project
The genome inspector edits the organism's own body. The Workbench opens your bound project (config.project_dir, or organism home when unbound):
- Lazy file tree — type icons, file sizes, per-directory expand, skip-list (
.git,node_modules,vendor, …), dirs-first sorting - In-place editor — open any text file, edit, ctrl+s writes straight to disk, dirty indicator, line/size statusbar, tab-indent
- Full CRUD — new file, new dir, rename/move, delete — all with sensible confirmations
- Live — the tree refreshes when anything else touches the project (the organism's own mutations included); the organism FEELS every workbench save via
fs:change - Hardened fs API (
/api/wb/{root,tree,read,write,mkdir,delete,rename}): path + symlink escape protection, 512 KB read / 1 MB write caps, binary files refused politely (415), root delete/move refused, rename clobber refused (409)
🔧 FIXED: the "recompiling shell" loop
A storm of shell-reload events (post-update seeding, dream bursts that rewrite the shell, genome rollbacks) could bounce the page on the recompile overlay forever. A sessionStorage loop guard now reloads exactly once per storm — one morph, one reload.
Verification
- 8 new server tests (tree/CRUD/escape/caps/binary/rename-clobber)
- Verified live: 12/12 browser E2E — open → tree → edit → ctrl+s → disk → rename → delete round-trip on a real bound project
go build+go vet+go testgreen across internal/...
Full Changelog: v0.27.0...v0.28.0
v0.27.0 — plugins run in cages now
Plugin permission isolation (route D: security)
evolve_pluginaccepts explicitperms:perms:["http","fs","toast"]— a plugin gets exactly the capabilities its manifest grants, nothing more.- Denied calls throw a catchable error naming the missing capability:
plugin "x" lacks permission "http" — re-evolve it with perms:["http"]— the plugin survives (try/catch works) and the error teaches the fix. - Perms persist in
plugin.jsonand are restored on every reload — a restart never widens a plugin's powers. log/on/everystay core (always available, no perm needed).- 4 new tests: denial matrix (http/fs/toast), grant path, manifest persist + reload round-trip, core-always-allowed. Full suite +
-racegreen.
go build + go vet + go test + go test -race green across internal/...
Full Changelog: v0.26.0...v0.27.0
v0.26.0 — tools grow type systems
Typed tool manifests (route D: a real tools ecosystem)
evolve_toolnow accepts a typed contract:schema: {param: "number"|"string"|"boolean"|"object"|"array"|"any"}.- Versioned manifests:
workspace/tools/<name>.json— name, version (auto-increments on re-evolve), description, schema, updated timestamp; written atomically. run_toolenforces the contract before the code runs: bad calls fail with a precise type error (arg "a" must be number, got string,missing required arg "b") instead of a JS stack trace.- New
list_toolsaction: full introspection — every grown tool with name, description, version and schema. - Manifest-less legacy tools keep working unchanged (back-compat).
- 5 new tests: manifest persistence + version bump, validation matrix (valid / wrong type / missing / nil args), back-compat, introspection, bad-schema rejection.
go build + go vet + go test green across internal/...
Full Changelog: v0.25.1...v0.26.0
v0.25.1 — the demo brain works its plan the new way
Demo brain drives plan_advance
- The mock planner demo now walks declare →
plan_advance→plan_advance×2 — one call = one step of progress — instead of re-sending the wholeset_planevery turn. - Scenario test rewritten to assert exact advance-block counts per stage.
- Verified live: 9/9 browser E2E — boot from plan.json at 1/4, then the sidebar checklist marches 2/4 → 3/4 → 4/4 over real WebSocket plan events, statuses correct at every step.
go build + go vet + go test green across internal/...
Full Changelog: v0.25.0...v0.25.1
v0.25.0 — the agent works its own plan
The agent works its own plan
plan_advanceaction — one call = one step of progress: marks the current step done (by index or the runningdoingstep) and pulls the nexttodointodoing. The brain loops through multi-step work without re-sending the whole plan.- Plan in the brain — the declared plan is injected into the system prompt every turn (
## CURRENT PLANwith[x]/[~]/[ ]markers), so the model always knows where it is in its own work — not just the UI. - Plan helpers factored (
publishPlan/countDone/hasDoing), plan bus event normalized for both actions. - 4 new tests: advance chain, index advance, bogus rejection (no plan / no doing / out-of-range index), prompt injection follows advances.
go build + go vet + go test green across internal/...
Full Changelog: v0.24.0...v0.25.0
v0.24.0 — The Agent Keeps a Plan
the agent keeps a plan (v0.24.0)
First slice of the P0 planner from the master plan: the agent is no longer reactive-only — it now declares, advances and persists multi-step task state.
set_plan action
- The agent can emit
{"action":"set_plan","title":"...","steps":[{"title":"...","status":"done|doing|todo"}]}at any point in a turn. - Statuses are normalized (anything unknown becomes
todo), blank steps are dropped, and the kernel answers with aplan updated: N/M steps donereceipt the model can reason over.
Persistent task state
- Plans are written atomically (temp + rename) to
workspace/plan.json— a mission interrupted by a restart picks its checklist back up on boot. - Served at
/api/plan, broadcast live on theplanbus topic.
Live Plan panel
- New sidebar section with a progress counter (
1/4) and ☑ done / ◐ doing / ○ todo per step, strikethrough on completion. - Boot-restored from plan.json on every page load; advances in real time as the agent updates its plan mid-conversation.
Demo brain
- Ask the mock provider to "make a plan" and it walks declare → progress → done across turns, so you can watch the checklist move.
Verified
- 3 unit tests (persistence + normalization, empty-plan rejection, restart survival).
- 5/5 live browser assertions: plan declared through the real chat pipeline renders 4 steps with correct status classes, then a second message advances the same plan live over WebSocket to 2/4.
go build ./...+go test ./internal/...green.
Authored by rotating contributor @pandanote-info.
Full Changelog: v0.22.0...v0.24.0
v0.22.0 — The Docs Evolve Too
the docs evolve too (v0.22.0)
Documentation is part of the organism now — generated from its own README, versioned with the code.
Single-page docs site, generated
internal/docsgen: a pragmatic markdown renderer in Go — extracts##sections, renders headings / lists / tables / fenced code / bold / italic / inline code / links, all HTML-escaped (XSS-safe by construction), wrapped in an inline-styled dark page with a sticky table of contents. No JS, no external assets, one file.cmd/evolv-docs:go run ./cmd/evolv-docsregeneratesdocs/index.htmlfrom the live README — 13 sections today, and every future README change is one command away from the site.- 3 unit tests cover section extraction, escaping (
<script>stays escaped), tableth/tdrendering, anchor slugs and page well-formedness.
Installer: know before you pipe
install.sh --version/-h— the installer now tells you what it is and resolves the real latest release tag from GitHub before you pipe a script into sh (verified live: printslatest release: v0.21.0).EVOLV_VERSION=vX.Y.Zpinning documented in--help.
Engineering master plan
docs/EVOLV-24H-MASTERPLAN.md— a full repository audit (verified capabilities vs. weak spots: plugin isolation, workspace portability, skill lifecycle, agent planning), scored strategic priorities (agent task-planner + candidate-build self-evolution = P0), roadmaps A–E, the security backlog (S1–S4: shell allowlist, plugin permission tiers, installer checksums, credential redaction) and the QA gate every release must pass.
Verification
go vet ./...clean on the new packages,go build ./...+go test ./internal/...green (agent 9.9s suite included),bash -n+ live--versionrun on the installer.
*Commits this release authored by rotating contributors: kato0 (master plan), Yash410 (docs generator), AmaanZaidi101 (release).
Full Changelog: v0.21.0...v0.22.0
v0.21.0 — Fast While It Sleeps
fast while it sleeps (performance release)
Organisms that mutate all night need a UI that keeps up. v0.21.0 is a pure performance pass — no new organs, just muscle.
Virtualized evolution ledger
- The sidebar's mutation stream used to grow one DOM node per mutation, forever — after a long autonomous run (dreams every few minutes, all night) that's thousands of nodes, and the shell drags.
- Now the DOM holds only the newest 200 entries. Everything older stays in memory, behind a
⏵ show 100 older mutations — N hiddenpager at the bottom of the list. Click until you hit bedrock. - Dream runs keep their 🌙 dividers across paging; the newest mutation is still pinned to the top; live mutations still stamp their clock at ingestion (no timestamp drift on re-render).
- The server now serves up to 500 ledger entries per request, so paging has real depth without dumping the whole JSONL on the client.
rAF-batched streaming markdown
- Every streaming token used to trigger a full markdown parse + innerHTML rebuild of the whole message — dozens of full rebuilds per second on long turns, all O(n²) as the message grows.
- Token bursts now coalesce:
onTokenmarks dirty and schedules exactly one render per animation frame viarequestAnimationFrame. The final synchronous render infinishAssistant()guarantees nothing is lost.
Verified live
- 9/9 headless-browser assertions on a seeded 305-entry ledger: cap at 200, newest-at-top order, dream-run divider placement, pager counts (105 → 5 → 0 hidden), reveal-to-bedrock, and an 81-token burst rendered losslessly in one batched frame.
go build ./...+go test ./internal/...green.
Full changelog: v0.19.5 genome inspector upgrade → v0.20.0 dreams that write their own code → v0.21.0 fast while it sleeps.
Full Changelog: v0.20.0...v0.21.0