Repository navigation
DEL(0x7f)在 C0 扫描面之外:login.ts / register.ts 各有一枚裸 0x7f 当 Backspace 键值,与刚转义的 0x03 同处一个 switch #5460
Description
Activity
分诊裁定(devx 车道 PM,
session_01GX3sL71LFq8m2usg6VqTSE,2026-08-05):晋级pm:queue,方向采纳「纳入」(dev 建议 A),同时加pm:blocked+ 正文Blocked-by: #5157(同落scripts/check-nul-bytes.mjs,与 PR #5461 跨轮串行;该 PR 合并即解锁)。裁定依据(否决窗口,维护者可推翻):这是既有门禁的覆盖面对齐,非新能力面 —— 零新词汇、零新配置、仓内 2 个实证样本、成本一行查找表 + 一个自测样本 + 两处转义;#5157 对 C0 的三条危害论证对 0x7f 逐条同构,且
iscntrl/\p{Cc}惯例均含 0x7f。「明显的问题直接修」适用;实施 agent 不顺手扩(契约变更须立单过分诊)的判断同样正确,两边都对 —— 所以走的是「PM 裁定 + 单独派发」而非「维护者拍板」或「悄悄扩面」。派发时注意:自测里那条故意把 DEL 钉在扫描面之外的断言要一并反转。
Generated by Claude Code
认领:PM 循环第 3 轮(devx 车道)
会话:session_01GX3sL71LFq8m2usg6VqTSE
分支:claude/issue-5460-del-byte
Worktree:objectstack-issue-5460
域:domain:devx
文件面:scripts/check-nul-bytes.mjs+packages/cli/src/commands/login.ts/register.ts(各一枚 0x7f 转义)前提已核:两枚裸 0x7f 仍在(origin/main login.ts:47 / register.ts:43,
case '': // Backspace);#5461 已 MERGED、文件面释放。方向按 08-05 裁定执行:纳入 0x7f(方案 A),含反转自测里那条故意钉 DEL 在扫描面外的断言。
Generated by Claude Code
验收(devx 车道 PM,
session_01GX3sL71LFq8m2usg6VqTSE,2026-08-05):ACCEPT → PR #5479,转 ready 并挂 auto-merge。- 方案 A 精确落地:
IS_SCANNED[0x7f]=1(注释写明按「事故源不挑字节」纳入非 C0 字节的理由)、三处语义同步(脚本头/报错文案/CI 步骤注释)、两枚裸字节转义(同包cloud/login.ts:50既有�惯例佐证 —— 是收回惯例,不是发明拼写)、故意钉 DEL 在外的断言按裁定反转并留档改选缘由。 - 证据链:自测 34→48 双向齐全,其中「回退扩面 →
exactly the 2 binary assets skip, got 3」一条实证了二进制判据必须同步扩(DEL 样本从文本掉进二进制 = 不在场证明生效);5457 文件判定零漂移;cli 767 测试 + typecheck 绿;CI 24/24 绿。 - PR 正文对事故源第 5-8 次当场复现的记录(含订正说明本身成为证据)质量出色。
⚠️ 排队注记:本 PR 与队列中的 chore(ci): job 级if:读 needs.*.outputs.* 必须显式点名状态函数 (#5343) #5477 同碰lint.yml(不同 hunk,注释段 vs 新步骤),合并队列串行重建可干净合并;若被踢出按 notes 2 认签名后原样重投或补 merge。- 顺带立单 os-dev.md 的「自扫」正则比门禁本身还窄:#5460 把 DEL 纳入扫描面后,那条指令会给出假绿 #5484(os-dev.md 自扫正则窄于门禁)已核:
Blocked-by: #5460正确 —— 本 PR 合并后即晋级pm:queue(一行字符类补\x7f),其提出的「一处事实三处手抄」根治方向留在该单记录,由分诊轮判级。
Generated by Claude Code
- 方案 A 精确落地:
- added 3 commits that reference this issue
on Aug 6, 2026 - added a commit that references this issue
on Aug 12, 2026
发现于 #5157 的实施(PR 见下)。按 Prime Directive #10 单独记录,未在那个 PR 里扩大范围。
事实
#5157 把
check:nul-bytes的扫描面定为 C0 控制字符集去掉 tab/LF/CR,即 C0 全集减去 U+0009 / U+000A / U+000D(与 #4890 当年的手工扫描一致)。DEL(U+007F,0x7f)不在这个区间里 —— 它不是 C0 控制符,是 ASCII 表末尾单独的一个控制字符。实施时逐字节扫描发现,仓内还有两枚裸 0x7f,而且就在 #5157 刚刚转义的那两枚 0x03 的同一个 switch 里,隔九行:
packages/cli/src/commands/login.tspackages/cli/src/commands/login.tspackages/cli/src/commands/register.tspackages/cli/src/commands/register.ts那个
switch里,转义后的 case 与仍是裸字节的 case 并排:Ctrl+C 那条现在写成 U+0003 的转义序列,读得出来;Backspace 那条仍是一枚裸 0x7f,渲染为空,读起来是case '':—— 一个空串 case。除这两处外,全仓其余含 0x7f 的受追踪文件只有 4 个 PNG 和 1 个 ICO(真二进制,门禁本就跳过)。
为什么单独记录而不是顺手一起改
改不改是门禁扫描面的定义问题,不是两行代码的问题:
.claude/skills/**的 markdown 不被任何门禁扫描 —— check:nul-bytes 只看 JS/TS,check:doc-authoring 的 ROOTS 不含 .claude/ #4890 先例)定下的区间。这是一条对全仓作者生效的规则,不该由实施 agent 顺手扩。判断依据(供分诊)
支持纳入的理由,与 #5157 正文对 C0 的论证逐条同构:0x7f 同样渲染为空、同样两种拼写都搜不到(文件里是字节,搜不到转义文本;那个字节本身也没法敲进搜索框)、同样是"编辑工具把转义落成真字节"这一事故源的产物 —— 该事故源不挑字节值,#5157 的核心论点正是这一条(本单正文自己刚又贡献了两例)。多数语言的"控制字符"定义(C 的
iscntrl、正则的\p{Cc}类)也都把 0x7f 算进去。反对的理由:#5157 与 #4890 的先例都明确写的是 C0 区间;0x7f 在原始扫描模式里就不在。
倾向纳入,但这是维护者的判断。若纳入,改动很小:
scripts/check-nul-bytes.mjs里给查找表加一行(IS_SCANNED[0x7f] = 1)+ 自测加一个样本 + 上表两处转义,其余机制(二进制判据、报错处方、载体范围)全部照用。注意自测里现有一条断言明确把 0x7f 钉在扫描面之外('tab / CR / LF / DEL are outside the scanned set and stay green'),纳入时要一并改掉 —— 那条断言是故意写的,用来说明这条边界是选出来的而不是漏掉的。关联
.claude/skills/**的 markdown 不被任何门禁扫描 —— check:nul-bytes 只看 JS/TS,check:doc-authoring 的 ROOTS 不含 .claude/ #4890 / PR fix(scripts): check:nul-bytes 按载体扫描所有被跟踪的文本文件 (#4890) #4907(门禁起源与当年的手工扫描模式)、fix(docs,lint): 两处裸引用公式样例改回 canonical,并补上公式样例的 CEL 语义门 (#5116) #5140(0x01 实例现场)Blocked-by: #5157(已解除:PR #5461 于 2026-08-05 13:1xZ MERGED,scripts/check-nul-bytes.mjs文件面释放,裁定方向 A 生效)