Repository navigation
QA run · records-forms (30/44) · 5b14b7f3 · 2026-10-19 · 11 PASS / 19 PARTIAL / 0 FAIL / 0 BLOCKED / 14 NOT-RUN #24572
Description
Run record for the 18.0 release sweep, selector records-forms (resolved with node scripts/checklist-select.mjs area:records-forms --json), plan B (Tier 1 + Tier 2; Tier 3 deferred).
Environment fingerprint
- framework:
5b14b7f3ad8e2e0786d228772f473d07b36b2477(objectstack-ai/objectstack main), working tree clean - console:
.objectui-sha=4016370af3c9c9dafec2bc5299afd8e8079701b8, built withpnpm objectui:build;packages/console/dist/.objectui-shastamp equals the pin (pnpm check:console-shagreen), so the stale-console-bundle trap is ruled out for every console observation - app: showcase (examples/app-showcase), canonical boot
OS_PORT=PORT pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:/tmp/qa18/ITEM/data.db; every hand-driven item had its own port and file DB (listed per item below); seed:--seed-admin(admin@objectos.ai) + showcase seed + per-item scratch fixtures - Tier 1 pins: vitest per package against the same tree (
pnpm exec vitest run FILES), 97 framework files / 2209 tests, 0 failed; objectui-side pins run inside a clone of objectui at4016370af3c9(unit vitest +playwright.live.config.tsagainst a showcase boot on :47431 through the objectui console dev server), RUNNER option (b) - browser: Playwright with
/opt/pw-browsers/chromium, own context per persona, sign-in through the form - timestamps: 2026-10-19, environment prep 12:26–12:43 UTC, testing 12:43–13:53 UTC; Tier 2 items were driven in parallel by sub-runners (≤ 3–4 browser items at once), each on its own port/DB
Scope
Selector records-forms → 44 runnable item(s). Planned (not runnable, not counted): records-forms.picklist-shared-across-objects → planned. Blocked items hidden by the resolver were not run (no --include-blocked).
Tiering (checklist-test SKILL §1): Tier 1 = item carries automated.ref (pin run, cited); Tier 2 = unpinned P0/P1 (hand-driven); Tier 3 = unpinned P2 (deferred, not-run).
| item | priority | surface | tier | revision | item verdict |
|---|---|---|---|---|---|
records-forms.crud-roundtrip |
P0 | browser | 1 | 10 | pass |
records-forms.field-type-matrix |
P1 | mixed | 1 | 3 | partial |
records-forms.list-view-capabilities |
P1 | browser | 1 | 3 | partial |
records-forms.view-type-gallery |
P1 | browser | 1 | 1 | partial |
records-forms.form-view-gallery |
P1 | browser | 2 | 3 | pass |
records-forms.conditional-rules-header |
P1 | mixed | 1 | 2 | partial |
records-forms.conditional-rules-grid |
P1 | browser | 1 | 4 | partial |
records-forms.cascading-options |
P1 | mixed | 1 | 3 | partial |
records-forms.master-detail-atomic-save |
P1 | browser | 1 | 3 | partial |
records-forms.related-list-server-pagination |
P1 | browser | 1 | 4 | not-run |
records-forms.action-param-widgets |
P1 | mixed | 1 | 2 | partial |
records-forms.upload-guard-blocks-confirm |
P2 | browser | 3 | 2 | not-run |
records-forms.import-wizard-encoding-and-hints |
P2 | browser | 1 | 6 | partial |
records-forms.action-location-matrix |
P1 | browser | 1 | 11 | not-run |
records-forms.validation-rule-type-matrix |
P1 | api | 2 | 3 | partial |
records-forms.gantt-interactions |
P2 | browser | 1 | 4 | partial |
records-forms.kanban-drag-persistence |
P2 | browser | 3 | 1 | not-run |
records-forms.form-dirty-guard |
P2 | browser | 1 | 3 | partial |
records-forms.named-import-mapping |
P2 | api | 3 | 1 | not-run |
records-forms.adhoc-filter-sort-builder |
P1 | browser | 1 | 3 | not-run |
records-forms.calendar-interactions |
P1 | browser | 1 | 2 | not-run |
records-forms.concurrent-edit-conflict |
P1 | mixed | 1 | 3 | not-run |
records-forms.record-discussion-mentions |
P1 | browser | 1 | 3 | partial |
records-forms.grid-personalization |
P2 | browser | 1 | 4 | not-run |
records-forms.saved-view-management |
P2 | browser | 3 | 2 | not-run |
records-forms.bulk-select-all-matching |
P2 | browser | 1 | 3 | partial |
records-forms.lookup-picker-create-new |
P2 | browser | 1 | 3 | not-run |
records-forms.import-job-undo-cancel |
P2 | mixed | 1 | 4 | not-run |
records-forms.object-hook-lifecycle |
P1 | mixed | 1 | 5 | partial |
records-forms.field-type-constraints |
P1 | mixed | 1 | 1 | pass |
records-forms.cascading-multilevel-and-clear |
P1 | mixed | 1 | 3 | partial |
records-forms.encrypted-field-behavior |
P1 | mixed | 1 | 2 | pass |
records-forms.field-group-visible-when |
P1 | mixed | 2 | 4 | pass |
records-forms.field-unique-enforcement |
P1 | api | 1 | 3 | pass |
records-forms.delete-behavior-matrix |
P1 | api | 1 | 1 | pass |
records-forms.record-clone-contract |
P2 | api | 1 | 1 | pass |
records-forms.field-history-tracking |
P1 | mixed | 1 | 1 | partial |
records-forms.import-transform-matrix |
P2 | api | 3 | 2 | not-run |
records-forms.predicate-relationship-traversal |
P1 | api | 1 | 3 | partial |
records-forms.script-action-hook-refusal-toast |
P2 | browser | 3 | 1 | not-run |
records-forms.write-time-option-and-element-shape-judgement |
P2 | api | 1 | 1 | pass |
records-forms.write-answer-advisories-rollback-and-tree-delete |
P1 | api | 1 | 1 | pass |
records-forms.comment-reactions-and-edit-stamps |
P2 | api | 1 | 1 | pass |
records-forms.v18-semantic-defaults |
P2 | mixed | 1 | 1 | partial |
Per-clause verdicts
A = acceptance[n], N = negative[n]. Tier 1 rule: a clause is pass only when a passing pin covers it (server-side oracles, or clauses the ref names); clauses a ref says it does not cover, and UI-oracle clauses a server-side pin cannot see, are not-run. Evidence is text from the oracle — no images.
records-forms.crud-roundtrip — pass (hand-driven (port 47461 · file:/tmp/qa18/crud/data.db · hand-driven (the automated.ref pins only acceptance[6]'s readonly half)))
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | console Create Account → POST /api/v1/data/showcase_account → 201; filtered GET total 1, every value verbatim, website null (not defaulted) |
| A1 | pass | Edit → PATCH body {annual_revenue:4200000} → 200; 23-key before/after diff changes only annual_revenue (+ engine updated_at) |
| A2 | pass | Delete dialog → DELETE → 200; filtered GET total 0; GET by id 404; reloaded list lacks the row |
| A3 | pass | post-reload list screenshots reflect create and delete with display values |
| A4 | pass | History tab: UPDATE Annual Revenue — → 4200000 and CREATE with option labels and the real actor; localized date on a second probe |
| A5 | pass | os-qa-18crud-华宁 re-reads byte-identical (UTF-8 hex compared); $search=华宁 total 2; UI quick-search shows the same 2 rows |
| A6 | pass | POST /api/v1/data/showcase_account/ID/clone → 201 new id, business values copied, id/created_at/updated_at re-derived; non-owner member clone of showcase_field_zoo → owner and created_by are the member, autonumber re-minted 0001→0003, formula re-derived; readonly half: protocol.readonly-insert.test.ts 11/11 and engine-insert-static-readonly-strip.test.ts 21/21 pass, live contact clone reports droppedFields readonly lead_score |
| A7 | pass | contributor member: GET INV-1003 → 404; POST …/INV-1003/clone → 404 RECORD_NOT_FOUND; admin invoice count 13 before and after; own-row clone 201 |
| N0 | pass | empty Account Name blocks with a named field error and toast; no POST issued; count 0 |
| N1 | pass | no id, audit column, autonumber or readonly value carried by a clone; RLS-invisible clone refused 404 |
| N2 | pass | required-no-default field (showcase_account.name, substituted for status — see accuracy finding) missing → 400 VALIDATION_FAILED fields[0] {field name, code required} |
| N3 | pass | tax_id not-an-ein → 400 invalid_format Tax ID must look like 12-3456789. shown under the field; direct API same |
records-forms.field-type-matrix — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: field-zoo-roundtrip.dogfood.test.ts 46/46 passed; field-zoo-value-shape.test.ts 45/45 passed |
| A1 | not-run | dom oracle — the pin is server-side; UI half not driven in this Tier 1 pass |
| A2–A6 | pass | pin: field-zoo-roundtrip.dogfood.test.ts 46/46 passed; field-zoo-value-shape.test.ts 45/45 passed |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.list-view-capabilities — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | not-run | not covered by pin (framework pin showcase-search.dogfood is search-scoped and not attributed to these clauses; objectui saved-view-filter.spec pass → A1; other objectui live specs stale or not covering) |
| A1 | pass | pin: showcase-search.dogfood.test.ts 5/5 passed; objectui@4016370a saved-view-filter.spec.ts 1/1 |
| A2–N2 | not-run | not covered by pin (framework pin showcase-search.dogfood is search-scoped and not attributed to these clauses; objectui saved-view-filter.spec pass → A1; other objectui live specs stale or not covering) |
records-forms.view-type-gallery — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | not-run | not covered by a passing pin (examples/app-showcase/e2e/showcase-smoke.spec.ts 49/49 pass (SMOKE_API_URL :47431, chromium alias) → A5; page-level render does not prove A0–A4); not hand-driven in this Tier 1 pass |
| A5 | pass | pin: examples/app-showcase/e2e/showcase-smoke.spec.ts 49/49 pass (SMOKE_API_URL :47431, chromium alias) → A5; page-level render does not prove A0–A4 |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.form-view-gallery — pass (hand-driven (port 47462 · file:/tmp/qa18/formgal/data.db))
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | simple / tabbed / wizard / split / drawer / modal each rendered as declared (simple 2-col; tabs Overview/Schedule/Details; stepper Step 1 of 3; split 2 panes + separator; drawer side panel on task-desk; centered modal) |
| A1 | pass | wizard: 0 data writes across Next/Back/Next/Next; Save → exactly one PATCH → 200; step order enforced and empty required blocks Next |
| A2 | pass | conditional Notes mounts at priority Urgent and unmounts at Low |
| A3 | pass | full-row diffs per variant change only the edited keys; modal create 201 re-read as submitted |
| A4 | pass | tab and step hops keep entered values |
| N0–N1 | pass | wizard blocks Next on empty required with a named error; drawer/modal scored only on task-desk; overlay reverted via DELETE /api/v1/meta/view/showcase_task.form (re-read byte-identical to stock) |
records-forms.conditional-rules-header — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: objectui@4016370a e2e/live required-when-submit.spec.ts pass (R2) → A0; field-conditional-rules stale (expects disabled input, UI renders read-only text); list-row-action-cel too weak for A4 |
| A1–A5 | not-run | not covered by a passing pin (objectui@4016370a e2e/live required-when-submit.spec.ts pass (R2) → A0; field-conditional-rules stale (expects disabled input, UI renders read-only text); list-row-action-cel too weak for A4); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.conditional-rules-grid — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: objectui@4016370a e2e/live grid-conditional-rules pass (R3) → A0; grid-parent-rules pass (R2) → A2; grid-file-upload stale (strict-mode collision with sr-only DialogDescription) |
| A1 | not-run | not covered by a passing pin (objectui@4016370a e2e/live grid-conditional-rules pass (R3) → A0; grid-parent-rules pass (R2) → A2; grid-file-upload stale (strict-mode collision with sr-only DialogDescription)); not hand-driven in this Tier 1 pass |
| A2 | pass | pin: objectui@4016370a e2e/live grid-conditional-rules pass (R3) → A0; grid-parent-rules pass (R2) → A2; grid-file-upload stale (strict-mode collision with sr-only DialogDescription) |
| A3, A4 | not-run | not covered by a passing pin (objectui@4016370a e2e/live grid-conditional-rules pass (R3) → A0; grid-parent-rules pass (R2) → A2; grid-file-upload stale (strict-mode collision with sr-only DialogDescription)); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.cascading-options — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | not-run | not covered by a passing pin (objectui@4016370a e2e/live cascading-options.spec.ts :75 pass → A1; :51 stale (expects md-form-submit on a flat ModalForm)); not hand-driven in this Tier 1 pass |
| A1 | pass | pin: objectui@4016370a e2e/live cascading-options.spec.ts :75 pass → A1; :51 stale (expects md-form-submit on a flat ModalForm) |
| A2–A4 | not-run | not covered by a passing pin (objectui@4016370a e2e/live cascading-options.spec.ts :75 pass → A1; :51 stale (expects md-form-submit on a flat ModalForm)); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.master-detail-atomic-save — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: objectui@4016370a e2e/live master-detail 2/2 (R3) → A0; summary-rollup 2/2 → A2; form-view-subforms stale (strict-mode collision) |
| A1 | not-run | not covered by a passing pin (objectui@4016370a e2e/live master-detail 2/2 (R3) → A0; summary-rollup 2/2 → A2; form-view-subforms stale (strict-mode collision)); not hand-driven in this Tier 1 pass |
| A2 | pass | pin: objectui@4016370a e2e/live master-detail 2/2 (R3) → A0; summary-rollup 2/2 → A2; form-view-subforms stale (strict-mode collision) |
| A3–A5 | not-run | not covered by a passing pin (objectui@4016370a e2e/live master-detail 2/2 (R3) → A0; summary-rollup 2/2 → A2; form-view-subforms stale (strict-mode collision)); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.related-list-server-pagination — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A5 | not-run | not covered by a passing pin (objectui@4016370a e2e/live detail-related-list stale (waits for ?recordId=, row click now opens /record/ID) — no clause covered); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.action-param-widgets — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0, A1 | not-run | not covered by pin (dogfood action-params-contract pins the dispatch-time param contract; A3 needs the dialog half too; objectui action-modal.spec touches no params); not hand-driven in this Tier 1 pass |
| A2 | pass | pin: action-params-contract.dogfood.test.ts 5/5 passed |
| A3–N1 | not-run | not covered by pin (dogfood action-params-contract pins the dispatch-time param contract; A3 needs the dialog half too; objectui action-modal.spec touches no params); not hand-driven in this Tier 1 pass |
records-forms.upload-guard-blocks-confirm — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A3, N0–N1 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.import-wizard-encoding-and-hints — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A2 | pass | pin: objectui@4016370a importParsers.test.ts 57/57, importMissingRequiredHint.test.tsx 2/2, importLegacyReferenceGuard.test.tsx 3/3; A3 (API rows) not pinned |
| A3 | not-run | not covered by a passing pin (objectui@4016370a importParsers.test.ts 57/57, importMissingRequiredHint.test.tsx 2/2, importLegacyReferenceGuard.test.tsx 3/3; A3 (API rows) not pinned); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.action-location-matrix — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | not-run | not covered by a passing pin (objectui@4016370a e2e/live action-modal pass (R3) — A2 only partly (modal opens/closes); list-row-action-cel too weak for A3); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.validation-rule-type-matrix — partial (hand-driven (port 47403 · file:/tmp/qa18/vr-matrix/data.db))
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | each 400 VALIDATION_FAILED with its code: invalid_initial_state (project status active), invalid_transition (project active→planned; account active→prospect), invalid_format (tax_id ABC; billing_email), json_schema_violation (support_config seats 0), invalid_json, rule_violation (cross_field end before start; script spent 500 over 1.2×budget; conditional churned without reason) |
| A1 | pass | fields[] targets start_date / tax_id / billing_email / support_config / status; script and conditional rules target _record |
| A2 | pass | row counts unchanged after every rejected POST; rejected PATCH rows byte-identical on re-read |
| A3 | pass | every compliant twin landed (201/200) |
| A4 | pass | PATCH health green→red → 200 with warnings [{rule project_health_progression, severity warning, code invalid_transition}]; re-read red; WARN log line present |
| N0 | not-run | an unevaluable-CEL rule cannot be authored on stock (object metadata sealed; no seeded unevaluable rule) — fixture gap |
| N1–N2 | pass | the warning rule did not block (evaluable leg); WARN log line present |
records-forms.gantt-interactions — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | not-run | not covered by a passing pin (objectui@4016370a GanttView.autoscheduledlg 4/4, summaryedit 8/8, deptypes 2/2, scheduling.selfextent 8/8, countinterp.i18n 5/5, dnd 21/21; A0/A3 not pinned (ref says so)); not hand-driven in this Tier 1 pass |
| A1, A2 | pass | pin: objectui@4016370a GanttView.autoscheduledlg 4/4, summaryedit 8/8, deptypes 2/2, scheduling.selfextent 8/8, countinterp.i18n 5/5, dnd 21/21; A0/A3 not pinned (ref says so) |
| A3 | not-run | not covered by a passing pin (objectui@4016370a GanttView.autoscheduledlg 4/4, summaryedit 8/8, deptypes 2/2, scheduling.selfextent 8/8, countinterp.i18n 5/5, dnd 21/21; A0/A3 not pinned (ref says so)); not hand-driven in this Tier 1 pass |
| N0 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.kanban-drag-persistence — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A2, N0–N0 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.form-dirty-guard — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0, A1 | not-run | not covered by a passing pin (objectui@4016370a discardGuard.test.tsx 14/14; A0 partial (X + Cancel only), A1 not pinned); not hand-driven in this Tier 1 pass |
| A2 | pass | pin: objectui@4016370a discardGuard.test.tsx 14/14; A0 partial (X + Cancel only), A1 not pinned |
| N0 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.named-import-mapping — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A2, N0–N0 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.adhoc-filter-sort-builder — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | not-run | not covered by a passing pin (objectui@4016370a e2e/live user-filters :89 pass → A4 partial only; :22 stale (pre-ADR-0053 metadata)); not hand-driven in this Tier 1 pass |
| N0–N3 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.calendar-interactions — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A3 | not-run | not covered by a passing pin (objectui@4016370a CalendarView.dnd.test.tsx 8/8 — geometry via onEventDrop only; no clause covered); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.concurrent-edit-conflict — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A5 | not-run | not covered by a passing pin (objectui@4016370a occSave.test.tsx 8/8 — A1/A3 client halves only (partial clauses); live inline-edit-polish-2572 red (stale spec + consumed fixture); no whole clause); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.record-discussion-mentions — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | not-run | not covered by pin (ref: FEEDS_DISABLED engine/API pins on their own fixtures; console half and clauses 1-5,8 not pinned); not hand-driven in this Tier 1 pass |
| A5, A6 | pass | pin: capability-gate-update-verb.test.ts 12/12 passed; comments-permission-matrix.dogfood.test.ts 10/10 passed |
| A7–N2 | not-run | not covered by pin (ref: FEEDS_DISABLED engine/API pins on their own fixtures; console half and clauses 1-5,8 not pinned); not hand-driven in this Tier 1 pass |
| N3 | pass | pin: capability-gate-update-verb.test.ts 12/12 passed; comments-permission-matrix.dogfood.test.ts 10/10 passed |
| N4, N5 | not-run | not covered by pin (ref: FEEDS_DISABLED engine/API pins on their own fixtures; console half and clauses 1-5,8 not pinned); not hand-driven in this Tier 1 pass |
records-forms.grid-personalization — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | not-run | not covered by a passing pin (objectui@4016370a groupedPagination 7/7, groupedBooleanLabel 2/2, inlineEditPersistence 1/1 — adjacent pins, no clause covered); not hand-driven in this Tier 1 pass |
| N0, N1 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.saved-view-management — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A3, N0–N2 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.bulk-select-all-matching — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0, A1 | not-run | not covered by a passing pin (objectui@4016370a objectBulkActionDispatch 12/12, BulkActionBar 7/7, bulkActionRefresh 11/11; A0 partial, A1/A4 not pinned); not hand-driven in this Tier 1 pass |
| A2, A3 | pass | pin: objectui@4016370a objectBulkActionDispatch 12/12, BulkActionBar 7/7, bulkActionRefresh 11/11; A0 partial, A1/A4 not pinned |
| A4 | not-run | not covered by a passing pin (objectui@4016370a objectBulkActionDispatch 12/12, BulkActionBar 7/7, bulkActionRefresh 11/11; A0 partial, A1/A4 not pinned); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.lookup-picker-create-new — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A3 | not-run | not covered by a passing pin (objectui@4016370a LookupField.dependsOn 6/6, RecordPickerDialog.filterOptions 12/12 — adjacent pins (ref admits), no clause covered); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.import-job-undo-cancel — not-run (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A3 | not-run | not covered by a passing pin (objectui e2e/import-console + import-harness specs not run this sweep (separate configs/backends, out of the dispatched spec list)); not hand-driven in this Tier 1 pass |
| N0–N2 | not-run | negative spans the UI half not driven in this Tier 1 pass |
records-forms.object-hook-lifecycle — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: showcase-public-form.dogfood.test.ts 4/4 passed; hook-error-format.dogfood.test.ts 4/4 passed |
| A1–N4 | not-run | not covered by pin (ref: dogfood pins beforeInsert stamp + beforeDelete abort error body; transition audit/over-budget/priority LOG oracles and scratch variants NOT pinned (wrapper unit tests named by source file only)); not hand-driven in this Tier 1 pass |
records-forms.field-type-constraints — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N4 | pass | pin: field-zoo-roundtrip.dogfood.test.ts 46/46 passed; field-zoo-value-shape.test.ts 45/45 passed; engine-lookup-referential-integrity.test.ts 14/14 passed; engine-autonumber-runtime-owned.test.ts 32/32 passed |
records-forms.cascading-multilevel-and-clear — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | not-run | not covered by pin (objectql rule-validator.option-visibility + objectui cascading-options :75 pin the server written-value gate; KNOWN-GAP clauses and lookup twin not pinned; :51 stale); not hand-driven in this Tier 1 pass |
| A1 | pass | pin: rule-validator.option-visibility.test.ts 55/55 passed |
| A2–N2 | not-run | not covered by pin (objectql rule-validator.option-visibility + objectui cascading-options :75 pin the server written-value gate; KNOWN-GAP clauses and lookup twin not pinned; :51 stale); not hand-driven in this Tier 1 pass |
records-forms.encrypted-field-behavior — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N3 | pass | pin: secret-fields.test.ts 41/41 passed; field-zoo-roundtrip.dogfood.test.ts 46/46 passed |
records-forms.field-group-visible-when — pass (hand-driven (port 47463 · file:/tmp/qa18/fgvw/data.db · scratch package com.objectstack.qa.groupgate, object qa_group_gate))
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | bare-string visibleWhen stored verbatim; envelope spelling stored as {dialect:cel, source}; both gate identically on form and detail |
| A1 | pass | visibleOn → 422 INVALID_METADATA unrecognized_keys naming visibleWhen (also with ?mode=draft); nothing landed |
| A2 | pass | vitest object-strictness-batch20.test.ts + field-group-layout.test.ts 70/70 |
| A3 | pass | form toggle Basic↔Pro mounts/unmounts the group header and members; detail page re-renders after an in-page edit |
| A4 | pass | hidden-section values preserved on save (PATCH body only name; re-read unchanged) |
| N0–N1, N3 | pass | visibleOn refused with guidance; hidden values not dropped; scored on the object-level slot only |
| N2 | pass (direction recorded: FAIL-OPEN) | unknown-field predicate and syntax-broken predicate (record.kind ==) both PUT 200; both pages render with the section SHOWN and a console diagnostic … treated as its safe default (true) … [parse] Unexpected token: EOF; no blank form or crash. The spec text says fail-closed — drift filed as the negative instructs |
records-forms.field-unique-enforcement — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N3 | pass | pin: memory-unique-constraint.test.ts 26/26 passed; sql-driver-8577-tenant-scoped-declared-unique.test.ts 39/39 passed; sql-driver-declared-index-organization-respelling.test.ts 26/26 passed |
records-forms.delete-behavior-matrix — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N3 | pass | pin: engine-cascade-delete.test.ts 25/25 passed; engine-cascade-delete-atomic.test.ts 13/13 passed; engine-cascade-delete-multivalue-probe.test.ts 20/20 passed |
records-forms.record-clone-contract — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N3 | pass | pin: search-clone-schema-conformance.test.ts 8/8 passed; search-clone-route-schema-conformance.test.ts 6/6 passed |
records-forms.field-history-tracking — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: audit-lookup-summary.test.ts 19/19 passed; audit-option-label-summary.test.ts 13/13 passed |
| A1–A3 | not-run | not covered by pin (plugin-audit summary pins cover the rendered summary and reference titles; tab gating/derived op/untracked fallback not pinned; objectui record-history-display.spec skips without app-todo); not hand-driven in this Tier 1 pass |
| A4 | pass | pin: audit-lookup-summary.test.ts 19/19 passed; audit-option-label-summary.test.ts 13/13 passed |
| N0–N3 | not-run | not covered by pin (plugin-audit summary pins cover the rendered summary and reference titles; tab gating/derived op/untracked fallback not pinned; objectui record-history-display.spec skips without app-todo); not hand-driven in this Tier 1 pass |
records-forms.import-transform-matrix — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A3, N0–N3 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.predicate-relationship-traversal — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A2 | not-run | not covered by pin (ref: acceptance[3] ONLY); not hand-driven in this Tier 1 pass |
| A3 | pass | pin: engine-predicate-relationship.test.ts 45/45 passed |
| N0–N2 | not-run | not covered by pin (ref: acceptance[3] ONLY); not hand-driven in this Tier 1 pass |
records-forms.script-action-hook-refusal-toast — not-run (Tier 3)
| clause | verdict | evidence |
|---|---|---|
| A0–A3, N0–N3 | not-run | Tier 3 deferred by the 18.0 release-sweep plan |
records-forms.write-time-option-and-element-shape-judgement — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A4 | pass | pin: rule-validator.option-visibility.test.ts 55/55 passed; engine-field-predicate-fault.test.ts 19/19 passed; import-kept-option-values.test.ts 7/7 passed; record-validator.kept-option-values.test.ts 6/6 passed; validate-update-stored-row.test.ts 18/18 passed; validate-preview-parent.test.ts 21/21 passed; engine-multi-reference-element-shape.test.ts 29/29 passed |
records-forms.write-answer-advisories-rollback-and-tree-delete — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–N0 | pass | pin: advisory-write-answer.test.ts 21/21 passed; engine-after-hook-abort-unit.test.ts 14/14 passed; engine-cascade-delete.test.ts 25/25 passed; engine-cascade-delete-tree.test.ts 28/28 passed; delete-behavior-referenceless-tree.test.ts 8/8 passed |
records-forms.comment-reactions-and-edit-stamps — pass (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0–A3 | pass | pin: sys-comment-reaction.object.test.ts 8/8 passed; comment-reaction-own-record-floor.test.ts 4/4 passed; comment-edit-stamp.integration.test.ts 10/10 passed; sys-comment-reactions-door.integration.test.ts 2/2 passed; activity-field-redaction.test.ts 19/19 passed |
records-forms.v18-semantic-defaults — partial (Tier 1 pin)
| clause | verdict | evidence |
|---|---|---|
| A0 | pass | pin: field-autonumber-default-unique.test.ts 9/9 passed; view.test.ts 463/463 passed; record-surface.test.ts 15/15 passed |
| A1 | not-run | dom oracle — the pin is server-side; UI half not driven in this Tier 1 pass |
| A2, A3 | not-run | screenshot oracle — the pin is server-side; UI half not driven in this Tier 1 pass |
Reproduction rules
No clause scored fail in this selector. One negative recorded a contract drift that its own text asks to be filed:
records-forms.field-group-visible-when · negative[2] — a faulting field-group visibleWhen renders the section (fail-OPEN) while the spec declares fail-CLOSED
- Boot the canonical showcase. As admin create a writable package (
POST /api/v1/packageswith a manifest) and an object in it with one field group whosevisibleWhenfaults — e.g."record.no_such_field == 'x'"(unknown field) or"record.kind =="(syntax-broken):PUT /api/v1/meta/object/qa_group_gate?package=PKG→ 200 (both shapes accepted at authoring). - Publish, create a record, open its edit form (
/record/ID/edit) and its detail page. - Actual: the group's section (header + members) is SHOWN on both surfaces; the browser console logs
[object-ui] A conditional predicate failed to evaluate (visibleWhen of group 'pro_details' …) and was treated as its safe default (true) … [parse] Unexpected token: EOF. No blank form, no crash (the clause's FAIL shape did not occur). - Declared contract:
packages/spec/src/data/object.zod.tsObjectFieldGroupSchema.visibleWhendescribe — "the whole group (header included) is shown only when TRUE, else hidden (fail-closed)"; ADR-0137's scope note names this slot as carrying its OWN declared fail-closed direction, distinct from the field-rule triad's render fail-open (ADR-0137 D3).
- Disposition: product defect against the declared contract (renderer half in objectui). Extracted at close-out. The negative itself scores pass (no blank/crash); the direction is recorded, not ticked.
Derived item verdicts
11 pass · 19 partial · 14 not-run. The P0 records-forms.crud-roundtrip was hand-driven in full and passed (its pin covers only half of acceptance[6]). Partials are Tier 1 items whose pins (framework vitest or objectui at 4016370a) cover part of the clauses — uncovered clauses are not-run rows above — plus validation-rule-type-matrix (N0 needs an unevaluable rule that stock cannot author).
Checklist-accuracy findings / fixture gaps (for the wave anchor card)
- objectui live specs red against their own same-sha console (4016370a), all stale-spec, none a product defect:
user-filters.spec.ts:22/:43/:128 assert pre-ADR-0053 showcase metadata (status presets moved to named views; six visualizations incl. timeline) and :73 uses acelllocator where the grid exposesgridcell;form-view-subforms.spec.tsandgrid-file-upload.spec.tscollide in strict mode with the sr-only DialogDescription;field-conditional-rules.spec.tsexpects a disabled input where the UI renders read-only text;cascading-options.spec.ts:51expectsmd-form-submiton a flat ModalForm;detail-related-list.spec.tswaits for?recordId=where a row click now opens/record/ID;inline-edit-polish-2572.spec.tsexpects the approval-locked path butmanager_reviewis deliberatelylockRecord: false, and it consumes its fixture (needs a fresh DB). Under the objectui Vite dev server several specs need more than the default 30 s budget (timing, not product). - Pins that exercise none of their item's clauses:
calendar-interactions(geometry via callback only),grid-personalization,lookup-picker-create-new(adjacent, as its ref admits),action-param-widgets' objectui half (action-modal.spec.tshas no params);list-row-action-cel.spec.tsis too weak foraction-location-matrixA3 /conditional-rules-headerA4;record-history-display.spec.tsneeds an app-todo backend and always skips against showcase;concurrent-edit-conflict's occSave unit pin covers client halves only.import-job-undo-cancel's import-console / import-harness specs were not run this sweep. records-forms.list-view-capabilities: its framework refshowcase-search.dogfood.test.tsis search-scoped; no list-view clause is attributable to it.records-forms.crud-roundtrip: acceptance[6]'s cloner-ownership half needs a non-owner cloner (an admin cloning an admin row cannot tell the two apart;showcase_field_zoo+ the contributor member also covers autonumber and formula); negative[2] namesstatusbut the required-no-default field onshowcase_accountisname. objectui observations: History renders the currency diff unformatted (4200000); after a RecordFormPage edit save a direct load lands on/_console/home.records-forms.form-view-gallery: the revert door isDELETE /api/v1/meta/view/NAME(resets the overlay byte-identically); the named variants are served as their own view itemsshowcase_task.{tabbed,wizard,split,quick}.records-forms.field-group-visible-when: authoring accepts a syntactically invalid CELvisibleWhen(record.kind ==) with 200 — no parse-time check on this slot; the grouped section renders above the ungrouped fields; the item cites objectui 1fb1ced36243 as the pin, now 4016370af3c9.records-forms.validation-rule-type-matrix: fixtures callaccount_lifecyclethe state-machine specimen but it binds update only —invalid_initial_statecomes fromproject_status_flowalone; negative[0] needs an unevaluable-CEL rule that stock cannot author (fixture gap).records-forms.picklist-shared-across-objects— planned (not run, not counted).
Hand-off (items without a judged verdict)
- Tier 3 deferred by the 18.0 release-sweep plan (not-run):
upload-guard-blocks-confirm,kanban-drag-persistence,named-import-mapping,saved-view-management,import-transform-matrix,script-action-hook-refusal-toast(all P2). - Tier 1 items whose pin covered no whole clause and that were not hand-driven this run (not-run):
related-list-server-pagination,action-location-matrix,adhoc-filter-sort-builder,calendar-interactions,concurrent-edit-conflict(P1);grid-personalization,lookup-picker-create-new,import-job-undo-cancel(P2). - Partial items' uncovered clauses are listed per item above (
not-runrows).
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 19, 2026
Close-out — extraction (checklist-test SKILL §5). No clause of this record scored FAIL. The one contract drift that
records-forms.field-group-visible-whennegative[2] asks to be filed is extracted below. Partial-coverage gaps (thenot-runrows) and the checklist-accuracy findings / fixture gaps in the body are handed to the wave's anchor card through the dispatch session.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Parked-on: #24579 · this record's checklist-accuracy findings, fixture gaps, partial coverage gaps and not-run handover (wave anchor §2–§4)
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Superseded-by: #24616
Round 2 at ba4afcc re-judged this record's A-class unjudged clauses (26 records-forms items re-judged — 24 partial/not-run items now PASS,
conditional-rules-gridnegative[1] andaction-location-matrixacceptance[2]/negative[2] FAIL (objectui),field-type-matrixstays partial (acceptance[1] blocked by fixture)) and carried every other verdict forward to #24616 (Carried-forward:lines there, valid for 5b14b7f). B-class gaps stay parked on #24579.Generated by Claude Code