Skip to content

feat: PR 审查 mimosa findings 双级过滤 — diff 文件过滤 (#26) + 基线指纹去重 (#27) - #30

Merged
tizerluo merged 4 commits into
mainfrom
feat/pr-review-baseline-filter
Sep 17, 2026
Merged

tizerluo merged 4 commits into
mainfrom
feat/pr-review-baseline-filter

Conversation

@tizerluo

Copy link
Copy Markdown
Owner

Closes #26, Closes #27

方案(analyst 预检 + plan-reviewer OKAY 过审)

实测确认 mimosa 静态引擎调用面无法限缩输入(focusFiles 仅优先级提示),故走「全量扫 + findings 后过滤」——zcode 复核 token 与报告噪音立即清零,扫描时间照旧(~13s 量级、零 LLM)。

#26 diff 文件过滤

  • _filter_findings_by_files:normpath 双侧精确匹配 location.pathgit diff --name-only 清单(diff 本就在 mcp-server 内算好)
  • 附件只含触及文件内 findings;env ZCODE_BRIDGE_PR_FINDINGS_SCOPE=diff|all 可一键回滚旧行为

#27 基线指纹库

  • 指纹 = sha256(normpath(path) + "\\0" + identity.anchor)——anchor 是 mimosa 自产内容哈希(实测跨扫描稳定、不含路径语义、代码一行改动即失效重报)
  • 基线存仓外 ~/.local/state/zcode-mcp-server/baselines/(gate 每轮 git clean -fdx 会清仓内文件);损坏 → 空库降级;tmp+os.replace 原子写
  • 写入时机守卫(安全关键):仅 zcode 复核成功(非 isError)才落库——失败重试不产生假「无新增」假 pass
  • 报告头 known 汇总行(纯中文无 P0/P1/P2 token,gate 双解析路径钉子测试钉死);verdict 计数只含新增
  • env ZCODE_BRIDGE_PR_BASELINE=on|off 第二回滚开关

刻意不做(文档已注明)

  • 周期全量扫:现成替代 = zcode_security_review 深扫(保持全量语义不动)
  • 误报人工逐条复核:人工 exit = 删基线文件(整体重置)
  • gate 脚本零改动(state schema 无变更)

测试

+16 用例(过滤命中/开关回归/路径归一/指纹稳定性 4 条/基线过滤/入库时机三路径/损坏 fail-safe/分仓隔离/off 不读不写/kept=0 如实文案/verdict 尾契约/gate 头行钉子)→ 434 passed, 28 subtests(基线 418+28);ruff 干净;gate 脚本 diff 为零

- _filter_findings_by_files: findings 按 PR diff 触及文件过滤 (normpath 双侧匹配),
  附件只含新增信号; scope 开关 ZCODE_BRIDGE_PR_FINDINGS_SCOPE=diff|all 可回滚
- 基线指纹库: sha256(path+anchor) (anchor 为 mimosa 内容哈希, 跨扫描稳定,
  代码改动自动失效), 存仓外 ~/.local/state/zcode-mcp-server/baselines/ (gate 每轮
  git clean -fdx 清仓内文件); 损坏降级空库; 原子写
- 写入时机守卫: 仅 zcode 复核成功 (非 isError) 才落库 — 失败重试不产生假「无新增」
- 报告头 known 汇总行 (纯中文, 不含 P0/P1/P2 token, gate 双解析路径钉子测试);
  verdict 计数只含新增 finding
- zcode_security_review 保持全量扫语义; gate 脚本零改动; mcp-server 1.4.0→1.5.0
- tests: +16 用例 (pr13-pr23 + bf0-bf3 + gate 头行钉子) — 434 passed, 28 subtests
…l 行口径 (P2) + P3×6

- _pr_diff 加 -c core.quotePath=false: 非 ASCII 路径不再被 C 转义 → 过滤匹配恢复;
  回归测试 gt1 (flag 钉住) + pr24 (中文路径端到端存活)
- _load_baseline/_save_baseline 显式 encoding=utf-8, except 扩 UnicodeError —
  非 UTF-8 locale 不再破坏「绝不抛」「落盘失败不反杀」契约
- 同扫重复指纹 count 语义与注释对齐 (出现次数+1); 附件标题改「本轮新增 X, 全仓 Y」
- test_pr17 预置基线字节级断言; gate 测试元组误作 msg 参数改钉值; scope=all 措辞分支
- 437 passed, 28 subtests
- _write_temp/_git/agent-help/zcode headless/mimosa Popen 五处显式 encoding=utf-8:
  quotePath 修复后 git/mimosa 通道开始承载原始 UTF-8 (中文路径/标题), locale 依赖
  成为正确性承重点; strict 失败显性 (审查报错) 优于 replace 静默乱码→过滤失配→丢
  finding (本 PR 刚修的 P1 症状方向)
- _git except 扩 UnicodeError (保「不抛异常, 调用方判」契约, 解码失败经
  _pr_diff→RuntimeError→isError 收口仍显性); _save_baseline 调用点扩 UnicodeError
- pr24 升级行为级回归: fake git 在缺 -c core.quotePath=false 时回 C 转义形态
  (flag 误删→转义失配→测试挂, 不再单靠 GT1 argv 钉); +pr26 同扫重复指纹计数
- 438 passed, 28 subtests
@tizerluo
tizerluo merged commit 185dc2e into main Sep 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant