Skip to content

test(qa-scenarios): add the asset_lifecycle mid-tier scenario card - #30695

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-m0naih
Nov 6, 2026
Merged

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread
Fixes #30481
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:新增「资产全生命周期」中档场景卡(8 个对象、报废审批、3 个角色其中 2 个按行限定、1 个按类别统计账面价值的报表、120 件资产跨 6–9 月采购、10 道问数、6 个写操作、6 个 agent 动作),并配一份只属于这张卡的真值测试。
  • 为什么改:落实 cloud#3600 九个场景中的资产场景,让 AI 建应用、问数、代办写操作都有一张能用代码判分的资产管理卡(领用与归还、维修、按月折旧、报废审批)。
  • 风险与回滚:只加测试数据和测试,所在包私有、不发布,运行时零改动,也没碰兄弟卡共用的文件;回滚即删两个新文件。
  • 先看:① docs/qa/scenarios/asset_lifecycle.json 的 run.questions 与 run.operations;② packages/qa/scenarios/test/asset-lifecycle.test.ts 的 EXPECTED_TRUTHS 及旁边的手算注释;③ 同一文件里「seed internally consistent」用例(折旧、账面价值、资产状态与单据对得上)。
  • 两分钟验证:pnpm --filter @objectstack/scenarios test,预期 5 个测试文件、70 个用例全绿。
  • 需要你做的:无,席位落地。

What changes

  • docs/qa/scenarios/asset_lifecycle.json (new): the 资产全生命周期 asset-lifecycle mid-tier card.
    • Eight objects: department, employee, asset_category (useful life, straight-line method), asset (the main object, with roll-up accumulated_depreciation and formula book_value), checkout (checkout and return, with the return condition), repair_order, disposal_request (the scrap approval, routed to the manager of the asset's department) and depreciation_entry (one per asset per month, posted by a scheduled flow).
    • Three personas: employee (the assets they hold, their own checkouts, repairs and scrap requests; no cost, book value, depreciation, budget or home address) and dept_manager (their department; no home address) carry a row scope; asset_admin sees every asset but no asset budget.
    • Seed: 120 assets bought June to September 2026, 92 checkouts (64 kits, re-issues after repair, 14 loaners), 19 repair orders, 7 scrap requests in all four states and 297 depreciation entries. The arithmetic rule that generated it is stated in the card's $comment, so every truth can be worked by hand.
    • Run half: 10 questions, 6 operations and 6 agent actions (one confirm-gated); iterate adds transfers between departments.
  • packages/qa/scenarios/test/asset-lifecycle.test.ts (new): this card's own test file.
    • It pins all 10 computed truths and the 10 per-persona truths against hand-worked values; each derivation is written next to its pin.
    • It asserts the mid-tier floor, and the seed's own consistency: each depreciation entry is cost over useful life, posted after the purchase month and never from the disposal month on; accumulated depreciation sums the entries and book value is cost minus it; each asset's status and custodian follow its checkouts, repairs and scrap request; each scrap request's approver is its department's manager.
    • It asserts each operation targets a row in the state its story needs (an overdue loaner, a submitted request the manager holds, an approved request, the employee's own request, an asset in repair, serials and a checkout key that do not exist yet).
    • It shows that a wrong seed cell and a wrong truth spec in fixture copies go red against those pins.

Why

The card is one of the six mid-tier scenarios ruled on objectstack-ai/cloud#3600 (Q1 = v3, 「同意这9个场景」). It gives the asset domain a scenario whose answers, permission boundaries and write outcomes are graded by code only.

Tests

pnpm --filter @objectstack/scenarios test: 5 files, 70 tests passed (64 before this PR). pnpm --filter @objectstack/scenarios typecheck: exit 0, after building the closure with pnpm --filter '@objectstack/scenarios^...' build; tsc --listFiles lists the new test file. Both read at head 0ffa47e2a6.

Acceptance notes

  • File name. The card is asset_lifecycle.json, not asset-lifecycle.json as the issue spells it: a card's id must be a snake_case machine name equal to the file's basename. test(qa-scenarios): add the travel_expense mid-tier scenario card #30600 made the same call.
  • No shared file touched. Since test(qa-scenarios): add the travel_expense mid-tier scenario card #30600, test/library.test.ts names only the three control cards and the README's "Adding a card" step already sends a mid-tier card's pins to its own file. So this PR adds two files and edits none, and it cannot conflict with the sibling cards.
  • Seven operation kinds, six operations. receive_and_issue_from_text covers two of them: entry from free text with lines (three monitors on one delivery) and the multi-step chain (register them, then check one out). The workflow step is manager_approves_scrap; its progress query is the question dr_0005_waiting_on, asked about a different request so its truth stays a fact of the seed.
  • New rows in post-states. A where cannot name a created row's id, so the new checkout is matched by employee plus checked_out_on; the test proves no seeded checkout has that pair, and that the three delivered serials are new.
  • Overdue means due before asOf. overdue_loaners_by_department filters due_on lt "2026-10-31", the card's asOf; the window operators only name ranges that end on asOf.
  • No schema field for some floor items. An approval or automation flow, "declarative preferred" and a report as distinct from a dashboard have no field. The card states them in prompt.detailed (zh and en) and capabilities, seeds disposal_request as an expected object, and declares the report under expect.dashboards. Nothing in the loader grades them.
  • Capability names. The loader checks only the area half of a tag. approvals.dynamic-approver-routing is a checklist id; the rest follow the descriptive names travel_expense.json uses.
  • Changeset. packages/qa/scenarios is "private": true and the diff touches no published package, so this PR carries no changeset and asks for skip-changeset, as test(qa-scenarios): add the travel_expense mid-tier scenario card #30600 did.
  • Sources. The domain is designed from the card text and general business knowledge; the card's Reference line names no template. objectstack-ai/cloud#3567 was not read.

Verification

scenarios test + typecheck (head 0ffa47e)
 Test Files  5 passed (5)
      Tests  70 passed (70)
> tsc --noEmit
os-verify-lock: VERDICT command-exit 0

Run after merging main and a whole-tree pnpm build (118 of 118 turbo tasks).

dispatch-gates --commands (50 commands, local, head 0ffa47e)

All 50 derived commands exit 0 on head 0ffa47e2a6. The --ran reconciliation reads: 50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero because every line recorded its exit code.

The first run, on the pre-merge head 11193506f5, had 47 exit 0 and 3 exit 3 (PREREQUISITE NOT MET, nothing measured). Each cleared once its prerequisite was in place:

  • check-plugin-teardown-shape.mjs --self-test, after git fetch --unshallow origin main (its fixture is a pinned commit a shallow clone lacks);
  • check:lean-entry-closure and check:dual-build-cjs-loads, after the whole-tree build.

Changed lines: 1294 (+1294 / -0, 2 files), under the 3000 threshold (dispatch-gates.mjs reading).

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No schema touched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes. (No formatter ran, and eslint on the new test file exits 0; the repo-wide pnpm lint is left to CI's Lint & Repo Gates.)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (Publishes nothing: private package.)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (Not touched.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done. (Every item but the repo-wide pnpm lint, left to CI as in item 3.)

Generated by Claude Code

The open library's 资产全生命周期 (asset lifecycle) scenario: eight objects
(department, employee, asset_category, asset, checkout, repair_order,
disposal_request, depreciation_entry), 120 assets bought June-September
2026, a scrap approval routed to the asset's department manager, monthly
straight-line depreciation, three personas (two row-scoped), ten questions,
six operations and six agent actions. The seed follows the arithmetic rule
in the card's $comment.

Its own test file pins every computed truth, over all rows and per persona,
against hand-worked values, checks the seed's internal consistency, and
shows a wrong seed cell and a wrong truth spec in fixture copies go red.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4czx7zatyA1s7R4yPhB
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see

Coarse fallback — 0 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 a2437b560bd8872feece6ec8b57c6fdf21cff1f4 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#3 · os-elon-musk · session_016WV4cz3RTQjLh7hZBLzgtZ

席位核对 · ACCEPT · 0ffa47e2a6 · 2026-11-05T22:52Z

Head-sha: 0ffa47e2a6d676f906943dab11de2ead8f28d25f

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

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

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

分类:failure —— 按下面的日志分诊。

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

  • Test Core (1/8) — 失败步骤: Run this shard's tests

    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > is green against a verbatim copy of the shipped ledgers
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > stays green when the missing path is attributed to ANOTHER repo
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > never bounds a citation attributed to ANOTHER repo
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > prints the citation count and how many are in range, in the documented two
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — symbol anchors (#12516) > stays GREEN on the drifted BEFORE-state — the honest residual this grammar e
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — symbol anchors (#12516) > prints the anchor count and how many resolve, equal on a green run
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the evidence-scan population (#13041) > stays GREEN when a `dead` entry carries the SAME rotted pointe
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the evidence-scan population (#13041) > declares every status either scanned or explicitly unscanned, 
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the live-elsewhere criteria (#13483) > is green on the shipped ledgers and publishes the population be
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the live-elsewhere criteria (#13483) > is green on a planted live-elsewhere row and counts it as carry
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the README state table (#7257) > is green against a verbatim copy, and says how many rows it checked
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the generated count artifact (#7377, sharded #20361) > is green against a verbatim copy, says the shar
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    

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

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

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

历史信号:

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

分诊清单:

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

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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#3 · os-elon-musk · session_016WV4czx7zatyA1s7R4yPhB

Queue ejection triage · not this PR's

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

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

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

分类:failure —— 按下面的日志分诊。

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

  • Test Core (1/8) — 失败步骤: Run this shard's tests

    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > is green against a verbatim copy of the shipped ledgers
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > stays green when the missing path is attributed to ANOTHER repo
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > never bounds a citation attributed to ANOTHER repo
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — evidence pointers (#5623) > prints the citation count and how many are in range, in the documented two
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — symbol anchors (#12516) > stays GREEN on the drifted BEFORE-state — the honest residual this grammar e
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — symbol anchors (#12516) > prints the anchor count and how many resolve, equal on a green run
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the evidence-scan population (#13041) > stays GREEN when a `dead` entry carries the SAME rotted pointe
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the evidence-scan population (#13041) > declares every status either scanned or explicitly unscanned, 
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the live-elsewhere criteria (#13483) > is green on the shipped ledgers and publishes the population be
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the live-elsewhere criteria (#13483) > is green on a planted live-elsewhere row and counts it as carry
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the README state table (#7257) > is green against a verbatim copy, and says how many rows it checked
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    @objectstack/spec:test:  FAIL   local  scripts/liveness/check-liveness.test.ts > check:liveness — the generated count artifact (#7377, sharded #20361) > is green against a verbatim copy, says the shar
      ↳ 失败原因: @objectstack/spec:test: AssertionError: Spec liveness gate (registry-rooted) — governed types: object, field, flow, action, hook, permission, position, agent, tool, skill, dataset, page, view, report,
    

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

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

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

历史信号:

  • ⚠️ 本 PR 过去 24h 已在队列失败 1 次(不含本次)。 内容未变而反复失败 ⇒ 高度怀疑 flaky 测试或与同组 PR 的语义冲突,重排不解决。
  • 过去 24h 队列共有 7 个失败构建(不含本次)。

分诊清单:

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

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

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

Labels

size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Scenario library: mid-tier card — 资产全生命周期 asset lifecycle (8–10 问数 + 4–6 write operations, row-scoped personas)

2 participants