You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 1f6bc5a
Browse filesBrowse the repository at this point in the historyBrowse files
pm-dispatch(main-red): knock the seats whose PRs were held for main to turn green (#29941)
<!-- claude-projects-attribution: {"github_login":"os-support-ai"} -->
_Requested by **Yibo Wang** · [project
thread](https://claude.ai/code/project/chan_01BVUyyPie8gHwoPM18iABwB?thread=cmsg_01BVUyyPie8gHwoPM18iABwBUyArWn6eHL33NNgvdpkwiW)_Fixes#29445
## 维护者速读
- **改了什么:** 车道因 main 红停放的 PR 在正文写一行 `Waits-on: main-red
#n`;锚卡关闭时分诊(缺则总监)找出所有带这行的 open PR,逐个敲其席位信箱新键 `Notify: main-green ·
anchor #n · PR #m`;收到的席位合 main、删这行、照 §C 继续落地。
- **为什么改:** 您的原话:「这个应该立卡写入 skills:如果到时候发现有哪个 PR 确实因为这次红被挡住(比如有车道把 PR
停下来等 main 绿),我会敲对应车道的邮箱,让它继续推进。」此前没有任何一步告诉停等的车道可以继续。
- **风险与回滚:** 只改 pm-dispatch 规则文本与信箱门铃词表,无门禁、标签、状态或巡查行;回滚即 revert 本
PR。三份规则文件各抬行数上限 1 行,均引本卡原话为裁决记录。
- **先看:** `scripts/pm/record-recognisers.mjs`(新键一行 + 读取器 + 自测
pin),`references/triage-duties.md`(敲门两行、删一行重复判据),`scripts/pm/check-skill-line-ratchet.mjs`(三处上限各
+1 的注释)。
- **两分钟验证:** `node scripts/pm/record-recognisers.mjs --mailbox-keys |
grep -A1 main-green` 应打印新键及其行;`--self-test` 应报 363 cases pass。
- **需要你做的:** 无,席位落地(Tier S:仅 `.claude/**` 与 `scripts/pm/**`)。
Clause-②: no
Metadata-protocol: none
## What changes
Four edits, one PR, as the card's Change 1–4 ask:
1. **Mark the hold** — `references/landing-operations.md` §C: the
release-condition line now reads "依赖 PR 或锚卡修复合入; 因 main 红停放者加行首
`Waits-on: main-red #n`" (folded into the existing line at zero lines;
120 B against the 120-byte cap).
2. **Knock on close** — `references/triage-duties.md`, beside the
main-red anchor duties: when an anchor card closes, in the same round
triage reads the open PRs whose body carries a line-leading `Waits-on:
main-red #n` and rings each one's seat once with `Notify: main-green`;
the worked example follows (anchor #N closes ⇒ PRs #a and #b each get
one knock; the count goes into the round record; the director takes the
duty when triage is absent).
3. **The doorbell key** — `scripts/pm/record-recognisers.mjs`:
`MAILBOX_KEYS` gains `Notify: main-green · anchor #n · PR #m` (17 → 18
keys) with its reader (anchor + PR, both in `numbers`); `--mailbox-keys`
prints it; `references/project-forms.md` 〈信箱 PR〉 names it in the
scenario list, which the self-test pins against the table in both
directions.
4. **The receiving seat** — `references/landing-operations.md` §C, one
new line: on `Notify: main-green` the seat merges `origin/main` (relay
`pr_update_branch`), drops the `Waits-on:` line and resumes as §C's last
step says.
No new gate, label, state or patrol row. `check-half-states.mjs` H72
reads the table only through `mailboxEvents`, so it needed no change and
its self-test passes.
### Line ratchet (`scripts/pm/check-skill-line-ratchet.mjs`)
Every file named here sat at its ceiling with every neighbouring line at
113–120 B, so folding bought only Change 1. Deletion paid one line:
`triage-duties.md`'s Clause-② boundary test, which `execution-duties.md`
already states (its `Clause-②:` line and its narrowing line). The
remainder is three ordinary ruled raises of **+1 each**, the ruling of
record being the maintainer's verbatim word quoted on #29445 (filing
gate ③, a task the maintainer set directly), copied into each CEILINGS
row comment:
| file | lines before → after | ceiling before → after | paid by |
| --- | --- | --- | --- |
| `references/landing-operations.md` | 101 → 102 | 101 → 102 | ruled
raise +1, recorded under the CROSS_FILE_MOVES destination's
`ruledRaises` (the gate still reads the move as +32 against −500) |
| `references/triage-duties.md` | 99 → 100 | 99 → 100 | +2 lines, −1
duplicate deleted, ruled raise +1 (this file is a source of the
`lanes/director.md` move: that move now reads +15 against −20, still
paid) |
| `references/project-forms.md` | 58 → 59 | 58 → 59 | ruled raise +1 |
`record-recognisers.mjs`: doorbell battery floor 41 → 42, roster pin
seventeen → eighteen; the pin refuses the misspelt keys `maingreen`,
`main-grean`, `green` and `Request: main-green`, and reads the anchor
alone, a bare `#m`, `PR none`, a bare anchor number, a trailing reason
and the verbatim template as unreadable.
## Tests
- `node scripts/pm/record-recognisers.mjs --self-test` — exit 0, `363
cases pass` (was 362 on the base).
- `pnpm check:pm-record-recognisers` (record-recognisers,
check-owed-reviews, mailbox-open, fleet-roster self-tests) — exit 0.
- `pnpm check:pm-skill-ratchet` — exit 0; prints the landing-operations
move as `+32 (69→102, less 1 line of ordinary ruled raise)` and the
director move as `+15 (70→86, less 1) against a net source decrease of
20`.
- `pnpm check:pm-skill-id-lint` — exit 0, 109 files clean.
- `node scripts/pm/check-half-states.mjs --self-test` — exit 0, 5161
cases.
- The three families above re-run on the committed head `6be5c8c8` — all
exit 0.
## Acceptance notes
- `node scripts/pm/record-recognisers.mjs --mailbox-keys` lists `Notify:
main-green · anchor #n · PR #m` with its row (sender triage or the
director; receiver the seat of each held PR; when the anchor closes).
- The worked example is in `triage-duties.md`'s edited text.
- Not done here (out of scope, no card filed): nothing mechanical reads
`Waits-on:` lines — the knock is a seat's reading of open PR bodies, as
the card asks (「这是一个门铃和两行文字」).
- Changeset: none — `.claude/**` and `scripts/pm/**` publish nothing;
`skip-changeset` declared on the create.
## Verification
<details><summary>dispatch-gates: 40 derived, 40 run, 0 NOT-MEASURED
(working tree identical to 6be5c8c)</summary>
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 40 families for the 5-file diff;
every command ran in the worktree with its exit captured before any pipe
and reconciled with `--ran`: `40 derived famil(ies) accounted for — 40
run, 0 NOT-MEASURED`. One family, `pnpm --filter @objectstack/lint run
check:doc-formula-expressions`, first exited 3 (PREREQUISITE NOT MET:
`@objectstack/formula` and `@objectstack/lint` not built); after `pnpm
exec turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint` it exited 0, and that reading is the one
reconciled.
</details>
Base: `origin/main` at `21510bba` — unchanged since the branch was cut,
so no merge was needed before opening.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01WGufzjF3PXfVhah6UuSDYG)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments