docs(qa): invert the action-location-matrix empty-locations probe to the post-objectui#3142 contract (#7323) - #7422
Merged
Conversation
…the post-objectui#3142 contract (#7323) `records-forms.action-location-matrix` asserted that an action with no `locations` renders at EVERY location. objectui#3142 collapsed four disagreeing renderers onto one membership predicate (`actionRendersAt`), so such an action now renders at NONE — the probe graded correct behavior as a FAIL, and contradicted the same item's own `negative` list, which already encoded the post-#3142 contract. The probe is inverted, not deleted — both halves stay observable end-to-end: - no `locations` key -> renders nowhere (the inert shape `packages/lint`'s `action-no-placement` rule warns about, and this repo's codification of the same contract); - `locations: []` -> renders nowhere too, deliberately: the headless declaration, read off the fixture fleet's `showcase_new_task`, which revision 3 (#6888) made headless. Also re-anchors the `recalc_selection` note — it names `record_more` because placement is an explicit declaration, not to opt out of an everywhere-default — rewords the objectui `source` line to name the predicate rather than the old rule, adds `packages/lint/src/validate-action-locations.ts` as a source, drops the "did not inherit via the empty-locations rule" clause from `negative`, and bumps the item revision 3 -> 4 with a history entry. Docs/QA-only: no product code, no changeset. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AccJhQLicuvwvYDUtzaG4d
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-help
marked this pull request as ready for review
August 10, 2026 11:57
This was referenced Aug 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7323
docs/qa/platform-checklist/areas/records-forms.json, itemrecords-forms.action-location-matrix, asserted that an action with nolocationsrenders at every location. objectui#3142 ended that: placement collapsed onto a single membership predicate, so a locations-less action renders at none. The probe was manually runnable and would produce a false FAIL — and the item contradicted itself, because itsnegativelist already encoded the post-#3142 contract.What changed
One file, one item,
revision3 → 4.locations: []likewise", attributed toactionRendersAtrather than toaction-bar.tsx's old behavior.locationskey, sweep all six surfaces, expect an empty placement list, delete the probe; (b) sweep the same six surfaces forshowcase_new_task, the fleet's headlesslocations: []declaration, expect empty too.recalc_selectionnote re-anchored: it namesrecord_morebecause placement is an explicit declaration (which incidentally keeps it off the toolbar, where a dispatch carries no selection), not to opt out of an everywhere-default.verify/evidenceupdated to the two empty sweeps.recalc_selectionre-worded to "declaresrecord_moreONLY, which is what keeps it off the toolbar";showcase_new_taskadded as the headless specimen the probe reads.packages/types/src/ui-action.tsactionRendersAt(the predicate) withaction-bar.tsxas its consumer;packages/lint/src/validate-action-locations.tsadded as the in-repo codification; theexamples/app-showcaseentry annotated because its prose is still stale (see below).The probe is inverted, not removed: both halves are still observable end-to-end, and they now pin the two shapes the platform actually distinguishes — key absent (inert, what
action-no-placementwarns about) vslocations: [](deliberate headless declaration, explicitly not flagged).Evidence base — and its one limit
This session has no access to the objectui repo, so the rewrite was verified against two things rather than against
action-bar.tsxdirectly:packages/lint/src/validate-action-locations.ts. Theaction-no-placementrule exists because a locations-less action renders nowhere, and its docblock says so verbatim: "objectui#3142 collapsed four disagreeing renderers onto one predicate — an action renders at a location only if it DECLARES that location. … it is measurably inert as of objectui 17.1." The same docblock is the authority forlocations: []being a deliberate headless shape that the rule does not flag — which is what the probe's second half pins.records-forms.action-location-matrixstill asserts pre-objectui#3142 semantics — its "empty-locations means EVERY location" probe now grades correct behavior as a FAIL #7323 — theactionRendersAtbody (Array.isArray(declared) && declared.includes(location)) and theaction-bar.tsxcomment stating the change in the past tense.Where the two disagreed with the checklist, the checklist was the stale party.
Pre-derived from
origin/main, not from the cardPR #7322 (#6888,
global_navretirement) merged today and edited this same item. The item's text and revision were re-derived fromorigin/main1788e19before editing: it was at revision 3, not the revision the card was filed against, and revision 3 is what madeshowcase_new_taskheadless — which this change then uses as thelocations: []specimen. The card's quotes were treated as a lead only.Gates
pnpm check:nul-bytes— green (6801text files scanned, self-test 75 assertions).pnpm check:platform-checklist— 1 problem, pre-existing and unrelated:coverage.json · qa: UNCLASSIFIED. Reproduced identically on a cleanorigin/maintree with no local edits, and already filed as finding:check:platform-checklistis red onmain— the newqaliveness ledger is neither mapped nor waived in coverage.json #7347 (the newqaliveness ledger is neither mapped nor waived). This gate is manual by maintainer decision, not CI-wired (.github/workflows/lint.yml:225-230). The validator's revision/history check — the one that would catch a forgottenrevisionbump — passes on this item.docs/qa/**.Out-of-scope finding filed
#7420 —
examples/app-showcase/src/ui/actions/index.ts'sRecalcSelectionActionTSDoc still narrates the same pre-#3142 rule, and is very plausibly where the checklist's claim originated. Out of this card's pinned file surface, so it is annotated in thesourceentry here and fixed there. The declaration that comment explains (record_more) is correct either way — only the stated reason inverted.Docs/QA-only diff — no changeset (PM applies
skip-changesetat review).Generated by Claude Code