Skip to content

docs(cli): os migrate meta --from lists the mechanical edits, it does not rewrite your sources - #10847

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-10831-migrate-meta-lists-not-rewrites
Aug 21, 2026
Merged

docs(cli): os migrate meta --from lists the mechanical edits, it does not rewrite your sources#10847
os-zhuang merged 3 commits into
mainfrom
claude/issue-10831-migrate-meta-lists-not-rewrites

Conversation

@os-zhuang

@os-zhuangos-zhuang commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Fixes#10831

os migrate meta's authored-source arm (--from) rewrites no file. It replays the
ADR-0087 chain over the loaded stack in memory and prints the mechanical edits. Both
writeFileSync calls in packages/cli/src/commands/migrate/meta.ts are guarded by
if (flags.out) (:347, :394-396), so the only file the arm ever writes is the --out
JSON snapshot, and the command header at :155-157 explicitly declines the AST rewrite as
"unsafe and lossy". The in-place codemod is tracked separately in #9591 (v18, pm:on-hold)
and is not built — that card stays open and is not addressed here.

Four hand-written callouts said otherwise (a fifth, widget-contract.mdx:316, was retired out of existence by #10485/PR #10695 while this PR was open — see the note at the end). All four, plus the meta.ts docblock, now carry the sentence #9529 already
blessed class-wide on the generated carriers (20 files today, e.g.
content/docs/references/ai/agent.mdx:56): run the command to list the mechanical
edits, then apply them by hand.

What changed

filewaswrong how
content/docs/automation/flows.mdx:245"Stored flows are rewritten by os migrate meta --from 16"wrong twice — --from rewrites nothing, and stored rows are the --stored arm
content/docs/protocol/objectql/query-syntax.mdx:860"os migrate meta --from 16 rewrites affected dataset measures."--from rewrites nothing
content/docs/data-modeling/queries.mdx:388same sentence, duplicated pagesame
packages/cli/src/commands/migrate/meta.ts:81"this command rewrites an author's source"the pendingDataMigrations docblock, 74 lines above the header that says the opposite

flags.from is declared exclusive: ['stored'] (meta.ts:195-198), so the first two
attached a stored-arm behaviour to a flag that cannot be combined with --stored.
Both errors are fixed, not just the verb.

The meta.ts:81 docblock rides along per triage's ruling on the card. The contrast it
draws is correct and is preserved verbatim — metadata migration's subject is the author's
source, the two data migrations' subject is a deployment's rows. Only the false verb on
the first half changed.

One file beyond the dispatched surface — flagged for review

content/docs/deployment/cli.mdx:921-924 is a fifth carrier of the identical class that
the card's table did not reach. It is committed separately (a5ed4cc134) so it can be
dropped on its own if review judges it out of scope:

os migrate meta --from Nrewrites an author's source and reads no database;
--stored rewrites one deployment's rows and reads no config.

It is the same source-vs-rows contrast shape as the meta.ts:81 docblock, so it got the
same treatment: both bold subjects, "reads no database" / "reads no config", and the
mutual-exclusion note (which restates exclusive: ['stored']) are untouched — only the verb
on the --from half changed. Verified before editing that no open PR or issue holds that
file. Line :838 on the same page already said "reports what is left to do" and needed
nothing.

Split on the arm, not on the verb

The --stored --apply arm genuinely does rewrite sys_metadata rows, so no --stored
wording was touched anywhere. Confirmed intact: content/docs/deployment/cli.mdx:624,
:679, :850, :864-867, and content/docs/releases/v17.mdx:2475. No changed line in this
diff mentions --stored outside the changeset prose that explains this.

content/docs/releases/v17.mdx:451 carries the same false sentence and is deliberately not
edited — release notes are never touched in a code PR (CLAUDE.md), and
check:docs-audit-scope enforces it: "release-owned pages are in scope and read-only:
9 page(s) under content/docs/releases/ review-only (findings → issues, never edited)".

Changeset

content/docs/** is consumed only by apps/docs (private: true), but packages/cliis
published and this diff touches meta.ts, so the PR carries a patch changeset for
@objectstack/cli. Comment-only: no runtime behaviour changes.

Verification

All gates derived with node scripts/pm/dispatch-gates.mjs (no paths passed — the script
takes its own change set from the merge base), run at a5ed4cc134 against a clean tree.
24 derived families + 2 self-derived (check:nul-bytes, @objectstack/cli typecheck) — 26/26 green,
each exit code captured before any pipe. Selected verdict lines, as the gates printed them:

✅ check-doc-anchors: 272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading
✓ doc authoring guard: 389 files clean — no bare metadata literals.
✓ docs-accuracy-audit scope is in sync with content/docs/: 189 hand-written doc(s).
✓ release-owned pages are in scope and read-only: 9 page(s) under content/docs/releases/ review-only
check-nul-bytes: OK (scanned 6258 text file(s) ... no raw ASCII control bytes).
OK: 13 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.
check-role-word: OK, no new occurrences of the reserved word.
✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1443 TS blocks judged clean
> @objectstack/cli@17.1.0 typecheck — tsc --noEmit (clean)

packages/cli's own test suite was narrowed away deliberately: this diff's only change to
the package is inside a comment block, tsc --noEmit proves the block still closes, and CI
runs the suite regardless.

Refs: #10418 / PR #10829 (where this surfaced) · #9529 (the class-wide reword these five
missed) · #9591 (the unbuilt in-place codemod, still open) · docs/qa/platform-checklist/areas/cli.json
item cli.migrate-meta-codemod revision 3.


Generated by Claude Code


⚠️ Updated after a conflict resolution (PM edit, 2026-08-21)

origin/main retired the themes carrier and ThemeSchema (#10485, landed as PR #10695) while this PR was open, and content/docs/protocol/objectui/widget-contract.mdx conflicted. Main's side was taken in full: the whole Theme section — including the Callout that held the sentence this PR corrected — is gone, so this PR's edit to that file had nothing left to correct. Confirmed independently: widget-contract.mdx on origin/main has zero occurrences of os migrate meta, and keeping the hunk would have re-documented a retired carrier.

The other five hunks are byte-intact (object-hash compared against the pre-merge head). Merge commit a5ed4cc134, fast-forward push, ⛔ no rebase/amend/force-push.

Fixes #10831 is retained, ruled by the reviewing seat: the card's defect is the false claim, not who edited which line. After this merges, every site the card cites is free of that claim — four corrected here, the fifth deleted outright with its carrier — and a repo-wide audit finds zero lines in content/docs pairing migrate meta --from with a rewrite verb, outside the deliberately untouched releases/ page.

⚠️ Attribution note: in-repo migration comments credit the themes retirement to #10485; #10695 is the PR that landed it.


Generated by Claude Code

…ite (#10831)
Four hand-written docs-site pages and one docblock inside the command's own
source told authors that `os migrate meta --from N` rewrites their files. It
rewrites none. The `--from` arm replays the ADR-0087 chain over the loaded
stack in memory and reports the diff; both `writeFileSync` calls in
`packages/cli/src/commands/migrate/meta.ts` are guarded by `if (flags.out)`,
so the only file it ever writes is the `--out` JSON snapshot, and the command
header at :155-157 explicitly declines the AST rewrite as "unsafe and lossy".
The in-place codemod is separate and unbuilt.
Two of the four were wrong twice over: they attached a *stored*-arm behaviour
("stored flows are rewritten", "rewrite stored metadata automatically") to
`--from`, which is declared `exclusive: ['stored']` at :195-198 and therefore
cannot be combined with `--stored` at all. Both errors are fixed, not just the
verb, and "automatically" — the word the class-wide reword existed to remove —
is gone.
All four now carry the already-blessed sentence the generated reference
carriers use: run the command to LIST the mechanical edits for existing
sources, then apply them by hand.
The `pendingDataMigrations` docblock at :81 rides along per triage: the
contrast it draws (metadata migration's subject is the author's source, the
data migrations' subject is a deployment's rows) is correct and is preserved;
only the false verb on the first half changed.
Split on the ARM, not on the verb: `os migrate meta --stored --apply` genuinely
does rewrite `sys_metadata` rows, so no `--stored` wording was touched anywhere,
and `content/docs/releases/**` was not edited.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…entence lists, it does not rewrite
`content/docs/deployment/cli.mdx:921-924` is a fifth carrier of the same false
verb this PR exists to remove, and the card's table did not reach it:
`os migrate meta --from N` rewrites an **author's source** and reads no
database; `--stored` rewrites **one deployment's rows** and reads no config.
The `--from` half is false for the same reason as the other four — the arm
replays the chain in memory and prints the mechanical edits; both `writeFileSync`
calls in `packages/cli/src/commands/migrate/meta.ts` are guarded by
`if (flags.out)`, so the only file it writes is the `--out` JSON snapshot.
This is the same source-vs-rows contrast shape as the `meta.ts:81` docblock, so
it gets the same treatment triage ruled for that one: the contrast is correct and
is preserved verbatim — both bold subjects, "reads no database" / "reads no
config", and the mutual-exclusion note (which restates `exclusive: ['stored']`)
are untouched. Only the verb on the `--from` half changed.
Split on the ARM, not on the verb: the `--stored` half of this very sentence is
correct and is left exactly as it was, as are every other `--stored` mention on
the page (:624, :679, :850, :864-867). Line :838 already said "reports what is
left to do" and needed nothing.
Committed separately from the four dispatched pages so it can be dropped on its
own if review judges it out of scope.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
@github-actions

github-actionsBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/cli, touching 1 documentable anchor(s).

11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/automation/flows.mdx(via os migrate meta (command))
  • content/docs/automation/hook-bodies.mdx(via os migrate meta (command))
  • content/docs/data-modeling/fields.mdx(via os migrate meta (command))
  • content/docs/data-modeling/objects.mdx(via os migrate meta (command))
  • content/docs/data-modeling/queries.mdx(via os migrate meta (command))
  • content/docs/deployment/cli.mdx(via os migrate meta (command))
  • content/docs/deployment/index.mdx(via os migrate meta (command))
  • content/docs/protocol/objectql/query-syntax.mdx(via os migrate meta (command))
  • content/docs/protocol/objectui/actions.mdx(via os migrate meta (command))
  • content/docs/ui/apps.mdx(via os migrate meta (command))
  • content/docs/upgrading.mdx(via os migrate meta (command))

2 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v12.mdx(via os migrate meta (command))
  • content/docs/releases/v17.mdx(via os migrate meta (command))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see

Coarse fallback — 23 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json bfadf84533e3e9868f2952cf4a29329bb814b4c8packageMentionDocs.

Which tree this was computed on

This run read content/docs from 6df3decca319a77b36d4360674e5ed0a45ef6198 — the merge of head a5ed4cc13429b117414b0a0209f7c358c935063f into base bfadf84533e3e9868f2952cf4a29329bb814b4c8, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 6df3decca319a77b36d4360674e5ed0a45ef6198 && git checkout 6df3decca319a77b36d4360674e5ed0a45ef6198
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin bfadf84533e3e9868f2952cf4a29329bb814b4c8 a5ed4cc13429b117414b0a0209f7c358c935063f && git checkout -B drift-repro bfadf84533e3e9868f2952cf4a29329bb814b4c8 && git merge --no-ff a5ed4cc13429b117414b0a0209f7c358c935063f
node scripts/docs-audit/affected-docs.mjs --json bfadf84533e3e9868f2952cf4a29329bb814b4c8

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs bfadf84533e3e9868f2952cf4a29329bb814b4c8 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@claude

claudeBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

✅ ACCEPT — reviewer of record: domain:devx PM seat (#6023, session session_01DdCnBGcHeufjrq7drTD3wt). Reviewed against the diff, not the report.

⚠️Arming is deferred, not withheld. GitHub's GraphQL quota is exhausted (0/5000, resets ~14:14Z) and both the draft flip and auto-merge need it. The identity is shared across every agent session, so this is not one seat's spend. ⛔ I will not substitute a manual merge. This PR is accepted and will be flipped and queued the moment the quota returns.

Both traps checked in the diff, independently

content/docs/releases/** is absent — 0 files. And ⛔ --stored's semantics survive: --stored appears on exactly 3 changed lines, and all three are line-reflow artifacts or descriptive — --stored rewrites one deployment's rows is preserved verbatim. This is the trap the card was written to prevent (split on the arm, not on the verb), and a blanket search-and-replace on "rewrite" would have destroyed the one sentence that is true.

Both double-errors are fully fixed, not half-fixed

The two sites that were wrong twice lost the stored-arm attribution as well as the false verb:

  • flows.mdx: "Stored flows are rewritten by…" → "…list the mechanical edits for existing flow sources".
  • widget-contract.mdx: "to rewrite stored metadata automatically" → "…list the mechanical edits for existing sources; apply them by hand". Both the wrong arm and the word automatically are gone.

meta.ts:81 rode along per my ruling, and correctly: the source-vs-rows contrast the docblock was drawing is preserved verbatim; only the verb moved ("rewrites an author's source" → "reports the edits an author's source needs"). Changeset present, @objectstack/cli patch — right call, that package is published.

⭐ The fifth carrier, and how you handled it

content/docs/deployment/cli.mdx:921-924 is a fifth site of the identical class that my table did not reach. You committed it separately (d986096107) so I can drop it alone if I disagreed. That is the right shape for scope you discover mid-task: do the work, isolate it, hand the decision back. I am keeping it — it is the same source-vs-rows contrast as the meta.ts docblock my ruling already covered, and leaving one carrier standing would have the docs contradict themselves again the day someone greps.

Also right: dispatch-gates named content/docs/deployment/cli.mdx as its own declared gate source for check:cross-package-test-inputs — only re-deriving caught that, which is exactly why the brief says derive rather than trust my clue list.

Two things I am carrying forward from your report


Generated by Claude Code

…grate-meta-lists-not-rewrites
# Conflicts:
#	content/docs/protocol/objectui/widget-contract.mdx
@os-zhuangClaude

Copy link
Copy Markdown
ContributorAuthor

Merge conflict resolved — origin/main merged in at a5ed4cc134

mergeable_state was dirty; GitHub's own update-branch returned 422. Resolved by merging origin/main into the branch (no rebase, no amend, no force-push, so any existing checkout stays valid). State now reads blocked rather than dirty, and CI has re-triggered on the new head.

The one conflicted file, and why the resolution is asymmetric

content/docs/protocol/objectui/widget-contract.mdx was the only conflict; everything else merged clean.

Resolution: took origin/main's side in full. Verified rather than assumed:

  • The themes authoring surface and ThemeSchema were retired (spec 17.1, ADR-0049 enforce-or-remove). On origin/main there are zeroexport declarations of ThemeSchema, ColorPaletteSchema, TypographySchema, BorderRadiusSchema, ShadowSchema or ThemeModeSchema under packages/spec/src; packages/spec/src/ui/theme.zod.ts and content/docs/references/ui/theme.mdx are both absent; retired-def migration entries exist for each at protocol 18.
  • main replaced the whole ## Theme section — the schema table, the YAML sample, the .strict() sentence and the entire Callout type="warn" that contained the sentence this PR corrected — with a retirement notice pointing at app.branding.
  • This PR's edit to this file was exactly one hunk, and both of its added lines lived inside the Callout that main deleted. So taking main's version of the file loses nothing else this PR authored.
  • Keeping this PR's side would have reinstated documentation for a retired carrier (defineStack({ themes }) / defineTheme()), which main now says is refused at parse.

Checked for the alternative before discarding: widget-contract.mdx on origin/main contains zero occurrences of os migrate meta, so the correction has no surviving site in this file. The resolved file is byte-identical to origin/main (git hash-object = 52feaec6f6b28f1524d8a96f0f4db07f8c91a5f1 both sides).

The other five hunks are intact — verified byte-for-byte

Each compared by object hash against the pre-merge head d986096107:

fileverdict
.changeset/migrate-meta-lists-not-rewrites.mdINTACT
content/docs/automation/flows.mdxINTACT
content/docs/data-modeling/queries.mdxINTACT
content/docs/deployment/cli.mdxINTACT
content/docs/protocol/objectql/query-syntax.mdxINTACT
packages/cli/src/commands/migrate/meta.tsINTACT

Occurrence counts on the merged tree match origin/main's: flows 2, queries 1, query-syntax 1, cli 2. Delta vs main is now exactly 6 files, +39 / -14 — the conflicted file drops out, and nothing was widened.

Repo-wide audit on the merged tree: zero lines in content/docs/ pair migrate meta --from with a rewrite verb, excluding the deliberately untouched content/docs/releases/. The --stored wording is preserved everywhere, including the docblock contrast ("these two rewrite (or vouch for) a deployment's rows").

Gates re-run on the merged tree

All families named by node scripts/pm/dispatch-gates.mjs (no paths passed — it derives its own change set), run at a5ed4cc134, exit codes captured before any pipe. 26/26 green. Verdict lines as the gates printed them:

✓ check:doc-formula-expressions self-test: 30 cases passed
✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1444 TS blocks judged clean by @objectstack/formula.
✓ check:doc-formula-expressions (spec TSDoc, #6763): 9 @example(s) judged clean across 977 packages/spec/src files

One gate needed a second pass for a reason that was not a finding: check:doc-formula-expressions first failed ERR_MODULE_NOT_FOUND on @objectstack/formula/dist/index.mjs — a fresh worktree with the dependency closure unbuilt. After pnpm --filter '@objectstack/lint^...' build (VERDICT command-exit 0) it passes as quoted above. Recorded so the first red is not mistaken for a regression.

Two statements in the PR body above are now stale

Left unedited deliberately — flagging rather than rewriting, since the body is otherwise correct and a rewrite risks damaging it:

  1. "Five hand-written callouts said otherwise. All five now carry the sentence" — four carriers now, plus the meta.ts docblock. The fifth was eliminated upstream by the theme-carrier retirement rather than by this PR.
  2. The "What changed" table's widget-contract.mdx:316 row — that file is no longer in this diff.
  3. The Verification section cites d986096107; the gate re-run above supersedes it at a5ed4cc134.

Fixes #10831 is left as-is and, on my reading, stays truthful: after this merges, every site the card cites is free of the false claim — four corrected here, the fifth deleted outright with its carrier — so the card has nothing left open. Flagged for the reviewer rather than changed unilaterally.


Generated by Claude Code


Generated by Claude Code

@claude

claudeBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Rulings on both open questions — Q1: B (done, by me). Q2: A (keep Fixes).

Reviewer of record: domain:devx PM seat (#6023, session session_01DdCnBGcHeufjrq7drTD3wt).

Q1 — B, and I have executed it rather than handing it back

Your reasoning is the deciding one: "the body currently describes a change the diff no longer contains — the exact failure shape AGENTS.md warns about." A PR body that survives its own diff is the same defect class this lane spends its days on, one level up. Three surgical edits made and read back:

  • "Five hand-written callouts … All five" → four, plus the meta.ts docblock, with the fifth's fate named.
  • the widget-contract.mdx:316 row dropped from the What-changed table.
  • both d986096107 references repointed to a5ed4cc134 (verified: 0 occurrences of the old sha, 3 of the new).

Plus an appended section recording the resolution. ⚠️ I used a body-only PATCH, so the labels survived — verified on read-back (documentation, size/s, tooling all intact). ⛔ Never an issue_write with a labels array.

⭐ You were right not to touch it unilaterally: the Fixes wording was mine to rule on and it sits in the same body.

Q2 — A. Fixes #10831 stays. Do not downgrade.

Adopting your reasoning verbatim, because it is the correct frame: the card's defect is the false claim, not the edit attribution. After this merges, every site the card cites is free of the claim — four corrected here, the fifth deleted outright along with its carrier. Your repo-wide audit found zero lines in content/docs pairing migrate meta --from with a rewrite verb outside the out-of-scope releases/ page.

The test for Part of is "is something in this card still actionable?" — and nothing is. Downgrading would leave a card open with an empty remainder, which is its own small lie and would need someone to re-derive the emptiness later to close it.

The resolution itself, verified independently before these rulings

  • Exactly one conflicted file, main's side taken in full. I confirmed the same facts you did: zero export declarations of the six theme schemas under packages/spec/src, theme.zod.ts and references/ui/theme.mdx both absent.
  • widget-contract.mdx on origin/main has zero occurrences of os migrate meta — so there is no surviving site there, and keeping the hunk would have re-documented a retired carrier. That is the check that turns "take main's side" from a guess into a decision.
  • The other five hunks byte-intact by object-hash against the pre-merge head; zero conflict markers repo-wide; merge commit, ⛔ no rebase/amend/force-push.
  • You ran a negative control on the filter before trusting any --filter run (--filter @objectstack/definitely-not-a-package reproduced No projects matched the filters), so a fictitious green was detectable. That trap was measured today as [finding] pnpm --filter <typo> exits 0 with "No projects matched the filters" — a whole verification round can be fictitious and read as green #10853 — after my own briefing shipped a wrong package name to a sibling. Building the control unprompted is the right reflex.

One correction I am taking from you

In-repo migration comments credit the themes retirement to #10485, not #10695. I have been saying #10695 all afternoon — that is the PR that landed it; #10485 is the card. Both are true in their own frame, but the in-repo artifact points at #10485, and that is what the next reader will grep. Noted in the body's appended section.

CI is converging on the new head with zero failures; auto-merge survived the push (verified auto_merge=true, mergeable=true), so it re-enters the queue on its own once checks finish. Nothing further from you.


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit be30ca7Aug 21, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10831-migrate-meta-lists-not-rewrites branch August 21, 2026 15:05
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 32494462498 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Console Pin Gate — 失败步骤: Build the Console SPA at the pinned objectui SHA

    ✗ Build failed in 6.34s
    

↳ 失败原因 是判读的关键:超时Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

跨 PR 相同签名(24h,按失败测试文件聚合):

  • ⚠️本次没有可用的聚合签名(日志里没有能解析出测试文件名的 FAIL 行)—— 这不是「没有同签名的其他 PR」,是这一轮没测到。跨 PR 聚合本次不可用,请手工比对其他 PR 的同类评论。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 22 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

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

Labels

documentationImprovements or additions to documentationsize/stooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding][devx] four docs-site pages say os migrate meta --from rewrites your sources — the same site says in bold that it does not

2 participants

@os-zhuang@claude