diff --git a/docs/qa/platform-checklist/areas/records-forms.json b/docs/qa/platform-checklist/areas/records-forms.json index fcfe874a178..46d1058b94d 100644 --- a/docs/qa/platform-checklist/areas/records-forms.json +++ b/docs/qa/platform-checklist/areas/records-forms.json @@ -1547,7 +1547,7 @@ "title": "Action buttons surface at exactly their declared locations — list toolbar, list row, record header/more/related/section — and each dispatches for real", "since": "v15", "status": "active", - "revision": 8, + "revision": 9, "priority": "P1", "surface": "browser", "personas": [ @@ -1561,7 +1561,7 @@ ], "knownGaps": [ "AUTOMATION IS PINNED IN THE objectui REPO, NOT HERE — `automated.ref` names objectui specs exclusively, so from this checkout the item is neither runnable nor pin-evidenced (no console bundle is built here and none of those specs exist here). Drive it by hand in the browser and score it as a manual run, OR run the pin in an objectui checkout and cite the output naming the revision (17.1.0 sweep subject: 9a3daf8d37ad). ⛔ Never score it as covered on the strength of the `automated` field alone — an unrun pin is a claim, not evidence. Full protocol: RUNNER.md, the objectui-pinned-automation standing fact.", - "the showcase hosts NO surface for three of the six locations on showcase_task (#21782 VF4; measured at objectui 2e818d0b51ec, re-read at 9dfaca6543). task-detail.page.ts is kind 'full' with no record:header node, and an authored page gets no injected header actions (objectui#7298 ruling), so record_header and record_more have no surface. project-detail.page.ts overrides the tabs slot with an inline record:line_items grid in place of the synthesized related strip, and project (a master-detail) is showcase_task's only parent relation, so record_related has no surface either. The console's renderer half is landed in the pin (objectui#11270, RelatedRecordActionsBridge). Hosting the three needs a showcase_task page that composes a record header and a parent record page that renders the synthesized Tasks related list, which is a showcase fixture change outside this checklist. Until it lands, score record_header / record_more / record_related blocked(fixture), never a missing placement. That showcase change is carded as #22030 (#21797's breach B-1, filed from #22017 row 7, QA run #21782's A3 url / api gap): record_header / record_more / record_related and A3's url / api legs park on #22030" + "[CLOSED by #22030 (PR #22036, 60ccda5a24), lifted by #22039 — the gap text is rewritten to say where each location now lives] a stock showcase boot hosts all six locations on showcase_task, including the three this gap used to block. record_header and record_more: Task Detail (showcase_task_detail, the record page the console opens for any task), whose first node is a page:header. That header renders the action ids it lists, each placed by its own locations, followed by the host's Edit / Share / Delete. Inline (record_header) on a desktop viewport, where the header's default inline budget is 3 (1 on mobile; a record_header action past the budget folds into ⋯): showcase_mark_done (script, shown only while the task is not done), showcase_log_time (form) and showcase_archive_task (script, disabled until the task is done). Under the ⋯ overflow (record_more without record_header): showcase_open_docs (url), showcase_recalc_estimate (api) and showcase_recalc_selection (api). record_related: Project Detail (showcase_project_detail, the record page for any project) → the Related tab (?tab=related), which holds the Tasks related list, a record:related_list for showcase_task through its project FK; open a project that has tasks. It is an authored node, not the synthesizer's strip: the page's tabs override still replaces that strip, and this tab puts the list back with no actions key, so its rows carry showcase_log_time beside the task's list_item actions. The Tasks tab beside it is the record:line_items grid, which hosts no record_related action. An expected action missing from one of these hosts is a missing placement, never blocked(fixture). The hosts were read from objectui source at pin a58626c88dc8 and from the served metadata, not from a browser render, so the first run against them is their first browser evidence" ] }, "variants": [ @@ -1575,7 +1575,7 @@ ], "steps": [ "boot the showcase isolated; sign in as admin; open the showcase_task list view", - "for each location variant, navigate to its surface (list header / row menu / a not-done task's detail title bar / its ⋯ menu / a related-list section / the Task Detail quick-actions bar), screenshot AFTER render settles, then read the rendered action buttons from the DOM. A location with no hosting surface at this fixture (record_header / record_more / record_related — fixtures.knownGaps) is recorded blocked(fixture)", + "for each location variant, navigate to its surface (list header / row menu / a not-done task's Task Detail title bar / that title bar's ⋯ menu / the rows of the Tasks related list on a project's Project Detail Related tab, not the Tasks tab's line-items grid / the Task Detail quick-actions bar; fixtures.knownGaps names each record host), screenshot AFTER render settles, then read the rendered action buttons from the DOM", "record for every fixture action WHERE it rendered — building the full placement matrix (rendered locations vs declared locations)", "dispatch one action per location with a ref-targeted click: bulk_reassign (screen-flow wizard opens), quick_view (modal opens), mark_done (script executes), log_time (form dialog opens on showcase_task.form), open_docs (url navigation), recalc_selection from the ⋯ menu (api POST); capture each network trace", "verify the state-changing dispatches server-side: mark_done flips the task's done flag (API re-read), recalc_selection's per-record branch recomputes the estimate", @@ -1584,9 +1584,9 @@ ], "acceptance": [ { - "clause": "Per variant, every location the fixture actually HOSTS renders ≥1 action declared for it; record_header/record_more require a showcase_task page that composes a record header and record_related a parent record page that renders the synthesized Tasks related list (fixture must provide both).", + "clause": "Per variant, every location the fixture actually HOSTS renders ≥1 action declared for it; record_header/record_more require a showcase_task page that composes a record header and record_related a parent record page that renders the Tasks related list (fixture must provide both).", "oracle": "dom", - "verify": "after each hosted surface's screenshot confirms render, the DOM read lists the expected action names in that slot; matrix compiled per variant. At this fixture record_header, record_more and record_related are not hosted (fixtures.knownGaps): record those three blocked(fixture), never as missing placements", + "verify": "after each hosted surface's screenshot confirms render, the DOM read lists the expected action names in that slot; matrix compiled per variant. The stock fixture hosts all six (fixtures.knownGaps names the page and tab for record_header, record_more and record_related): an expected action absent from its host is a missing placement, never blocked(fixture)", "evidence": "per-location screenshots + the placement matrix" }, { @@ -1596,7 +1596,7 @@ "evidence": "the same matrix, extra-placement columns" }, { - "clause": "each HOSTED location's sampled action DISPATCHES for real — flow wizard opens and resumes, modal opens, script executes, form opens the declared edit form view, url navigates, api POSTs — and state-changing ones round-trip server-side (mark_done flips done; recalc updates the estimate). The url (open_docs) and api (recalc_selection) legs live on record_more and share its fixture gap: record them blocked(fixture) with it, never as dispatch failures", + "clause": "each HOSTED location's sampled action DISPATCHES for real — flow wizard opens and resumes, modal opens, script executes, form opens the declared edit form view, url navigates, api POSTs — and state-changing ones round-trip server-side (mark_done flips done; recalc updates the estimate). The url (open_docs) and api (recalc_selection) legs live on record_more, under the ⋯ overflow of the Task Detail title bar", "oracle": "network", "verify": "one captured dispatch per location + API re-reads for the two state changes", "evidence": "the six traces + the two re-reads" @@ -1683,6 +1683,12 @@ "date": "2026-10-06", "change": "partial-coverage gap of QA run #21782 parked on #22017 (row 7). A3's url / api dispatch legs were blocked(fixture): the fixture hosts no ⋯ surface. Revision 7 (#21797) already scores them blocked(fixture) with record_more. Disposition: recorded knownGap. The leg needs an examples/app-showcase fixture change, carded as #22030, and the knownGap now parks the three record_* variants and A3's url / api legs on #22030. No clause changed", "ref": "#22017" + }, + { + "revision": 9, + "date": "2026-10-06", + "change": "lifted the row-7 fixture knownGap (#22039): #22030 (PR #22036, 60ccda5a24) hosts record_header, record_more and record_related for showcase_task on stock showcase pages. knownGaps[1] is rewritten from 'no surface' to where each location lives: Task Detail's page:header (record_header inline; record_more's url / api / api under the ⋯ overflow) and Project Detail's Related tab (the Tasks related list, an authored record:related_list rather than the synthesizer's strip). The lines revision 7 added for the gap are re-pointed. Step 2 names each host and drops its blocked(fixture) sentence. Clause 1 drops 'synthesized', and its verify scores an absent action as a missing placement. Clause 3 no longer parks the url / api legs. knownGaps[0] is unchanged", + "ref": "#22039" } ], "enumSource": {