Skip to content

os-dev.md「Byte discipline」段陈述的危害只对 NUL 成立,却写成对整个字节类成立 —— agent 自扫命中后可据此把 CI 红判成误报 #5579

Description

@os-zhuang

发现于 #5484(PR #5577)的实施:那一单只裁定补字符类,本条按 Prime Directive #10 单独记录,未在该 PR 里扩大范围。

正文用 U+00XX 这种不含反斜杠转义的写法指代字节 —— 理由见 #5460

事实

.claude/agents/os-dev.md「Byte discipline」段(按内容 grep 定位,现约 :269-271)把危害陈述成:

One raw control byte makes grep treat the whole file as binary: zero matches, no signal, and the rule you just wrote becomes invisible to every agent that greps for it.

这是该段唯一给出的理由,而它只对 NUL 成立。门禁脚本头(scripts/check-nul-bytes.mjs,#5157 段)早就实测并写明了这点:「GNU grep 3.11 and ripgrep 14.1 report 'binary file matches' for a file carrying 0x00, and keep matching normally for one carrying 0x01 or 0x03」。本单在容器内独立复现,结论一致(grep 3.11 + ripgrep,样本均为「一枚控制字节 + 一行可搜索文本」,用 printf 生成,未粘贴裸字节):

样本字节 grep -n searchable(不加 -a) rg -n searchable
U+0000 binary file matches(不打印行内容) binary file matches (found "\0" byte around offset 6)
U+0001 2:searchable line 2:searchable line
U+007F 2:searchable line 2:searchable line

即:门禁扫描面里除 NUL 之外的每个字节(含 #5460 刚纳入、#5484 刚补进自扫字符类的 U+007F),都不会让文件被当成二进制。

为什么这不只是文字不精确

这条指令的读者是 agent,而 agent 会做一致性推理:

  1. agent 写出一枚 U+007F 或 U+0001,按 os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484 修好的字符类自扫 → 命中;
  2. 它去核对指令给出的危害 —— grep 仍能正常搜到该文件、能打印行内容,危害描述不成立;
  3. 于是「本文件被 grep 当成二进制」这个唯一被陈述的判据落空,把门禁的红判成误报,或按「这条不适用于我这个字节」自行放行。

门禁脚本头恰好把真正适用于全字节类的三条危害写清楚了(渲染为空、两种拼写都搜不到、事故源不挑字节值),os-dev.md 一条都没搬 —— 它搬的是唯一那条不适用的。这与 #5484 是同一族问题的另一半:同一事实手抄多处,门禁那侧修了,指令这侧没跟

顺带两处同段陈旧(建议一并核,不单独开单):

处置建议(仅供分诊参考,未实施)

把该段的危害句改成与门禁脚本头一致的口径:NUL 那条危害点名 NUL,其余字节引用「渲染为空 / 两种拼写都不可搜 / 事故源不挑字节」三条(可压成一句,该文件是 prompt,每个词都进每次派单的 token 预算)。顺带修正上面两处陈旧计数与时态。

⚠️#5484 正文里留下的「单源化」方向属同一根因、不同表面:那条是让字符类别再手抄,这条是让危害论证别再手抄。若分诊决定做单源化,本条应作为它的验收面之一,而不是各修一次散文。

归类

observation-class:今天没有用户会撞到;它降低的是 agent 遵循这条指令的可靠性,且只有在 agent 恰好写出一枚非 NUL 控制字节时才发作。故只打 finding,不打 pm:queue,不指派 —— 严重度交分诊轮判。


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions