Skip to content

fix(pm): drop the cross-account review rule — the queue guard accepts a same-account Tier S record again, and contract-review.md stops requiring Reviewed-by-account - #25585

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-1qb5el
Oct 24, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-1qb5el

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #25568

Clause-②: no
Metadata-protocol: none

维护者速读(草稿)

What changed

File Change
scripts/pm/check-governed-queue-guard.mjs The #25436 account leg is reverted hunk for hunk: accountIndependence, the not-independent record state and its exit-3 refusal, independenceRefusalLines, the accounts compared clear line, the attributionLogin recogniser wiring, the header paragraph, and the account-independence self-test battery (10 cases; SELF_TEST_BATTERY_FLOOR 28 → 27). recordVerdict takes no attribution again. One assertion is added to the existing Tier S battery: a project-thread PR (body carries the attribution login) whose record was written from the SAME account — the record even still carries a Reviewed-by-account: line naming that login — CLEARS, record.state === 'stands', and the rendering prints no account comparison. Self-test: 335 cases pass (344 before, minus the 10 removed, plus this one).
scripts/pm/record-recognisers.mjs readReviewedByAccount, readAttributionLogin, REVIEWED_BY_ACCOUNT_LINE, the locator's account field and the #25415 battery are removed (7 cases; floor 13 → 12). git grep over the whole tree finds no other caller of any of them. Self-test: 201 cases pass (208 before). --template never printed an account line, so the copyable record is unchanged.
.claude/skills/pm-dispatch/references/contract-review.md Six lines deleted (55 → 49; ceiling 60): the Tier S other-account requirement, the Reviewed-by-account: line, the prose-face TIER_DEFAULT-from-another-account record, the 「① 在项目席另加 … 队列守卫同判」 condition, and the two-line 「过渡」 substitute (moot once ① owes no second account). The session-independence line (Implemented-by: ≠ Reviewed-by:) stays, as do 「轮次报告设复审清单专节」 and 「落地前检两条」.

After the edit, git grep -n 'Reviewed-by-account\|另一账户\|25415' -- .claude scripts names nothing; a whole-tree grep for the same words and for the removed symbol names names nothing either. The prose-face TIER_DEFAULT line goes with the rule: #25422 added it only as the vehicle for the other account's review, and without the account requirement the prose face falls back to the reading the file already states (the dispatching seat's ACCEPT, sentence by sentence against the diff).

Not in scope, unchanged: the Tier H landing leg (authorized approval), the human-merge size line, the record shape otherwise, and every Tier H file.

