Commit 18c7dfd
docs(qa): re-point 25 platform-checklist clauses the 17.7 pre-release console runs proved stale, mis-asserted or mis-paired (#21811)
Fixes #21797
Clause-②: no
## What this changes
This PR re-points the 25 clauses the card lists, on 20 items in
`docs/qa/platform-checklist/areas/*.json`. The two 17.7 pre-release
console runs (#21782, #21784) proved each clause stale, mis-asserted or
mis-paired. Every item keeps its id, area and selectors. Each item gets
exactly one `revision` bump, even when it carries several entries, and
one `history` entry. That entry cites the run (#21782 or #21784), the
verifier and this card.
There are no product changes and no run record. Nothing under
`examples/**` is touched. `docs/qa/**` publishes nothing, so there is no
changeset. `coverage.json` is untouched because no mapping moved.
Each row was re-derived from source rather than copied from the card:
- objectui at the current pin `.objectui-sha` 9dfaca6543 (a shallow
read-only checkout). The runs read 2e818d0b51ec, and the two pins were
diffed on every cited objectui file.
- The framework at the claim ref 18c2ddc.
Line numbers below are at those commits. The checklist itself carries
symbol and path citations only, because its validator refuses
`file:line`.
Disposition key: **S** stale clause · **AD** assertion defect · **IP**
invalid pairing. Where the verifier's disposition differs from the
lane's, the verifier's is used.
| # | item | clause | disp. | old → new (short) | source re-read |
matches card |
|---|---|---|---|---|---|---|
| B1 | platform-core.docs-portal-render | A5 (+ step 5, persona) | AD |
Documentation entry in a /home sidebar → top-bar Help menu, All
documentation, /docs, for every persona; member is invite + sign-up |
HomeLayout.tsx:1-6 (omits the sidebar); ConsoleLayout.tsx:130
(`setContext('app')`, the only UnifiedSidebar mount);
AppHeader.tsx:792-795 | Y |
| B2 | platform-core.home-admin-cluster-links | A2 | S | every hub card
resolves → every Settings-hub entry reached via the one-hop redirect
resolves | apps/console AppContent.tsx:192-194
(`SystemLandingRedirect`), :203; SystemHubPage.tsx absent at both pins |
Y |
| B3 | platform-core.home-admin-cluster-links | A4 (+ N3, steps 5-6) | S
| hub count badges → clause dropped, with its negative and the two badge
steps | same retirement (objectui#3743, carried out in objectui#10507) |
Y |
| B4 | platform-core.home-admin-cluster-links | A5 (+ whole item: steps
1-3 and 7, A1, N1, N4, title, knownGap) | AD | member home nav = Home +
Documentation → no Administration entry anywhere in the member's shell;
the 9 adminItems are walked as target URLs | UnifiedSidebar.tsx:340-402
(homeNavigation); ConsoleLayout.tsx:130 | Y |
| B5 | platform-core.marketplace-console-honesty | A4 (+ N3, step 5,
title) | S | admin guard before runtime resolution → enabled:
AccessDenied; disabled: the Disabled card for every viewer |
MarketplacePage.tsx:216 / :233-235; MarketplacePackagePage.tsx:568 | Y,
with a nuance (D1) |
| B6 | ai.console-ai-surface-gating | A4 (+ steps 6-7, N3, source,
title) | S | SystemHub 'AI Approvals' card expected-fail → no surface
advertises it; the bare route is scored by A6 | apps/console
AppContent.tsx:207 (route still ungated) | Y |
| B7 | records-forms.form-view-gallery | A1 (+ steps 1-5, fixtures, N2,
a revert step) | AD | drawer/modal as form layouts → layouts on the page
route via a default-form overlay; drawer/modal are presentation modes
(ADR-0050), shown on task-desk.page.ts | RecordFormPage.tsx:282-289;
recordFormNavigation.ts:133-153 (only `tabbed` maps);
task-desk.page.ts:50, :58 | Y, with two divergences (D2, D3) |
| B8 | records-forms.conditional-rules-grid | A5 (+ step 3, fixture) |
IP | siblings byte-identical → the same, on an invoice whose lines carry
distinct stored positions; fixture says how to seed one |
GridField.tsx:778-789 (`row[sortField] = index`); masterDetailTx.ts:172
(`changedFields`); deriveMasterDetail.ts:497 | Y (the config key moved,
D4) |
| B9 | records-forms.action-location-matrix | A1 (+ A3, step 2,
knownGap) | IP | every location renders → every location the fixture
HOSTS renders; record_header / record_more / record_related are
blocked(fixture) | RelatedRecordActionsBridge.tsx:197;
task-detail.page.ts:24 (`kind: 'full'`); project-detail.page.ts:72
(`record:line_items`); task.object.ts:37 | Y |
| B10 | approvals.inbox-metadata-actions | A2 (+ personas, steps 1/2/4,
A3 verify, fixture) | S | remind + recall only on own request → Recall
also for an override actor on any pending request; a non-override
approver persona | sys-approval-request.object.ts:556-595
(`approval_recall` override arm), remind :550 | Y |
| B11 | dashboards.global-filters-rescope | A6 (+ step 8) | S | at-risk
tile composes with the status filter → `kpi_awaiting_review` shows the
intersection; `kpi_at_risk` is opted out |
ops-dashboard.dashboard.ts:87-88 | Y |
| M1 | access-security.readonly-package-locks-studio | A3 (+ step 5,
fixture, A2 code set) | S | writable contrast via duplicate → a scratch
base via POST /api/v1/packages; A2 adds NOT_OVERRIDABLE |
runtime/src/domains/packages.ts:560-577 (`requireDuplicableSource`,
`DUPLICATE_SOURCE_NOT_A_BASE`) | Y |
| M2 | access-security.audit-log-browser | A1 | S | delete row withheld
from every non-system reader → served to a view_all_audit_log holder,
withheld from a non-holder | spec identity/eval-user.zod.ts:152
(`view_all_audit_log` in ADMIN_FULL_ACCESS_CAPABILITIES) | Y |
| M3 | access-security.audit-log-browser | A5 (+ A3, steps 5-6) | S |
API/page agree minus the delete → row-for-row for the admin, delete
included; FE7: AuditLogPage has an Action select | AuditLogPage.tsx:128,
:212-218 | Y |
| M4 | identity-auth.auth-method-matrix | A10 (+ step 9) | S |
delete-user succeeds authed → deliberately unwired, 404 to every caller
| plugin-auth auth-route-ledger.ts:148-157 (`disabled`) | Y |
| M5 | identity-auth.workspace-org-switch | A6 (+ step 8) | AD | active
org unchanged → 403 USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION; the
foreign org never active (prior or none) | better-auth 1.7.3
plugins/organization/routes/crud-org.mjs:424-425 | Y |
| M6 | records-forms.cascading-options | A3 (+ personas, step 4,
fixture) | IP | the admin persists restricted → an org_admin persona
(invited with role 'admin', accepted) | cascading-select.object.ts:100;
spec identity/eval-user.zod.ts:201-207 (`mapMembershipRole`) | Y |
| M7 | records-forms.field-group-visible-when | A1 (+ step 3, knownGap,
A4, title, source) | AD | GET reads back the envelope → served as
authored; the parse normalizes (batch20 pin) | spec
shared/expression.zod.ts:184-187; metadata-protocol protocol.ts:766-780;
plugin-form fieldGroups.ts:74; plugin-detail
buildDefaultPageSchema.ts:669-723 | Y for A1; FE12 differs (D5) |
| M8 | automation.flow-run-step-nesting | A2 (+ fixture) | S |
send_reminder is the loop-body step → guard_reminder is the loop-body
step; send_reminder is in the try region under it | showcase
flows/index.ts:919-926; spec execution.zod.ts:180-185 | Y |
| M9 | automation.rollup-summary-filter | A5 (+ step 7, fixture, source)
| S | editor half on a duplicated package → on a scratch base via POST
/api/v1/packages | packages.ts:560-577; spec
kernel/metadata-plugin.zod.ts:726 | Y, minus the overlay alternative
(D6) |
| M10 | automation.flow-node-type-matrix | A1 | AD | palette offers all
21 → the 19 non-structural | spec automation/flow.zod.ts:72
(`FLOW_STRUCTURAL_NODE_TYPES`) | Y |
| M11 | automation.flow-node-type-matrix | A2 (+ FE13 knownGap) | AD |
every variant logs a step → non-structural + start log steps; end is
proven by a completed run | service-automation engine.ts:10897 (return
on `end`), :10960-10980 (`start` step) | Y |
| M12 | automation.trigger-type-matrix | A1 (+ step 9, title) | AD |
trigger.type records the kind → kind via the run's flow; trigger.type is
the launch event | engine.ts:1175-1191 (`buildRunTrigger`);
execution.zod.ts:376 | Y |
| M13 | platform-core.app-management-toggle | A6 (+ steps 2/6/7, title)
| S | client-only stub → writes through PUT/DELETE: 403 NOT_OVERRIDABLE
on a code app, Delete 200 reset:false | AppManagementPage.tsx:207, :246,
:274-278 | Y |
| M14 | platform-core.app-management-toggle | N1 (+ the stub knownGap) |
S | ticking off the stub toast → no control reports success for a
refused write | same | Y |
## Divergences worth a reviewer's eye
- **D1 (B5).** VF4's "no package fetch" holds on the package page, whose
two fetch effects are `isAdmin`-gated. On the catalog page,
`MarketplacePage` `load()` runs whenever the marketplace is enabled
(MarketplacePage.tsx:139-145), so a member's visit still fires the list
fetch. The clause keeps VF4's words, and the verify text says which page
they are read on. The ungated catalog fetch is reported to the card, not
filed.
- **D2 (B7).** The card has the wizard rendering as steps only on
`/new`. `RecordFormPage` passes the form type in both `create` and
`edit` modes, and both page routes exist (app-shell console
AppContent.tsx:1097, :1113). Only the New/Edit modal degrades a wizard,
through `resolveFormViewLayout`. The steps name both page routes.
- **D3 (B7).** The card keeps the `modal` variant blocked(fixture).
`examples/app-showcase/src/ui/pages/task-desk.page.ts` hosts both an
`ObjectForm formType="drawer"` (edit) and an `ObjectForm
formType="modal"` (create), so the modal presentation can be scored
there. blocked(fixture) stays only as the fallback.
- **D4 (B8).** The #21772 pin range renamed the grid's config key
`sort_field` to `sortField` at both ends: GridField reads it,
MasterDetailForm writes it. The mechanism the card describes is
unchanged. The source entry cites the new spelling.
- **D5 (M7).** FE12 says both console adapters copy `visibleWhen` at the
pin. At both 9dfaca6543 and 2e818d0b51ec, the form adapter copies it
(fieldGroups.ts:74), but the detail adapter
`deriveFieldGroupDetailSections` does not. That fits the card's own note
that the detail page still fails (objectui#11630). Clause A4 scores the
form half live and the detail half against that issue.
- **D6 (M9).** VF4 offers "or overlay per ADR-0005" as a second route.
The `object` type declares `supportsOverlay: false, allowOrgOverride:
false` (metadata-plugin.zod.ts:726), so an overlay cannot carry a
summary field's filter. The clause names the scratch base only.
- **Persona wording.** Card entry 1 asks for "invite + sign-up" in place
of "fresh sign-up", because the stock posture is `invite_only`. The same
phrase sat on three other items this PR already bumps
(home-admin-cluster-links, marketplace-console-honesty,
app-management-toggle), so it is corrected there too. The other items
carrying the phrase are not touched.
- **Invalid pairings (B8, B9, M6).** The card gives corrected clause
wording for these, so the clause is revised along with the item's
fixture text. Nothing under `examples/**` changed.
## Not changed here
- The fixture changes the verifiers name are `examples/**` changes, so
they are reported on the card rather than made:
- B9: a showcase_task page with a record header, and a parent page
rendering the synthesized Tasks related list.
- M6: VF4's alternative of widening the cascade predicate to org_owner.
- The conditional entry (platform-core.shell-nav-personalization A3)
waits on the maintainers' ruling on objectui#11626.
- The two "Not parked" wording notes
(identity-auth.email-verification-loop A3;
integration-system.external-schema-browser-ui columnCount) are outside
the card's 25 entries, so they are left for a follow-up.
## Verification (at f5d1e37)
- `pnpm check:platform-checklist` exits 0: `OK — 15 areas, 270 items
(266 active, 2 planned)`, line citations 0, symbol anchors **653/663**
resolved. On the base 18c2ddc the same check reads 652/662. The
anchors added are `flow.zod.ts#FLOW_STRUCTURAL_NODE_TYPES` and
`packages.ts#requireDuplicableSource`, and both resolve. The unresolved
count stays at the named residual of 10.
- `node scripts/pm/dispatch-gates.mjs --commands` derived 13 families,
and all 13 ran with exit 0. `check:doc-formula-expressions` first
refused with PREREQUISITE NOT MET (exit 3, nothing measured). After
building `@objectstack/formula` and `@objectstack/lint` it exited 0.
`--ran` reconciliation: `13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN`, a
derived zero with every exit code recorded.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 75ddcd1 commit 18c7dfd
8 files changed
Lines changed: 280 additions & 187 deletions
File tree
- docs/qa/platform-checklist/areas
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
593 | 593 | | |
594 | 594 | | |
595 | 595 | | |
596 | | - | |
| 596 | + | |
597 | 597 | | |
598 | 598 | | |
599 | | - | |
| 599 | + | |
600 | 600 | | |
601 | 601 | | |
602 | 602 | | |
| |||
619 | 619 | | |
620 | 620 | | |
621 | 621 | | |
622 | | - | |
623 | | - | |
| 622 | + | |
| 623 | + | |
624 | 624 | | |
625 | 625 | | |
626 | 626 | | |
| |||
644 | 644 | | |
645 | 645 | | |
646 | 646 | | |
647 | | - | |
| 647 | + | |
648 | 648 | | |
649 | | - | |
650 | | - | |
| 649 | + | |
| 650 | + | |
651 | 651 | | |
652 | 652 | | |
653 | 653 | | |
| |||
665 | 665 | | |
666 | 666 | | |
667 | 667 | | |
668 | | - | |
| 668 | + | |
669 | 669 | | |
670 | 670 | | |
671 | 671 | | |
| |||
674 | 674 | | |
675 | 675 | | |
676 | 676 | | |
677 | | - | |
| 677 | + | |
678 | 678 | | |
679 | 679 | | |
680 | 680 | | |
681 | 681 | | |
682 | 682 | | |
683 | | - | |
| 683 | + | |
| 684 | + | |
684 | 685 | | |
685 | 686 | | |
686 | 687 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
174 | 174 | | |
175 | 175 | | |
176 | 176 | | |
177 | | - | |
| 177 | + | |
178 | 178 | | |
179 | 179 | | |
180 | | - | |
| 180 | + | |
181 | 181 | | |
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
185 | | - | |
| 185 | + | |
| 186 | + | |
186 | 187 | | |
187 | 188 | | |
188 | 189 | | |
189 | | - | |
190 | | - | |
| 190 | + | |
| 191 | + | |
191 | 192 | | |
192 | | - | |
| 193 | + | |
193 | 194 | | |
194 | 195 | | |
195 | 196 | | |
| |||
203 | 204 | | |
204 | 205 | | |
205 | 206 | | |
206 | | - | |
| 207 | + | |
207 | 208 | | |
208 | | - | |
209 | | - | |
| 209 | + | |
| 210 | + | |
210 | 211 | | |
211 | 212 | | |
212 | 213 | | |
213 | 214 | | |
214 | | - | |
| 215 | + | |
215 | 216 | | |
216 | 217 | | |
217 | 218 | | |
| |||
233 | 234 | | |
234 | 235 | | |
235 | 236 | | |
236 | | - | |
| 237 | + | |
237 | 238 | | |
238 | 239 | | |
239 | 240 | | |
240 | 241 | | |
241 | 242 | | |
242 | 243 | | |
243 | | - | |
| 244 | + | |
| 245 | + | |
244 | 246 | | |
245 | 247 | | |
246 | 248 | | |
| |||
0 commit comments