Skip to content

[business-logic] the '# activity-label' prefix that run_command prompts mandate blinds three sibling detectors at once: isVerificationCommand / coverageIsVerifyCommand / eaIsVerifyTool all tokenize '#' as the first token, so verification debt never zeroes (false warnings), verify_coverage_gap is completely dead on conforming agents, and edit_abandon inherits the same blindness - stripLeadingShellComment exists but only 2 call sites got the #471/#950 fix; exit-127 isNonFailureExit swallows real go-test failures inside '||' chains as 'tool not available' green #1522

Description

@topcheer

文件行号

internal/agent/verification_debt.go L131-140(isVerificationCommand——tokens[0]=="#" 不含 = 循环停 i=0 → first 不在 runner 列表 → false)+ verify_coverage_gap.go L414-445(coverageIsVerifyCommand 同盲)+ L312-324(coverageExtractCommand 只 TrimSpace 不调 stripLeadingShellComment)+ L140(checkCoverage len(scopes)==0 return "")+ edit_abandon.go L101/L82-88(eaIsVerifyTool/eaExtractCommand 同根因)——对照 verify_hint.go L797-800(注释自认 "#471: the run_command tool schema mandates a leading '# ' comment line")+ L812/820(stripLeadingShellComment 仅 2 处使用——#471/#950 只修了 postEditVerify 路径);verify.go L364-379(llmDecideVerifyCommand 仅 TrimSpace 不剥 fence——prompt L245 仅口头要求)+ 后果链:verifyCommandAvailable parts[0]=```go LookPath 必失败 → Passed=true "verification skipped" 静默假绿;verify.go L388-399+verify_hint.go L415-440(verifyCommandAvailable 只查 parts[0]——go test ./... || npm run build npm 未装:go test 失败退 1 → || 右侧 127 → isNonFailureExit(127) → Passed=true "tool not available" 真实失败吞成通过);verify_hint.go L474-512(extractFilePathFromArgs files 只按 []map 解析——batch_replace []string 裸数组 unmarshal 必败、file_ops operations 无分支)对照同文件 L521-562(sfExtractMutationPaths #737 已正确处理两形态)+ verify_coverage_gap.go L264-293(coverageExtractFilePaths #738 已修)——三套提取器独此漏修+ agent.go:3997-4005 连坐喂 searchInvalidation/stalledConvergence

问题

案 A(High·静默漏报三连):# 活动标签前缀使三检测器对守约 agent 全盲

案 B(Med·假绿):exit 127 一律判 Passed 吞 || 链真实失败

  • go test ./... || npm run build(npm 未装):失败退 1 → 127 → isNonFailureExit → 真实测试失败静默成"验证通过";测试套件内部缺失二进制 127 同判绿
    :isNonFailureExit 排除 ||/; 复合命令末段 127(或只对 parts[0] 缺失时豁免)。

案 C(Low-Med·静默假绿):LLM oracle 输出不剥 markdown 围栏

  • 复核修正后果链:围栏命令进 executeVerifyCommand → 预检 LookPath 失败 → Passed=true "verification skipped"——验证形同虚设但不注入错误(初审"错误注入+auto-repair 循环"被推翻)
    :executeVerifyCommand 前剥围栏(复用 chat 层 fence 剥离)。

案 D(Low-Med·漏报):postEditVerify 路径提取三套失同步——独 extractFilePathFromArgs 漏 batch_replace/file_ops

干净项

verification_debt:分类 map/阈值/reset 接线(agent.go:1503)非死码(初审死码误判已纠正——字段名 verifDebt vs 类型名 verificationDebtState)。verify_debt:与 verification_debt 职责正交(任意 build 重置 vs 仅绿 build 清零)/recordVerifyCommand 用 extractCommandFromArgs 不受案 A 影响/once-per-run/reset 接线全对。verify.go 其余:#941 脚本分支/变量赋值排除/exit-1 守卫全对。verify_coverage_gap 其余:#416/#417/#550/#738 全对(致命点仅案 A 入口)。verify_hint 其余:sourceMutatingTools 9 成员逐一对照无遗漏写工具(assertEditToolMapsInSync+测试锁同步)/复合命令拆分/三级 hint 全对。

排除

#1516/#1520(sourceMutatingTools 失同步/batch_replace 门控——已案不重);#1521 案 D(claimsSupervision);isVerifyCommand vs isVerificationCommand 两函数有意区分非重复。

严重程度

High + Med + Low-Med×2


独立复核确认:三入口原文+stripLeadingShellComment 仅 2 处使用 grep 穷尽、三后果链、"schema 强制"修正为"prompt 强制"、案 2 后果链被预检拦截修正(错误注入→静默假绿降级)、127 ||推演、三套提取器失同步对照(#737/#738 已修独此漏)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions