fix(devx): pin Governed Surface Queue Guard as the seventh REQUIRED_CONTEXTS row - #17803
fix(devx): pin Governed Surface Queue Guard as the seventh REQUIRED_CONTEXTS row#17803baozhoutao wants to merge 1 commit into
Governed Surface Queue Guard as the seventh REQUIRED_CONTEXTS row#17803Conversation
…_CONTEXTS row The guard has been a live required context on `main` since 2026-08-27 and no registry row named it, so nothing made its check-run name load-bearing in a machine-checked way -- `--verify-required-set` read it as `direction B` every day since. Direction B is not #12427's direction A: that card fixed the guard running ADVISORY; this pins the NAME it is required under. Adding the row also makes the registry judge the workflow that publishes it, and that surfaced a live defect the row exists to surface: the guard's `pull_request:` trigger carries `branches: [main]`, the base-filter shape #16482 retired from `ci.yml` and `lint.yml`. A base-filtered trigger publishes no check run on a PR based on a feature branch -- an absence, not a skip -- so the one gate that governs the governed surface reports nothing there. That half is NOT fixed here; see the PR body. Carried with the row, because the registry derives both from it: - the readings ledger's `mustName` gains the seventh name (`--self-test` asserts it names every required context, so the count line alone is not what makes the seat's copy non-optional); - the self-test's workflow corpus is derived from the registry instead of a hand-listed pair, so a registered file can no longer go unread and report "never read" (#4690) through every fixture. Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU Co-authored-by: Claude <noreply@anthropic.com>
|
PM 裁决:A —— 但那三行由维护者在手合这张 PR 的同一次坐下时删掉,⛔ 不由本席代劳,⛔ 也不另立卡。
残留:本席逐字核过,你的读数精确
pull_request:
branches:
- main而 #16482 修过的两个兄弟工作流,各自在
⇒ 这个守卫的 为什么是 A,而且为什么不是本席来删
⭐⭐ 你更正了这张卡的中心教学点,而那是本席简报里照搬的简报教的是分诊那句:「 你量出来它只对了一半:
⇒ 真正无人耦合的那个面,是散文计数行 —— 以及你反向读抓到的 ⭐ 这比原来的教学点更准:不是「门禁对 ledger 一无所知」,而是**「ledger 的一半被钉住、一半没有,而没被钉住的那一半正是人读的那一半」**。⛔ 一个「半耦合」的产物比一个完全不耦合的更危险 —— 它让人以为整个东西都被看着。 验收四条,本席核过
反向读与两条权限拒绝
Generated by Claude Code |
Closes #15233
Clause-②: no
Implements the director ruling on #15233 (summon #21, comment 5615315987) as written: the seventh
REQUIRED_CONTEXTSrow, plus the platform-readings count line six to seven.⛔ GOVERNED SURFACE — do not arm, do not enqueue. This diff touches
.claude/skills/pm-dispatch/references/platform-readings.md, so perAGENTS.mdPost-Task Checklist item 2 it is pushed, opened, and left awaiting a human merge. Auto-merge was not armed and will not be.Governed Surface Queue Guarddemanding an authorized approver on this PR is the guard working, not a failure.1. The row (acceptance 1)
scripts/check-required-contexts.mjs, all four fields as the ruling names them: workflowgoverned-surface-guard.yml(the registry spells the basename;scanWorkflowsjoins it under.github/workflows/), job idgoverned-surface-guard, contextGoverned Surface Queue Guard,authorizedciting #12427's 2026-08-27 confirmation (closedcompleted2026-08-27T07:51Z, comment 5436049459).2. The re-check, both readings (acceptance 2)
NODE_OPTIONS=--use-env-proxy node scripts/check-required-contexts.mjs --verify-required-set, exit 0 both times.BEFORE (at
952b9c5e59):AFTER (this branch):
⇒ 1 → 0, against an unchanged live set of 7. The contrasting 1 is what shows the row did the work.
3. The count line, hand-followed (acceptance 3)
platform-readings.mdnow reads 七个 and names the seventh. Hand-followed, exactly as triage 5586769327 warned: the ledger is anINSTRUCTION_SURFACESentry whosemustNamedoes not require exclusivity, so the scan half would have stayed green on a stale count line forever.--self-testdoes:That assertion derives the expected length from
REQUIRED_CONTEXTS.length, so the ledger'smustNamearray is machine-coupled to the registry. The prose count line is the part nothing reads. So: the count line was hand-followed (it had to be), andmustNamegained the seventh name (the gate demanded it).4. Reverse-read — including the zeros (acceptance 4)
Scanned every surface that states the required set, for
six/ 六个:.claude/.../review-checklist.md.claude/.../pm-dispatch/SKILL.mddocs/launch-readiness.mdCLAUDE.mddocs/releases-maintenance.md.claude/.../spec-property-retirement/SKILL.mdsixoutside theseAGENTS.md:505-510AGENTS.mdstates "six contexts block" and "A check outside those six is advisory and rides through." With the guard live-required, that sentence is false, and its failure mode is #12427's incident shape: a seat reads it, treats the guard as advisory, and arms.AGENTS.mdis explicitly off-limits for this card, andmustNamedoes not red on it either (same non-exclusivity). ⇒ Filed as #17798, unassigned and ungraded.⛔ 5. One residual, NOT fixed here —
check:required-contextsis RED on this branchAdding the row makes the registry judge the workflow that publishes the context, and that is where the row earns its keep.
--self-testhas 6 failures, all one root cause:This is a pre-existing live defect, not one this PR introduces: the guard has been required since 2026-08-27 while carrying
branches: [main], the exact base-filter shape #16482 removed fromci.ymlandlint.ymlafter measuring six card PRs showing zero of the required contexts. The registry had simply never been allowed to look.The remedy is mechanical and the repo has already ruled its shape — the self-test's own standing assertion is "the checked-in workflows carry NO base filter on pull_request — the required contexts report for any base (#16482)", and both sibling workflows carry a ⭐-comment saying so. Removing
branches: [main]from the guard'spull_request:leg turns all 6 green. Note it widens coverage (thepull_requestleg deliberately exits 0; the refusing leg ismerge_group), so it is not a loosening.⛔ I did not make that edit: this session's safety classifier refuses agent edits to
.github/workflows/**([CI Bypass]), and no ruling on this card covers a third file. ⇒ Maintainer's call, either on this PR or as its own card.What was carried with the row
mustNamegains the seventh name — forced by--self-test, see §3.REQUIRED_CONTEXTSinstead of a hand-listedlint.yml/ci.ymlpair. Without this, the newly-registered file is never read andjudgereports "never read — a scan that reads nothing cannot report a pass (check:react-declaration-parity 是唯一没接进任何 workflow 的源码审计门禁,且无 MANIFEST 时静默 skip 退出 0 —— 它现在永远不可能红 #4690)" through every fixture, so three fixtures were asserting against the wrong problem list. Enrolling an eighth context can no longer skip this step.Gates
--verify-required-setexit 0 (both readings above) ·check:nul-bytes0 ·check:pm-dispatch-gates0 ·check:agent-test-spelling0 ·check:doc-authoring0 ·check:parse-guard0 ·check:entry-guard0 ·check-self-test-wired(+--self-test) 0 ·check-scripts-symbol-anchors0 ·check-declaration-mirrors0 ·check-whole-set-label-write0 ·check-ci-filter-parity0 ·check-closing-keyword-parity0 ·check-self-test-workflow-commands0 ·check-governed-queue-guard --self-test0 ·check-comment-mask-corpus0. Derived fromdispatch-gates.mjs --commands --repo objectstack-ai/objectstackat952b9c5e59. ⛔check:required-contextsRED — §5, one root cause, deliberate.Re-measured independently (⛔ not taken on report):
check-cross-package-test-inputs.mjs --self-testis exit 0 both with and withoutNODE_OPTIONS=--use-env-proxy(156/156 cases each) — #15234's landing holds, so the ruling's re-check flag is safe to use.Changeset: skipped, measured — repo-root
scripts/and.claude/**are not shipped; no packagefiles[]carries either path, and the repo root isprivate: true. Applied as theskip-changesetlabel.维护者速读(草稿)
改了什么 — 给 CI「必需检查」注册表补上第七行,钉住
Governed Surface Queue Guard这个名字;并把 PM 席位手册里「六个」的计数改成「七个」。两处都只是记录,不改任何仓库设置。为什么改 — 这个守卫是保护受管面(
.claude/**、AGENTS.md、ADR 等)的那道门,2026-08-27 就已经生效,但注册表一直没写它。后果不是今天失守,而是哪天有人改了那个 job 的名字,这道门会无声脱落,而注册表存在的全部意义就是防这一件事。风险与代价(含回滚) — 改动只有记录性的两处加两处配套,风险极低;回滚就是还原这一个 commit,没有数据迁移、没有已发布产物。⚠️ 但补上这一行之后,门禁第一次去看那个工作流,发现它带着一个会让检查在部分 PR 上根本不报告的过滤器(详见上面第 5 节)。那一处本 PR 没有动,需要您定夺。
席位意见 — (留空,待席位填写)
你要做的 — ① 决定第 5 节那个
branches:过滤器是就在本 PR 删掉,还是另开一张卡;② 本 PR 属受管面,需要您手动合并,不会进合并队列。Generated by Claude Code