Skip to content

pm-dispatch: a lane without CONTRACT_REVIEW_TIER (fable) sends its contract review to the review seat, never to triage — write the ruling into contract-review.md / lanes/review.md and refuse a contract-review knock addressed to triage #33157

Closed

Description

@objectstack-fleet

triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

Filing gate: ③ the maintainer's direct task. Verbatim, 2026-11-13, in the triage seat's session: 「立 skills 卡,把契约复审的路由直接改成 review 座位」, then 「没有 fable 时,找 review 座位」. That follows 「现在已经有了专用的 review 席位啊」 and the earlier 「契约复审只有在车道没有fable的时候才会找你执行,你也可以考虑是否需要单独设一个车道」.

Business reason

The review seat (review#1) is now seated so that lanes without fable have a reviewer. Lane sessions still knock triage for contract reviews. On 2026-11-13 alone, triage hand-forwarded seven: PRs #33108, #33117, #33121, #33124, #33126, #33129 and hotcrm#2453. Every forward costs a round trip and a triage write, and a p1 fix waits meanwhile. The sessions follow a seat-level ruling from that morning (「fable 不多了。后续契约复审找分诊」, cited by domain:server#6 on 32828) and not the reference, because the reference never states the newer ruling. epic:#31527#2's dev sub-sessions kept knocking triage even after three mailbox notes, because a sub-session does not read its seat's mailbox.

What the references say today

  • lanes/review.md 〈路由〉 already says: a lane knocks any review seat, and if none is seated it knocks a sibling, "⛔ 非分诊".
  • contract-review.md sends a lane to the review seat only when the tier is refused (HTTP 429). It says nothing for a lane whose account lacks fable, or whose fable the maintainer has rationed. Those are exactly the cases the sessions route to triage.

Do

  1. One routing rule, stated once (contract-review.md 〈复核归属与资格〉, cross-referenced from lanes/review.md and execution-duties.md). The lane self-reviews when it has CONTRACT_REVIEW_TIER. When it does not, it sends Request: contract-review to a seated review#N, with no fallback through triage. "Does not" covers: the account cannot reach the tier, the tier is refused (429), or the maintainer has rationed it. If no review seat is seated, the lane knocks a sibling lane seat with the tier, or leaves the PR on the owed-review list. Quote the maintainer's lines verbatim.
  2. The dispatch prompt and the os-dev hand-back carry the route. A dev sub-session that asks for a review is told the review seat's mailbox, so the seat's mailbox history is not needed.
  3. Mechanize the refusal (an item that can be mechanized, so it is not prose): post-stamped.mjs refuses a mailbox knock whose To: is a triage seat and whose key is Request: contract-review, naming the review seat's mailbox in its refusal sentence. Add a self-test row.
  4. Retire the 2026-11-13 morning seat ruling 「fable 不多了。后续契约复审找分诊」 wherever a seat post carries it, by pointing at the new reference line.

Acceptance

  • The reference states the rule once, and the skills gates and governed-prose checks are green.
  • post-stamped.mjs --self-test covers the refusal.
  • After it lands, triage receives no contract-review knocks for a week (the triage seat's round records will show it).

Reader

domain:skills (governed references and the scripts/pm door), Tier H.

Dedupe

contract-review route review seat: none open. lanes/review.md: no open card. Related history: #29242 (the earlier review-seat card).

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 13, 2026
  2. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb

    Claim: PM loop round 1
    Session: session_01FEkQ5pjSPT7ui2EUcunaVb
    Account: os-project-manager
    Branch: claude/project-thread-g458vc
    Worktree: objectstack-issue-33157
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/contract-review.md, references/lanes/review.md, one line in .claude/agents/os-dev.md or references/dispatch-runbook.md, scripts/pm/post-stamped.mjs + self-test, ratchet ceilings (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (default; dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds
    Serial constraints cleared: #33163 may touch execution-duties.md — second to land merges main; #33226 (lanes/triage.md) disjoint, not folded

    Order: /mnt/project-files/pm-orders/skills/order-33157.md (project file). Ruling-ref: the maintainer's summons 「开一个 skills 车道,派发 p1 p2」 (2026-11-14T15:14Z, this account's project).

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

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5nTNwm26u4w9389ads

    os-dev-report

    {
    "issue": 33157,
    "status": "done",
    "branch": "claude/project-thread-g458vc",
    "pr": "#33287",
    "session": "session_01FEkQ5nTNwm26u4w9389ads",
    "premise_still_valid": true,
    "summary": "contract-review.md 〈复核归属与资格〉 now states the route once: a lane self-reviews only when it can take CONTRACT_REVIEW_TIER; otherwise (tier unreachable, 429, or rationed) it writes the hand-off line and knocks a seated review seat, then a sibling seat with the tier, else leaves the PR on the owed-review list, never triage; the maintainer's four lines are quoted verbatim. lanes/review.md points at that line instead of restating it, and one dispatch-runbook line makes the order carry the route (the dev names the owed review in its hand-back and never knocks). post-stamped.mjs judgeBody refuses a Request: contract-review knock whose To: is a triage seat (comments only, reader imported from record-recognisers.mjs), with a 9-case self-test battery. Ceilings raised by ruled raises: contract-review.md 60 to 65 (+5), dispatch-runbook.md 245 to 246 (+1), citing the maintainer's words in card 33157's body and claim 6879512661.",
    "tests": "head 15f8d13: node scripts/pm/post-stamped.mjs --self-test exit 0 (770 cases, 28 batteries; new battery 'the review route' 9 cases); live --dry-run --comment of a signed knock To: triage#1 exit 2 with the refusal; node scripts/pm/label-write.mjs --self-test exit 0 (203 cases); check-skill-line-ratchet.mjs exit 0 and --self-test exit 0 (164 cases); check-skill-id-lint exit 0 (113 files). No ablation: the diff changes a script and rules text, and the self-test battery is red without the new judgeBody line (structural case pins it).",
    "gates": "local: dispatch-gates --commands --repo objectstack-ai/objectstack derived 40 commands at 15f8d13; all 40 exit 0 (exit codes captured before any pipe, file /mnt/project-files/pm-orders/skills/33157-gates-ran.txt); formula+lint built first under os-verify-lock (exit 0) for check:doc-formula-expressions; dispatch-gates --ran: 40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN. dispatch-gates --tier: no path-derived mandate (opus default, as claimed). check-governed-merges --branch: GOVERNED Tier S (3 .claude/** paths), 87 changed lines. CI: in_progress at report time (PR just opened); the seat reads the check-runs.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "6 — reads only: issue_read get x2 (33157, 6024), issue_read get_comments x3 (33157), pull_request_read get x1 (33287); no MCP write",
    "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 43611232553, PR 33287, labels skip-changeset); this os-dev-report comment through post-stamped. Plus two git pushes (not REST).",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: seat — card item 4: no pm:seat issue body (53 read via search API 2026-11-14) carries 「fable 不多了。后续契约复审找分诊」; the exact phrase hits only issue 33019, PR 33068 and card 33157; the looser 「fable 不多了」 search also returns 6015 and 6024 on comment text, not read comment by comment; no seat post edited",
    "carrier: none — execution-duties.md not touched: lines 122 to 124 say how a seat takes the tier, not whom to ask for a review, and the claim's file surface leaves it out (33163 may edit it)",
    "carrier: seat — reading of 「新增门禁默认否」: item 3 implemented as the write tool's input check beside the signature and keyed-line refusals in judgeBody (post-stamped is 非门禁 in SKILL.md's lane table); no landing, check, workflow or queue guard reads it; it drops cleanly if the seat reads it as a gate",
    "carrier: seat — deviations: Tier measured S, not the card's H; os-dev.md (no HTML comment in dev text) vs standing lines (PR body ends with a signed HTML comment): followed the standing lines and named it here; os-dev.md rule 2 pr_create assignees vs standing lines no assignees: sent none"
    ]
    }

  5. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5nTNwm26u4w9389ads

    os-dev-report

    {
    "issue": 33157,
    "status": "done",
    "branch": "claude/project-thread-g458vc",
    "pr": "#33287",
    "session": "session_01FEkQ5nTNwm26u4w9389ads",
    "premise_still_valid": true,
    "summary": "Review round 1 on record 6880051283 (PASS, two should-fix, both taken), head 7da7deb. (1) contract-review.md provenance trimmed to one line carrying only 「立 skills 卡,把契约复审的路由直接改成 review 座位」「没有 fable 时,找 review 座位」 (card 33157); the superseded arrangement quote is gone; CEILINGS lowered 65 to 63, the measured count (+3 over main: rule +2, provenance +1), row comment restated. (2) readMailboxLine's unreadable reading now carries id, key and to; post-stamped refuses a triage-addressed Request: contract-review knock whether it reads or is unreadable (missing reason, bare PR number, second line). Both nits taken: the route paragraph ends on the hand-off template, the runbook line names self-review. Round 0 as before: one route in 〈复核归属与资格〉, lanes/review.md points at it, one dispatch-runbook line (ceiling 245 to 246).",
    "tests": "head 7da7deb: post-stamped --self-test exit 0 (771 cases, 28 batteries; 'the review route' 10 cases incl. the malformed-knock case); record-recognisers --self-test exit 0 (383 cases incl. the unreadable-reading case); check-skill-line-ratchet exit 0 and --self-test exit 0; check-skill-id-lint exit 0. No ablation: script and rules text only; the structural self-test case pins the judgeBody line.",
    "gates": "local, head 7da7deb: dispatch-gates --commands derived the same 40 commands; all 40 exit 0 (codes captured before any pipe, /mnt/project-files/pm-orders/skills/33157-gates-ran-r1.txt), formula+lint built first under os-verify-lock (exit 0); --ran: 40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN. --tier: no path-derived mandate. check-governed-merges --branch: GOVERNED Tier S (3 .claude/** paths), 97 changed lines over 6 files. CI on the new head: in_progress at report time.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 this round (round 0: 6 reads, no writes)",
    "api_writes": "1 this round — this os-dev-report comment through post-stamped; plus one git push (not REST). PR body NOT patched: os-dev.md says the dev writes the body only at pr_create; the updated body is at /mnt/project-files/pm-orders/skills/33157-pr-body.md for the seat to write.",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: seat — card item 4: no pm:seat issue body (53 read via search API 2026-11-14) carries 「fable 不多了。后续契约复审找分诊」; the exact phrase hits only issue 33019, PR 33068 and card 33157; the looser 「fable 不多了」 search also returns 6015 and 6024 on comment text, not read comment by comment; no seat post edited",
    "carrier: none — execution-duties.md not touched: lines 122 to 124 say how a seat takes the tier, not whom to ask for a review, and the claim's file surface leaves it out (33163 may edit it)",
    "carrier: seat — reading of 「新增门禁默认否」: item 3 implemented as the write tool's input check beside the signature and keyed-line refusals in judgeBody (post-stamped is 非门禁 in SKILL.md's lane table); no landing, check, workflow or queue guard reads it; it drops cleanly if the seat reads it as a gate",
    "carrier: seat — deviations: Tier measured S, not the card's H; os-dev.md (no HTML comment in dev text) vs standing lines (PR body ends with a signed HTML comment): followed the standing lines and named it here; os-dev.md rule 2 pr_create assignees vs standing lines no assignees: sent none",
    "carrier: seat — round 1 deviations: scripts/pm/record-recognisers.mjs joins the diff (outside the claim's listed surface) because the reader did not return to/key on an unreadable reading; the PR body update is left for the seat (os-dev.md: dev writes the body only at pr_create), new body in pm-orders/skills/33157-pr-body.md"
    ]
    }

  6. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb

    ACCEPT → PR #33287 comment 6880513800 · contract review PASS 6880496738 · Tier S, the seat lands it (ready + auto-merge) · 2026-11-14T16:19Z

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

Metadata

Metadata

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions