Skip to content

fix: round-3 batch ④ — npm interop, hook rules, CLI robustness (L1-L6, M4', N4/N5) - #3

Merged
wangrh0909 merged 7 commits into
masterfrom
fix/batch4-npm-interop-l1-l2
Sep 27, 2026
Merged

wangrh0909 merged 7 commits into
masterfrom
fix/batch4-npm-interop-l1-l2

Conversation

@voidvec

@voidvec voidvec commented Sep 26, 2026

Copy link
Copy Markdown
Owner

Summary

第三轮评审报告 docs/ROUND3-SPEC-HOST-PLATFORM-CORRECTNESS-REVIEW.md §6 批次④整改(严格 TDD,每项先见 RED):

npm ↔ PyPI 互操作(L1/L2) — npm/bin/cli.js

  • L1:npm uninstall 现识别并清除 PyPI CLI 写的项目根 v3 安装戳 .drogon-plugin-install.json(纯 bundle 宿主 claude/zcode 时删除;混合宿主保留账本并提示用 PyPI CLI 收尾——正向对照锁"不误删")
  • L2:--target 缺值/取值形似选项 → 用法错误退出码 2,不再静默按 cwd 执行,与 PyPI argparse 对齐

钩子规则与 --scan(L4/L6) — hooks/posttooluse.py

  • L4:--scan 逐文件 realpath 复核(_escapes_workspace),项目内指向工作区外的文件符号链接不再被读取;工作区内链接照扫
  • L6:CPP.007 补抓同步重载 sendRequest(req, kTimeout)(具名 timeout 变量);CSP.001 补抓跨行 {{ }}(tempered dot,无 DOTALL 贪婪风险);异步重载与合法跨行 [[ ]] 负例锁死误报面

CLI 健壮性(M4′/L3/L5) — src/drogon_plugin/cli.py + npm 侧同口径

  • M4′:两 CLI 删除"随包技能数为 0 时非空即过"的降级——包残缺时 verify 显式失败并给诊断
  • L3:full 归属指令文件卸载前检测标记段之外的用户内容:有则只剥标记段 + 告警保留;纯插件产物仍整删
  • L5:install 宿主循环纳入回滚——中途失败清除本次写入(技能目录/规则文件/半成品 bundle/指令文件动作),用户原有文件原样保留

宿主通道增强(N4/N5) — cli.py HOSTS

  • --host qoder 补投 .qoder/skills/、--host codebuddy 补投 .codebuddy/skills/(指令文件通道不变,加法增强;两宿主规范不开源,README 标注待真机核验)
  • N3 核实:已由批次①的 NON_FILE_TOOLS 黑名单改法闭环,无需代码改动
  • V7(wheel 执行位):以 git 100755 + ubuntu CI 构建渠道取证结案,无代码改动

Test plan

  • pytest tests/ -q — 168 passed, 2 skipped(skip = L4 符号链接 E2E,Windows 无 symlink 特权,CI ubuntu 会执行)
  • scripts/check-consistency.py — 14 项通过
  • scripts/sync-assets.py --check / scripts/sync-assets.mjs --check — 双侧资产同步
  • scripts/gen-host-artifacts.py --check — v0.4.0 一致
  • 每项修复含正向对照测试(混合宿主戳不误删 / 纯插件产物仍整删 / 他人共享技能目录不动 / 回滚不动用户原文件)

批次④-A(第三轮评审 L1/L2):
- L1: npm uninstall 现识别项目根 .drogon-plugin-install.json(PyPI CLI 独占
  v3 戳)。纯 bundle 宿主(claude/zcode)一并清除,消灭互操作残留;混合宿主
  保留记录并提示用 PyPI CLI 收尾,不误删他人账本(正向对照测试覆盖)。
- L2: --target 缺值/取值像选项时退出码 2 报用法错误,与 py argparse 对齐;
  此前静默回退 cwd,typo 即操作错目录。
批次④-B(第三轮评审 L4/L6):
- CPP.007 现匹配具名 timeout 实参(sendRequest(req, kTimeout) 等,数字/16
  进制/含 timeout 的标识符),异步 callback 重载与 cb 命名仍保持不报。
- CSP.001 跨行 `{{ ... }}` 检出:内容段用受约束类(非 `}}`,含换行)匹配,
  避免 DOTALL 贪婪放大误报;合法跨行 `[[ ]]` 负例锁方向。
- L4:scan 逐文件 realpath 复核(_escapes_workspace),项目内符号链接指向
  工作区外时跳过不读;工作区内链接正向对照照扫。端到端用例需链接特权,
  Windows 无权限时 skip,ubuntu CI 覆盖;守卫核心另有本地单测。
…ions, rollback failed installs

批次④-C(第三轮评审 M4′/L3/L5):
- M4′:两 CLI 的 expected==0 降级删除 —— 随包技能枚举为 0 即包残缺,
  计数校验判失败并在 verify 输出诊断,不再"非空即过"静默绿灯。
- L3:full 归属指令文件卸载前检测标记段之外的自有内容(用户追加)——
  有则只剥标记段+保留文件+显式告警,无则维持整删(正向对照锁行为)。
- L5:install 宿主循环纳入 try/except,半途失败回滚本次写入
  (技能目录/规则文件/半成品 bundle/full 指令文件;marker 编辑按剥段撤销),
  安装戳不更新,不再留孤儿文件。
批次④-D(第三轮评审 N3 核实 + N4/N5 增强):
- N3 核实结案:R3 的"白名单改黑名单"已同时消掉 MultiEdit 过时/NotebookEdit
  未覆盖问题(NON_FILE_TOOLS 之外一律尝试提取),既有正/负测试锁住,无需再改。
- N4/N5:qoder kind 改 skills+instruction 落 .qoder/skills,codebuddy 落
  .codebuddy/skills;指令文件通道不变(加法增强)。两宿主规范不开源,
  通道效果列真机待核,README 同步标注。
- 配套:_OUR_DIR_CANDIDATES/无戳兜底 glob/_HOST_HINTS/`all` 互斥注释更新;
  verify 经技能通道计数的既有断言自动覆盖;卸载互逆 + 独占目录连带守卫测试。
…ntrol-test assertion

PR #3 评审补漏:
- CPP.007 标识符支 `[A-Za-z_]\w*…` 强制 timeout 前有字符,裸名
  sendRequest(req, timeout)/(req, TIMEOUT) 漏检 → 改 \w*(?:[Tt]imeout|TIMEOUT)\w*
- L6 用例表扩为 (rule_id, code) 参数化:补裸名/数字/十六进制正例与三参异步负例
- blocker:项目内符号链接对照测试断言 total==1,但真身与链接 realpath 均在
  工作区内 → 双双照扫 total==2(硬链接本地实证),ubuntu CI 必红 → 修正断言
… uninstall, stricter --target

PR #3 三代理评审补漏(每条均先见 RED):
- L5:重装 bundle 宿主时旧 .drogon-plugin/ 改为改名备份(os.replace),失败原样
  恢复(此前先 rmtree → 半途失败旧 bundle 永久丢失而旧戳仍宣称已装);
  Ctrl+C(KeyboardInterrupt)同样回滚,退出码 130
- L3:_instruction_has_foreign_content/_strip_marker_section 补捕
  UnicodeDecodeError —— 非 UTF-8 指令文件卸载不再 traceback,保守保留;
  _drop_full_instruction 按剥段实际结果记录(不谎称"已剥标记段")
- L2(npm):--target 空串此前经 `args.target || cwd` 静默回退 cwd → 一并退出码 2
- M4′:verify 残缺包消息补"(包残缺)"诊断指引(py/npm 同口径)
- 测试补强:混合宿主对照改真混合(--host claude,agents,断言戳内容原样/
  bundle 被清);新增 marker 回滚分支覆盖(agents 追加标记段后 cursor 失败);
  qoder 共享守卫补技能数断言
- 文案:CHANGELOG N3 措辞降级(payload 层闭环,matcher 层 NotebookEdit 仅登记)、
  M4′ 限定技能校验路径;cli.py docstring 宿主表同步 N4/N5
@voidvec

voidvec commented Sep 26, 2026

Copy link
Copy Markdown
Owner Author

三代理评审记录(合并前自查,已随 22a6810 / 8af4dc2 修复)

三个并行评审子代理(npm+hooks 侧 / PyPI CLI 侧 / 测试与声明对撞)对本 PR diff 做了全面评审,主代理逐条实证后修复:

已修(每条先见 RED)

  • 🔴 blocker:项目内符号链接对照测试断言 total==1,实际真身+链接均照扫 total==2(硬链接本地实证)→ ubuntu CI 必红,已修正断言
  • CPP.007 正则强制 timeout 前有字符 → 裸名 sendRequest(req, timeout)/(req, TIMEOUT) 漏检,已改 \w*(?:[Tt]imeout|TIMEOUT)\w*;L6 用例表参数化扩充(数字/十六进制正例、三参异步负例)
  • npm --target "" 空串经 args.target || cwd 仍静默回退 cwd(L2 同类残留)→ 一并退出码 2
  • L3:非 UTF-8 指令文件令 uninstall UnicodeDecodeError traceback → 保守保留不崩溃;_drop_full_instruction 按剥段实际结果记录
  • L5:重装 bundle 宿主先 rmtree 旧 bundle → 半途失败旧 bundle 不可恢复而旧戳仍宣称已装 → 改为 os.replace 改名备份、失败原样恢复;Ctrl+C(KeyboardInterrupt)同样回滚,退出码 130
  • 测试补强:混合宿主对照改真混合(--host claude,agents,断言戳内容原样);marker 回滚分支从零覆盖到锁定;qoder 共享守卫补技能数断言
  • 文案对账:CHANGELOG N3 措辞降级(payload 层闭环,matcher 层 NotebookEdit 仅登记——只作用 .ipynb,扫描器不处理该扩展名)、M4′ 限定技能校验路径;cli.py docstring 同步 N4/N5;verify 残缺包消息补"(包残缺)"诊断(py/npm 同口径)

评审确认无问题(未改动)

  • L1 pureBundle 判定:损坏 JSON/null/非数组/空数组均走保守保留分支,不误删不崩溃
  • CSP.001 tempered dot:{{ a }} 文字 {{ b }} 产生两个独立匹配,无跨块吞并;20k 病态输入 8ms 无灾难回溯
  • L4 realpath 比较:Windows 大小写经 GetFinalPathNameByHandle 归一,两侧均 realpath,UNC 同理
  • N4/N5 四命令(install/uninstall/upgrade/verify)对称性、--host all 无同目录重复落盘
  • M4′ py/npm 双端口径逐字对齐;flaky copytree 注入无假阳性通道(注入不触发 → rc==0 → 断言响亮失败)

登记不修(advisory 可接受)

  • CPP.007 对 sendRequest(req, onTimeout) 类"回调名含 timeout"的误报(钩子不阻断,发生率低)
  • L4 跳过出界链接时无提示输出;realpath 与 open 之间的残余 TOCTOU
  • npm 不接受 --target=DIR 等号形式(报未知参数 rc=2,fail loud 非静默)

修复后全门禁:178 passed / 2 skipped,consistency 14 项 ✅,sync-assets 双侧 ✅,gen-host-artifacts ✅。

@wangrh0909
wangrh0909 merged commit 910ea65 into master Sep 27, 2026
9 checks passed
wangrh0909 pushed a commit that referenced this pull request Sep 27, 2026
…ntrol-test assertion

PR #3 评审补漏:
- CPP.007 标识符支 `[A-Za-z_]\w*…` 强制 timeout 前有字符,裸名
  sendRequest(req, timeout)/(req, TIMEOUT) 漏检 → 改 \w*(?:[Tt]imeout|TIMEOUT)\w*
- L6 用例表扩为 (rule_id, code) 参数化:补裸名/数字/十六进制正例与三参异步负例
- blocker:项目内符号链接对照测试断言 total==1,但真身与链接 realpath 均在
  工作区内 → 双双照扫 total==2(硬链接本地实证),ubuntu CI 必红 → 修正断言
@wangrh0909
wangrh0909 deleted the fix/batch4-npm-interop-l1-l2 branch September 27, 2026 03:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants