Commit 3f4d1a00ebb3a613506e8ab04c9fa9aa314dc7ee

Authored by yibo
1 parent c3abf4a9

refactor(agents): 四个存量 system agent 按 27-NAMING §3.4 归位

命名轴是「节点在哪一层图里」,把散落的老 agent 归到它实际所处的层级:

  innovator → org-innovator      type='cxo',是 org graph 层的节点
  hunter    → innovator-hunt     innovator work graph 第 1 阶段
  digester  → innovator-digest   第 2 阶段(输入是 hunt 产出)
  evolver   → innovator-evolver  第 3 阶段

依据:retrain-pipeline.js 的 stepConfigs 就是按 hunter → digester → evolver 顺序
跑的,行 231 明写 steps: ['re_hunt','re_digest','evolve'] —— 这三个本来就是
innovator 的 work graph 三阶段,只是名字没体现出来。

■ 迁移(scripts/migrate-agent-naming.js,--dry-run + 幂等可重跑)
- 8 个目录(system/agents/ + system/templates/),用 git mv 保留历史
- system_agents 表 4 行的 id 与 legacy_path
- 公司实例目录与 company.json.agents[](本次无公司雇过这四个,实际 0 条)

■ 代码引用点(5 处,手工改)
- retrain-pipeline.js: stepConfigs 的 agent 字段 ×3、agentToStep 映射的 key ×3、
  call_sub_agent 的 evolver 判断
- agent-chat.js: agent 列表过滤里的 innovator
- company.js: 模板训练触发的 agentId

■ 刻意不动的三类同形异义(改了会坏)
1. skill 内部子目录名 {skillDir}/hunter/knowhow.md —— 那是 hunt/digest/evolve
   三阶段的产物目录约定,与 agent 名同形但不同义。涉及 open-api.js:402、
   retrain-pipeline.js:148/374、evolution-loop.js:178、sync-skills.js 的 INTERNAL_DIRS
2. skill 命名空间白名单 —— skill-dir-manager.js 的 CORE_SKILLS、
   migrate-trained-skills.js 的 SYSTEM_SKILLS,那里的 'innovator' 指同名 skill
3. conversations/ 与 system/tasklog/ 下的历史记录 —— 运行态数据,不改写历史

evolver-youtube-crawler 按 §3.4 列为待定,迁移脚本按精确目录名匹配,未误伤。

这四个重命名顺带解决了 27 号文档 §七 挂了很久的 6 个命名冲突 id —— 重命名后
system/agents/ 与 system/templates/ 下不再有同名目录(只剩 agent-creator 与
evolver-youtube-crawler 两个,前者是基础设施角色按规则不改名)。

验证:npm run test:unit 693 全绿(64 files);test-company-e2e 114/114;
迁移脚本二次执行 dirs=0 dbRows=0 skipped=8(幂等)。

未触碰另一进程正在进行的 P3 文件(graph-engine.js / graph-run-sse.js /
work-graph-db.js / 27-p3-p4-work-graph-console.md / 27-requirement.md)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Showing 138 changed files with 176 additions and 10 deletions

Too many changes.

To preserve performance only 100 of 138 files are displayed.

docs/todo/system-design/27-naming-conventions.md
... ... @@ -110,7 +110,17 @@ ops.json org-planner → org-monitor → org-validator
110 110 - `agent-creator`:与 `orggraph-planning` 同属**基础设施角色**,不是任何图上的节点,不加前缀,保持原名。
111 111 - `evolver-youtube-crawler`:针对单个 skill 特化的 evolver 实例,按规则应为 `innovator-evolver-youtube-crawler`,名字过长且疑似一次性产物,**待定**,暂不改名。
112 112  
113   -> ⚠️ §3.4 的四个重命名**尚未落到代码**,需要一次迁移(目录改名 + `system_agents` 表 + `retrain-pipeline.js` 等引用点)。§3.1-3.3 的新命名已应用于文档与 `system/org-graph-templates/`。
  113 +> ✅ §3.4 的四个重命名**已落到代码**(`scripts/migrate-agent-naming.js`,幂等可重跑):
  114 +> 8 个目录(`system/agents/` + `system/templates/`)、`system_agents` 表 4 行、
  115 +> 以及 5 处代码引用点(`retrain-pipeline.js` 的 `agent:` 字段 / `agentToStep` 映射 /
  116 +> `call_sub_agent` 判断、`agent-chat.js` 的 agent 列表过滤、`company.js` 的训练触发)。
  117 +>
  118 +> **迁移时明确不动的东西**(改了会坏):
  119 +> - skill 内部子目录名 `{skillDir}/hunter/knowhow.md` —— 那是 hunt/digest/evolve
  120 +> 三阶段的**产物目录**约定,与 agent 名同形但不同义
  121 +> - skill 命名空间的白名单(`skill-dir-manager.js` 的 `CORE_SKILLS`、
  122 +> `migrate-trained-skills.js` 的 `SYSTEM_SKILLS`)—— 那里的 `innovator` 指同名 skill
  123 +> - `conversations/` 与 `system/tasklog/` 下的历史记录 —— 运行态数据,不改写历史
114 124  
115 125 ### 3.5 归因类节点 —— `validator-reflection`(R-16,两处待定案)
116 126  
... ...
scripts/migrate-agent-naming.js 0 → 100644
  1 +#!/usr/bin/env node
  2 +/**
  3 + * migrate-agent-naming.js — 存量 system agent 按 27-NAMING §3.4 归位
  4 + *
  5 + * 依据: docs/todo/system-design/27-naming-conventions.md §3.4(R-15.3 定案)
  6 + * 命名轴是「节点在哪一层图里」,把散落的老 agent 归到它实际所处的层级:
  7 + *
  8 + * innovator → org-innovator type='cxo',是 org graph 层的节点
  9 + * hunter → innovator-hunt retrain-pipeline.js:161,innovator work graph 第 1 阶段
  10 + * digester → innovator-digest 同上第 2 阶段(行 179,输入是 hunter 产出)
  11 + * evolver → innovator-evolver 同上第 3 阶段(行 196)
  12 + *
  13 + * 迁移内容:
  14 + * 目录 system/agents/{旧}/ → system/agents/{新}/
  15 + * system/templates/{旧}/ → system/templates/{新}/
  16 + * DB system_agents 的 id 与 legacy_path
  17 + * 实例 data/companies/*\/agents/{旧}/ 与 company.json.agents[](若有公司雇过)
  18 + *
  19 + * ⚠️ 明确不动的东西(改了会坏):
  20 + * - skill 内部子目录名 `{skillDir}/hunter/knowhow.md` —— 那是 hunt/digest/evolve
  21 + * 三阶段的产物目录约定,不是 agent 名(open-api.js:402、retrain-pipeline.js:148/374、
  22 + * evolution-loop.js:178、sync-skills.js:62 的 INTERNAL_DIRS 等)
  23 + * - skill 命名空间的白名单 —— skill-dir-manager.js 的 CORE_SKILLS、
  24 + * migrate-trained-skills.js 的 SYSTEM_SKILLS,那里的 'innovator' 指的是同名 skill
  25 + * - `evolver-youtube-crawler` —— 27-NAMING §3.4 列为待定,按精确目录名匹配,不会误伤
  26 + * - conversations/ 与 system/tasklog/ 下的历史记录 —— 运行态数据,不改写历史
  27 + *
  28 + * 用法:
  29 + * node scripts/migrate-agent-naming.js --dry-run
  30 + * node scripts/migrate-agent-naming.js
  31 + *
  32 + * 幂等: 已迁移过(新名存在且旧名不存在)会被跳过,可重复执行。
  33 + */
  34 +
  35 +const fs = require('fs');
  36 +const path = require('path');
  37 +const { execFileSync } = require('child_process');
  38 +
  39 +const ROOT = path.resolve(__dirname, '..');
  40 +const DRY = process.argv.includes('--dry-run');
  41 +
  42 +/** 旧名 → 新名。顺序无关,全部按精确名匹配,不做前缀/正则匹配。 */
  43 +const RENAMES = {
  44 + innovator: 'org-innovator',
  45 + hunter: 'innovator-hunt',
  46 + digester: 'innovator-digest',
  47 + evolver: 'innovator-evolver',
  48 +};
  49 +
  50 +const log = (...a) => console.log(DRY ? '[dry-run]' : '[migrate]', ...a);
  51 +const stats = { dirs: 0, dbRows: 0, companyInstances: 0, skipped: 0 };
  52 +
  53 +/** 用 git mv 保留历史;不在 git 索引里的目录退回 fs.renameSync */
  54 +function moveDir(from, to) {
  55 + if (DRY) return;
  56 + try {
  57 + execFileSync('git', ['mv', from, to], { cwd: ROOT, stdio: 'pipe' });
  58 + } catch {
  59 + fs.renameSync(path.join(ROOT, from), path.join(ROOT, to));
  60 + }
  61 +}
  62 +
  63 +function migrateDirs() {
  64 + for (const [oldName, newName] of Object.entries(RENAMES)) {
  65 + for (const base of ['system/agents', 'system/templates']) {
  66 + const from = `${base}/${oldName}`;
  67 + const to = `${base}/${newName}`;
  68 + const fromAbs = path.join(ROOT, from);
  69 + const toAbs = path.join(ROOT, to);
  70 +
  71 + if (!fs.existsSync(fromAbs)) {
  72 + if (fs.existsSync(toAbs)) { stats.skipped++; } // 已迁移过
  73 + continue;
  74 + }
  75 + if (fs.existsSync(toAbs)) {
  76 + log(`⚠️ 跳过(新旧同时存在,需人工处理): ${from} / ${to}`);
  77 + stats.skipped++;
  78 + continue;
  79 + }
  80 + log(`目录: ${from} → ${to}`);
  81 + moveDir(from, to);
  82 + stats.dirs++;
  83 + }
  84 + }
  85 +}
  86 +
  87 +function migrateDb() {
  88 + const { getDb } = require(path.join(ROOT, 'server/services/graph-db'));
  89 + const db = getDb();
  90 + const sel = db.prepare('SELECT id, legacy_path FROM system_agents WHERE id = ?');
  91 + const upd = db.prepare('UPDATE system_agents SET id = ?, legacy_path = ?, updated_at = ? WHERE id = ?');
  92 + const now = new Date().toISOString();
  93 +
  94 + const tx = db.transaction(() => {
  95 + for (const [oldName, newName] of Object.entries(RENAMES)) {
  96 + const row = sel.get(oldName);
  97 + if (!row) continue;
  98 + const newPath = (row.legacy_path || '').replace(
  99 + new RegExp(`(^|/)${oldName}$`), `$1${newName}`
  100 + );
  101 + log(`DB: system_agents ${oldName} → ${newName}(legacy_path: ${row.legacy_path} → ${newPath})`);
  102 + if (!DRY) upd.run(newName, newPath, now, oldName);
  103 + stats.dbRows++;
  104 + }
  105 + });
  106 + tx();
  107 +}
  108 +
  109 +/** 有公司雇过这四个的话,同步改私有目录名与 company.json.agents[] */
  110 +function migrateCompanyInstances() {
  111 + const companiesDir = path.join(ROOT, 'data/companies');
  112 + if (!fs.existsSync(companiesDir)) return;
  113 +
  114 + for (const d of fs.readdirSync(companiesDir, { withFileTypes: true })) {
  115 + if (!d.isDirectory()) continue;
  116 + const cid = d.name;
  117 +
  118 + for (const [oldName, newName] of Object.entries(RENAMES)) {
  119 + const from = path.join(companiesDir, cid, 'agents', oldName);
  120 + const to = path.join(companiesDir, cid, 'agents', newName);
  121 + if (!fs.existsSync(from) || fs.existsSync(to)) continue;
  122 + log(`实例: ${cid}/agents/${oldName} → ${newName}`);
  123 + if (!DRY) fs.renameSync(from, to);
  124 + stats.companyInstances++;
  125 + }
  126 +
  127 + const cjPath = path.join(companiesDir, cid, 'company.json');
  128 + if (!fs.existsSync(cjPath)) continue;
  129 + let cj;
  130 + try { cj = JSON.parse(fs.readFileSync(cjPath, 'utf-8')); } catch { continue; }
  131 + if (!Array.isArray(cj.agents)) continue;
  132 +
  133 + const next = cj.agents.map(a => RENAMES[a] || a);
  134 + if (JSON.stringify(next) !== JSON.stringify(cj.agents)) {
  135 + log(`实例: ${cid}/company.json agents[] 已更新`);
  136 + if (!DRY) {
  137 + cj.agents = next;
  138 + fs.writeFileSync(cjPath, JSON.stringify(cj, null, 2) + '\n', 'utf-8');
  139 + }
  140 + }
  141 + }
  142 +}
  143 +
  144 +function main() {
  145 + log(DRY ? '=== DRY RUN(不写盘)===' : '=== 开始迁移 ===');
  146 + migrateDirs();
  147 + migrateDb();
  148 + migrateCompanyInstances();
  149 + console.log('\n' + (DRY ? '[dry-run] ' : '') + '汇总:', JSON.stringify(stats));
  150 + if (DRY) console.log('这是 dry-run,未做任何改动。去掉 --dry-run 实际执行。');
  151 + else console.log('完成。代码引用点(retrain-pipeline.js / agent-chat.js / company.js)需另行修改,见 27-NAMING §3.4。');
  152 +}
  153 +
  154 +if (require.main === module) main();
  155 +
  156 +module.exports = { RENAMES };
