Repository navigation
Commit ebd312a
docs(qa): platform-core checklist accuracy, wave-3 slice S4 (#28358)
<!-- claude-projects-attribution: {"github_login":"os-zhuang"} -->
_Requested by **Sam** · [project
thread](https://claude.ai/code/project/chan_01LjZwNRFiG2fkp8SNf6rHNx?thread=cmsg_01LjZwNRFiG2fkp8SNf6rHNxABpunB3iqQDnjaY4K7CCMn)_
Fixes #28338
Part of #27377
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:只改 `docs/qa/platform-checklist/areas/platform-core.json` 一个文件,15
个条目按当前代码修正文字,每条 revision +1、追加一行 history。
- 为什么改:18.3.0 第三波测试在 #27377 上挂了 19 条清单准确性发现(S4 分片),逐条在 main 上复核后改到与代码一致。
- 风险与回滚:纯 QA 清单文本,不发布任何包、不动产品代码;回滚即 revert 本 PR。
- 先看:`activation-ledger-row-contract`(门的类型从 4 个变 6 个,墙从 6 值变 8
值)、`docs-audience-gate`(与发现结论相反:stock
其实带一个翻译文档)、`builtin-apps-nav-render`(Setup 目的地重数为 48)。
- 两分钟验证:`pnpm check:platform-checklist`,预期输出 `check-platform-checklist:
OK — 16 areas, 352 items`。
- 需要你做的:无,席位落地。
## What changes
One file, `docs/qa/platform-checklist/areas/platform-core.json`. Fifteen
items each take `revision` +1 and exactly one appended `history` row
that cites its run record and #27377; main's history stays an exact
prefix on every item. Every census row was re-read against main at
`3fd80337` (no commit touched the file between census base `501c864dd5`
and that head), by reading the code it names and, for five rows, by a
live read on a fresh `os dev --seed-admin` showcase boot at the same
sha. No clause is weakened; four are made stricter.
| census row | item | edit |
|---|---|---|
| 3 | `docs-audience-gate` | knownGaps[0] and steps[7] name the stock
translated doc. **Opposite of the finding's suggestion**: stock DOES
ship one, `showcase_index` (zh variant) in `showcase_manual`. The run
missed it because every `/meta/doc` read drops `translations`. Read
live: zh-CN tree label `Showcase 示例`, and 0 of the 9 docs `GET
/meta/doc` serves carries the key. |
| 22 | `manifest-install-contract` | steps[2] adds the AHEAD probe,
`^(RT+1)`. acceptance[1] scopes `migrateCommand` to a target major at or
below the runtime's; above it, the member is absent and the message
names the upgrade (stricter: a `migrate meta` offered there is a FAIL).
|
| 120 | `notification-center` | steps[5] and acceptance[3].verify: mark
a group nothing is still adding to, not the per-minute digest group. |
| 121 | `package-lifecycle-enable-disable` | steps[0] names the
namespace prefix, the `sharingModel` values and the nav entry as an
`app` item. acceptance[5].verify names both stale deep-link shapes (list
and record). |
| 122 | `settings-hub-roundtrip` | steps[7] and acceptance[6].verify:
plugin-email is mounted on stock, so the answers are its two texts (both
read live as 400 `SETTINGS_ACTION_FAILED`). steps[11]: the reachable
in-process consumer is mail/test against a capture SMTP. |
| 134, 145, 182 | `v18-boot-refusals` | requires[1]: a 17.7.0
blank-scaffold DB (the showcase is `private: true` and was never
published), or the planted-shape recipe. acceptance[1] pins the ceremony
spelling to the boot mode (`--dev` on a dev boot), which is stricter. |
| 146 | `boot-health` | steps[3] and acceptance[2].verify end the boot
window at the first non-health request, because health answers 200
before the banner prints. |
| 147 | `builtin-apps-nav-render` | steps[5] recounted at head: **48**
Setup and 8 Account leaves (live). |
| 175 | `activation-ledger-row-contract` | The catalog door's closed
`:type` set is six (adds `queue` and `assignment_rule`, ADR-0142 D1/D5).
The wall is eight values, and the stock sweep still reads six because
the showcase declares neither. Title, fixtures, steps[2], acceptance[4],
negative[5], source[6] and two new variants. The 400 listing all six was
read live. |
| 176, 177 | `metadata-registry-serving` | `/meta/types` is the same
handler as `/meta`, not a richer listing. acceptance[2] becomes the
parity clause (stricter; bodies read byte-identical live).
acceptance[0].verify states what the pin asserts. |
| 181 | `serve-composition-v18` | The no-storage leg needs a HOST
config. A plugin-less config boots on the standalone SQLite default by
design (`shouldBootWithLibrary` sends it to `createStandaloneStack`). |
| 227, 231 | `metadata-authoring-roundtrip` | The writable package
declares `dependencies: { 'com.example.showcase': '*' }`, otherwise
publish-drafts refuses the view (`list-view-object-outside-closure`).
steps[7] adds Kind=full and the Save button's accessible name. |
| 228 | `lifecycle-retention-sweep` | No live surface carries
`report.skipped`. The live leg is the retained audit row, and the
archive-pending skip is unit-pinned only. |
| 229 | `protocol-18-handshake-and-stored-replay` | steps[1] reboots
before the GET, because a planted row is served from cache until a
reboot. steps[2] keeps an edited artifact copy beside its runtime
module. |
| 230 | `url-overlay-contract` | steps[5]: drive the drill by following
the link's href. A plain click opens the peek drawer and adds no
`from=`. |
## Why
The 18.3.0 wave-3 census (anchor #27377, census note 6539602007) parked
these accuracy findings on S4. RUNNER-driven runs score items as
written, so text that no longer matches the code produces false fails
(health-green cut, digest race, `--dev` literal) or blocks runs that are
in fact runnable (the translated doc, the dependency, the host config).
## Tests
All runs are at head `af8d16ea`.
<details><summary>dispatch-gates --commands (16 families) — all exit
0</summary>
```text
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:platform-checklist :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0
dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all 16 recorded an exit code and none of them is 3).
check-platform-checklist: OK — 16 areas, 352 items (347 active, 1 planned)
```
</details>
<details><summary>Live reads, fresh showcase boot at 3fd8033 (os dev
--fresh --seed-admin)</summary>
```text
GET /meta/app -> showcase_app, setup, account
GET /meta/app?id=setup (admin) -> 48 nav leaves (groups excluded)
GET /meta/app?id=account (admin) -> 8 nav leaves
GET /meta/book/showcase_manual/tree, Accept-Language zh-CN -> showcase_index label "Showcase 示例" (no header: "Showcase")
GET /meta/doc (admin) -> 9 docs, 0 carry a translations key
POST /api/settings/mail/test {} -> 400 SETTINGS_ACTION_FAILED "SMTP host is required — nothing was sent."
POST /api/settings/mail/test {values:{provider:"log"}} -> 400 SETTINGS_ACTION_FAILED "No delivery transport is active — …"
POST /security/_activation/capability/showcase.export_data -> 400 ":type one of position, permission, sharing_rule, webhook, queue, assignment_rule"
GET /meta/types vs GET /meta -> byte-identical bodies (same md5)
```
</details>
Structural check: on every one of the 15 edited items, main's `history`
is an exact prefix, exactly one row was appended, and `revision` equals
main's + 1 and the new last row's revision. No other item changed.
## Acceptance notes
- Row 3 goes against the finding. The finding asked knownGaps[0] to say
stock has no translated doc. Code and a live read both show that it has
one, so the edit names that doc and the read trap that hid it.
- Row 229's finding line is truncated after "the default host composes
no connector providers of…". The two verifiable halves are edited. The
unread remainder is not acted on, and I did not verify a
connector-provider claim.
- Row 182 was marked optional. The planted-shape recipe is written from
the guard's own rule (no marker on a store not created from empty is
refused) and uses `sys_metadata_activation` (`systemFields { tenant:
false }`, primary file DB). I did not boot that recipe.
- Stale text outside this file, not edited (scope is this file only):
the `GET /meta/types` row in `packages/runtime/src/route-ledger.ts`
still notes a "richer types listing consumed by Studio tooling", but it
is the same handler as `GET /meta`.
- Not in this slice, per the card: `notification-center` negative[3]
(SCOPE-negatives sweep) and the UNCLEAR rows.
## Verification
`pnpm check:platform-checklist` is green on this head. Re-run any item's
new text against a fresh `pnpm --filter @objectstack/example-showcase
dev -- --fresh -p PORT --seed-admin` boot. The Tests section lists the
reads used here.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(not touched)
- [x] 2. Every name I added uses the casing for its kind. (no names
added)
- [x] 3. No formatter ran; `pnpm lint` passes. (JSON ledger only; CI
runs lint)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset. (publishes
nothing: `skip-changeset`)
- [x] 6. `packages/spec` touched: n/a.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English. (the 维护者速读 block is in
Chinese by AGENTS.md)
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QUs3Bs8P3qQzcFo9Bmvsye)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: objectstack-fleet[bot] <332303061+objectstack-fleet[bot]@users.noreply.github.com>1 parent 0fd2d08 commit ebd312a
1 file changed
Lines changed: 148 additions & 61 deletions
0 commit comments