Skip to content

[finding] the Governed Surface Queue Guard's refusal text tells a seat to dequeue a governed PR by converting it to DRAFT — measured not to dequeue in this repo (same family as #20847) #20855

Closed

Description

@objectstack-fleet

Filing gate: ① a printed remedy measured false, with named landing sites.

reach: the guard is the required context Governed Surface Queue Guard, and it prints this remedy in both refusal branches to every seat whose governed PR reaches the queue without its landing record. A seat that follows it converts to draft, believes the PR is out of the queue, and the PR can still merge. That is the #20695 shape (merged in draft, #20747).

Filed by the domain:skills execution seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623) from the #20847 dev report (out-of-scope finding 2). The seat re-read the lines on origin/main. PR #20854 (#20847) corrects the rule text in AGENTS.md and pm-dispatch/SKILL.md; its claim excluded scripts, so the guard's printed text is not in it. ⛔ Filed bare: routing and grading belong to triage (the lane table's domain:skills row names "governed 面本身的门禁/审计"). ⛔ Not a claim.

The texts (scripts/pm/check-governed-queue-guard.mjs at origin/main)

  • :1451-:1452: "⭐ FIRST, whatever comes after it — take the pull request out of the queue: convert it back to DRAFT (disarming auto-merge alone does NOT dequeue it) and park it there."
  • :1911-:1912: "⭐ Take the pull request out of the queue: convert it back to DRAFT (disarming auto-merge alone does NOT dequeue it) and park it there — parked outside the queue is the SAFE state."

Measured

Timelines, re-readable through GET …/issues/N/timeline:

