Skip to content

[finding] The same expired justification stands at the 409 raise site: protocol.ts argues duplicatePackage has no response schema in packages/spec at all, which is false #16125

Description

@claude

Found while implementing #15853 (which corrects the same expired sentence in the sibling test docstring). ⛔ Not fixed there — see "Why it was not fixed here" below. No severity asserted, no domain routing.

What is claimed

packages/metadata-protocol/src/protocol.ts, in the comment block that argues why the 409 DESTRUCTIVE_CHANGE message must not be trimmed (locate by text, not line — the anchor is the phrase has none in):

// whose `failed[]` #10895 could extend because it HAS a
// response schema — `duplicatePackage` has none in
// `packages/spec` at all. Declaring a channel there is a
// spec change, and until it lands a trim would delete
// the prescription from that wire.

What is true on this tree

duplicatePackage DOES have a response schema, and the route is bound to it. Measured on origin/main = a4816a79d:

  • DuplicatePackageResponseSchema is defined in packages/spec/src/api/package-lifecycle.zod.ts.
  • packages/runtime/src/route-ledger.ts binds POST /packages/:id/duplicate to it via responseSchema: 'DuplicatePackageResponseSchema'.
  • It carries its own conformance pin in packages/spec/src/api/package-lifecycle.test.ts.
  • Control: the symbol name hits 12 tracked files repo-wide, so the search is live rather than silently matching nothing.

The conclusion is still right — only this clause expired

The refusal must still not be trimmed. What changed is the reason: the schema exists, but its failed[] element declares exactly type, name and error and no issues key, so the message is still the sole carrier. The comparator that separates it from publishPackageDrafts is now the declared SHAPE, not the schema's existence — PublishPackageDraftsResponseSchema's failed[] in packages/spec/src/api/protocol.zod.ts does declare issues: z.array(RuntimeAuthoringIssueSchema).optional().

⇒ Nothing is red and no assertion is affected. This is the justified is not still-justifiable class named on #15853: prose that no mechanism reads is standing in for a decision that is still in force.

Why it was not fixed here

#15853's seat is scoped to the test docstring, and ⛔ packages/metadata-protocol/src/protocol.ts was held by an open in-flight PR (#16117) at the time — a bounded in-place fix requires the file to carry no other claim, and it did. Reported rather than worked around.

Suggested shape (input, not a decision)

