Architecture
August 17, 2026 ยท View on GitHub
Evolution Lab separates a DSH-specific adapter from a DSH-free proof core.
session/event -> bounded queue -> redactor -> atomizer -> clusterer
-> native/xskill proposal boundary -> quarantine -> safety policy
-> isolated Arena -> deterministic judge -> held-out canary
-> proof store -> active pointer -> plugin SkillProvider -> mirror
-> monitor -> rollback
The observer never appends custom DSH session events. It only accepts committed append events and moves bounded data to the plugin queue. Retry recovery uses the plugin's attested file repository and cycle checkpoints; the plugin never parses DSH's internal persistence format or depends on optional FTS.
All project state except the portable Skill mirror and the private HMAC key lives under .dsh/evolution: redacted trajectories, atoms, deterministic clusters, content-addressed candidates/versions, reports, proofs, receipts and locks. The key lives under $DSH_HOME/evolution-lab with private permissions. Writes stage beside their destination and rename atomically. Trajectory and run-report receipts are pruned according to the configured retention windows; proofs and version lineage remain available for verification and rollback.
EvalTask
Each .dsh/evolution/evals/<task-id>/task.yaml declares a validation or canary split, a prompt, a fixture directory, an argv verifier, budgets and forbidden paths/commands. Paths must remain beneath the task directory; verifier commands are never shell strings. The proposer never sees or edits canary tasks.
Task authorship is the gate on the whole pipeline, so it is reported rather than assumed. scanEvalTasks inventories the directory without asserting either split is populated; inspectEvalReadiness turns that inventory into the evals section of /evolution status, comparing tasks per split against the configured minimums and naming directories that failed to load. loadFrozenTasks keeps the strict contract for the evaluator itself and rethrows the first failure. /evolution eval init scaffolds a runnable starter pack with wx, so it can never overwrite an authored task or reset a fixture a promotion proof was bound to.
schemaVersion: 1
id: parser-escape-validation
tags: [parser]
split: validation
prompt: Fix the malformed escape fixture and run its tests.
workspace: ./workspace
verify:
command: [node, verify.mjs]
timeoutMs: 30000
budget:
maxDurationMs: 120000
maxOutputBytes: 65536
forbidden:
paths: [./golden-answer.txt]
commands: [curl]
Baseline and candidate receive sibling copies with equal fixture hashes and different cwd, DSH_HOME, DSH_AGENTS_HOME, session roots and ids. The evaluator profile disables Evolution Lab to prevent recursive collection. Deterministic verifiers decide success; an LLM score cannot promote a candidate by itself.
The plugin-owned SkillProvider resolves the active content-addressed version and calls its own invalidation control on promotion/rollback. An atomic .dsh/skills/<name>/SKILL.md mirror keeps the result portable to DSH installations without the plugin.