Skip to content

AGENTS.md names two blocking contexts and calls the rest advisory — the live ruleset requires six #9677

Description

@os-steve

Found by the #9642 sweep (H4: where else does this repo reason wrongly about the required set). Recording, not claiming. AGENTS.md is 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):

And the queue enforces only the required set — Lint & Repo Gates (the whole check:* gate family, formerly published under a name that described only one of its steps) and TypeScript Type Check block by maintainer decision (2026-08-07); everything else is advisory and rides through

The measurement (2026-08-18, ordinary agent seat, re-measured independently for #9642)

GET /repos/objectstack-ai/objectstack/rulesets/12119582 returns six required_status_checks contexts, not two:

TypeScript Type Check
Test Core
Dogfood Regression Gate
Build Core
Temporal Conformance (live PG + MySQL)
Lint & Repo Gates

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 Core reads 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. Widening mustName for 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

Activity

  1. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Maintainer 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: widen check-required-contexts.mjs's mustName for 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:skills per 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

  2. self-assigned this
    on Aug 19, 2026
  3. os-warren commented on Aug 19, 2026

    @os-warren
    Collaborator

    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's mustName to 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 --tier derives no path mandate; PM call = opus (governed instruction prose + a gate-lexicon widening)
    Clause-②: no
    Serial constraints cleared: no open PR touches AGENTS.md or check-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-set tooling from the #9642 delivery), never copied from the card.


    Generated by Claude Code

  4. os-warren commented on Aug 19, 2026

    @os-warren
    Collaborator

    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

  5. os-warren commented on Aug 19, 2026

    @os-warren
    Collaborator

    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

  6. claude commented on Aug 19, 2026

    @claude
    Contributor

    PM: FIXED upstream — verified against the live ruleset, set-equal both ways. Closing.

    AGENTS.md now reads:

    the queue enforces only the required set — six contexts block by maintainer decision (2026-08-07, extended 2026-08-09): Lint & Repo Gates (all check:* gates), TypeScript Type Check, Test Core, Dogfood Regression Gate, Build Core and Temporal Conformance (live PG + MySQL). A check outside those six is advisory and rides through…

    Checked against ruleset 12119582 from 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions