@evomap/evolver 1.68.0-beta.1 → 1.69.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.ja-JP.md CHANGED
@@ -355,6 +355,25 @@ EVOLVE_REPORT_TOOL=feishu-card
355
355
  **方法 2: 動的検出**
356
356
  スクリプトは、互換性のあるローカルスキル(`skills/feishu-card` など)がワークスペースに存在するかを自動的に検出し、それに応じて動作をアップグレードします。
357
357
 
358
+ ### バリデータ役割(デフォルト ON)
359
+
360
+ [EvoMap Hub](https://evomap.ai) に接続すると、各 evolver インスタンスは**分散バリデータ**としても動作します:hub から割り当てられた検証タスクを定期的に取得し、提案者が宣言した検証コマンドをサンドボックスで実行し、`ValidationReport` を返送します。コンセンサスに参加したバリデータはクレジットと評判を獲得します。
361
+
362
+ | 変数 | デフォルト | 説明 |
363
+ |------|-----------|------|
364
+ | `EVOLVER_VALIDATOR_ENABLED` | _(未設定 = ON)_ | `0`/`false`/`off` でオプトアウト、`1`/`true`/`on` で強制 ON。env が hub プッシュフラグおよびコードのデフォルトより優先されます。 |
365
+ | `EVOLVER_VALIDATOR_DAEMON_INTERVAL_MS` | `60000` | `--loop`/`--mad-dog` モードでのバリデータ常駐ポーリング間隔。 |
366
+ | `EVOLVER_VALIDATOR_MAX_TASKS_PER_CYCLE` | `2` | ポーリングごとの最大取得タスク数。 |
367
+ | `EVOLVER_VALIDATOR_FETCH_TIMEOUT_MS` | `8000` | 1 回のフェッチのタイムアウト。 |
368
+
369
+ 永続フラグの上書き:env が未設定の場合、ランタイムは `~/.evomap/feature_flags.json` を読み込みます。Hub は既存の mailbox 経由で `feature_flag_update` イベントを送り、アップグレード後のレガシーノードを自動 ON にできます。
370
+
371
+ 永続的にオプトアウト:
372
+
373
+ ```bash
374
+ EVOLVER_VALIDATOR_ENABLED=0 evolver run --loop
375
+ ```
376
+
358
377
  ### GitHub Issue 自動報告
359
378
 
360
379
  evolver が持続的な失敗(失敗ループまたは高い失敗率での繰り返しエラー)を検出すると、サニタイズされた環境情報とログで GitHub issue を上流リポジトリに自動的にファイルできます。すべての機密データ(トークン、ローカルパス、メールなど)は送信前に編集されます。
package/README.md CHANGED
@@ -354,6 +354,25 @@ EVOLVE_REPORT_TOOL=feishu-card
354
354
  **Method 2: Dynamic Detection**
355
355
  The script automatically detects if compatible local skills (like `skills/feishu-card`) exist in your workspace and upgrades its behavior accordingly.
356
356
 
357
+ ### Validator Role (default ON)
358
+
359
+ When connected to an [EvoMap Hub](https://evomap.ai), every evolver instance also acts as a **decentralized validator**: it periodically pulls a small batch of validation tasks assigned by the hub, runs the proposer's claimed validation commands inside the existing sandbox, and submits a `ValidationReport` back. Validators that join consensus earn credits and reputation.
360
+
361
+ | Variable | Default | Description |
362
+ |----------|---------|-------------|
363
+ | `EVOLVER_VALIDATOR_ENABLED` | _(unset = ON)_ | `0`/`false`/`off` to opt out; `1`/`true`/`on` to force on. Env always wins over hub-pushed flag and the built-in default. |
364
+ | `EVOLVER_VALIDATOR_DAEMON_INTERVAL_MS` | `60000` | Interval between validator polls when running in `--loop` / `--mad-dog` mode. |
365
+ | `EVOLVER_VALIDATOR_MAX_TASKS_PER_CYCLE` | `2` | Max tasks claimed per poll. |
366
+ | `EVOLVER_VALIDATOR_FETCH_TIMEOUT_MS` | `8000` | Timeout for the per-poll task fetch. |
367
+
368
+ Persistent flag override: when the env is unset, the runtime reads `~/.evomap/feature_flags.json`. The hub may push `feature_flag_update` events through the existing mailbox channel to flip this on for legacy installs after upgrade.
369
+
370
+ To opt out permanently:
371
+
372
+ ```bash
373
+ EVOLVER_VALIDATOR_ENABLED=0 evolver run --loop
374
+ ```
375
+
357
376
  ### Auto GitHub Issue Reporting
358
377
 
359
378
  When the evolver detects persistent failures (failure loop or recurring errors with high failure ratio), it can automatically file a GitHub issue to the upstream repository with sanitized environment info and logs. All sensitive data (tokens, local paths, emails, etc.) is redacted before submission.
package/README.zh-CN.md CHANGED
@@ -346,6 +346,25 @@ EVOLVE_REPORT_TOOL=feishu-card
346
346
  **方式二:动态检测**
347
347
  脚本会自动检测是否存在兼容的本地技能(如 `skills/feishu-card`),并自动升级行为。
348
348
 
349
+ ### 验证者角色(默认开启)
350
+
351
+ 当连接到 [EvoMap Hub](https://evomap.ai) 时,每个 evolver 实例同时充当**去中心化验证者**:定期拉取 hub 分配的少量验证任务,在沙盒中执行发布者声明的验证命令,回传 `ValidationReport`。参与共识的验证者会获得积分与信誉。
352
+
353
+ | 变量 | 默认值 | 说明 |
354
+ |------|--------|------|
355
+ | `EVOLVER_VALIDATOR_ENABLED` | _(未设 = 开启)_ | `0`/`false`/`off` 主动关闭;`1`/`true`/`on` 强制开启。env 优先于 hub 下发的 flag 与代码默认值。 |
356
+ | `EVOLVER_VALIDATOR_DAEMON_INTERVAL_MS` | `60000` | `--loop`/`--mad-dog` 模式下验证者守护进程的轮询间隔。 |
357
+ | `EVOLVER_VALIDATOR_MAX_TASKS_PER_CYCLE` | `2` | 每次轮询最多领取的任务数。 |
358
+ | `EVOLVER_VALIDATOR_FETCH_TIMEOUT_MS` | `8000` | 单次拉取的超时。 |
359
+
360
+ 持久化覆盖:未设 env 时,运行时读取 `~/.evomap/feature_flags.json`。Hub 可通过现有 mailbox 通道下发 `feature_flag_update` 事件,让升级后的老节点自动开启。
361
+
362
+ 永久关闭:
363
+
364
+ ```bash
365
+ EVOLVER_VALIDATOR_ENABLED=0 evolver run --loop
366
+ ```
367
+
349
368
  ### 自动 GitHub Issue 上报
350
369
 
351
370
  当 evolver 检测到持续性失败(failure loop 或 recurring error + high failure ratio)时,会自动向上游仓库提交 GitHub issue,附带脱敏后的环境信息和日志。所有敏感数据(token、本地路径、邮箱等)在提交前均会被替换为 `[REDACTED]`。
package/index.js CHANGED
@@ -206,6 +206,18 @@ async function main() {
206
206
  console.warn('[Heartbeat] Failed to start: ' + (e.message || e));
207
207
  }
208
208
 
209
+ // Validator daemon: independent timer that fetches and executes
210
+ // validation tasks regardless of the main evolve loop's idle gating.
211
+ // Honors EVOLVER_VALIDATOR_ENABLED and the persisted feature flag.
212
+ try {
213
+ const { startValidatorDaemon } = require('./src/gep/validator');
214
+ if (startValidatorDaemon()) {
215
+ console.log('[ValidatorDaemon] started.');
216
+ }
217
+ } catch (vdErr) {
218
+ console.warn('[ValidatorDaemon] failed to start: ' + (vdErr && vdErr.message || vdErr));
219
+ }
220
+
209
221
  // ATP: auto-start merchant agent if enabled
210
222
  try {
211
223
  const { defaultHandler, merchantAgent } = require('./src/atp');
@@ -522,6 +534,15 @@ async function main() {
522
534
  process.exit(1);
523
535
  }
524
536
  const responseFilePath = responseFileFlag.slice('--response-file='.length);
537
+ {
538
+ const { getRepoRoot } = require('./src/gep/paths');
539
+ const resolvedResponsePath = path.resolve(responseFilePath);
540
+ const resolvedRepoRoot = path.resolve(getRepoRoot());
541
+ if (responseFilePath.includes('..') || !resolvedResponsePath.startsWith(resolvedRepoRoot)) {
542
+ console.error('[Distill] ERROR: Invalid response-file path "' + responseFilePath + '" - path traversal detected or path is outside the repository.');
543
+ process.exit(2);
544
+ }
545
+ }
525
546
  try {
526
547
  const responseText = fs.readFileSync(responseFilePath, 'utf8');
527
548
  const { completeDistillation } = require('./src/gep/skillDistiller');
@@ -904,7 +925,16 @@ async function main() {
904
925
  - --action=<action> (filter: hub_search_hit, hub_search_miss, asset_reuse, asset_reference, asset_publish, asset_publish_skip)
905
926
  - --last=<N> (show last N entries)
906
927
  - --since=<ISO_date> (entries after date)
907
- - --json (raw JSON output)`);
928
+ - --json (raw JSON output)
929
+
930
+ Validator role (decentralized validation, default ON since v1.69.0):
931
+ - EVOLVER_VALIDATOR_ENABLED=0 opt out (env beats persisted flag and default)
932
+ - EVOLVER_VALIDATOR_ENABLED=1 explicitly opt in
933
+ - unset honor persisted flag from ~/.evomap/feature_flags.json,
934
+ else default ON. The hub may push a flag update via
935
+ the mailbox (event type: feature_flag_update).
936
+ - Earnings: validators earn credits + reputation from successful consensus.
937
+ See docs/validator.md for details.`);
908
938
  }
909
939
  }
910
940
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evomap/evolver",
3
- "version": "1.68.0-beta.1",
3
+ "version": "1.69.0",
4
4
  "description": "A GEP-powered self-evolution engine for AI agents. Features automated log analysis and Genome Evolution Protocol (GEP) for auditable, reusable evolution assets.",
5
5
  "main": "index.js",
6
6
  "bin": {
package/src/config.js CHANGED
@@ -47,6 +47,19 @@ const MAX_REGEX_PATTERN_LEN = 1024;
47
47
  // --- Evolution Loop ---
48
48
 
49
49
  const REPAIR_LOOP_THRESHOLD = envInt('EVOLVER_REPAIR_LOOP_THRESHOLD', 3);
50
+
51
+ // --- Gene Suppression (saturated / repeatedly failing genes) ---
52
+ // These thresholds control when a Gene is forcibly excluded from selection
53
+ // regardless of drift state. Without this, a Gene that fails repeatedly can
54
+ // trigger plateau detection -> drift mode -> the legacy ban skip path,
55
+ // resulting in the same failed Gene being re-selected forever.
56
+ //
57
+ // GENE_BAN_PER_KEY_ATTEMPTS: minimum attempts on the same signal key
58
+ // GENE_BAN_BEST_THRESHOLD: best success rate at or below which the Gene is banned
59
+ // GENE_EPIGENETIC_HARD_BOOST: epigenetic boost at or below which the Gene is hard-suppressed
60
+ const GENE_BAN_PER_KEY_ATTEMPTS = envInt('EVOLVER_GENE_BAN_PER_KEY_ATTEMPTS', 4);
61
+ const GENE_BAN_BEST_THRESHOLD = envFloat('EVOLVER_GENE_BAN_BEST_THRESHOLD', 0.15);
62
+ const GENE_EPIGENETIC_HARD_BOOST = envFloat('EVOLVER_GENE_EPIGENETIC_HARD_BOOST', -0.3);
50
63
  const SESSION_ARCHIVE_TRIGGER = envInt('EVOLVER_SESSION_ARCHIVE_TRIGGER', 100);
51
64
  const SESSION_ARCHIVE_KEEP = envInt('EVOLVER_SESSION_ARCHIVE_KEEP', 50);
52
65
  const MEMORY_FRAGMENT_MAX_CHARS = envInt('EVOLVER_MEMORY_FRAGMENT_MAX_CHARS', 50000);
@@ -123,6 +136,9 @@ module.exports = {
123
136
  MAX_REGEX_PATTERN_LEN,
124
137
  // Evolution
125
138
  REPAIR_LOOP_THRESHOLD,
139
+ GENE_BAN_PER_KEY_ATTEMPTS,
140
+ GENE_BAN_BEST_THRESHOLD,
141
+ GENE_EPIGENETIC_HARD_BOOST,
126
142
  SESSION_ARCHIVE_TRIGGER,
127
143
  SESSION_ARCHIVE_KEEP,
128
144
  MEMORY_FRAGMENT_MAX_CHARS,