Skip to content

Commit e4ba846

Browse files
docs(qa): records-forms provisioning recipes for the walled mention leg, a packaged action specimen and the app-crm import spec (#26929)
<!-- claude-projects-attribution: {"github_login":"os-warren"} --> _Requested by **Warren** · [project thread](https://claude.ai/code/project/chan_01U5RdnAAmkSQmZbqh6FtqZ8?thread=cmsg_01U5RdnAAmkSQmZbqh6FtqZ8UscxfA4ta7qZoJyoM4H9fp)_ Fixes #26625 Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么**:在 records-forms 检查单里补了三份测试数据配方:双组织 walled 启动下的 @提及跨组织腿、一个经包加载器安装的 action 样本、一套 app-crm 启动加环境变量让导入撤销的控制台 spec 原样能跑。三个条目各实跑一次,结果写进 history。 - **为什么改**:18.2.0 第二波里这三个条目有 clause 因为缺测试环境一直打不了分。维护者原话:「补测试数据配方。立卡」。 - **风险与回滚**:只改一个 JSON 账本文件,没有产品代码、没有发布内容。回滚就是 revert 本 PR。 - **先看**:① `records-forms.json` 新增的两个区级配方 `qaact-placement-specimen` 和 `qa-crm-import-console`;② `record-discussion-mentions` 的 steps[13] 新写的 walled 序列;③ 三个条目新加的 history 行。 - **两分钟验证**:跑 `node scripts/check-platform-checklist.mjs`,应该看到 `OK`,并且 `10/10 recipes referenced`。 - **需要你做的**:无,席位落地。 ## What changes `docs/qa/platform-checklist/areas/records-forms.json` only. - **New area recipe `qaact-placement-specimen`.** It installs a package through `POST /api/v1/marketplace/install-local` (namespace `qaact`) with three url actions bound to `showcase_task`: `qaact_control` and `qaact_visible_throws` on `list_item` and `record_header`, where the second has a `visible` predicate that throws at evaluation, and `qaact_no_locations` with no `locations` key. The package loader's actions are joined into the served object (`registry.ts#attachBoundActions`). Runtime-authored ones are not, which is why the old probe could not work. `action-location-matrix` opts in, and its `knownGaps[2]` now says the recipe closes the gap and which surfaces count as evidence. - **New area recipe `qa-crm-import-console`.** It boots app-crm (`pnpm dev:crm -- --fresh -p PORT`) behind the console dev server (`DEV_PROXY_TARGET=… pnpm --filter @object-ui/console dev`), so `ui/e2e/import-console/import-console-undo.spec.ts` runs as committed on its own defaults (`crm_app` / `crm_lead`, port 5180). The API half replays against `crm_lead`. `import-job-undo-cancel` opts in, and its `knownGaps[0]` is rewritten. - **The walled two-organization mention leg is folded into `record-discussion-mentions`.** That item already uses `qa-feeds-disabled`, and `fixtures.provisioning.use` takes one recipe (the checker accepts no list and refuses an unreferenced recipe), so the seat ruled to write the leg into the item. `steps[13]` carries the literal sequence, `fixtures.requires[2]` names the group-posture boot and its three variables, and `knownGaps[2]` says the leg is driven live. The sequence grants the mention target read on `sys_comment` through a scratch permission set (namespace `qamention`), because no showcase permission set grants it. - Each item gets one history row citing #26625, with a revision bump: `action-location-matrix` 15 → 16, `import-job-undo-cancel` 7 → 8, `record-discussion-mentions` 9 → 11 (after #26908 and #26907 landed). Scratch packages declare their own namespaces (`qaact`, `qamention`), never `qa`, `qamedia`, `qafeeds` or `qagroup`. ## Tests Every clause was re-driven once on its recipe, at main `1708115e2f`, after a full `pnpm exec turbo run build`. The ledger edit was written on main `5ce3404a` and merged with main `8074feb6` before this PR, then merged with main `8bbdb0b4` after #26907 landed. <details><summary>record-discussion-mentions acceptance[9], walled leg: PASS</summary> Group-posture boot (`OS_TENANCY_POSTURE=group OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai OS_AUTH_MEMBERSHIP_POLICY=invite-only pnpm dev -- --fresh -p PORT`). ```text S4 create-user 200 … "organizationId":"<B>","membershipCreated":true S4b package 201 · permission set 200 (saved env-wide) · bind 201 S6 M GET sys_comment 200 S7 M reads B account 200 S7 inbox after M {"unread":1,"mentions":[{"actionUrl":"/showcase_account/<B account>", …}]} (control) S8 M reads A account 404 RECORD_NOT_FOUND S9 comment by id 201 | by email 201 S9 inbox after M: unchanged (1 mention, the control) · admin inbox: no collab.mention WARN [audit] mention notification withheld {"reason":"cannot_read_source","userId":"<M>","commentId":"<by id>"} WARN [audit] mention notification withheld {"reason":"cannot_read_source","userId":"<M>","commentId":"<by email>"} ``` Without the grant, the same member got `GET /api/v1/data/sys_comment` 403 `PERMISSION_DENIED`, and the control mention was withheld `cannot_read_thread`. That is why the grant is part of the sequence. </details> <details><summary>action-location-matrix acceptance[3] fail-closed half and acceptance[4] half (a): PASS</summary> Stock showcase boot, console from `ui/` at the same commit on port 5180. ```text install-local 200 {"manifestId":"com.objectstack.qaact.specimen","hotLoaded":true,…} meta/object/showcase_task actions: qaact_control[list_item,record_header] | qaact_visible_throws[list_item,record_header] visible={"dialect":"cel","source":"qaact_undeclared_root.flag == true"} | qaact_no_locations[NO-KEY] | total 13 [list_item row 0..2] menu testids: … row-action-qaact_control (no qaact_visible_throws, no qaact_no_locations) [record_related row 0..1] menu: Edit, Mark Done, Reassign…, Quick View, Log Time, QA Control, Delete [list_toolbar] / [Task Detail header] / [Task Detail ⋯ overflow]: no qaact label console.warn: [object-ui] A conditional predicate failed to evaluate (qaact_visible_throws) and was treated as its safe default … Unknown variable: qaact_undeclared_root teardown: DELETE install-local 200 · showcase_task back to 10 actions · ledger dir empty ``` Task Detail's header, overflow and quick-actions bar render the action ids the page lists, so QA Control is absent there too. Those reads are not counted as evidence, and the recipe's knownGaps[0] says so. </details> <details><summary>import-job-undo-cancel: console spec passes unmodified; API half PASS on all four clauses</summary> ```text IMPORT_CONSOLE_LIVE=1 LIVE_API_URL=http://localhost:PORT pnpm exec playwright test --config=playwright.import-console.config.ts --timeout=120000 ✓ 1 … a small background import made through the console is undoable (35.9s) 1 passed (37.4s) (two earlier runs without --timeout failed on the default 30 s test timeout, 31.1 s, both after the import had landed) a0 create 201 · terminal succeeded total 20 created 20 · results 20 rows a1 marker counts pre 0 post-import 20 post-undo 0; undo {deleted:20,restored:0,failed:0}; unfiltered total 11 -> 11 a2 4000-row job cancelled at 1400: status cancelled, processed 1400, marker total 1400, rows read back whole (0 torn) a3 list entry before undo: undoable true, no revertedAt key · after: undoable false, revertedAt set ``` </details> ## Acceptance notes - Seat-requested fold: RDM automated.ref, ALM steps[6] and acceptance[4].verify, IJU fixtures.requires[2] and steps[0] now name the recipes. - The harness twin `ui/e2e/import-harness/import-undo.spec.ts` has no door. `ui/playwright.import-harness.config.ts` serves it with `packages/plugin-grid/demo/vite.live.config.ts` at `/live.html`, and neither file exists in `ui/packages/plugin-grid/demo` (only `index.html` and `bulk-actions.html`). Its CSV (`first_name,last_name,email`) also has no column for `crm_lead`'s required `name`. It stays a self-skip, tracked on #25921 (comment 6454554259), the card that already lists that config for retirement. - `ui/playwright.import-console.config.ts`'s header still names an `OBJECTSTACK_CLIENT_DIST` alias and a backend on port 3002. Neither is needed: the workspace console resolves the in-tree client. ## Verification - `node scripts/check-platform-checklist.mjs`: `OK — 16 areas, 329 items …; provisioning: 10 area recipes, 15 item references resolved (2 area-qualified), 10/10 recipes referenced`. - The five new `#symbol` anchors resolve as declarations under `scripts/symbol-anchors.mjs#symbolResolutionClass`. - The 16 gate commands `dispatch-gates --commands` derives for this path were run; their exit codes are in the os-dev report on #26625. - Label `skip-changeset`: `docs/qa/**` ships in no package. ## 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. - [x] 3. No formatter ran; `pnpm lint` passes. (JSON ledger only; no lint-covered file touched) - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (publishes nothing: `skip-changeset`) - [x] 6. `packages/spec` touched: its generated artifacts are regenerated and committed. (not touched) - [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, except the maintainer brief and the quoted ruling. --- _Generated by [Claude Code](https://claude.ai/code/session_01JQwxbXyxFGYMNdVd5maF1e)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ae7f49e commit e4ba846

1 file changed

Lines changed: 159 additions & 13 deletions

File tree

0 commit comments

Comments
 (0)