Skip to content

Commit bb24a53

Browse files
docs(qa): RUNNER.md wave-3 checklist accuracy slice S8 (#28359)
<!-- claude-projects-attribution: {"github_login":"os-zhuang"} --> _Requested by **Sam** · [project thread](https://claude.ai/code/project/chan_01LjZwNRFiG2fkp8SNf6rHNx?thread=cmsg_01LjZwNRFiG2fkp8SNf6rHNxR1z3N3pSCkLgjLSvvp72rM)_ Fixes #28342 Part of #27377 ## 维护者速读 - **改了什么**:只改 `docs/qa/platform-checklist/RUNNER.md` 一个文件:三条过时的环境说明按今天的代码改正,另加一条"共享检出要用 `--no-compile` 启动"的环境规则。 - **为什么改**:v18.3.0 第三波测试发现这几处说明和代码对不上,跑测的 agent 会照着错的说明走弯路或误报缺陷。 - **风险与回滚**:纯文档,不动产品代码、不发布;回滚即 revert 本 PR。 - **先看**:`RUNNER.md` 新增的 `--no-compile` 条目;地图条目(#25889 之后改为列表);cookie 条目里新增的 Packaged Automation 页面。 - **两分钟验证**:`node scripts/check-platform-checklist.mjs`,预期打印 `check-platform-checklist: OK`。 - **需要你做的**:无,席位落地。 ## What changes Each row was re-verified against `origin/main` at `488b3ed0` before editing; all four still held, so none is reported as fixed upstream. | census row | run record | RUNNER entry | what the code says today | |---|---|---|---| | 61 | #27409 | the cookie note ("The cookie is not decorative") | The Setup app's Packaged Automation page (`automation:packaged`) sends every request as a bare `fetch` with `credentials: 'include'` and no `Authorization` header (`ui/packages/app-shell/src/views/setup/PackagedAutomationPage.tsx`, `fetchRuntimeStates` / `fetchFlowMetadata` / toggle / clone). A token-only session renders a load failure ending `HTTP 401` in the page's alert box. The note now names this page beside storage. | | 68 | #27409 | the objectui `automated.ref` entry (jsdom unit suite command) | `pnpm --filter @object-ui/PKG exec vitest run` runs in the package directory, and `ui/scripts/vitest-invocation-guard.mjs` (called by `ui/vitest.config.mts`) refuses any run whose Vitest root is not `ui/`. The entry now gives `cd ui && pnpm exec vitest run --maxWorkers=2 packages/PKG/src/FILE.test.ts` and names the refused form. | | 198 | #27438 | the map banner entry | Since #25889 a style-load failure unmounts the map and shows the record list (`data-testid="map-style-fallback"`): the amber alert banner, a "Try the map again" button and a "Locations" list built from `filteredMarkers`. There is no canvas and no marker element (`ui/packages/plugin-map/src/ObjectMap.tsx`). The entry now describes the list, gives the current banner wording, names `OS_CONSOLE_MAP_STYLE_URL` as the deployment's style rung, and says what to score. | | added (comment 6539852711) | #27481 | new environment fact: boot with `--no-compile` on a shared checkout | A default `os dev` compiles `objectstack.config.ts` into `CWD/dist/objectstack.json` before it starts (`devCompilesAtBoot()` in `packages/cli/src/utils/dev-compile-at-boot.ts`), and its watch loop recompiles into the same file (`startWatchRecompile()` in `packages/cli/src/commands/dev.ts`). The path resolves against the working directory, not `OS_HOME`, so `--fresh` does not isolate it. One rule covers every item whose `fixtures.requires` carries `pnpm dev -- --fresh -p PORT --seed-admin`. As the card says, none of the 37 items is edited. | Each edit makes a clause more precise, and none is weakened. The `--no-compile` rule keeps the caveats the code imposes: a missing artifact is still compiled, a stale artifact draws a warning, and `--no-compile` does not stop the watch loop, so the rule also adds `--no-watch` for trees where someone may be editing sources. ## Tests Docs only. No test applies, and no ablation is owed because no tested behaviour changed. ## Acceptance notes - Edit shape: `RUNNER.md` carries no `revision` / `history` (those exist only on the area-file items), so the card's "revision +1, one history row" shape has nothing to apply to here. The run records are cited inline in each entry instead. - Changeset: none. This is a docs-only change under `docs/qa/` and nothing in it is published. Label `skip-changeset`. - No product defect was found on reading. All four findings were stale text. ## Verification All gates below ran at head `a18d8106`, with each exit code captured before any pipe. <details><summary>dispatch-gates --commands (16 derived) and the --ran reconciliation</summary> ``` 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`: `check-platform-checklist: OK — 16 areas, 352 items (347 active, 1 planned) …`. The first attempt at `check:doc-formula-expressions` exited 3 (PREREQUISITE NOT MET: `@objectstack/formula` and `@objectstack/lint` were not built). After the build that the gate prescribes, it exited 0, and the exit 0 is the value recorded above. </details> --- _Generated by [Claude Code](https://claude.ai/code/session_01QUs3BrXjSo6hk7EnLdjcja)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2db3281 commit bb24a53

1 file changed

Lines changed: 50 additions & 12 deletions

File tree

‎docs/qa/platform-checklist/RUNNER.md‎

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,27 @@ contradicts it, and correct it here when it does.
384384
An empty `.objectstack/data/` left by a tree boot is harmless and is not the
385385
installed-packages trap.
386386

387+
- **On a shared checkout, boot with `--no-compile`: a default `os dev` rewrites the app's
388+
`dist/objectstack.json` that every other runner on the tree serves — `--fresh` does not
389+
isolate it either.** Since #26130 `os dev` compiles `objectstack.config.ts` into
390+
`<cwd>/dist/objectstack.json` before it starts whenever a config exists (the `compile`
391+
flag, default on; `devCompilesAtBoot()` in `packages/cli/src/utils/dev-compile-at-boot.ts`),
392+
under that boot's own environment, and its watch loop recompiles into the same file on a
393+
source save (`startWatchRecompile()` in `packages/cli/src/commands/dev.ts`). The path
394+
resolves against the server's working directory, not `OS_HOME`, so the boot line many
395+
items carry in `fixtures.requires`, `pnpm dev -- --fresh -p PORT --seed-admin`, writes
396+
`examples/app-showcase/dist/objectstack.json` on every boot, and two runners booting it
397+
concurrently rewrite the artifact under each other. **So:** when other runners share the
398+
tree, boot once with the compile beforehand to bring the artifact current, then boot every
399+
run with `--no-compile` added to that line (the root `pnpm dev` forwards its arguments to
400+
the showcase's `objectstack dev`), or as
401+
`pnpm -C examples/app-showcase exec objectstack dev --fresh --no-compile -p PORT`.
402+
`--no-compile` serves the existing artifact as built; it still compiles when the artifact
403+
is missing, and warns at boot when the artifact is older than the sources. Add
404+
`--no-watch` too while anyone may edit the app's sources: `--no-compile` stops only the
405+
boot compile, not the watch loop's recompiles. This one rule covers every item whose
406+
`fixtures.requires` carries that boot line; an item need not repeat it (QA run #27481).
407+
387408
- **`ss` is not installed in these containers — read liveness with `curl`, never a socket
388409
table.** `ss` and `netstat` are both absent (`command not found`); `lsof` and `fuser`
389410
are present. The trap is that the usual spelling hides the cause: `ss -ltn | grep`
@@ -439,7 +460,15 @@ contradicts it, and correct it here when it does.
439460
bearer seam. So a session driven with the localStorage token alone gets **401
440461
`AUTH_REQUIRED`** from `POST /api/v1/storage/upload/presigned` while
441462
`GET /auth/get-session` on the same page returns 200 — a convincing fake "avatar
442-
upload is broken". ⛔ Do not drive any storage/upload surface from an injected
463+
upload is broken". The Setup app's **Packaged Automation** page (component ref
464+
`automation:packaged`) needs it too: every request it makes, its
465+
`GET /api/v1/automation/_status` and `GET /api/v1/meta/flow` loads and its toggle
466+
and clone writes, is a bare `fetch` with `credentials: 'include'` and no
467+
`Authorization` header (`ui/packages/app-shell/src/views/setup/PackagedAutomationPage.tsx`),
468+
so a token-only session renders a load failure ending `HTTP 401` (`automation
469+
status HTTP 401` or `flow metadata HTTP 401`, whichever load is refused first) in
470+
the page's `role="alert"` box instead of the flow list (QA run #27409). ⛔ Do not
471+
drive any storage/upload surface or the Packaged Automation page from an injected
443472
token: **sign in through the form** so both halves exist.
444473

445474
- **A stock showcase boot refuses self-registration — no item can mint a member by
@@ -556,8 +585,12 @@ contradicts it, and correct it here when it does.
556585
`pnpm console:build`. There is no pinned objectui revision any more. Some refs and
557586
`fixtures.knownGaps` written before the import still spell the path without `ui/`, or
558587
still say such a pin is not runnable from this checkout; read the first as `ui/<path>`
559-
and the second as stale. A jsdom unit suite runs with
560-
`pnpm --filter @object-ui/<pkg> exec vitest run --maxWorkers=2 <file>`; a live e2e spec
588+
and the second as stale. A jsdom unit suite runs from `ui/`, the objectui root, with
589+
`cd ui && pnpm exec vitest run --maxWorkers=2 packages/<pkg>/src/<file>.test.ts`. ⛔ Not
590+
`pnpm --filter @object-ui/<pkg> exec vitest run <file>`: that runs in the package
591+
directory, and the objectui vitest guard (`ui/scripts/vitest-invocation-guard.mjs`,
592+
which `ui/vitest.config.mts` calls) refuses any run whose Vitest root is not `ui/` (QA
593+
run #27409 met it). A live e2e spec
561594
runs from `ui/` with `pnpm test:e2e:live <spec>` against a live backend and the console
562595
dev server (`ui/playwright.live.config.ts` names both). Items whose `automated.ref`
563596
names an objectui spec **alongside** a framework pin (`packages/qa/dogfood/**`,
@@ -725,18 +758,23 @@ contradicts it, and correct it here when it does.
725758
answers 200 (#24579 §6). ⛔ That 403 says nothing about access to the repository: run the
726759
roll-up where the proxy is not in the path, or read the pages by number.
727760

728-
- **A map view draws its markers under a "Map failed to load" banner here, because the
729-
default base style is unreachable — an environment fact, not a product defect.** The
761+
- **A map view shows its records as a list under a "Map failed to load" banner here, because
762+
the default base style is unreachable — an environment fact, not a product defect.** The
730763
console's map uses `https://demotiles.maplibre.org/style.json` unless the view declares a
731-
style (objectui `packages/plugin-map/src/ObjectMap.tsx`, `DEFAULT_MAP_STYLE`, the same at
732-
the pin `4016370a` QA run #24616 ran and at the pin `12dc7b47c340` #24660 moved it to), and
764+
style or the deployment sets `OS_CONSOLE_MAP_STYLE_URL`
765+
(`ui/packages/plugin-map/src/ObjectMap.tsx`, `DEFAULT_MAP_STYLE` and `drawnMapStyle`), and
733766
this container's egress proxy refuses that host
734767
(`curl https://demotiles.maplibre.org/style.json` → `CONNECT tunnel failed, response 403`,
735-
at `bfc1539fe0`). The map's `error` event then renders an amber `role="alert"` banner,
736-
"Map failed to load (…). Markers below are still listed in the search box", over a canvas
737-
that still carries the markers (QA run #24616, `records-forms.view-type-gallery`).
738-
**So:** score the markers and the record list. ⛔ Do not file the missing tiles, and do
739-
not read the banner as the map failing.
768+
at `bfc1539fe0`). Since #25889 the map's `error` event unmounts the map and swaps it for
769+
the record list a browser without WebGL2 gets (`data-testid="map-style-fallback"`): an
770+
amber `role="alert"` banner, "Map failed to load (…). The records are listed below; …",
771+
with a "Try the map again" button, above a list labelled "Locations" holding one row per
772+
marker the search box leaves (`filteredMarkers`). There is no canvas and no marker
773+
element. QA run #24616 (`records-forms.view-type-gallery`) saw the older shape, a banner
774+
over a canvas that still carried the markers; QA run #27438 met the list.
775+
**So:** score the listed rows against the records that carry a location, and the search
776+
box against the list. ⛔ Do not file the missing tiles, do not read the banner as the map
777+
failing, and do not wait for markers on a canvas that is never drawn.
740778

741779
### Trap vocabulary (`traps` field)
742780

0 commit comments

Comments
 (0)