Combined safe evolution system for this workspace. Use when you want one practical algorithm that merges proactive continuity, memory-stack discipline, optional typed graph structure, and human-supervised improvement from real signals. Good for deciding what to update, where to write it, what the smallest safe change is, and how to validate it without autonomous loops, cloud memory sprawl, or risky self-modification.
Use one combined evolution algorithm for this workspace:
workspace-continuityworkspace-memory-stackworkspace-graphsafe-evolution-loopThis is the default "improve without drifting" framework.
Start from a real trigger:
Every signal must take of two branches. There is no separate peer branch anymore.
general-evolutionSignal kind is tracked separately (request-friction, progress, decision, blocker, correction, cross-channel, etc.).
The branch answers a different question: are we building/extending the current pattern, or repairing an insufficient one?
Use these two universal branches:
Within either branch, when the signal is a real problem/failure, ask:
If yes, prefer revising, narrowing, or removing the causal protocol instead of stacking another protocol on top.
A request-friction signal is just one important signal kind inside this two-branch model, not a separate top-level evolution path.
Before changing anything, ask:
The goal is to prevent fixing one symptom while leaving the same class of mistake alive. Prefer morals that change future behavior across many tasks.
Examples of good generalized morals:
Ask four questions:
Possible mutation targets:
memory/active-state.mdmemory/YYYY-MM-DD.mdUSER.mdAGENTS.md.learnings/Prefer memory/task/rule updates before code changes.
Every evolution must answer:
If the proposed mutation changes a protocol, rule, workflow, or skill behavior:
For UI work, validation must include both display and behavior:
After the change:
Prefer this order unless there is a clear reason not to:
Only use the graph when explicit relationships matter:
If plain task memory is enough, stay with task memory.
Only when the same failure or friction keeps recurring and cannot be solved by better memory/task discipline alone.
Good reasons:
Bad reasons:
Use the planner script when you want a concrete recommendation:
python3 skills/grounded-evolver/scripts/grounded_evolve.py \
--signal "Important Discord request was not copied into main memory" \
--category cross-channel \
--repeat-count 2 \
--impact 4 \
--loss-risk 5 \
--cross-channel \
--project \
--rule
For UI friction, include --ui so the plan explicitly checks both display and interaction behavior:
python3 skills/grounded-evolver/scripts/grounded_evolve.py \
--signal "Task control looked interactive but did not apply until a separate save" \
--category correction \
--repeat-count 2 \
--impact 4 \
--loss-risk 3 \
--project \
--rule \
--ui
If you already know the abstraction, pass it in explicitly:
python3 skills/grounded-evolver/scripts/grounded_evolve.py \
--signal "Task control looked interactive but did not apply until a separate save" \
--root-cause "The UI implied immediate behavior, but the implementation still depended on a separate save flow." \
--moral "Do not let controls visually promise behavior they do not immediately perform." \
--category correction \
--repeat-count 2 \
--impact 4 \
--loss-risk 3 \
--project \
--rule \
--ui
For request-friction signals, use the integrated branch fields explicitly. The planner now emits a structured problem packet plus self-authored and outside-review prompts:
python3 skills/grounded-evolver/scripts/grounded_evolve.py \
--signal "I followed the request, but skipped a protocol step and needed a correction" \
--category request-friction \
--meaningful-request \
--request-context "User asked for X; I did Y and then needed a correction." \
--user-correction \
--skipped-step \
--protocol-existed \
--protocol-name "post-request learning check" \
--impact 4 \
--loss-risk 3 \
--project \
--json
Useful packet-filling flags when the default inference is too vague:
--context--request-context--symptom-type--failure-mode--outcome-type--failed-layer--protocol-name--protocol-caused-problem--causal-protocolFor outside review, use the planner output literally:
task = outside_review_promptcwd outside the workspace (the planner now emits a spawn plan for this)Treat this as a best-effort clean room. If OpenClaw itself injects startup anchoring for new subagents, that is a platform/runtime behavior rather than something the skill can fully disable from inside the prompt alone.
Use the helper when you already saved the planner JSON and want the exact reusable spawn payloads instead of copy-editing them manually:
python3 skills/grounded-evolver/scripts/prepare_outside_review.py \
--plan-file /tmp/grounded-plan.json \
--json
For reversible protocol/rule/workflow edits, use the snapshot helper instead of ad hoc copy/paste backups:
python3 skills/grounded-evolver/scripts/snapshot_revert.py snapshot \
--name change-id \
--file AGENTS.md \
--file path/to/other/file
# ...edit and validate...
python3 skills/grounded-evolver/scripts/snapshot_revert.py restore \
--name change-id
references/algorithm.md for the full step-by-step model.references/mutation-matrix.md for destination and mutation selection.references/helpers.md for the reusable outside-review and snapshot/revert workflows.scripts/grounded_evolve.py to generate a compact evolution plan.