Acceptance (card #25568)

Gates

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack --paths (the three paths) derived 42 families (23 pnpm, 19 direct node; 32 matched by path, 2 by change kind, 8 whole-tree). Every command was run with the capture idiom and its exit code recorded beside it; --ran reconciles 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN. One family, pnpm --filter @objectstack/lint run check:doc-formula-expressions, exited 3 (prerequisite not met: @objectstack/formula and @objectstack/lint unbuilt in a fresh install) on the first pass and 0 after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint. Not measurable locally and left to CI, as the tool prints them: check-closing-target-claim, check-shard-attestation, check-test-completeness (values from the workflow), the Test Core shard job, and the 16 changeset-scoped families (no changeset: skip-changeset).

node scripts/pm/check-governed-merges.mjs --test on the three paths: GOVERNED, Tier S — .claude/** ×1 (contract-review.md); the two scripts are off the register. Size 24 additions / 264 deletions, far under the 3000-line human-merge line. skip-changeset declared on the pr_create stroke: .claude/** and scripts/pm/** ship in no published package.


Generated by Claude Code

… a same-account Tier S record again, and contract-review.md stops requiring Reviewed-by-account

The maintainer's word of 2026-10-24 01:16Z: 「守卫在合并队列里只认「另一账户复审」,这个没必要,去掉这条规则」.

- check-governed-queue-guard.mjs: revert the account leg (accountIndependence, the
  not-independent refusal, the account lines in refusal and clear, the attribution
  wiring, the header paragraph, the account-independence battery; floor 28 → 27), and
  pin the new reading with one assertion in the Tier S battery: a project-thread PR
  whose record was written from the same account clears on tier alone.
- record-recognisers.mjs: revert readReviewedByAccount, readAttributionLogin,
  REVIEWED_BY_ACCOUNT_LINE, the locator's account field and their battery (floor 13 → 12).
- contract-review.md: delete the six lines that required a second account (the Tier S
  other-account rule, the Reviewed-by-account line, the prose-face TIER_DEFAULT record
  from another account, the ① project-seat condition and the two-line 过渡 substitute).
  Session independence (Implemented-by ≠ Reviewed-by) stays.

Claude-Session: https://claude.ai/code/session_018UunQYGRd5yu6puARCJBk9
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 24, 2026
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation labels Oct 24, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Amendment to the PR body (the dev writes the body once; corrections go here).

One sentence in the body is wrong. Under 「What changed」 the body says that after the edit, git grep -n 'Reviewed-by-account\|另一账户\|25415' -- .claude scripts names nothing. That reading was taken before the regression assertion was added and is false after it: on head dea17d5745 the grep names four lines in scripts/pm/check-governed-queue-guard.mjs — L4154, L4157, L4161 and L4169 — all inside the new self-test case in the Tier S battery. L4154 and L4157 are the case's comment (the maintainer's quoted sentence, and the word 「另一账户」 inside it); L4161 plants a Reviewed-by-account: line in the fixture record so the case proves the guard ignores it; L4169 asserts the rendering never prints that key or an account comparison. They are the pin that keeps the retired leg retired, not a remnant of the rule: no rule text, reader, refusal line or clear line carries the words, and the .claude/** tree names nothing. The whole-tree grep for the removed symbol names (accountIndependence, readReviewedByAccount, readAttributionLogin, REVIEWED_BY_ACCOUNT_LINE, independenceRefusalLines) still names nothing. Everything else in the body stands as written.

Head moved once: origin/main (ce18e734, one commit, none of the three files) was merged in as dea17d5745 per the claim's 「Merge main before asking for review」. On that head: guard self-test exit 0 (335 cases), recogniser self-test exit 0 (201 cases), pnpm check:pm-skill-ratchet exit 0, trailer check exit 0 (2 commits, model-free pair).


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: dea17d576903707a56eb16dc71c9b07a0dfc7775
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/contract-review.md + scripts/pm/check-governed-queue-guard.mjs and scripts/pm/record-recognisers.mjs (the gate the deleted rule was enforced by, read as one change with the rule), scripts/pm/check-skill-line-ratchet.mjs L550 (the ceiling row the shrink touches), scripts/pm/check-governed-merges.mjs GOVERNED_SURFACES (the tier register, read statically), .claude/skills/pm-dispatch/references/dispatch-runbook.md L44–L46 and references/project-forms.md L9/L28 (the cross-account patrol lines that survive), commit 041a120b61 (#25436, the revert map) and commit 5497d4ad43 (#25422, the source of the deleted rule text)

Written 2026-10-24T02:01Z by an isolated contract-review subagent of domain:skills seat 2. Inputs: card #25568 (body and its one comment, claim 6378095856), PR #25585 (body, file list, git diff origin/main...dea17d5769 with origin/main = ce18e73483), the dev's body amendment 6378419139 (read as a claim, judged below), the head's check-runs (polled until none was in progress, the reads listed under ①), git show 041a120b61 (#25436), and the maintainer ruling 6378076465 on PR #25552 quoting the maintainer verbatim: 「守卫在合并队列里只认「另一账户复审」,这个没必要,去掉这条规则」 (2026-10-24T01:16Z), 「立skills卡」. The dispatch order and the dispatching seat's conclusions were not inputs. Nothing was built, run or re-run locally: the tier was read off the register's source, the self-tests and the ratchet off the head's check-runs.

① Derived judgments

The guard change is a faithful revert of #25436's account leg and nothing else. git diff 041a120b61^ dea17d5769 -- scripts/pm/check-governed-queue-guard.mjs scripts/pm/record-recognisers.mjs is exactly one hunk: the 18-line regression case at L4154–L4171 of the guard. Everything else in both files is byte-identical to the tree before #25436 landed (git log 041a120b61..origin/main -- scripts/pm/check-governed-queue-guard.mjs scripts/pm/record-recognisers.mjs is empty, so no later commit's hunks had to be re-woven). Concretely, on the head: accountIndependence, the not-independent state, independenceRefusalLines, the 「accounts compared」 clear line, the attributionLogin recogniser wiring and its missing key, the attribution parameter of recordVerdict, the attribution read in runGuard, the header paragraph and the 10-case battery are gone; recordVerdict ends at return { state: 'stands', ...found } as it did before #25436, and the three refusal branches that remain (below-tier, unreadable, unsigned) are untouched. The approval limb and the size line are untouched. In record-recognisers.mjs: readReviewedByAccount, readAttributionLogin, REVIEWED_BY_ACCOUNT_LINE, GITHUB_LOGIN, ATTRIBUTION_LINE, the locator's account field, the two header-roster lines and the 7-case battery are gone; --template output is unchanged (the template never printed an account line). Right.

Leftover references. git grep -i on the head over scripts/, .claude/, .github/, AGENTS.md, docs/ for accountIndependence, not-independent, attributionLogin, readReviewedByAccount, readAttributionLogin, REVIEWED_BY_ACCOUNT_LINE, independenceRefusalLines, #25415/25415, github_login, attribution (under .claude), 「另一账户」, 「同账户」, 「长期授权」 names nothing except four lines inside the new regression case of check-governed-queue-guard.mjs: L4154 (the maintainer's sentence quoted in the case comment, which contains 「另一账户」), L4157 (comment), L4161 (the fixture plants Reviewed-by-account: in the record so the case proves it is ignored), L4169 (the assertion that the rendering never prints that key). No reader, rule line, refusal line or clear line carries the words; the .claude/** tree and .github/** carry none. The dev's amendment 6378419139 makes exactly this claim (four lines, those four numbers, fixture and comment, nothing else) and it is true on the head. Right.

Self-test floors. Guard: one battery removed (10 cases), SELF_TEST_BATTERY_FLOOR 28 → 27, and the 「Raised 27 → 28」 comment line goes with it — one battery, one row, the convention the comment block states. Recognisers: one battery removed (7 cases), floor 13 → 12, same shape. Both match the batteries actually removed. The regression case is added to the existing Tier S battery 「⭐ #18020 → #19133 Tier S: a review of record, not an approval」 whose pinned count stays 43 (the pin is a floor — the roster check passes a battery whose registered count is at or above its pinned number — so 44 against 43 passes); see ③ for the one consequence. Right.

The regression assertion is meaningful. recordComment() on the head emits the exact line 'Reviewed-by: session_01SEAT' (L4097), so the .replace plants a real Reviewed-by-account: lane-account-a line; the PR body fixture carries claude-projects-attribution with the same login; the case drives the live runGuard on merge_group and asserts exit CLEAR, conclusion cleared, record.state === 'stands', and that renderGuardVerdict prints none of Reviewed-by-account, accounts compared, SAME account — the render never quotes comment bodies, so those strings can only come from guard-generated text. On main this same fixture reads attribution = read(lane-account-a), account = read(lane-account-a), same-account → not-independent → exit 3, so the case discriminates the two trees; the dev's ablation claim (re-applying the #25436 hunks reds this one case) is consistent with that reading and was not re-run here. It pins the retired leg retired. Right.

contract-review.md: exactly the six lines, and nothing dangles. Deleted on the head: L36 「项目席落地的 Tier S:Reviewed-by: 须属 PR 作者外的账户;同账户子代理只算复核。」, L37 「作者账户 = PR 正文 attribution 的 github_login;记录另带 Reviewed-by-account: 行写复核账户。」, L38 「只动散文面、不欠契约复核的 PR 同欠另一账户一条 TIER_DEFAULT 记录;⛔ 散文面无豁免。」, L41 「① 在项目席另加:Reviewed-by-account: 的登录须异于 PR attribution 的登录,队列守卫同判。」, L42–L43 「过渡:无另一账户在席时,① 的替代 = 维护者本人在执行线程的话:逐个点名 PR 编号,/ 或对该席位的 Tier S 长期授权(一句可撤)。」 — the same six the ruling enumerates by text; the ruling's line numbers (L38/L39/L40/L43/L44–45 「main 041a120」) are two high against that tree, where the lines sit at L36/L37/L38/L41/L42–43 exactly as on origin/main, so the text, not the numbers, was matched. Kept: L35 「独立性对:Implemented-by:/Reviewed-by: 取值同见 --template;子代理记采纳它的席位。」 (session independence, which the ruling says stays), L36 「轮次报告设复审清单专节…」, L37 「落地前检两条…① 达档条款②复核 PASS 在案(同形记录)。」, L38–L39 the 例外, L40 「② PR check 全绿…」. Read line by line, no surviving line refers to a removed one: ① now means only 「达档条款②复核 PASS 在案」, ② is the CI line, the 例外 points at 「上列散文面」 (L9–L10, present). 55 → 49 lines. On the prose-face TIER_DEFAULT line: #25422's own body introduced it as part of its item ① (「只动散文面的 PR 同样欠另一账户一条 TIER_DEFAULT 记录」), i.e. as the vehicle for the other account's review and nothing else; with the account rationale gone, keeping it would contradict L20 「四面皆不碰 ⇒ CI 加席位自读 ⛔ 不起第二个 agent」 and L10 (prose faces are the dispatching seat's ACCEPT). Deleting it is right.

Elsewhere under .claude/skills/pm-dispatch/**. No line requires a second account for a Tier S landing and none cites the deleted lines. Three lines still describe a cross-account patrol that #25422 (item ③) and #25427 added alongside the rule: dispatch-runbook.md L44 「跨账户复审:每项目巡查跑 is:pr is:open label:needs:contract-review,剔除本账户署名的 PR。」, L45 「复核前在 PR 留 Claim: 形评论(会话、账户);已有他账户的认领即跳过,⛔ 不双做。」 (L46 「复核照 contract-review.md;PASS 同笔摘标记…」 is account-neutral), and project-forms.md L9 「车道席:认领、派发、PR、跨账号复审;…」 / L28 「项目聊天里的长句(「本账户坐 X;Y 的 PR 由本账户复审」)是等价写法。」. They are a duty roster (who may pick up a PR awaiting review), not a landing condition; they are coherent with the head (the marker section L45–L49 still exists, in-seat review still covers a seat's own PRs), and they were not matched by the card's prescribed grep (Reviewed-by-account\|另一账户\|25415) nor named by the ruling. Not a defect of this PR; named under ③ as a follow-up.

Ratchet. check-skill-line-ratchet.mjs L550 keeps ['.claude/skills/pm-dispatch/references/contract-review.md', 60]; the file is 49 lines (headroom 11). The ratchet discipline (script header L64–L65) is 「A ceiling may be LOWERED by any PR that shrinks its file — lowering is always legitimate and encouraged」 — may, not must; #25422 itself left the row at 60 while landing 54. Leaving it is within convention; lowering it to 49 is encouraged and is the seat's call (③). Right as it stands.

Commit trailers and rule text. Branch commit 9522958a0e carries Claude-Session: and Co-authored-by: Claude (the noreply address) — the model-free pair, no model identifier. The merge commit dea17d5769 carries no trailer, which check-commit-card-trailers.mjs reads as clean (its own self-test, 「the merge commit os-regen-merge writes carries no trailer at all and is clean」). The diff adds no rule text at all (contract-review.md is deletions only); the only added lines are the self-test case in a script, whose fixture login lane-account-a is a fixture, not a real login. Right.

Tier and surface. The PR's three paths against the register on the head: .claude/skills/pm-dispatch/references/contract-review.md hits row claude-tree (.claude/**, GOVERNED_TIER_S, tierRepos: ['objectstack']); the two scripts/pm/** files hit no row. Tier S, one .claude/** hit, governed-rules face ⇒ CONTRACT_REVIEW_TIER. No Tier H path. +24/−264, far under the human-merge size line. Right.

Merge. The head is a merge of 9522958a0e with origin/main ce18e73483 (#25560, four files, none of the three here); the net diff against origin/main is exactly the three files. Right.

Check-runs on this head. Read 2026-10-24T01:53Z: 23 runs, 12 in progress. Read 2026-10-24T01:56Z: 37 runs, 7 in progress. Read 2026-10-24T01:57Z (twice): 38 runs, 4 then 3 in progress. Read 2026-10-24T01:58Z: 38 runs, 2 in progress (Test Core (1/6), Lint · PM dispatch-gates). Last read 2026-10-24T02:00Z: 39 runs — 29 success, 9 skipped, 0 failed, 1 still in progress (Test Core (1/6), started 2026-10-24T01:53Z). Every gate this diff reaches is already green: Governed Surface Queue Guard (runs the guard self-test first, then the pull_request leg), Lint · repo & tooling gates (carries check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-record-recognisers, check:pm-governed-prose), Lint · PM dispatch-gates (frame-sync and frame-freshness), Lint · scoped · tooling self-tests, Lint · ESLint, the two required aggregates Lint & Repo Gates and TypeScript Type Check, The card this PR closes must claim this branch, No other open PR may claim the same issue, Check PR Size; Check Changeset is skipped under skip-changeset; Test Core 2/6–6/6 are success. The one open shard exercises workspace package tests that this diff (no package file) cannot change; this record's verdict is on rule content and does not wait on it, but the seat's landing check ② (「PR check 全绿」) does: the seat confirms Test Core (1/6) success before queueing, and a red there is judged by the merge-base signature rule, not re-reviewed here.

② Semver level

No published package is touched: .claude/** and two scripts/pm/** gates ship in no package. No .changeset file in the diff; the skip-changeset label is on the PR and Check Changeset is skipped under it — the right form for this repository. Clause-②: no is correct: the change widens the accept set of a CI gate (the queue guard stops refusing a same-account record), not of any published schema or API, and declares no narrowing. Metadata-protocol: none is correct. PASS.

③ Boundary flags

Implemented-by: claude/project-thread-1qb5el
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS — the revert is byte-exact against the pre-#25436 tree plus one discriminating regression case, the six rule lines the ruling names are the six deleted and session independence stays, floors match the batteries removed, no rule text or .claude/** line still requires a second account, and every completed check-run on this head is green or skipped with every gate the diff reaches among them (one Test Core shard was still running at the last read — the seat's ② check, not this verdict's). Follow-ups under ③ are not conditions.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#2 · os-elon-musk · session_01REMuzhz6MWRjg8uohedMnM · 2026-10-24T02:03Z · head dea17d576903707a56eb16dc71c9b07a0dfc7775 · Tier S (.claude/** ×1; the two scripts/pm/** files are off the register; no Tier H path)

Landing authority: the maintainer's standing Tier S word in this seat's thread of the Claude Code project "Objectstack" (os-elon-musk account), 2026-10-23T14:14Z: 「后续按 pm-dispatch 规则审核通过的都可以落地」. The change itself is the maintainer's ruling of 2026-10-24T01:16Z in the 待决策汇总 thread, recorded on PR #25552 as comment 6378076465: 「守卫在合并队列里只认「另一账户复审」,这个没必要,去掉这条规则」, 「立skills卡」.

  1. Shape: draft, base main, Fixes #25568 the only closing keyword, skip-changeset; author objectstack-fleet[bot] (relay-opened); body corrected by the dev's amendment 6378419139 (its head dea17d5745 is a typo for dea17d5769; nothing judged changes).
  2. Premise measured: PR docs(pm-dispatch): every card carries a business rationale the 分诊席 judges, every card is triaged (pre-applied labels are a suggestion), and a seat verifies a card's premise before dispatch #25552's merge-group run 40046346946 refused its same-account record under feat(pm): the queue guard refuses a project-thread Tier S record reviewed from the PR's own account #25436's account leg; the card quotes the ruling verbatim.
  3. Gates (check-runs pinned to this head): 40 check-runs, all completed — 31 success, 9 skipped, 0 failed; Test Core (1/6), still running when the record was written, finished success.
  4. Contract review: CONTRACT_REVIEW_TIER PASS on this head, 6378508555: byte-exact revert of feat(pm): the queue guard refuses a project-thread Tier S record reviewed from the PR's own account #25436's two-script hunks plus one discriminating regression case; floors 28→27 and 13→12 match the batteries removed; the six cross-account lines of contract-review.md are the six deleted, session independence stays.
  5. Accepted deviations: none. contract-review.md falls 55→49 under a ceiling of 60; lowering the ceiling is optional and left to a later edit of that file.
  6. Carried (follow-ups, not conditions): the cross-account review patrol lines in dispatch-runbook.md L44–L45 and project-forms.md L9/L28 describe who may pick up a PR awaiting review, not a landing condition; this seat raises them with the next skills edit. The Tier S battery's pinned case count stays 43 while it holds 44.
  7. Landing: this PR's own queue run is judged by the guard it ships (the merge_group job checks out the merge-group commit). This seat flips ready and arms auto-merge now; once it merges, PR docs(pm-dispatch): every card carries a business rationale the 分诊席 judges, every card is triaged (pre-applied labels are a suggestion), and a seat verifies a card's premise before dispatch #25552 is re-armed.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 24, 2026 02:04
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 24, 2026 02:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants