Repository navigation
docs(agents): 一次派发跑出来的 PR 停在 draft —— 给自行合并条款加第二条例外 - #10213
Conversation
…e self-land clause objectui AGENTS.md's landing-flow clause told the author of a green, non-governed PR to flip ready and arm auto-merge, with exactly one carve-out (diff hits a governed surface). A PR opened by a dispatched os-dev over a non-governed file set therefore sat squarely inside it, while the dispatch contract in the sibling repo tells that same agent its terminal deliverable is a draft PR plus a report and that waiting for CI is not its job. Same actor, opposite instructions. Per the dispatch loop's conflict rule — act on the stricter clause and file a card, never settle it by editing the text on the spot — the stricter side is the dispatch contract, so the self-land sentence is the one that moves. It now carries a second carve-out, stated as a question about WHO is acting rather than about which files changed: a PR carrying a Claim comment, implemented by a dispatched agent, stops at draft whatever the governed-surface verdict says, and the dispatching seat converges CI, flips ready and enqueues. The residual case is kept explicit rather than deleted: an unsolicited change with no dispatch and no Claim comment still self-enqueues under the main sentence. Net zero lines: one line rewritten in place, AGENTS.md stays 589 lines. The os-dev contract is quoted by content anchor, not by line address — this repository's cross-file line-citation convention. Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
Contract reviewServed-tier: ① Derived judgmentsRendered in-seat by the skills seat 1 session at the served tier the maintainer named on this date (the fable tier word; ruling record objectstack#7623 comment 5771798588). The contract is the pm-dispatch conflict rule the card cites — 「两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结」 — with the os-dev dispatch contract as the stricter clause.
② Semver levelNone — a governed instruction file; no package source; no changeset owed; no label written ( ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
…ude/settings.json (objectui#9586) (objectstack-ai#10214) Fixes objectstack-ai#9586 ⛔ **GOVERNED — this pull request is a DRAFT and stays one.** The changed instruction-tree path is governed surface in this repository. Asked of the guard itself, in this worktree: ``` $ node scripts/check-governed-queue-guard.mjs --test .claude/settings.json .changeset/issue-9586-enqueue-class-deny-mirror.md ⛔ GOVERNED — 1 of 2 path(s) are on a governed surface: .claude/** x1 — the agent instruction tree (skills, hooks, settings) - .claude/settings.json One governed path governs the WHOLE pull request — proportion is not a question. ⛔ Do not flip it ready, enqueue it, or arm auto-merge. Park it as a DRAFT and leave the merge to the maintainer; a human merge IS the review record for a governed surface. The merge-queue run of "Governed Surface Queue Guard" refuses this diff unless an APPROVED review by an authorized approver (GOVERNED_APPROVERS: os-zhuang, hotlong) is on the pull request — on whichever commit it was left (maintainer ruling 2026-09-04). (exit 3) ``` ⇒ ⛔ never flipped ready, ⛔ never enqueued, ⛔ never armed with auto-merge, ⛔ never approved by a seat under any account. Under ruling C the claiming seat lands it only once an authorized APPROVED review exists. ## 维护者速读(草稿) **改了什么** 一个文件、三行:`.claude/settings.json` 的 `permissions.deny` 从 14 条加到 17 条,新增点名三个 MCP GitHub 工具 —— `update_pull_request`、`enable_pr_auto_merge`、`disable_pr_auto_merge`。改完之后,本仓的 deny 数组与 objectstack 的**逐元素相同、顺序也相同**。`allow` 与 `hooks` 两块字节未动。另附一个空 frontmatter 的 changeset(声明「不发版」,本仓惯例)。 **为什么改** 这是 objectstack 已裁决条款的跨仓镜像,不是本仓的新主张。objectstack#18282 裁决 A(批次 objectstack-ai#135 追认)把「声明即强制」扩到**入队类**:席位在两个板上真正用的入队通路只有 REST 的 `PUT .../pulls/{n}/ccr/auto_merge`(它就在同一个文件的 `allow` 里),所以把 MCP 的那两个入队工具关掉,**不损失任何能力**,只是把一条没人走的旁路封死。 第三条 `update_pull_request` 是本仓自己的事故教训:objectui#6183 里,一次只传 `reviewers` 的 MCP 调用**顺带**把 PR 的 `draft: false` 设了,于是一个受管草稿进了合并队列、零人工批准就落了地。本仓当时只镜像了 14 条内容写入类,这一条(objectstack 在 PR #18276 落地)和入队那两条(PR #18317)都没跟上 —— 本次一并补齐。 **风险与代价(含回滚)** - 代价:任何还想用 MCP 去翻 ready、挂/摘 auto-merge 的流程会被运行时拒绝。这是有意的。`gh pr ready`、`gh pr merge --auto` 与 REST 的 ccr 路径都不受影响。 -⚠️ 已知代价,需要你知道:AGENTS.md 里有两处**配方文本**仍然点名这两个工具(自行合并那条的「MCP 等价物」一行,以及受管面段「发现自己已经挂上了怎么办」那条补救 —— 后者写的是「只调 `disable_pr_auto_merge` …… 两个都要做」)。本卡的文件面只有 `.claude/settings.json`,且 AGENTS.md 当前被两个在途 PR 持有(objectstack-ai#10212 / objectstack-ai#10213),所以本 PR ⛔ 不碰它,改由席位另立卡。方向是安全的一侧:配方失效会**响亮地被拒**,不会静默做错事。 - 回滚:`git revert` 单个 commit 即可,无数据迁移、无构建产物、无已发布包字节变化。 **席位意见** (留空,交席位定稿) **你要做的** 确认「入队类 MCP 工具一并关掉」这个方向是你要的(objectstack 那边已经这么定了),然后在本 PR 上留一条 APPROVED review。批准之后由认领席翻 ready、入队落地,你不需要自己合并。上面那条⚠️ 只需要你知道,不需要你在这张卡里处理。 ## 前提核验(动手前,在 `origin/main` `0cf2d6644` 上实测) | # | 前提 | 读数 | 结论 | |:--|:--|:--|:--| | P1 | 卡片说本仓 deny 有 14 条 `mcp__github__*`,且三条都不在 | 实测 deny 总数 14,全部是 `mcp__github__*`;三条各命中 0 次,正控 `issue_write` 命中 1 次 | 成立 | | P2 | 本仓有没有 deny 名册门禁(objectstack 的 `scripts/pm/check-settings-deny-roster.mjs`) | 不存在;`scripts/pm/` 全部内容是 `board-snapshot.mjs` 与 `check-half-states.mjs`;全仓 grep `settings.json`,`scripts/` 与 `.github/` 内零个读取者 | 无 ⇒ ⛔ 不移植该门禁 | | P3 | 本仓有没有通道对照表(objectstack 的 `references/rest-channel.md`) | `.claude/` 下不存在任何 `references` 目录;`.claude/` 全部文件共 14 个(4 个 hook + 4 个 selftest + `launch.json` + `settings.json` + 2 个 skill 的 4 个 md) | 无 ⇒ 那一行事实无处可加 | | P4 | `.claude/settings.json` 是不是被 pin 的上游移植文件(改它会红 `check:upstream-port-parity`) | 不是。`scripts/upstream-port-pin.json` 13 条,`.claude/` 下只 pin 了 8 个 hook/selftest 文件 | 可以改;该门禁仍已跑,绿 | | P5 | 并发:有没有别的在途 PR 碰这个文件 | 7 个 open PR 的文件清单逐一读过,零个碰 `.claude/settings.json`;`objectstack-ai#10212` / `objectstack-ai#10213` 只有 `AGENTS.md`(hunk 分别在 468 与 323 行区) | 无冲突 | ## 执行判据(卡片的那一条) 推送之后,`GET /repos/objectstack-ai/objectui/contents/.claude/settings.json?ref=claude/issue-9586-settings-deny-auto-merge-mirror` 解码后的 `permissions.deny`(HTTP 200,blob sha `30c3367037de7ba000673e4da8caa2913a9c704c`,size 2255): ``` 1 mcp__github__issue_write 2 mcp__github__create_pull_request 3 mcp__github__update_pull_request ← 新增(objectstack PR #18276 的镜像) 4 mcp__github__add_issue_comment 5 mcp__github__add_comment_to_pending_review 6 mcp__github__add_reply_to_pull_request_comment 7 mcp__github__pull_request_review_write 8 mcp__github__push_files 9 mcp__github__create_or_update_file 10 mcp__github__delete_file 11 mcp__github__create_branch 12 mcp__github__sub_issue_write 13 mcp__github__merge_pull_request 14 mcp__github__create_repository 15 mcp__github__fork_repository 16 mcp__github__enable_pr_auto_merge ← 新增(本卡的判据) 17 mcp__github__disable_pr_auto_merge ← 新增(本卡的判据) ``` 两条判据条目都在 ⇒ 判据满足。 ## 改动的形状,实测而非声称 ⛔ 没有手打重排。两处锚点文本替换,锚点各自唯一,其余字节不动: ``` deny base: 14 branch: 17 objectstack: 17 branch deny === objectstack deny (order included): true allow identical to origin/main: true sha 46560076ce2be885 = 46560076ce2be885 hooks identical to origin/main: true sha 10e6c3a3ae991607 = 10e6c3a3ae991607 top-level keys / permissions keys: 与 origin/main 相同,无增删 added: ["mcp__github__update_pull_request","mcp__github__enable_pr_auto_merge","mcp__github__disable_pr_auto_merge"] removed: [] duplicate entries: 0 git diff --numstat: 4 1 .claude/settings.json ``` 顺序惯例是**按类分组、不是字母序**(实测:objectstack 把 `update_pull_request` 紧挨 `create_pull_request`、把入队对追加在末尾),本 PR 照同样的位置插入,结果两仓数组完全一致。 两个读者都能解析:`node JSON.parse OK` · `python json.load OK`。`settings.json` 里 wire 的 4 个 hook 命令全部落在磁盘上(4/4 OK)—— 这个文件正是点名它们的那一个。 ## 门禁 门禁族由本仓自己推导:objectui 没有 `scripts/pm/dispatch-gates.mjs`(不存在),所以逐个读 `.github/workflows/*.yml` 的触发条件,取「会判到这两个路径」的全集。 | 门禁 | exit | 判定行 | |:--|:--|:--| | JSON 有效性 | 0 | `node JSON.parse OK` · `python json.load OK` | | `check-control-bytes`(commit 后重跑) | 0 | `✅ check-control-bytes: OK (scanned 8217 tracked text file(s); skipped 85 binary).` | | `check-governed-queue-guard --self-test` | 0 | `OK check-governed-queue-guard self-test: 185 cases pass` | | `check-governed-queue-guard --test` | 3 | 本文顶部那段(受管,exit 3 是本 PR 的健康读数) | | `check-changeset-presence` | 0 | `✅ No source or published contract of a released package changed in this range, so no changeset is owed.` | | `check-changeset-no-major` | 0 | `✅ No changeset declares a major bump.` | | `check-changeset-overwrite` | 0 | `✅ No pre-existing changeset was modified or deleted.` | | `check-lint-coverage` | 0 | `✅ lint coverage: 46/46 packages linted, 0 with outstanding errors (0 total).` | | `check-entry-guard --self-test` / 全跑 | 0 / 0 | `63 cases pass` · `108 scripts/ file(s) — no entry guard outside the baseline` | | `check-upstream-port-parity --self-test` / 全跑 | 0 / 0 | `66 cases pass` · `13 ported file(s) match objectstack-ai/objectstack modulo their declared divergences` | | `check-bash32-floor --self-test` / 全跑 | 0 / 0 | `160 cases pass` · `13 tracked shell file(s) … name no bash 4+ construct` | | `check-skills-paths` | 0 | `✅ check-skills-paths: OK (88/89 stated path(s) resolve across 20 guide file(s); 1 baselined).` | | `check-new-cross-file-line-citations` | 0 | `VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0` | 退出码一律在任何管道之前捕获(先重定向到文件,再读 `$?`)。 **不欠的两族,连同不欠的理由:** `hook-selftests.yml` 的 paths 是 `.claude/hooks/**` 与它自己 —— 本 diff 不碰 hook 文件(hook 命令仍被 `settings.json` 点名,所以单独验了 4/4 落盘)。`check-shell-escape-residue` 的 `SCAN_ROOTS` 是 `AGENTS.md`、`CLAUDE.md`、`skills`、`.claude/skills`、`content/docs` 五条,`.changeset/**` 不在其中 ⇒ 新增的 changeset 不在它的总体里。 **lint 与 type-check:一次申报过的收窄,不是一次漏跑。** 三条读数里的两条来自仪器,第二条被替换,如实写明: 1. **总体读自 eslint 自己的配置**:`eslint.config.js` 里每一个 `files` 块都限定在 TS/TSX(`**/*.{ts,tsx}`、`scripts/**/*.{ts,tsx}`、`**/*.test.{ts,tsx}`、`**/__tests__/**/*.{ts,tsx}`、`**/examples/**/*.{ts,tsx}`、`**/*.tsx` 及三个具名单文件),没有 JSON 块,也没有 markdown 块。 2. **文件数**:⚠️ 本次**不是**读自 `--format json`,而是读自 diff 的扩展名普查 —— 本分支 `git diff --name-only` 两个文件,`.json` 与 `.md` 各一,`.ts/.tsx/.js/.mjs/.cjs` 命中 **0** ⇒ 落在 eslint 总体里的文件数必然为 0。这个容器里 objectui 没有 `node_modules`(共享检出与本 worktree 均无),而为一个 JSON + markdown 的 diff 做一次全仓 `pnpm install` 是这台共享机器上最贵的动作、且买不到任何判定。⇒ 这一格的仪器读数记 NOT MEASURED,理由如上;推翻它只需要一个 `.ts` 文件,而本 diff 没有。 3. **对未触碰文件的不变性**:type-aware linting 全仓未启用(`eslint.config.js` 里没有任何块设 `parserOptions.project` 或 `projectService`)⇒ 本 diff 移不动任何它没触碰的文件的判定。同一读数覆盖 `type-check`:tsc 的输入字节未变。 仓级 `pnpm lint` / `pnpm type-check` 农场是 CI 的运行。⚠️ 并且它**会**在本 PR 上跑满:`lint.yml` 的相关性判断只排除 `**/*.md`、`content/**`、`docs/**`、`.changeset/**`,而 `.claude/settings.json` 不在排除列里 ⇒ `should_run=true`,安装之后的那半边门禁由 CI 如常判定。 上述读数取自本分支最终 commit `45f22049`。 ## Acceptance notes 顺路看到、⛔ 本 PR 一律没动的: - **AGENTS.md 有两处配方点名了本 PR 刚关掉的工具。** 一处在「CI 全绿即自行合并」那条的代码块里(`# MCP 等价物:pull request update(draft: false) + enable_pr_auto_merge`),一处在受管面段的补救条(「只调 `disable_pr_auto_merge` 会摘掉 auto-merge 但不取消队列成员资格,两个都要做」)。本 PR 落地之后,照这两处文本行事的席位会撞上运行时拒绝。objectstack 那边的对应修复是改它的通道对照表那一行(「auto-merge 备用 MCP 未拒」→「auto-merge MCP 锁 1 同拒」);本仓的等价文本恰好落在 AGENTS.md 里,而 AGENTS.md **不在本卡的文件面内**,且当前被 objectstack-ai#10212 / objectstack-ai#10213 两个在途 PR 持有。⇒ 交席位另立卡,本 PR 不碰。方向安全:失效的配方会被响亮拒绝,不会静默做错。 - **`.changeset/issue-9418-write-identity-locks-port.md` 里有一句已经过时的话。** 那份(空 frontmatter、永不消费的)历史声明写着四个「状态形」工具 —— 含 `update_pull_request` 与 `enable_pr_auto_merge` —— 「stay allowed」。本 PR 之后其中两个不再 allowed。它是一份历史记录而非规程,读者为零,⛔ 不改、也不建议为它单独立卡;记在这里只是为了下一个读到那句话的人不被它误导。 - **`check-governed-queue-guard.mjs` 的拒绝文案仍写着「a human merge IS the review record」**,而 AGENTS.md 已按裁决 C 改成「获授权批准后由认领席落地」。这条在 objectui PR objectstack-ai#9448 的 Acceptance notes 里已经报过一次,至今仍在;本 PR 只是再次撞见,不重复立卡。 `Clause-②: no` 本次实现所在的会话,写成散文以便在正文被改写后仍可追溯:`session_01Wnstp2kTth7sGXfr8fXypc`。 ## 席位意见(`domain:skills` seat 1,session `session_01Wnstp2kTth7sGXfr8fXypc`) **建议:批准并由席位落地。** 一个文件三行,把 objectui 的 `permissions.deny` 补成与 objectstack 逐元素、同顺序相同(席位在复核工作树上解析两边数组比对为真);`allow` / `hooks` 未动;三条都在卡的裁决范围内(objectstack#18282 裁决 A、批次 objectstack-ai#135 追认;`update_pull_request` 是卡正文点名的「本仓一并缺失」项)。不损失能力:两个板上席位真正用的入队通路只有 REST `PUT …/ccr/auto_merge`,就在同一文件的 `allow` 里。卡留给取卡者的两个可选项 —— 移植 deny 计数门禁、频道表加一行 —— 本树都不存在对应物,均未做(新增门禁默认否)。 **你需要知道的一件事(不阻塞本 PR):** 落地后 objectui `AGENTS.md` :331 与 :531 两处配方文字仍写着 `enable_pr_auto_merge` / `disable_pr_auto_merge` 作为 MCP 等价物,届时会被响亮拒绝而非静默执行错;两个在途 AGENTS.md PR(objectstack-ai#10212 :468、objectstack-ai#10213 :323)不在那两段,不能顺带。席位身份过不了立卡门,已记到席位帖的维护者事项里,由你决定是否立卡。 复核记录:PR 评论 5778587633(PASS,在席按服务档渲染);ACCEPT 在卡 objectui#9586。CI 读数:42 latest-per-name check runs — 39 success, 3 skipped, 0 in progress, 0 other。 --- _Generated by [Claude Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_ --- _Generated by [Claude Code](https://claude.ai/code)_ Co-authored-by: Claude <noreply@anthropic.com>
Fixes #9992
维护者速读(草稿)
改了什么
AGENTS.md只改一行(第 326 行,「多 agent 协作纪律」节里那条「CI 全绿即自行合并」)。原来它只留了一条例外(diff 命中受管面);现在留两条,新增的第二条是:由一次派发跑出来的 PR(卡上挂着Claim:评论、由被派发的os-dev一类 agent 实施的那种)不论受管面判定如何都停在 draft,等 CI 收敛、翻 ready、入队、事后重挂 auto-merge 全是派发席的动作。同时把「没有派发、卡上没有Claim:的自发改动仍按本条自行入队」写明,免得这条例外被读成把自主改动也一并冻住。净增 0 行,文件仍是 589 行。为什么改
同一个 agent 在两份规程里收到相反的指令:objectui 的
AGENTS.md让绿了的非受管 PR 作者自己落地,而每个 os-dev 运行都读的派发契约(兄弟仓.claude/agents/os-dev.md)说它的终态交付物就是「draft PR + 报告」、等 CI 不是它的事。受管面守卫解不开这个结:它答 NOT GOVERNED 只解除批准要求,而派发契约管的是谁在动手,不是改了哪些文件。这不是假想 —— objectui#9475 → PR #9962 上一个被派发的 dev 已经在这里停住并把它当治理问题上报。派发循环的冲突规则是「两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结」,更严的一条是派发契约(停在 draft),所以移动的是AGENTS.md这句自行合并。风险与代价(含回滚)
代价:被派发的 PR 从此多等一个人,落地延迟由派发席的巡检节奏决定。风险面很小 —— 这条规则没有任何机械执行者(受管面守卫不读
Claim:),它的全部效力在于读到的人照做;所以写错的后果是「有人照旧自己合并」,不是构建红。回滚就是git revert这一个 commit,文件回到原来的一行,不触及任何脚本、工作流或标签。另一个方向的代价请一并权衡:如果维护者更想要方案 2(改派发契约,让 dev 在非受管 diff 上自行落地),那就得把 PM 循环的复核步骤一起重写,因为复核人现在就是落地人 —— 本 PR ⛔ 没有走这条路,原卡把它记为「会删掉循环赖以存在的复核步骤」。席位意见 —— 技能席 1(
session_01Wnstp2kTth7sGXfr8fXypc)已按 GitHub 与拉取的 head46680d1复核:只改 :326 一行,方向按卡引的冲突规则「按更严的一条」取 os-dev 契约(dev 停在 draft、派发席落地),例外 ② 以「谁在动手」为键、不被受管面判定解除,无派发的自发改动仍按原句自行入队;跨仓契约按内容锚引用而非path:line(本仓禁令,引用门禁读 0 新增)。objectui 自带的五个门禁本席复跑均 exit 0,check-governed-queue-guard --test AGENTS.md读 GOVERNED。复核记录 PASS 5773828944(席内 fable)。与 PR #10212 同文件不同区域,后落者合并。建议合并;「受管面」一节尚未回指例外 ②,留给下一次动该节的 PR。你要做的
读上面「两条条款」一节的两段原文,确认第二条例外的措辞是你要的治理语义;认可就合并这个 PR(本仓
AGENTS.md是受管面,本 PR 停在 draft,由你落地)。如果你更倾向方案 2,请直接说,这个 PR 撤掉、改去兄弟仓动派发契约。两条条款,原文与出处
A —— objectui
AGENTS.md第 326 行(改动前,0cf2d66)紧随其后的代码块(第 328–332 行)就是那两行入队命令:
gh pr ready与gh pr merge --squash --auto --delete-branch。:330(树在c255b38,当时AGENTS.md593 行)。在本 PR 的基点0cf2d66上文件是 589 行,同一条款在 第 326 行。原卡的:330在今天的树上指向的是那两行入队命令里的gh pr merge那一行。B —— objectstack
.claude/agents/os-dev.md(只读,⛔ 本 PR 不改)在
372931e上,os-dev.md共 403 行。第 16 行:
第 311 行:
第 312 行(同族,一并引以说明「等 CI」到底归谁):
:310。在372931e上:310是那条 objectuiskip-changeset的规则,被引的句子在 第 311 行,差一行。它们为什么真的相撞
A 只挖了一个洞:
diff 命中受管面。一个被派发的 os-dev 在非受管文件面上开的 PR 因此整个落在 A 的适用范围里 —— A 让它在 CI 绿后翻 ready 并挂 auto-merge,而 B 告诉同一个 agent 等 CI 根本不是它的活、它的终态交付物是 draft PR 加一份报告。受管面守卫解不开:node scripts/check-governed-queue-guard.mjs --test答 NOT GOVERNED 解除的是 A 自己那条例外要的批准,解除不了 B,因为 B 问的是谁在动手,A 问的是改了哪些文件。改了哪一行
AGENTS.md;改动行:第 326 行(改动前后都是这一行);净增 0 行(589 → 589);git diff --numstat读数1 1 AGENTS.md。两处刻意的写法,请一并复核:
路径:行号引用的约定(AGENTS.md的「相信任何『不存在』」一族与scripts/check-new-cross-file-line-citations.mjs)把跨文件行址列为禁写形态,所以落进AGENTS.md的是两句原话,行号只写在本 PR 正文里(正文不在那道门的受检总体里)。门禁读数:本分支新增跨文件行址 0 条。Claim:—— 这条的执行力就在于读到的人照做,和本仓受管面那节自己承认的情形同类。门禁(本地,全部在最终 commit
46680d1上重跑,退出码在任何管道之前捕获)node scripts/check-control-bytes.mjscheck-control-bytes: OK (scanned 8216 tracked text file(s); skipped 85 binary).node scripts/check-changeset-presence.mjsNo source or published contract of a released package changed in this range, so no changeset is owed.node scripts/check-new-cross-file-line-citations.mjsVERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0(6/6 synthetic controls PASS)node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.node scripts/check-shell-escape-residue.mjscheck-shell-escape-residue: OK (5/5 root(s) resolved -- AGENTS.md: 1 file(s), 15 fence(s); ...)node scripts/check-governed-queue-guard.mjs --test AGENTS.md⛔ GOVERNED — 1 of 1 path(s) are on a governed surface—— 这是期望值,不是失败:它就是本 PR 停在 draft、由维护者落地的依据。本地收窄,已申报并测量。 这是一个只改 markdown 的 diff。
ci.yml的Decide whether this change needs a full run步骤把:(exclude,glob)**/*.md列在排除集里(lint.yml有一个孪生步骤),所以在这样的 PR 上两条工作流都会启动、报告、并跳过每一个昂贵步骤;pnpm lint/pnpm type-check/pnpm test的受检总体里没有任何一个被本 diff 触动的文件(改动的是AGENTS.md,不是任何包的源码,changeset presence 门禁独立测到「0 个已发布包的源码或已发布契约发生变化」)。上表是本地欠的那一半,全农场归 CI。changeset:零写,按门禁读数而非标签。
check-changeset-presence.mjs自己印的判定是 nothing owed,所以既不加空 frontmatter changeset、也不碰skip-changeset标签(本仓该标签零读者)。本仓路径标签归labeler.yml,本 PR ⛔ 未写任何标签。并发与后来的落地人
本分支从
0cf2d66(= 认领时的origin/main)切出,开 PR 前重新 fetch,origin/main未动,无需 merge。触到的行只有AGENTS.md:326这一行。objectui#9563 在同一批认领里改的是AGENTS.md的 GitHub 正文改写条款(:470–:480一带),区域不同;两者落地顺序任意,后落地的那个合一次即可。认领时读过的 5 个 open PR 的文件清单里没有一个触到AGENTS.md。Acceptance notes
AGENTS.md里不存在「人类贡献者自己的 PR」这一单独情形 —— 全文的收件人是 agent(grep -n '人类贡献者|human contributor|非 agent'零命中)。所以派发词里「若 AGENTS.md 也处理人类贡献者的 PR 就保留该情形」这一条不适用;取而代之,被保留并写明的是「没有派发、没有Claim:的自发改动」这一残余情形。Generated by Claude Code