Skip to content

[finding] proof 4 的 delivers() message-includes 腿今天只由一个零守着 —— 而通往夹具的三条路各被本仓自己写着的一条规矩堵住 #18865

Description

@os-bill

Filed by the domain:spec execution seat 2(座位贴 #18549,session_01JbZnqu8bt6YqfJsr9vaFb3)out of the #18579 round(PR #18863),from that dev's open_questions —— dev 不立卡,由席位立。⛔ 填 bare:finding only;domain:* / 类型 / 优先级是分诊的。

⭐ 这是执行一条已裁卡时冒出的残留问题,⛔ 不是 #18579 被派发时问的那个问题。按半状态巡检 H52 的处方,残留问题另立新卡并链回已裁那张,⛔ 不在 #18579 上重挂 needs-user-decision —— 否则收件箱说不清开着的是哪一问,而 #18579 一关,这个问题的唯一可见性也跟着没了。

Dedupe words:delivers() message-includes leg unpinned · check-mode sandbox symlinks src · fixture def would ship to consumers · proof 4 fail-closed leg zero-defended · build-schemas closure has no seam

缺什么

packages/spec/scripts/build-schemas.ts 的 proof 4 里,delivers()(⏱️ 2026-09-18T02:14Z 现读 origin/main 18cc3b1dfc,在 :1640)有一条腿今天由一个零防守:那条 message-includes 判断 —— 拒绝一个「照声明建出来、但没有带上声明自己那份 error map」的 strict 克隆。

那条腿是 fail-closed 的一半:读不出声明文本的拒绝被算作 "no evidence" 而⛔ 不是 "proved"。⇒ 它若哪天静默失效,普查不会变红,只会悄悄多出几条 "no evidence",而 "no evidence" 正是这套证明对一切它测不了的东西的正常答案。⇒ ⭐ 失效方向是「读作合规」,而且没有夹具会发火。

⛔ 三条路都被本仓自己写着的规矩堵住了 —— 这正是它不是「加个夹具」的原因

⏱️ 2026-09-18T02:14Z,逐条现读 origin/main 18cc3b1dfc:

做法 堵在哪
A 出货的图上加一个合成 def @objectstack/specfiles[]src/**/*.zod.ts一个假 schema 会随 tarball 发给消费者。⛔ 出局
B 在 check-mode 沙箱里加一个合成 def packages/spec/scripts/build-schemas-check-mode.test.ts 每个沙箱都用 fs.symlinkSyncsrc(:476 · :3374 · :3673 · :4039),而它自己 :410 的注释写着:「the real file; src/ is the fixture's own, so the population a run observes is the repo's」⇒ 夹具 def 只能写进真的 src,即退回 A。⚠️ 改成每个沙箱拷贝 src,是对一份 4466 行的 harness 做结构改造
C delivers() 导出去做单测 它是 computeGuidanceRoutes 内部的一个 const 箭头函数(:1640),闭包在 zodByDefKey 上 ⇒ 导出它本身就是结构改造

⚠️ 一条要点名的未验证:#18579 的 dev 把 C 的阻塞理由写成「that file's header rule is no test-only seam」。⏱️ 2026-09-18T02:14Z 本席在 build-schemas.ts 里搜 test-only / test only / seam 三种拼法,命中 0(⭐ 亮控:同文件 proof 4 命中 12 ⇒ 搜索没死)。⇒ ⛔ 那条规矩本席证不了,来源点名为该 dev 的报告。⭐ 但 C 仍然被堵住 —— 靠的是上表那个结构事实(闭包),⛔ 不靠那条规矩。

⭐ 立卡席的倾向(⛔ 是建议,不是处方)

B,而且单独成卡。理由是 #18579 的 dev 给的,本席同意并转述:每个沙箱各自拷 src,同时也给 proof 4 其余几条 fail-closed 腿解锁了夹具,⛔ 不只是这一条。

⇒ 代价也要写明:那是对 4466 行 harness 的结构改造,沙箱建造时间会变(symlink → copy),而这份 harness 本身就是最慢的 --project repo 套件之一。⛔ 本席没有量那个代价。

⛔ 没量的部分,⛔ 不许当读数用

  • ⛔ 没量每沙箱拷贝 src 会让 build-schemas-check-mode.test.ts 慢多少(它今天 85 个用例)。承接者第一件事就该量这个 —— 若代价不可接受,B 也出局,那么这条腿就得在「重构」和「承认它无防守并写进 docblock」之间选,而那是另一个问题。
  • ⛔ 没量 proof 4 还有几条 fail-closed 腿处在同样无夹具的状态。卡面主张的是这一条,⛔ 不是一个总体。
  • ⛔ 没量这条腿今天有没有实际静默失效过。⇒ 主张的是「没有夹具会发火」,⛔ 不是「它已经坏了」。

已经做了的对冲,⛔ 免得承接者以为什么都没有

PR #18863(卡 #18579)把今天守着这条腿的那个零连同它的取数树一起写进了 docblock —— 「at 88aa326deb that state held 9 keys on 4 defs…」,并明写「which defs sit in that last group is a fact about the graph at that commit and not a property of this proof」,叫下一个读者重测而不是改日期。⇒ ⭐ 那是一条记录,⛔ 不是一个夹具:它让下一个读者看得见这条腿靠什么站着,⛔ 但它不会在腿断的时候变红。

Refs:#18579 / PR #18863(这个问题从哪一轮溢出来的,以及那条零的现行记录)· #18301 / PR #18529(proof 4 本体)


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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions