Repository navigation
Commit f86106b
docs(qa): wave-2 checklist-accuracy close-out, slice B — six areas (#27009)
Part of #25807 (wave-2 accuracy, slice B)
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:按 18.2.0 第二波五份测试记录,修正
ai、approvals、attachments-storage、i18n、platform-core、records-forms 六个领域共
35 条测试清单条目里的过时描述。只改文档,不动产品代码。
- 为什么改:这些条目的步骤、字段、错误码、界面文案或引用的测试文件已与当前代码不符(例如审批抽屉已移除、货币字段不再带
scale、动态摘要按读者语言渲染),下一轮运行会被误导或误判。
- 风险与回滚:只影响 QA 清单文本。三条断言随产品已变的行为改写(i18n.surface-matrix 的
a7/a10、records-forms.field-type-constraints 的 a2),旧版本的判定不再沿用。每条 revision
+1、追加一行 history,回滚即 revert 本 PR。
- 先看:`areas/records-forms.json` 的 field-type-constraints(scale
从“已知缺口”改为“拒收、不舍入”);`areas/i18n.json` 的 surface-matrix(a10
改为读者语言,#26167);`areas/approvals.json` 的 quorum-m-of-n(抽屉改为请求记录页)。
- 两分钟验证:`node scripts/check-platform-checklist.mjs`,预期打印
`check-platform-checklist: OK`、退出码 0。
- 需要你做的:无,席位落地。
## What changes
The slice-B close-out of the wave-2 checklist-accuracy findings that
RUNNER.md routes to the wave anchor ("close out through the wave's
anchor card … not extracted"). Sources: anchor comments 6433587719,
6433708086, 6433784748, 6433878766, 6433966437 and the run records
#26450, #26456, #26468, #26476, #26481. Every finding was read against
the code at base `fd246c22` before its edit; each item's new history row
names the files read.
- **35 items** in `ai` (5), `approvals` (7), `attachments-storage` (8),
`i18n` (2), `platform-core` (9) and `records-forms` (4): `revision` +1
from main's value and one appended `history` row each, citing the run
record that found it (`ref` is the anchor #25807, as slice A's rows
are). No existing history row is changed; the previous last row only
gains the comma the appended row needs.
- **Three clauses change meaning with the product**, and say so in their
history rows (a verdict for an older revision does not carry):
`i18n.surface-matrix` acceptance[7] (the served document is fifteen
groups, not twelve) and acceptance[10] (activity summaries render in the
reader's locale since #26167, not the write locale);
`records-forms.field-type-constraints` acceptance[2] (scale is enforced
by rejection, `max_scale`, and currency carries no scale; it was
recorded as an unenforced gap).
- `attachments-storage.upload-limits-scope-and-ownership` acceptance[3]
now scores pass from a pin the ref did not name
(`storage-upload-door-ownership.wall.test.ts`, HTTP over a booted wall);
`attachments-storage.chunked-upload-integrity` knownGaps[0] is closed
for its pin half by `storage-upload-organization-change.wall.test.ts`.
- No pin upgrades of the `Parked-on: #25807` partials. No
`studio-authoring`, `access-security`, slice-A area file or `RUNNER.md`
is touched.
| item | before | after | source record | what |
|---|---|---|---|---|
| ai.mcp-http-surface | 6 | 7 | #26468 | automated.ref and variants[2]
corrected |
| ai.mcp-stdio-fail-closed | 7 | 8 | #26468, #26481 | steps[4] waits for
the HTTP listener, and automated.ref names two corroborating files |
| ai.mcp-run-action-exposure-gate | 4 | 5 | #26476 |
acceptance[1].verify says which half the stock fixture discriminates |
| ai.mcp-validate-expression | 4 | 5 | #26468 | variants[2] and
automated.ref corrected |
| ai.mcp-oauth-private-host-transport | 4 | 5 | #26468 |
fixtures.requires[0] and steps[6] name the base-URL door and the
no-private-address case |
| approvals.quorum-m-of-n | 7 | 8 | #26456 | steps[8] and acceptance[4]
read the request page, not the retired drawer, and fixtures.requires[1]
names the admin's double role |
| approvals.inbox-metadata-actions | 6 | 7 | #26456 |
acceptance[1].verify names the override label |
| approvals.decision-only-via-service | 3 | 4 | #26476 | steps[5] names
the doors that pause and resume the contrast run |
| approvals.account-app-entry | 5 | 6 | #26481 | fixtures.requires[2]
says the invoice's account must be active, and acceptance[3] names the
door for the appended row |
| approvals.approver-resolution-matrix | 7 | 8 | #26476 | the
auto_approve marker names a real field |
| approvals.status-mirror-field | 4 | 5 | #26468 | automated.ref names
three corroborating pins |
| approvals.act-door-and-admin-rescue-slate | 4 | 5 | #26468 |
automated.ref says which 404 arm is pinned |
| attachments-storage.presigned-upload-roundtrip | 2 | 3 | #26468 |
automated.ref names a corroborating pin |
| attachments-storage.download-authz-both-sides | 8 | 9 | #26468 |
automated.ref names the component pin of clause 4 |
| attachments-storage.sys-file-status-pipeline | 4 | 5 | #26468 |
automated.ref gains attachment-lifecycle.test.ts |
| attachments-storage.upload-session-abort | 5 | 6 | #26468 |
automated.ref names two more storage-routes cases and the chunked
dogfood file |
| attachments-storage.inline-grid-receipt-cells | 4 | 5 | #26468 |
steps[0] names the base URL |
| attachments-storage.field-accept-maxsize-server-enforced | 6 | 7 |
#26476 | steps[1](B), steps[5] and negative[3] corrected |
| attachments-storage.upload-limits-scope-and-ownership | 2 | 3 | #26468
| automated.ref names two HTTP pins and rescores acceptance[3] |
| attachments-storage.chunked-upload-integrity | 7 | 8 | #26468 |
knownGaps[0], acceptance[0] and automated.ref follow the chunked-door
wall pin |
| i18n.surface-matrix | 11 | 12 | #26450 | acceptance[7],
acceptance[10], steps[17] and the appTranslationDataShape source line
corrected |
| i18n.strict-translation-key-rejection | 3 | 4 | #26456 | steps[3]
names the out-of-tree route |
| platform-core.boot-health | 11 | 12 | #26481 | steps[3] scopes the ⚠
read past the compile |
| platform-core.seed-integrity | 5 | 6 | #26481 | acceptance[1].verify
names the masked field |
| platform-core.builtin-apps-nav-render | 8 | 9 | #26481 |
fixtures.knownGaps[2] and steps[9] corrected |
| platform-core.settings-hub-roundtrip | 5 | 6 | #26456 | steps[9],
steps[10], steps[13], acceptance[9].verify and negative[1] corrected |
| platform-core.manifest-install-contract | 6 | 7 | #26476 |
acceptance[1] names the protocolVersion field, and the derivation clause
names the 20-character cut |
| platform-core.marketplace-install-local-lifecycle | 8 | 9 | #26476 |
acceptance[5] names the refusal code, and the member persona says how to
prove it |
| platform-core.runtime-config-boot-read | 4 | 5 | #26476 | steps[1]
says why cloudUrl is empty on the showcase |
| platform-core.seed-mode-matrix | 5 | 6 | #26476 | fixtures.requires[0]
names the earlier refusal |
| platform-core.v18-boot-refusals | 7 | 8 | #26481 |
acceptance[0].verify, steps[1] and fixtures.requires[1] corrected |
| records-forms.crud-roundtrip | 14 | 15 | #26481 | steps[0], steps[1],
steps[4], acceptance[4].verify and one source line corrected |
| records-forms.form-view-gallery | 4 | 5 | #26456 | steps[6] says how
to reach the page form |
| records-forms.field-type-constraints | 4 | 5 | #26450 | acceptance[2],
negative[3], steps[3], fixtures.requires[0], knownGaps[0] and one source
line follow the enforced scale contract |
| records-forms.field-group-visible-when | 9 | 10 | #26456 |
acceptance[3] says when the detail page re-gates |
### No change, because …
- `ai.skill-instructions-mcp-prompts`,
`approvals.email-action-token-door`,
`attachments-storage.read-inherits-parent-rls`,
`attachments-storage.attach-requires-parent-edit`,
`attachments-storage.orphan-tombstone-reap`: the run's line is "ref
accurate" (a confirmation); re-read, still true.
- `ai.mcp-coded-refusals-and-runtime-exposure`: a confirmation that
revision 3 already names both files; both exist.
- `approvals.request-page-reply-and-reader-visibility`: ref accurate;
the extra service-unit comment cases corroborate acceptance[1] below its
layer only.
- `approvals.decision-action-matrix` A1: an observation (a skipped
exec_review step is logged); the run says the discriminator holds.
- `approvals.account-app-entry` acceptance[0] "the runner builds the
console itself": that is the clause's design.
- `approvals.approver-resolution-matrix` "administrators are identified
by sys_member role": the item identifies them by their grants, as
`approval-service.ts` organizationAdministrators does; the membership
role is only the grant's provisioning source.
- `attachments-storage.field-accept-maxsize-server-enforced` recipe line
(`media_qa_media`): already closed by revision 6 (#26876,
`qamedia_media`). The item's other three lines are edited above.
- `records-forms.action-location-matrix` ("authoring refuses a throwing
visible"): already in knownGaps[2] since revision 16 (#26625), which
cites #26456.
- `records-forms.record-discussion-mentions` (`qa_nofeeds` → 422
NAMESPACE_PREFIX): already renamed `qafeeds_nofeeds` (revision 11).
- `records-forms.field-group-visible-when` namespace line: steps[1]
already declares namespace `qagroup` and names `qagroup_group_gate`. Its
other line is edited above.
- `platform-core.boot-health` "no default-level line names the Console
mount path": no clause reads a mount line; acceptance[5] reads `GET
/_console/`.
- `ai.mcp-oauth-private-host-transport` "missing clause: AS metadata
issuer equals authorization_servers[0]": that is the open product defect
#26472; its fix owns the clause.
- The other items the sources name in these areas
(`approvals.per-group-signoff`,
`i18n.notification-localized-and-clears`,
`i18n.flow-copy-translation-and-host-override`, `platform-core`
console-login, nav-surfaces-render, metadata-registry-serving,
metadata-authoring-roundtrip, interrupted-migration-boot-report,
activation-ledger-registration-home, activation-ledger-row-contract,
url-overlay-contract, lifecycle-retention-sweep,
settings-audit-secret-fingerprint,
protocol-18-handshake-and-stored-replay,
settings-organization-isolation-and-platform-rung,
serve-composition-v18, and the remaining `records-forms` items of
#26450): named only with clause verdicts or parked partial coverage, no
accuracy line. #26481 re-checked every wave-1 line on its P0 items and
found them fixed.
- **Gaps, not edited (need a pin or a run, not text):**
`approvals.decision-only-via-service` has no pin and #26468 carried it
NOT-RUN; `records-forms.record-edit-undo` is carried BLOCKED (no
packaged undoable update action on the showcase).
## Tests
No product code changed, so no package test is owed. `node
scripts/check-platform-checklist.mjs` exits 0 at the head
(`check-platform-checklist: OK — 16 areas, 329 items (324 active, 1
planned)`). The edits were applied by a script that rebuilds each file
from base text and asserts, per area, that only the 35 items differ,
each at base revision + 1 with exactly one appended history row and
every earlier row equal.
## Acceptance notes
- `approvals`: four items not named by any wave-2 source still describe
the retired request drawer (viewer-gating-submitter-side,
notification-deep-link, dynamic-approver-routing, inbox-keyboard-flow).
Rewriting them is not mechanical (inbox-keyboard-flow's drawer walk may
describe removed behaviour), so they are reported for the anchor, not
edited here.
- `approvals.approver-resolution-matrix` steps[6] / acceptance[5] still
describe `queue` as a dead slot (#3508), while `approval-service.ts` now
expands a queue to its members (ADR-0142 D6) and only warns when it
expands to nobody. Not named by a wave-2 source; reported for the
anchor.
## Verification
<details><summary>Derived gates at afa60d7 (dispatch-gates --commands,
then --ran)</summary>
16 derived commands, each exit captured before any pipe: check-adr-links
0, --self-test 0, check-closing-keyword-parity 0, --self-test 0,
check-comment-mask-corpus 0, plan-test-core-shards --self-test 0,
check:doc-formula-expressions 0 (first run exit 3 PREREQUISITE NOT MET;
re-run after a locked turbo build of @objectstack/formula and
@objectstack/lint, VERDICT command-exit 0), check:ci-filter-parity 0,
check:cross-package-test-inputs 0, check:doc-authoring 0,
check:driver-memory-census 0, check:gitlink-declared 0, check:nul-bytes
0, check:platform-checklist 0, check:refd-timer-probe 0,
check:watch-hint-literal 0. `--ran`: 16 derived families accounted for,
16 run, 0 NOT-MEASURED.
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QSeKYkzo6HfVywHEmtRgH2)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent c6bc269 commit f86106b
6 files changed
Lines changed: 329 additions & 119 deletions
File tree
- docs/qa/platform-checklist/areas
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
182 | | - | |
| 182 | + | |
183 | 183 | | |
184 | 184 | | |
185 | 185 | | |
| |||
214 | 214 | | |
215 | 215 | | |
216 | 216 | | |
217 | | - | |
| 217 | + | |
218 | 218 | | |
219 | 219 | | |
220 | 220 | | |
| |||
261 | 261 | | |
262 | 262 | | |
263 | 263 | | |
264 | | - | |
| 264 | + | |
265 | 265 | | |
266 | 266 | | |
267 | 267 | | |
| |||
279 | 279 | | |
280 | 280 | | |
281 | 281 | | |
282 | | - | |
| 282 | + | |
283 | 283 | | |
284 | | - | |
| 284 | + | |
285 | 285 | | |
286 | 286 | | |
287 | 287 | | |
| |||
313 | 313 | | |
314 | 314 | | |
315 | 315 | | |
316 | | - | |
| 316 | + | |
317 | 317 | | |
318 | 318 | | |
319 | 319 | | |
| |||
336 | 336 | | |
337 | 337 | | |
338 | 338 | | |
339 | | - | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
340 | 346 | | |
341 | 347 | | |
342 | 348 | | |
343 | 349 | | |
344 | 350 | | |
345 | 351 | | |
346 | 352 | | |
347 | | - | |
| 353 | + | |
348 | 354 | | |
349 | 355 | | |
350 | 356 | | |
| |||
358 | 364 | | |
359 | 365 | | |
360 | 366 | | |
361 | | - | |
| 367 | + | |
362 | 368 | | |
363 | 369 | | |
364 | 370 | | |
| |||
425 | 431 | | |
426 | 432 | | |
427 | 433 | | |
428 | | - | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
429 | 441 | | |
430 | 442 | | |
431 | 443 | | |
| |||
0 commit comments