Skip to content

refactor(metadata-protocol): move the legacy-organization row filters out of protocol.ts into protocol-legacy-organization-rows.ts (#25467 cut 29) - #27029

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

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Part of #25467
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6270097840

Cut 29 of the protocol.ts split (#24586 ruling A, recorded in 6270097840). Cuts 1–28 landed as #25494, #25518, #25538, #25589, #25601, #25623, #25642, #25719, #25731, #25740, #25797, #25939, #25972, #26014, #26104, #26168, #26264, #26317, #26350, #26366, #26404, #26449, #26654, #26704, #26807, #26873, #26933 and #26980. The claim is 6457847737. It takes the cut 29 proposal of the cut 28 report (6456729821), a themed pair. Both members passed the AST screen and the read-seam census, and both moved unedited.

Two ObjectStackProtocolImplementation members move unedited into one new module, packages/metadata-protocol/src/protocol-legacy-organization-rows.ts (#23050 shape B). They are the legacy-organization row filters. On a database the ADR-0131 ceremony has not migrated, these find the rows that still belong to one organization rather than to the environment:

  • legacyOrganizationRowsOf: those rows of one table, read off the physical column through the table's driver. A read inside a transaction joins it.
  • withoutLegacyOrganizationRows: a row list with those rows left out.

findEnvironmentRow stays in the class, as the claim says: a census trial moving it dropped the count 88 → 81 in the cut 28 report. protocol.ts grows by 4 net lines (29,384 to 29,388): 9 body lines left, and 11 stub lines plus the 2-line import came in. The cut is move-only, and the card stays open for later cuts.

Branch claude/project-thread-ybjm3h is the harness-pinned branch for this thread. It was restarted from main 3271a0834c (after cut 28's merge). It names no issue, so the claim comment is the identity record. It holds the move commit 0522e4d4ea and, as the claim asked, one merge of main, ad684a0ce3 (7 commits). That merge touches nothing in packages/metadata-protocol/. The merged tree was still measured against main (see "The merged tree against main").

Serial with the file's in-flight PRs

The claim named #26920 as the open PR that also edits protocol.ts and asked for a git merge-tree against it before this PR was opened.

  • fix(metadata-protocol,runtime,app-shell)!: refuse a save or draft publish naming a package that is not installed #26920 (head 380f37a55a) edits protocol.ts at :16153–16206 and :20256 (+54 / −17), plus other files of this package. It names neither moved member. This cut's hunks are at :425 (the import) and :10212–10225.
  • Its git merge-tree against this head ad684a0ce3 is clean.
  • That merged tree was type-checked: git merge-tree to a tree, then tsc --noEmit in packages/metadata-protocol on that tree exits 0. On it, the moved bodies still compare 187 tokens, 0 differ.
  • Its merge-tree against main alone is clean too.

All 30 open PRs were checked against this head as well. Five touch this package (#26937, #26920, #26831, #26556, #26517), none names either member, and every one is merge-tree clean against this head and against main. #26831's earlier conflict with main is gone.

main has not moved since the merge (0 behind at the derivation).

The order's screen (private statics, new Error(, the read-seam census)

Both members passed:

  • No private-static read. The AST walk found no access on the ObjectStackProtocolImplementation identifier and none on this.constructor.
  • No error constructed. Neither body has new Error(, so no PRODUCERS row is owed.
  • Read-seam census. check-durability-degradation-log-level --list was taken on the base and again on the cut. Both read 89 read seam(s), the base the claim quotes, and the lists are identical once [@:][0-9]+ is stripped. The full readings are under "The durability --list".

What moves

Member Base line Visibility Body lines AST tokens (params + return + body) Reads
withoutLegacyOrganizationRows<R> :10212 private async, generic 3 102 legacyOrganizationRowsOf (method)
legacyOrganizationRowsOf :10218 private 6 85 engine (field); module-level readLegacyOrganizationRows

protocol-legacy-organization-rows.ts has 74 lines.

The shape (#23050 shape B, as cuts 1–28 apply it)

  • The class keeps both members. Each keeps its name, signature and position (neither has a docblock). Each body now delegates, marked [#25467 cut 29].
  • LegacyOrganizationRowsHost types the two members the bodies read as the class members themselves (ObjectStackProtocolImplementation['engine'] and ['legacyOrganizationRowsOf']). Each function's this is a Pick of the members it reads.
  • The engine field is handed over as a getter, so the read finds it at call time, as before.
  • withoutLegacyOrganizationRows's call to legacyOrganizationRowsOf is handed over as a closure, (...a) => this.legacyOrganizationRowsOf(...a), as the claim asked. So that call still reaches the class method (now its stub), not the moved function directly.
  • The generic member is called through an instantiation expression, (withoutLegacyOrganizationRows<R>).call(host, table, rows, context), as cut 11 did for materializeFromRegistry<T>. So the stub still returns Promise<R[]>, not Promise<unknown[]>.
  • No member changes visibility.
  • Every caller still calls the class method. None changes:
    • withoutLegacyOrganizationRows: findEnvironmentRows (:10185, base).
    • legacyOrganizationRowsOf: findEnvironmentRows (:10190), findEnvironmentRow (:10206), withoutLegacyOrganizationRows (above) and :26506.

Module-level declarations, by reader: no import leaves protocol.ts

Measured by an AST walk over each body's identifiers, against protocol.ts's top-level declarations and import bindings (property names excluded).

The one module-level name the bodies read is readLegacyOrganizationRows, from @objectstack/metadata-core. It has two other code readers in protocol.ts (:21892 and :28524, base), so it stays, and so does its [ADR-0131 D6/D7] import comment. The new module imports it from there too. So the top level of protocol.ts changes by the new module's import alone.

The published .d.ts

The series bar is ruling 6348891160: sorted-union identity, measured first, with raw identity reported when it holds. Both hold for this cut, including on the merged tree against main. The cut adds one import statement and its comment ahead of every class docblock, so the cut 25 comment-offset trap was watched. It did not fire: the raw hash is identical at both ends.

Base 3271a0834c and head 0522e4d4ea were built with pnpm --filter @objectstack/metadata-protocol build against one dependency tree. The closure was built at head by a full pnpm build (116/116). For the base build, the package's src/ was swapped tree-only to base (the new module removed) and restored from HEAD under a trap. Afterwards git diff HEAD was empty, git status was clean, and both touched blobs equalled HEAD's.

  • Normalised sha256 (the ruling's bar): a9338265ddd795ccfd7fda56ee209f3c2e162f9153766351149994f20e92715f at both ends, on dist/index.d.ts and dist/index.d.cts. The normaliser sorted 80 string-literal union runs. Sorted-union identity holds.
  • Raw sha256: 7307bcccb6026da6c004fa2daaca634d3419d202d6b742c122a7a3c64a552712 at both ends, 781,687 bytes. Raw identity holds.
  • The two builds differ where they should.
    • index.js hashes a604e2fd4c5cb76c… at base and 16b25c206072e2f3… at head (index.cjs 5beb42aa247530b3… → 7aec221248f758d4…).
    • ….call(host goes 0 → 1 for each of the two members in both bundles.
    • Each function …( declaration goes 0 → 1.
  • Positive control on the head tree. private was dropped from legacyOrganizationRowsOf on disk (restored from HEAD under a trap) and the package rebuilt. Both .d.ts files move to 38b33a942d07398f… (normalised a0c35bd1e1a5b943…, which differs from the bar's a9338265…) and print legacyOrganizationRowsOf(table: string, context?: unknown): Promise<ReadonlyMap<string, string>>;. So the bar can see a change on these members.
  • Export tables. The ESM and CJS bundles, loaded at runtime from the package, each export the same 78 names at base and head. The sorted list hashes to 9f18a0177ac736ed… on all of them. Neither function, and not LegacyOrganizationRowsHost, appears.

The merged tree against main

The merged tree ad684a0ce3 was measured against main 7eb613c39f, its second parent, in the same way. The closure was rebuilt by a full pnpm build (116/116), and main's package src/ was swapped in tree-only and restored under a trap. The merged tree differs from main only by this cut: 2 files, +87 / −9.

  • .d.ts: raw 7307bcccb6026da6… (781,687 bytes) and normalised a9338265ddd795cc…, the same at main and merged. Both identities hold.
  • index.js: a604e2fd4c5cb76c… at main, 16b25c206072e2f3… merged. Export tables: 78 names, 9f18a0177ac736ed… on both.
  • AST compare, main's protocol.ts against the merged one: 187 tokens, 0 differ.
  • Suite: main and merged both give 21,748 tests (21,722 passed, 0 failed, 26 skipped, 279 files), per test identical.

No changeset: skip-changeset, per ruling 6348891160.

The durability --list

check-durability-degradation-log-level exits 0 at both ends with identical output: 89 read seam(s) at both ends, the base the claim quotes. Its --list is identical once [@:][0-9]+ is stripped (165 lines, and no entry changes file).

  • Neither body has a try. legacyOrganizationRowsOf hands its read to readLegacyOrganizationRows, and neither body calls the gate's read vocabulary (find/findOne/count).
  • No seam enters or leaves the census. findEnvironmentRows and findEnvironmentRow, the seam members that call these two, stay in the class.
  • On the merged tree the list is identical too, 89 read seam(s).

Proof of move-only

Bodies, by AST token. The compare reads the TypeScript compiler's AST leaf tokens, with JSDoc skipped, over the parameters (less the added this), the return type and the body. It compares base protocol.ts at 3271a0834c against the head module:

withoutLegacyOrganizationRows: base tokens 102, head tokens 102, differ 0, text-equal(ws-collapsed, comments incl.) true
legacyOrganizationRowsOf: base tokens 85, head tokens 85, differ 0, text-equal(ws-collapsed, comments incl.) true
TOTAL tokens=187 differ=0 members=2
CLASS members base=303 head=303 order-same=true byte-identical=301 stubs-with-identical-docblock+signature=2 other=[]
TOP base=262 head=263 byte-identical=262

Negative controls, one per member. Each changed one token in an in-memory copy of the head module, and only the mutated member moved (differ 1; the other stayed 0):

"rows.length === 0) return"        -> "rows.length === 1) return"     withoutLegacyOrganizationRows differ 1
"transaction !== undefined ?"      -> "transaction === undefined ?"   legacyOrganizationRowsOf differ 1
  • Class side. There are 303 members at base and at head, in the same order. The 301 that did not move are byte-identical to base, leading comments included. Both stubs sit at their base positions and keep their signatures (and type parameter) byte-identical.
  • Top level of protocol.ts. All 262 base statements are byte-identical, leading comments included. Head adds one statement, the new module's import.
  • Size. +87 / −9 over 2 files, 96 changed lines (the claim's estimate was 80–130).

Readers of the moved lines

These were grepped for the two member names and for the bodies' distinctive text (readLegacyOrganizationRows(, getDriverForObject):

  • the 24 files that name protocol.ts and call readFileSync;

  • the test files in packages/, docs/qa/ and scripts/;

  • the @objectstack/spec liveness ledgers.

  • By path: none reads a moved line.

  • Same names elsewhere, not readers. sys-metadata-repository.ts and packages/metadata/src/loaders/database-loader.ts each have their own withoutLegacyOrganizationRows method on another class. As the claim says, those are not part of this cut.

  • Behaviour, no edit owed. The doors that read through findEnvironmentRows / findEnvironmentRow are driven by the package suite, which passes at both ends. readLegacyOrganizationRows itself is tested in metadata-core (legacy-organization-row.test.ts).

  • The liveness ledgers. No row points at either member. Carried forward: manifest.json's dependencies row → protocol.ts#resolveWritePackageScope (cut 19), and seed.json → protocol.ts#applySeedBodies (cut 14). These are packages/spec/**, outside this card.

  • ADR anchors. check-adr-anchors exits 0 at both ends.

    • The decision-letter count is unchanged at 1,896.
    • The citation count goes 60,108 → 60,109 and the file count 8,432 → 8,433. That is the new module's header, which names the ADR-0131 ceremony it describes. No moved line cites an ADR.
  • Engine-double contract (check-engine-double-contract): exits 0 at both ends.

    • The updateData/deleteData seams keep their entries at new line numbers (14005 → 14009, 14030 → 14034).
    • productionFiles is 3,819 at base and 3,821 at head. The +2 are the new file and the gitignored packages/spec/src/migrations/registry.ts that the spec build writes in the head tree, as in cuts 20–28.
  • Identical output at both ends: check-adr-symbol-anchors, check-system-context-census, check-tenant-audit-census, check-query-options-erasure-ratchet, check-filter-alias-parity and check-durability-degradation-log-level. check-nul-bytes differs only in the scanned file count, +1. The base-end readings were taken in a clean detached worktree at 3271a0834c.

Verification

  • tsc --noEmit in packages/metadata-protocol exits 0 at head, on the merged tree, and on the merge-tree with fix(metadata-protocol,runtime,app-shell)!: refuse a save or draft publish naming a package that is not installed #26920.
  • pnpm exec eslint --no-inline-config packages/metadata-protocol exits 0 with no output (the whole touched package, with the root lint script's flags).
  • packages/metadata-protocol suite, compared per test name and status. Each leg ran vitest --maxWorkers=2 with the JSON reporter under the shared verify lock.
    • Base 3271a0834c: 21,748 tests (21,722 passed, 0 failed, 26 skipped), 279 files.
    • Head 0522e4d4ea: 21,748 tests (21,722 passed, 0 failed, 26 skipped), 279 files.
    • None lost, none added, none changed status. The base leg is the package src/ swapped tree-only from 3271a0834c (the new module removed) and restored from HEAD under a trap.
    • The merged head ad684a0ce3 and main 7eb613c39f both give 21,748 tests, per test identical (0 lost, 0 added, 0 changed).
  • check-platform-checklist --changed-from origin/main (merged tree): OK, 31 anchors judged, 0 lost.
  • Governed surface. check-governed-merges --branch claude/project-thread-ybjm3h finds 0 of 2 paths in the register (13 surfaces), so the PR is NOT governed. It has 96 changed lines, under the 3,000-line human-merge bar.
  • Derived gates. dispatch-gates --commands --repo objectstack-ai/objectstack derives 46 gates on 2 changed paths from ad684a0ce3, with no stale-tree finding. All 46 exit 0 after the full pnpm build (116/116). dispatch-gates --ran reports 46 derived, 46 run, 0 NOT-MEASURED and 0 UNRUN, and exits 0.

Carry-forward

These stay in protocol.ts:

  • The read-seam members (cut 21): findEnvironmentRows, findEnvironmentRow, packagelessAddress, findServedOverlayRow, foldStoredCollection, applyObjectRegistryMutation, unmanagedImportCollisions, rollBackUnmanagedImport, readRevertableCommit and storedFlowBindingAgrees. rethrowUnlessMetadataStoreUnprovisioned cannot move at all.
  • Public members whose return type is inferred.
  • The bodies kept by a by-path reader:
    • probeRecord, getMetaItemCached, findReferencesToMeta, refuseUnmintableMetaType and metaTypeNamespaceExists.
    • viewContainerNameCollisionRefusal with overlaidShippedContainerViewNames, and reportPageRequiresAbsentAtLoad.
    • The 7 applyRegistryWriteThrough callers, readCodeLayerForCarryForward, ensureObjectStorage, dropObjectStorage and applyRemoteMetadataMutation.
    • emitMetadataMutation, and getOverlayRepo.
    • isArtifactBacked, isNestedArtifactField and packagedArtifactBase (the lookupArtifactItem site pins).
  • The private-static readers: refusePackagedBaseRemoval, packagedBaseRefusal, runPublishSideEffects, promoteDraftForPublish, publishPackageDrafts and discardPackageDrafts.
  • The field writers: warnClosureReadUnavailable and resolveSduiManifest.

🤖 Generated with Claude Code

https://claude.ai/code/session_016SP1spj613tyGCgxoD1An6

… out of protocol.ts into protocol-legacy-organization-rows.ts (#25467 cut 29)

Move-only, shape B. withoutLegacyOrganizationRows and legacyOrganizationRowsOf
move, unedited, into one module. The engine field is handed over as a getter;
withoutLegacyOrganizationRows's call to legacyOrganizationRowsOf is handed
over as a closure, so it still reaches the class method.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

4 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
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 55 of 207 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 10 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 a90163d4779204abb010767c2a092e52dbecafae → packageMentionDocs.

Which tree this was computed on

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

node scripts/docs-audit/affected-docs.mjs --json a90163d4779204abb010767c2a092e52dbecafae

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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-28T02:39Z

Head ad684a0ce3 (move 0522e4d4ea plus one main merge), report 6458845738 (on #25467), claim 6457847737. No contract review is owed: there is no packages/spec/** diff, no governed path, no narrowing and no Clause-②: yes.

item reading
Shape Draft, base main, Part of #25467 (cut 29). 2 files: protocol.ts and one new module for the claimed theme, protocol-legacy-organization-rows.ts (withoutLegacyOrganizationRows, legacyOrganizationRowsOf). skip-changeset (move-only). Clause-②: no, Metadata-protocol: none.
Move check (seat) All 9 non-blank lines the PR removes from protocol.ts are found verbatim (indent-stripped) in the new module. The added lines in protocol.ts are the import with its header comment and two stubs, each through LegacyOrganizationRowsHost: engine is handed over as a getter, withoutLegacyOrganizationRows reaches legacyOrganizationRowsOf through the class member, and the generic stub calls (withoutLegacyOrganizationRows<R>).call, the instantiation form cut 11 used. Callers and overrides still go through the class. findEnvironmentRow stays, as claimed.
Evidence CI green on head ad684a0ce3 (34 success, 17 skipped, 0 failed). Governed check: NOT governed, 96 changed lines. The report gives an AST compare of 187 tokens with 0 differ (each negative control differs by 1), raw and sorted-union .d.ts identity (ruling 6348891160) at both ends and on merged vs main, the suite at 21,748 tests identical, the read-seam census at 89 with an identical --list at base, head and merged, and 46 of 46 derived gates.
Overlap The claim named #26920. Its merge-tree with this head is clean, tsc on that merged tree exits 0, and the moved bodies still compare 187/0. All five open PRs touching the package are clean against it.
Landing 「按照 pm-dispatch 规则复核过的都授权」 (Leehom, 2026-10-25T11:35Z): ready and auto-merge through the relay, once every check on this head is green or an expected skip.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 28, 2026 02:40
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 28, 2026 02:40
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

队列构建 40631228200 红了。队列跑的是全量套件(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 队列共有 23 个失败构建(不含本次)。

分诊清单:

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

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

Merged via the queue into main with commit 68748c3 Oct 28, 2026
52 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-ybjm3h branch October 28, 2026 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants