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
Commit 6e66dd4
Browse filesBrowse the repository at this point in the historyBrowse files
docs(pm-dispatch): contract review r0's three should-fixes for the review seats
S1: SKILL.md's lane table names the review seat beside security on the same
row (333 bytes, within the 341-byte row pin; 319/319 lines) and points at
lanes/review.md, so the charter has an entry point from the skill itself.
S2: check-owed-reviews reads the PR's own accounts (the body's attribution
login and the signer of each Claim: comment on the card) and bars a review
seat seated on either; with every seated review seat barred the lane's own
seat takes at once (state `barred`, named in the row), never a further round.
Four new self-test pins (82 cases).
S3: the mailbox-open comment above SEAT_LANE_KINDS says "The same four words".
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzhXV3ABCbTkU1iRRn7
'the owed face: paths, the Clause-② line, the label — drafts included, nothing else owes': 9,
534
574
'the record: on this head (by whom, as stated), on an earlier head, none, unjudged': 8,
535
575
'the triggers: (a) hand-off or label the same round, (b) a full round, (c) the lane seat': 10,
536
-
'review-seat first: a seated review seat takes before the lane, the lane joins after a further round, and takes alone while none is seated': 10,
576
+
// 10 → 14: S2 of PR #29967's contract review — a review seat on the PR's own account is barred (`lanes/review.md` 独立性).
577
+
'review-seat first: a seated review seat takes before the lane, the lane joins after a further round, and takes alone while none is seated': 14,
537
578
'a live claim holds the head and a record settles it; a lapsed claim holds nothing': 6,
538
579
'the live instance: two Tier H drafts with a hand-off on the current head list as TAKE under (a)': 4,
539
580
'the live read: every read through one reader; a failed read is INCOMPLETE, never clean': 6,
@@ -645,6 +686,13 @@ export function selfTest() {
645
686
t('the roster unread: either is named, as before, and the row says unknown',(()=>{constr=rv({headCommittedAt: '2026-10-28T11:59:00Z'},null);returnr.reviewSeat==='unknown'&&r.taker==='the domain:ui seat or a review seat';})());
646
687
t('a hand-off names its seat whatever the roster says — a sibling lane seat under a seated review seat included',rv({headCommittedAt: fresh,comments: [handoff(HEAD,'2026-10-28T12:40:00Z','domain:ui#2')]}).taker==='domain:ui#2'&&rv({headCommittedAt: fresh,comments: [handoff(HEAD,'2026-10-28T12:40:00Z')]},SEATED).taker==='review#1');
647
688
t('⭐ a live claim by a review seat ⇒ HELD on the review side, no taker, nobody else starts',(()=>{constr=rv({labels: [{name: WAITING_LABEL}],comments: [claimRow(REVIEWER,HEAD,'2026-10-28T12:18:56Z',`review#1 · os-zhuang · ${REVIEWER}`)]});returnr.status==='HELD'&&r.claim.holder.side==='review'&&r.taker===null&&renderRow(r).includes('(review,');})());
689
+
constATTR='<!-- claude-projects-attribution: {"github_login":"OS-Support-AI"} -->\n_Requested by **Y**_\n\nPart of #25922\n\nClause-②: no\nMetadata-protocol: none';
t('⭐ own accounts: the body\'s attribution login (lowercased) and the signer of each Claim: comment on the card; an unsigned or non-claim card comment, an unreadable attribution and no body name none',[...ownAccountsOf({body: ATTR,card: 25922,cardComments: [...CLAIMED,{body: 'os-dev-report\n{}'},{body: 'domain:ui#1 · os-ui · session_01Abcdefgh\n\nnote'}]})].sort().join()==='os-support-ai,os-zhuang'&&ownAccountsOf({body: '<!-- claude-projects-attribution: {"github_login":} -->'}).size===0&&ownAccountsOf({}).size===0);
693
+
t('⭐ S2: the only seated review seat sits on the IMPLEMENTING account ⇒ barred, the lane\'s own seat takes at once — no further round, no triage',(()=>{constr=rv({body: ATTR,headCommittedAt: fresh,labels: [{name: WAITING_LABEL}]},OWN);returnr.status==='TAKE'&&r.reviewSeat==='barred'&&r.reviewSeats.length===0&&r.reviewBarred.join()==='review#1'&&r.taker==="the domain:ui seat (review seat review#1 is on this PR's own account)"&&!/triage/.test(renderRow(r))&&renderRow(r).includes('review seat barred (barred review#1)');})());
694
+
t('⭐ S2: a review seat on the DISPATCHING account (the card claim\'s signer) is barred too; a review seat on a third account still takes first, the barred one named',(()=>{constr=rv({card: 25922,cardComments: CLAIMED,headCommittedAt: fresh,labels: [{name: WAITING_LABEL}]},[...SEATED,{lane: REVIEW_LANE,seat: 1,status: 'seated',account: 'OS-Zhuang'},{lane: REVIEW_LANE,seat: 2,status: 'seated',account: 'os-other'}]);constalone=rv({card: 25922,cardComments: CLAIMED,headCommittedAt: '2026-10-28T10:59:00Z'},[...SEATED,{lane: REVIEW_LANE,seat: 1,status: 'seated',account: 'os-zhuang'}]);returnr.reviewSeat==='seated'&&r.reviewSeats.join()==='review#2'&&r.reviewBarred.join()==='review#1'&&r.taker==='a review seat (review#2) first'&&alone.taker==="the domain:ui seat (review seat review#1 is on this PR's own account)";})());
695
+
t('S2: the lane seat gone and the only review seat barred ⇒ the lane\'s next seat; a review seat with no account on its post is never barred',rv({body: ATTR,headCommittedAt: fresh},[{lane: REVIEW_LANE,seat: 1,status: 'seated',account: 'os-support-ai'}]).taker==="the domain:ui seat next on duty (review seat review#1 is on this PR's own account)"&&rv({body: ATTR,headCommittedAt: fresh,labels: [{name: WAITING_LABEL}]},[...SEATED,{lane: REVIEW_LANE,seat: 1,status: 'seated',account: null}]).taker==='a review seat (review#1) first');
648
696
t('the printed row carries the review-seat reading and the taker',renderRow(rv({headCommittedAt: fresh,labels: [{name: WAITING_LABEL}]})).includes(`review seat seated review#1,review#2 → (a) label · take: ${BOTH} first`)&&renderRow(rv({headCommittedAt: fresh,labels: [{name: WAITING_LABEL}]},SEATED)).includes('review seat absent → (a) label · take: the domain:ui seat (no review seat seated)'));
649
697
650
698
battery('a live claim holds the head and a record settles it; a lapsed claim holds nothing');
0 commit comments