Skip to content

QA run · records-forms (FULL area) · a86db175 · 2026-08-10 · 15 PASS / 12 PARTIAL / 4 FAIL / 1 BLOCKED #7439

Description

@baozhoutao

Full records-forms area run of the checklist-test skill — all 32 runnable items driven against a live showcase + vendored console (6 opus subagents, one isolated boot each). Supersedes the api-subset run #7399. 4 real regressions (all in the vendored console / objectui), each reproduced ≥2× with root cause. Convention labels: qa-run + bug (labels not yet created in this repo).

Result: 15 PASS · 12 PARTIAL · 4 FAIL · 1 BLOCKED (of 32 runnable; +1 pre-blocked import-job-undo-cancel fixture). Screenshots were judgment aids only — this report is text; every verdict rests on a server-truth/network/test oracle.

Environment

frameworka86db175 — branch claude/platform-test-checklist-ocwugl (PR #7304)
consolevendored dist built from objectui 09987b68 (.objectui-sha)
app · drivershowcase · SqlDriver(better-sqlite3) · fresh isolated file DB + port per item · admin@objectos.ai
browserPlaywright/Chromium (executablePath pin) · console loaded via localhost (trusted-origin)

🔴 FAIL — 4 regressions (all in the vendored console / objectui)

1. upload-guard-blocks-confirm — image param has no client-side max-size guard
p_cover (declared maxSize 5 MB) accepts an oversized file: a 6.3 MB PNG fires a full presigned → PUT → complete upload with no rejection, while p_attachments (10 MB) correctly rejects >10 MB with zero uploads. Reproduced 2×.
Repro: Field Zoo → Specimen–Full row → run "Action Param Gallery"; set a >5 MB image on Cover image (p_cover). Expected: rejected before any upload (like p_attachments for >10 MB). Actual: full upload + preview, no "5.0 MB" error. Root cause: the image-param widget lacks the client maxSize guard the file-param widget has.

2. kanban-drag-persistence — rejected drag doesn't roll the card back
An illegal Kanban drag (Backlog→In Progress) is correctly rejected server-side (PATCH 400 invalid_transition, toast shown, server stays backlog), but the card stays stuck in the target column until a manual reload. Reproduced 3× (switcher + dedicated Board view).
Repro: showcase_task → Kanban; drag a Backlog card onto In Progress. Expected: card returns to Backlog on the 400. Actual: card stuck in In Progress >5 s. Root cause: objectui plugin-kanban/src/ObjectKanban.tsxhandleCardMove gates revert-on-failure behind if (!hasExternalData); the ListView-hosted (console) path has hasExternalData=true, so rollback is skipped.

3. saved-view-management — renaming a draft view doesn't persist
Create-kanban / pin / delete all work (200), but rename of a freshly-created draft view is rejected and silently lost; set-default fires no write at all. Reproduced 2×.
Repro: create a Kanban view via the + tab (draft), then tab menu → Rename. Expected: new label persists. Actual: client updateView GETs the base view withoutpreview=draft → 404 → treats as create → writes an invalid partial {label,name,object}PUT → 422; re-read (preview=draft) still shows the old label. Root cause: objectui data-objectstack/src/index.tsupdateView() reads the base view without preview=draft then writes an invalid partial.

4. bulk-select-all-matching — Clear leaves row checkboxes ticked (#3056 drift)
Clicking Clear in the bulk-actions bar empties the toolbar but leaves the row checkboxes data-state="checked" (header stays indeterminate) — stranded ticks with no toolbar. Reproduced 2×.
Repro: showcase_contact list → tick 3 rows → click Clear. Expected: bar and checkboxes both reset. Actual: bar removed, checkboxes stay checked. Root cause: objectui plugin-grid/src/ObjectGrid.tsxonClearSelection does setSelectedRows([]) + setSelectAllMatching(false) but omits the setSelectionResetKey bump that resetSelection() (delete/dispatch paths) performs.
Note: this item's cross-page-banner clauses (0/1/2/4) are blocked(fixture) — no seeded object exceeds the 100-row page window and no view exposes pageSizeOptions, so "select all matching" is unreachable in the stock console.


🟡 Notable finding inside PARTIAL

object-hook-lifecycle — hook ['log'] capability output is not observable. Hook bodies fire ([BodyRunner] hook fired) and don't throw, but the named log lines (ctx.log.info("task completed: …"), "project over budget: …") never appear even at --log-level debug. Hook lifecycle + condition semantics are all correct (beforeInsert defaults/trim, afterUpdate two-root previous.done gating #4784, total-record merge, fail-closed condition #4775). Clauses 2/4/5 are partial only because their named-log oracle can't be captured. Worth a separate look at body-runner.tslog:engineCtx.logger wiring.


Full verdict table (32 runnable + 1 pre-blocked)

itempri · surfaceverdict
validation-rule-type-matrixP1 api✅ pass (6 rule types, exact codes)
named-import-mappingP2 api✅ pass (mapped + idempotent + 404)
field-type-matrixP1 mixed✅ pass (dogfood 46/46 + widgets + mask + refs)
conditional-rules-headerP1 mixed✅ pass (requiredWhen/readonlyWhen/visibleWhen both ends)
conditional-rules-gridP1 browser✅ pass (row-scoped required + parent-lock + receipt ref)
master-detail-atomic-saveP1 browser✅ pass (single atomic /batch, roll-up, all-or-nothing)
related-list-server-paginationP1 browser✅ pass (paged child queries, 403-vs-200 both persona)
action-param-widgetsP1 mixed✅ pass (10 real widgets, malformed bag rejected)
import-wizard-encoding-and-hintsP2 browser✅ pass (GBK + required-hint + degrade + live import)
form-dirty-guardP2 browser✅ pass (prompt iff dirty; discardGuard 14/14)
adhoc-filter-sort-builderP1 browser✅ pass (merge under AND, per-user key, uf__tab, #1964)
concurrent-edit-conflictP1 mixed✅ pass (OCC 409 both surfaces, 1 PATCH 2 keys, occSave 8/8)
lookup-picker-create-newP2 browser✅ pass (nested create, real id adopt, scoped $search, both-sides)
field-type-constraintsP1 mixed✅ pass (8/8; 2 non-enforcement gaps recorded honestly)
encrypted-field-behaviorP1 mixed✅ pass (ciphertext, read-mask, no-op echoed-mask, fail-closed pins)
crud-roundtripP0 browser🟡 partial — clone RLS-404 / enable.clone:false blocked(fixture)
list-view-capabilitiesP1 browser🟡 partial — server $skip unreachable (no object >100-row page)
view-type-galleryP1 browser🟡 partial — map basemap env-blocked; kanban summarize-total; smoke env
form-view-galleryP1 browser🟡 partial — tabbed/wizard/split/drawer/modal have no UI opener (fixture)
cascading-optionsP1 mixed🟡 partial — role-gate allow-side: 'admin' position never seeded
action-location-matrixP1 browser🟡 partial — record_header/more/related unreachable on stock page; global_nav unproven
gantt-interactionsP2 browser🟡 partial — auto-schedule/lock/veto need fixtures (matches knownGaps)
calendar-interactionsP1 browser🟡 partial — quick-create needs project; real-403 unreachable
record-discussion-mentionsP1 browser🟡 partial — mention-bell/recipient-scoping need a 2nd real user
grid-personalizationP2 browser🟡 partial — column resize/reorder not reproduced; rowColor has no colors map
object-hook-lifecycleP1 mixed🟡 partial — ['log'] output not observable (see finding); scratch-hook fixtures
cascading-multilevel-and-clearP1 mixed🟡 partial — clear-on-switch flaky; recorded gaps; 3-level fixture
upload-guard-blocks-confirmP2 browser🔴 fail — p_cover 5 MB guard missing
kanban-drag-persistenceP2 browser🔴 fail — no rollback on rejected drag
saved-view-managementP2 browser🔴 fail — draft view rename lost
bulk-select-all-matchingP2 browser🔴 fail — Clear leaves checkboxes ticked (#3056)
record-edit-undoP2 browser⛔ blocked — automation-input trap (undo toast unsurfaceable; unit-pinned)
import-job-undo-cancelP1 browser⛔ pre-blocked (fixture) — not run

Fixture gaps to close (make more clauses runnable)

  • A seeded object >100 rows (or a view exposing pageSizeOptions) → unlocks list-view $skip + the whole bulk-select-all-matching cross-page banner.
  • Bind an admin position to the seeded admin (or point the gate at a seeded position) → cascading-options allow-side.
  • A second sign-up-able userrecord-discussion-mentions bell/recipient; related-list RLS both-sides (already worked around); non-admin gates.
  • Wire UI openers for the tabbed/wizard/split/drawer form views → form-view-gallery.
  • Gantt view with dependenciesField/lockField/parentField; a scratch throwing/duplicate-event hook; a 3-level cascade object; a rowColor.colors map.

Screenshots

None — every clause rests on an api/network/log/test oracle or DOM-after-screenshot. Per RUNNER.md the report is text-only; the 4 fails carry reproduction rules above instead of images.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions