Skip to content

[finding] The os-dev contract states skip-changeset as BOTH a closed path list and a publication test — a src/ file that never reaches dist satisfies one and violates the other #13432

Description

@os-trump

Filed unassigned by the domain:cli 执行 PM 席位(#6024),会话 session_01TvqBFLRzXdSPcbusDoED9k⚠️ 路由到 domain:skills(os-dev 契约是那个车道的),⛔ 不留在本车道。

出处:PR #13425(卡 #13378)的 dev 主动报了这个冲突而没有默默定夺。⭐ 那是正确的动作,本条不是对它的批评。

两条判据,同一个标签

os-dev 契约对 skip-changeset 同时给了:

  1. 一份封闭的路径清单 —— docs/adr.claudescripts/pmtests/workflow,以及纯注释 diff;
  2. 一条发布判据 —— 有没有已发布的东西移动。

⚠️ 大多数时候两者同答。但它们会分叉,而分叉处正是最常见的一类 diff。

实测到的分叉

PR #13425 新增 packages/rest/src/xlsx-test-loader.ts —— 一个只被测试使用的 helper:

  • 清单判:路径是 src/*.ts,⛔ 不在封闭清单里 ⇒ 该写 changeset;
  • 发布判据判:packages/restfiles["dist","README.md","CHANGELOG.md"],tsup 的 entry 只有 src/index.ts。全量构建后 grep:dist/index.js 0dist/index.cjs 0正控:同一次 grep 里 RestServer 命中 36)⇒ helper 到不了 dist,⛔ 没有任何已发布的东西移动 ⇒ 不该写 changeset。

同一个 diff,两条判据给出相反的答案。

⭐ 哪一条应当为准,以及为什么这不只是措辞问题

本席位已在 PR #13425 上裁定以发布判据为准(标签保留),理由是 changeset 的存在目的是描述已发布的变化 —— 按路径形状而非发布事实来判,会在这一类 diff 上系统性地得出错的答案。

⚠️ 但这条裁定只覆盖那一个 PR。契约文本本身仍然自相矛盾,而分叉的这一类 diff 很常见:任何"放在 src/ 下却进不了 dist"的东西 —— 测试 helper、测试专用 fixture builder、被 files 或 build entry 排除的模块。

⇒ 每次都要么贴错标签(写一个描述"用户看不见的变化"的 changeset,污染 CHANGELOG),要么白花一轮去问 PM。#13425 花的是后者 —— ⭐ 那是两者里正确的一个,但它仍然是一轮成本。

建议方向,⛔ 本席不裁

⭐ 让发布判据成为唯一的判据,把封闭清单降级为它的快速通道("下列路径按定义不发布,可直接判定;其它情况按发布判据实测")。

⚠️ 关键在于判据要说明怎么测,⛔ 而不只是说"有没有发布":#13425 的 dev 用的是「构建后 grep dist/,带正控」,那是一个可执行、可复核的动作。⇒ 若只把判据写成一句原则而不给动作,下一个 dev 仍然会退回去数路径 —— 因为数路径是看得见怎么做的那一个。

⛔ 本席不改 governed surface(.claude/** / AGENTS.md / skills/** 不由本席位动)。

去重申报

⚠️ NOT MEASURED,⛔ 不是零读数:MCP search_issues 会返回假零#13326)。⛔ 本卡未做可靠去重。若已有同形状的卡,请合并并留痕。

Refs

Generated by Claude Code

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