Skip to content

pm-dispatch enqueue: merge main first when the last green PR run is 15+ merges behind, and no re-enqueue on an unchanged head after a deterministic red #31548

Closed

Description

@objectstack-fleet

domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6

Filing gate: ③ a task the maintainer directed. This is the enqueue-procedure half of #31518. The maintainer's words on that card, verbatim: 「同意,立卡」 · 「高优先」 (2026-11-08T12:30Z). #31518 itself routes this half here: "Any change to the enqueue procedure (.claude/skills/pm-dispatch/**, the fleet-write relay) is domain:skills' and governed; the devx seat files it there with the readings." ⛔ Not a claim. No grade: triage sets it.

Business reason. Every PR author waits in the merge queue. In 2026-11-01..07, stale-base entries were 21 of 68 queue roots and caused 122 of 157 cascade rebuilds: each one is a PR that was green on its own run, entered the queue far behind main, went red there and ejected the entries behind it (5.8 cascades per root). A further 28 cascades (18% of the window) came from 5 PRs re-enqueued with an unchanged head after a deterministic red. Multi-build PRs waited p50 48 min and p90 130 min against 18 min for one build (#31518 "Business reason").

Reader who acts. The domain:skills seat, on .claude/skills/pm-dispatch/references/landing-operations.md (the enqueue rules) and, if a rule should be enforced and not only written, the relay's automerge_enable / enqueue op under scripts/pm/fleet-write/. Governed (Tier S / relay); no CI or workflow change.

Measured (#31518 step 1, comment 6722460022, roots table with 68 rows)

Wanted

  1. Before arming auto-merge or enqueuing, the seat reads K for the PR's last green run; at K ≥ 15 it merges origin/main and waits for a green re-run first. The devx reading recommends 15: one extra PR CI round on about a quarter of entries, against 108 of 122 cascades. docs(pm-dispatch): merge main before landing a label PR when a new locale landed under it #31536 (merged) is the locale-label special case of this rule and is subsumed by it or kept beside it; the skills seat decides.
  2. A PR the queue ejected is not re-enqueued until its head changes or the ejection is read as a flake (same tree green on re-run, or a queue-flake anchor names the test).
  3. ⛔ No gate skipped or made report-only, no required context dropped, no merge-queue setting changed (ci(merge-queue): one bad entry turned into ~6 red rebuilds on 2026-11-06 (18 roots, 110 cascades) — find why each root was green on its PR, and stop the classes the enqueue step can catch #31518 Wanted 3).

Acceptance

Dedupe

Searched 2026-11-08T14:1xZ, open and closed issues: "enqueue refresh behind" 172 hits, "re-enqueue unchanged head" 145, "stale base enqueue" 1110 (seat posts, unrelated cards, #31518 itself). Pull requests: #31536 (locale-label special case, merged) is the only one that adds an enqueue refresh rule. New.

Activity

  1. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: domain:skills · p1 · pm:queue · 2026-11-08T14:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    pm:queueReady for the PM dispatch loop
    priority:p1High: required for production / M2
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    on Nov 8, 2026
  3. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim: PM loop round 11 · 2026-11-08T15:21Z
    Session: session_01QsR2jT34CXs5fCn3BDirZw
    Account: zhuangjianguo (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-ocxnq9 (the card thread's designated branch, a measured platform exception to claude/issue-<n>-<slug>; dev session session_01QsR2jUrbhvWATpNtktSTgj)
    Worktree: objectstack-issue-31548
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: .claude/skills/pm-dispatch/references/landing-operations.md only (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (.claude/** Tier S; contract review routed to the director seat), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the landing protocol (pm-dispatch enqueue rules) | the measured stale-base roots: 21 of 68 queue roots and 122 of 157 cascade rebuilds over 2026-11-01..07 (#31518 reading 6722460022)
    Thread-read: 6723002344
    Premise: holds. On main 8c75f837 landing-operations.md (102 lines) carries only the locale-label refresh at L33–34 (#31536). No rule reads K, the first-parent count from the last green run's diff base, before enqueue. The written rule is the deliverable; relay enforcement is out (a new gate needs a decision card first, per triage).
    Serial constraints cleared: none on this file. Card #31403 (queue jump, held on a decision) also concerns enqueue but has no open PR.

    Dispatch order: pasted verbatim into the card thread's opening message (common rules + order, from the seat folder skills-seat-2/ of the project files). Writes: PR only via relay pr_create; comments, labels and bodies only via scripts/pm write tools; no GitHub MCP writes.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  5. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jUrbhvWATpNtktSTgj
    os-dev-report

    {
      "issue": 31548,
      "status": "done",
      "branch": "claude/project-thread-ocxnq9",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31571",
      "head": "f4544c28",
      "session": "session_01QsR2jUrbhvWATpNtktSTgj",
      "premise_still_valid": true,
      "files_changed": [".claude/skills/pm-dispatch/references/landing-operations.md"],
      "line_budget": {
        "file": ".claude/skills/pm-dispatch/references/landing-operations.md",
        "before": 102, "after": 102, "ceiling": 102,
        "added": 2, "deleted": 2, "rewritten_equal_count": 2,
        "max_touched_line_bytes": 119,
        "check_pm_skill_ratchet": "exit 0 at f4544c28"
      },
      "survivors": [
        { "deleted": "landing-operations.md old L41 (never gen:schema in MERGE state)", "survives_at": ["scripts/pm/os-regen-merge.sh:14-15", ".claude/agents/os-dev.md:198"] },
        { "deleted": "landing-operations.md old L45 (baseRev may lag; no hand-edit for equality)", "survives_at": [".claude/agents/os-dev.md:196-197"] }
      ],
      "gates": {
        "derived": 17, "ran": 17, "not_measured": 0, "head": "f4544c28",
        "all_exit_0": [
          "node scripts/check-closing-keyword-parity.mjs",
          "node scripts/check-closing-keyword-parity.mjs --self-test",
          "node scripts/check-comment-mask-corpus.mjs",
          "node scripts/pm/check-harness-current.mjs --self-test",
          "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
          "pnpm check:agent-test-spelling",
          "pnpm check:cross-package-test-inputs",
          "pnpm check:doc-authoring",
          "pnpm check:driver-memory-census",
          "pnpm check:gitlink-declared",
          "pnpm check:nul-bytes",
          "pnpm check:pm-governed-merges",
          "pnpm check:pm-skill-id-lint",
          "pnpm check:pm-skill-ratchet",
          "pnpm check:refd-timer-probe",
          "pnpm check:skill-frame-sync",
          "pnpm check:watch-hint-literal"
        ],
        "ran_reconciliation": "dispatch-gates --ran: 17 derived, 17 run, 0 NOT-MEASURED, exit 0",
        "pr_body_gates": "check-changeset-no-major --base origin/main exit 0; check-adr-0087-registration exit 0; check-partof-closing-keyword exit 0",
        "ci": "in_progress at open"
      },
      "dogfood_battery": "n/a: no ! in the title, no (narrowing) arm",
      "labels": "skip-changeset (sent with pr_create, read back on the PR)",
      "deviations": [],
      "api_writes": "4: git push x2 (branch), relay pr_create #31571, relay post-stamped this comment",
      "mcp_calls": "4 reads (issue_read x3, pull_request_read x1), 0 writes",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Landed · 2026-11-08T16:11Z — PR #31571 merged through the merge queue (merge commit 87df07b). It landed on the director's CONTRACT_REVIEW_TIER PASS 6723543881 for head f4544c2.

    landing-operations.md now has the pre-enqueue K rule:

    The four-branch opener now says that with an unchanged head, a PR is re-enqueued only on a flake reading. Relay enforcement of the K rule was not built: it is a new gate and would need a decision card first.

    pm:dispatched removed. Nothing left on this card.

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

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions