You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
pm-dispatch(contract-review): triage takes no contract reviews — every review is the dispatching seats, and a tier-unavailable or off-duty head waits for its lane or the review seats (#29242), not triage #29667
Filing gate ③: the maintainer's decision. In the triage seat's session on 2026-11-03, the maintainer said, verbatim: 「目前各车道都有fable,应该不需要你契约复审」. On 2026-11-02 they had first narrowed triage to a fallback (「29242 还是需要 同意。1+2+4」). This removes the fallback. ⛔ Not a claim.
An off-duty lane's owed heads wait for its next seat, or a review seat. They are listed in the lane's hand-over brief.
scripts/pm/check-owed-reviews.mjs.
The TAKE verdict names the lane seat or a review seat as the taker. It never says triage.
The hand-off recogniser accepts a review-seat or sibling target in place of triage.
Report-only, as now; ⛔ no gate.
The mailbox vocabulary (record-recognisers.mjsMAILBOX_KEYS, project-forms.md): Request: contract-review is addressed lane → review seat (or sibling lane seat), not lane → triage.
lanes/triage.md. Remove the owed-reviews step from the triage round. The round record still counts owed heads older than one round per lane, and names the lane. That is a report, not a review.
⛔ No new gate, label or patrol row.
Acceptance
One PR across .claude/skills/pm-dispatch/**, scripts/pm/check-owed-reviews.mjs and scripts/pm/record-recognisers.mjs. Their self-tests pass with the new taker and recipient.
node scripts/pm/check-owed-reviews.mjs on the live board prints no row that names triage as the taker.
Reader who acts: domain:skills. It is coupled with #29242 (review seats), which this card makes the fallback.
Claim: PM loop round 20 · 2026-11-03T00:52Z
Session: session_01J8VVAnMUWA9rufXzFaEh4J
Account: huangyiirene
Branch: claude/project-thread-s401e7
Worktree: objectstack-issue-29667
Domain: domain:skills
Seat: domain:skills#1
File surface: .claude/skills/pm-dispatch/references/contract-review.md (〈复核归属与资格〉 and the landing-head re-review line; ceiling 60), .claude/skills/pm-dispatch/references/lanes/triage.md (the owed-reviews step; ceiling 15), .claude/skills/pm-dispatch/references/project-forms.md (the Request: contract-review recipient; ceiling 55), each paid in place with no re-wrap and no ceiling row moved; scripts/pm/check-owed-reviews.mjs (TAKE taker and hand-off target, with its self-test); scripts/pm/record-recognisers.mjs (MAILBOX_KEYS recipient, with its self-test) (stop on breach)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; the seat's review runs at CONTRACT_REVIEW_TIER: governed rules text), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — maintainer's decision (「目前各车道都有fable,应该不需要你契约复审」), filed by triage
Thread-read: 6592417472
Premise: holds. On origin/main, contract-review.md still gives triage the fallback (a)(b)(c), and check-owed-reviews.mjs still names triage as a taker.
Serial constraints cleared: no open PR touches these five files.
Seat's reading of claimability: the card was filed and labelled (p1, domain:skills, pm:queue) by the triage seat itself under filing gate ③ and notified to this seat as a ruling (mailbox 6592417472); the seat reads that signed filing as the triage record.
Tier S (.claude/**) plus pm tooling. No new gate, label or patrol row, as the card says.
The executor stopped before writing and measured on main744211f: the triage round's owed-reviews step lives in references/triage-duties.md, not lanes/triage.md (which already says contract review is the lane's).
File surface, added (stop on breach): .claude/skills/pm-dispatch/references/triage-duties.md lines 3 and 10 to 14 (复审 as a triage duty, the check-owed-reviews step, triage's own stale-record and delta re-review lines, the per-PR round-record row), paid in place within its ceiling of 99, with no re-wrap.
Seat's rulings on the executor's three in-surface points:
project-forms.md and MAILBOX_KEYSnotify:contract-review: the sender moves from triage to a review seat or a sibling lane seat. Triage takes no reviews, so it sends no review notices.
contract-review.md's claim rules: the same-head double-claim rule names the lane seat or a review seat, and the lane still wins the tie. The contractReviewClaims code stays untouched.
The at-tier review of PR #29686 found that ruling 2 asked for two things that cannot both hold. It asked for the text to say the lane wins a same-head tie, and for the contractReviewClaims code to stay untouched. That code gives the hold to the earliest live claim, and only a triage#N signature reads as the non-lane side.
Amended ruling 2: the text follows the code. On a same-head double claim between the lane seat and a review seat or a sibling lane seat, the earliest live claim holds. The later claimant withdraws by reply. contractReviewClaims stays untouched. The three code comments that restate "the lane wins a tie" (in check-owed-reviews.mjs, including its summary string, and in record-recognisers.mjs) are corrected to the same sentence. Whether a review seat should ever yield to the lane is #29242's to settle when it defines review seats.
Activity
objectstack-fleet commentedon Nov 3, 2026
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J
Claim: PM loop round 20 · 2026-11-03T00:52Z
Session:
session_01J8VVAnMUWA9rufXzFaEh4JAccount:
huangyiireneBranch:
claude/project-thread-s401e7Worktree:
objectstack-issue-29667Domain:
domain:skillsSeat:
domain:skills#1File surface:
.claude/skills/pm-dispatch/references/contract-review.md(〈复核归属与资格〉 and the landing-head re-review line; ceiling 60),.claude/skills/pm-dispatch/references/lanes/triage.md(the owed-reviews step; ceiling 15),.claude/skills/pm-dispatch/references/project-forms.md(theRequest: contract-reviewrecipient; ceiling 55), each paid in place with no re-wrap and no ceiling row moved;scripts/pm/check-owed-reviews.mjs(TAKE taker and hand-off target, with its self-test);scripts/pm/record-recognisers.mjs(MAILBOX_KEYSrecipient, with its self-test) (stop on breach)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate; the seat's review runs at CONTRACT_REVIEW_TIER: governed rules text),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — maintainer's decision (「目前各车道都有fable,应该不需要你契约复审」), filed by triageThread-read: 6592417472
Premise: holds. On
origin/main,contract-review.mdstill gives triage the fallback (a)(b)(c), andcheck-owed-reviews.mjsstill names triage as a taker.Serial constraints cleared: no open PR touches these five files.
Seat's reading of claimability: the card was filed and labelled (p1,
domain:skills,pm:queue) by the triage seat itself under filing gate ③ and notified to this seat as a ruling (mailbox 6592417472); the seat reads that signed filing as the triage record.Tier S (
.claude/**) plus pm tooling. No new gate, label or patrol row, as the card says.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J
Claim widened (claim 6592453746) · 2026-11-03T00:56Z
The executor stopped before writing and measured on
main744211f: the triage round's owed-reviews step lives inreferences/triage-duties.md, notlanes/triage.md(which already says contract review is the lane's).File surface, added (stop on breach):
.claude/skills/pm-dispatch/references/triage-duties.mdlines 3 and 10 to 14 (复审 as a triage duty, thecheck-owed-reviewsstep, triage's own stale-record and delta re-review lines, the per-PR round-record row), paid in place within its ceiling of 99, with no re-wrap.Seat's rulings on the executor's three in-surface points:
project-forms.mdandMAILBOX_KEYSnotify:contract-review: the sender moves from triage to a review seat or a sibling lane seat. Triage takes no reviews, so it sends no review notices.contract-review.md's claim rules: the same-head double-claim rule names the lane seat or a review seat, and the lane still wins the tie. ThecontractReviewClaimscode stays untouched.review#Nordomain:<lane>#Nin place oftriage. Atriagetarget reads as unreadable, asdirectordoes today. TAKE names the lane seat or a review seat. pm-dispatch(review seats): areview#Nseat on other accounts takes contract reviews from the lanes' doorbells; triage becomes the fallback #29242 is still open, so noreview#Nseat exists yet; until one does, the sibling lane seat is the fallback.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J
Seat ruling amended (widened claim 6592498626, ruling 2) · 2026-11-03T01:52Z
The at-tier review of PR #29686 found that ruling 2 asked for two things that cannot both hold. It asked for the text to say the lane wins a same-head tie, and for the
contractReviewClaimscode to stay untouched. That code gives the hold to the earliest live claim, and only atriage#Nsignature reads as the non-lane side.Amended ruling 2: the text follows the code. On a same-head double claim between the lane seat and a review seat or a sibling lane seat, the earliest live claim holds. The later claimant withdraws by reply.
contractReviewClaimsstays untouched. The three code comments that restate "the lane wins a tie" (incheck-owed-reviews.mjs, including its summary string, and inrecord-recognisers.mjs) are corrected to the same sentence. Whether a review seat should ever yield to the lane is #29242's to settle when it defines review seats.Rulings 1 and 3 stand.
Generated by Claude Code