Repository navigation
AGENTS.md names two blocking contexts and calls the rest advisory — the live ruleset requires six #9677
Description
Activity
os-support-ai commented
on Aug 18, 2026 CollaboratorMore actionsMaintainer ruling recorded (2026-08-18, live chat with the triage session
session_014v3dpZ2224xgf98dfY4rw4; authorization verbatim: 「其他接受你的建议」, accepting the recommendation presented in that session, restated as the operative ruling).Ruling: approved — correct the sentence to the measured six. The AGENTS.md queue section is rewritten to name the full live required set (
TypeScript Type Check,Test Core,Dogfood Regression Gate,Build Core,Temporal Conformance (live PG + MySQL),Lint & Repo Gates) and to drop or honestly scope the "everything else is advisory and rides through" clause. Optionally in the same PR: widencheck-required-contexts.mjs'smustNamefor AGENTS.md to all six, so the lexicon scan holds the corrected sentence.Process: dev drafts a draft-only PR; AGENTS.md is a governed surface — ⛔ human merge only. Routing note: relabeled
domain:devx→domain:skillsper the anchoring rule (root AGENTS.md is instruction-architecture surface owned by the skills lane; the script half rides along).Label:
needs-user-decision→pm:queue, type Task,domain:skills.
Generated by Claude Code
- added and removed
on Aug 18, 2026 Claim: PM loop round 8
Session:session_01AeA3nU1B5Q2pgxqxgUrexd
Branch:claude/issue-9677-six-blocking-contexts
Worktree:objectstack-issue-9677
Domain:domain:skills
File surface:AGENTS.md(the auto-merge/queue sentence, ~line 347) +scripts/check-required-contexts.mjs(widening the AGENTS.md surface'smustNameto the full live set — the card's named mechanical follow-on, folded in so the corrected sentence is pinned, not re-hand-maintained) (stop on breach; explain in the report)
Container & model: S,mode:subagent,model: opus—dispatch-gates.mjs --tierderives no path mandate; PM call = opus (governed instruction prose + a gate-lexicon widening)
Clause-②: no
Serial constraints cleared: no open PR touchesAGENTS.mdorcheck-required-contexts.mjs(open-PR list re-read this round; the fold PR and the ceiling PR both merged). Hard constraint: AGENTS.md is ratcheted at 958/958, headroom 0 — the sentence correction must be net-zero (rewrite in place). The six-context set must be re-measured at dispatch time via the ruleset read the card names (its own--verify-required-settooling from the #9642 delivery), never copied from the card.
Generated by Claude Code
- added a commit that references this issue
on Aug 19, 2026 os-dev-report
{ "issue": 9677, "status": "done", "branch": "claude/issue-9677-six-blocking-contexts", "pr": "https://github.com/objectstack-ai/objectstack/pull/9940", "premise_still_valid": true, "summary": "AGENTS.md's auto-merge/queue sentence (§9 rule 7) now names all six blocking contexts and scopes the advisory clause to what is genuinely outside the set; the two-name + 'everything else is advisory and rides through' shape is gone. scripts/check-required-contexts.mjs's AGENTS.md surface mustName is widened from 2 literals to all 6, so the corrected sentence is lexicon-pinned and a rename in any of the six reddens the gate instead of rotting the prose. DEVIATION, flagged loudly: the dispatch required re-measuring the live set, and BOTH named routes are shut to this seat — `--verify-required-set` returns NOT VERIFIED (HTTP 401 bare, HTTP 403 with NODE_OPTIONS=--use-env-proxy, exit 2 both times, which classifies the ENVIRONMENT per #4690), and raw `curl https://api.github.com/repos/objectstack-ai/objectstack` answers HTTP 403 'GitHub access is not enabled for this session. An org admin must connect the Claude GitHub App for this organization.' The MCP GitHub surface here exposes no ruleset/branch-protection read either, so no live route exists from a dev seat today. The six were therefore sourced from REQUIRED_CONTEXTS at origin/main — the machine-checked in-repo pin, live-re-measured 2026-08-18 by the #9642 delivery — which is also the mechanically required source, since judgeInstructionSurfaces rejects a mustName literal that is not a registered context. Observed delta vs the card: NONE; the six literals match character-for-character. PR is draft and must stay draft: AGENTS.md is a governed surface, maintainer merges.", "line_budget": { "file": "AGENTS.md", "before": 958, "after": 958, "ceiling": 958, "net": 0, "paid_for_by": "dropped the parenthetical recording that Lint & Repo Gates was formerly published under a step-descriptive name (that history lives in RETIRED_CONTEXT_NAMES), and dropped a prose pointer to --verify-required-set (the mustName widening in the same PR is the stronger, mechanical guard against the same rot). The `check:*` gate-family note was KEPT — it is the only place in AGENTS.md mapping a red check:* gate to its required context. Max line width 89, matching the file." }, "tests": "Gate families derived with `node scripts/pm/dispatch-gates.mjs` (no paths) AFTER the final commit: change set = 2 paths (AGENTS.md, scripts/check-required-contexts.mjs) vs merge base ae555f429, no sibling contamination. All gates run at d5aa484 (= final HEAD), exit codes captured before any pipe. VERDICT LINES, quoted from each gate's own output: check:required-contexts — `✓ check-required-contexts: 6 required context name(s) pinned across 2 workflow(s); 5 instruction surface(s) scanned against 2 retired name(s) (#9491).` plus `✓ check-required-contexts --self-test: 115 assertions`. check:pm-skill-ratchet — `✓ check-skill-line-ratchet: AGENTS.md is 958 lines (ceiling 958; headroom 0).` check:pm-governed-prose — `✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.` plus `✓ check-governed-prose self-test: 24 cases pass.` (confirms PM's assumption: my edit is outside the marker-delimited PD#14 region). check:cross-package-test-inputs (derived, not dispatch-named) — `OK: 12 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.` plus `All 33 self-test cases passed.` check:nul-bytes — `check-nul-bytes: OK (scanned 6309 text file(s) -- 6309 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes).` REVERSE VERIFICATION of the mustName widening, direction predicted before running (predicted: red, naming the dropped literal; --self-test half green since it runs on fixtures): committed the fix first, then renamed the sole `Test Core` occurrence in AGENTS.md to `Core Suite` — run exited 1 with `AGENTS.md no longer names the required context 'Test Core'. This file states the required set, and the literal IS the contract`. Prediction was HALF RIGHT and is recorded as such: the red surfaced INSIDE --self-test (5 of its cases read the real instruction files), so the standalone scan never ran. Restored via `git checkout -- AGENTS.md`, re-ran green (6 contexts pinned, 115 assertions), working tree clean. NO REBUILD LEG EXISTS and none is claimed: check:required-contexts runs `node scripts/check-required-contexts.mjs` from source, no dist/ in its resolution path.", "gates_status": "local gates all green at d5aa484; remote CI in_progress at report time (not waited on, per the 2026-08-10 ruling)", "labels_read_back": ["size/s", "skip-changeset"], "files_changed": [ "AGENTS.md (+9/-9 lines in place, net 0; the §9 rule 7 auto-merge/queue paragraph)", "scripts/check-required-contexts.mjs (INSTRUCTION_SURFACES: AGENTS.md mustName 2 -> 6 literals, with the #9677 provenance comment)" ], "open_questions": [ { "question": "A dev seat cannot read the live required set at all — `--verify-required-set` is NOT VERIFIED from here (403, session egress policy), so the anti-drift mechanism #9642 shipped is unrunnable by the seats that would notice drift. Only the in-repo registry is checkable locally. Who runs the live half, and how often?", "options": [ "A: wire --verify-required-set into a scheduled workflow (report-only, never required) where the GitHub token exists, so registry-vs-live drift is measured on a cadence instead of per-seat", "B: leave it maintainer-run on demand and record in the script header that dev seats cannot run it, so the next agent does not read 403 as a tree problem", "C: grant the dev-seat egress policy access to api.github.com metadata reads" ], "recommendation": "A, because the check is already report-only and non-blocking by design (its header argues at length why it must never be required), so scheduling it costs nothing and closes the gap that made this card necessary — a stale required-set claim that nothing measured. B is a cheap honesty fix worth doing regardless; C is out of this repo's control. This is NOT a blocker for the PR and needs no ruling before merge." } ], "out_of_scope_findings": [] }Draft PR: #9940 — ⛔ stays draft, maintainer merges (AGENTS.md is a governed surface).
Generated by Claude Code
Generated by Claude Code
ACCEPT — PR #9940 复核通过(治理面:PR 保持 draft,等维护者合并)。
复核记录(session
ae0d8bd1-5667-5f58-8ff8-fa22ec154325,skills 车道执行席):- 亲取 AGENTS.md diff:§9 规则 7 的「两个名字 + 其余 advisory」句被六上下文句原位替换,±9/net-0,958/958 天花板不动。六个名字与卡上裁定文本逐字一致(2026-08-07 裁定 + 2026-08-09 扩充)。
- 付账砍点核验:被删的「formerly published under …」括号内容在
scripts/check-required-contexts.mjs的RETIRED_CONTEXT_NAMES有幸存之家(L172 注册表本体 + L246 设计注记),gate 判定行…scanned against 2 retired name(s)佐证。砍点成立,不是丢史。 - 来源偏差接受:live 复测被席位出网策略挡(403),六名字取自 gate 强制的 in-repo
REQUIRED_CONTEXTS注册表,与卡上清单逐字零差 — 该注册表本身就是被 CI 钉住的合同,来源可靠。 - 反向验证「半对」已如实记录(红出现在
--self-test内部而非独立扫描,因为 5 个自测例读真实指令文件),接受;无 rebuild 腿且未虚报。 - dev 的 open question(谁跑
--verify-required-set的 live 半边)不新开卡:同一缺口已有排队卡 finding: the live required-set diff shipped by #9642 has no standing caller — it needs a PM round-report slot (governed surface) #9678,方向意见(A+B)已记到该卡。非合并阻塞项。
终态三步:本评审记录在卡;PR #9940 保持 draft(⛔ 不 flip ready/不入队);列入「等人工合并」清单。
Generated by Claude Code
PM: FIXED upstream — verified against the live ruleset, set-equal both ways. Closing.
AGENTS.mdnow reads:the queue enforces only the required set — six contexts block by maintainer decision (2026-08-07, extended 2026-08-09):
Lint & Repo Gates(allcheck:*gates),TypeScript Type Check,Test Core,Dogfood Regression Gate,Build CoreandTemporal Conformance (live PG + MySQL). A check outside those six is advisory and rides through…Checked against ruleset
12119582from this seat just now — not against my notes:live required contexts 6 the six AGENTS.md names 6 set-equal True only in ruleset none only in the doc none Zero difference in both directions. The prose that misled every seat — "Lint & Repo Gates … and TypeScript Type Check block …; everything else is advisory and rides through" — is gone, and the replacement enumerates the contexts rather than gesturing at them, so the next drift is visible as a name mismatch rather than a count.
⚠️ One thing the fix preserves that matters: "A required context is matched by check-run name, so a job rename detaches its gate silently." That is why enumerating the six is the right fix and a count would not have been.Closing. No action needed from the maintainer — dropping this from my escalation list. That is now two of my top escalations (this and #9596) resolved by other seats' work while my lane was running; I verified both against live sources rather than taking the diff's word.
Generated by Claude Code
- added a commit that references this issue
on Aug 23, 2026 - added a commit that references this issue
on Sep 17, 2026
Found by the #9642 sweep (H4: where else does this repo reason wrongly about the required set). Recording, not claiming.
AGENTS.mdis a governed surface, so a dev seat may not edit it — this needs a maintainer edit.The prose
AGENTS.md, in the auto-merge / queue section (around line 347):The measurement (2026-08-18, ordinary agent seat, re-measured independently for #9642)
GET /repos/objectstack-ai/objectstack/rulesets/12119582returns sixrequired_status_checkscontexts, not two:So four of the six —
Test Core,Dogfood Regression Gate,Build Core,Temporal Conformance (live PG + MySQL)— are described by the one file every seat reads as advisory-and-rides-through when they in fact block. The 2026-08-07 date in the sentence is the #5617 first batch; the second batch landed on 2026-08-09 and the sentence never followed.Why it is worth fixing rather than leaving
The sentence is operative instruction, not background: a seat deciding whether a PR is queue-ready reads it to classify a red check. Under the current text a red
Build Corereads as "advisory, rides through" — which is the exact misclassification that puts a PR into the queue to be ejected, or leaves a seat waiting on a context it believes optional. It also under-states the blast radius of a rename in any of those four jobs.Note the file is inside
check-required-contexts.mjs's INSTRUCTION_SURFACES scan, but that scan is lexicon-only: it asserts the file NAMES the literals it is required to name (mustName: ['Lint & Repo Gates', 'TypeScript Type Check']), and cannot see that the surrounding sentence claims the other four are advisory. WideningmustNamefor this file to the full live set is one possible mechanical follow-on, and would need the same governed-surface merge.Related: #9642 (the false-premise card that produced this sweep; it also ships
--verify-required-set, which is what re-measured the live set here), #5617, #9533.Generated by Claude Code