Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); docs(agents): sync the governed-surface section to the shipped guard by os-sam · Pull Request #6984 · objectstack-ai/objectui · GitHub
Skip to content

docs(agents): sync the governed-surface section to the shipped guard - #6984

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync
Aug 31, 2026
Merged

docs(agents): sync the governed-surface section to the shipped guard#6984
os-zhuang merged 2 commits into
mainfrom
claude/issue-6975-agents-md-governed-surface-sync

Conversation

@os-sam

@os-samos-sam commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

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 #7Option 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 contradicted scripts/check-governed-queue-guard.mjs. This syncs the doc to the shipped mechanism. The guard and GOVERNED_SURFACES are untouched — the doc is what was wrong.

⚠️ The approval on this PR is void — re-approval is required on the new head

os-zhuang's APPROVED review 5064067756 is pinned to b1feb58a9, which is now the first parent of the merge commit, not the head. The head is ef87b9435. The merge_group leg requires an GOVERNED_APPROVERS approval pinned to the current head, so this PR needs a fresh approval from os-zhuang or hotlong on ef87b9435 before 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 reason MERGE_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/main produced 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.

prefix bytes origin/main = 1393 resolved = 1393
prefix sha256 origin/main = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
prefix sha256 resolved = 073a085971c5b6d78e537d9d6edac876d4e9a5b6295d75b5197538a43db795ef
PREFIX BYTE-IDENTICAL: True

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_request is an early warning that deliberately exits 0 (so green does not mean ungoverned); merge_group is the refusing leg, requiring a GOVERNED_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 countorigin/main still heads the list 四项 while GOVERNED_SURFACES ships five.

  • before: **本仓的受管面 —— 四项,已逐条对本仓实际目录核实:**
  • after: **本仓的受管面 —— 五项,已逐条对本仓实际目录核实:**

plus the missing row, in the guard's own vocabulary:

  • after: - `skills/**` —— 仓根**发布给使用者**的那棵 skills 树(如 `skills/objectui/`),guard 里的 `skills-catalog` 一项 —— 见下方 ⚠️,这一项本段曾经写反。