The readings live in platform-readings.md (PR #20845). The #20847 dev read GitHub's published GraphQL schema: it declares a dequeuePullRequest mutation, but REST has no dequeue endpoint and the relay has no op for it. So no seat-available dequeue act is measured.

What changes

Dedupe

Semantic issue search in this repo, open and closed, for "check-governed-queue-guard refusal text convert back to draft dequeue merge queue": 8 hits.

Dedupe words: queue guard refusal draft dequeue · check-governed-queue-guard DRAFT dequeue · park it there draft


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — tooling · priority:p1 · domain:skills · area:devpath · pm:queue. #20847's family: the guard's printed remedy says the same as the corrected rule

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T13:58Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: scripts/pm/check-governed-queue-guard.mjs is the governed surface's own audit ⇒ domain:skills, by the lane table. It is not itself governed, so it lands on CI plus the seat's read.

    Why p1. It takes #20847's grade. It is the same false safety remedy, printed by a required gate to every seat whose governed PR hits the queue, and following it can merge a PR the seat believes is parked.

    Direction.

    Order. It lands with or after PR #20854 (#20847, draft, governed), so the rule and the printed remedy never disagree on main.

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 8
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-20855-queue-guard-dequeue-remedy
    Worktree: objectstack-issue-20855
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/check-governed-queue-guard.mjs, specifically the two printed refusal remedies (:1451-:1452 and :1911-:1912 on origin/main) and the self-test cases that pin their text. ⛔ No other script. ⛔ Not AGENTS.md, .claude/** or the workflow. Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate, so the default judgment tier; scripts/pm/** touches none of the five contract-review surfaces, so the landing record is CI plus the seat's read)
    Clause-②: no
    Thread-read: 5912793268
    Serial constraints cleared:


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20855,
    "status": "done",
    "branch": "claude/issue-20855-queue-guard-dequeue-remedy",
    "pr": "#20894",
    "session": "session_01KTZmMfzVzjNvyaLyQ8mHvg (subagent; the dispatching seat's id, as the Claim: 5914611205 names it)",
    "premise_still_valid": true,
    "summary": "Premise held at origin/main 4edb614. scripts/pm/check-governed-queue-guard.mjs printed the claim that a DRAFT conversion dequeues a PR in exactly two places: :1451-:1453 (renderGuardVerdict) and :1911-:1912 (renderSizeVerdict). Both refusals fire only on the merge_group leg: guardVerdict returns 'warned' and sizeGuardVerdict returns 'not-applicable' on pull_request, so the PR each refusal names IS queued. A whole-file grep found no other printed copy, and no other file mirrors the text. Step one of both remedies now carries the pull-back from AGENTS.md Prime Directive #14 (2d5fe76): no seat act is measured to take a queued PR out, disabling auto-merge and a DRAFT conversion included (platform-readings.md, queue membership); ask the maintainer AT ONCE to remove it by hand; disable auto-merge AND convert it to DRAFT, which disarms it so it does not re-enter; confirm from the remote that it is in neither the queue nor origin/main. The approval route, both landings, the bypass-rules option and the quote 「四件套留 draft 等人批,⛔ 不翻正式不入队」 (now stated as where a PR waits once it is out of the queue) are unchanged. No dequeue act is named. On the pins: the old pins stayed green on the rewritten text (292 pass), which shows they could not catch this. The governed ordering pin now reads the pull-back position, and a missing phrase fails it (the old pin compared raw indexOf, where -1 sorts first). A new battery (floor 4; SELF_TEST_BATTERY_FLOOR 23 to 24) holds: a positive pin on all 3 governed refusal kinds, a positive pin on all 3 size refusal kinds, a detector control, and ONE negative pin: no rendering (6 refusals plus the pull_request warning) matches a spelling of 'a DRAFT conversion dequeues it'. The self-test reads each text with whitespace collapsed. Result: 296 cases pass.",
    "tests": "Head 7f89016 (the final commit; the tree was clean for every run). Guard self-test: 292 pass at base 4edb614, 296 pass at head. The gates were derived by node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands with no paths. That gave the same 31 commands as the dispatch, and all 31 exit 0. --ran reconciled them: '31 derived famil(ies) accounted for — 31 run, 0 NOT-MEASURED'. Direct node commands, each exit 0: check-ci-filter-parity; check-closing-keyword-parity (+ --self-test: 40 assertions); check-comment-mask-corpus (7658 files, 0 disagree); check-declaration-mirrors (+ --self-test: 29 cases); check-scripts-symbol-anchors (3704 anchors; + --self-test); check-self-test-wired (+ --self-test); check-self-test-workflow-commands (+ --self-test); check-whole-set-label-write (+ --self-test); pm/bare-root-worklist --self-test; pm/check-governed-queue-guard --self-test (296 cases pass). pnpm gates, each exit 0: check:agent-test-spelling, bash32-floor, cli-command-ids, closing-target-claim (105 cases), cross-package-test-inputs, driver-memory-census, entry-guard, gitlink-declared, nul-bytes (9512 files, no raw control bytes), parse-guard, pnpm-filter-targets, ratchet-remedy-authority, refd-timer-probe, watch-hint-literal. check:pm-dispatch-gates ran detached with its PID recorded and was awaited in the foreground with tail --pid: 'dispatch-gates self-test: 1976 cases pass', 882.7 s, EXIT_CODE=0. NOT MEASURED, left to CI: the guard's event-payload run (CI-measured only), 3 families that take a workflow value (check-closing-target-claim in its CI form, check-shard-attestation, check-test-completeness), and 1 CI job these paths schedule. Lint, narrowed: eslint scripts/pm/check-governed-queue-guard.mjs --no-inline-config --format json read 1 file, 0 errors, 0 warnings. The population comes from eslint.config.mjs: the glob **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}. The effective config for this file (--print-config) has no parserOptions.project and 2 per-file rules (no-restricted-imports, comment-swallow/no-code-inside-block-comment), so it is invariant for untouched files. Control-byte self-scan: grep -naP exit 1 (no match). Ablation used node scripts/ablation-replace.mjs in WRAP mode, each leg inside a script with an EXIT/INT/TERM trap that restores through git checkout HEAD -- on the absolute path. Leg A put back the old size sentence from 4edb614: anchor 1 to 0, blob 3f59569d5403 to 8bd07044a078, on-disk count of 'alone does NOT dequeue it' 1 to 2. The self-test printed '2 of 296 case(s) failed': every-size-refusal-kind-carries-the-SAME-pull-back, and NO-rendering-claims-a-DRAFT-conversion-dequeues-a-queued-PR on the 3 size renderings. Leg B appended the old parenthesis beside the new governed text: '1 of 296 case(s) failed', the negative pin alone, on the 3 governed renderings. Both restores were proven: blob == HEAD 3f59569d5403 and git diff HEAD empty. No build or dist is involved, because the self-test runs the script from source.",
    "gates": {
    "head": "7f89016f9",
    "derived": 31,
    "ran": 31,
    "all_exit": 0,
    "check:pm-dispatch-gates": "exit 0 (1976 cases, 882.7 s, detached)",
    "pm/check-governed-queue-guard --self-test": "exit 0 (296 cases)",
    "not_measured": ["governed-surface-guard.yml event-payload run (CI-measured only)", "3 workflow-value families", "1 path-scheduled CI job"]
    },
    "files_changed": ["scripts/pm/check-governed-queue-guard.mjs (+102 / -16)"],
    "deviations": [
    "The dispatch asked for 'one negative pin'. There is exactly one negative pin, but it sits in a NEW battery (floor 4, roster floor 23 to 24) with two positive pins (one per leg) and a detector control. The control keeps the negative pin able to fail. A floor-pinned battery was chosen because battery (e) has 6 cases of slack over its floor, so a pin added there could stop running without anything going red.",
    "The size refusal cites the pull-back as 'the pull-back of AGENTS.md Prime Directive #14'. PD #14's sentence speaks of governed PRs; the size limb lands the Tier H way (AGENTS.md §7 (c)), so the same pull-back is applied to it rather than a rule being claimed to say so.",
    "Attribution: the harness reminder asked for a model-named Co-Authored-By trailer and an emoji PR footer. The commits instead carry the model-free pair AGENTS.md prescribes (Claude-Session + Co-authored-by: Claude), and the PR body ends with the session-URL footer, because repo instructions take precedence over the reminder. The pre-push hook accepted all three pushes."
    ],
    "mcp_calls": "0",
    "api_writes": "2 — both repository_dispatch through the fleet-write relay as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectstack/dispatches (204), relay run 36741851197 success, executing POST /repos/objectstack-ai/objectstack/pulls (draft forced), which opened #20894; read back 6224 bytes sent, 6224 stored, identical; (2) this os-dev-report comment through scripts/pm/post-stamped.mjs, POST /repos//issues/20855/comments. Plus 3 git pushes (the empty-branch probe, the WIP commit, the pins commit). No label, no PR assignee and no card assignee written. Reads: single-card REST GETs (the issue, its comments, the PR).",
    "open_questions": [
    {
    "question": "A merge_group refusal is itself a red required check, and platform-readings lists it as an ejection cause (the guard's merge_group leg, CI_FAILURE). So by the time a seat reads the remedy, the queue may already have removed the PR. The remedy follows the rule's order: ask the maintainer AT ONCE, then confirm from the remote. Should the order ever become confirm first, then ask only if the PR is still queued?",
    "options": ["A: keep the rule's order (as landed here); the confirm step already catches an ejected PR", "B: amend PD #14 and both remedies to confirm first and ask only if the PR is still queued"],
    "recommendation": "A. It matches the Zone 1 direction and PD #14 verbatim, and a spare maintainer ping costs less than a governed PR merging while a seat waits on a reading. B is a rule change for the maintainer, not this card."
    }
    ],
    "out_of_scope_findings": [
    "carrier: none named · noted, not filed. scripts/pm/check-governed-merges.mjs:773-774 is a header comment (not printed text) that still reads 'Disarming alone does not dequeue: converting the PR back to draft is what removes it from the merge queue.' It is the same family as this card and its rule-text sibling, with no public door and no reader but a code reader. Fold it into the family's closing card if one is open; otherwise it stays in the PR's Acceptance notes. Dedupe words: governed-merges header draft dequeue · check-governed-merges converting back to draft removes · disarming alone does not dequeue comment"
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20894 @ 7f89016f (skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T16:35Z)

    Implemented-by: claude/issue-20855-queue-guard-dequeue-remedy (dev report 5915089153). Reviewed-by: session_01KTZmMfzVzjNvyaLyQ8mHvg.

    The PR.

    • Draft, base main. First body line Fixes #20855; Clause-②: no at a line start.
    • One file: scripts/pm/check-governed-queue-guard.mjs (+102 / −16).
    • Not a governed surface, and no contract-review surface is touched: no content/docs/**, apps/docs/**, changeset prose, packages/spec/src/** or governed rule text. So the record is CI plus this seat's read, and no second agent was started.

    The seat's read.

    • Both printed remedies change: renderGuardVerdict (governed) and renderSizeVerdict (size). Each now carries Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14's pull-back:
      • no seat act is measured to take a queued PR out;
      • ask the maintainer at once to remove it by hand;
      • disable auto-merge and convert to DRAFT so that it does not re-enter;
      • confirm from the remote that it is in neither the queue nor main.
    • No dequeue act is named, and the approval route, both landings and the bypass option are unchanged.
    • The pins can now fail. The old pins stayed green on the rewritten text (292 pass), so they could not have caught this. A new floor-4 battery holds:
      • a positive pin on each leg's three refusal kinds;
      • a detector control;
      • one negative pin: no rendering claims a DRAFT conversion dequeues. Leg A of the ablation (the old size sentence) fails 2 of 296 cases. Leg B (the old governed parenthesis) fails 1, the negative pin.
    • Gates: 31 derived, 31 exit 0, --ran reconciled; the guard self-test passes 296 cases at head.

    The dev's three deviations are accepted.

    1. The negative pin sits in its own floor-pinned battery (with a control) rather than in battery (e), which has slack a lost pin could hide in.
    2. The size refusal applies PD feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14's pull-back rather than claiming PD feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 names size PRs.
    3. The commit trailers are the model-free pair AGENTS.md prescribes.

    Open question A: answer A, keep the rule's order (ask at once, then confirm from the remote). The confirm step already catches a PR that the queue has ejected, and a spare maintainer ping costs less than a governed PR merging while a seat waits on a reading. Option B would amend PD #14, which is a rule change for the maintainer, not this card. The seat does not raise it: no case has been measured in which asking first cost anything.

    Noted, not filed. scripts/pm/check-governed-merges.mjs:773-774 is a header comment, not printed text. It still says converting to draft removes a PR from the queue. It has no public door and no reader but a code reader, and no family card is open to fold it into, so it rides the next PR that edits that file's header. Dedupe words: governed-merges header draft dequeue.

    Slot exception, on record. This tooling card went out while the fleet's one tooling slot is held by #20765 (domain:spec). The maintainer authorized it in this seat's session, 「破例立即派」, for this p1 card only; it is not a standing change.

    Checks. skip-changeset and assignee os-warren were applied by the seat, after reading that the diff touches no package's files[]. CI on 7f89016f: 24 success, 11 path-filtered skipped, nothing else; mergeable_state clean against base 00a92e18d.

    Landing: non-governed, so the owning seat lands it in this act (relay pr_ready + automerge_enable). #20855 is closed by the seat after the merge.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed completed — skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T17:06Z.

    Delivered by PR #20894, MERGED 2026-09-30T17:05Z through the merge queue as da93a8b3e.

    • Content on origin/main: scripts/pm/check-governed-queue-guard.mjs's two printed refusal remedies (governed and size) now carry Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14's pull-back. No seat act is measured to take a queued PR out, so the remedy says to ask the maintainer at once to remove it by hand, disable auto-merge and convert to DRAFT so it does not re-enter, then confirm from the remote. No dequeue act is named. A new floor-4 self-test battery pins it, with a negative pin that ablation showed can fail.
    • Landing record: non-governed. CI green on 7f89016f (24 success, 11 path-filtered skipped) plus the seat's read; ACCEPT 5915517440, which also answers open question A (keep the rule's order) and records the maintainer's one-card exception to the tooling slot.
    • Noted, not filed: the scripts/pm/check-governed-merges.mjs:773-774 header comment still says a draft conversion dequeues. It rides the next PR that edits that header.
    • Closing: Fixes #20855 closed this card at merge. That is the first time this shift, after eleven queue merges where it did not fire. The seat strips pm:dispatched and the assignee here.

    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

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p1High: required for production / M2tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions