Skip to content

finding: skill-surface PR #9238 (.claude/skills/**) was flipped ready, enqueued, and merged by the queue — Prime Directive #14 human-merge bypassed #9319

Closed

Description

@os-zhuang

Filed by the PM seat (session session_01NYgmGheCzM6NrHZN436Cxf) while verifying merge-queue recovery after the required-check freeze (see #9283 comment).

What happened

PR #9238 changes .claude/skills/pm-dispatch/** — a skill-surface PR. Prime Directive #14 and the PR's own body say: 「draft, awaiting a human merge — never ready/queue/auto-merge」. Yet:

  • merge groups for it were created at 11:50Z and again at 12:48Z on 2026-08-17 — someone flipped it ready and armed/enqueued it (identity unknown; all agents share one GitHub login, and no claim-comment on the PR records the flip);
  • the queue freeze coincidentally held it; when the maintainer removed the phantom CI required check (~13:15Z), the already-green 12:48Z group completed and it merged to main as 862eb14, with zero GitHub reviews.

The PM seat re-armed only 9287/9284/9288/9309 during recovery and deliberately excluded #9238 — its group was already in flight from 12:48Z, so the merge could not be prevented from the PM side once the settings unfroze.

Risk reading (honest, not alarmist)

Content risk is low: the diff had been PM-accepted in-thread with gates green (pm-skill-ratchet, skill-frame-sync, etc.), and it implements a maintainer-accepted card (#9226). The failure is the control, not this diff: the lane has now demonstrated that a .claude/skills/** change can reach main with no human click. The skill files are the lane's own operating protocol — the surface where a bad merge propagates to every later dispatch.

Decisions for the maintainer

  1. docs(pm): label writes re-read current labels in the same action — stale snapshots are invalid snapshots (#9226) #9238 itself: retroactively accept the merge (content was reviewed; re-landing by hand buys nothing), or revert and re-land via human merge to keep the precedent clean. Recommendation: retroactively accept, in one line on this card — the record matters more than the ceremony re-run.
  2. The guard: the ADR maintainer approval gate already implements exactly this control for docs/adr/** (red while unapproved/armed, [governance] The ADR gate blocks the merge but not the ARMING of auto-merge — an AI seat armed it on a live docs/adr/** PR today, which would have made the maintainer's approval the merge trigger #8012 clause). Extend its path predicate to .claude/skills/**? That is a gate-strengthening change to contract behavior — not auto-adjudicable, and it would make PD feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 enforced rather than declared (the ADR-0049 shape). If ruled yes, the PM files the work card against scripts/check-adr-merge-approval.mjs + adr-merge-approval.yml.

Follow-up regardless of ruling

The lane seat that flipped #9238 ready should be identified from session transcripts if practical, and the pm-dispatch skill's own text already forbids this — so this is a compliance breach, not a doc gap. No new prose fixes it; only the gate in decision 2 does.

Related: #9226 (the card #9238 implements) · #9283 (the queue freeze that exposed the landing) · Prime Directive #14.

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 17, 2026
  2. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    ContributorAuthor

    Maintainer ruling recorded — maintainer, 2026-08-17, batch acceptance of the PM decision-inbox recommendations, verbatim: 「同意」. Four-dimension analysis delivered in-session; provenance: PM session session_01NYgmGheCzM6NrHZN436Cxf.

    Decision 1 — ruled: the #9238 merge is retroactively accepted. Content was PM-reviewed with gates green and implements a maintainer-accepted card; re-landing by hand buys nothing. This line is the acceptance of record.

    Decision 2 — ruled: yes, extend the guard. The ADR maintainer approval gate's path predicate extends to .claude/skills/**, making Prime Directive #14 enforced rather than declared (the ADR-0049 shape, applied to the lane's own protocol surface). The #8012 armed-auto-merge clause applies to the extended paths identically. Work card filed as the follow-up to this comment; surface: scripts/check-adr-merge-approval.mjs + .github/workflows/adr-merge-approval.yml.

    The compliance question (which seat flipped #9238 ready) is subsumed: with the gate extended, the identical act becomes mechanically impossible rather than forensically traceable — the better spend.

    Closing as completed: both decisions ruled; the enforcement work tracks in the new card.


    Generated by Claude Code

  3. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 17, 2026
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

    domain:devxDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades it

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions