Repository navigation
Commit 04492ec
docs(pm): the security seat triages a non-finding, reads a release by ancestry, and recovers the CI flakes the relay cannot re-run (#30155)
Fixes #30111
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:安全席的五个工作步骤写进各自归属的那一份 pm-dispatch
参考文件:无门铃公告的认领与关闭、发布状态归谁、版本内容按祖先判、把写挪到应答之后的 PR 的入队前检查、中继重跑不了的 CI 抖动怎么恢复。
- 为什么改:这些步骤 11-03/04 的工作轮里实际用过,技能文本里没有或写法不同;维护者让安全席走过「认领处理关闭」流程后立了本卡。
- 风险与回滚:只改三份技能参考,不动代码、不动门禁;三份文件行数都停在上限,新增行靠删掉别处已有的重复表述付账。回滚即还原本 PR。
- 先看:`lanes/security.md`(接收 ② 与判定两行、祖先两行);`platform-readings.md`
重跑段新增三行;`review-checklist.md` 末尾新增两行。
- 两分钟验证:`node scripts/pm/check-skill-line-ratchet.mjs`,预期全部 ✓,三份文件各自
headroom 0。
- 需要你做的:无,席位落地(Tier S,由安全席出契约复核记录后入队)。
## What changes
Each of the card's five additions lands in the one reference that owns
its topic. All three files are under
`.claude/skills/pm-dispatch/references/`.
1. **A report that is not a finding** goes in `lanes/security.md`,
section 接收与台账. A second intake route is added: an advisory sitting in
`triage` with no doorbell (an outside report, or a relay live test). The
seat reads it through `advisory_read` and claims it as a `received` row
on the seat post. Then it judges the advisory. A finding moves to
`draft` through the relay's `advisory_state` and follows the fix path. A
non-finding moves to `closed`, and its ledger row says it was not a
finding, with no detail (the ledger line already bars detail). The line
naming where advisory ids come from gains "a relay live test".
2. **Ledger states** stay in `lanes/security.md`. PR #30135 had already
put `closed` (fix merged) into the vocabulary and the relay publish onto
the maintainer's list. What remained was which state move belongs to
whom. The publish line now says that the maintainer's approval of the
list is `awaiting publish`, and the seat's relay publish is `published`.
The vocabulary line is unchanged.
3. **A release's contents are read by ancestry** goes in
`lanes/security.md`, section 呈维护者, next to the publish-list line. That
section owns the per-release list. `release-aftercare.md` owns
production roll-out duties and has no publish list. A fix is in version
X only if its merge commit is an ancestor of the commit tagged for X
(`git merge-base --is-ancestor`). A merge time earlier than the tag time
is not proof.
4. **A change that moves work after the response** goes in
`review-checklist.md`, section 测试与门禁证据, beside the `dogfood_battery`
check. It is a review step before landing. `true-green.md` is a
per-repository index of how to run checks, so it does not own it. The
dogfood jobs skip `pull_request` and `merge_group` (ci.yml THE TWO
SPEEDS). So a PR that moves a send or write to after the response can be
green everywhere and still red `main` on push. Before queueing, the seat
greps `packages/qa/dogfood/test` for readers of that side effect
straight after the answer, and has them wait within a bound in the same
PR.
5. **CI recoveries the relay leaves** go in `platform-readings.md`,
directly under the existing `rerun-failed.mjs` rule. `rest-channel.md`
is the per-operation channel table and does not hold the rerun or
re-queue rules. Three lines are added:
- `run_rerun_failed` covers `ci.yml` only (`RERUN_FAILED_WORKFLOWS`). ⛔
Never an empty commit, never close and reopen.
- `pr-automation.yml`: the seat's body edit that records the flake
reason is an `edited` event, and `edited` re-runs `Check Changeset` (the
workflow's `on.pull_request.types` lists it).
- `lint.yml`: once `main` has moved, a relay `pr_update_branch` produces
a real new head with a full run. While the head is level with `main`,
the update is a no-op.
The merge-group case (the failed step is `Checkout repository` timing
out) is folded into the existing known-flaky re-queue line, which now
also says to record the reason on the PR. The neighbouring line ("a
second ejection of the same PR stops re-queueing") already limits it to
once.
**How each file stays at its line ceiling.** The ratchet allows no raise
without a ruling, so every added line is paid for by deleting text that
already lives somewhere else:
| file | lines | deleted (said elsewhere) |
|:--|:--|:--|
| `lanes/security.md` | 53 → 53 | the fix-dispatch line restated
`security-findings.md` §3 (no-card dispatch, `xhigh`, mechanism only in
the order); the contract-review lines restated §6; the card-closing line
restated `landing-operations.md` (MERGED closes `Fixes`/`Part of`
cards); the mis-disclosed-card line restated §7. Each line now points to
its section. |
| `review-checklist.md` | 76 → 76 | two head-pin lines said the same
thing, so they are merged; "the gate families run inside" (stated in
AGENTS.md) and "do not skip on a reported local green" (stated by the
next-but-one line, "the local union proves only the local subset") are
deleted |
| `platform-readings.md` | 458 → 458 | a second copy of the quota
section's "a user ID in the rate-limit message is no evidence of a
shared pool" line; the GraphQL-pool line's restated definition of "the
few things with no REST equivalent"; and from the `rerun_failed_jobs`
pair, the recipe `landing-operations.md` spells; after the review, the
merge-time judgment is restored and paid for by folding the
`minimal_output` pair into one line (dropping the 107-point figure,
stated in the quota section, and the unmeasured narrow-interface
alternative) |
`lanes/security.md` still carries no finding, advisory id, path, object
name or mechanism. Its diff names only relay op names, the existing
`GHSA-ID` placeholder and the `git merge-base` command.
**Governed surface:** the diff touches `.claude/**` (Tier S). It lands
on the owning seat's contract-tier review of record, not on green alone.
## Tests
Prose-only change to skill references: no test file, no ablation (no
tested behaviour changed). Line widths were measured before writing:
every added or rewritten line is at most 120 bytes.
## Acceptance notes
- Item 2: #30135 already did most of it, so the residue here is one
rewritten line (the state owners on the publish line).
- Not edited, noted only: `SKILL.md` still names MCP `rerun_failed_jobs`
as the one exception to "no MCP writes". `platform-readings.md` routes a
seat's re-run through `rerun-failed.mjs` (the relay). Those two lines
may disagree. `SKILL.md` is at headroom 0 and outside this card's file
surface, so the question is left for the seat.
## Verification
Head `2e3dbd35ed`. `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 20 families, and all 20 ran locally,
each with its exit captured before any pipe. `--ran` reconciliation: "20
derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED (a DERIVED
zero — all 20 recorded an exit code and none of them is 3)".
<details><summary>Local gate exits</summary>
Every family exited 0: `check-closing-keyword-parity` (and
`--self-test`), `check-comment-mask-corpus`, `check-governed-queue-guard
--self-test`, `check-harness-current --self-test`,
`check:agent-test-spelling`, `check:cross-package-test-inputs`,
`check:doc-authoring`, `check:driver-memory-census`,
`check:gitlink-declared`, `check:nul-bytes`, `check:pm-governed-merges`,
`check:pm-half-states`, `check:pm-skill-id-lint` ("110 file(s) clean"),
`check:pm-skill-ratchet`, `check:refd-timer-probe`,
`check:required-contexts`, `check:skill-frame-sync`,
`check:watch-hint-literal`, and `check:doc-formula-expressions`. The
last one ran after `@objectstack/formula` and `@objectstack/lint` were
built under the shared verify lock ("VERDICT command-exit 0").
Roster families with a roster under `.claude` were also run:
`check:pm-settings-deny-roster` exit 0, `check-skills-token-ratchet`
exit 0, `check-published-list-mirrors` exit 0.
</details>
CI runs more families than the local subset. Read those from this PR's
check-runs.
<!-- signed: security#1 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj
-->
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 7193160 commit 04492ec
3 files changed
Lines changed: 23 additions & 23 deletions
File tree
- .claude/skills/pm-dispatch/references
- lanes
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
17 | 19 | | |
18 | | - | |
| 20 | + | |
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
23 | 25 | | |
24 | 26 | | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
| 27 | + | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
37 | 39 | | |
38 | 40 | | |
39 | 41 | | |
40 | 42 | | |
41 | | - | |
42 | 43 | | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
47 | | - | |
48 | | - | |
49 | | - | |
| 48 | + | |
| 49 | + | |
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
| 76 | + | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
132 | | - | |
133 | | - | |
| 132 | + | |
134 | 133 | | |
135 | 134 | | |
136 | 135 | | |
| |||
140 | 139 | | |
141 | 140 | | |
142 | 141 | | |
143 | | - | |
144 | 142 | | |
145 | 143 | | |
146 | 144 | | |
147 | 145 | | |
148 | | - | |
149 | | - | |
| 146 | + | |
150 | 147 | | |
151 | 148 | | |
152 | 149 | | |
| |||
287 | 284 | | |
288 | 285 | | |
289 | 286 | | |
290 | | - | |
| 287 | + | |
291 | 288 | | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
292 | 292 | | |
293 | 293 | | |
294 | 294 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | | - | |
| 42 | + | |
44 | 43 | | |
45 | 44 | | |
46 | | - | |
| 45 | + | |
47 | 46 | | |
48 | | - | |
49 | | - | |
| 47 | + | |
50 | 48 | | |
| 49 | + | |
| 50 | + | |
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| |||
0 commit comments