Skip to content

Commit a61f61a

Browse files
docs(pm-dispatch): a security finding on a private repository is an ordinary security issue; the relay withholds a refusal message that quotes the body (#31102)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} --> _Requested by **Irene** · [project thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xCF4DobLCow88r565SX1vj9)_ Fixes #30114 Clause-②: no Metadata-protocol: none `dispatch-gates --tier` reads a MANDATORY model tier for `.claude/skills/pm-dispatch/SKILL.md` (clause ① of the model-tiering ruling). It is waived by the maintainer's standing order of 2026-11-03, and this card ran on the project's default model. The dispatching seat runs the contract review. Serial: #30271 waits on this card ## 维护者速读 - 改了什么:私有仓(今天是 cloud)的安全发现改为该仓带 `security` 标签的普通 issue,经中继立卡、机制写在卡里、照卡派修;公开仓仍是草稿安全公告。中继执行器在请求被拒时,不再把引用了请求正文的平台 `message` 印进公开运行日志。 - 为什么改:你的原话「cloud 私有仓库可以直接用带 security 标签的普通 issue,立卡修改 skills」,以及裁定「A2 本卡里一起修中继」;行数上限按你 07:54Z 的裁定(选项 A)64 → 65。 - 风险与回滚:只改内部 agent 规程与 `scripts/pm` 中继脚本,不发包(`skip-changeset`);回滚即 revert。 - 先看:`security-findings.md` 第 3 节(L19–L30)与第 6 节 L45;`execute.mjs` 的 `requestLanded` 失败路径。 - 两分钟验证:`node scripts/pm/fleet-write/execute.mjs --self-test`,预期 284 例全过;`node scripts/pm/check-skill-line-ratchet.mjs`,预期退出 0、`security-findings.md` 65 行(上限 65)。 - 需要你做的:无,席位落地。 ## What changes ### The rule (`.claude/skills/pm-dispatch/references/security-findings.md`) - §3: a seat tells a public repository from a private one by the affected repository's `private` flag, read from the API when the private card is filed, never recalled (L19). - §3: on a private repository, the private card is an ordinary issue with the `security` label, filed through the relay's `issue_create`, and it holds the mechanism (L29). Its fix is dispatched from that issue like any card at `xhigh`, with no card-less order and no advisory (L30). - §2's "no issue" and §3's advisory lines, including fallback A, apply to public repositories (L13, L20, L27; fallback A at L25 names only the advisory operations, so it is public-only by its own terms). - §6, item 2 of the card: on a private repository too, PR titles, PR bodies, commits and changesets state only the rule and link the issue, because a private repository can be made public and its history goes with it (L45). - §9's "two things" line: a seat files the private card per §3 and rings the doorbell with `#N` on a private repository (L63). A QA runner's finding reaches its PM session first (`checklist-test` L266), so the line names seats only. - §4's public line names the owner seat (L34), as §9's blocked-task line (L65) does, because a relay refusal now goes to `security#1` first (L64). - §8 (one place) is kept. ### Pointers whose wording would now be wrong - `filing-gate.md` L15: "not a card" becomes "does not pass this gate". - `lanes/security.md` L10 and L16: the private card per §3, and the doorbell carries `#N` on a private repository. L48: the patrol treats an open `security` card as mis-disclosed on a public repository only; on a private repository it is the private card. - `SKILL.md` L165 (lane table): drops "card-less order" from the fix route. - `checklist-test/SKILL.md` L266 (claim widened by the seat): "a security finding is not a card" becomes the runner's own duty, "the runner files no card for a security finding". The PM files the private card. - `project-forms.md` L48 (claim widened by the seat, comment 6704480966): the `Notify: security` doorbell rings when a private card is built (「私卡建成」, either branch of §3), not only a draft advisory. `.claude/agents/os-dev.md` L49, `lanes/server.md` L52, `lanes/review.md` L21, `project-forms.md` L52 and `rest-channel.md` L50–51 point at the file without wording that is now wrong. Left unchanged. ### The relay (`scripts/pm/fleet-write/execute.mjs`) `requestLanded`'s generic failure path used to print `HTTP {status} — {json.message}` as the platform gave it. A refusal whose message quoted the request body (an `issue_create` title or body, say) reached the row, the `✗ action` log line and both step-summary lines of a public run. Now the status is always kept, and the message is printed only when it reproduces no prose of the body sent. The test is the one the advisory rows use (`advisoryRefusalCause`): `advisoryProseOf` of the body and a 16-character `quotesKnown` window, raw and flattened. A quoting message is replaced by "the platform's message is not printed: it quotes the body sent, and no row prints that". Nothing else changes: the GraphQL branch and the 2xx legs are untouched. ## Tests The executor self-test battery for an `issue_create` on a private repository (added by seat 1's work, 5 cases) gains 3 cases, now 8. The battery floor goes 23 → 24, because `main` added the mailbox branch delete battery meanwhile. All fixtures use synthetic text. - A 422 whose message quotes the body: FAILED, status 422 kept, the marker in no log line, row, step summary or annotation. - A title whose every 16-character run holds a pipe, quoted back with slashes: caught on the flattened side. - A 410 whose message quotes nothing: printed as given. Mutation proof (each run on the final code with one change, then restored): | Mutation | Result | |---|---| | none | `284 cases pass across 24 batteries`, exit 0 | | fix reverted (the old one-line `return`) | 2 of 284 fail (the quoting refusal, the flattened run), exit 1 | | flattened comparison dropped | 1 of 284 fails (the flattened run), exit 1 | ## Acceptance notes ### Ruling of record for the ceiling Comment 6704167516 on #30114 (seat 3, 2026-11-07T07:55Z): "Maintainer `huangyiirene` ruled at 2026-11-07T07:54Z (option A of the seat's question in the project thread): raise the line ceiling of `.claude/skills/pm-dispatch/references/security-findings.md` from 64 to 65 for the one-line remainder the card thread measured after three real same-file deletions. Not option B (folding L31 and L47 into one line)." (Those were the line numbers before the deletions; on the head they are L30 and L45.) Seat 1's earlier raise to 67, which cited the card body, is reverted. The 65 row stands on this ruling alone. ### Line budget (`scripts/pm/check-skill-line-ratchet.mjs`, exit 0) | File | Lines (main → head) | Ceiling | Bytes (main → head) | |---|---|---|---| | `references/security-findings.md` | 64 → 65 | 64 → 65 (ruling above) | 3,601 → 3,800 | | `references/lanes/security.md` | 53 → 53 | unchanged | 3,156 → 3,190 | | `references/filing-gate.md` | 67 → 67 | unchanged | 6,558 → 6,561 | | `pm-dispatch/SKILL.md` | 319 → 319 | unchanged | 32,177 → 32,159 | | `checklist-test/SKILL.md` | 276 → 276 | unchanged | 19,278 → 19,288 | | `references/project-forms.md` | 59 → 59 | unchanged | 4,531 → 4,525 | Every touched prose line is ≤ 120 B (largest: `security-findings.md` L20 117, `lanes/security.md` L48 119; `security-findings.md` L63 is now 105, L34 84; `project-forms.md` L48 110 → 104). The `SKILL.md` L165 table row goes 333 → 315 B, under its pin. Bytes measured without the newline. `security-findings.md`: +4 lines added (L19, L29, L30, L45), three deleted, net +1: | Deleted line | Surviving home | |---|---| | §3 "a private repository has no private vulnerability reporting, so those operations stay a hand-off" | stale: the private-repository branch (L19, L29, L30) replaces it | | §3 "a seat never reports privately or writes an advisory under its own account: GitHub writes go only through the relay, as the App" | `pm-dispatch/SKILL.md` seat invariants L94–95 (content writes only through the REST relay, the write side always `objectstack-fleet[bot]`), plus the same file's L22 (a seat-account read is refused) and L25 (no re-send under another account) | | §4 the cross-repo finder's filing line, "file through the relay in the framework repository (§3); relay refused ⇒ hand the mechanism to the maintainer in session" | §3 L19–L20 (the affected repository's flag decides; the advisory sits on the affected repository) and §9 L63 (every seat files the private card per §3), L64 (relay refused ⇒ to `security#1`, the maintainer when vacant). This line had also named the maintainer where §9 names the seat. | L20 gets "on the affected repository" back, so the repository the card goes on stays named after the §4 line goes. ## Review fixes (contract review 6704473385) - **M1** `security-findings.md` L63: drops 「与 QA runner」, so only a seat files the private card. That matches `checklist-test` L266 and the mailbox recogniser (a QA runner's finding reaches its PM session privately first). 119 → 105 B, no line cost. - **S1** `project-forms.md` L48 (claim widened, 6704480966): 「草稿公告建成」 becomes 「私卡建成」, so the doorbell also rings for a private repository's `security` issue. 110 → 104 B, net 0 lines. - **N1** `security-findings.md` L34: 「with the maintainer」 becomes 「with the owner seat」, as L65 says. The rule means the seat: L64 routes a relay refusal to `security#1` first and to the maintainer only when the seat is vacant. Same bytes (84), no line cost. - **S2** is filed as #31103 (a repository-qualified number for the `Notify: security · #N` doorbell in `scripts/pm/record-recognisers.mjs`); it is outside this claim. - **N2** (fallback A L25 stays public-only by its own terms) and **N3** (a non-quoting refusal message is printed unflattened, as before) are left as they are. ## Verification <details><summary>Local gates on bb396b5: 47 derived, 47 run with exit 0, 0 NOT MEASURED (`dispatch-gates --ran`)</summary> - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 47 commands (32 pnpm, 15 direct node) for the 8 changed paths. Each ran with its exit code captured before any pipe, after building `@objectstack/formula`, `@objectstack/lint` and `@objectstack/objectql`. All 47 exited 0. - They include `check:pm-skill-ratchet`, `check:pm-fleet-write-execute`, `check:pm-fleet-write-validate`, `check:pm-fleet-write-dispatch`, `check:pm-governed-merges`, `check:pm-governed-prose`, `check:pm-skill-id-lint`, `check:skill-frame-sync`, `check:doc-authoring`, `check:ratchet-remedy-authority` and `check-comment-mask-corpus.mjs`. - `--ran` printed: `47 derived famil(ies) accounted for — 47 run, 0 NOT-MEASURED (a DERIVED zero — all 47 recorded an exit code and none of them is 3)`. - Earlier runs (6969dfe before the ceiling ruling, 1a0dc42 before the review fixes) do not count here. </details> - `node scripts/pm/check-governed-merges.mjs --branch claude/project-thread-kk5w88`: GOVERNED, Tier S (席内达档复核落地): `.claude/**` ×6. `scripts/pm/check-skill-line-ratchet.mjs` and `scripts/pm/fleet-write/execute.mjs` are not on the register. 94 changed lines (+73 / −21), under 3000. - `node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD`: exit 0 before every push. - History: seat 1's commit 5274bbc merged in, then `origin/main` twice. No rebase, no force-push. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (No schema touched.) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran. - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. Nothing publishes (`.claude/**` and `scripts/pm/**`), so the PR takes `skip-changeset`. Both declaration lines are filled in above. - [x] 6. `packages/spec` not touched; nothing to regenerate. - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English. (The 维护者速读 section is Chinese, per the lane template.) - [x] The *Before Submitting* list in CONTRIBUTING.md is done. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01J8VVAjG6DxvHuUKNbj3JB1 <!-- signed: domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7 --> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent f810c34 commit a61f61a

8 files changed

Lines changed: 73 additions & 21 deletions

File tree

‎.claude/skills/checklist-test/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ QA-source: #运行记录号 · area.item · 条款
263263
blocked 判定是一次成功运行;伪造的 pass 不是。
264264
- **每个产品问题同一轮经 §4 立 issue。** `fail` 条款与条款外探测同样,⛔ 不只留在运行记
265265
录或聊天;安全发现按下一条。
266-
- **安全发现不立卡,复现不上 GitHub**:定义、私卡与修复派发全照 pm-dispatch
266+
- **runner 不为安全发现立卡,复现不上 GitHub**:定义、私卡与修复派发全照 pm-dispatch
267267
`references/security-findings.md`,⛔ 这里不复述。runner 只把复现经会话间消息私报给
268268
**派发它的 PM 会话**(无此通道则留本会话,终报报 blocked)。运行记录只留一行
269269
`area.item · 条款 · security finding — detail withheld, reported to PM`,算已完成判定、标题计 `FAIL`。

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
162162
| `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及按锚定规则的例外归本域的工具链(域边界枚举与席内分派见 `references/lanes/spec.md`) |
163163
| `domain:ui` | `ui/**` 全部代码:`@object-ui/*` 库与 `ui/apps/*`、`ui/packages/types` 与 schema 语料、`ui/scripts` 与门禁工具、文档随所记录的面走;`packages/console`(dist 由 `pnpm console:build` 生成 ⛔ 不手改);协议恒归 `domain:spec`,受管面归 `domain:skills`;详见 `references/lanes/ui.md` |
164164
| `domain:cloud` | 涉 cloud 即整卡归 cloud PM(`repo:cloud` 席,同挂 `repo:cloud`):读或改 cloud 代码、生产方、事实或带 cloud 半边;本仓车道 ⛔ 不认领;cloud PM 跟到关卡,余下纯本仓活由它写明 cloud 事实后另立卡;判据见 `references/cross-repo-coordination.md` |
165-
| `security` · `review`(车道,无 `domain:*` 标签) | 安全发现(无文件面;修复经无卡派发令落在归属包);席位 `security#N`、接收、台账、派修与复核见 `references/lanes/security.md`;永不公开的规则只住 `references/security-findings.md`。复核席 `review#N` 见 `references/lanes/review.md` |
165+
| `security` · `review`(车道,无 `domain:*` 标签) | 安全发现(无文件面;修复落在归属包);席位 `security#N`、接收、台账、派修与复核见 `references/lanes/security.md`;永不公开的规则只住 `references/security-findings.md`。复核席 `review#N` 见 `references/lanes/review.md` |
166166
| (无固定归属,按落点分诊) | `packages/apps/*`、`examples/*`(归它演练的子系统)、`docs/audits/**` |
167167

168168
- 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。

‎.claude/skills/pm-dispatch/references/filing-gate.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
- 判例:仪表盘刷新按钮独占一行、首屏白占约 120px ⇒ 立;「配色换个好看的」⇒ 不立。
1313
- `reach:` 二选一:公开入口(HTTP/界面/`os validate`/保存)实测一次错误结果;或具名真实生产者。
1414
- 两种例外照立,要点首条「先测可达性」:发版固化的错误文字;维护者直派。
15-
- ⛔ 不是卡:安全发现(含可能泄露数据),不论多确凿;去向只照 `security-findings.md`。
15+
- ⛔ 不经本门:安全发现(含可能泄露数据),不论多确凿;去向只照 `security-findings.md`。
1616
- ② 只有维护者能做的决定,落卡即带「维护者速读」与四棱块。
1717
- ③ 维护者直派的任务,正文引其原话;④ 协调节点:跨仓/跨层父单与它的逐层子单。
1818
- 增改 pm 规则的卡只在维护者点名时立(归 ③,正文引点名原话);⛔ 席位自提不立。

‎.claude/skills/pm-dispatch/references/lanes/security.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
## 座位
88

99
- 席位 `security#N`,首席 `security#1`;签名、座位贴、坐席与收班同他席。
10-
- 无 `domain:security` 标签、无 `pm:queue`、无文件面:安全发现永不成卡,修复落在归属包。
10+
- 无 `domain:security` 标签、无 `pm:queue`、无文件面:私卡照第 3 节,修复落在归属包。
1111
- 坐席者 = 能读写本仓安全公告的账号(管理员或安全经理)的会话;读不了公告 ⛔ 不坐。
1212
- 公告的读、建与写只照第 3 节。
1313

1414
## 接收与台账
1515

16-
- 接收 ①:发现者的一次 `Notify: security · GHSA-ID` 门铃,草稿公告已由其经中继建好。
16+
- 接收 ①:发现者的一次 `Notify: security · GHSA-ID`(私有仓 `#N`)门铃,私卡已由其经中继建好。
1717
- 接收 ②:无门铃的 `triage` 公告(外报或中继实测):经 `advisory_read` 读,座位贴记 `received`。
1818
- 判定:发现 ⇒ 中继 `advisory_state` 置 `draft` 走派修;非发现 ⇒ 置 `closed`,台账记非发现。
1919
- 中继拒或本席空缺照第 3、9 节。
@@ -45,7 +45,7 @@
4545

4646
## 误公开的卡(第 7 节)
4747

48-
- 本席照第 7 节接管;巡查自读 open 的 `security` 标签卡,标签即转交。
48+
- 本席照第 7 节接管;巡查自读公开仓 open 的 `security` 标签卡,标签即转交;私有仓的是私卡。
4949
- 分诊即推维护者并转交本席(`triage.md`);`Notify: security · #N` 只为提速;本席空缺照第 7 节。
5050

5151
## 收班

‎.claude/skills/pm-dispatch/references/project-forms.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
- 移卡入队者→车道:p0/p1 `Blocked-by` 关闭 `Notify: unblocked`;记裁决席→被改席 `Notify: ruling`。
4646
- 席→兄弟席或他车道:认领文件面相交或须先落 `Notify: serial`,先落者落地 `Notify: landed`。
4747
- 上下线→兄弟席与分诊 `Notify: seat-online`、`Notify: seat-offline`;清单变→兄弟席 `Notify: split`。
48-
- 持发现的席→`security#1`:草稿公告建成或误公开卡挂标即 `Notify: security`,只带编号。
48+
- 持发现的席→`security#1`:私卡建成或误公开卡挂标即 `Notify: security`,只带编号。
4949
- 分诊→认领席:认领卡或 open PR 闲置 ≥3h `Request: progress`;反向随记录 `Notify: progress`。
5050
- 记录 = 项上写下一步与 ETA 的评论、§C 停车或释放;同项 60 分钟一敲,答 ETA 到期前不敲。
5151
- ⛔ 不敲:回执、重发;收方订阅 PR 已载者;停车或待决策卡的项的进度;问维护者走决策卡。

‎.claude/skills/pm-dispatch/references/security-findings.md‎

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 安全发现:永不立卡,永不公开机制
1+
# 安全发现:公开仓永不立卡,永不公开机制
22

33
任一座位、dev 与 QA runner 在任一仓碰到安全发现时读本文;他处只指向本文,⛔ 不复述。
44

@@ -10,28 +10,28 @@
1010

1111
## 2. 永不公开
1212

13-
- ⛔ 不立 issue,锚卡、跟踪卡与收口卡也 ⛔ 不提。
13+
- 公开仓 ⛔ 不立 issue(私有仓照第 3 节),锚卡、跟踪卡与收口卡也 ⛔ 不提。
1414
- ⛔ 机制不进 PR 标题、正文与评论,提交信息,changeset,复核记录,信箱。
1515
- 测试名写规则,⛔ 不写攻击。
1616

17-
## 3. 私卡是仓库安全公告(选 B)
17+
## 3. 私卡:公开仓是安全公告(选 B),私有仓是 `security` issue
1818

19-
- 私卡 = 受影响仓上一份未发布的安全公告,只有管理员、安全经理与受邀协作者可见。
19+
- 分辨看受影响仓的 `private` 标志,立私卡时经 API 现读,⛔ 不凭记忆。
20+
- 公开仓私卡 = 受影响仓上未发布的安全公告,只有管理员、安全经理与受邀协作者可见。
2021
- 首选中继 `advisory_create` 建草稿公告,再 `advisory_collaborators_add` 带具名账号进公告。
2122
- 读公告只走中继 `advisory_read`(席位账号读被拒):一次性密钥只在席位进程,只回密文。
2223
- `advisory_report` 与 `advisory_create` 同铸公告写权,无此权的仓两者皆拒;私报另有账号日限。
23-
- ⛔ 席位永不以自身账号私报或写公告:GitHub 写只走中继,以 App 身份。
2424
- 只发维护者为该版批准的清单:经中继先定版本再发布;运行编号记座位贴,⛔ 无正文。
2525
- 两操作皆被拒 ⇒ 会话专递(选 A):机制只在会话里交维护者,由其建草稿,⛔ 不换账号重发。
26-
- 私有仓无私密漏洞报告功能,那些操作上线后仍会话专递。
2726
- 回退时座位贴只写不透明编号与状态,⛔ 无细节。
28-
- 修复只由 `security#1` 席以无卡派发令派 `os-dev`,`xhigh`;机制只进派发令与公告。
27+
- 公开仓修复只由 `security#1` 席以无卡派发令派 `os-dev`,`xhigh`;机制只进派发令与公告。
2928
- 用到公告的临时私有 fork ⇒ 修复从该 fork 落地。
29+
- 私有仓私卡 = 该仓带 `security` 标签的普通 issue,经中继 `issue_create` 立,机制写在其中。
30+
- 私有仓修复由 `security#1` 席照该卡如常派发,`xhigh`;⛔ 不另起无卡派发令或公告。
3031

3132
## 4. 跨仓发现者(应用仓量框架、cloud 席位)
3233

33-
- 在框架仓经中继建草稿公告或私报(第 3 节);中继被拒 ⇒ 机制在会话里交维护者。
34-
- 公开面至多一行「a security item is with the maintainer」,⛔ 无细节。
34+
- 公开面至多一行「a security item is with the owner seat」,⛔ 无细节。
3535

3636
## 5. os-dev 报告
3737

@@ -42,6 +42,7 @@
4242

4343
- 标题、正文与 changeset 只写加固规则,形如 「the door reads in the caller's scope first」。
4444
- 正文、验证、消融只写规则与计数(红、后复原);未守卫代码做什么只进 `security_findings`。
45+
- 私有仓同此,提交信息亦然,只链该 issue:仓可转公开,历史随之公开。
4546
- 契约复核记录停在规则层;机制只进复核者本地的 `security-note.md`,⛔ 不提交。
4647
- 修复要定契约的,交维护者。
4748

@@ -59,6 +60,6 @@
5960

6061
- 每份安全发现从接收到发布归 `security#1` 席(章程 `lanes/security.md`),发现者只报不修。
6162
- ⛔ 不扩本 PR 或分支,不自开修复分支,不在同一面顺手加固;dev 只走第 5 节上报。
62-
- 席位与 QA runner 两件事:中继 `advisory_create` 建草稿;敲 `Notify: security · GHSA-ID`,只带编号。
63+
- 席位两件事:照第 3 节建私卡;敲 `Notify: security · GHSA-ID`(私有仓 `#N`),只带编号。
6364
- 中继拒(第 3 节)⇒ 机制在会话里交 `security#1` 席;席空缺 ⇒ 交维护者;发布清单归维护者。
6465
- 任务绕不开它 ⇒ 报 `blocked`,只写「a security item is with the owner seat」;席位停卡,⛔ 不绕行。

‎scripts/pm/check-skill-line-ratchet.mjs‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1348,7 +1348,13 @@ export const CEILINGS = new Map([
13481348
// body, filed under the maintainer's verbatim 「开发中遇到的问题应该通过安全通道上报而不是直接处理」. The
13491349
// dev's route and the fix-only-by-order sentence folded into existing lines (§9 L60, §3 L28). Measured
13501350
// delta +2 (62 → 64 lines); landed count, headroom 0.
1351-
['.claude/skills/pm-dispatch/references/security-findings.md', 64],
1351+
// 64 → 65 (#30114): the private-repository branch — a seat tells a public repository from a private one by its
1352+
// `private` flag read from the API, a private repository's private card is an ordinary `security` issue its fix
1353+
// is dispatched from, and its PRs, commits and changesets still state the rule and link that issue. +4 lines,
1354+
// paid by three same-file deletions (a stale private-repository line, the seat's own-account sentence, the
1355+
// cross-repo finder's filing line); the one-line remainder raised on the maintainer's ruling of record, comment
1356+
// 6704167516 on that card (option A, 2026-11-07). Measured delta +1 (64 → 65 lines); landed count, headroom 0.
1357+
['.claude/skills/pm-dispatch/references/security-findings.md', 65],
13521358
['.claude/skills/pm-dispatch/references/external-contributions.md', 22],
13531359
['.claude/skills/pm-dispatch/references/reading-discipline.md', 37],
13541360
// Lowered 51 → 47 by #25712 item 4: objectui stopped being a sister repo, so

0 commit comments

Comments
 (0)