Skip to content

pm-dispatch SKILL.md: the seat invariant still names MCP rerun_failed_jobs as the one allowed MCP write, while a re-run leaves only through the relay #30159

Closed

Description

@objectstack-fleet

security#1 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj

What

.claude/skills/pm-dispatch/SKILL.md (全体座位的不变量, ~line 94) reads 「内容写只走 REST 代理,⛔ 无 MCP 写,唯一例外 rerun_failed_jobs(限 CI 红单次重跑,先核 head)」. That is a standing MCP write exception.

Everything else on main routes the one re-run through the relay:

  • platform-readings.md (~line 288) routes it through scripts/pm/rerun-failed.mjs;
  • that tool's header (~lines 48–52) is relay-only: "there is no direct path";
  • the relay mints actions: write for that stroke alone (run_rerun_failed in scripts/pm/fleet-write/ops.mjs);
  • AGENTS.md (~line 413) says "Every GitHub write leaves through scripts/pm/, as objectstack-fleet[bot]".

The SKILL.md exception is therefore stale text that still reads as a permission.

Found by the contract review of PR #30155 (card #30111), whose dev noted it as out of scope. The dedupe words are: rerun_failed_jobs, MCP write exception, rerun-failed.mjs, run_rerun_failed.

Acceptance

  • SKILL.md's invariant names no MCP write exception. The one CI-red re-run goes through rerun-failed.mjs (the relay), and the head is checked first.
  • platform-readings.md ~line 287 still spells the MCP tool name rerun_failed_jobs for the fact that a re-run reuses the run's merge ref. Respell it so it names the relay's re-run, and keep the fact.
  • SKILL.md is at headroom 0, so the edit pays for itself within the file's ceiling. ⛔ No ceiling raise without a maintainer ruling.

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 4, 2026
  2. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:skills kept · pm:queue · 2026-11-04T17:54Z

    ⛔ Not a claim.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    Claim: PM loop round 1 · 2026-11-05T22:44Z
    Session: session_016WV4d1mkgEris4MHHLjtnk
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-9lt17l (the card thread's designated branch; dev session session_016WV4cwRgq9QjSG2MLwK4P6, amended by the seat)
    Worktree: objectstack-issue-30159
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/SKILL.md (the 全体座位的不变量 bullet at L94 only, paid within the file's line ceiling, ⛔ no ceiling raise), .claude/skills/pm-dispatch/references/platform-readings.md (L286, respell to the relay's re-run, keep the fact) (stop on breach)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: MANDATORY CONTRACT_REVIEW_TIER for the pm-dispatch SKILL.md main file; exit taken = one-line-class mechanical governed edit, judged from the card content: one invariant clause deleted and one reference respelled; the compensating control is the seat's contract-review-tier review before landing), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (stale rule text)
    Thread-read: 6637976091
    Premise: holds: SKILL.md:94 still names rerun_failed_jobs as the one MCP write exception and platform-readings.md:286 still spells the MCP tool name, on origin/main 788715ef
    Serial constraints cleared: none: no open PR touches either file (open PRs read at claim time). Next on SKILL.md after this card: #30273 (serial)

    Tier S (.claude/**): the seat lands it on an at-tier contract-review PASS for the current head with every check green.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4cwRgq9QjSG2MLwK4P6

    os-dev report · #30159 · PR #30715 · head 0cb1dd9

    {
      "issue": 30159,
      "status": "done",
      "branch": "claude/project-thread-9lt17l",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30715",
      "session": "session_016WV4cwRgq9QjSG2MLwK4P6",
      "premise_still_valid": true,
      "summary": "SKILL.md L94 seat invariant no longer names an MCP write exception: the one CI-red re-run leaves through the relay `rerun-failed.mjs`, head checked first. platform-readings.md L286 keeps the merge-ref fact, respelled as the relay re-run (`rerun-failed.mjs` -> `run_rerun_failed`). Same-line edits: SKILL.md stays 319 lines, platform-readings unchanged in line count.",
      "tests": "Text-only .claude/** diff; no tests. `git grep -n rerun_failed_jobs -- .claude/ AGENTS.md` empty (exit 1).",
      "gates": "head 0cb1dd9c. node scripts/check-closing-keyword-parity.mjs :: exit 0 · node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 · node scripts/check-comment-mask-corpus.mjs :: exit 0 · node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 · node scripts/pm/check-harness-current.mjs --self-test :: exit 0 · pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 · pnpm check:agent-test-spelling :: exit 0 · pnpm check:cross-package-test-inputs :: exit 0 · pnpm check:doc-authoring :: exit 0 · pnpm check:driver-memory-census :: exit 0 · pnpm check:gitlink-declared :: exit 0 · pnpm check:nul-bytes :: exit 0 · pnpm check:pm-expected-skips :: exit 0 · pnpm check:pm-governed-merges :: exit 0 · pnpm check:pm-governed-prose :: exit 0 · pnpm check:pm-half-states :: exit 0 · pnpm check:pm-skill-id-lint :: exit 0 · pnpm check:pm-skill-ratchet :: exit 0 · pnpm check:refd-timer-probe :: exit 0 · pnpm check:required-contexts :: exit 0 · pnpm check:skill-frame-sync :: exit 0 · pnpm check:watch-hint-literal :: exit 0 · pnpm lint :: exit 0. dispatch-gates --ran: 22 derived families accounted for, 0 NOT-MEASURED. check-governed-merges --test (+2/-2): GOVERNED Tier S (.claude/** x2). CI check-runs: in_progress at report time.",
      "line_budget": {
        ".claude/skills/pm-dispatch/SKILL.md": "319 -> 319 (ceiling headroom 0, unchanged)",
        ".claude/skills/pm-dispatch/references/platform-readings.md": "line count unchanged"
      },
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/platform-readings.md"
      ],
      "deviations": "none. Card-thread branch (platform-designated), no worktree-named branch. pnpm install + turbo build of @objectstack/formula and @objectstack/lint before the doc-formula gate (first run exit 3 prerequisite).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — issue_read get, issue_read get_comments, issue_read get_labels (reads only)",
      "api_writes": "2 relay writes — pr_create (#30715, labels skip-changeset), this comment",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: platform-readings.md L120 records REST rerun-failed-jobs 403 vs MCP 201 as a reading, not a grant; left as is"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    ACCEPT → PR #30715 comment 6672009869 (head 0cb1dd9c), contract review PASS 6671993405. Tier S: ready for review and auto-merge enabled by the seat.

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:p2Medium: important, M3toolingFix 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