Commit 367b4d5035c92abf423659e7b8a807f1ca8a425e

Authored by yibo
1 parent e20d4375

docs(27-P3C): 登记批 1 顺手要收敛的一处路径重复,以及一处刻意不做的改名

并行会话提醒 company-service.js 的 TEMPLATES_DIR 名字过期(实指
system/agents)。查调用点时发现更值得记的是 company.js:同一个
路径常量在这个文件里被重复定义了 7 次,6 处硬编码
path.resolve(__dirname,'../../system/agents'),只有 1 处用了权威
访问器 locator.AGENTS_ROOT。

这个路径 2026-08-18 刚被 agent 目录重构搬过一次 —— 下次再搬,
改 6 处漏 1 处就是静默 bug。批 1 本来就要大改 company.js(全部新
端点挂这里),顺手收敛成模块级一份,不是为改而改。

这与本文档反复点名的是同一个病:canDispatch 的取值域被前端复述过
一份、ACTIVE_ROOT_RUN_STATUS 在两个文件里逐字重复、
isUngraduatedStatus() 的取值域不许在别处复述。同一个事实只能有
一处持有者,路径也是事实。

同时登记一条刻意不做的:company-service.js 那个 TEMPLATES_DIR
改名要动 50 处、跨 6 个文件、零功能收益,不值得。留记录是为了
说明它是已知的,不是没人看见。

顺带独立复验:template-refs.test.js 4/4 通过,27-P3/P4 的
blocker 21(CI 因骨架悬空引用而红)确实已关闭。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs/todo/system-design/27-p3c-goal-task-model.md
@@ -485,6 +485,12 @@ for (const t of queuedTasks) { @@ -485,6 +485,12 @@ for (const t of queuedTasks) {
485 485
486 全部挂在 `server/routes/company.js`。错误响应沿用现有 `{ error, hint, ... }` 形态。 486 全部挂在 `server/routes/company.js`。错误响应沿用现有 `{ error, hint, ... }` 形态。
487 487
  488 +> **批 1 顺手收敛一处**(不是为改而改 —— 批 1 本来就要大改这个文件):`company.js` 里 `const TEMPLATES_DIR` 被**重复定义了 7 次**,其中 6 处硬编码 `path.resolve(__dirname, '../../system/agents')`,只有 1 处(`:220`)用了权威访问器 `locator.AGENTS_ROOT`。2026-08-18 的 agent 目录重构刚把这个路径搬过一次 —— **下次再搬,改 6 处、漏 1 处就是一个静默 bug**。收敛成模块级的一份 `locator.AGENTS_ROOT` 即可。
  489 +>
  490 +> 这与本文档反复点名的是**同一个病**:`canDispatch` 的取值域被前端复述过一份(§六.3 的教训)、`ACTIVE_ROOT_RUN_STATUS` 在两个文件里逐字重复(§九.1)、`isUngraduatedStatus()` 的取值域不许在别处复述(§四.9)。**同一个事实只能有一处持有者 —— 路径也是事实。**
  491 +>
  492 +> (顺带记一条**不做**的:`company-service.js` 的 `const TEMPLATES_DIR = locator.AGENTS_ROOT` 名字已过期,读的人会以为它指 `system/templates`。但改名要动 50 处、跨 6 个文件、零功能收益 —— 不值得,留着这条记录说明它是已知的、不是没人看见。)
  493 +
488 ### 6.1 先做一件清理:退役 OKR 的 `/goals` 别名 494 ### 6.1 先做一件清理:退役 OKR 的 `/goals` 别名
489 495
490 `index.js` / `agent-server.js` 里 `app.use('/api/goals', require('./routes/okr'))` 与 `company.js` 的 `okrPath()` 里那条 `/:companyId/goals${suffix}` 一并删除。§二.3 已核实**零调用方**。删完 `/goals` 这个词在整套 API 里只剩一个含义。 496 `index.js` / `agent-server.js` 里 `app.use('/api/goals', require('./routes/okr'))` 与 `company.js` 的 `okrPath()` 里那条 `/:companyId/goals${suffix}` 一并删除。§二.3 已核实**零调用方**。删完 `/goals` 这个词在整套 API 里只剩一个含义。