Skip to content

Checklist records forms

github-actions[bot] edited this page Nov 12, 2026 · 1 revision

records-forms

Generated by pnpm gen:checklist-status from docs/qa/platform-checklist/areas/*.json. ⛔ Do not edit this page — edits go to the area JSON and this page follows on the next run. This page is Checklist-records-forms.

Records, lists, detail pages, forms

51 active · 2 planned

Planned (2)

The definition requires these capabilities and the platform does not verify them yet. They are skipped by every runner selector and reported as planned — never pass, fail or blocked.

id title priority status personas
records-forms.picklist-shared-across-objects One shared picklist on two objects: both are served the same resolved options, a package extension adds to both, a value outside the set is refused, and a locale switch relabels P2 planned seeded admin (admin@objectos.ai / admin123)
records-forms.master-detail-child-follows-parent-currency A master_detail child's record-mode amount follows its parent's currency: it stores no code of its own, its home amount converts at the parent's code, and the parent's code locks while children hold amounts P2 planned an app author modelling invoice lines in their invoice's currency, a user entering lines on a EUR invoice

Active (51)

id title priority status personas
records-forms.crud-roundtrip Create → read → update → delete a record through the console UI P0 active seeded admin (admin@objectos.ai / admin123)
records-forms.field-type-matrix Field-type matrix: every FieldTypeSchema member renders its widget, accepts a valid value, round-trips over HTTP, and rejects invalid input P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.list-view-capabilities List-view capability matrix: filter, search, sort, pagination, saved views, inline edit, export, visualization switcher, bulk/row actions, conditional formatting P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.view-type-gallery View-type gallery: every ListViewSchema visualization renders seeded records P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.form-view-gallery Form-view gallery: every FormViewSchema layout type renders and submits P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.conditional-rules-header Header-level conditional rules: visibleWhen / requiredWhen / readonlyWhen on invoice fields, enforced on BOTH ends P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.conditional-rules-grid Grid-level conditional rules: row-scoped requiredWhen and parent-scoped readonlyWhen in the inline line-item grid P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.cascading-options Cascading and gated select options: dependsOn + per-option visibleWhen, client narrows / server rejects P1 active seeded admin (admin@objectos.ai / admin123) — the org OWNER: mapMembershipRole maps owner → org_owner, which does not imply org_admin, so the seeded admin is OUTSIDE the restricted-tier gate, an org_admin persona: a member invited with role 'admin' who has ACCEPTED the invitation (accept-invitation is what grants the admin membership, mapped to org_admin on current_user.positions), non-admin user (invite + sign-up as a plain member — the stock auth posture is invite_only; sys_user rows cannot be seeded)
records-forms.master-detail-atomic-save Master + line items save as one atomic batch, with server-side roll-up P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.related-list-server-pagination Related lists derive from the relationship and page on the server — never fetch every child row — and are read-gated on both ends P1 active seeded admin (admin@objectos.ai / admin123), showcase_manager — reads BOTH showcase_account AND showcase_contact (readScope org) — the CHILD-read-entitled persona, showcase_contributor — reads showcase_account but NOT showcase_contact — the CHILD-read-DENIED persona
records-forms.action-param-widgets Action params render their real widgets, and the param contract is enforced at dispatch P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.upload-guard-blocks-confirm Confirm stays disabled while a file param is still uploading; maxSize is enforced by a real oversized attempt P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.import-wizard-encoding-and-hints CSV import: GBK decode, required-field hint, legacy-fallback notice P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.action-location-matrix Action buttons surface at exactly their declared locations — list toolbar, list row, record header/more/related/section — and each dispatches for real P1 active admin
records-forms.validation-rule-type-matrix All six validation-rule types enforce on the write path with their exact per-type error codes — and advisory severities flag without blocking P1 active admin
records-forms.gantt-interactions Gantt is interactive, not a picture: drag persists, locked tasks survive auto-schedule, host veto restores P2 active admin
records-forms.kanban-drag-persistence Kanban card drag across columns persists the group-field change server-side P2 active admin
records-forms.form-dirty-guard Dirty forms guard ACCIDENTAL closes: the X / Escape / backdrop prompt on a dirty form, the footer Cancel discards without a prompt by design, save proceeds, nothing is lost silently P2 active admin
records-forms.named-import-mapping A named import mapping maps foreign CSV headers and re-imports idempotently P2 active admin
records-forms.adhoc-filter-sort-builder User-built FilterBuilder/SortBuilder toolbar merges with the view filter, restores across nav, and reproduces rows from the URL P1 active seeded admin (admin@objectos.ai / admin123), a second account signed up on the same browser (for the user-scoping probe — sys_user rows come from sign-up)
records-forms.calendar-interactions Calendar is interactive: drag reschedules via PATCH, a failing PATCH reverts with an error, mode switches re-render, empty-day click quick-creates P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.concurrent-edit-conflict Concurrent edits collide loudly (OCC 409 + conflict dialog), never silent last-write-wins; inline two-surface edit is ONE atomic OCC-guarded save P1 active seeded admin (admin@objectos.ai / admin123) in TWO independent browser sessions (distinct auth cookies), 'A' and 'B'
records-forms.record-discussion-mentions Record discussion: an @mention comment reconciles optimistically, persists to sys_comment, interleaves with activity, pings the mentioned user's bell — and the feed filter shows exactly each mode's subset without dropping author-extended activity P1 active seeded admin (admin@objectos.ai / admin123) — the comment author, a second user, minted by the admin with POST /api/v1/auth/admin/create-user — the @mention TARGET. The target must hold a permission set that grants read on sys_comment as well as being able to read the record: the producer gate admits a mentioned user only when both reads succeed, so a target with no comment read is withheld (cannot_read_thread) and every bell clause scores against the wrong persona. A stock showcase boot is invite_only, so a fresh POST /api/v1/auth/sign-up/email answers 403 SELF_REGISTRATION_CLOSED (steps[13]; RUNNER.md, 'A stock showcase boot refuses self-registration')
records-forms.grid-personalization Grid personalization persists across reload: column resize/reorder/pin, row-height, group-by (with API-true totals), row-color P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.saved-view-management Admin saved-view lifecycle: create kanban via dialog (staged as a per-item draft, live only after Publish), rename/set-default/pin/delete each hit the meta overlay and survive reload; non-admin affordances absent and server-refused P2 active seeded admin (admin@objectos.ai / admin123), a non-admin user (e.g. bound to showcase_member_default) — sign one up; sys_user rows cannot be seeded
records-forms.bulk-select-all-matching Select-all-matching covers every matching id across pages (server total, not the rendered page); clear resets both selection sources P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.lookup-picker-create-new Lookup picker quick-create: a user-facing zero-hit lookup opens the referenced create form and adopts the new id; system references offer no quick-create P2 active seeded admin (admin@objectos.ai / admin123) — holds create on the referenced object
records-forms.record-edit-undo Record edit undo: toast Undo / Ctrl+Z restores the prior value through the API and logs a revert; undo after a concurrent change must not silently clobber P2 active seeded admin (admin@objectos.ai / admin123), a second session (for the concurrent-clobber probe)
records-forms.import-job-undo-cancel Async import job: terminal state + per-row results, undo removes exactly the imported rows, cancel mid-job leaves a coherent partial P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.object-hook-lifecycle Object lifecycle hooks fire on the write path with the right timing, gate, async and error semantics — driven over /api/v1/data/*, oracled by the record effect and the log line P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.field-type-constraints Per-type CONSTRAINT enforcement on the write path (not just widget render): length/range/option/reference/computed limits, and where the platform deliberately does NOT enforce P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.cascading-multilevel-and-clear Cascade clear-semantics and the server boundary: stale-child clear on parent change, the WRITTEN-value server gate, and where cascade scope is client-only P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.encrypted-field-behavior Secret/encrypted field: ciphertext at rest, masked on every read, no-op mask re-submit, and fail-CLOSED without an ICryptoProvider (ADR-0100) P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.field-group-visible-when fieldGroups[].visibleWhen section predicate: both spellings accepted, the parse normalizes to the envelope, retired visibleOn refused with the located prescription, derivation carries it verbatim — the console gates the section on the form AND the detail page (objectui#11630 fixed) P1 active seeded admin (admin@objectos.ai / admin123) — holds manage_metadata for the scratch-object PUT
records-forms.field-unique-enforcement Field-level unique on the write path: colliding writes refused 409 UNIQUE_VIOLATION on both driver families, NULL-distinct, organization-scoped by default, whole-batch refusal, autonumber resync converges P1 active seeded admin (admin@objectos.ai / admin123) — holds manage_metadata for the scratch-object PUT
records-forms.delete-behavior-matrix deleteBehavior matrix: set_null clears / member-removes, master_detail cascades, restrict answers 409 DELETE_RESTRICTED with the cascade remedy, required-FK set_null escalates to restrict P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.record-clone-contract Clone contract edges: enable.clone gate both ways (403 CLONE_DISABLED), overrides win but cannot forge readonly, bare-201 body per CloneDataResponseSchema, internal fields stripped from the response P2 active seeded admin (admin@objectos.ai / admin123) — holds manage_metadata for the scratch-object PUT
records-forms.field-history-tracking Per-field trackHistory: a tracked edit lands the ADR-0052 §5b old→new timeline summary with display values, an untracked edit does not, and object-level enable.trackHistory gates the record page's sys_audit_log field-change read and derived history op both ways P1 active seeded admin (admin@objectos.ai / admin123)
records-forms.import-transform-matrix Import mapping TransformType matrix: each of the 7 declared transforms does exactly its documented conversion, javascript is refused loudly at the door (no sandbox), format mismatch is a named 400 P2 active seeded admin (admin@objectos.ai / admin123) — holds manage_metadata for scratch mapping PUTs
records-forms.predicate-relationship-traversal A validation rule reads a parent field one hop through a lookup P1 active seeded admin (admin@objectos.ai / admin123), a member with create/edit on a child object and NO read on its lookup parent — who may not name that parent at all: a non-system write may name, in a lookup, only a record the caller's own read door returns. ⚠ No stock showcase persona is one (fixtures.knownGaps): acceptance[3] is scored on a scratch pair
records-forms.script-action-hook-refusal-toast A script action whose server-side hook refuses the write with a user-facing sentence answers a 4xx, the console shows exactly one error toast carrying that sentence, and the record is left unchanged P2 active seeded admin (admin@objectos.ai / admin123)
records-forms.write-time-option-and-element-shape-judgement Write-time value judgement on v18: picking an option whose stored visibleWhen cannot be evaluated is refused (reason unevaluable), an import with createMissingOptions keeps an unmatched select value while a later PATCH sending it back is refused, an import dry run admits exactly what the write admits, and a malformed element in a multi-valued lookup is refused with its index P2 active seeded admin (admin@objectos.ai / admin123) — the Default Organization owner and platform admin on a fresh boot
records-forms.write-answer-advisories-rollback-and-tree-delete Write semantics changed on v18: a warning-severity validation hit comes back in the 2xx write answer as warnings[], a blocking after* hook abort rolls the whole write back, a tree field (with or without an explicit reference) honours its deleteBehavior, and a cascade delete is distinguishable to the child hook P1 active seeded admin (admin@objectos.ai / admin123) — the Default Organization owner and platform admin on a fresh boot
records-forms.comment-reactions-and-edit-stamps Discussion on v18: reactions are their own records (sys_comment_reaction — 201 with user_id forced, duplicate 409, unreadable comment 403, no update, no deleting another member's), the retired sys_comment.reactions column is refused, a comment edit is platform-stamped, and milestone activity is withheld whole from a reader missing a watched field P2 active seeded admin (admin@objectos.ai / admin123) — the Default Organization owner and platform admin on a fresh boot, org member — created by the admin with POST /api/v1/auth/admin/create-user (stock showcase self-registration is closed: audience posture invite_only answers sign-up 403 SELF_REGISTRATION_CLOSED); joins the Default Organization as member, not platform admin, and lands mustChangePassword:true, i.e. a HELD session until it changes its password (POST /api/v1/auth/change-password)
records-forms.v18-semantic-defaults Defaults that changed meaning on v18 (ADR-0087 D3 18.* entries): an omitted list-view page size is 50 (was 25), an omitted editInline means editable in place, an autonumber with no unique is unique per organization, and a field-heavy form opens as a bounded modal on desktop P2 active seeded admin (admin@objectos.ai / admin123) — the Default Organization owner and platform admin on a fresh boot, org member — created by the admin with POST /api/v1/auth/admin/create-user (stock showcase self-registration is closed: audience posture invite_only answers sign-up 403 SELF_REGISTRATION_CLOSED); joins the Default Organization as member, not platform admin, and lands mustChangePassword:true, i.e. a HELD session until it changes its password (POST /api/v1/auth/change-password). Neither stock demo persona is an updater on showcase_task: the updater is a member bound to the showcase_contributor position (allowEdit on showcase_task), whose task RLS (task_own_rows) shows only tasks assigned to it — so assign it some tasks first (admin PATCH assignee), QA runs #24558 / #24616
records-forms.multi-currency-invoice A multi-currency invoice stores its home-currency amount at the rate in force on its document date, refuses a date no rate covers, and keeps a currency-less amount blank P2 active seeded admin (admin@objectos.ai / admin123) — the Default Organization owner; the only persona that may read Setup → Exchange Rates
records-forms.delete-toast-undo-restore Undo a business-record delete from its toast: the confirm asks without promising permanence, the toast offers Undo, and Undo restores the record through the recycle bin, while a platform-object delete keeps "cannot be undone" P1 active seeded admin (admin@objectos.ai / admin123): every step
records-forms.setup-recycle-bin-page Setup → Recycle bin lists the objects whose bin the caller manages, shows each deleted record with who deleted it and until when it is kept, restores one, and empties an object's bin after a confirm P2 active seeded admin (admin@objectos.ai / admin123): every step
records-forms.home-amount-preview-states The edit form's home-amount preview says what will be stored before save: the converted amount, the home-currency line, a missing document date, a date no rate covers, and a rate the user may not read P2 active seeded admin (admin@objectos.ai / admin123): the converted, home-currency, awaiting-date and awaiting-rate states, a contributor-bound member (the search:qa-contributor-bound-member recipe): the unreadable-rate state, on an invoice of their own
records-forms.action-preflight-panel An action's param dialog runs its declared preflight read: the panel moves from loading to ready with the declared fields, a seeded param is drawn read-only from the answer and submitted as it, and a failed read draws the error panel, leaves the seed empty and holds Confirm P1 active seeded admin (admin@objectos.ai / admin123), signed in through the form
records-forms.list-link-filter-refused-whole A list link whose filter names a field the reader cannot filter on is refused whole: the list opens on the view's own filter, the address bar loses uf__filter, and one notice says why P2 active seeded admin (admin@objectos.ai / admin123), signed in through the form

Other (1)

Neither a verified capability nor a declared gap — counted in neither column above.

id title priority status personas
records-forms.picklist-org-append An organization appends a value to a shared picklist without changing the app source: that organization can write it, and another organization is refused P2 retired an admin of organization A (appends the value, then writes it), a member of organization B (the same app and picklist, without A's value)

Clone this wiki locally