Skip to content

feat(spec): PLATFORM_TOOLS_BY_PACKAGE['service-ai'] lists read_package_doc and search_package_docs (#27002) - #27011

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-eb1lm2
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-eb1lm2

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Sam · project thread

Clause-②: yes (widening)
Metadata-protocol: added

Fixes #27002

维护者速读

  • 改了什么:平台工具名登记表 PLATFORM_TOOLS_BY_PACKAGE['service-ai'] 加上 read_package_doc 和 search_package_docs 两个名字,按字母序插入,其余名字不动。ui 的十个语言包同时补上这两个工具的 chatbot.tool.* 文案(各语言的完整句子),因为 ui 的标签一致性测试直接读这张登记表。
  • 为什么:cloud#3337(cloud#3335,ai: package docs are not a knowledge source, so the Ask agent cannot answer how-to questions from the docs a package ships (ADR-0046 §3.6) #26691 的 cloud 半)给 Ask 助手加了这两个读包文档的工具。cloud 的一致性测试要求登记表与实际注册的工具一致,所以那个 PR 要等这条落地并挪 pin 才能变绿。
  • 声明怎么选的:这是常量列表,不是 schema。Metadata-protocol 记为 added,因为改动后 skill 的 tools[] 写这两个名字不再被 lint 判为虚构工具,即作者可写的取值多了两个;没有 schema 形状变化,没有导出增删。先例 fix(spec): list the five service-ai-studio tools the AI tool registry was omitting #16844 的 changeset 没有写这两行声明(当时还没有这条规则);本 PR 按现行 AGENTS.md 补上,changeset 为 minor。ui 的文案改动单独一条 @object-ui/i18n patch changeset,声明为 Clause-② no / Metadata-protocol none。
  • 需要你做的:无治理路径。由 cloud seat 2 安排审阅与落地。

What changes

  • packages/spec/src/system/constants/platform-tool-names.ts: the two names in 'service-ai', alphabetical (query_records < read_package_doc < search_knowledge < search_package_docs < visualize_data); the group's doc line names the pair.
  • packages/lint/src/validate-ai-tool-references.test.ts: the behavioural pin, beside PLATFORM_TOOLS_BY_PACKAGE['service-ai-studio'] is missing five registered tools, so a skill naming any of them reads as fictional to validate/lint #16512's: a skill naming both resolves; a third name shaped like them (list_package_docs) and registered by nobody is still reported at skills[0].tools[2].
  • .changeset/27002-service-ai-package-doc-tool-names.md: @objectstack/spec minor, carrying both declaration lines.
  • ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts: chatbot.tool.read_package_doc and chatbot.tool.search_package_docs in every pack, each a sentence in that language (en "Read the app guide" / "Search the app guides", zh 「阅读应用文档」/「在应用文档中查找」), alphabetical beside search_knowledge. Required by ui/packages/plugin-chatbot's toolLabels-locale-parity-7481 and toolLabels-sentences-12724, which read this registry from the in-tree spec.
  • .changeset/27002-chatbot-tool-labels-package-docs.md: @object-ui/i18n patch, Clause-② no, Metadata-protocol none (root .changeset/, which owns the @object-ui/* fixed group; ui/.changeset/ is not read by the release).
  • The registry's maintenance-contract comment now says a new name also needs its chatbot.tool.<name> label in every ui pack.

Premise, measured

At origin/main 5e99bd936c, in platform-tool-names.ts: package_doc 0 occurrences (absence), search_knowledge 1 (positive control).

Verification

Head 29111be8a7 (ui labels), under os-verify-lock:

  • ui: packages/i18n/ + plugin-chatbot toolLabels* tests: 91 files / 1,401 passed, 13 skipped, exit 0.
  • Ablation: ko's search_package_docs line removed → both label tests red (ko is missing chatbot.tool entries: [ 'search_package_docs' ]); restored → 28 passed.

Head f70fec4289 (registry), under os-verify-lock:

  • pnpm --filter @objectstack/spec build then check:generated: all 14 generated artifacts up to date (no export moved, only a const's value).
  • pnpm --filter @objectstack/spec test: 738 files / 22,130 tests passed, exit 0.
  • pnpm --filter @objectstack/spec typecheck: exit 0, test-layer ledger held.
  • packages/lint validate-ai-tool-references.test.ts: 21 passed.
  • Ablation: the registry file restored to HEAD~1 (names absent; spec dist rebuilt, search_package_docs in 0 built files) → the new lint case red (1 failed | 20 passed); restored to HEAD and rebuilt (2 built files carry the name) → 21 passed. git status --porcelain clean after.
  • node scripts/check-changeset-no-major.mjs --base 5e99bd936c: exit 0 (the level axis is PR-scoped, judged in CI).

Downstream

  • cloud#3337's service-ai platform-tool-names conformance test passes at a cloud pin carrying this merge; seat 2 runs that pin round.
  • Not done on the cloud card, and recorded there: the live Ask transcript for 「大单审批什么时候触发」. The container has no model key, and the HotCRM doc is crm_sales, not crm_sales_opportunities. It becomes a post-deploy staging read.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QUs3BvjuoCPEwU3eTt6se6

…kage-doc tools (#27002)

read_package_doc and search_package_docs, the service-ai tools cloud#3335
adds to the ask agent, join the registry in its alphabetical order, so a
skill naming either resolves under ADR-0109 reference integrity. The lint
rule's suite pins both directions: the two resolve, a third name shaped
like them and registered by nobody is still reported.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUs3BvjuoCPEwU3eTt6se6
@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

3 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see

Coarse fallback — 147 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 7eb613c39fb85cc1e4d0b658c9ecea4e45949c99 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from afa981afe9d17aa6d4ea6571d5cf05104acb6cc4 — the merge of head c203ef8349f6371f0b4fd79d15be3c1786e50f50 into base 7eb613c39fb85cc1e4d0b658c9ecea4e45949c99, 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 afa981afe9d17aa6d4ea6571d5cf05104acb6cc4 && git checkout afa981afe9d17aa6d4ea6571d5cf05104acb6cc4
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 7eb613c39fb85cc1e4d0b658c9ecea4e45949c99 c203ef8349f6371f0b4fd79d15be3c1786e50f50 && git checkout -B drift-repro 7eb613c39fb85cc1e4d0b658c9ecea4e45949c99 && git merge --no-ff c203ef8349f6371f0b4fd79d15be3c1786e50f50

node scripts/docs-audit/affected-docs.mjs --json 7eb613c39fb85cc1e4d0b658c9ecea4e45949c99

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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: f70fec428934676006220cee1be3f35c5199bd85
Local-runs: none
Scope: packages/spec/src/system/constants/platform-tool-names.ts + packages/spec/src/system/constants/platform-tool-names.test.ts, packages/lint/src/validate-ai-tool-references.ts, packages/lint/src/validate-ai-tool-references.test.ts, docs/adr/0109-ai-tool-authoring-model.md, ui/packages/plugin-chatbot/src/tests/toolLabels-locale-parity-7481.test.ts, ui/packages/plugin-chatbot/src/tests/toolLabels-sentences-12724.test.ts, ui/packages/i18n/src/locales/*.ts (chatbot.tool block), ui/packages/plugin-chatbot/package.json, .github/workflows/ci.yml (filter + Test UI), cloud claude/project-thread-eb1lm2 @ 799c4ab6f004: packages/service-ai/src/tools/package-docs-tools.ts, packages/service-ai/src/tools/index.ts, packages/service-ai/src/tests/platform-tool-names-conformance.test.ts, packages/service-ai-studio/src/skills/package-docs-skill.ts

① Derived judgments

  • PLATFORM_TOOLS_BY_PACKAGE['service-ai'] gains read_package_doc and search_package_docs — right. At cloud head 799c4ab6f004 the owning package's DEFINED_HERE (data-tools: aggregate_data, get_record, query_records; query_data; visualize_data; search_knowledge; PACKAGE_DOCS_TOOL_DEFINITIONS: search_package_docs, read_package_doc) sorted is exactly the eight names the PR's group now carries, so the conformance test's set-equality turns green at the pin and the group stays "the exact set that package registers" as the file's own contract demands. Placement is sorted under JS default order (query_records, read_package_doc, search_knowledge, search_package_docs, visualize_data), so the spec invariant test's "each group is sorted" case holds; both names are snake_case, collide with nothing in service-ai-studio, and sit outside the action_ family namespace.
  • PLATFORM_PROVIDED_TOOL_NAMES and isPlatformProvidedToolName accept two more names — right; derived mechanically from the flattened registry, no code change.
  • The lint accept-set for skill.tools[] under ai-skill-tool-unresolved widens by exactly two literal names (and a read_* trailing wildcard now resolves where it did not) — right. collectToolUniverse seeds from PLATFORM_PROVIDED_TOOL_NAMES; nothing else in the ladder moves. The new test's control (list_package_docs at skills[0].tools[2]) is a correct index and a name no source supplies, so the pin can fail on an over-widened universe, matching the PLATFORM_TOOLS_BY_PACKAGE['service-ai-studio'] is missing five registered tools, so a skill naming any of them reads as fictional to validate/lint #16512 shape beside it.
  • The cloud consumer's skill package_docs names exactly ['search_package_docs', 'read_package_doc'] — right: the two names the registry now resolves are the two the first consumer writes; ask-only, registered only when mountAsk && protocol, which is the runtime's business, not the registry's.
  • ui/ chatbot.tool.* required key set widens by two — wrong, and unsupplied. ui/packages/plugin-chatbot/src/__tests__/toolLabels-locale-parity-7481.test.ts reads PLATFORM_TOOLS_BY_PACKAGE from @objectstack/spec resolved workspace:^ (ui/packages/plugin-chatbot/package.json) since the ui/ import at fd40831, and asserts every registry name carries a non-empty chatbot.tool. + the tool name as its label in all ten packs (it.each(LANGS) … missing … toEqual([])); toolLabels-sentences-12724.test.ts further requires every pack's key set to equal en's and no value to equal the title-caser output. grep search_package_docs|read_package_doc ui/ returns nothing. The registry change therefore implies ten locale entries (ar, de, en, es, fr, ja, ko, pt, ru, zh) that the diff does not carry. See ④.
  • No Zod shape, no export added or removed, no generated artifact owed beyond check:generated (CI's) — right; Check Changeset and Spec property liveness concluded success.
  • No packages/mcp consumer reads the registry at this head (grep isPlatformProvidedToolName packages/mcp/src is empty), so the precedent changeset's "second consumer" sentence is stale history, not a derived obligation here.

② Semver level

.changeset/27002-service-ai-package-doc-tool-names.md: '@objectstack/spec': minor — matches the diff. A published constant's value widens (the accept-set of a lint rule the spec hands downstream grows), nothing is removed or renamed, so (widening) and minor are the right arm and level; Metadata-protocol: added is right under AGENTS.md step 3 ("accepted value … is added", kind takes at least minor): two more skill.tools[] values an author can write without the ADR-0109 finding. packages/lint moves only a test file, so no second changeset is owed. Declarations agree across card claim, PR body and changeset body. Check Changeset concluded success on this head.
Clause-②: yes (widening)

③ Boundary flags

  • Claim Premise: holds — verified: at origin/main 5e99bd9 platform-tool-names.ts carries neither name and carries search_knowledge. Right.
  • Claim File surface (registry, the lint pin, one changeset) — matches the three-file diff exactly. Right.
  • Claim Governed: no — right: the register is docs/adr/**, AGENTS.md, CLAUDE.md, ui/AGENTS.md, ui/CLAUDE.md, ui/.github/workflows/**; none touched; Governed Surface Queue Guard success.
  • Card body "Update any spec test or snapshot that pins the list": the spec's own platform-tool-names.test.ts pins invariants only (snake_case, no cross-package collision, no action_ prefix, sorted) and all four hold for the two names; no snapshot exists under packages/spec. The sweep stopped at packages/spec: the pin that does enumerate the registry lives under ui/ (① above) and is not answered — escalated as the must-fix in ④.
  • Card open_questions: none in body or comment.
  • PR body "Downstream: live Ask transcript not done, recorded on the cloud card" — outside this PR's tree; noted, not a flag on this diff.
  • PR body says precedent fix(spec): list the five service-ai-studio tools the AI tool registry was omitting #16844 "同样声明 Clause-② yes (widening)": the precedent changeset at 625b0c3 carries no declaration lines (it predates them). Not load-bearing for this verdict; the declarations here are judged on their own and are right.
  • Check-runs on f70fec428934676006220cee1be3f35c5199bd85 at review time: success — Check Changeset, Spec property liveness, Governed Surface Queue Guard, PR-body guards, Check PR Size, Flag docs affected, Auto Label, filter, Plan Test Core shards, Dogfood Regression Gate, Lint · ESLint, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · repo & tooling gates, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Type Check · source gates. Pending — Build Core, Test Core (1–8/8), Build UI Deps, Type Check · workspace / consumer gates / debt ledger, Lint · CI release & engine gates, Lint · scoped · query-options erasure; Type Check UI and Build & E2E UI not yet started. Skipped by path filter — UI Published Artifacts, Build Docs, Dogfood shards, Temporal Conformance. No Test UI (k/16) shard exists on this head: ci.yml gates the shards on filter.outputs.ui, whose globs do not include packages/spec/** (that path sits only in ui_consumers, which drives Type Check UI and Build & E2E UI), and the Test UI aggregator passes a shard skip that filter explains. Judged on what has concluded; nothing concluded red.

④ Design judgment

packages/spec/src/system/constants/platform-tool-names.ts — against ADR-0109 §2 ("platform tool names are facts, not guesses"; the owning package's conformance test is what keeps the group true), the file's own maintenance contract ("registering a new tool in a cloud AI package means adding its name here … an out-of-date registry is worse than no registry, because consumers now trust it"), and the first consumer at cloud 799c4ab6f004:

  • Holds against the ruling and the first consumer: the two names are what service-ai registers, in the group's order, under the invariants the spec test pins, and the lint rule's resolution ladder accepts them and nothing else new. The group's doc line stating the pair sits behind the /meta/doc audience gate is read true in package-docs-tools.ts (gate asked via the protocol's list read, never restated) — a code comment, so the tracker cite is allowed.
  • Must-fix — the registry widening is half of one change; its ui/ half is missing. The registry is, by the i18n packs' own header, the closed member set of chatbot.tool.* ("one entry per PLATFORM-PROVIDED tool name … the closed registry those runtimes are conformance-tested against"), and toolLabels-locale-parity-7481.test.ts enforces that identity against the in-tree spec. On this tree the test reddens on all ten it.each(LANGS) cases (missing: ['read_package_doc', 'search_package_docs']), and the sentences test's equal-key-set case follows the moment any one pack is patched alone. This is exactly the objectui#7481 symptom the test was written to prevent — a zh console showing "Search package docs" through the English title-caser fallback — and it recurs "every time the cloud AI packages register a tool", which is this PR. The failure is not caught on this head: Test UI shards never run for a packages/spec-only diff, so the red lands on main and reddens Test UI, a required context, on the next PR that touches ui/** — the "red that lands rides main into every later PR" failure AGENTS.md names, on a required gate. The precedent fix(spec): list the five service-ai-studio tools the AI tool registry was omitting #16844 could leave the labels to a pin bump because ui/ then lived in another repo on a pinned spec and carried the AHEAD_OF_PIN hatch; since fd40831 ui/ resolves @objectstack/spec as workspace:^ and the hatch is empty by design, so AGENTS.md step 4's rule for removals applies in substance to this addition: the change that breaks ui/ ships with the ui/ fix or does not ship. Fix: add chatbot.tool.read_package_doc and chatbot.tool.search_package_docs to all ten packs under ui/packages/i18n/src/locales/ as sentences in each pack's language (not the tool id, not the title-caser output), in the same PR; that also puts a ui/** path on the diff and runs Test UI on the head, which is the only way the gate verdict covers this consumer.
  • Should-fix (not blocking): the card and PR body's "spec test or snapshot that pins the list" sweep should name the ui parity test as the pin, so the next registry widening does not miss it again; a one-line pointer in the registry file's maintenance-contract comment ("and its chatbot.tool.* label in every ui/ i18n pack") would make the obligation visible where the next author edits.
  • No other break found: wildcard resolution, the action_ family, suggestName near-miss, PLATFORM_TOOL_FAMILY_PREFIXES and the cloud ask-tool-surface exhaustive lists are all consistent with the two names.

Implemented-by: claude/project-thread-eb1lm2
Reviewed-by: session_0123kRqqdpAJWYMgsgdAJX4G

VERDICT: FAIL

…ols (#27002)

The ui plugin-chatbot label-parity tests read PLATFORM_TOOLS_BY_PACKAGE
from the in-tree spec, so every registry name needs a chatbot.tool.<name>
label in all ten packs. Adds read_package_doc and search_package_docs as
sentences in each language, and a pointer in the registry's maintenance
comment.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUs3BvjuoCPEwU3eTt6se6
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 29111be8a75224b2c98eb1f9dfb995be6c132425
Local-runs: none
Scope: packages/spec/src/system/constants/platform-tool-names.ts + ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts (chatbot.tool block), ui/.changeset/27002-chatbot-tool-labels-package-docs.md, .changeset/config.json, ui/AGENTS.md (changeset rule), ui/packages/i18n/package.json, ui/packages/plugin-chatbot/src/tool-display.ts (humanizeToolName), ui/packages/plugin-chatbot/src/tests/toolLabels-locale-parity-7481.test.ts, ui/packages/plugin-chatbot/src/tests/toolLabels-sentences-12724.test.ts, ui/packages/i18n/src/tests/all-locales-key-parity.test.ts, .github/workflows/ci.yml (filter + Test UI); the f70fec4 scope (lint rule and test, spec invariant test, ADR-0109, cloud claude/project-thread-eb1lm2 @ 799c4ab6f004 service-ai tools) stands as judged in the prior record and is unchanged by this delta.

Delta review: one commit after f70fec428934676006220cee1be3f35c5199bd85 — 29111be8a7 "feat(i18n): chatbot.tool labels for the two service-ai package-doc tools (#27002)", 12 files: the registry comment, ten locale packs, one changeset under ui/.changeset/. The three files of the prior head are byte-identical except the registry's maintenance-contract comment.

① Derived judgments

  • The prior record's open derived obligation — the ui/ chatbot.tool.* key set widens by two — is now supplied, right. Every one of the ten packs under ui/packages/i18n/src/locales/ gains exactly read_package_doc and search_package_docs inside its chatbot.tool block (two insertions per file, same two keys, placed beside search_knowledge), so toolLabels-locale-parity-7481's per-pack missing list is empty, toolLabels-sentences-12724's equal-key-set case holds (every pack's key set equals en's), and all-locales-key-parity (every pack defines every en key and no extra) holds.
  • Sentence rule — right in all ten. humanizeToolName yields Read package doc and Search package docs (underscores to spaces, first word capitalised, HUMAN_WORDS touches none of these words); the test compares value === id || value === humanizeToolName(id). en reads "Read the app guide" / "Search the app guides"; the nine other packs are phrases in their own script or language (zh 「阅读应用文档」/「在应用文档中查找」, ja, ko, ru, ar, de, es, fr, pt). None equals the id or the title-caser output.
  • @object-ui/i18n (18.2.0, a member of the root fixed version group, 38 @object-ui/* entries in .changeset/config.json) gains two exported locale keys — a patch-level change with no authorable metadata surface. Right as declared (see ②) — but the declaration lives in a file the release does not read (④).
  • No other derived change: PLATFORM_TOOLS_BY_PACKAGE, PLATFORM_PROVIDED_TOOL_NAMES, the lint accept-set, the spec changeset and the cloud consumer's set-equality are exactly as judged on f70fec4.

② Semver level

  • .changeset/27002-service-ai-package-doc-tool-names.md (@objectstack/spec: minor, Clause-②: yes (widening), Metadata-protocol: added) — unchanged, still matches the diff; Check Changeset concluded success on this head (both runs).
  • ui/.changeset/27002-chatbot-tool-labels-package-docs.md ('@object-ui/i18n': patch, Clause-②: no, Metadata-protocol: none) — the content is right: locale labels widen no published spec surface and change nothing a metadata author writes; none takes patch under AGENTS.md step 3, and the same trio is what every precedent @object-ui/i18n label changeset carries (13460-console-pages-i18n, 13460-console-second-pass, 13461-keyboard-and-names). The location is wrong — ④.
    Clause-②: yes (widening)

③ Boundary flags

  • The prior record's must-fix (ten chatbot.tool.* labels) — answered; the prior should-fix (registry comment pointing at the label requirement) — answered: the maintenance-contract paragraph now says a new name also needs its chatbot.tool. label in every pack under ui/packages/i18n/src/locales/ because the plugin-chatbot label-parity tests read the registry. Code comment, so the bracketed placeholder spelling there is fine.
  • PR body patched: it now states the precedent fix(spec): list the five service-ai-studio tools the AI tool registry was omitting #16844 changeset carried no declaration lines (matching the tree at 625b0c3) and names the ui parity tests as the pin; the Verification section reports an ablation on ko — the dev's own account, not judged.
  • Card claim File surface (registry, lint pin, one changeset) — now narrower than the diff (ten locale packs, a second changeset, a comment); the widening is the one this review required, so the claim is stale rather than wrong; no flag.
  • Governed: no — still right: ui/AGENTS.md and ui/.github/workflows/** are governed, ui/.changeset/** and ui/packages/** are not; Governed Surface Queue Guard success on this head.
  • Check-runs on 29111be8a75224b2c98eb1f9dfb995be6c132425 at review time: success — filter, Check Changeset (both runs), Spec property liveness, Governed Surface Queue Guard, PR-body guards (both), Flag docs affected, Check PR Size, Auto Label, Plan Test Core shards, Dogfood Regression Gate. Pending — Build Core, Build UI Deps, Test Core (1–8/8), Type Check · workspace / source gates / consumer gates / debt ledger, every Lint job (ESLint, docs & code guards, PM dispatch-gates, repo & tooling gates, CI release & engine gates, scoped ×3); Type Check UI, Lint UI, Build & E2E UI and the Test UI (k/16) shards have not started (they need Build UI Deps). Skipped by filter — UI Published Artifacts, Build Docs, Dogfood shards, Temporal Conformance. Test UI now gated to run: the diff carries ui/** paths (ten packs, one ui/.changeset file), which filter's ui glob matches, so unlike f70fec4 the shards are owed on this head; none has concluded yet, so the gate verdict on the locale tests is still open here. Judged on what has concluded; nothing concluded red.

④ Design judgment

packages/spec/src/system/constants/platform-tool-names.ts — against ADR-0109 §2, the file's maintenance contract and the first consumer: unchanged in substance from f70fec4 and holds; the comment now carries the ui/ label obligation, which closes the gap the prior record named. The ten labels make the registry widening whole on the console side: a zh step reads 「阅读应用文档」, not "Read package doc".

  • Must-fix — the i18n changeset is in a directory the release does not read, which ui/AGENTS.md forbids adding to. ui/AGENTS.md line 181: changesets are written at the repo root .changeset/ per the root Post-Task Checklist step 3; @object-ui/* and @objectstack/* are one fixed version group; ui/.changeset/ holds only pre-merge leftovers not yet migrated, the root config does not read it, "⇒ ⛔ 别往里加新的". The tree confirms it: ui/.changeset/ has no config.json, the root .changeset/config.json is the only changesets config and lists @object-ui/i18n in its fixed group, and its last commits are the ui import and release-lane merge. So ui/.changeset/27002-chatbot-tool-labels-package-docs.md is inert: changeset version never consumes it, @object-ui/i18n's CHANGELOG never carries the two keys, and the Clause-②/Metadata-protocol lines in it are read by no gate — the check-adr-0087-registration and check-changeset-no-major readers scan the root directory only, which is why Check Changeset is green on this head while a published package changes with, in effect, no changeset ("never none", AGENTS.md step 3). Nothing in CI catches this (grep ui/.changeset scripts .github/workflows is empty), so it rides through on green. Fix: move the file to .changeset/27002-chatbot-tool-labels-package-docs.md unchanged — its frontmatter, level and both declaration lines are already right there — or fold '@object-ui/i18n': patch into the existing spec changeset's frontmatter with its own paragraph; either is a one-move change.
  • Should-fix (not blocking): the Chinese 维护者速读 and "What changes" sections of the PR body name ui/.changeset/... as the changeset's path; once moved, patch the two mentions so the body and tree agree.
  • No new break found: the two keys are inside the chatbot.tool object in each pack (indentation and quoting match the surrounding lines; en/zh single-quoted, the eight others double-quoted as their files already are); no pack gains a key another lacks; todo_write and the GRADUATED five are untouched; the sentences test's zh ruled-sentence case is unaffected.

Implemented-by: claude/project-thread-eb1lm2
Reviewed-by: session_0123kRqqdpAJWYMgsgdAJX4G

VERDICT: FAIL

#27002)

ui/.changeset is not read by the release; the root config owns the
@object-ui/* fixed group.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUs3BvjuoCPEwU3eTt6se6
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: c203ef8349f6371f0b4fd79d15be3c1786e50f50
Local-runs: none
Scope: packages/spec/src/system/constants/platform-tool-names.ts + .changeset/27002-chatbot-tool-labels-package-docs.md (moved from ui/.changeset/), .changeset/config.json, ui/AGENTS.md (changeset rule, line 181), .changeset/27002-service-ai-package-doc-tool-names.md, ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts, packages/lint/src/validate-ai-tool-references.test.ts; the f70fec4 and 29111be scopes (lint rule, spec invariant test, ADR-0109, plugin-chatbot label tests, cloud claude/project-thread-eb1lm2 @ 799c4ab6f004) stand as judged in the two prior records and are untouched by this delta.

Delta review: one commit after 29111be8a75224b2c98eb1f9dfb995be6c132425 — c203ef8349 "chore(changeset): move the i18n label changeset to the root .changeset (#27002)". git diff -M 29111be8a7 c203ef8349 is a single 100%-similarity rename, ui/.changeset/27002-chatbot-tool-labels-package-docs.md to .changeset/27002-chatbot-tool-labels-package-docs.md, 0 insertions, 0 deletions; git ls-tree c203ef8349 ui/.changeset/ lists no 27002-* file. The net diff against main is still 14 files / +68 −2: the two root changesets, the registry, the lint test, the ten locale packs. No other file moved.

① Derived judgments

  • The prior record's must-fix — the @object-ui/i18n changeset sat in ui/.changeset/, which the release does not read and ui/AGENTS.md ⛔ forbids adding to — is answered, right. The file now sits in the repo-root .changeset/, the one directory the only changesets config (.changeset/config.json) reads; that config's fixed group lists @object-ui/i18n, so changeset version consumes the file and the @object-ui/i18n CHANGELOG carries the two keys. Its content is byte-identical to what the prior record judged right: '@object-ui/i18n': patch, Clause-②: no, Metadata-protocol: none, a summary naming both keys and the two tests it keeps green.
  • All earlier derived judgments stand unchanged: the registry's two names match the cloud service-ai set exactly; PLATFORM_PROVIDED_TOOL_NAMES / the lint accept-set widen by two; the ten packs each carry both chatbot.tool.* keys as sentences that equal neither the id nor the title-caser output; key sets are equal across packs.
  • No new accept-set or public-surface change: a rename of a .changeset/*.md publishes nothing by itself.

② Semver level

  • .changeset/27002-service-ai-package-doc-tool-names.md — @objectstack/spec: minor, Clause-②: yes (widening), Metadata-protocol: added: unchanged, matches the diff.
  • .changeset/27002-chatbot-tool-labels-package-docs.md — @object-ui/i18n: patch, Clause-②: no, Metadata-protocol: none: matches the diff (locale labels widen no published spec surface and alter nothing a metadata author writes; none takes patch), and now sits where the level and declaration readers (check-changeset-no-major, check-adr-0087-registration, check-empty-changeset) scan. Non-empty frontmatter, newly added by this PR (not a foreign edit), no narrowing arm, no major — nothing in those gates' rule sets is tripped by the moved file. Check Changeset on this head is still in progress at review time (two runs, both in_progress); the content it reads is the content judged here.
    Clause-②: yes (widening)

③ Boundary flags

  • Prior record's must-fix (changeset location) — answered. Prior record's should-fix (PR body naming ui/.changeset/...) — answered: the "What changes" bullet now reads .changeset/27002-chatbot-tool-labels-package-docs.md and states why (root .changeset/ owns the @object-ui/* fixed group; ui/.changeset/ is not read by the release); the 维护者速读 bullet never carried the path, so nothing there to patch.
  • Governed: no — still right; the move touches ui/.changeset/** (not governed) and .changeset/** (not governed). Governed Surface Queue Guard success on this head.
  • Card open_questions: none. Card claim File surface remains narrower than the diff, as recorded last round; stale, not wrong.
  • Check-runs on c203ef8349f6371f0b4fd79d15be3c1786e50f50 at review time: success — Governed Surface Queue Guard, Spec property liveness, PR-body guards (both runs), Check PR Size, Auto Label, Flag docs affected. In progress — Check Changeset (both runs), Lint · ESLint, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · repo & tooling gates, Lint · CI release & engine gates, Lint · scoped ×3, Type Check · workspace / source gates / consumer gates / debt ledger. Not yet registered — the ci.yml run's jobs (filter, Build Core, Plan Test Core shards, Test Core 1–8, Build UI Deps, Type Check UI, Lint UI, Build & E2E UI, and the Test UI (k/16) shards): no check-run of those names exists on this sha yet. The Test UI shards remain owed on this head, as on 29111be — the diff still carries ui/** paths (ten locale packs), which filter's ui glob matches — so the locale-parity and sentences tests will run in CI; none has started. Skipped — Packed-tarball smoke, 18.x upgrade harness (opt-in). Judged on what has concluded; nothing concluded red.

④ Design judgment

packages/spec/src/system/constants/platform-tool-names.ts — unchanged since 29111be; holds against ADR-0109 §2, the maintenance contract and the cloud first consumer as judged in the first record, with the ui/ label obligation now in its comment and the ten labels in the tree. The change is now whole on every side the registry reaches: the spec constant and its invariants, the lint accept-set and its pin, the console's step labels in all ten packs, and two changesets the release actually reads.

  • Tried to break the move: the renamed file's name follows the root convention the sibling spec changeset uses (27002- followed by a slug, .md); its frontmatter quoting ('@object-ui/i18n': patch) matches the sibling's; the fixed-group bump means @object-ui/i18n would have been versioned with the group regardless, so the only thing the move changes is that the CHANGELOG entry and the declaration lines now exist for the gates and the upgrading reader — which was the whole point. No leftover under ui/.changeset/, no second copy, no content drift between the two heads.
  • No must-fix. No should-fix outstanding.

Implemented-by: claude/project-thread-eb1lm2
Reviewed-by: session_0123kRqqdpAJWYMgsgdAJX4G

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Seat ACCEPT · repo:cloud#2 (#24145) · 2026-10-28T01:58Z · head c203ef8349 · not governed

The contract review at CONTRACT_REVIEW_TIER is PASS on this head, the third record above, so needs:contract-review is removed. Every check run on the head has concluded: 58 success, 11 skipped by path filter, 0 failed. The Test UI shards ran because the diff carries ui/**.

Landing: ready + auto-merge.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 28, 2026 01:59
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 28, 2026 01:59
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

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

    @objectstack/rest:test:  FAIL   local  src/data-nested-object-door.test.ts > [#20802] the nested-relation form at the public door — sqlite > the cap: a condition matching more related records than the
      ↳ 失败原因: @objectstack/rest:test: Error: Test timed out in 5000ms.
    

↳ 失败原因 是判读的关键:超时(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 队列共有 12 个失败构建(不含本次)。

分诊清单:

  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

Dequeue read · repo:cloud#2 (#24145) · 2026-10-28T02:34Z · not this PR's failure

The queue's CI run 40619563635 failed in exactly one place, Test Core (8/8): packages/rest/src/data-nested-object-door.test.ts › "the cap: a condition matching more related records than the cap is REFUSED…", which hit the 5000 ms timeout. This PR touches the spec tool-name registry, a lint test, ten ui locale packs and two changesets. None of them is on that path.

The timeout is already anchored on main:

No fix has landed yet to port. This is the one re-enqueue for this head: auto-merge is re-armed.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
os-zhuang pushed a commit that referenced this pull request Oct 28, 2026
…ix for #27037)

The case seeds RELATION_FILTER_ID_CAP (1,000) rows and deletes 1,001: 2.3 s
alone, past the default 5 s on a loaded full-suite queue shard, which
ejected #26960, #27011 and #27020 (#27037). The slowdown itself is
#27004's (since #26930 a 1,001-row predicate delete is about 18x slower);
this only budgets for it.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUs3Bshfmr8srPY21BVS4u
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

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

    @objectstack/rest:test:  FAIL   local  src/data-nested-object-door.test.ts > [#20802] the nested-relation form at the public door — sqlite > the cap: a condition matching more related records than the
      ↳ 失败原因: @objectstack/rest:test: Error: Test timed out in 5000ms.
    

↳ 失败原因 是判读的关键:超时(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 队列共有 20 个失败构建(不含本次)。

分诊清单:

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

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

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

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

    @objectstack/rest:test:  FAIL   local  src/data-nested-object-door.test.ts > [#20802] the nested-relation form at the public door — sqlite > the cap: a condition matching more related records than the
      ↳ 失败原因: @objectstack/rest:test: Error: Test timed out in 5000ms.
    

↳ 失败原因 是判读的关键:超时(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 已在队列失败 2 次(不含本次)。 内容未变而反复失败 ⇒ 高度怀疑 flaky 测试或与同组 PR 的语义冲突,重排不解决。
  • 过去 24h 队列共有 23 个失败构建(不含本次)。

分诊清单:

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

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

os-warren pushed a commit that referenced this pull request Oct 28, 2026
…ix for #27037)

The case seeds RELATION_FILTER_ID_CAP (1,000) rows and deletes 1,001: 2.3 s
alone, past the default 5 s on a loaded full-suite queue shard, which
ejected #26960, #27011 and #27020 (#27037). The slowdown itself is
#27004's (since #26930 a 1,001-row predicate delete is about 18x slower);
this only budgets for it.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUs3Bshfmr8srPY21BVS4u
(cherry picked from commit 6674ba8)
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 0fb0dda Oct 28, 2026
70 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-eb1lm2 branch October 28, 2026 06:26
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

  • Test UI (10/16) — 失败步骤: Run the ui tests (shard 10/16)

    × (f) CONTROL: offers it, once, to a member granted that permission 79ms
    FAIL   dom  packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx > ⌘K offers its navigation entries as the sidebar shows them (objectstack#26892) > (f) CONTROL: offers it, onc
      ↳ 失败原因: AssertionError: expected [ 'Alpha', 'Beta', 'Gamma' ] to deeply equal [ 'Alpha', 'Beta', 'Delta', 'Gamma' ]
    
  • Test UI (5/16) — 失败步骤: Run the ui tests (shard 5/16)

    × keeps every key the editor does not author from the pending draft, byte-for-byte 1086ms
    × CONTROL — with no pending draft the base is still the published body 1060ms
    × REFUSES the save when the save-time draft read rejects, rather than fall back to the published body 1036ms
    FAIL   dom  packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.packageDoorDraftBase-26837.test.tsx > PermissionMatrixEditPage — the PACKAGE door saves onto the pending draft (objectsta
      ↳ 失败原因: (这条 FAIL 之后 12 行内没有可识别的原因行 —— 点进 job 看)
    FAIL   dom  packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.packageDoorDraftBase-26837.test.tsx > PermissionMatrixEditPage — the PACKAGE door saves onto the pending draft (objectsta
      ↳ 失败原因: (这条 FAIL 之后 12 行内没有可识别的原因行 —— 点进 job 看)
    FAIL   dom  packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.packageDoorDraftBase-26837.test.tsx > PermissionMatrixEditPage — the PACKAGE door saves onto the pending draft (objectsta
      ↳ 失败原因: (这条 FAIL 之后 12 行内没有可识别的原因行 —— 点进 job 看)
    
  • Test UI (3/16) — 失败步骤: Run the ui tests (shard 3/16)

    × the package door draws the `*` entry too, and its save keeps the stored `*` entry 1043ms
    FAIL   dom  packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.objectGrantInherited-27010.test.tsx > every object-row control writes only what the admin sees change (objectstack#27010)
      ↳ 失败原因: (这条 FAIL 之后 12 行内没有可识别的原因行 —— 点进 job 看)
    

↳ 失败原因 是判读的关键:超时(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 已在队列失败 3 次(不含本次)。 内容未变而反复失败 ⇒ 高度怀疑 flaky 测试或与同组 PR 的语义冲突,重排不解决。
  • 过去 24h 队列共有 25 个失败构建(不含本次)。

分诊清单:

  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

documentation Improvements or additions to documentation protocol:system size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec: PLATFORM_TOOLS_BY_PACKAGE['service-ai'] lists read_package_doc and search_package_docs, the two package-doc tools cloud#3335 adds to the Ask agent

2 participants