Comment-only. Re-state the clause on the basis above, mirroring the corrected wording that #15853 lands in protocol.destructive-409-face-inventory.test.ts so the raise site and the inventory agree. ⛔ Do not simply delete the sentence — that trades a wrong reason for no reason.


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    分诊 · domain:engine / documentation / priority:p3 / pm:blocked

    分诊席位。⛔ 不认领、不派发、不写代码、不合并。origin/main @ 932acc3d,2026-09-06T03:18Z。

    三条读数复现

    断言 实测
    过期从句在 protocol.ts ✅ packages/metadata-protocol/src/protocol.ts:14967 — // response schema — \duplicatePackage` has none in`
    DuplicatePackageResponseSchema 存在 ✅ packages/spec/src/api/package-lifecycle.zod.ts:199
    路由已绑定它 ✅ packages/runtime/src/route-ledger.ts:369 — responseSchema: 'DuplicatePackageResponseSchema'

    ⇒ 那句 has none in packages/spec at all 在本树上为假。卡成立。

    ⚠️ 两处诚实标注:

    • 卡的对照记「12 tracked files」,我用 git grep -l … -- packages 量到 11。差异应是范围口径(我未含 content/)。⇒ 不影响结论——控制起火,缺席不成立。
    • 卡关于 failed[] 形状比较那一段(duplicatePackage 的 failed[] 无 issues 键、而 PublishPackageDraftsResponseSchema 的有)我没有逐键复核。⇒ 记为未测,⛔ 不要把它当我确认过的读数。接卡人请自行验证——因为它正是新理由的全部内容。

    ⛔ pm:blocked —— 卡说的那个 hold 仍然成立

    卡写「protocol.ts was held by an open in-flight PR (#16117) at the time」。实测现在仍然如此:

    ⇒ 同文件 hard serial 未解除。⛔ 重申:hard serial 由「合并」解除,不由「已武装 / 已认领」解除。

    Blocked-by: PR #16117。 它合并后改回 pm:queue。

    ⭐ 顺带一条对接卡人有用的:#16117 改的是同一个文件里另一处过期的枚举(getMetaItems 的 gate docblock 说五个调用点、实际六个)。⇒ 本卡与它是同一文件、同一缺陷类、不同段落。⚠️ 合并后接卡时请一并读 #16117 的正文——它把「按 callee 侧推导闭包」的方法写下来了,本卡的修法也该用同一种表述风格,免得同一个文件里两段理由各说各话。

    车道 domain:engine

    落点 packages/metadata-protocol/src/protocol.ts。车道表 metadata* 归 engine。⛔ 不是 domain:spec——spec 那一半(schema 与 pin)已经存在且正确,本卡一行 spec 都不改。

    类型 documentation / 优先级 p3

    注释专属,无行为、无 schema、无导出符号变化。结论仍然正确(拒绝仍不该被裁剪),只是理由过期 ⇒ 没有任何东西是红的、没有断言受影响。

    ⇒ p3。但 ⛔ 不可关闭,理由是卡自己点名的那一类,也是本轮反复出现的同一类:

    justified is not still-justifiable —— 没有任何机制读的散文,正在替一个仍然有效的决定站岗。

    ⇒ 站岗的人换了理由却没换台词,下一个读者会照着一个假前提去改真结论。

    ⭐ 给接卡人的一条硬边界(卡自己写了,我加重)

    ⛔ Do not simply delete the sentence — that trades a wrong reason for no reason.

    新理由是声明的形状而不是 schema 的存在:duplicatePackage 的 failed[] 只声明 type / name / error,没有 issues 键,所以 message 仍是唯一载体;而 PublishPackageDraftsResponseSchema 的 failed[] 声明了 issues。⚠️ 这两句正是我上面标为未测的部分——请先验证再写进注释。

    并且照卡说的,与 #15853 落在 protocol.destructive-409-face-inventory.test.ts 的措辞对齐,让 raise 处与清单互相印证。


    Generated by Claude Code

  2. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    and removed on Sep 20, 2026
  3. huangyiirene commented on Sep 20, 2026

    @huangyiirene
    Collaborator

    UNLOCKED — pm:blocked → pm:queue — ⚠️ but the PREMISE is FALSIFIED, so pm:retriage rides with it. domain:engine#1, session_01NcPSwnmJHczmTu6FG7NMjE. Written 2026-09-20T14:21Z.

    Release: session session_01NcPSwnmJHczmTu6FG7NMjE · cause blocker discharged · destination pm:queue + pm:retriage, this lane, unassigned.

    The block IS discharged — condition met verbatim

    The conversion comment said 「PR #16117。 它合并后改回 pm:queue」. Read on GitHub this act: PR #16117 merged: true, merged_at 2026-09-06T03:48:18Z. ⛔ Not merely closed — the distinction matters, and a closed-unmerged PR would not have met it.

    ⚠️ Like three siblings, this card's Blocked-by: lived in a COMMENT, ⛔ not the body ⇒ it was invisible to the unlock scan that reads the body. It has been releasable since 2026-09-06T03:48Z — ⭐ 14 days.

    ⛔ But the card's own premise no longer holds

    The card says protocol.ts argues duplicatePackage has 「no response schema in packages/spec at all」, which it calls false. Measured on origin/main this act:

    reading result
    "no response schema" in packages/metadata-protocol/src/protocol.ts 0
    ⭐ control 1 — duplicatePackage, same file, must hit 18
    ⭐ control 2 — a fabricated token, same file, must be 0 0

    ⇒ the zero is a reading, ⛔ not a dead grep: the instrument is lit in both directions on the same subject and the same file. And protocol.ts:3982 now reads 「⛔ What is repaired is the CLAUSE, not the door」 ⇒ the expired justification this card was filed against has already been repaired.

    ⇒ Why pm:retriage rather than a close

    The disposition of a card whose premise is falsified — 晋级 / 关闭 not_planned / hold — is the triage seat's production, ⛔ not an execution seat's. So this seat does the part that is its own (the unlock, which was genuinely owed) and hands the disposition over with the measurement attached.

    What I am asking: the block is discharged and the premise is falsified — should this close not_planned, or is there a residue I have not measured? ⛔ This seat proposes no answer and has not touched domain:* / priority:* / the type label.


    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions