@evomap/evolver 1.29.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.
Files changed (52) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +290 -0
  3. package/README.zh-CN.md +236 -0
  4. package/SKILL.md +132 -0
  5. package/assets/gep/capsules.json +79 -0
  6. package/assets/gep/events.jsonl +7 -0
  7. package/assets/gep/genes.json +108 -0
  8. package/index.js +479 -0
  9. package/package.json +38 -0
  10. package/src/canary.js +13 -0
  11. package/src/evolve.js +1704 -0
  12. package/src/gep/a2a.js +173 -0
  13. package/src/gep/a2aProtocol.js +736 -0
  14. package/src/gep/analyzer.js +35 -0
  15. package/src/gep/assetCallLog.js +130 -0
  16. package/src/gep/assetStore.js +297 -0
  17. package/src/gep/assets.js +36 -0
  18. package/src/gep/bridge.js +71 -0
  19. package/src/gep/candidates.js +142 -0
  20. package/src/gep/contentHash.js +65 -0
  21. package/src/gep/deviceId.js +209 -0
  22. package/src/gep/envFingerprint.js +68 -0
  23. package/src/gep/hubReview.js +206 -0
  24. package/src/gep/hubSearch.js +237 -0
  25. package/src/gep/issueReporter.js +262 -0
  26. package/src/gep/llmReview.js +92 -0
  27. package/src/gep/memoryGraph.js +771 -0
  28. package/src/gep/memoryGraphAdapter.js +203 -0
  29. package/src/gep/mutation.js +186 -0
  30. package/src/gep/narrativeMemory.js +108 -0
  31. package/src/gep/paths.js +113 -0
  32. package/src/gep/personality.js +355 -0
  33. package/src/gep/prompt.js +566 -0
  34. package/src/gep/questionGenerator.js +212 -0
  35. package/src/gep/reflection.js +127 -0
  36. package/src/gep/sanitize.js +67 -0
  37. package/src/gep/selector.js +250 -0
  38. package/src/gep/signals.js +417 -0
  39. package/src/gep/skillDistiller.js +499 -0
  40. package/src/gep/solidify.js +1681 -0
  41. package/src/gep/strategy.js +126 -0
  42. package/src/gep/taskReceiver.js +528 -0
  43. package/src/gep/validationReport.js +55 -0
  44. package/src/ops/cleanup.js +80 -0
  45. package/src/ops/commentary.js +60 -0
  46. package/src/ops/health_check.js +106 -0
  47. package/src/ops/index.js +11 -0
  48. package/src/ops/innovation.js +67 -0
  49. package/src/ops/lifecycle.js +168 -0
  50. package/src/ops/self_repair.js +72 -0
  51. package/src/ops/skills_monitor.js +143 -0
  52. package/src/ops/trigger.js +33 -0
@@ -0,0 +1,79 @@
1
+ {
2
+ "version": 1,
3
+ "capsules": [
4
+ {
5
+ "type": "Capsule",
6
+ "schema_version": "1.5.0",
7
+ "id": "capsule_1770477654236",
8
+ "trigger": [
9
+ "log_error",
10
+ "errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }",
11
+ "user_missing",
12
+ "windows_shell_incompatible",
13
+ "perf_bottleneck"
14
+ ],
15
+ "gene": "gene_gep_repair_from_errors",
16
+ "summary": "固化:gene_gep_repair_from_errors 命中信号 log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck,变更 1 文件 / 2 行。",
17
+ "confidence": 0.85,
18
+ "blast_radius": {
19
+ "files": 1,
20
+ "lines": 2
21
+ },
22
+ "outcome": {
23
+ "status": "success",
24
+ "score": 0.85
25
+ },
26
+ "success_streak": 1,
27
+ "env_fingerprint": {
28
+ "node_version": "v22.22.0",
29
+ "platform": "linux",
30
+ "arch": "x64",
31
+ "os_release": "6.1.0-42-cloud-amd64",
32
+ "evolver_version": "1.7.0",
33
+ "cwd": ".",
34
+ "captured_at": "2026-02-07T15:20:54.155Z"
35
+ },
36
+ "a2a": {
37
+ "eligible_to_broadcast": false
38
+ },
39
+ "asset_id": "sha256:3eed0cd5038f9e85fbe0d093890e291e9b8725644c766e6cce40bf62d0f5a2e8"
40
+ },
41
+ {
42
+ "type": "Capsule",
43
+ "schema_version": "1.5.0",
44
+ "id": "capsule_1770478341769",
45
+ "trigger": [
46
+ "log_error",
47
+ "errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }",
48
+ "user_missing",
49
+ "windows_shell_incompatible",
50
+ "perf_bottleneck"
51
+ ],
52
+ "gene": "gene_gep_repair_from_errors",
53
+ "summary": "固化:gene_gep_repair_from_errors 命中信号 log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck,变更 2 文件 / 44 行。",
54
+ "confidence": 0.85,
55
+ "blast_radius": {
56
+ "files": 2,
57
+ "lines": 44
58
+ },
59
+ "outcome": {
60
+ "status": "success",
61
+ "score": 0.85
62
+ },
63
+ "success_streak": 1,
64
+ "env_fingerprint": {
65
+ "node_version": "v22.22.0",
66
+ "platform": "linux",
67
+ "arch": "x64",
68
+ "os_release": "6.1.0-42-cloud-amd64",
69
+ "evolver_version": "1.7.0",
70
+ "cwd": ".",
71
+ "captured_at": "2026-02-07T15:32:21.678Z"
72
+ },
73
+ "a2a": {
74
+ "eligible_to_broadcast": false
75
+ },
76
+ "asset_id": "sha256:20d971a3c4cb2b75f9c045376d1aa003361c12a6b89a4b47b7e81dbd4f4d8fe8"
77
+ }
78
+ ]
79
+ }
@@ -0,0 +1,7 @@
1
+
2
+ {"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770477201172","gene_id":"gene_gep_innovate_from_opportunity","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:13:21.123Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":49,"created_at":"2026-02-07T15:13:21.173Z","asset_id":"sha256:94362b47428c75ed92e6721259500c1e548177d6989b5fae7524910c92109b95"}
3
+ {"type":"EvolutionEvent","schema_version":"1.5.0","id":"evt_1770477201173","parent":"evt_1770476523037","intent":"innovate","signals":["user_missing","user_feature_request"],"genes_used":["gene_gep_innovate_from_opportunity"],"mutation_id":"mut_1770476534173","personality_state":{"type":"PersonalityState","rigor":0.7,"creativity":0.35,"verbosity":0.25,"risk_tolerance":0.4,"obedience":0.9},"blast_radius":{"files":1,"lines":2},"outcome":{"status":"failed","score":0.2},"capsule_id":null,"env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:13:21.123Z"},"validation_report_id":"vr_1770477201172","meta":{"at":"2026-02-07T15:13:21.173Z","signal_key":"user_feature_request|user_missing","selector":{"selected":"gene_gep_innovate_from_opportunity","reason":["signals match gene.signals_match","signals: user_missing, user_feature_request","memory_graph: memory_prefer:gene_gep_innovate_from_opportunity | gene_prior:0.667"],"alternatives":[]},"blast_radius_estimate":{"files":8,"lines":640},"mutation":{"type":"Mutation","id":"mut_1770476534173","category":"innovate","trigger_signals":["user_missing","user_feature_request"],"target":"gene:gene_gep_innovate_from_opportunity","expected_effect":"explore new strategy combinations to escape local optimum","risk_level":"medium"},"personality":{"key":"rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9","known":true,"mutations":[]},"gene":{"id":"gene_gep_innovate_from_opportunity","created":false,"reason":"selected_gene_id_present"},"constraints_ok":false,"constraint_violations":["forbidden_path touched: assets/gep/events.jsonl"],"validation_ok":true,"validation":[{"cmd":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true}],"validation_report":{"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770477201172","gene_id":"gene_gep_innovate_from_opportunity","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:13:21.123Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":49,"created_at":"2026-02-07T15:13:21.173Z","asset_id":"sha256:94362b47428c75ed92e6721259500c1e548177d6989b5fae7524910c92109b95"},"protocol_ok":true,"protocol_violations":[],"memory_graph":"/home/crishaocredits/.openclaw/workspace/skills/evolver/memory/memory_graph.jsonl"},"asset_id":"sha256:7e5a6eaac3915c1069841cdd02e087e93316415dcc22a29370a4ba7208e452d4"}
4
+ {"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770477654235","gene_id":"gene_gep_repair_from_errors","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:20:54.155Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""},{"command":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":80,"created_at":"2026-02-07T15:20:54.236Z","asset_id":"sha256:404345b559ec9a29d30444c3d66ff8f346d87017b7dea1d965ae35f029c8d5c6"}
5
+ {"type":"EvolutionEvent","schema_version":"1.5.0","id":"evt_1770477654236","parent":"evt_1770477201173","intent":"repair","signals":["log_error","errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }","user_missing","windows_shell_incompatible","perf_bottleneck"],"genes_used":["gene_gep_repair_from_errors"],"mutation_id":"mut_1770477615603","personality_state":{"type":"PersonalityState","rigor":0.7,"creativity":0.35,"verbosity":0.25,"risk_tolerance":0.4,"obedience":0.9},"blast_radius":{"files":1,"lines":2},"outcome":{"status":"success","score":0.85},"capsule_id":"capsule_1770477654236","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:20:54.155Z"},"validation_report_id":"vr_1770477654235","meta":{"at":"2026-02-07T15:20:54.236Z","signal_key":"errsig_norm:870c3a82|log_error|perf_bottleneck|user_missing|windows_shell_incompatible","selector":{"selected":"gene_gep_repair_from_errors","reason":["signals match gene.signals_match","signals: log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck","memory_graph: memory_prefer:gene_gep_repair_from_errors | gene_prior:0.500"],"alternatives":["gene_gep_innovate_from_opportunity"]},"blast_radius_estimate":{"files":12,"lines":960},"mutation":{"type":"Mutation","id":"mut_1770477615603","category":"repair","trigger_signals":["log_error","errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }","user_missing","windows_shell_incompatible","perf_bottleneck"],"target":"gene:gene_gep_repair_from_errors","expected_effect":"reduce runtime errors, increase stability, and lower failure rate","risk_level":"low"},"personality":{"key":"rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9","known":true,"mutations":[]},"gene":{"id":"gene_gep_repair_from_errors","created":false,"reason":"selected_gene_id_present"},"constraints_ok":true,"constraint_violations":[],"validation_ok":true,"validation":[{"cmd":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true},{"cmd":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true}],"validation_report":{"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770477654235","gene_id":"gene_gep_repair_from_errors","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:20:54.155Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""},{"command":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":80,"created_at":"2026-02-07T15:20:54.236Z","asset_id":"sha256:404345b559ec9a29d30444c3d66ff8f346d87017b7dea1d965ae35f029c8d5c6"},"protocol_ok":true,"protocol_violations":[],"memory_graph":"/home/crishaocredits/.openclaw/workspace/skills/evolver/memory/memory_graph.jsonl"},"asset_id":"sha256:a795229043cb18c18f108eed7e9c26b95b48119fb143877d57ea004dade5799f"}
6
+ {"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770478341768","gene_id":"gene_gep_repair_from_errors","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:32:21.678Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""},{"command":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":90,"created_at":"2026-02-07T15:32:21.769Z","asset_id":"sha256:442c9ac0e27706330719fbdc049b92ab78aea643e31a079c5c93fb174c27edb0"}
7
+ {"type":"EvolutionEvent","schema_version":"1.5.0","id":"evt_1770478341769","parent":"evt_1770477201173","intent":"repair","signals":["log_error","errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }","user_missing","windows_shell_incompatible","perf_bottleneck"],"genes_used":["gene_gep_repair_from_errors"],"mutation_id":"mut_1770477615603","personality_state":{"type":"PersonalityState","rigor":0.7,"creativity":0.35,"verbosity":0.25,"risk_tolerance":0.4,"obedience":0.9},"blast_radius":{"files":2,"lines":44},"outcome":{"status":"success","score":0.85},"capsule_id":"capsule_1770478341769","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:32:21.678Z"},"validation_report_id":"vr_1770478341768","meta":{"at":"2026-02-07T15:32:21.769Z","signal_key":"errsig_norm:870c3a82|log_error|perf_bottleneck|user_missing|windows_shell_incompatible","selector":{"selected":"gene_gep_repair_from_errors","reason":["signals match gene.signals_match","signals: log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck","memory_graph: memory_prefer:gene_gep_repair_from_errors | gene_prior:0.500"],"alternatives":["gene_gep_innovate_from_opportunity"]},"blast_radius_estimate":{"files":12,"lines":960},"mutation":{"type":"Mutation","id":"mut_1770477615603","category":"repair","trigger_signals":["log_error","errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }","user_missing","windows_shell_incompatible","perf_bottleneck"],"target":"gene:gene_gep_repair_from_errors","expected_effect":"reduce runtime errors, increase stability, and lower failure rate","risk_level":"low"},"personality":{"key":"rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9","known":true,"mutations":[]},"gene":{"id":"gene_gep_repair_from_errors","created":false,"reason":"selected_gene_id_present"},"constraints_ok":true,"constraint_violations":[],"validation_ok":true,"validation":[{"cmd":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true},{"cmd":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true}],"validation_report":{"type":"ValidationReport","schema_version":"1.5.0","id":"vr_1770478341768","gene_id":"gene_gep_repair_from_errors","env_fingerprint":{"node_version":"v22.22.0","platform":"linux","arch":"x64","os_release":"6.1.0-42-cloud-amd64","evolver_version":"1.7.0","cwd":"/home/crishaocredits/.openclaw/workspace","captured_at":"2026-02-07T15:32:21.678Z"},"env_fingerprint_key":"b98472b2ef785976","commands":[{"command":"node -e \"require('./src/evolve'); require('./src/gep/solidify'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""},{"command":"node -e \"require('./src/gep/selector'); require('./src/gep/memoryGraph'); console.log('ok')\"","ok":true,"stdout":"ok\n","stderr":""}],"overall_ok":true,"duration_ms":90,"created_at":"2026-02-07T15:32:21.769Z","asset_id":"sha256:442c9ac0e27706330719fbdc049b92ab78aea643e31a079c5c93fb174c27edb0"},"protocol_ok":true,"protocol_violations":[],"memory_graph":"/home/crishaocredits/.openclaw/workspace/skills/evolver/memory/memory_graph.jsonl"},"asset_id":"sha256:4f93fb33e0366bcf827d26d287cbbaf124dbce0bf97eafd5cedf087d291366eb"}
@@ -0,0 +1,108 @@
1
+ {
2
+ "version": 1,
3
+ "genes": [
4
+ {
5
+ "type": "Gene",
6
+ "id": "gene_gep_repair_from_errors",
7
+ "category": "repair",
8
+ "signals_match": [
9
+ "error",
10
+ "exception",
11
+ "failed",
12
+ "unstable"
13
+ ],
14
+ "preconditions": [
15
+ "signals contains error-related indicators"
16
+ ],
17
+ "strategy": [
18
+ "Extract structured signals from logs and user instructions",
19
+ "Select an existing Gene by signals match (no improvisation)",
20
+ "Estimate blast radius (files, lines) before editing",
21
+ "Apply smallest reversible patch",
22
+ "Validate using declared validation steps; rollback on failure",
23
+ "Solidify knowledge: append EvolutionEvent, update Gene/Capsule store"
24
+ ],
25
+ "constraints": {
26
+ "max_files": 20,
27
+ "forbidden_paths": [
28
+ ".git",
29
+ "node_modules"
30
+ ]
31
+ },
32
+ "validation": [
33
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/solidify",
34
+ "node scripts/validate-modules.js ./src/gep/selector ./src/gep/memoryGraph"
35
+ ]
36
+ },
37
+ {
38
+ "type": "Gene",
39
+ "id": "gene_gep_optimize_prompt_and_assets",
40
+ "category": "optimize",
41
+ "signals_match": [
42
+ "protocol",
43
+ "gep",
44
+ "prompt",
45
+ "audit",
46
+ "reusable"
47
+ ],
48
+ "preconditions": [
49
+ "need stricter, auditable evolution protocol outputs"
50
+ ],
51
+ "strategy": [
52
+ "Extract signals and determine selection rationale via Selector JSON",
53
+ "Prefer reusing existing Gene/Capsule; only create if no match exists",
54
+ "Refactor prompt assembly to embed assets (genes, capsules, parent event)",
55
+ "Reduce noise and ambiguity; enforce strict output schema",
56
+ "Validate by running node index.js run and ensuring no runtime errors",
57
+ "Solidify: record EvolutionEvent, update Gene definitions, create Capsule on success"
58
+ ],
59
+ "constraints": {
60
+ "max_files": 20,
61
+ "forbidden_paths": [
62
+ ".git",
63
+ "node_modules"
64
+ ]
65
+ },
66
+ "validation": [
67
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/prompt"
68
+ ]
69
+ },
70
+ {
71
+ "type": "Gene",
72
+ "id": "gene_gep_innovate_from_opportunity",
73
+ "category": "innovate",
74
+ "signals_match": [
75
+ "user_feature_request",
76
+ "user_improvement_suggestion",
77
+ "perf_bottleneck",
78
+ "capability_gap",
79
+ "stable_success_plateau",
80
+ "external_opportunity"
81
+ ],
82
+ "preconditions": [
83
+ "at least one opportunity signal is present",
84
+ "no active log_error signals (stability first)"
85
+ ],
86
+ "strategy": [
87
+ "Extract opportunity signals and identify the specific user need or system gap",
88
+ "Search existing Genes and Capsules for partial matches (avoid reinventing)",
89
+ "Design a minimal, testable implementation plan (prefer small increments)",
90
+ "Estimate blast radius; innovate changes may touch more files but must stay within constraints",
91
+ "Implement the change with clear validation criteria",
92
+ "Validate using declared validation steps; rollback on failure",
93
+ "Solidify: record EvolutionEvent with intent=innovate, create new Gene if pattern is novel, create Capsule on success"
94
+ ],
95
+ "constraints": {
96
+ "max_files": 25,
97
+ "forbidden_paths": [
98
+ ".git",
99
+ "node_modules"
100
+ ]
101
+ },
102
+ "validation": [
103
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/solidify"
104
+ ]
105
+ }
106
+ ]
107
+ }
108
+