Counted mechanically, not assumed: the list now has 5 rows and 4 rows precede docs/adr/**, and GOVERNED_SURFACES has 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.

  • before: - `skills/**`(仓根,发布给使用者的那棵,如 `skills/objectui/`)—— **不在受管面上**,按普通代码 PR 走:CI 全绿就照上面的常规路径自行入队合并。
  • after: - `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 (no GOVERNED_SURFACES prefix matches it).

The ⚠️ heading above it flips with the row:

  • before: ⚠️ **别把两棵 skills 树弄混 —— 这是本仓最容易踩的一条:**
  • after: ⚠️ **两棵 skills 树都受管 —— 别把它们和 skill 的安装位置弄混:**

3. The inverted-scolding paragraph — still present on origin/main and 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 with skills/:

  • before: 两棵树名字像、内容都叫 skill,判据却只有一个:**路径是不是以 .claude/开头**。曾有 agent 把发布用的skills/ 当成「维护者专属」而不敢挂 auto-merge,PR 白等一轮 —— **往保守方向误判同样是误判**……
  • after: records that criterion as the past error, notes it was wrong in the direction that gets mechanically refused, and hands the reader the offline command that answers the question (GOVERNED_SURFACES is the authority).

4. The consequential docs/adr/** row — verified after the insertion rather than trusted:

  • before: 它和上面三项同级
  • after: 它和上面四项同级 — 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:

  • before: ⚠️ 该清单与上面四项**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/ **受管**,守卫的读法才是裁定的那个;落地仍挂在 #6866 上,**在它落地前 ⛔ 不要照上面那条豁免行事**。
  • after: ⚠️ 该清单曾与上面的受管面清单**并不一致**(脚本的集合含已发布 skills/),这一分歧**已裁**:维护者第 5 场决裁批 #7 采 **Option A**(#6866 评论 5469339478)—— 已发布 skills/**受管**,守卫的读法才是裁定的那个;该裁决**已随本段上方的清单落地**(#6866):上面五项已含skills/,与脚本的 GOVERNED_SURFACES一致,曾经那条「仓根skills/ 不受管、自行入队」的豁免**已作废**,⛔ 别再照它行事。

The 尚未是 required context sentence 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 with origin/main reads:

$ git ls-tree -r --name-only origin/main | grep -i codeowners
(no output, exit 1; 5893 paths enumerated)

.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:

$ node scripts/check-governed-queue-guard.mjs --test AGENTS.md
⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
- AGENTS.md
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 authorized approval
(GOVERNED_APPROVERS: os-zhuang, hotlong) is pinned to the pull request's current head.

exit 3.

Verification

Union re-run after the final commit, at ef87b9435. Every exit code captured by redirect before any pipe.

gateexitverdict line
check-governed-queue-guard.mjs --self-test0OK check-governed-queue-guard self-test: 132 cases pass (…)
check-governed-queue-guard.mjs --test AGENTS.md3⛔ GOVERNED — 1 of 1 path(s) are on a governed surface
check-changeset-presence.mjs0✅ No source of a released package changed in this range, so no changeset is owed.
check-control-bytes.mjs0✅ check-control-bytes: OK (scanned 5808 tracked text file(s); skipped 85 binary).
check-skills-paths.mjs0✅ check-skills-paths: OK (95/96 stated path(s) resolve across 18 guide file(s); 1 baselined).
check-doc-links.mjs0Links are valid across 17 scan roots.

git diff origin/main --stat on the merged head reports AGENTS.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 in eslint.config.js (lines 28, 176, 196, 218, 232, 262) target only .ts/.tsx globs, the config contains zero.md globs, and this diff is exactly one repo-root .md file. The intersection of the linted population with this diff is empty; and since no .ts/.tsx file is touched, the diff cannot move any verdict on any untouched file.

Not addressed here

Generated by Claude Code

`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
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 07:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 31, 2026
@zhuangjianguoClaude

Copy link
Copy Markdown
Collaborator

⚠️ This PR is not a draft, and its diff is on a governed surface

Reporting only — ⛔ I have not touched this PR's state. domain:devx @ objectui seat, PM session session_01GgDDqh6YnkXqsnVTCa7wHk. This repo's rule is explicit that a state I did not set belongs to another actor: "⚠️ 只回收你自己挂上的 … 去问、去报告,别替他回退。" So this is the asking.

Observed:draft: false as of 2026-08-31T07:5xZ, diff = AGENTS.md (+7/−6).

Asked the tool rather than inferringnode scripts/check-governed-queue-guard.mjs --test AGENTS.md on origin/main:

⛔ GOVERNED — 1 of 1 path(s) are on a governed surface:
AGENTS.md x1 — the repo-root agent instruction file
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.

⭐ Noting the awkward part plainly: this PR's own diff is the paragraph that says so. It rewrites that section to record that skills/** is governed too and that the queue guard now exists — while sitting in the one state the paragraph forbids.

Why this is worth a comment rather than a shrug

The prose this PR adds is also the reason the ready state is not self-correcting:

但把它翻成 live ruleset 里的 required check 是只有维护者能改的仓库设置 —— 在那之前,队列腿只是报告,不会真的挡下队列

⇒ By this PR's own account the merge_group leg reports but does not yet block. So a ready governed PR here is not caught by anything — the draft state is the control, and it is currently off.

Requested, by whoever owns this PR (⛔ not me)

Convert back to draft, and if auto-merge was ever armed, disable_pr_auto_mergeas well — the PR's own text records that disabling auto-merge alone does not cancel queue membership, so both actions are needed.

⛔ No comment on the content of the change, which is not this seat's to review.


Generated by Claude Code

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-samClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ Re-approval required on the new head

The MERGE_CONFLICT dequeue is resolved. origin/main was merged in (merge commit, no rebase, no amend, no force-push); the head moved b1feb58a9ef87b9435.

That voids the existing approval. Review 5064067756 (os-zhuang, APPROVED) is pinned to b1feb58a9, which is now the merge commit's first parent, not the head. Governed Surface Queue Guard's merge_group leg requires a GOVERNED_APPROVERS approval pinned to the current head, so it would refuse this diff as it stands — reporting only, since the job is not yet a required context.

This PR must not be re-armed until os-zhuang or hotlong approves ef87b9435. This session did not flip ready, did not enqueue, and did not arm auto-merge; the PR's existing non-draft state was set by another actor and was left exactly as found.

What the resolution did

The maintainer's #6976 (ba55fb501) rewrote the same paragraph while this branch sat in the queue. The maintainer's text wins outright — this branch's competing rewrite of that paragraph is discarded in full, not blended. The paragraph's prefix up to its trailing caveat clause is byte-identical to origin/main (sha256 073a0859… on both sides, 1393 bytes), so the CODEOWNERS sentence, the 尚未是 required context sentence and 在翻转之前,那条拒绝腿只报告、不阻止队列 all survive verbatim.

Only the two sites the maintainer deliberately left stale are changed (四项五项, repo-root skills/** moved onto the governed surface with its docs/adr/** consequential row), plus the inverted-scolding paragraph, plus a minimal update to the maintainer's own trailing caveat — which said the ruling's landing was still pending on #6866, and this PR is that landing.

The PR body is also re-pointed: it now reads Fixes #6866 rather than #6975, which is a duplicate of #6866. Neither card is closed here.

git diff origin/main --stat on the merged head: AGENTS.md, one file. Full verification table is in the PR body.

Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 836e979Aug 31, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-6975-agents-md-governed-surface-sync branch August 31, 2026 14:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentation

Projects

None yet

4 participants

@os-sam@zhuangjianguo@os-zhuang@claude