Skip to content

DEL(0x7f)在 C0 扫描面之外:login.ts / register.ts 各有一枚裸 0x7f 当 Backspace 键值,与刚转义的 0x03 同处一个 switch #5460

Description

@os-zhuang

发现于 #5157 的实施(PR 见下)。按 Prime Directive #10 单独记录,未在那个 PR 里扩大范围。

本单第一版正文自己踩了本单描述的坑:写"PR 已转义成 …"时,工具把转义序列物化成了两枚真的 0x03 字节存进了 issue 正文,渲染为空。已改用 U+0003 这种不含反斜杠转义的写法重写。这是本会话里同一事故的第三、四例(另两例见下方"事故源"),也是 #4958 那句"工具链本身就会不断重新引入这类字节"的又一次实测。

事实

#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.ts 38 0x03 PR 已转义成 U+0003 的转义序列
packages/cli/src/commands/login.ts 47 0x7f 未动(不在扫描面)
packages/cli/src/commands/register.ts 34 0x03 PR 已转义成 U+0003 的转义序列
packages/cli/src/commands/register.ts 43 附近 0x7f 未动

那个 switch 里,转义后的 case 与仍是裸字节的 case 并排:Ctrl+C 那条现在写成 U+0003 的转义序列,读得出来;Backspace 那条仍是一枚裸 0x7f,渲染为空,读起来是 case '': —— 一个空串 case。

除这两处外,全仓其余含 0x7f 的受追踪文件只有 4 个 PNG 和 1 个 ICO(真二进制,门禁本就跳过)。

为什么单独记录而不是顺手一起改

改不改是门禁扫描面的定义问题,不是两行代码的问题:

判断依据(供分诊)

支持纳入的理由,与 #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'),纳入时要一并改掉 —— 那条断言是故意写的,用来说明这条边界是选出来的而不是漏掉的。

关联

Blocked-by: #5157(已解除:PR #5461 于 2026-08-05 13:1xZ MERGED,scripts/check-nul-bytes.mjs 文件面释放,裁定方向 A 生效)

Activity

  1. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    分诊裁定(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

  2. self-assigned this
    on Aug 5, 2026
  3. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    认领: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

  4. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    验收(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

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