Skip to content

pm-dispatch(review seats): a review#N seat on other accounts takes contract reviews from the lanes' doorbells; triage becomes the fallback #29242

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate: ③ a task the maintainer assigned directly (a pm rule change, filed because the maintainer named it). The maintainer asked in the triage session, verbatim, 「契约复审我想分拆到其他账户,怎么处理。」. Triage offered three shapes:

  • A: lanes review their own PRs;
  • B: dedicated review seats;
  • C: lanes cross-review each other.

The maintainer ruled 「选 B,立卡」.

Reader: domain:skills. Files:

  • .claude/skills/pm-dispatch/references/lanes/ (a new review.md);
  • references/contract-review.md 〈复核归属与资格〉;
  • references/project-forms.md (the seat word, and the mailbox key routing);
  • references/lanes/triage.md;
  • scripts/pm/check-owed-reviews.mjs and scripts/pm/fleet-roster.mjs (the roster row).

Dedupe (open AND closed): review seat in:title and contract-review seat in:title find no card on a review seat.
⛔ Not a claim.

Why

Since the maintainer's 2026-11-01 ruling 「你有fable 了,后续定时契约复审还是归你」, lanes hand every review to the triage seat by doorbell (Request: contract-review). On 2026-11-02 the triage seat ran about twenty CONTRACT_REVIEW_TIER reviews alone, beside its hourly rounds and gradings. All of them ran on one account and one session, so they competed for one write budget and one model quota. The rule already lets any seat that reaches the tier review. What is missing is a seat whose only job is reviewing, on other accounts.

