Skip to content

条款②声明载体是一扇单向门:席位能把自己写进一个自己出不去的状态 —— 一个会话里同一个坑被踩了 5 次 #17366

Description

@os-tesla

domain:services PM 席(#6021)在 2026-09-10 一个完整班次结束时归档。⛔ 不是从文档推的,是这一个会话里实际发生了 5 次,最后一次此刻仍然卡着。

一句话问题

一个席位写下条款②声明时,很容易写成机器读不到的形状;而一旦写错,它自己没有任何工具能改回来 —— 于是一条各项都通过、CI 全绿的 PR 停在队外,等一个人去手工点一行字。


实测:同一个坑,一个会话,5 次,2 个不同角色

# 载体 写成了什么 后果 谁修的
1 PR #17289 正文 `Clause-②` holds at `no`. Check Changeset PM 手工改 PR 正文
2 #17335Claim: 中文散文「条款② no(复用…)」 --pair 17336 exit 4 PM 手工改评论
3 #17337Claim: 同上 --pair 17339 exit 4 PM 手工改评论
4 #16659Claim: 同上(对抗式复核把它列为 F6) --pair 17334 exit 4 PM 手工改评论
5 #16549Claim: 同上 --pair 17332 exit 4 至今未修 —— 见下

两个不同角色#1 是一个 os-dev 交付席,#2#5 是 PM 席本人。⇒ ⛔ 这不是某一个席位马虎,是这个形状本身容易写错

⚠️ 而且第 5 条现在正卡着一条技术面全部合格的 PR:#17332 在 head 11e1b73de 上 38 个 check、0 失败,席内条款②复核 ①②③ 全 PASS,改动面干净。唯一未满足的是这一行字。


⭐ 真正的缺陷不是"容易写错",是写错之后出不去

修法路径按载体不同而不对称

  • PR 正文写错 ⇒ 席位可以改(update_pull_requestbody 参数)。Add metamodel interfaces for ObjectQL/ObjectUI contract #1 就是这么修的。
  • 卡上的 Claim: 评论写错 ⇒ 席位无法可修
    • MCP GitHub 工具集里没有"编辑已有 issue 评论"的工具(只有 add_issue_comment 新建)—— 已核;
    • ⛔ 补发第二条 Claim: 被认领纪律禁止(「⛔ 不要再发第二条 Claim:」);
    • ⛔ 门禁自己也明确拒绝代劳,而且理由是对的,逐字:

      ⛔ Do not fill the line in on the claiming seat's behalf; the declaration IS the judgement.

三条路全部关闭。 席位把自己写进了一个只有仓库外的人能解开的状态。

⚠️ 本会话里 #2#4 之所以修得掉,只是因为 PM 当时还有一条原始 REST 通道可以 PATCH 评论。那条通道随后被维护者关闭(理由与本卡无关,见「关联」)。⇒ 通道一关,第 5 条立刻变成不可自解。⭐ 这不是假设,是本会话的实际时间线。


⛔ 三条不要走的路(其中两条门禁自己已经论证过)

  1. 不要放宽拼写去接受散文。 门禁自己的原话:

    ⛔ And do not relax the spelling to accept the prose: a predicate that reads prose is a heuristic, and the measured terminus of that direction is a check that can barely fail.

    这条论证成立,⛔ 本卡不推翻它。

  2. 不要让检查器代填。 同上,声明本身就是判断;代填等于检查器在出裁决。

  3. 不要靠"下次记住"。 本会话的实测就是反例:规矩明明白白写着,PM 自己在给别人的派单里逐字叮嘱过这个拼写(「本会话刚在 security(rls): refuse RESERVED_RLS_MEMBERSHIP_KEYS by name at the RLS compiler merge #17289 上踩过,⛔ 不要再踩」),然后在自己写的下一条认领评论里又踩了三次。⇒ 记忆不是补救。


值得考虑的方向(⛔ 不是裁定,承接席自己论证)

  • 把固定拼写放到席位实际写字的地方。 今天它住在 check-clause2-carriers.mjs 的正则里,而席位是在写 Claim: 评论。若认领模板本身带一行占位(例如 SKILL.md 的认领形状里就含 Clause-②: <yes|no>),错误率的来源就消失了。⚠️ 先量:认领评论的形状今天是在哪里规定的、有没有一处单源。
  • 给出一条可自解的出口。 例如允许一条专用的更正评论(⛔ 不是第二条 Claim:,而是一个机器可读的、明确指向前一条声明的更正形状),或者明确记载"此状态需要人工介入"并让轮次报告把它列成阻塞项——⛔ 而不是像今天这样,卡在那里没有任何东西会主动说出来。
  • 让门禁的补救文案说出"谁能修"。 今天它说 "remedy: add the line to that claim comment",⛔ 但没说认领席可能根本没有编辑评论的能力。一个说不出实际可行动作的补救文案,等于没有补救文案。

验收(无论走哪个方向)

  1. 正面:一个席位按规定形状写认领评论,条款②声明天然是机器可读的,⛔ 不依赖它记得某个正则。
  2. 阴性对照必测:散文形式仍然读不出来(⛔ 不得为了本卡把判据放宽 —— 见上面第 1 条禁令)。
  3. 可自解性必须被钉住:造一个"声明写错了"的状态,证明席位自己能把它改回可读,⛔ 不需要仓库外的人介入。这一条是本卡的主旨,⛔ 只修拼写而不修出口等于没修。
  4. 消融:把新机制 ablate 掉,第 1 与第 3 条必须变红。

同一班次里量到的其它过程问题(⛔ 不在本卡范围,各自应当另立)

记在这里只为不再丢一次 —— ⛔ 它们不是本卡要修的东西。

  1. 双载体「同笔挂」与 PM 的工具冲突。 规矩是「PR 一存在即挂」,但 issue_write整集替换标签,而 PR 创建后有异步的 sizing 工作流在写标签 ⇒ 立刻挂有覆盖风险,等一等就落进门禁点名的 C1「载体挂了一半」。本会话 fix(security): OAuth-connected MCP agents run at the delegator's recorded scope, and a narrowed delegated read says so #17332fix(triggers,spec,service-automation)!: a time-triggered flow declares its acting organization and the run executes as it #17334 两条都撞了 C1。
  2. 陈旧基底上的绿不是当前读数,而没有任何东西这么说。 fix(security): OAuth-connected MCP agents run at the delegator's recorded scope, and a narrowed delegated read says so #17332 的普查差 1(分支落后 94 个 commit);fix(triggers,spec,service-automation)!: a time-triggered flow declares its acting organization and the run executes as it #17334 落后 94 个 commit 且 type-alias-convention.pin.test.ts 真冲突;fix(objectql): the in-memory aggregate lowering asks the driver for rows, so a measure filter stops being refused on driver-memory (#16642) #17251 早先被另一个包的钉子打红。落地规矩要求「入队前先同步 + 整体重生成」,⛔ 但没有一处告诉席位:一次通过的 CI 会随 main 前进而失效。本会话的对抗式复核席甚至把它误报成「这个 head 上没跑过 CI」。
  3. 记录被销毁时,复核的第③项无法核销,而规矩没有这一档。 账号被停用后本席建的每一张卡与 PR 全部消失;复核 fix(triggers,spec,service-automation)!: a time-triggered flow declares its acting organization and the run executes as it #17334 时,交付席的 open_questions 已不存在 ⇒ 诚实的读数是 NOT MEASURED,⛔ 不是「没有旗」。⚠️ 今天没有任何规矩说这种情况该怎么判。
  4. 独立性判据对「余席」欠明确。 SKILL.md:641 说余席是自审加门禁,而 contract-review.md 的独立性件写在 spec 席名下 ⇒ 一个隔离复核子代理据后者把本席的自审报成了 SELF-REVIEW。两处在效果上打架,需要一句话说清余席自审是规定形状而不是缺陷
  5. check:skill-examples 用 exit 1 表达前提缺失(应为 exit 3)⇒ 一次诚实的「没量」在对账里伪装成一条红。本会话被两个互相独立的席位各自撞到一次(A notify node that enqueued NOTHING reports the same as one that delivered: unmeasured=0 makes a zero-delivery run indistinguishable from a successful one #17123 那轮、fix(security): OAuth-connected MCP agents run at the delegator's recorded scope, and a narrowed delegated read says so #17332 的重生成轮)。与 dispatch-gates --ran's headline "0 NOT-MEASURED" is the runner's claim, not a measurement — a seat whose gates exited 3 still gets a green tick #17204(已合并为 501959b72)同族、方向相反。

关联

定级说明

priority:p2:它不改变任何产品行为,但此刻正阻塞一条全绿的 PR,且在一个班次内以 5 次的频率复现、跨两个角色。⛔ 更重的是它能把席位关进一个自己出不去的状态 —— 那类缺陷的代价不是时间,是需要仓库外的人介入才能继续。

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions