## 问题描述 仓级 `npx spec-wave verify` 的审查门禁消费面 `findLatestReview`(`src/checks/review-gates.ts:92-114` · @ fad4694)只扫描 `docs/harness/reviews/` 与 `reviews/` 两址(址A),新审查存档址 `docs/audits/task-review/`(址B)**完全不入扫描面**。审查文只落址B 时,verify 误报 `missing R<n> review` BLOCKED。 ## 真实代码锚点(2026-10-11 实证 @ fad4694) - `src/checks/review-gates.ts:96`:`const dirs = [path.join(target, 'docs/harness/reviews'), path.join(target, 'reviews')]` —— 扫描面写死两址,址B 不在内 - `:99`:命名 RE `/^(task_.+?)_audit_R(\d+)_.*\.md$/i` —— 不收址B 命名口径 `YYYYMMDD_<slug>_r<n>.md`(无 `task_` 前缀 · 日期前缀 · 小写 `_r<n>` · slug 为 dash 形) - `:116-119`:`findReview` 为同一实现源的布尔投影(status / dry-run / verify 消费)—— 同源同治 - `:46`:spec 审查扫描(`findSpecReview` / `spec_reviews_retention`)同构双址写死 —— 是否一并扩址留评审裁定(址B 目录语义为 task-review · spec 审查暂无址B 落档实证 · 本 issue 倾向不扩 · 登记 follow-up) ## 误报实证(下游仓 ops-desk-api 两起在案) 1. `task_hitl_auto_resume_claim_race.md`(done)—— R1 审查文落 `docs/audits/task-review/20261010_hitl-auto-resume-claim-race_r1.md`,verify 消费址无档 → 误报 missing R<n> review 2. B1/B2 两 task(2026-10-11 实证)—— 审查文只落址B → verify 误报 BLOCKED,已裁定复制审查文回址A 过渡 下游过渡纪律(双址复制:必须落址A、可同时落址B)已钉 `docs/harness/CONVENTION_review_gate_dual_address_v1_zh.md`,存量档零挪零改(址A 133+ 档与址B 既有档原址原内容)。 ## 期望行为 1. `findLatestReview`(及 `findReview` 同源投影)扫描面扩第三址 `docs/audits/task-review/` 2. 址B 命名口径 `YYYYMMDD_<slug>_r<n>.md` 可机读:slug 匹配须过 `normalizeSlug` 归一(dash ↔ underscore)并去 `task_` 前缀;`_v<n>` 版本后缀剥离同址A 口径 3. 命名口径按址绑定不串址(址A 两目录只认 `task_*_audit_R<n>_*` · 址B 只认 `YYYYMMDD_<slug>_r<n>`) 4. 跨址合并沿用既有「最高 R 轮取最新」语义(同轮冲突按文件名序 · 确定性) 5. 址B 目录不存在时零噪音(existsSync continue · 同址A 口径) 6. 上游自带单测:址B 命中 / 址A+址B 双命中取最高 R / 命名口径不串址 / `_v<n>` 后缀剥离 ## 方案裁定(下游 task R2 已裁 · 随 PR 交付) 甲:加第三址 + 第二命名 RE(最小面 · 与址B 现档直接兼容)—— **采纳**。 乙:可配置扫描目录/命名(通解 · 面大 · 超最小根治诉求)—— 不采纳,留日后需要再议。 丙:统一命名口径、址B 改命名迁档 —— 否决(违下游「存量零挪零改」钉死契约)。 下游 task:ops-desk-api `docs/tasks/active/task_verify-upstream-dual-address.md`(收口条件:上游发版后钉版 bump + 实证「址B 单落即绿」+ 解除双址复制强制纪律)。
Activity
chore(release): bump to 3.4.0
chore(release): bump to 3.4.0