Repository navigation
Checklist records forms
github-actions[bot] edited this page Nov 12, 2026
·
1 revision
Generated by
pnpm gen:checklist-statusfromdocs/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 isChecklist-records-forms.
Records, lists, detail pages, forms
51 active · 2 planned
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 |
| 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 |
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) |