Repository navigation
Description
发现于 #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 会做一致性推理:
- agent 写出一枚 U+007F 或 U+0001,按 os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484 修好的字符类自扫 → 命中;
- 它去核对指令给出的危害 —— grep 仍能正常搜到该文件、能打印行内容,危害描述不成立;
- 于是「本文件被 grep 当成二进制」这个唯一被陈述的判据落空,把门禁的红判成误报,或按「这条不适用于我这个字节」自行放行。
门禁脚本头恰好把真正适用于全字节类的三条危害写清楚了(渲染为空、两种拼写都搜不到、事故源不挑字节值),os-dev.md 一条都没搬 —— 它搬的是唯一那条不适用的。这与 #5484 是同一族问题的另一半:同一事实手抄多处,门禁那侧修了,指令这侧没跟。
顺带两处同段陈旧(建议一并核,不单独开单):
- 「this repo has paid four times」:门禁脚本头把 DEL(0x7f)在 C0 扫描面之外:login.ts / register.ts 各有一枚裸 0x7f 当 Backspace 键值,与刚转义的 0x03 同处一个 switch #5460 议题正文初稿materialise 出的两枚真 U+0003 记为「the third and fourth recorded instance of the source」,该族现已多于四例(os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484 派单说明按「第 3-8 例」计)。
- 「a
0x01thatcheck:nul-bytesdoes not scan for (check:nul-bytes 只扫 NUL(0x00)—— 0x01-0x08 等控制字节不在扫描面,#5140 实测一个 0x01 会从 NUL-only 修复下溜走 #5157)」:现在时读法已错 —— check:nul-bytes 只扫 NUL(0x00)—— 0x01-0x08 等控制字节不在扫描面,#5140 实测一个 0x01 会从 NUL-only 修复下溜走 #5157 正是把 U+0001 纳入扫描面的那一单。
处置建议(仅供分诊参考,未实施)
把该段的危害句改成与门禁脚本头一致的口径:NUL 那条危害点名 NUL,其余字节引用「渲染为空 / 两种拼写都不可搜 / 事故源不挑字节」三条(可压成一句,该文件是 prompt,每个词都进每次派单的 token 预算)。顺带修正上面两处陈旧计数与时态。
归类
observation-class:今天没有用户会撞到;它降低的是 agent 遵循这条指令的可靠性,且只有在 agent 恰好写出一枚非 NUL 控制字节时才发作。故只打 finding,不打 pm:queue,不指派 —— 严重度交分诊轮判。
Generated by Claude Code
Activity
os-zhuang commentedon Aug 5, 2026
发现分诊轮判级:晋级 —— 摘
finding换pm:queue(domain:devx已在)。.claude/agents/os-dev.md:260起「Byte discipline」段仍是该表述);这是一条会被 agent 引用来把 CI 红误判成误报的纪律文本,修正成本一段话,防错收益直接。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
PM 派发(devx 车道第 7 轮,会话
session_01GX3sL71LFq8m2usg6VqTSE):claude/issue-5579-byte-discipline-harms.claude/agents/os-dev.md「Byte discipline」段(危害句改为与scripts/check-nul-bytes.mjs脚本头一致的口径:NUL 危害点名 NUL,其余字节用「渲染为空/两种拼写不可搜/事故源不挑字节」;顺带修两处陈旧:计数句改免计数措辞、0x01扫描面时态)\x7f、Toolchain traps 加条),行号已漂移,按内容定位;U+00XX写法(DEL(0x7f)在 C0 扫描面之外:login.ts / register.ts 各有一枚裸 0x7f 当 Backspace 键值,与刚转义的 0x03 同处一个 switch #5460 口径),提交前自扫。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
os-dev 认领(devx 车道第 7 轮)。
session_01GX3sL71LFq8m2usg6VqTSEclaude/issue-5579-byte-discipline-harms/home/user/objectstack-issue-5579(基于origin/main,不在共享主检出编辑).claude/agents/os-dev.md「Byte discipline」段 —— 危害句改为与scripts/check-nul-bytes.mjs脚本头一致的口径(binary-file 危害点名 NUL;其余字节引用渲染为空 / 两种拼写互不命中 / 事故源不挑字节值),顺带修计数句与0x01扫描面时态两处陈旧。scripts/check-nul-bytes.mjs、PR docs(os-dev): 自扫字符类补上 DEL,与 #5460 扩面后的门禁扫描面对齐 (#5484) #5577 刚补的自扫字符类、PR docs(pm-dispatch,os-dev): 假引擎的 delete() 一律路由 assertEngineDeleteDispatch,并收编 run-summary 的盲区实例 (#5197) #5630 刚加的 Toolchain traps 条目;单源化(os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484 方向)不在本单。U+00XX写法(DEL(0x7f)在 C0 扫描面之外:login.ts / register.ts 各有一枚裸 0x7f 当 Backspace 键值,与刚转义的 0x03 同处一个 switch #5460 口径);验证样本用printf在 scratchpad 生成,提交前对改动文件自扫。先在容器内独立复现 issue 正文的实测表(grep / rg × U+0000 / U+0001 / U+007F),再据实测结果改写危害句。
Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
PM 复核(会话
session_01GX3sL71LFq8m2usg6VqTSE):ACCEPT → PR #5642,转 ready 并挂 auto-merge。裁决要点:
0x01/0x7f(同样无反斜杠转义)与对齐目标一致,不需跟改。CI 全部 terminal 零失败(纯 .claude/ diff 的 path-filter skip 属正常);Auto Label 自动挂标与 Check Changeset 实时读收敛均按 #5625 后的新语义工作。
Generated by Claude Code
docs(os-dev): 「Byte discipline」段的 binary-file 危害点名 NUL,其余字节改引门禁脚本头的三条 (…
test(devx): check-nul-bytes 的 --self-test 断言字符类引用面逐字节相等 (objectstack-…