The rule

  1. A review seat. Seat word 复核 (lane file lanes/review.md), seats review#1, review#2 and so on, one seat post each, held on any account that has CONTRACT_REVIEW_TIER (fable) access.
  2. Routing.
    • Lanes ring Request: contract-review to a review seat's mailbox instead of triage's. Any free review seat may take it.
    • Mutual exclusion uses the existing claim line. The first Contract-review-claim: on a head wins, and the "same head, lane wins" rule extends to "the earlier claim wins" between review seats.
    • With no review seat seated, the bell goes to triage, as today.
  3. Owed-review scan. check-owed-reviews.mjs (a)(b)(c) offers a PR to review seats first. Triage takes it only when no review seat is seated, or when the PR has waited one further triage round past (b) with no claim. Triage remains the fallback reviewer, and its records keep the same shape.
  4. The same reviewer owns the delta re-review, as today. If a review seat goes off duty with a stale record, the next review seat takes the delta, and the hand-off line names it.
  5. Independence: a review seat never reviews a PR its own account dispatched or implemented. Records keep the Implemented-by: / Reviewed-by: pair.
  6. What review seats do not do: merge, ready or dispatch PRs; grade cards; or take any human-floor action. The security-finding rule (pm-dispatch(security): one fleet-wide rule for security findings — never a card, never a public mechanism; tracked as a GitHub draft security advisory, fixed by a no-card pm-dispatch order #29111) applies: mechanisms stay rule-level in records, and detail goes in the reviewer's local note.
  7. Roster: fleet-roster.mjs shows review seats as rows like the lanes, with in-flight = claimed heads.
  8. ⛔ No new gate and no new label (「新增门禁默认否」).

Acceptance

  • lanes/review.md exists with points 1–6. contract-review.md, project-forms.md and lanes/triage.md point at it.
  • check-owed-reviews.mjs prints the review-seat-first routing. Its self-test covers the case with no review seat seated, which falls back to triage.
  • fleet-roster.mjs lists review seats.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH

    Claim: PM loop round 6 · 2026-11-03T17:23Z
    Session: session_01WGufzhXV3ABCbTkU1iRRn7 (os-dev card thread "Add review seats for contract reviews"; dispatched by session_01WGufzhd2Ad9ANGTyAMW7pH)
    Account: os-support-ai
    Branch: claude/project-thread-ypvuqe
    Worktree: objectstack-issue-29242
    Domain: domain:skills
    Seat: domain:skills#3
    File surface: NEW .claude/skills/pm-dispatch/references/lanes/review.md; references/contract-review.md 〈复核归属与资格〉; references/project-forms.md (seat word, Request: contract-review routing); references/lanes/triage.md (fallback reviewer, only after PR #29940 merges); scripts/pm/check-owed-reviews.mjs; scripts/pm/fleet-roster.mjs; scripts/pm/check-skill-line-ratchet.mjs (the new file's row, ruled raises only); no changeset (skip-changeset)
    Container & model: L, mode:thread, model: CONTRACT_REVIEW_TIER — reason: governed pm rules text plus review routing scripts (per-card call; --tier: no path mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds — maintainer ruled 「选 B,立卡」 (card body); no lanes/review.md and no review-seat routing in check-owed-reviews.mjs on origin/main 1f6bc5a
    Serial constraints cleared: PR #29940 (this seat, #29682) holds lanes/triage.md in the merge queue; this card edits that file only after #29940 merges. No other open PR touches the surface (measured 2026-11-03T17:18Z)

  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · os-support-ai · session_01WGufzhXV3ABCbTkU1iRRn7
    os-dev-report

    Stamp: 2026-11-03T18:25Z

    PR #29967 (draft, skip-changeset, no assignees) · head 9da0cd8c3b78a1eb2e0454fffe0fa688add628c8 · base main at 82f60ebb (merged into the branch after #29940 landed).

    {
      "pr": 29967,
      "head": "9da0cd8c3b78a1eb2e0454fffe0fa688add628c8",
      "gates": {
        "derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (final head, 11 paths, 55 commands)",
        "ran": "55 derived families accounted for: 54 run exit 0, 1 NOT-MEASURED (pnpm --filter @objectstack/lint run check:doc-formula-expressions, recorded exit 3, prerequisite not met in a fresh worktree)",
        "extra": {
          "pnpm check:pm-skill-ratchet": 0,
          "pnpm check:pm-skill-id-lint": 0,
          "pnpm check:pm-half-states": "0 (5222 cases)",
          "pnpm check:pm-record-recognisers": "0 (366 cases)",
          "node scripts/pm/check-owed-reviews.mjs --self-test": "0 (78 cases, 10 batteries)",
          "node scripts/pm/fleet-roster.mjs --self-test": "0 (110 cases, 9 batteries)",
          "node scripts/pm/mailbox-open.mjs --self-test": "0 (83 cases, 10 batteries)",
          "node scripts/pm/check-skill-line-ratchet.mjs --self-test": 0,
          "npx eslint (6 edited scripts)": 0
        }
      },
      "line_budget": {
        "references/contract-review.md": "60/60",
        "references/project-forms.md": "59/59",
        "references/lanes/triage.md": "20/20 (edited after #29940 merged; line 15 = 117 bytes)",
        "references/lanes/review.md": "21/21 (new CEILINGS row at 21, MAX_TABLE_ROW_BYTES pin 0)",
        "raises": "none",
        "widest_line_bytes": 120
      },
      "deviations": [
        "The card's rule 2/3 and acceptance say the fallback reviewer is triage (also the order's 'triage becomes the fallback reviewer' and the acceptance's 'falls back to triage'). Built as: fallback = the lane's own seat (a sibling lane seat), never triage. Reason: origin/main already says 车道或复审席接,⛔ 非分诊 (contract-review.md) and ⛔ 分诊不再审 (triage-duties.md), and the maintainer's later word on 2026-11-03: 「目前各车道都有fable,应该不需要你契约复审」. Agreed with skills seat 3 before building; declared in the PR body."
      ],
      "files_changed": [
        ".claude/skills/pm-dispatch/references/lanes/review.md (new, 21 lines)",
        ".claude/skills/pm-dispatch/references/contract-review.md",
        ".claude/skills/pm-dispatch/references/project-forms.md",
        ".claude/skills/pm-dispatch/references/lanes/triage.md",
        "scripts/pm/check-skill-line-ratchet.mjs",
        "scripts/pm/mailbox-open.mjs",
        "scripts/pm/check-half-states.mjs",
        "scripts/pm/record-recognisers.mjs",
        "scripts/pm/check-owed-reviews.mjs",
        "scripts/pm/fleet-roster.mjs",
        "scripts/pm/fleet-roster.fixture.json"
      ],
      "declarations": { "Clause-②": "no", "Metadata-protocol": "none", "changeset": "none (skip-changeset)" },
      "writes": { "git push": 2, "relay pr_create": 1, "post-stamped comment": 1, "github_mcp_writes": 0 },
      "mcp_calls": "GitHub MCP reads only: issue_read ×1, pull_request_read ×3",
      "security_findings": "none"
    }
  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH

    Seat status · PR #29967 landing · 2026-11-03T18:56Z

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions