Repository navigation
Commit e27a7c0
docs(pm-dispatch): say how the claim reads the Clause-② public surface (#21783)
Fixes #21748
Clause-②: no
## What changes
One file, `.claude/skills/pm-dispatch/references/execution-duties.md`.
In its claim section (〈认领(先认领后动工)〉), the `Clause-②` criterion line asks
whether a card widens the accept set or the public surface, and nothing
said how to read the public surface. Five lines now sit directly under
that line. This is direction 1 of triage grade 5981293521: prose only.
Direction 2 is out under ruling 208, so there is no script, no gate and
no patrol row.
```text
- 公开面 = 包构建后的入口声明所达,⛔ 不只数入口的再导出清单。
- 所达 = 再导出名,加经其 props、参数与返回类型可达的每个类型。
- 语言包键已发布:包导出语言包及其派生类型(`TranslationKeys = typeof en`)即发布每个键。
- `Clause-②: yes` 至少 `minor`:AGENTS.md Post-Task Checklist 第 3 条,本行在认领处复述。
- 席位读不定(席位不做构建)⇒ 认领写明,dev 在报告里于构建声明闭包上实测,实测定案。
```
Each line maps to the triage comment's text:
1. Lines 1 and 2: "The public surface is what the package's built entry
declaration reaches. That means the re-exported names, plus every type
reachable through their props, parameters and return types. Not only the
entry's re-export list."
2. Line 3: "A locale pack's keys are published. A package that exports
its pack and a type derived from it (`TranslationKeys = typeof en`)
publishes each key."
3. Line 4: "`Clause-②: yes` takes at least `minor` (AGENTS.md, Post-Task
Checklist item 3). The line restates it where the claim is written."
4. Line 5: "When the seat's reading cannot settle a card (the seat makes
no build), the claim says so, and the dev measures on the built
declaration closure in its report. [...] that measurement decides."
The line directly above still pins the value to exactly `yes` or `no`,
so line 5 adds no third value. The seat writes its reading and says on
the claim that it is unsettled.
## The three measured cases under the new text
Read from the sibling `objectui` checkout at `9dfaca6` (objectui
`main`). Each case was read at its own landing commit, with the parent
commit as the control.
- **objectui#11569** (PR objectui#11604, landing commit `902ebab`) reads
`yes`, and line 4 now catches its mistake at the claim. The
`record:line_items` registration in `@object-ui/plugin-form` drops
`required: true` from its `childObject` input, so the page compile now
accepts a node it used to refuse. That widens the accept set, so the
answer is `yes`, as the claim said. The error was pairing that `yes`
with a `patch` changeset. Line 4 states, on the line where the claim is
written, that `yes` takes at least `minor`. The landed changeset reads
`'@object-ui/plugin-form': minor`.
- **objectui#11601** (PR objectui#11611, landing commit `b508ac5`) reads
`yes` under lines 1 and 2. The `@object-ui/app-shell` entry carries
`export { SchemaForm } from './views/metadata-admin/SchemaForm.js'`.
`SchemaForm(props: SchemaFormProps)` takes `SchemaFormProps`, whose
member `widgetContext?: WidgetContext` reaches `WidgetContext` through
the props of a re-exported name. `WidgetContext` is not re-exported by
name, which is exactly the hole line 1 is written for. The PR adds the
optional member `datasets` (a `LoadState` of `DatasetCatalogEntry[]`) to
`WidgetContext`. The parent commit has no `datasets?:` member. A new
member on a reachable type widens the public surface, so `yes` and
`minor`. The landed changeset reads `'@object-ui/app-shell': minor`.
- **objectui#11591** (PR objectui#11606, landing commit `b92329c`) reads
`yes` under line 3. The `@object-ui/i18n` entry exports `en` (`export {
default as en } from './locales/en.js'`) and `type TranslationKeys`,
which is declared as `export type TranslationKeys = typeof en;`. The PR
adds `preview.changes.confirmNoteSeparate`, `confirmNoteSeparate_one`
and `confirmNoteSeparate_other` to `en`. The parent commit has no
`confirmNoteSeparate`. That makes three new keys in a published pack and
three new members of a published type, so `yes`, and line 4 then
requires at least `minor`. The landed changeset reads
`'@object-ui/i18n': patch` and `'@object-ui/app-shell': patch`.
These are source readings of the entry and of the declarations the diffs
touch. For objectui#11601, the PR's own `dist` measurement agrees.
## Line budget (headroom 0, net 0)
The file is ratcheted at 183 lines with 183 before and 183 after, and
its ceiling is unchanged. Five restated lines pay for the five added
lines. Each deleted line's owning copy stays on the reading path: its
file is pointed to from a line this PR keeps in `execution-duties.md`.
Those pointers are "派发词只带增量,构造细则与条款原文见
`references/dispatch-runbook.md`。" and "逐项判据展开在
`references/review-checklist.md`,每份报告对着它过。". There is no re-wrap and no
rule removed.
1. Deleted (〈派发〉): "- 文件面写两句:预期落点;生产者在别包时修生产者侧并报落点,⛔ 不在消费者侧打补丁。"
Owning copy, `references/dispatch-runbook.md` 〈派发词构造细则〉: "-
文件面两句原文照抄:预期落点是 X。" and "- 若实测表明真正的生产者在别包,直接按生产者侧修,落点与理由写进报告和 PR 正文。"
2. Deleted (〈派发〉): "- same-day churn 行:当天合并 ⇒ 先核对当前
main;在飞重叠每轮求交,相交即发四句警告。"
Owning copy, `references/dispatch-runbook.md` 〈派发词构造细则〉: the same-day
churn bullet ("见当天合并即加一行"), "- 该行原文:基于合并后的代码工作,issue 引用的片段可能已变,先核对当前
main。" and "- 在飞重叠每轮拦截:main 新落 PR 与在飞申报文件面求交,相交即发四句警告。"
3. Deleted (〈派发〉): "- 被在飞重叠完全覆盖就停下回报,⛔ 不硬造 diff。"
Owning copy, `references/dispatch-runbook.md` 〈派发词构造细则〉: "- 四句:合 main
重跑测试矩阵、读对方 diff 重划边界、只补它没覆盖的、被完全覆盖就停下。" and "- ⛔ 不硬造
diff。中途收窄标准条款须点名替换承接人与时点,缺一 dev 报 blocked 不半执行。"
4. Deleted (〈复核〉): "- PR 形态与范围:draft、目标 `main`、`Fixes`/`Part of` 首行判据,翻
ready 前亲核。"
Owning copy, `references/review-checklist.md` 〈PR 形态与卡片关系〉: "- PR 存在、是
draft、目标 `main`,正文首行引用卡片。", the keyword bullet that follows it
("仅当合并应当关卡;只落地了可实施的一半 ⇒ 必须"), and "- 闭合关键词两读:翻 ready 前亲核首行、亲扫全正文,⛔
关键词永不挨另一张 open 卡编号。"
5. Deleted (〈复核〉): "- `Part of` 卡 MERGED 时点收口;changed files 范围与
changeset/`skip-changeset` 分流;测试证据。"
Owning copy, `references/review-checklist.md`: "- `Part of`
收口的卡不会自动关,`pm:dispatched` 必须手工摘,动作要件见落地细则 B。", "- 三条判据:无
`content/docs/releases/` 改动、用户可见改动有 changeset、无与卡无关的文件。", "-
Tests/docs-only 按仓库分流:本仓库走 `skip-changeset` 标签,⛔ 不走空 changeset。" and "-
测试证据要有真实命令与通过输出,⛔ 不接受一句 tests pass。". Also
`references/landing-operations.md` 〈B〉: "- 确认 MERGED 同一动作里给 `Part of`
卡收口、`Fixes` 卡代关但标也须摘,⛔ 不拆到下轮巡检。"
Every line in the file is 120 bytes or less. The five new lines measure
88, 87, 112, 102 and 116 bytes (`LC_ALL=C awk`).
## Premise, measured before editing
At `ebfe658c7` (`origin/main` when the branch was cut), `git grep -n -i
-E 'd\.ts|declaration|locale|TranslationKeys|re-export'` on the file
found 0 hits (exit 1). The control word `Clause-②` found 2 hits in the
same file. The reading rule was absent.
## Gates
The gates were derived from this change set with `node
scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`: 17 commands, the same 17 the dispatch
named. All 17 ran on head `af73798d9` and exited 0. `--ran`
reconciliation: "17 derived famil(ies) accounted for — 17 run, 0
NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of
them is 3)". Selected verdict lines:
- `pnpm check:pm-skill-ratchet`: "execution-duties.md is 183 lines
(ceiling 183; headroom 0)". No line is over the 120-byte budget, since
that red prints only on failure.
- `pnpm check:pm-skill-id-lint`: "34 file(s) clean".
- `pnpm check:skill-frame-sync`: "the one declared copy of the decision
frame is internally coherent".
- `pnpm check:nul-bytes`: "no raw ASCII control bytes".
- `pnpm --filter @objectstack/lint run check:doc-formula-expressions`
first exited 3 (prerequisite not met: `@objectstack/formula` and
`@objectstack/lint` unbuilt). It exited 0 after the build it names was
run through the verify lock.
## Acceptance notes
- `references/contract-review.md` already carries the reviewer-side
reading ("已发布面以包的 `exports` 映射为准", unreachable from the entry type graph
and not `exports`-addressable means not published). The new claim-side
lines agree with it, and it is not edited.
- No findings filed. `skip-changeset`: `.claude/**` publishes nothing.
## 维护者速读(草稿)
**改了什么**:执行席认领卡片时要判一行 `Clause-②: yes |
no`(这张卡是否扩大对外公开的接口面)。原来只有判断问句、没写怎么判;现在在该行下面补了五行判法:看包构建后入口声明能够到的全部类型(不只看入口直接导出的名字),语言包的键也算公开,`yes`
至少要 `minor` 版本号,席位判不准时在认领里说明、由开发 agent 构建后实测定案。
**为什么改**:objectui 一个班次里连续三次判错(两次把实际扩大了公开面的卡判成 `no`,一次 `yes` 却配了
`patch`),原因都是这条判据没有说明读法。判错的后果是 CHANGELOG 分节写错、`no` 卡跳过了契约复核。
**风险与代价(含回滚)**:只改一份内部协议文件,不发布、不动脚本与门禁;文件行数不变(183/183),新增五行以删除五条在
`dispatch-runbook.md` / `review-checklist.md` 已有原文的重复行抵扣。回滚 = 还原本 PR
这一个提交。
**席位意见**:
**你要做的**:无需操作。本 PR 是 Tier S 受管面(`.claude/**`),由席位做达档契约复核、PASS
后经合并队列落地;若不同意这套读法,在卡上留言即可。
---
_Generated by [Claude
Code](https://claude.ai/code/session_011SekRJwTRqXSmsP6xTSci4)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent e09f1ac commit e27a7c0
1 file changed
Lines changed: 5 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
68 | 73 | | |
69 | 74 | | |
70 | 75 | | |
| |||
131 | 136 | | |
132 | 137 | | |
133 | 138 | | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | 139 | | |
138 | 140 | | |
139 | 141 | | |
| |||
170 | 172 | | |
171 | 173 | | |
172 | 174 | | |
173 | | - | |
174 | | - | |
175 | 175 | | |
176 | 176 | | |
177 | 177 | | |
| |||
0 commit comments