Skip to content

docs(qa): invert the action-location-matrix empty-locations probe to the post-objectui#3142 contract (#7323) - #7422

Draft
os-help wants to merge 1 commit into
mainfrom
claude/issue-7323-action-location-matrix-probe
Draft

docs(qa): invert the action-location-matrix empty-locations probe to the post-objectui#3142 contract (#7323)#7422
os-help wants to merge 1 commit into
mainfrom
claude/issue-7323-action-location-matrix-probe

Conversation

@os-help

@os-help os-help commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Fixes #7323

docs/qa/platform-checklist/areas/records-forms.json, item records-forms.action-location-matrix, asserted that an action with no locations renders 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 its negative list already encoded the post-#3142 contract.

What changed

One file, one item, revision 3 → 4.

  • variant — "lands on EVERY location including the toolbar" → "renders on NO surface, and locations: [] likewise", attributed to actionRendersAt rather than to action-bar.tsx's old behavior.
  • step — the probe now has two halves and an explicit expected-empty result: (a) author a scratch api action with no locations key, sweep all six surfaces, expect an empty placement list, delete the probe; (b) sweep the same six surfaces for showcase_new_task, the fleet's headless locations: [] declaration, expect empty too.
  • acceptance clause — inverted to "empty/missing locations means NO location", and the recalc_selection note re-anchored: it names record_more because 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/evidence updated to the two empty sweeps.
  • negative — dropped "(and did not inherit via the empty-locations rule)"; there is no everywhere-default left to inherit.
  • fixtures.requiresrecalc_selection re-worded to "declares record_more ONLY, which is what keeps it off the toolbar"; showcase_new_task added as the headless specimen the probe reads.
  • source — the objectui line now names packages/types/src/ui-action.ts actionRendersAt (the predicate) with action-bar.tsx as its consumer; packages/lint/src/validate-action-locations.ts added as the in-repo codification; the examples/app-showcase entry annotated because its prose is still stale (see below).
  • history — revision 4 entry recording the inversion and why the probe was kept rather than deleted.

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-placement warns about) vs locations: [] (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.tsx directly:

  1. This repo's codification, packages/lint/src/validate-action-locations.ts. The action-no-placement rule 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 for locations: [] being a deliberate headless shape that the rule does not flag — which is what the probe's second half pins.
  2. The verbatim objectui quotes in QA checklist records-forms.action-location-matrix still asserts pre-objectui#3142 semantics — its "empty-locations means EVERY location" probe now grades correct behavior as a FAIL #7323 — the actionRendersAt body (Array.isArray(declared) && declared.includes(location)) and the action-bar.tsx comment 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 card

PR #7322 (#6888, global_nav retirement) merged today and edited this same item. The item's text and revision were re-derived from origin/main 1788e19 before editing: it was at revision 3, not the revision the card was filed against, and revision 3 is what made showcase_new_task headless — which this change then uses as the locations: [] specimen. The card's quotes were treated as a lead only.

Gates

  • pnpm check:nul-bytesgreen (6801 text files scanned, self-test 75 assertions).
  • pnpm check:platform-checklist1 problem, pre-existing and unrelated: coverage.json · qa: UNCLASSIFIED. Reproduced identically on a clean origin/main tree with no local edits, and already filed as finding: check:platform-checklist is red on main — the new qa liveness ledger is neither mapped nor waived in coverage.json #7347 (the new qa liveness 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 forgotten revision bump — passes on this item.
  • No path-scoped check family names docs/qa/**.

Out-of-scope finding filed

#7420examples/app-showcase/src/ui/actions/index.ts's RecalcSelectionAction TSDoc 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 the source entry 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-changeset at review).


Generated by Claude Code

…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
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 10, 2026 10:42am

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants