Skip to content

docs(qa): correct four stale search-checklist texts from run #7629 - #7773

Merged
huangyiirene merged 1 commit into
mainfrom
claude/issue-7647-search-checklist
Aug 11, 2026
Merged

docs(qa): correct four stale search-checklist texts from run #7629#7773
huangyiirene merged 1 commit into
mainfrom
claude/issue-7647-search-checklist

Conversation

@huangyiirene

Copy link
Copy Markdown
Collaborator

Fixes#7647

Checklist/doc maintenance falling out of the search area QA run #7629 (framework 92f26f75). No product behaviour changes. One file touched: docs/qa/platform-checklist/areas/search.json.

Direction (the ruling this PR obeys)

#4706 Q2 = A: $contains is a case-SENSITIVE substring test; $icontains is the case-insensitive one. Per the maintainer ruling recorded in triage, case-insensitive remains the DECLARED truth for $search — so the checklist reconciles toward the declaration, not toward today's behaviour. The cross-field-object-search title, the search-filter.ts docblock citation and the case-insensitive declaration itself are therefore deliberately unchanged; knownGaps records #7641 as the expected FAIL on current builds. The product-side conformance gap belongs to #7641, not to this PR.

Itemized checklist — 落点 | before | after

#落点beforeafter
1cross-field-object-search · acceptance[2]one clause asserting "case-insensitive and select labels map to option values"split into two clauses: a textual case-fold clause narrowed to ['name'], and a select-label clause that states it proves nothing about the textual half
2cross-field-object-search · stepsPOST { search: 'Retail' } (label case) onlyadds the ['name']-narrowed 'retail' / 'Retail' pair — the textual probe pinned away from the select path
3cross-field-object-search · negative2 entries+1: a lowercase term missing a capitalized name is a case-fold FAIL (#7641), not thin data; the silent-drop negative now says to rule the case gap out first
4cross-field-object-search · variants[2]"case-insensitive $contains""case-insensitive textual matching ($icontainssemantics —$contains itself is case-SENSITIVE per #4706 Q2 = A)" — the old string was self-contradictory under the ruling
5cross-field-object-search · fixtures.knownGapsabsent+2: the #7641 expected FAIL with its located root cause, and the dogfood pin's blind spot (its only case assertion is a select label)
6cross-field-object-search · sourcedocblock cited flatlydocblock cited as the declaration that fieldClausesForTerm does not yet honor (#7641); +1 entry citing the #4706 Q2 = A ruling
7pinyin-flag-both-sides · acceptance[3]required the plugin log line 'OS_SEARCH_PINYIN_ENABLED is off — inert'reads the plugin roster / requires difference + a zero-hit pinyin grep; the inert line is kept only as the alternative oracle for a host that loads the plugin unconditionally
8pinyin-flag-both-sides · steps[6]"capture the boot log line proving the plugin went inert"capture both boots' plugin count / requires and grep the whole debug log
9pinyin-flag-both-sides · fixturesrequires +1 (debug boot log for both boots); knownGaps +1 recording that the log line is unobtainable under CLI serving, so the next author cannot restore it
10pinyin-flag-both-sides · sourceplugin cited flatlyannotated: reached only when the host loads the plugin
11rls-both-personas · fixtures.requires[0]INV-1001..INV-1008INV-1001..INV-1012 (12 rows), owner spread as counts (ada ×5 / linus ×4 / grace ×3), INV-1003 named as linus's
12rls-both-personas · acceptance[1].verify"no response reveals the true 8-row population"no hard-coded population — reconcile against the seed plus rows the run created
13rls-both-personas · source(INV-1001..1008 owner spread; …)(INV-1001..1012 owner spread; …)
14console-global-search · fixtures.requires[2]INV-1001..INV-1008 (same stale count duplicated)INV-1001..INV-1012 (12 rows), INV-1003's owner named
15console-global-search · fixtures.knownGaps2 entries+1: this path inherits the declared-case-insensitive contract and the #7641 executor gap (searchAll also emits $contains), so a case-driven miss is not scored as a palette defect
16four items · revision + historyrevision: 1revision: 2 + a history entry each, per the README change discipline (run records pin the revision they ran against)

diff --stat is 1 file / +47 −25, and every hunk maps to a row above.

Why (1) is the substantive one

Run #7629 scored the old clause FAIL, and the interesting part is why it had gone unnoticed for a release: the clause conflated two independent mechanisms, and the select-label half passes on a case-sensitive build because optionValuesMatching lowercases both sides in JS before emitting $in. So a green tick — and the green dogfood pin, whose only case assertion is a select label — said nothing about textual matching. The split plus the ['name']-narrowed probe is exactly the "single lowercase-name assertion" the run identified as the missing one.

Out of scope — reported, not edited

Two further copies of the case declaration are cross-lane and left untouched:

Verification

node scripts/checklist-select.mjs --self-test → 17/17 pass; area:search still resolves all 6 items.
node scripts/check-platform-checklist.mjs → the single pre-existing coverage.json · qa: UNCLASSIFIED problem (#7347), identical to base — no new problems.

No changeset: docs-only under docs/qa/** (skip-changeset label is the PM's to apply). No content/docs/releases/** edits.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RWxvQNohCm2gnSP5ACFGBV


Generated by Claude Code

…7647)
Checklist/doc maintenance only — no product behaviour changes, and no edits
outside `docs/qa/platform-checklist/areas/search.json`.
1. `cross-field-object-search` (rev 2) — the case-fold clause conflated two
mechanisms, textual case matching and select label→value mapping, and the
label half passes on a case-SENSITIVE build because `optionValuesMatching`
lowercases in JS. So a green tick said nothing about the textual half, which
is how #7641 survived a release with a green dogfood pin. Split into two
clauses with a `['name']`-narrowed probe that pins the textual case-fold away
from the select path, plus the step and negative for the lowercase-name
assertion run #7629 identified as the missing one.
Direction per the #4706 Q2 = A ruling: **case-insensitive is the declared
truth**, so the item reconciles TOWARD the declaration. The title, the
`search-filter.ts` docblock citation and the declaration itself are
deliberately unchanged; `knownGaps` records #7641 as the expected FAIL on
today's build. The variant string "case-insensitive $contains" was
self-contradictory under Q2 = A and now names `$icontains` semantics.
2. `pinyin-flag-both-sides` (rev 2) — the OFF-inertness clause demanded a plugin
log line that cannot appear under CLI serving: the flag gates one layer
upstream, the CLI omits `pinyin-search` from `requires`, so the plugin never
loads and never reaches its own inert branch (#7629: 47 plugins off vs 48 on,
zero "pinyin" in a 1.2 MB debug boot log). The clause now reads the plugin
roster difference — a stronger proof than the log line — and keeps the inert
line only as the alternative oracle for a host that loads the plugin
unconditionally.
3. `rls-both-personas` (rev 2) — the seed ships 12 invoices (INV-1001..INV-1012),
not 8. Three places carried the stale count; the no-count-leakage clause no
longer hard-codes a population at all.
4. `console-global-search` (rev 2) — same stale invoice count duplicated in its
RLS-parity fixture, and `knownGaps` now records that this path inherits the
declared-case-insensitive contract and the #7641 executor gap, so a run does
not score a case-driven miss as a palette defect.
`node scripts/check-platform-checklist.mjs` reports only the pre-existing
`coverage.json · qa: UNCLASSIFIED` problem (#7347), unchanged from base.
Fixes#7647
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWxvQNohCm2gnSP5ACFGBV
@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 11, 2026 2:26pm

Request Review

@huangyiirenehuangyiirene added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 11, 2026 — with Claude
@huangyiirene
huangyiirene marked this pull request as ready for review August 11, 2026 16:07
@huangyiirene
huangyiirene added this pull request to the merge queueAug 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

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

    �[41m�[1m FAIL �[22m�[49m src/data/api-methods-batch-conformance.test.ts�[2m > �[22mapiMethods conformance — single-record writes imply batch (#3026)�[2m > �[22mgrants bulk wherever it grants create /
    

历史信号:

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

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

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

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

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding: three checklist/doc corrections for the search area (from the #7629 run)

2 participants

@huangyiirene@claude