Skip to content

Commit ebd312a

Browse files
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

File tree

0 commit comments

Comments
 (0)