Uh oh!
There was an error while loading. Please reload this page.
docs(agents): sync the governed-surface section to the shipped guard - #6984
Conversation
`AGENTS.md`'s governed-surface section contradicted `scripts/check-governed-queue-guard.mjs` in two directions. It headed the list "本仓的受管面 —— 四项" where `GOVERNED_SURFACES` ships five, and the missing row was not merely omitted: the section ruled the opposite way, placing repo-root `skills/**` explicitly OFF the governed surface and telling a seat to take the ordinary path and self-enqueue. The `merge_group` leg refuses that diff, so the seat that followed the instruction file was the one that got caught. It also asserted this repository has no mechanical backstop at all, and closed with "a backstop tool not named in this section is a tool that does not exist" — while `.github/workflows/governed-surface-guard.yml` has been wired on both legs since objectui#6596 / maintainer ruling 2026-08-27: `pull_request` as an early warning that deliberately exits 0, `merge_group` as the leg that refuses. The doc is what was wrong here. `GOVERNED_SURFACES` and the guard are untouched. The CODEOWNERS sentence is preserved verbatim — it is still accurate: `.github/CODEOWNERS`, `CODEOWNERS` and `docs/CODEOWNERS` are all absent, enumerated from `origin/main` rather than the worktree. The rewritten backstop paragraph also states the boundary the guard's own header states, so it cannot be misread as "someone will stop me": the job is registered in `REQUIRED_CONTEXTS` in `scripts/dependabot-merge-gate.mjs`, but flipping it to a required context in the live ruleset is a maintainer-only repository setting, and until then the queue leg reports without blocking. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013hfmP9hoMd3dJwTh85J4yB
zhuangjianguo
commented
Aug 31, 2026
|
Conflict resolution, one file, one hunk: the backstop paragraph. While this branch sat in the merge queue, the maintainer landed #6976 (ba55fb5), which rewrote the same paragraph under the title "correct the stale no-mechanical-backstop claim". That paragraph is authoritative and is taken VERBATIM; this branch's competing rewrite of it is discarded in full, not blended. Byte-checked: the whole paragraph up to its trailing caveat clause is identical to origin/main (sha256 of the 1393-byte prefix matches), including the CODEOWNERS sentence, the "尚未是 required context" sentence and "在翻转之前,那条拒绝腿只报告、不阻止队列". The branch's remaining edits auto-merged and are re-derived rather than replayed: the list heading 四项 -> 五项, the new repo-root `skills/**` row (`GOVERNED_SURFACES`'s `skills-catalog`), the docs/adr row's 上面三项 -> 上面四项 (verified: exactly 4 rows precede it), the⚠️ block flipped to "both skills trees are governed" while keeping `.agents/skills/` NOT governed, and the inverted-scolding paragraph, which still taught the retired ".claude/-prefix" criterion on main and now records it as the past error. One consequential edit beyond the branch: the maintainer's own trailing caveat said the script's set and the list above "并不一致 ... 落地仍挂在 #6866 上,在它落地前 ⛔ 不要照上面那条豁免行事". This commit IS that landing, so the clause is updated minimally to record the ruling as landed and the old exemption as void. Nothing else in the paragraph is touched. The ruling being implemented is the maintainer's 5th adjudication batch item #7, Option A, recorded on #6866 comment 5469339478. No ruling is made here. Verification (offline; both scripts import only node: builtins plus scripts/invoked-as.mjs, so no install is in their closure): node scripts/check-governed-queue-guard.mjs --self-test -> exit 0, "OK check-governed-queue-guard self-test: 132 cases pass" node scripts/check-governed-queue-guard.mjs --test AGENTS.md -> exit 3, "⛔ GOVERNED — 1 of 1 path(s) are on a governed surface" Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013hfmP9hoMd3dJwTh85J4yB
os-sam
commented
Aug 31, 2026
|
Uh oh!
There was an error while loading. Please reload this page.
Fixes#6866
Re-pointed. This PR was originally pointed at card #6975 as its closer. #6975 is a duplicate of #6866: the same contradiction had already been found, already adjudicated (maintainer's 5th adjudication batch, item #7 — Option A, recorded at #6866 comment 5469339478), and its landing was already tracked on #6866. This PR implements that ruling; it does not make one. Neither card is closed by this session — the PM handles that.
AGENTS.md's governed-surface section contradictedscripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard andGOVERNED_SURFACESare untouched — the doc is what was wrong.os-zhuang's APPROVED review
5064067756is pinned tob1feb58a9, which is now the first parent of the merge commit, not the head. The head isef87b9435. Themerge_groupleg requires anGOVERNED_APPROVERSapproval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong onef87b9435before it can be re-armed.This session did not flip ready, did not enqueue, and did not arm auto-merge. The PR's non-draft state was set by another actor and was left exactly as found — reverting another actor's ready-flip is not this seat's call.
The conflict resolution — the maintainer's paragraph wins outright
While this branch sat in the queue it was dequeued by
github-merge-queue[bot]with reasonMERGE_CONFLICT(all 27 checks were green; the conflict was the only problem). In that window the maintainer landed #6976 (ba55fb501), "correct the stale no-mechanical-backstop claim", which rewrote the same paragraph this branch had rewritten.git merge origin/mainproduced exactly one conflict hunk — that paragraph. It is resolved by taking the maintainer's text verbatim and discarding this branch's competing rewrite in full. The two were not blended.Proof the maintainer's paragraph is otherwise untouched: the resolved paragraph's prefix up to its trailing caveat clause is byte-identical to
origin/main.That prefix carries, verbatim, every sentence this PR previously got wrong or weaker:
本仓仍然没有 CODEOWNERS(核实:仓内不存在该文件)⚠️ 但它**尚未**是 required context**在翻转之前,那条拒绝腿只报告、不阻止队列**The corrected claim about the guard, in the maintainer's landed wording rather than this PR's original: the guard is live, but it reports and does not block.
pull_requestis an early warning that deliberately exits 0 (so green does not mean ungoverned);merge_groupis the refusing leg, requiring aGOVERNED_APPROVERS(os-zhuang/hotlong) APPROVED review pinned to the current head — but it is not yet a required context, the ruleset switch is maintainer-only (#6596,pm:awaiting-maintainer), and until it is flipped that refusing leg only reports; it does not stop the queue.What this PR still changes — re-derived against the maintainer's new text, not replayed
1. The count —
origin/mainstill heads the list四项whileGOVERNED_SURFACESships five.**本仓的受管面 —— 四项,已逐条对本仓实际目录核实:****本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**plus the missing row, in the guard's own vocabulary:
- `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede
docs/adr/**, andGOVERNED_SURFACEShas 5 entries (adr,claude-tree,skills-catalog,agents-md,claude-md).2. The ruling on repo-root
skills/**— the section did not merely omit it, it ruled the opposite way and told a seat to self-enqueue on green.- `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。- `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **同样受管**,就是 `GOVERNED_SURFACES` 里的 `skills-catalog` 一项:只改 `skills/**` 的 PR 也**停在 draft 等人类合并**,⛔ 不翻 ready、不入队。The
.agents/skills/sentence is kept — that install location is genuinely not governed, and the guard agrees (noGOVERNED_SURFACESprefix matches it).The⚠️ heading above it flips with the row:
⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**3. The inverted-scolding paragraph — still present on
origin/mainand still teaching the retired criterion, so it is still in scope. It previously taught that the only test is the.claude/prefix and scolded a seat for being too conservative withskills/:两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以.claude/开头**。曾有 agent 把发布用的skills/当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……GOVERNED_SURFACESis the authority).4. The consequential
docs/adr/**row — verified after the insertion rather than trusted:它和上面三项同级它和上面四项同级— exactly 4 rows now precede it.5. The maintainer's own trailing caveat, which this PR makes stale in turn. The landed paragraph closes by saying the guard's set and the list above are inconsistent and that the ruling's landing is still pending on #6866, with
⛔ 在它落地前不要照上面那条豁免行事. This PR is that landing, so exactly that clause is updated — minimally, nothing else in the paragraph touched:⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布skills/**受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的GOVERNED_SURFACES一致,曾经那条「仓根skills/不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。The
尚未是 required contextsentence and the只报告、不阻止队列sentence in the same paragraph are not touched — they are still true.⛔ The CODEOWNERS sentence is intact, and re-verified
本仓仍然没有 CODEOWNERS(核实:仓内不存在该文件)survives verbatim inside the maintainer's paragraph, and it is still accurate — re-measured on the merged head rather than inherited. Enumeration and read taken from the same ref, per this repo's own rule about mixing worktree enumeration withorigin/mainreads:.github/CODEOWNERS,CODEOWNERS,docs/CODEOWNERS— all absent.This PR is itself governed
The card's thesis, still demonstrated on this PR's own post-merge diff:
exit 3.
Verification
Union re-run after the final commit, at
ef87b9435. Every exit code captured by redirect before any pipe.check-governed-queue-guard.mjs --self-testOK check-governed-queue-guard self-test: 132 cases pass (…)check-governed-queue-guard.mjs --test AGENTS.md⛔ GOVERNED — 1 of 1 path(s) are on a governed surfacecheck-changeset-presence.mjs✅ No source of a released package changed in this range, so no changeset is owed.check-control-bytes.mjs✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).check-skills-paths.mjs✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).check-doc-links.mjsLinks are valid across 17 scan roots.git diff origin/main --staton the merged head reportsAGENTS.md | 13 +++++++------, one file — the merge dragged in nothing else.eslint has no jurisdiction over this diff, stated as a measurement rather than a skip: all six
files:blocks ineslint.config.js(lines 28, 176, 196, 218, 232, 262) target only.ts/.tsxglobs, the config contains zero.mdglobs, and this diff is exactly one repo-root.mdfile. The intersection of the linted population with this diff is empty; and since no.ts/.tsxfile is touched, the diff cannot move any verdict on any untouched file.Not addressed here
skills/**as NOT governed and asserts no mechanical backstop exists #6975 — a duplicate of [finding] AGENTS.md's governed-surface section disagrees with the fleet on root skills/** — and its "this repo has NO mechanical backstop" paragraph is now false, the guard workflow it promised to mention is live #6866, recorded above; not touched by this change and left open for the PM.Governed Surface Queue Guarda required context (Machine-enforce human review on governed-surface paths — so the no-bypass rule stops resting on seat discipline alone #6596) is a maintainer-only repository setting and is out of scope here; the doc states the boundary rather than eliding it.Generated by Claude Code