Skip to content

Commit 6d31fb3

Browse files
committed
qa(checklist): sweep 2026-08-30 close-out — platform-core wave, coverage map, FOLLOW-UPS §9
Completes the five-angle sweep started in c54aec0 (which raced the platform-core splice mid-edit — this commit restores the boot-health revision/history coherence and lands the remaining pieces): - platform-core: 11 new items (marketplace install-local lifecycle + console honesty [4-angle hit], runtime-config boot read, docs portal, URL overlay contract, keyboard-shortcut surface, home admin cluster, lifecycle retention sweep, seed-mode matrix, theme persistence, installability indicators) + boot-health rev 5 (e2e source refs); enumSource pins SeedMode(5), LifecycleClassSchema(5) - coverage.json: platform-core items mapped (manifest/app/seed/ capability/page/doc/book/object); 31 kinds, 0 waivers - FOLLOW-UPS.md §9: sweep register — defects K1-K6 (dead advertised shortcuts; ungated AI Approvals card; fieldGroups.visibleWhen inert in console; external-datasource error-UX drift; three unledgered raw mounts; seed replace declared≠implemented), docs drift (export.mdx formats, approvals queue style, one-click cloning, per-team default, chat channel), ADR-0049 inert surfaces, resolutions (§7c checkOnBoot fixed by #13149, D16 fixed by #12457, two false-finding items fixed), blocked re-audit (oauth consent UNBLOCKED, quorum re-priced), clean notes, fixture wishlist Ledger 221 → 260 items (39 new, 13 revisions). Validator green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VnWcVdzYnitiLiWFbrMfc5
1 parent c54aec0 commit 6d31fb3

3 files changed

Lines changed: 179 additions & 8 deletions

File tree

docs/qa/platform-checklist/FOLLOW-UPS.md

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,158 @@ posture, then decide which shape is wanted).
376376
hand-enumerated on the row-contract item and flagged un-pinned.
377377
- **No security-sensitive finding to withhold**: D16–D22 are admin-gated behaviors or
378378
disclosure-shape issues; nothing here discloses an unfixed privilege escalation.
379+
380+
## 9. Full sweep 2026-08-30 — five-angle re-audit at a286411 (framework) / 1e14d70 (objectui)
381+
382+
Ledger **221 → 260 items** (39 new, 13 revisions); `coverage.json` 31 kinds mapped, **0
383+
waived** (the first sweep to start from a zero-waiver state — nothing to re-audit there,
384+
so the stale-claims audit ran against `blocked` refs and item texts instead, and found
385+
five: §9d/§9e). Five parallel read-only hunters (console UI · spec enums · routes/runtime
386+
· built-in apps · docs claims), nine per-area writers. Cross-angle hits drove priority:
387+
`fieldGroups[].visibleWhen` was found by three angles independently, the marketplace
388+
install-local surface by four. What follows is what is NOT a checklist item.
389+
390+
### 9a. Product defects found while grounding (decide handling)
391+
392+
Each is captured inside a checklist item as an expected-fail probe or knownGap, so a run
393+
records actual behavior instead of ticking green.
394+
395+
| # | defect | evidence | captured in | sensitivity |
396+
|---|---|---|---|---|
397+
| K1 | **KeyboardShortcutsDialog advertises dead accelerators.** Five listed keys have no handler anywhere (⌘/ focus-search, ⌘D dark-mode, N create, R refresh, ⌘E edit — repo-grep; only near-misses are page-scoped `r` in ApprovalsInbox and Ctrl+Shift+D debug); the sidebar row shows bare "B" while the binding requires ⌘/Ctrl+B; ⌘⇧O/⌘⇧S are advertised globally but their handlers are page-scoped to AiChatPage. A help surface teaching no-op keys. | objectui `app-shell/src/chrome/KeyboardShortcutsDialog.tsx:36-74` (only `?` handled at :88); `components/src/ui/sidebar.tsx:116-121` | platform-core.keyboard-shortcut-surface (expected-fail probes) | UX-integrity — safe to file |
398+
| K2 | **System-hub "AI Approvals" card is not gated on the AI surface, and its inbox is error-blind.** The card renders unconditionally while every sibling AI entry point gates on `useAiSurface`; the page polls `/api/v1/ai/pending-actions` every 5 s forever, and renders a "No actions waiting" empty queue beside the error alert on the open edition's 501 (the remedy message itself does surface — that half is fine). | objectui `SystemHubPage.tsx:258-265`; `AiPendingActionsPage.tsx:45`; `AiPendingActionsInbox.tsx:286-297`; `useAiSurface.ts:24-28` | ai.console-ai-surface-gating (expected-fail clauses) | UX-integrity — safe to file |
399+
| K3 | **`fieldGroups[].visibleWhen` is inert in the console one day after landing.** #13030 (2026-08-29) shipped the key with "declared = enforced on day one", but BOTH objectui fieldGroups adapters drop it, so the object-level section predicate never reaches the renderer; a separate fail-direction drift exists between the spec (fail-closed) and the view-section renderer (fail-open). | spec commit 53dc739 vs objectui `plugin-form/src/fieldGroups.ts:60-67`, `plugin-detail/src/synth/buildDefaultPageSchema.ts:622-635`; `object.zod.ts:1177` vs `TabbedForm.tsx:62` | records-forms.field-group-visible-when (console clause expected-fail at the exact adapter sites) | correctness — safe to file |
400+
| K4 | **objectui external-datasource error UX drifted from the server.** The Setup federation UI's 503-detector matches the retired pre-#3843 string body while the server answers the sendError envelope (its own test pins the stale shape); and ValidationPanel's `DIFF_LABEL` covers 9 of 10 `SchemaDiffEntryKind`s — `'unreachable'` (emitted at `external-datasource-service.ts:789`) has no label. The #4115 class recurring until the next objectui spec-pin bump. | objectui `metadata-admin/external/api.ts:101-115` + `api.test.ts:65-70`; framework `external-datasource-routes.ts:383` | integration-system.external-schema-browser-ui (expected-fail + knownGaps) | correctness — safe to file |
401+
| K5 | **Three raw-`getRawApp` route registrars remain unledgered** (D6/D22 class, and structurally invisible to the #7526 reverse-parity gate): the `/auth/me/permissions` + `/auth/me/localization` + `/me/apps` trio, `/api/v1/approvals/act`, and `/api/v1/webhooks/redeliver`. The trigger-api/metadata precedent (#11863/#11882) gives each such registrar a per-package ledger + conformance guard; these three never got one. (D22's `/automation/:name/clone` re-verified still unledgered at head.) | `plugin-hono-server/src/current-user-endpoints.ts:708,877,902`; `plugin-approvals/src/approvals-plugin.ts:349-361`; `plugin-webhooks/src/webhook-outbox-plugin.ts:386` | items now cover the routes' semantics (access-security.me-permissions-aggregation-parity, approvals.email-action-token-door, webhook-lifecycle rev 5); the ledger gap itself is this row | low — internal discipline |
402+
| K6 | **Seed mode `replace` is declared≠implemented.** The spec sells it as "Delete ALL records, then insert" but the write arm is a bare insert whose comment says "caller should have cleared the table" — and no clearing caller exists anywhere. An ADR-0049 shape on the most dangerous member of the enum. | `packages/spec/src/data/seed.zod.ts` vs `packages/metadata-protocol/src/seed-loader.ts:2062-2065,2106` | platform-core.seed-mode-matrix (expected-posture clause — a run must not tick "deletion correctly scoped") | correctness — safe to file |
403+
404+
Two design postures recorded inside items rather than as defect rows: scheduled-report
405+
dispatch is wired **fail-closed** at head (`reports-plugin.ts:137` passes
406+
`resolveOwnerContext: undefined` pending ADR-0073 M2, so every live scheduled dispatch
407+
takes the refusal arm — dashboards.report-schedule-dispatch-delivery asserts exactly
408+
that, with a flip-to-live tripwire); and the theme provider resolves `system` once per
409+
evaluation with no matchMedia listener (platform-core.theme-mode-persistence asserts
410+
resolve-at-load only).
411+
412+
### 9b. Docs drift (PD#10 class — file as docs fixes, not checklist items)
413+
414+
- **`content/docs/references/api/export.mdx:41,168,185`** advertises `jsonl`/`parquet`
415+
formats and an async export-job vocabulary with **zero consumers** (see §9c); the live
416+
door serves exactly csv/json/xlsx and silently coerces any other `?format=` to csv
417+
(`rest-server.ts:7891-7892`) — a caller asking for the documented `parquet` gets a CSV
418+
with a 200.
419+
- **`capabilities/approvals.mdx:11`** counts the dead `queue` style among "eight
420+
resolution styles" (#3508: resolves to **nobody**, designers must not offer it); same
421+
section says department expansion "optionally" includes sub-departments — the spec
422+
always includes all descendants.
423+
- **`capabilities/integrations.mdx:22`** — "one-click record cloning": the server door is
424+
real, but **no objectui surface calls `data.clone`** (confirmed independently by the
425+
docs hunter and the records-forms writer). Say API/SDK, or ship the affordance.
426+
- **`capabilities/views.mdx:23`** — "a default can be set per team": no per-team
427+
default-view mechanism exists anywhere in the UI spec.
428+
- **`capabilities/automation.mdx:19`** — notifications "(in-app, email, chat)": registered
429+
channels are inbox/email/sms only (`messaging-service-plugin.ts:159,249,267`); a "chat"
430+
notify dead-letters honestly, but the doc sells it as a delivery channel.
431+
- **`capabilities/index.mdx:7,33`** — HotCRM "one-click install from the Marketplace":
432+
the install door exists, but whether the public catalog lists HotCRM is unverifiable
433+
in-repo — **maintainer check**, not asserted drift.
434+
435+
### 9c. Declared-but-inert surfaces (ADR-0049 enforce-or-remove candidates — none got items)
436+
437+
- **The whole async export-job surface**`packages/spec/src/api/export.zod.ts`
438+
(`ExportFormat` incl. jsonl/parquet, `ExportJobStatus`, job request/response): no
439+
`.parse` site, no route, no producer; published by the export.mdx page above.
440+
- **`ConcurrencyPolicySchema`** and its neighbor **`ScheduleStateSchema.status`**
441+
(`automation/execution.zod.ts:368-387,411`): exported, referenced by nothing.
442+
- **`driver-nosql.zod.ts` enum family** (consistency/read-write concerns/index/sharding):
443+
`driver-mongodb` exists but no stock boot or fixture uses it — non-testable open-side.
444+
- **`sys_notification_subscription` Setup grid** — declared-inert by its own docstring
445+
(#9807: no `'subscribers'` audience member, nothing reads the rows).
446+
- **objectui collaboration presence is unwired** (`PresenceAvatars` mounts but
447+
`useRecordPresence` resolves `[]` — no `PresenceProvider` host anywhere; `LiveCursors`
448+
and `CommentThread` have zero consumers); `OnboardingWalkthrough` is a deliberate null
449+
stub.
450+
451+
### 9d. Resolutions of earlier sections (append-never-rewrite rule)
452+
453+
- **§7c's `datasource.checkOnBoot` design note is RESOLVED**#13149 (2026-08-29) made
454+
the flag enforced (`external-validation-plugin.ts:288-312` drops opted-out rows before
455+
any verdict, with a named skip line); integration-system.external-schema-drift-gate
456+
rev 2 now asserts the positive instead of the finding.
457+
- **§7b's `admin-routes.ts:518` row is half-resolved**: the "no such consumer exists in
458+
objectui" clause is now stale — objectui ships a live Setup → Datasources consumer of
459+
the federation routes (`metadata-admin/external/api.ts`). The comment-accuracy question
460+
it raised should be re-checked against that consumer before any cleanup edit.
461+
- **§8a D16 is FIXED** (#12457): `setup-nav.contributions.ts:63` ships
462+
`nav_packaged_automation`, pinned by `setup-packaged-automation-nav.test.ts`;
463+
automation.setup-packaged-automation-board rev 2 inverted its expected-fail nav clause
464+
to a positive assertion.
465+
- **Two checklist items were filing-false-findings stale and are fixed in this PR**:
466+
api-backend.route-ledger-live-parity (claimed /api/settings and /api/v1/datasources
467+
are unledgered — both have ledgers + conformance tests now; rewritten to the real
468+
**11-ledger** universe) and integration-system.datasource-admin-lifecycle (same
469+
"unledgered" claim, plus its "always-available static catalog" wording predating the
470+
#9391/#9593 uniform auth floor).
471+
472+
### 9e. Blocked-item re-audit
473+
474+
- **UNBLOCKED: identity-auth.oauth-app-consent-loop** — its "no stock oidcProvider flow"
475+
claim conflated the platform-as-provider (what it tests, and which mounts by default:
476+
`resolveOidcProviderEnabled` follows the MCP default TRUE) with an external IdP (what
477+
`linked-accounts-social` genuinely needs — that one stays blocked). Every citation
478+
verified before flipping; rev 2.
479+
- **RE-PRICED: approvals.quorum-m-of-n** — the showcase now ships a real quorum flow
480+
(`showcase_committee_quorum`, 2-of-3), so the remaining unblock is **one seed line**
481+
(give Ada `finance` or `legal` → a live 2-of-2; a third distinct holder completes
482+
2-of-3), not the "showcase design call pending" the old ref claimed; rev 3.
483+
- **Still blocked, re-verified at head**: approvals.sla-escalation (clock-control harness
484+
`timeoutHours` min 1, `runEscalations()` reads `this.clock`, no HTTP door injects);
485+
access-security.no-active-org-session-semantics (unchanged; #13180/#13181 are new
486+
adjacent instances of its fail-closed doctrine, noted on the item);
487+
records-forms.import-job-undo-cancel (`import-console-undo.spec.ts` still self-skips
488+
without `IMPORT_CONSOLE_LIVE=1`); identity-auth.linked-accounts-social (external
489+
social/OIDC IdP genuinely required).
490+
491+
### 9f. Checked and CLEAN (so the next sweep does not re-derive)
492+
493+
- `data.mdx`'s "days until close date" formula claim is deliverable via
494+
`daysBetween(today(), x)` — the build gate refuses only raw date arithmetic; NOT drift.
495+
- MCP "on by default at /api/v1/mcp" matches `serve.ts:2315-2321`.
496+
- Flow wait `eventType` members deliberately collapse to one suspend-with-correlation
497+
branch (`wait-node.ts:286-289`) — no variants matrix owed; flow boundary events stay
498+
waived-with-reasons in the node matrix.
499+
- objectui's `FeedFilterMode` imports from spec (`RecordActivityTimeline.tsx:31`,
500+
objectui#5969 two-directional pin) — an earlier hand-local-type drift concern is moot.
501+
- The two previously item-unreferenced live objectui e2e specs
502+
(`console-boot-indicator.spec.ts` #2628, `console-rendering.spec.ts`) are now cited on
503+
platform-core.boot-health rev 5 — no orphan e2e specs remain.
504+
- `service-knowledge` is composed by no shipped boot path — ai.mdx's "Knowledge answers"
505+
rides the commercial assistant per that page's own closing note; nothing open-side to
506+
test.
507+
- cloud-connection's bind family and the marketplace browse proxy are control-plane
508+
coupled; the offline arms are now covered
509+
(platform-core.marketplace-install-local-lifecycle / marketplace-console-honesty),
510+
browse legs blocked(environment/network) honestly.
511+
- Stage machines (`state_machine` rule + meta legal-next-states), dashboards `compareTo`,
512+
and backup-restore.mdx were each re-checked: covered / no runtime surface promised.
513+
514+
### 9g. Fixtures worth adding (would un-block clauses recorded as knownGaps)
515+
516+
Showcase one-liners: a `unique: true` field; a `fieldGroups[].visibleWhen` specimen; an
517+
authored `deleteBehavior: 'restrict'` spelling; an `approvalStatusField` declaration on
518+
one approval flow; the Ada `finance`/`legal` position line (§9e). Boot recipes: a
519+
zero-user boot (`--no-seed-admin`, fresh DB) for the owner-bootstrap item; a
520+
verification-enabled boot; an `OS_TENANCY_POSTURE=group` boot (also unblocks §8d's
521+
operator-gate legs); a configured-`AuditPlugin` boot (the read-audit doc's own snippet).
522+
Harnesses: an echoing upstream stub for connector auth kinds; a drifted scratch-DB recipe
523+
for autoMigrate; a second verified non-grant user for the owner-email anchor's entitled
524+
leg; scratch active approver flows + `sys_team` seeds for the resolution matrix. The
525+
compiled install-local artifact already exists in-repo (`examples/app-crm` build).
526+
527+
### 9h. Security note
528+
529+
Nothing withheld from this PR. The three new auth-adjacent items
530+
(access-security.platform-owner-email-anchor, approvals.email-action-token-door,
531+
access-security.me-permissions-aggregation-parity) assert **shipped guards** already
532+
public in their issues/ADRs; K1–K6 are UX/correctness/discipline findings; no unfixed
533+
privilege escalation is disclosed anywhere in this sweep.

docs/qa/platform-checklist/areas/platform-core.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@
7777
"date": "2026-08-21",
7878
"change": "scoped clause 2's ERROR-line grep to the boot window and said why. A caller-error refusal logs at ERROR level with a full stack before answering its 4xx — measured on 17.1.0 with a `$fn` filter probe answering 400 INVALID_FILTER — so any clause grepping the whole log for ERROR reads ordinary, correctly-refused 4xx traffic as a boot failure. The clause now names the window (process start to the first health 200, the instant clause 0 already records), prescribes cutting the log there or capturing it before the first request, and the negatives carry both directions so the false P0 is recognisable from either side. The security property is unchanged: a genuine ERROR-during-boot still fails independently of the probe (#10236 A5, measured #10257)",
7979
"ref": "#10236"
80+
},
81+
{
82+
"revision": 5,
83+
"date": "2026-08-30",
84+
"change": "source-ref addition (2026-08-30 sweep, console-UI angle): the two live objectui e2e specs adjacent to this item's console-shell clause were referenced nowhere in the ledger — e2e/console-boot-indicator.spec.ts (objectui#2628, the pre-bundle white-page pin) and e2e/console-rendering.spec.ts (bootstrap/rendering blank-page pin). Added as source entries with the objectui-repo-only caveat (RUNNER.md standing fact), NOT as automated.ref — they pin the console build, not this item's boot protocol, so a run here may cite them as adjacent evidence but is not asked to execute them. No step/clause change",
85+
"ref": "#sweep-2026-08-30"
8086
}
8187
]
8288
},

docs/qa/platform-checklist/coverage.json

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,15 @@
3232
"platform-core.boot-health",
3333
"platform-core.nav-surfaces-render",
3434
"access-security.me-permissions-aggregation-parity",
35-
"search.command-palette-navigation"
35+
"search.command-palette-navigation",
36+
"platform-core.marketplace-install-local-lifecycle",
37+
"platform-core.marketplace-console-honesty"
3638
]
3739
},
3840
"book": {
3941
"items": [
40-
"platform-core.docs-audience-gate"
42+
"platform-core.docs-audience-gate",
43+
"platform-core.docs-portal-render"
4144
]
4245
},
4346
"dashboard": {
@@ -69,7 +72,8 @@
6972
},
7073
"doc": {
7174
"items": [
72-
"platform-core.docs-audience-gate"
75+
"platform-core.docs-audience-gate",
76+
"platform-core.docs-portal-render"
7377
]
7478
},
7579
"email_template": {
@@ -132,7 +136,8 @@
132136
"items": [
133137
"platform-core.manifest-install-contract",
134138
"cli.plugin-manifest-build-contract",
135-
"api-backend.package-rest-lifecycle"
139+
"api-backend.package-rest-lifecycle",
140+
"platform-core.marketplace-install-local-lifecycle"
136141
]
137142
},
138143
"mapping": {
@@ -156,14 +161,16 @@
156161
"api-backend.formula-stdlib-matrix",
157162
"api-backend.api-methods-verb-gate",
158163
"integration-system.external-schema-browser-ui",
159-
"search.command-palette-navigation"
164+
"search.command-palette-navigation",
165+
"platform-core.lifecycle-retention-sweep"
160166
]
161167
},
162168
"page": {
163169
"items": [
164170
"studio-authoring.record-page-roundtrip",
165171
"platform-core.nav-surfaces-render",
166-
"search.command-palette-navigation"
172+
"search.command-palette-navigation",
173+
"platform-core.marketplace-console-honesty"
167174
]
168175
},
169176
"permission": {
@@ -215,7 +222,9 @@
215222
},
216223
"seed": {
217224
"items": [
218-
"platform-core.seed-integrity"
225+
"platform-core.seed-integrity",
226+
"platform-core.marketplace-install-local-lifecycle",
227+
"platform-core.seed-mode-matrix"
219228
]
220229
},
221230
"skill": {
@@ -263,7 +272,8 @@
263272
"capability": {
264273
"items": [
265274
"access-security.capability-declaration-lifecycle",
266-
"ai.console-ai-surface-gating"
275+
"ai.console-ai-surface-gating",
276+
"platform-core.marketplace-install-local-lifecycle"
267277
]
268278
}
269279
}

0 commit comments

Comments
 (0)