Repository navigation
Commit b220e09
docs(qa): lift action-location-matrix's no-surface knownGap now that the showcase hosts record_header / record_more / record_related (#22040)
Fixes #22039
Clause-②: no
The showcase change carded as #22030 landed as PR #22036 (`60ccda5a24`).
It hosts `record_header`, `record_more` and `record_related` for
`showcase_task` on stock showcase pages. This PR lifts the row-7 fixture
knownGap on `records-forms.action-location-matrix` that parked those
three locations, and A3's url / api dispatch legs, on that card. It is a
checklist-only diff: one item in
`docs/qa/platform-checklist/areas/records-forms.json`, no other item, no
code.
## What changed (item `records-forms.action-location-matrix`, revision 8
to 9)
| Key | Before | After |
|---|---|---|
| `revision` | 8 | 9 |
| `fixtures.knownGaps[1]` | "the showcase hosts NO surface for three of
the six locations on showcase_task …"; score them blocked(fixture); park
on #22030 | Opens with a closed marker citing #22030 / PR #22036 /
`60ccda5a24` and this card, then says where each location now lives on a
stock boot (below) |
| `steps[1]` | surfaces listed as "a not-done task's detail title bar /
its ⋯ menu / a related-list section", plus "A location with no hosting
surface at this fixture (record_header / record_more / record_related)
is recorded blocked(fixture)" | Names each host: the Task Detail title
bar, that title bar's ⋯ menu, and the rows of the Tasks related list on
Project Detail's Related tab, "not the Tasks tab's line-items grid". The
blocked(fixture) sentence is gone |
| `acceptance[0].clause` | "… a parent record page that renders the
synthesized Tasks related list …" | "… renders the Tasks related list …"
(one word dropped) |
| `acceptance[0].verify` | "At this fixture record_header, record_more
and record_related are not hosted: record those three blocked(fixture),
never as missing placements" | "The stock fixture hosts all six
(fixtures.knownGaps names the page and tab …): an expected action absent
from its host is a missing placement, never blocked(fixture)" |
| `acceptance[2].clause` | "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" | "The
url (open_docs) and api (recalc_selection) legs live on record_more,
under the ⋯ overflow of the Task Detail title bar" |
| `history` | 8 entries | plus one: revision 9, 2026-10-06, ref
`#22039`, citing #22030 / PR #22036 |
`fixtures.knownGaps[0]` (the objectui-pinned automation) is
byte-identical. No other key and no other item changed. A structural
diff of all 43 items against `60ccda5a24` shows exactly one changed
item.
### The rewritten knownGap: where each location lives
- **`record_header` / `record_more`: Task Detail**
(`showcase_task_detail`, the record page the console opens for any
task). Its first node is a `page:header`. The header renders the action
ids it lists, each placed by its own `locations`, and the host's Edit /
Share / Delete come after them.
- Inline on a desktop viewport: `showcase_mark_done` (script, shown only
while the task is not done), `showcase_log_time` (form) and
`showcase_archive_task` (script, disabled until done).
- Under the ⋯ overflow: `showcase_open_docs` (url),
`showcase_recalc_estimate` (api) and `showcase_recalc_selection` (api).
- The default inline budget is 3 (1 on mobile), and a `record_header`
action past it folds into ⋯. Read from the `page:header` renderer at the
objectui pin `a58626c88dc8`. The knownGap names this so that a runner on
a narrow viewport does not score a folded action as an extra
`record_more` placement.
- **`record_related`: Project Detail** (`showcase_project_detail`), on
the **Related tab** (`?tab=related`). The tab holds the Tasks related
list, a `record:related_list` for `showcase_task` through its `project`
FK. As PR #22036 noted, this is an authored node, not the synthesizer's
strip. The page's `tabs` override still replaces that strip, and the 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
next to it is the `record:line_items` grid, which hosts no
`record_related` action.
- A missing action on any of these hosts is now a missing placement, not
blocked(fixture). The knownGap says the hosts were read from objectui
source and served metadata, not from a browser render, because PR #22036
left the browser render NOT MEASURED. The first run against these hosts
will be their first browser evidence.
### Scope reading, declared
The dispatch scopes edits to `fixtures.requires`, `steps` and acceptance
`verify` lines that still send the runner to a surface that does not
host the leg. Two of the lines above are acceptance `clause` texts, not
`verify` lines. Revision 7 added the gap's blocked(fixture) instructions
in five places: knownGaps[1], step 2, clause 1, clause 1's verify, and
clause 3. The item diff between `ff29410ed2` and `18c7dfd2e6` shows
them. Clause 3's last sentence parks the url / api legs by itself, so
leaving it would keep A3 parked after the lift. Clause 1's "synthesized"
sends a runner to look for a strip that the page's `tabs` override
removes. The edit to each clause is the minimum that undoes revision 7's
gap text. Nothing else in either clause changed. `fixtures.requires` is
unchanged: it describes the fleet and does not point the runner at any
surface.
## Verification (head `d99f1f57ee`, after the final commit)
- **Derived gates:** `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack` on the actual diff derived 13
commands. The list is the same at both commits. Each was run with its
exit code recorded before any pipe, and all 13 exited 0. `--ran`: "13
derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED
zero — all 13 recorded an exit code and none of them is 3)".
- `check:platform-checklist`: "OK — 15 areas, 276 items (272 active, 2
planned) …".
- `check:doc-authoring`, `check:cross-package-test-inputs` and
`check:nul-bytes` are green.
- On the first commit, `check:doc-formula-expressions` answered
PREREQUISITE NOT MET (exit 3: `@objectstack/formula` and
`@objectstack/lint` were unbuilt). Both were then built under
`os-verify-lock.sh` (VERDICT command-exit 0), and the gate ran green at
both commits.
- **The two checklist-reading package tests** run on the final head.
These are the only tests declared as reading these files:
`scripts/cross-package-test-inputs.mjs` names
`docs/qa/platform-checklist/areas/*.json` for plugin-auth and `docs/**`
for rest, and nothing else.
- `pnpm --filter @objectstack/plugin-auth exec vitest run --maxWorkers=2
src/checklist-refusal-envelope-consistency.test.ts`: exit 0, 1 file / 5
tests passed.
- `pnpm --filter @objectstack/rest exec vitest run --maxWorkers=2
src/meta-state-route-doc-spelling.test.ts`: exit 0, 1 file / 8 tests
passed.
- **Lint:** `eslint --no-inline-config --format json` on the changed
file returns 1 file and 0 errors. The one message is "File ignored
because no matching configuration was supplied". No block in
`eslint.config.mjs` covers `.json` under `docs/`, so this diff cannot
move any lint verdict. The full `pnpm lint` run is CI's.
- **Changeset:** 69 published workspace manifests. None has a `files[]`
entry naming `docs/qa` or the checklist (0 hits). Positive control: all
69 name `dist` (69 hits). The path is outside every package directory,
so this diff publishes nothing. Hence `skip-changeset`.
- **Typecheck / package tests:** no package source changed, so neither
is owed locally. CI's Test Core reruns plugin-auth and rest because
their declared inputs moved.
## Acceptance notes
- **The empty-locations probe cannot discriminate on two authored-list
surfaces.** The Task Detail `page:header` renders only the ids it lists
(objectui `containers.tsx`, `resolvedHeaderActions`). The
`record:quick_actions` bar is also an explicit `actionNames` list. So
the step-7 probe action, and `showcase_new_task`, are absent from the
record header, the ⋯ overflow and the quick-actions bar because those
lists leave them out. That absence is decided before any `locations`
predicate runs. The probe's verdict therefore rests on the list toolbar,
the row menu and the related-list rows. The quick-actions half predates
this card. The header half is new, because before PR #22036 the header
did not exist. Not filed: this is an item-design observation, not a
runtime defect, a contract violation or an authoring trap. Carrier:
none.
- `fixtures.requires[0]` and clause 4 spell mark_done's predicate as
`'!record.done'`. The fixture's actual predicate is `has(record.done) &&
record.done != true`. `requires[0]` also leaves out
`showcase_recalc_estimate` and `showcase_archive_task`, which the header
now carries. Neither points the runner at a wrong surface, so both are
outside this card's edit rule and are left as they are. Carrier: none.
- NOT MEASURED: the browser render of the new hosts, as in PR #22036. No
console bundle is built in this checkout. The knownGap says so.
## Labels
`skip-changeset`: checklist-only diff, measured above.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 0af4f66 commit b220e09
1 file changed
Lines changed: 12 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1547 | 1547 | | |
1548 | 1548 | | |
1549 | 1549 | | |
1550 | | - | |
| 1550 | + | |
1551 | 1551 | | |
1552 | 1552 | | |
1553 | 1553 | | |
| |||
1561 | 1561 | | |
1562 | 1562 | | |
1563 | 1563 | | |
1564 | | - | |
| 1564 | + | |
1565 | 1565 | | |
1566 | 1566 | | |
1567 | 1567 | | |
| |||
1575 | 1575 | | |
1576 | 1576 | | |
1577 | 1577 | | |
1578 | | - | |
| 1578 | + | |
1579 | 1579 | | |
1580 | 1580 | | |
1581 | 1581 | | |
| |||
1584 | 1584 | | |
1585 | 1585 | | |
1586 | 1586 | | |
1587 | | - | |
| 1587 | + | |
1588 | 1588 | | |
1589 | | - | |
| 1589 | + | |
1590 | 1590 | | |
1591 | 1591 | | |
1592 | 1592 | | |
| |||
1596 | 1596 | | |
1597 | 1597 | | |
1598 | 1598 | | |
1599 | | - | |
| 1599 | + | |
1600 | 1600 | | |
1601 | 1601 | | |
1602 | 1602 | | |
| |||
1683 | 1683 | | |
1684 | 1684 | | |
1685 | 1685 | | |
| 1686 | + | |
| 1687 | + | |
| 1688 | + | |
| 1689 | + | |
| 1690 | + | |
| 1691 | + | |
1686 | 1692 | | |
1687 | 1693 | | |
1688 | 1694 | | |
| |||
0 commit comments