Skip to content

docs(pm-dispatch): merge main before landing a label PR when a new locale landed under it - #31536

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-7j7fys
Nov 8, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-7j7fys

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Steedos · project thread

Fixes #31512

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:在落地规则里加一条:新增或修改显示标签的 PR,如果它最后一次绿的 PR 检查之后 main 上又落了一个新语种的翻译包,席位在挂自动合并或入队之前必须先合入 main 并重跑检查。
  • 为什么改:今天 pt-BR 和 ru 两个新语种包先后落地,压在两个标签 PR 底下;这两个 PR 自己的检查是绿的,进队列后翻译门禁变红,连带后面排队的 PR 被踢出 6 次。
  • 风险与回滚:只改席位落地手册的一个文件,不动代码、门禁与仓库设置;回滚即撤销本提交。为守住行数上限,删了两行在别处已有原文的旧规则。
  • 先看:.claude/skills/pm-dispatch/references/landing-operations.md 第 29 行与第 33–34 行(新规则),以及被删的两行(第 57、65 行旧位)。
  • 两分钟验证:pnpm check:pm-skill-ratchet,预期 landing-operations.md 为 102 行、上限 102、退出码 0。
  • 需要你做的:无,席位落地。

What changes

  • landing-operations.md §入队与落地:
    • The stale-base branch of the queue-red disposition (L29, "基上缺已合修复 ⇒ merge main") now names the case: a new locale bundle landing under the PR, which reds the translation gates, belongs to that branch (re-running cannot clear it).
    • New pair at the end of that section: a label PR whose last green PR run predates a new locale bundle on main merges main and re-runs before auto-merge is armed or it is enqueued. This is an exception to the platform-readings rule that a behind PR enqueues as usual. "Label" means the display labels the two translation gates count, named by their lint.yml step ids check-generated-translation-bundles (L6361) and check-no-new-untranslated-declared-labels (L6378): platform-objects objects, settings manifests, spec-declared labels.
  • Line ratchet: the file is 102/102 with headroom 0, so the two new lines are paid by deleting two lines whose content is already stated elsewhere. Nothing was re-wrapped, and every touched line is at most 120 bytes.
    • Deleted the mergeable_state dirty re-read before arming. The same file states it at the PR-open-to-MERGED read ("dirty ⇒ 当即合 origin/main 推新提交") and in the zero-enqueued check ①; platform-readings.md states "dirty 即入队否决"; the generated-artifact half is the next line ("非零 ⇒ 按 A 的固定序").
    • Deleted the post-merge closed_by_pull_requests read. platform-readings.md §闭合关键词解析 states it ("消费侧检查 = 合并后读 closed_by_pull_requests"), and this file keeps the open-card reconciliation line, which checks the same mis-close.
  • Not done: the optional check:i18n-coverage derivation beside check:i18n in scripts/pm/dispatch-gates.data.mjs. It is not a one-row change. The row's self-test pin counts the section's lines (i18nHit.length === 3), so that pin and the docblock on the two i18n entries would also move. The gate also needs a full pnpm build before it reads anything, which every platform-objects card would then pay. And open PR ci(docker): publish an on-demand public framework build base image #31454 edits the same self-test file. A local run would also sit on the same stale base, so it would not have caught either red.
  • An option the card raised, which is not written as a rule here: the repository setting "require branches to be up to date before merging" would also cover this. That is the maintainer's call.

Tests

None: this is a prose rule in a .claude/** reference, with no tested behaviour to ablate.

Acceptance notes

Verification

Derived gates at head b65ebb6 (17 of 17, all exit 0)

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 17 commands. Each one exited 0, and --ran reconciled 17 derived, 17 run, 0 NOT-MEASURED. Prerequisite: a locked turbo run build --filter=@objectstack/formula --filter=@objectstack/lint (VERDICT command-exit 0).

check:pm-skill-ratchet: landing-operations.md is 102 lines (ceiling 102, headroom 0), and its widest table row is 0 bytes (pin 0).


Generated by Claude Code

…cale landed under it

A translation bundle for a new locale that lands on main after a
label-declaring PR's last green PR run makes every declared label owe one
more translation, so the merge-group build reds both translation gates and
ejects the stack behind it. State the landing rule beside the stale-base
branch of the queue-red disposition, and pay the two lines by deleting two
that are restated elsewhere (the dirty re-read, held by the PR-open-to-MERGED
read and platform-readings; the closed_by_pull_requests read, held by
platform-readings and the open-card reconciliation line).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsR2jRG212pSNYcqZAmR1Q
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 8, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Nov 8, 2026

Copy link
Copy Markdown
Collaborator

Contract-review-claim: session_01QsR2jV5sBSzCYNEDgpYLJw · head b65ebb6 · 2026-11-08T13:41:06Z


Generated by Claude Code

Copy link
Copy Markdown
Collaborator

director#1 · zhuangjianguo · session_01QsR2jV5sBSzCYNEDgpYLJw

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b65ebb6f857f57e18335ead8449a0adc563f950d
Local-runs: none beyond counts and reads — wc -l on the file at this head against origin/main (102/102), wc -c on the three added lines (116, 118, 117 B), git merge-base --is-ancestor on origin/main for the two locale merge commits against the two merge-group bases, git log --first-parent of main around them. No gate run.
Scope: .claude/skills/pm-dispatch/references/landing-operations.md (L29 extended; L33–34 added; old L57 and L65 deleted; L58–73 read at this head); read on origin/main: platform-readings.md L23–27 (mergeable_state readings, dirty 即入队否决 L25), L86–90 (behind 照常入队 L88), L434–438 (closed_by_pull_requests L436), .github/workflows/lint.yml L6350–6400 (the two step ids, continue-on-error: true, pnpm check:i18n / pnpm check:i18n-coverage); GitHub: PRs #31440, #31466, #31435, #31448 (merge commits, merged_at, files), runs 42461308826, 42463926000, 42470886353, 42474612084; card #31512, devx claim 6721389718, devx reading 6721491029, retriage 6721525572, devx report 6721526416, skills claim 6721961688, report 6722184296.

① Contract against the card as retriaged

  • Triage 6721525572 withdrew the original Ask (PR-side wiring) on the devx reading 6721491029 and set the new one: a landing rule — when a new locale bundle has landed on main since a label PR's last green run, the seat merges main and re-runs before queueing. Carrier: the pm-dispatch landing references. The diff is exactly that, in landing-operations.md §入队与落地: L29 names the case inside the stale-base disposition, L33 states the pre-arm / pre-enqueue rule and its relation to behind, L34 defines "label" by the two lint.yml step ids. ✓
  • Not done, with reasons that hold: the optional check:i18n-coverage derivation (not a one-row change; the self-test pin counts the section's lines; open PR ci(docker): publish an on-demand public framework build base image #31454 edits the same self-test file; a local run sits on the same stale base and would not have caught either red); the repository "require branches up to date" setting (the maintainer's call, raised on the card). platform-readings.md L88 is outside the surface; the new line names itself the exception. ✓
  • Line-neutral 102/102 (headroom 0); added lines ≤ 118 B; no re-wrap. Clause-②: no, Metadata-protocol: none, skip-changeset. ✓

② The two deletions (point 1)

  • Old L57 「再读 mergeable_state:dirty ⇒ 先 merge origin/main 再挂;生成物在面上按 A 的固定序」: the dirty half is this file's L71 (「dirty ⇒ 当即合 origin/main 推新提交,⛔ 不等冲突通知」, which applies to every look from PR-open to MERGED, so before arming too), its zero-enqueued check ① (L60, 「mergeable_state 是否 dirty」) and platform-readings.md L25 (「dirty 即入队否决」); the generated-files half is the next line L58 (「挂 auto-merge 的同一动作里重测生成物漂移…非零 ⇒ 按 A 的固定序」). Nothing lost. ✓
  • Old L65 「同刻读相关卡 closed_by_pull_requests,确认没有卡被正文闭合关键词误关」: platform-readings.md L436 (「消费侧检查 = 合并后读 closed_by_pull_requests,在复核清单里」) states the read, and this file keeps L67 (open-card list against the expected diff: a card gone from open unexpectedly is a silent closing-keyword mis-close), which checks the same failure from the other side. Nothing lost. ✓

③ The behind rule (point 2)

  • platform-readings.md L88: a behind PR enqueues as usual; the seat does not call pr_update_branch for it. New L33 carves one exception, stated on the line itself (「behind 例外」) and bounded three ways: the PR is a label PR (L34's definition), its last green PR run predates a new locale bundle on main, and the remedy is the same merge main the stale-base disposition at L29 already prescribes (a pushed commit, not pr_update_branch). Outside those three conditions L88 stands untouched. No other collision: L29's branch is the post-red disposition and L33 is the pre-enqueue prevention of the same case, consistent with each other. ✓

④ The measured cause (point 3)

⑤ Tier, serial, CI

  • Tier S: .claude/** on this repository lands on the owning seat's contract-tier review of record. Built at the default tier per the order; recorded, not a finding.
  • Serial: none claimed on the file. mergeable: true, merge-base = current main. CI at this head when read: 16 success, 22 skipped, 5 in progress, 0 failures; the seat's 17 derived gates exit 0 at this head, ratchet 102/102.

⑥ Findings

  • Must-fix: none.
  • Should-fix: none.

Implemented-by: claude/project-thread-7j7fys
Reviewed-by: session_01QsR2jV5sBSzCYNEDgpYLJw

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

维护者速读

  • 改了什么:落地规则加一条。标签 PR 上次 PR CI 绿之后,如果 main 新落了语种包,挂自动合并或入队之前先合一次 main,再重跑 CI。这里的标签 PR 指改了两道翻译门禁会数到的显示标签的 PR。它是「落后于 main 照常入队」的例外。队列里已经因为这个原因变红时,归入「基上缺已合修复 ⇒ merge main」那一支处理。
  • 为什么改:今天合并队列被挤出 6 次,根因只有 2 个 PR(Queue: the two translation-bundle lint gates red only in the merge queue, so a PR that declares an untranslated label passes its own CI and ejects its stack (6 ejections on 2026-11-08) #31512)。两次都是新语种包(pt-BR、ru)在标签 PR 最后一次绿跑之后才落地,于是每个新标签都少了一份翻译。PR 自己的 CI 不可能看到它基座上还没有的语种。
  • 风险与回滚:只改一个规则文件,行数不变(102/102)。删掉的两行在别处都还有原文:dirty 重读见本文 L71 与 platform-readings L25,closed_by_pull_requests 见 platform-readings L436。零代码,回滚即 revert 本 PR。
  • 先看:.claude/skills/pm-dispatch/references/landing-operations.md 〈入队与落地〉 L29、L33–34。
  • 两分钟验证:pnpm check:pm-skill-ratchet 退出 0;git grep -n '新语种包' .claude/skills/pm-dispatch/references/landing-operations.md 命中两行。
  • 需要你做的:无。这是 Tier S,契约复核已通过,由席位自己落地。卡上提到的仓库设置「要求分支与 main 同步」仍由你决定,本 PR 不改它。
  • 席位意见:ACCEPT。契约复核 PASS(记录 6722227989,Head b65ebb6f,无 must-fix / should-fix)。总监在 GitHub 上核过两次的祖先关系,确认根因就是语种包晚于绿跑落地。

席位核对

Head-sha: b65ebb6f857f57e18335ead8449a0adc563f950d

  1. Shape: draft, base main, body carries Fixes #31512, skip-changeset. 1 file, +3/−3, line-neutral (102/102). Tier S (.claude/**).
  2. Premise measured: the devx reading 6721491029 and the triage retriage 6721525572 withdrew the PR-side wiring ask. The director re-verified the cause on main's first-parent history: deac7f4 (pt-BR) lies under the 08:40Z red group's base 1ff9944, after feat(plugin-auth): no user-context restore of an API key revoked because its owner's membership ended #31435's 08:03Z green run; 2ae3e30 (ru) lies under the 11:11Z group's base a61ddc9, after feat(plugin-auth,platform-objects): per-provider SSO sign-in options; invite_only refuses an uninvited SSO sign-in unless the provider allows JIT #31448's 10:18Z green run.
  3. Gates: contract review at CONTRACT_REVIEW_TIER: PASS, record 6722227989 on this head. Dev gates: 17 derived, 17 exit 0; the 4 body gates exit 0. Check-runs at record time: 19 success, 22 skipped, 0 failure, 3 running; auto-merge waits for them.
  4. Accepted deviations: the optional check:i18n-coverage derivation in dispatch-gates is skipped. It is not one row: the self-test pin i18nHit.length===3 and the docblock would move, and open PR ci(docker): publish an on-demand public framework build base image #31454 edits the same self-test. The director's note stands as the rule's known edge: a locale PR queued ahead but not yet in main's history at enqueue slips L33, and L29 catches it after the red.
  5. Out of scope / Skills-docs: the check:i18n-coverage derivation is not filed; triage graded it low value for this class. Metadata-protocol: none, so no Skills-docs: line is owed.
  6. Landing: Tier S. pr_ready + automerge_enable on this head; the queue guard reads record 6722227989.

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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants