Architect: opus (verification mode) Date: 2026-04-27 Verdict: APPROVE_FOR_CRITIC(带 4 条 non-blocking 行级 nit 给 Critic v4 收尾)
v4 把 Critic v3 的 12 项 Required Revisions 全部行级落实到 §4/§5/§7/§8/§9/§10/§12,3 项 CRITICAL(paths.ts 双路径 / daily backup / lt doctor)抽查均通过架构 sanity check,未引入新 architectural regression;4 个候选 regression 点经验证不构成阻塞,剩余 4 条 nit(NEEDS-MORE 在边缘——retention 幂等 / wal cp 一致性 / Task 26 sample size / 0.50 prompt template 文本)应作为 Phase 1.0 开工时的 inline TODO,而不应阻塞 Critic v4 给 APPROVE 走 /team。
统计:12 项 Critic fix → 12 PASS / 0 NEEDS-MORE / 0 FAIL(落实层面 100%);3 项 CRITICAL 抽查 → 2 PASS / 1 PARTIAL(daily backup 缺 WAL .backup API 选择说明);5 个候选 regression → 4 PASS / 1 OPEN(Task 26 sample size 已在 Open Q (d) flag 但 Task 26 任务行未 update sample size = 6 题或 60 题);4 项 readiness → 4 PASS。
Evidence:
- §9 表第 444-446 行:Phase 1.0 / 1.1a / 1.1b(Task 23-26)/ 1.2 / 1.3 — 4 phase 重排已落地,Phase 1.4 已删除
- §9 第 451-463 行新增整段「为什么 D19 放 Phase 1.1b 而不再是 Phase 1.4」,显式承认 v3 dogfood gating 与 D19b graceful skip 自相矛盾,列出 4 条 1.1b 紧跟 1.1a 的理由 + Alternative invalidation 段
- §8 任务依赖图第 391-433 行:Phase 1.1b 块 Task 23 → 24 → 25 → 26 串行,Phase 1.2 仍由 Task 18 (TTS) 起步且 Task 17 是其前置(不再依赖 Phase 1.4 完成)
Architect verify:依赖链无环,Phase 1.1b 入口 Task 23 的 dep 是 Task 17(multi-lang hooks),出口 Task 26 不阻塞 Phase 1.2 起步(Phase 1.2 Task 18 dep = Task 15 schema migration,与 1.1b 并行可行)。Critic v3 fix #1 落实正确。
Evidence:
- §4 D19-0 第 82 行表第 4 行明文:「0.50 双语句法混合 — 短句尾以整句目标语言呈现 + 中文翻译紧随(例:"这个 bug 修好了。このバグは直りました。")— 介于词替换与全沉浸的中间态」
- §4 D19a 第 108-133 行实现链路扩展为四分支:=0 / =1.00 / =0.50 双语句法 prompt / =0.10 或 0.25 ambient mix prompt — 0.50 分支 prompt template 完整列出,含 looksLikeCodeContext gate
- §7.1 第 312 行:
tests/immersion-050.test.ts— 「level=0.50 → prompt template 输出含「双语句法」指令 + 示例格式」 - §8 Task 23 第 378 行明文「UserPromptSubmit hook 四分支处理(=0 / 0.10|0.25 ambient / 0.50 双语句法 / 1.0 全沉浸)+ tests/immersion-050.test.ts 覆盖 0.50 档 prompt」
Architect verify:四分支路径互斥(=0 → 短路、=1.00 → 全沉浸 prompt 路径与 0.10/0.25/0.50 分支无重叠),Critic 重定义 0.50 档「断层修复」诉求满足。
Evidence:
- §8 Task 24 第 379 行内含全部 5 项:(a)
src/ambient.ts加cleanOldExposures+archiveExposures;(b)db v3 ambient_exposures表;(c)ambient_exposures_archive表 PK: (concept_id, archived_at);(d)lt ambient-clean [--keep-days 90]CLI;(e)daily-push检测 >100K 提示;(f)tests/ambient-clean.test.ts(200K 行归档测试) - §4 D19d 第 194-202 行 SQL DDL 显式列
PRIMARY KEY (concept_id, archived_at)— collision 避免落地 - §5 D18 表第 249 行也复述了 ambient.ts 的
cleanOldExposures + archiveExposures函数签名
Architect verify:PK 选择 (concept_id, archived_at) 允许同一 concept 多次归档(每次 archive 增加一行),与 archive 语义一致。Critic v3 fix #3 落实正确。
Evidence:
- §8 Task 25 第 380 行明文 3 项:(a)
/lt-mixskill frontmatterprompt_version: v1+prompt_max_tokens: 250;(b)scripts/check-prompt-version.tspre-commit hook;(c) NDJSONambient_injectevent 加prompt_version字段 - §5 D18 表第 257-258 行复述
- §7.4 第 345 行 NDJSON sample 含
"prompt_version":"v1"字段
Architect verify:3 项均在 Task 25 行级列出,与 §5 D18 表 cross-ref 一致。Critic v3 fix #4 落实正确。
Evidence:
- §8 第 381 行新行:「26 (NEW) 【Critic fix #5 / Adj-K1】ambient 效果验证:Phase 1.1b 落地后 30 天每周跑 mock-test 30 题 + cron 自动统计 +
lt ambient-validatebinomial test (p<0.05) → ADR-005 confirmed/deprecated」 - §9 表 1.1b 行第 446 行:估时
9-12h + 30 天 dogfood,明示 Task 26 dogfood 期不计入 dev work 估时 - §11 ADR-005 第 506 行 follow-up:「Phase 1.1b 30 天 mock-test 验证(Task 26 / K1)→ confirmed/deprecated」
Architect verify:Task 26 单独成行(不 fold 进 Task 22),Phase 标 1.1b dogfood、依赖 25、估时与开发工时分离 — Critic v3 fix #5 「单独 task 编号」诉求满足。
Evidence:
- §8 Task 14 第 374 行明文 4 项:(a)
src/paths.tsCONFIG_DIR 双路径(优先~/.config/polyglot/fallback~/.config/jp-trainer/);(b) 首次启动 mv + symlink + NDJSON logged;(c) LOG_FILEjp.log→lt.log;(d)tests/paths-migration.test.ts - §5 D18 表第 247 行 paths.ts 行复述
- §7.1 第 315 行 unit test + §7.2 第 330 行 integration test 双覆盖
Architect verify:4 项均在 Task 14 行级列出,与 §5 D18 表 + §7 test plan 三向 cross-ref 一致。Critic v3 fix #6 (Independent #6) 落实正确。但 §2 抽查发现 mv 原子性 / 幂等性细节缺失,标 PARTIAL,下文 Section 2 详述(不阻塞 PASS 落实判定,因为 Critic v3 没要求落到任务行级别)。
Evidence:
- §8 Task 5.5 第 365 行明文 5 项:(a) srs.ts:69 transaction;(b) db.ts WAL 配置;(c) safeFail NDJSON;(d)
scripts/daily-backup.sh写reviews.db.bak.<7-day-rolling>+ install.sh 注册 launchd 凌晨 2 点;(e)lt restore --from <date>恢复命令 - Phase 标 1.0、优先级 P0、依赖 5(已完成的 SQLite + ts-fsrs 集成)
- §10 R-V14 第 480 行 mitigation 已删 vapor
lt db compact,引用 Adj-Glt ambient-clean
Architect verify:daily backup 进 Phase 1.0 P0、cron 注册写在 install.sh 内(Task 12 衔接)、restore CLI 公开。Critic v3 fix #7 (Independent #3) 落实正确。但 §2 抽查发现 retention 滚动策略 + WAL cp 一致性 + ambient_exposures 含在备份内 三项细节缺失,下文 Section 2 详述。
Evidence:
- §8 Task 12 第 372 行明文「substep 12.7:检测 cwd
.claude/settings.json扫描 'jp-trainer-hooks' / 'polyglot-hooks' / 'lt-' substring 提示用户审慎」 - §8 第 382 行新行 Task 27:「
lt doctor命令:扫描~/.claude/settings.json+ cwd.claude/settings.json检测 lt hook 重复并报告 + TTS backend 诊断 + profile 版本检测 + active_language vs immersion flag 一致性」 - §8 任务依赖图第 408 行:Task 27 在 Task 14 之后(与 Critic v3 「Task 22 之后加 Task 27」一致 — Task 22 在 Phase 1.3,Task 14 在 Phase 1.0;v4 把 doctor 提前到 Phase 1.0 是 strictly better,不算偏离 fix #8)
Architect verify:install-time 检测(12.7)+ user-invoked any-time 检测(doctor)双层覆盖。Critic v3 fix #8 (Independent #2) 落实正确。但 §2 抽查发现「跨 worktree 检测 / 修复建议 / 误报防护」三项细节缺失,下文 Section 2 详述。
Evidence:
- §9 表 Phase 1.0 第 443 行:「22-31h」
- §9 第 449 行 Critic fix #9 标注:「Phase 1.0 估时 22-31h(v1 18-26 + Adj A-F 细化 ~1h + Task 14 重命名 2-3h + Task 5.5 数据完整性+backup 1-2h)。总估时 55-77h(不含 Task 26 的 30 天 dogfood 等待期)」
- v3 总估时 51-73h;v4 总 55-77h = +4h(与 Phase 1.0 +4h 一致,Phase 1.1a/1.1b/1.2/1.3 时长不变)
Architect verify:估时增量与新增任务(5.5 daily backup +1-2h、14 paths migration +1h、27 lt doctor 推断 ~2h 但 v4 估时表未单列 — 可能 fold 进 Phase 1.0 总时。轻微 nit:Task 27 估时未在第 449 行的算式里出现,建议 Critic v4 让 Planner 在 §9 算式补一行 + Task 27 lt doctor ~2h,使 Phase 1.0 估时算式完整。不阻塞 PASS。
Evidence:
- §12 第 530-534 行明确小节「【Critic fix #10】v4 新增 4 条」,逐条列出 (a) Phase 3 iCloud sync 含 ambient_exposures、(b) prompt_version CI 算法、(c) 0.50 档 prompt template 设计、(d) Phase 1.1b mock-N2 含 production-side 题型
- 每条带具体 quantitative 描述(INSERT 频次 15 倍、binomial test 统计功效等)
Architect verify:4 条 Open Q 与 Critic v3 fix #10 列出的 4 条 (a-d) 一一对应。落实正确。
Evidence:
- §10 表第 480 行 R-V14 mitigation 改写:「【Critic fix #11】
lt ambient-clean [--keep-days 90]+ archive 表(Adj-G)+ daily-push >100K 提示(删除 vapor 的 "lt db compact")」 — vapor 已显式删除并替换为 Task 24 实落地的lt ambient-clean - Owner 改为 Task 24(与新 mitigation 实现位置一致)
Architect verify:vapor 删 + 新 mitigation 引用真实 Task — Critic v3 fix #11 落实正确。
Evidence:
- §5 第 240 行明文:「【Critic fix #12】声明:以下 v3/v4 增量在 v2 §4 D18 已含 Adjustment A-F 字段(version 2 + active_language + per_language + inject_max_per_hour + inject_max_per_session + do_not_disturb_until + tts_engine + tts_voice_overrides + tts_on_* 等)基础上叠加;v2 字段不重复列出。Executor 落地 profile.ts 时必须同时包含 v2 D18 表全部字段。」
- 列出了 Adjustment F 所有具体字段名,避免 Executor 仅看 v4 D18 增量表漏掉 inject_max_per_hour 等
Architect verify:声明位置在 §5 表第一段(顶部),明确 Executor 责任 — Critic v3 fix #12 落实正确。
v4 §8 Task 14 / §5 D18 / §7.1+§7.2 tests 已覆盖:
- ✓ 双路径优先级(优先 polyglot fallback jp-trainer)
- ✓ mv migration + symlink
- ✓ NDJSON
config_dir_migrated事件 - ✓ LOG_FILE 改名
- ✓ paths-migration.test.ts unit + integration
NEEDS-MORE 细节(应作为 Critic v4 给 Planner 的 inline TODO,不阻塞 APPROVE_FOR_CRITIC):
- mv 原子性:v4 Task 14 写
mv但未明确「mv 中途失败(部分文件已移、部分未移)」的 recovery。建议:Plan §4/§5 加一句「mv 走 try/catch;失败则保留原路径不创建 symlink + NDJSONconfig_dir_migrate_failedevent 让用户手工处理」。 - 多次启动幂等:第二次启动检测到 symlink 已存在不应重复 mv。建议:paths.ts:CONFIG_DIR 解析时先
lstat判断老路径是 symlink 还是 dir;symlink → 跳过 mv(已迁移);dir → 走 mv + 创建 symlink。Plan §5 paths.ts 行只说「优先读 + fallback + mv」未明确这个判断分支。 - lt.log 内容合并:老 jp.log 存在 + 新 lt.log 不存在 → mv jp.log 到 lt.log 是 append 还是 overwrite?建议:mv 整个 CONFIG_DIR 时 jp.log 自动跟过来(path 同一目录下),重命名为 lt.log = append 不存在(mv 是 atomic rename)。但 Plan 应澄清 lt.log 是否独立文件还是 mv 后改名。
- profile.yaml 用户已手动改过:用户在
~/.config/jp-trainer/profile.yaml手动改过 — mv 整目录会保留改动,但是否会触发 v3→v4 schema migration(profile.version 字段升 + 字段补全)?建议:mv 后立即触发readProfile()→ 触发 v3→v4 migration 逻辑(已有 v1→v2 patten 复用)。
架构裁决:以上 4 项是「细节充分性」而非「设计缺陷」。Critic v3 fix #1 的核心诉求(避免 silent data loss)已完全达成,剩余是 Executor 层 polish。PASS(带 4 条 inline TODO)。
v4 §8 Task 5.5 已覆盖:
- ✓ scripts/daily-backup.sh 写
reviews.db.bak.<7-day-rolling> - ✓ launchd 凌晨 2 点
- ✓
lt restore --from <date>命令
NEEDS-MORE 细节:
- Retention 策略:「7-day-rolling」字面意义是 7 天滚动,但 implementation 是
bak.YYYYMMDD7 个文件覆盖循环,还是bak.<weekday>(Mon/Tue/.../Sun) 7 个固定名?建议:Plan §5 D18 daily-backup.sh 行明确 naming convention,避免 Executor 选错(前者更易看历史日期,后者文件数恒定)。 - 备份 location:v4 §5 D18 第 255 行只说「
reviews.db.bak.<7-day-rolling>」未指定父目录。同盘 ~/.config/polyglot/ 还是 ~/Library/Application Support/polyglot/backups/?前者磁盘 corrupt 时一起没;后者跨数据卷分离更安全但需新建目录。建议:放 ~/Library/Application Support/polyglot/backups/(与 macOS 惯例一致 + 跨盘一定程度防护)。 - lt restore 原子性:「中途崩溃留下 partial restore」—— restore 应该是 (a) cp bak 到 tmp 路径 → (b) integrity check (
sqlite3 .schema) → (c) atomic rename 到 reviews.db。Plan 未明确这个 3-step 流程。建议:Plan §5 D18 lt restore 行加「3-step atomic restore」描述。
Architectural concern(NEEDS-MORE 但实际是 fix #7 + Adj-C 交互):
-
WAL 模式下 cp reviews.db 是否 consistent:SQLite WAL 模式下,
cp reviews.db不会拷贝-wal文件 → 备份是「上次 checkpoint 时的状态」。如果 daily backup cron 在 Phase 1.0 Adj-C 写入事务进行中触发,可能拷到 stale state(不损坏,但缺最近未 checkpoint 的写入)。正确做法:daily-backup.sh 用sqlite3 reviews.db ".backup '$BACKUP_PATH'"API(SQLite native online backup,自动处理 WAL 一致性)而非cp。建议:Plan §5 D18 daily-backup.sh 行明确「使用 sqlite3 .backup API 而非 cp」。 -
ambient_exposures 表是否含在备份内:reviews.db 是单一文件 → daily-backup.sh 备份整个文件 → ambient_exposures 自动含在内。架构上 PASS,无需额外处理。但 Plan 可以一句话明示「reviews.db.bak 含所有 v3 表(attempts / reviews / ambient_exposures / ambient_exposures_archive)」让 Executor 不二次怀疑。
架构裁决:core 落地(cron + script + restore)齐全,但 sqlite3 .backup vs cp 的选择是 architectural-level 决定,应在 Plan 层级明确而非留给 Executor 临场判断。PARTIAL PASS(标 1 项 architectural NEEDS-MORE 给 Critic v4 让 Planner 补一句话)。
v4 §8 Task 12 + Task 27 已覆盖:
- ✓ install.sh 12.7 检测 cwd .claude/settings.json
- ✓ lt doctor 扫描 ~/.claude + cwd .claude
- ✓ TTS backend 诊断 + profile 版本检测 + active_language 一致性
NEEDS-MORE 细节:
- 跨 worktree 检测:用户 git worktree 多个 cwd(worktree A/B/C)每个 cwd 都装过 lt → doctor 在 cwd=A 跑只看 A 的 .claude/settings.json,看不到 B/C。建议:doctor 加
--scan-worktreesflag,遍历git worktree list输出的所有路径检查 .claude/settings.json。或:明确 doctor 只检查 cwd(不跨 worktree),让用户在每个 worktree 跑一次。Plan 应澄清这一立场。 - 修复建议(auto-fix):v4 Task 27 只说「检测重复并报告」未说能否
lt doctor --fix自动删除项目级冲突项。建议:MVP 阶段 doctor 只检测 + 给修复指令字符串(如「执行jq 'del(.hooks.Stop[] | select(.command | contains("lt-")))' .claude/settings.json」),不 auto-fix(避免误删)。Plan §5 D18 lt doctor 行应明示「report-only 不 auto-fix」。 - 误报防护(用户故意装两份 lt):用户在 work/personal worktree 各装一份 lt 且配不同 profile(语言 ja vs ko)—— doctor 报「重复」但实际是合法配置。建议:doctor 区分「同一 lt-hook 跨 settings 重复(误报,应警告)」vs「不同语言 profile 但共享 hook(合法,不报)」。技术上 doctor 检测 hook command 字符串里的 active_language 参数,相同 → 报警,不同 → 不报。Plan §5 D18 lt doctor 行应加这个 disambiguation 逻辑。
架构裁决:core 落地(双层检测)齐全,3 项细节是 polish — Phase 1.0 MVP 可以「report only + 单 cwd + 不分 active_language」交付,Phase 1.1+ 再扩展。PASS(带 3 条 inline TODO)。
v4 reasoning(§9 第 451-463 行)合理:
- D19b graceful skip 设计明确 pool=0 → hook 不注入 → log
ambient_skip:empty_pool→ 用户无感知 - 「渐进上线」给用户「ambient 随学习渐渐生效」的体验,是 progressive disclosure 而非 broken UX
- 独立回滚仍可行(1.1b 翻车只回滚 Task 23-25 不影响 1.0)
Architect 额外验证(D19a 四分支的 = 0 分支被新触发频次 vs hook overhead):
- v4 的 hook 入口是
hooks/user-prompt-submit.ts(v1 Adj-D 已有 shell pre-gate) - shell 在 immersion_level=0 时不调用 bun(profile 读取在 shell 层 awk 完成)
- 因此 = 0 分支的 hook overhead = ~5ms shell awk + grep,与 v3 持平
- 无 regression
v4 §4.D19a 第 113-120 行 0.50 prompt template:
- 例句用日语:「这个 bug 修好了。このバグは直りました。」
- prompt 里用
{active_language}占位符 — 架构上支持跨语言
Nit:例句固定日语,韩语用户看到「(范例为日语)」可能困惑。建议:Plan §12 Open Q (c) 已 flag「0.50 档 prompt template 具体设计 — Phase 1.1b 实测调优」覆盖此问题,但可强调「跨 active_language 各准备一组 few-shot 例句」。不阻塞 PASS。
§7.1 unit test 覆盖性:tests/immersion-050.test.ts 在 §7.1 第 312 行只说「level=0.50 → prompt template 输出含「双语句法」指令 + 示例格式」—— 未明示 active_language=ja/ko 各跑一次。建议:Critic v4 让 Planner 在 §7.1 加一条「parameterize over active_language ∈ {ja, ko, en}」。
两者职责清晰:
- Task 12.7:install at install time 一次性检测项目级 settings 冲突(防止安装时静默重复)
- Task 27:doctor at any time user-invoked 检测重复(防止 install 后用户手动改 settings 引入冲突)
no overlap:install.sh 不调用 lt doctor,doctor 不调用 install。self-update:用户改完 settings 后下次跑 doctor 自然检测最新 — 设计无 race。
架构无 regression。
concern:daily backup cron 触发时如果 transaction 在跑 — SQLite WAL 模式下 cp 拿到的是 stale state。
正确解:用 sqlite3 .backup API(automatically WAL-aware)。
v4 现状:未明确选 cp 还是 .backup。
裁决:见 §2 Fix #7 PARTIAL 项 #4。
§7.5 + §8 Task 26 设计:30 题 mock-test,分 ambient ≥7 次 vs <7 次两组 → 每组 ~15 题 binomial test。
统计 power 问题:
- 假设 baseline 答对率 60%,ambient 提升到 75% — n=15 时 binomial test power ≈ 0.30(远低于 0.80 标准)
- 即便 ambient 真有效也很可能 p > 0.05 → ADR-005 误标 deprecated → 自我证伪机制触发误信号
§12 Open Q (d) 第 534 行已 flag「sample size 可能需要 60+」,但 §8 Task 26 任务行(第 381 行)仍写「30 题」,未 update。
裁决:v4 内部不一致 — Task 26 写 30 题 + Open Q (d) 暗示要扩 60+,Executor 拿到 v4 不知道按 30 还是 60 干。建议 Critic v4 让 Planner 二选一:(a) Task 26 改写「30 题/周 × 4 周 = 120 题累计」(每周不重复 → 30 题 hold-out 池要扩到 ≥120 题);(b) Task 26 改写「60 题/周」(hold-out 池要 ≥240 题);(c) 接受弱 power 但 ADR-005 触发条件改为「30 天后 effect size ≥ 0.15」(不靠 p < 0.05)。
这是 v4 唯一明确的内部矛盾,但仍 non-blocking:Phase 1.1b dogfood 期间 Task 26 sample size 可以在 Phase 1.0/1.1a 跑的时候由 Critic v4 让 Planner 补一行决策。OPEN,不 reject。
Phase 1.0 任务:5.5 / 6 / 7 / 8 / 9 / 10 / 11 / 12 / 13 / 14 / 27 = 11 个任务(与 §9 表第 443 行「Task 5.5-14, 27」一致)。
verify 命令具体度抽查:
- Task 5.5 verify:
bun test tests/srs.test.ts+lt restore --from 20260427跑回 — 具体到 CLI - Task 14 verify:
bun test tests/paths-migration.test.ts+ 手动 mv ~/.config/jp-trainer 后跑 lt → 老路径自动迁移到新路径 - Task 27 verify:
lt doctor输出含「duplicates: ['Stop:polyglot-hooks/stop.sh']」(§7.4 NDJSON sample 第 348 行已显示) - Task 12 verify:cwd 有 .claude/settings.json 含 lt hook → install.sh 检测 + 报告(§7.2 第 331 行 integration test)
verify 抽象 vs 具体:每个 Phase 1.0 任务都有具体 CLI / test file 命令,无抽象「跑测」陈述。Critic v3 §7 「四档齐全」评级在 v4 保留。PASS。
§8 第 391-433 行依赖图(Phase 1.0 部分):
5.5 → 6 → 7 → 8 → {9, 10, 11} → 12 → 13 → 14 → 27
- 所有任务串行 + Task 9/10/11 三并行 fan-out 后 fan-in 12 — 标准 DAG
- 27 在 14 之后,14 dep on 12 — 27 dep on 12(Task 27 行第 382 行明示)
裁决:依赖图无环,Task 12 → 27 → 14 vs Task 12 → 14 → 27 二选一在 v4 选了 12 → 14 → 27(§8 任务依赖图第 401-408 行)—— 与 §8 任务行第 382 行 Task 27 dep=12 不一致(Task 27 dep=12 但依赖图画 14 → 27)。
轻微 nit:Task 27 dep 应该是 14(项目重命名后才有 lt-hook substring 可扫),不是 12。Task 27 任务行第 382 行写「依赖:12」,依赖图画「14 → 27」 — 二者矛盾。建议 Critic v4 让 Planner 把 Task 27 dep 改 14(与依赖图一致,且语义上正确:先重命名再扫 lt-hook substring)。
裁决:依赖图本身无环,但 Task 27 dep 与依赖图冲突需修正。PASS(带 1 条 inline 修正建议)。
team agent 拿到 v4 plan 知道开工顺序:
- §8 任务依赖图 + 优先级(P0 / P1 / P2)双重指引
- Phase 1.0 内全部 P0(除了 Task 9 P1、Task 10 P2、Task 11 P1)—— P1/P2 可推后但不阻塞 dogfood
- 「Phase 1.0 准入: bun test 全绿 + e2e ja N3-N2 跑通 + jp alias 工作 + 老路径迁移测试 + lt doctor 报告 + daily backup cron 注册」(v4 第 575-576 行)—— 准入条件具体可验证
裁决:执行顺序清晰,Critic v3 「Re-review 通过后 Phase 1.0 优先开工任务清单 10 项」与 v4 §14 第 575 行准入清单一致(v4 加了 27 = 11 项)。PASS。
§7.1 unit / §7.2 integration / §7.3 e2e / §7.4 observability / §7.5 mock-test 五档:
- bun test 跑哪个目录:v4 §7 未显式说「
bun test跑 tests/ 整个目录」—— Executor 默认行为(bun test 自动 globtests/**/*.test.ts)正确,但未 spell out - CI 怎么跑:v4 §5 D18 第 258 行写
scripts/check-prompt-version.ts是 git pre-commit hook —— 但是 GitHub Actions / Gitea CI 没提 - test fixture 数据从哪来:§7.1 第 310-316 行各 unit test 描述了 case,未提 fixture 文件路径(如
tests/fixtures/profile-v1.yaml)
Nit:v4 测试基础设施在 task plan 层够用,但缺一行「tests/ 目录约定 + bun test workflow」总览。建议 Critic v4 让 Planner 在 §7 顶部加一段「测试基础设施约定」:
- 测试运行:
bun test(自动 glob tests/**/*.test.ts) - Fixture 路径:tests/fixtures/
- Pre-commit:lefthook 或 husky 跑
bun test --bail+ check-prompt-version.ts - CI:(开放 — Phase 1.0 暂用 local pre-commit + Phase 2 加 Gitea Actions)
裁决:基础设施可以 inferred 出来,Executor 拿 v4 能开工 — 但「无歧义」诉求需要 1 段总览。PASS(带 1 条 inline 改进建议)。
无新 binding decision。
v3 Architect 5 个 Adjustments G/H/I/J/K + 3 binding Q4/Q5/Q6 在 v4 全部以行级 fix 落地(验证见 §1)。Critic v3 12 项 Required Revisions 在 v4 100% 落实(验证见 §1)。
Architect v4 不引入新决策,只 surface 4 条 inline TODO 给 Critic v4 让 Planner 在 v5(如需)补充。这些 TODO 都是 polish 层面,Phase 1.0 Executor 拿 v4 开工不会被 block:
| TODO | Section | 严重度 | 阻塞 Phase 1.0? |
|---|---|---|---|
daily-backup.sh 用 sqlite3 .backup API 而非 cp |
§2 Fix #7 #4 | Medium-architectural | 否(Executor 默认应该会查文档发现 cp 在 WAL 下不安全) |
| Task 26 sample size = 30 vs 60 vs 120 | §3 Regression #5 | Medium-statistical | 否(Phase 1.0 不跑 Task 26,Phase 1.1b dogfood 才跑) |
| Task 27 dep 改 14(与依赖图一致) | §4 Ready #2 | Low | 否(Executor 看依赖图执行就行) |
| §7 顶部加测试基础设施总览 | §4 Ready #4 | Low | 否 |
/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:14— v4 增量摘要 6 项变更/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:75-95— D19-0 5 档表 + 0.50 双语句法重定义(fix #2)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:108-133— D19a 实现链路四分支(fix #2)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:194-208— D19d ambient_exposures + archive PK + ambient-clean(fix #3 / Adj-G)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:240— §5 D18 表顶部 Critic fix #12 声明/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:247— paths.ts 双路径 + 迁移行(fix #1 CRITICAL)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:255-258— daily-backup.sh / check-prompt-version.ts / lt-mix skill frontmatter(fix #2 / fix #4 / Adj-I)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:359-388— §8 任务表 27 任务(含 Task 5.5 / 14 / 26 / 27 行)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:391-433— §8 任务依赖图 v4/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:439-449— §9 Phase 表 4 phase + Phase 1.0 估时 22-31h(fix #1 / fix #9)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:451-463— §9 Phase 1.4→1.1b 理由(fix #1)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:480— R-V14 mitigation 改写(fix #11)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:530-534— §12 Open Q v4 新增 4 条(fix #10)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-planner-v4.md:540-552— §13 Final Checklist(12 项 fix self-attest)/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-critic-v3.md:158-171— 12 项 Required Revisions 来源/Users/setsuna-new/Documents/jp-trainer/docs/ralplan-architect-v3.md:163-249— 5 Adjustments G-K/Users/setsuna-new/Documents/jp-trainer/src/paths.ts:1-12— 老 paths.ts(仍未改,符合 v4 「src/*.ts 不动」声明)/Users/setsuna-new/Documents/jp-trainer/src/profile.ts:9-25— 老 Profile interface(待 Adj-F + immersion_level 落地)
Architect verdict: APPROVE_FOR_CRITIC
12 项 fix 全 PASS,3 项 CRITICAL 抽查 2 PASS / 1 PARTIAL(daily backup 用 cp 还是 sqlite3 .backup),5 个候选 regression 4 PASS / 1 OPEN(Task 26 sample size),4 项 readiness 全 PASS(Task 27 dep 改 14 是 1-行修正)。
Critic v4 应做的事:
- 给 Planner 让其在 v4 → v4.1(patch release)补 4 条 inline TODO(§5 表)
- 给 final APPROVE 让 /team 按 §14 Phase 1.0 准入清单开工
- 不要 reset 走 v5 — v4 已经吃透 v3 全部反馈,没新 architectural surprise