... ...
server/routes/agent-chat.js
... ... @@ -324,7 +324,7 @@ function buildSystemPrompt(agentDir, userMessage) {
324 324  
325 325 // ── Layer 3: Agent 专属文件 ──
326 326 const agentListText = Object.entries(fullSystemConfig.agents || {})
327   - .filter(([name]) => name !== 'master' && name !== 'innovator')
  327 + .filter(([name]) => name !== 'master' && name !== 'org-innovator')
328 328 .map(([name, cfg]) => {
329 329 const typeLabel = cfg.type === 'orchestrator' ? '子编排' : cfg.type;
330 330 return `- ${name} (${typeLabel}): ${cfg.description || ''}`;
... ...
server/routes/company.js
... ... @@ -522,7 +522,7 @@ router.get(&#39;/templates/:templateId/logs&#39;, (req, res) =&gt; {
522 522 // 扫描 agent-creator 和 innovator 的对话,匹配 tpl-gen-{id} 和 tpl-train-{id}
523 523 const scanAgents = [
524 524 { agentId: 'agent-creator', prefix: `tpl-gen-${templateId}`, type: 'generate', label: '🤖 Agent Creator' },
525   - { agentId: 'innovator', prefix: `tpl-train-${templateId}`, type: 'train', label: '🎓 Innovator' },
  525 + { agentId: 'org-innovator', prefix: `tpl-train-${templateId}`, type: 'train', label: '🎓 Innovator' },
526 526 ];
527 527  
528 528 for (const scan of scanAgents) {
... ...
server/services/retrain-pipeline.js
... ... @@ -158,7 +158,7 @@ class RetrainPipeline {
158 158 label: '🔍 Step 1/3: ReHunt',
159 159 jobStatus: 'hunting',
160 160 jobProgress: '正在猎取领域知识 (Hunt)...',
161   - agent: 'hunter',
  161 + agent: 'innovator-hunt',
162 162 prompt: [
163 163 `请对 Skill "${this.skillName}" 重新猎取领域知识:`,
164 164 `- Skill 描述: ${this.skill.description || '无'}`,
... ... @@ -176,7 +176,7 @@ class RetrainPipeline {
176 176 label: '📝 Step 2/3: ReDigest',
177 177 jobStatus: 'digesting',
178 178 jobProgress: '正在消化提炼知识 (Digest)...',
179   - agent: 'digester',
  179 + agent: 'innovator-digest',
180 180 prompt: [
181 181 `请对 Skill "${this.skillName}" 重新消化并更新评估基准:`,
182 182 `- 更新后的知识: ${this.skillName}/hunter/knowhow.md`,
... ... @@ -193,7 +193,7 @@ class RetrainPipeline {
193 193 label: '🔄 Step 3/3: Evolve',
194 194 jobStatus: 'evolving',
195 195 jobProgress: '进化优化中 (目标 ≥95分)...',
196   - agent: 'evolver',
  196 + agent: 'innovator-evolver',
197 197 prompt: [
198 198 `请对 Skill "${this.skillName}" 进行进化优化:`,
199 199 `- skillName: ${this.skillName}`,
... ... @@ -440,9 +440,9 @@ class RetrainPipeline {
440 440 // 同步 checkpoint — 当 Master 调用 call_sub_agent 时更新
441 441 if (tc.tool === 'call_sub_agent') {
442 442 const agentToStep = {
443   - 'hunter': 're_hunt',
444   - 'digester': 're_digest',
445   - 'evolver': 'evolve',
  443 + 'innovator-hunt': 're_hunt',
  444 + 'innovator-digest': 're_digest',
  445 + 'innovator-evolver': 'evolve',
446 446 };
447 447 const step = agentToStep[tc.params?.agent];
448 448 if (step) {
... ... @@ -469,7 +469,7 @@ class RetrainPipeline {
469 469 // 也检查 tool call 结果中的分数
470 470 if (!finalScore && result.toolCalls) {
471 471 for (const tc of result.toolCalls) {
472   - if (tc.tool === 'call_sub_agent' && tc.params?.agent === 'evolver') {
  472 + if (tc.tool === 'call_sub_agent' && tc.params?.agent === 'innovator-evolver') {
473 473 const evolveOutput = tc.result?.output || '';
474 474 const sm = evolveOutput.match(/最终分数[::]\s*(\d+)/);
475 475 if (sm) finalScore = parseInt(sm[1]);
... ...
system/agents/digester/agent.md renamed to system/agents/innovator-digest/agent.md
system/agents/digester/config.json renamed to system/agents/innovator-digest/config.json
system/agents/digester/heartbeat.md renamed to system/agents/innovator-digest/heartbeat.md
system/agents/digester/identity.md renamed to system/agents/innovator-digest/identity.md
system/agents/digester/plan.md renamed to system/agents/innovator-digest/plan.md
system/agents/digester/soul.md renamed to system/agents/innovator-digest/soul.md
system/agents/digester/todo.md renamed to system/agents/innovator-digest/todo.md
system/agents/digester/tools.md renamed to system/agents/innovator-digest/tools.md
system/agents/digester/user.md renamed to system/agents/innovator-digest/user.md
system/agents/evolver/agent.md renamed to system/agents/innovator-evolver/agent.md
system/agents/evolver/config.json renamed to system/agents/innovator-evolver/config.json
system/agents/evolver/debug_rubric.js renamed to system/agents/innovator-evolver/debug_rubric.js
system/agents/evolver/heartbeat.md renamed to system/agents/innovator-evolver/heartbeat.md
system/agents/evolver/identity.md renamed to system/agents/innovator-evolver/identity.md
system/agents/evolver/soul.md renamed to system/agents/innovator-evolver/soul.md
system/agents/evolver/tasks/task_youtube_1775225752.json renamed to system/agents/innovator-evolver/tasks/task_youtube_1775225752.json
system/agents/evolver/todo.md renamed to system/agents/innovator-evolver/todo.md
system/agents/evolver/tools.md renamed to system/agents/innovator-evolver/tools.md
system/agents/evolver/user.md renamed to system/agents/innovator-evolver/user.md
system/agents/hunter/agent.md renamed to system/agents/innovator-hunt/agent.md
system/agents/hunter/collect_seed.js renamed to system/agents/innovator-hunt/collect_seed.js
system/agents/hunter/config.json renamed to system/agents/innovator-hunt/config.json
system/agents/hunter/heartbeat.md renamed to system/agents/innovator-hunt/heartbeat.md
system/agents/hunter/identity.md renamed to system/agents/innovator-hunt/identity.md
system/agents/hunter/seed_data.json renamed to system/agents/innovator-hunt/seed_data.json
system/agents/hunter/soul.md renamed to system/agents/innovator-hunt/soul.md
system/agents/hunter/system/templates/trend-scout-global/train/hunt/seed_data.json renamed to system/agents/innovator-hunt/system/templates/trend-scout-global/train/hunt/seed_data.json
system/agents/hunter/todo.md renamed to system/agents/innovator-hunt/todo.md
system/agents/hunter/tools.md renamed to system/agents/innovator-hunt/tools.md
system/agents/hunter/user.md renamed to system/agents/innovator-hunt/user.md
system/agents/innovator/.claude/scheduled_tasks.json renamed to system/agents/org-innovator/.claude/scheduled_tasks.json
system/agents/innovator/agent.md renamed to system/agents/org-innovator/agent.md
system/agents/innovator/agent_data/story-architect/hunt/interactive_drama.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/interactive_drama.md
system/agents/innovator/agent_data/story-architect/hunt/knowhow.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/knowhow.md
system/agents/innovator/agent_data/story-architect/hunt/resurgence_business.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/resurgence_business.md
system/agents/innovator/agent_data/story-architect/hunt/suspense_inference.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/suspense_inference.md
system/agents/innovator/agent_data/story-architect/hunt/sweet_romance.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/sweet_romance.md
system/agents/innovator/agent_data/story-architect/hunt/toplist.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/toplist.md
system/agents/innovator/agent_data/story-architect/hunt/xianxia_cultivation.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/xianxia_cultivation.md
system/agents/innovator/config.json renamed to system/agents/org-innovator/config.json
system/agents/innovator/cron.json renamed to system/agents/org-innovator/cron.json
system/agents/innovator/docs/SKILL.md renamed to system/agents/org-innovator/docs/SKILL.md
system/agents/innovator/docs/benchmark_template.md renamed to system/agents/org-innovator/docs/benchmark_template.md
system/agents/innovator/docs/crawl_runner_template.py renamed to system/agents/org-innovator/docs/crawl_runner_template.py
system/agents/innovator/docs/evolving_log_template.md renamed to system/agents/org-innovator/docs/evolving_log_template.md
system/agents/innovator/docs/l1-api-request/SKILL.md renamed to system/agents/org-innovator/docs/l1-api-request/SKILL.md
system/agents/innovator/docs/l1-data-extract/SKILL.md renamed to system/agents/org-innovator/docs/l1-data-extract/SKILL.md
system/agents/innovator/docs/l1-diff-checker/SKILL.md renamed to system/agents/org-innovator/docs/l1-diff-checker/SKILL.md
system/agents/innovator/docs/l1-file-read/SKILL.md renamed to system/agents/org-innovator/docs/l1-file-read/SKILL.md
system/agents/innovator/docs/l1-kv-store/SKILL.md renamed to system/agents/org-innovator/docs/l1-kv-store/SKILL.md
system/agents/innovator/docs/l1-search-engine/SKILL.md renamed to system/agents/org-innovator/docs/l1-search-engine/SKILL.md
system/agents/innovator/docs/l1-shell-exec/SKILL.md renamed to system/agents/org-innovator/docs/l1-shell-exec/SKILL.md
system/agents/innovator/docs/l1-text-transform/SKILL.md renamed to system/agents/org-innovator/docs/l1-text-transform/SKILL.md
system/agents/innovator/docs/l1-web-fetch/SKILL.md renamed to system/agents/org-innovator/docs/l1-web-fetch/SKILL.md
system/agents/innovator/docs/l1-webhook-push/SKILL.md renamed to system/agents/org-innovator/docs/l1-webhook-push/SKILL.md
system/agents/innovator/docs/l2-web-research/SKILL.md renamed to system/agents/org-innovator/docs/l2-web-research/SKILL.md
system/agents/innovator/docs/meta_benchmark/SKILL.md renamed to system/agents/org-innovator/docs/meta_benchmark/SKILL.md
system/agents/innovator/docs/meta_creator/SKILL.md renamed to system/agents/org-innovator/docs/meta_creator/SKILL.md
system/agents/innovator/docs/meta_digest/SKILL.md renamed to system/agents/org-innovator/docs/meta_digest/SKILL.md
system/agents/innovator/docs/meta_evolving/SKILL.md renamed to system/agents/org-innovator/docs/meta_evolving/SKILL.md
system/agents/innovator/docs/meta_hunt/SKILL.md renamed to system/agents/org-innovator/docs/meta_hunt/SKILL.md
system/agents/innovator/docs/meta_research/SKILL.md renamed to system/agents/org-innovator/docs/meta_research/SKILL.md
system/agents/innovator/docs/skill_list_template.md renamed to system/agents/org-innovator/docs/skill_list_template.md
system/agents/innovator/heartbeat.md renamed to system/agents/org-innovator/heartbeat.md
system/agents/innovator/identity.md renamed to system/agents/org-innovator/identity.md
system/agents/innovator/plan.md renamed to system/agents/org-innovator/plan.md
system/agents/innovator/soul.md renamed to system/agents/org-innovator/soul.md
system/agents/innovator/todo.md renamed to system/agents/org-innovator/todo.md
system/agents/innovator/tools.md renamed to system/agents/org-innovator/tools.md
system/agents/innovator/user.md renamed to system/agents/org-innovator/user.md
system/templates/digester/SKILL.md renamed to system/templates/innovator-digest/SKILL.md
system/templates/digester/agent.md renamed to system/templates/innovator-digest/agent.md
system/templates/digester/config.json renamed to system/templates/innovator-digest/config.json
system/templates/digester/heartbeat.md renamed to system/templates/innovator-digest/heartbeat.md
system/templates/digester/identity.md renamed to system/templates/innovator-digest/identity.md
system/templates/digester/plan.md renamed to system/templates/innovator-digest/plan.md
system/templates/digester/soul.md renamed to system/templates/innovator-digest/soul.md
system/templates/digester/todo.md renamed to system/templates/innovator-digest/todo.md
system/templates/digester/tools.md renamed to system/templates/innovator-digest/tools.md
system/templates/digester/train/digest/benchmark_v1.md renamed to system/templates/innovator-digest/train/digest/benchmark_v1.md
system/templates/digester/train/digest/industry_avg_score.md renamed to system/templates/innovator-digest/train/digest/industry_avg_score.md
system/templates/digester/train/digest/test.jsonl renamed to system/templates/innovator-digest/train/digest/test.jsonl
system/templates/digester/train/digest/train.jsonl renamed to system/templates/innovator-digest/train/digest/train.jsonl
system/templates/digester/train/evolve/evolve_report.md renamed to system/templates/innovator-digest/train/evolve/evolve_report.md
system/templates/digester/train/evolve/scorer.js renamed to system/templates/innovator-digest/train/evolve/scorer.js
system/templates/digester/train/hunt/crawl_config.json renamed to system/templates/innovator-digest/train/hunt/crawl_config.json
system/templates/digester/train/hunt/knowhow_v1.md renamed to system/templates/innovator-digest/train/hunt/knowhow_v1.md
system/templates/digester/train/hunt/seed_data.json renamed to system/templates/innovator-digest/train/hunt/seed_data.json
system/templates/digester/user.md renamed to system/templates/innovator-digest/user.md
system/templates/evolver/agent.md renamed to system/templates/innovator-evolver/agent.md
system/templates/evolver/config.json renamed to system/templates/innovator-evolver/config.json
system/templates/evolver/identity.md renamed to system/templates/innovator-evolver/identity.md
system/templates/evolver/soul.md renamed to system/templates/innovator-evolver/soul.md
system/templates/evolver/todo.md renamed to system/templates/innovator-evolver/todo.md
system/templates/evolver/tools.md renamed to system/templates/innovator-evolver/tools.md