Repository navigation
QA run · surface:browser (65/65) · 36b2889c · 2026-10-12 · 50 PASS / 2 PARTIAL / 12 FAIL / 1 BLOCKED / 0 NOT-RUN #23163
Description
Half 2 of #23104, browser selector. The maintainer's order, verbatim: 「objectui pin 更新到最新版,并使用浏览器对前端界面进行完整的测试」. Every runnable surface:browser item was driven in a real browser against objectstack 36b2889c with the console built from the new objectui pin 1fb1ced36243 (a local stand-in for PR #23110's head, explained below). The surface:mixed record for the same subject is filed separately, and this record's closeout comment links it. Text only: screenshots were consulted live as oracles and are not attached. The durable truth stays in docs/qa/platform-checklist/areas/.
Environment fingerprint
- Framework (subject):
objectstack-ai/objectstack36b2889cddc5e38acf7f85b8e186b02e6ef786c6(test(plugin-security): retire the declared-permission seeder suites (#22897)), in the detached worktree/home/user/objectstack-qa-23104, framework and console built. - Console:
.objectui-shaset LOCALLY to1fb1ced36243c325acc801bdde26bd096a15f5f5, withsdui.manifest.jsonandscripts/sdui-manifest.record.jsonregenerated from the built objectui tree at that pin (sha256f545b851c4bb…, byte-identical to PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110's). The console dist stamp equals the pin, both inpackages/console/dist/.objectui-shaand as served byGET /_console/.objectui-sha. Console source questions were read at that revision. - Why this tree stands in for the pin PR: it differs from PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110's head
043b81d13only in pin-citation strings inside spec descriptions, the sdui-parser lockstep JSON, two changesets and one docs reference page. Runtime code and console bundle are identical. PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110 has since landed onmainasf451a5964, and the first full-batterymainrun carrying it (CI push run38332364381atbcebd8409) passed,Console Pin Gateincluded. - Checklist: items,
RUNNER.mdandscripts/checklist-select.mjscome from the subject tree. Every item's revision is in the table and matches the selector's output. - App / boots:
examples/app-showcasebooted withobjectstack dev --ui --seed-admin -p PORT -d file:/tmp/qa-23104/LANE/ITEM.db, withOS_PORTexported and a per-bootOS_HOMEandOS_STORAGE_LOCAL_ROOT. Lanes A / B / C used the disjoint port ranges 44100–44399 / 44400–44699 / 44700–44999. Browser: Playwright on/opt/pw-browsers/chromium, one context per item. Adminadmin@objectos.aicame from--seed-admin. Other personas were minted per item (invite + sign-up, oradmin/create-user+change-password), and identity was proven withGET /api/v1/auth/get-sessionbefore each persona cell. - Execution: three parallel runner subagents (lanes A, B, C) in Claude Code session
session_016JB93R2KcQP4GgKaUnseVF, dispatched by the PM seatdomain:devx#2, from about 23:30Z on 2026-10-12 (lane C from 23:42Z). A container restart around 02:30Z killed all three mid-run. Each lane resumed from its own surviving results file at 02:33–02:34Z: judged items were kept byte-identical, and the not-run items (A 16, B 12, C 11) were re-run from scratch on fresh-r2state (DB,OS_HOME, storage root). The lanes finished on 2026-10-13 (C 03:32Z, B 03:57Z, A 04:28Z). Concurrency stayed at three lanes. Tier-1 pins that live in this repository ran batched underscripts/pm/os-verify-lock.sh(--maxWorkers=2) and are cited. Items whoseautomated.reflives only in objectui were driven by hand, and objectui pins were run from an objectui checkout at the pin where the lane could. - RUNNER rule 7: the one P0 fail (
platform-core.builtin-apps-nav-renderA2) was re-derived independently by the PM seat from objectui source at the pin before it was filed (console: a member opening an app they may not access at its package-id URL gets "This app can't be opened" instead of the access-denied screen — the access probe asks the by-name route with the package id and reads its 404 as not found objectui#12285). - Hop regression: none. No fail's cause lies inside the hop's 11 objectui commits (
7578323a544e..1fb1ced36243). Every fail clause recordshop_suspect: false, and the console-side fails inconditional-rules-grid,calendar-interactions,concurrent-edit-conflictandconsole-installability-indicatorscarry an explicit hop-rangegit logover the implicated files that returned empty. - Deviations, stated:
- CRM manifest in the shared tree for 25 s. Lane B's first marketplace boot-B attempt ran from the tree. Its inline
install-localPOST wroteexamples/app-showcase/.objectstack/installed-packages/com.example.crm.jsoninto the shared tree from 03:44:53 to 03:45:18Z.install-localcaches relative to the working directory and is not redirected byOS_HOMEorOS_STORAGE_LOCAL_ROOT. The package was removed throughDELETE /api/v1/marketplace/install-local/com.example.crm, the empty directory was removed, andgit statuswas unchanged afterwards. Lane A confirmed that no boot of its started in that window. Its two boots running across it scored no clause on the app list, and its next boot served onlyshowcase_app, setup, account. Boot B was re-run from a scratch copy. - Declared shared boots. Lane B ran many items on S1 (read-only/platform, 44401) and S2 (identity/access, 44402). Lane C's
studio1boot hosted three studio items.lifecycle-retention-sweepandinterrupted-migration-boot-reportshared one DB and boot sequence. Each item records which boot it used. - Scratch copies, never the tree. Pinned Playwright smoke suites (
nav-surfaces-renderA0,view-type-galleryA5) ran from byte-identical scratch copies so their state stays out of the read-only tree. Scratch showcase copies under/tmp/qa-23104/carried app-level fixtures: palette visibility leaves, capability probes, walled-posture boots, the picklist fixture, marketplace boot B and job fixtures. - Non-default boots, per item:
OS_LOG_LEVEL=info,OS_LOCALIZATION_TIMEZONE/OS_MAIL_SMTP_PASSWORD,OS_TENANCY_POSTURE=group|isolated,OS_PAGE_REACT=off,OS_CLOUD_URL=off, the scheduled-work boot, a local OIDC provider fixture, and a scratch PostgreSQL 16 on 127.0.0.1:44790. - Resume mechanics. The dead run's partial screenshots were moved aside and are not cited. Resumed lane-C boots use the
http://localhostorigin, because127.0.0.1answers 403INVALID_ORIGINon sign-in. Nativeconfirm()dialogs were accepted explicitly throughpage.on('dialog'). Pins touched by the restart were re-run fresh under the lock. - Time split (environment vs test driving, minutes, the lanes' estimates): A 17 / 103 (resumed portion only), B ≈38 / 220, C ≈34 / 190.
- CRM manifest in the shared tree for 25 s. Lane B's first marketplace boot-B attempt ran from the tree. Its inline
Scope
node scripts/checklist-select.mjs surface:browser --json on the subject tree returned 65 runnable items. It hid no item as blocked and printed no planned item. All 65 received a verdict. Lane split: A 34, B 16, C 15. Clause ids are the lanes' own labels, which the extracted cards cite.
| item | rev | verdict | evidence (server truth / browser / pin) |
|---|---|---|---|
| access-security.share-link-landing-page | 1 | PASS | five links minted by the liaison (201); password leg 401 NEEDS_PASSWORD then WRONG_PASSWORD then the record; revoked / expired 410 and invalid states each render their own screen; signed_in audience renders a dedicated "Sign in required" state (401 SIGN_IN_REQUIRED), member 200; standalone layout, no login redirect |
| ai.console-ai-surface-gating | 3 | PARTIAL | C1b blocked(environment: no agent-serving catalog on the open framework); agent-less boot: no FAB / dock / AI entry, /ai falls back to Home with no chat frame, no "AI Approvals" advertised, bare route 501 named; C5 (authored expected-fail K2) holds the honest contract: one 501 read, no re-arm, no empty state under the alert |
| api-backend.api-console-discovery-execute | 1 | PASS | tree groups equal the usable /discovery services (no AI / UI / Realtime / Search group); List showcase_task 200 equals a direct GET; 404 RECORD_NOT_FOUND and 400 VALIDATION_FAILED shown verbatim from the wire; reached by deep link (step-1 nav note) |
| approvals.account-app-entry | 2 | PASS | dist stamp = pin, bundle carries the approvals:inbox contribution; a non-admin reaches the inbox from Account (Setup not served to them); drawer approve round-trips; cold deep link opens the drawer; record link keeps the app segment; zh-CN labels hold |
| approvals.inbox-keyboard-flow | 1 | PASS | j / k move the ring; r / a open one alertdialog and send exactly one POST on confirm; inert in search, with a dialog open and on the decision-outputs row; drawer arrows walk requests; decisions land on the focused row's request (API read) |
| approvals.inbox-metadata-actions | 4 | PASS | rendered action sets equal the served visibility predicates for a non-override approver (Ada), the override admin and the submitter; drawer approve and remind round-trip; exactly one new /actions row per action naming actor and kind |
| approvals.notification-deep-link | 5 | PASS | remind is submitter-only (403 for the admin), so the opening path was used; two cold loads of /system/approvals?request=ID open the drawer with fields equal to the API; the account-inbox route opens the same drawer; unknown ids 404 REQUEST_NOT_FOUND with the named toast |
| approvals.pending-count-surfaces | 1 | PASS | bell "9+", popover breakdown 12 = 1 + 11 unclamped, Home card and My Pending tab equal the console's own pending query; Home card routes to the inbox for admin and Ada |
| approvals.per-group-signoff | 6 | PASS | per_group manager / finance tallies equal the API at every stage; the run stays paused until the last group decides; two approve rows with distinct actors; forged actorId and a non-holder refused 403 |
| approvals.quorum-m-of-n | 4 | PASS | scored on the runtime fixture (#21845): 2-of-3 met by Ada + Lena, a reject closes the request, tally line equals decision_progress, the remaining holder drops off; repeat and non-holder decisions 403; the stock clamp recorded as contrast only |
| approvals.record-page-decisions | 1 | PASS | Approve / Reject lead the record header; one dialog and exactly one POST on confirm; status and /actions re-read; lockRecord gates inline edit (editable under manager_review, locked under exec_review); no decision buttons when nothing is pending |
| approvals.setup-nav-entry | 1 | PASS | served group_approvals order equals the sidebar; Approvals Inbox lands on the inbox component; zh-CN labels 审批中心 / 审批申请 / 审批历史 / 审批委派(外出) |
| approvals.viewer-gating-submitter-side | 6 | PASS | submitter sees only remind / recall / comment; can_act=false; forged approve 403 in both shapes; request and /actions byte-identical before and after |
| attachments-storage.inline-grid-receipt-cells | 3 | PASS | one Receipt column, one file input per row and no text input; presigned, PUT, complete; the batch stores the bare file id; sys_file committed with ref_object / ref_id / ref_field (objectui-pinned, driven by hand) |
| automation.screen-flow-roundtrip | 3 | PASS | the row action launches through POST /actions (paused at collect); /screen serves the contract and the dialog renders it; resume completes and the task reads the new assignee; empty-inputs resume 400 stays paused; Cancel sends nothing, run stays resumable |
| automation.setup-packaged-automation-board | 2 | PASS | served nav entry; 30 rows = 30 packaged flows; toggle persists to sys_metadata_activation across reload; 409 subflow refusal and 400 clone validation rendered verbatim; one Clone per row; A7 member posture recorded (see accuracy list) |
| dashboards.chart-first-paint | 2 | PASS | cold load at 1440×900 draws KPI tiles and bars with axes on Chart Gallery and Delivery Operations; 5 bars = 5 statuses; hero tiles equal direct reads; every dataset query 200 |
| dashboards.chart-type-matrix | 4 | PASS | 20 ChartType variants each judged against the data API (marks = buckets); combo with two axes; treemap / sankey / scatter distinct; single-value family; pivot cells match; compareTo renders "vs previous period"; coverage and dashboard-compareto pins green |
| dashboards.drill-through-range | 2 | PASS | month, status and matrix-cell drills send their own bounds; drawer counts equal API replays (2 / 4 / 6 / 2), each below the unfiltered 10; the drawer heading names the bucket |
| dashboards.global-filters-rescope | 3 | PASS | region and custom range re-query every bound widget on its own field; the opted-out widget never re-queries; tiles equal direct dataset queries; the composing tile shows the intersection; D1 Reset, D2 field override, D3 static and optionsFrom options pass (D2 / D3 on scratch dashboards) |
| i18n.notification-localized-and-clears | 3 | PASS | interpolated title in the zh recipient's inbox; the click opens a zh record page; POST /notifications/read 200 clears unread server-side and survives reload; EN-session control reads English |
| i18n.studio-follows-app-locale | 4 | PASS | the avatar-menu switch writes sys_user.locale zh-CN; Studio chrome, lock banner and relative dates (6天前) follow; no dotted keys; survives reload; switching back restores English |
| i18n.surface-matrix | 6 | FAIL | A5 toast half: the only zh successMessage specimens post to /api/v1/showcase/recalc, which answers 500 (no principal); product defect, same root as #23128; A0–A4, A6–A10 pass (labels, options, headers, locale envelopes, empty unknown locale, tenant flip) |
| identity-auth.phone-signin-surfaces | 3 | PASS | seeded phone user readable; the create-user dialog carries phoneNumber and the list shows it; the phone param appears only where features.phoneNumber is true |
| identity-auth.sso-enforced-first-paint | 2 | PASS | the enforced boot never paints a password input (3 cold loads, MutationObserver 0); SSO-only surface with "Use a password instead"; a hung sign-in re-enables after the 20 s watchdog; the unenforced boot paints the form first |
| integration-system.flow-connector-picker | 3 | PASS | picker lists exactly the 5 served connectors with origin tags; the MCP action and its input render from the descriptor |
| platform-core.builtin-apps-nav-render | 5 | FAIL | A2: a member at the canonical Setup URL gets "This app can't be opened" instead of the access-denied screen (the probe asks the by-name route with the package id, 404); product defect, objectstack-ai/objectui#12285; A0 Setup 45/45 + Account 8/8 walked; A1, A3–A6 pass; the server refusal (403) holds |
| platform-core.console-installability-indicators | 1 | FAIL | C2: the connection chip shows nothing during a mid-session backend outage (2 fresh reproductions + an emulated failure); product defect, objectstack-ai/objectui#12295; C0 manifest from runtime branding, C1 Offline pill, C3 no service worker pass |
| platform-core.console-login | 4 | PASS | form sign-in lands /home with both auth halves; reload stays authed; server sign-out gives 401 on bearer and cookie; the console returns to login with the redirect param; re-login lands back; wrong password 401 sets nothing |
| platform-core.docs-portal-render | 2 | PASS | index lists the served books; cross-references resolve inside the reader; the app-scoped tree equals the package's docs; the member reaches docs through the Help menu with a tree equal to the member API; 0 pageerror |
| platform-core.home-admin-cluster-links | 2 | FAIL | A2: legacy system/roles, positions, permissions land on the Setup metadata catalog, not the object routes the clause pins (objectui#7611); stale spec, #23121; A0, A1, A3 pass |
| platform-core.keyboard-shortcut-surface | 2 | FAIL | C2 / C3: expected-fail probes K1a / K1b whose defects are gone (the dialog advertises only wired shortcuts, objectui#11674); stale spec, #23121; C0, C1 pass; C4 blocked(environment) as prescribed |
| platform-core.marketplace-console-honesty | 3 | PASS | the offline boot carries Installed Apps but not Browse; the Disabled card on the offline boot; a local install is listed under Installed Apps (scratch copy); the member gets the admin-only card; no destructive frame across reloads |
| platform-core.nav-surfaces-render | 6 | PASS | showcase-smoke 49/49; 49 served nav leaves = SURFACES both ways; an unknown object renders a named not-found in the live shell; no ErrorBoundary fallback |
| platform-core.shell-nav-personalization | 2 | PASS | collapse persists; pins under "Favorites" survive reload in ui.favorites; keyboard and pointer reorder of pinned items; object favorites; Recent group of 5; breadcrumb crumbs are switcher menus; authored links not sortable |
| platform-core.theme-mode-persistence | 1 | PASS | dark / light apply synchronously and persist (key object-ui-theme); system follows the emulated preference on reload; the dark surface is coherent |
| platform-core.url-overlay-contract | 1 | PASS | drawer / form / tab overlays push and pop history; deep tab links; the formLink pre-link survives a cold load; breadcrumb trail; object-mismatch refusal (objectui-only pins, driven by hand) |
| records-forms.action-location-matrix | 9 | FAIL | A2: the api leg answers 500 (POST /api/v1/showcase/recalc refused as a principal-less write); product defect, #23128; flow / modal / script / form / url legs round-trip; A0, A1, A3 pass; A4 blocked(fixture: runtime-authored actions are not served) |
| records-forms.adhoc-filter-sort-builder | 2 | PASS | toolbar filter ANDs with the view filter; sort round-trips; filters restored per user (the key carries the user id); uf_ params deep-link in a fresh context |
| records-forms.bulk-select-all-matching | 2 | PASS | on the re-pointed fixture (55 scratch tasks): select-all-matching fans out to 55 ids; one aggregate POST with 55 ids; Clear resets; HARD_CAP 5000 read from source and pin (the live set stays below it) |
| records-forms.calendar-interactions | 2 | FAIL | A3: empty-day quick-create is a dead end on showcase_task (required lookup Project, no input, 400); product defect, objectstack-ai/objectui#12291; A0 drag persists, A1 a 404 snaps back with a toast, A2 views match the API |
| records-forms.conditional-rules-grid | 3 | FAIL | A4: saving one edited line rewrites the stored position of an untouched sibling (stock INV-1001); product defect, objectstack-ai/objectui#12286; A0–A3 pass |
| records-forms.crud-roundtrip | 9 | PASS | create / edit / delete each one write with exact before-after diffs; reload agrees; History shows labels and the real actor; CJK round-trip and search; clone re-derives ids and owner; contributor gates hold |
| records-forms.form-dirty-guard | 2 | PASS | dirty X / Escape prompt; a clean form closes with no guard; Discard leaves the row byte-identical; discardGuard pin 14/14 (run from the objectui repo root) |
| records-forms.form-view-gallery | 2 | PASS | simple / tabbed / wizard overlays render on the page route; the wizard blocks on required fields with 0 writes; the conditional notes field mounts; each save's diff is exact; tab and step switches keep input |
| records-forms.gantt-interactions | 3 | PARTIAL | A2-leaf blocked(fixture: no lockField on the stock view, no pin reaches a locked leaf); bar drag persists; scheduling pins 38/38; a 404 snaps back with a toast |
| records-forms.grid-personalization | 3 | PASS | column resize persists (grid-columns-showcase_task); density survives reload through the view overlay; group headers equal the API; rowColor paints by priority |
| records-forms.import-wizard-encoding-and-hints | 5 | PASS | a GBK CSV decodes in the wizard (pin + live); the missing-required hint names label (name) and disables Next; legacy reference-guard pin; server import 2/2 |
| records-forms.kanban-drag-persistence | 1 | PASS | a drop sends PATCH and survives reload; an illegal transition 400 invalid_transition snaps back with a toast |
| records-forms.list-view-capabilities | 1 | PASS | 11 variants each with its own request; server paging 57/57 distinct; quick search; sort; inline edit one-key PATCH; export through a runtime allowExport grant (export is opt-in); view switcher; bulk per-record and aggregate dispatch |
| records-forms.lookup-picker-create-new | 2 | PASS | create-new from the picker; the parent carries the child id; debounced server search scoped to the target; no create on the sys_user lookups |
| records-forms.master-detail-atomic-save | 3 | PASS | one atomic batch with $ref; the server roll-up equals the line sum across add / remove; an invalid line aborts the whole batch; read-only live amount |
| records-forms.record-discussion-mentions | 3 | PASS | optimistic comment keeps the client id; feed order; a mention notifies only the mentioned user; FEEDS_DISABLED 403 on create and re-thread; filter modes; milestone activity |
| records-forms.record-edit-undo | 2 | BLOCKED | A0–A3 blocked(fixture): at this pin Undo is pushed only for actions declaring undoable, the showcase declares none, and a runtime-authored undoable action is not served |
| records-forms.related-list-server-pagination | 4 | PASS | server paging (top 5 / skip), 26/26 distinct = API total; relatedList title and columns honoured; drill to the child; contributor / manager read gate both sides |
| records-forms.saved-view-management | 1 | PASS | create (draft, then Publish), rename, default, pin and delete persist; the member sees no controls and its forged PUT / DELETE answer 403 |
| records-forms.script-action-hook-refusal-toast | 1 | PASS | the hook's 400 sentence in exactly one error toast (2 loads); the one POST; record unchanged |
| records-forms.upload-guard-blocks-confirm | 2 | PASS | Confirm disabled while the PUT is held; the dispatch carries the sys_file id; over-size files refused before the wire; a recovery upload succeeds |
| records-forms.view-type-gallery | 1 | PASS | 9 view types each render their own visualization; kanban column counts and estimate sums equal the API; calendar / timeline / gantt dates match; 10 map markers; org chart; smoke 49/49 |
| search.command-palette-navigation | 2 | PASS | empty-query corpus; each type navigates and closes the palette; the theme command applies (the palette stays open, see observations); Switch App equals the served apps; visibility predicate honoured (scratch copy); full search page |
| studio-authoring.packaged-automation-studio-lock | 1 | PASS | read-only package: no New, the switch disabled with a reason title, a forced click sends nothing, inspector inputs disabled, forged writes 403, flow byte-identical |
| studio-authoring.packaged-display-class-direct-edit | 1 | FAIL | A3 / N1: resetting a published view overlay answers 200 reset:true, but the view list reads and the end-user list keep serving the overlay until restart; product defect, #23149; A0–A2, A4, N0, N2 pass (the dashboard leg resets clean) |
| ux-conventions.disabled-control-reason | 1 | FAIL | A0 / A1 / A2: Studio's read-only Field properties controls are disabled with no reason and no keyboard path; Studio Publish and import Next carry reasons a keyboard cannot reach; product defect, objectstack-ai/objectui#12303; the Archive pattern passes |
| ux-conventions.labels-over-machine-names | 1 | FAIL | A0 / A2: the Studio permission-set list and Changes panel show machine names, and the lookup Display-field picker puts the API name first (objectstack-ai/objectui#11862, existing, commented); A1: Explain's Principal-resolution prose names the user by raw id (#23157); A3 pass |
| ux-conventions.write-feedback | 1 | FAIL | A0: inline-edit Save All and Studio Discard draft give no feedback (objectstack-ai/objectui#12303); A1: the drawer Approve toasts a bare "Approved." (#23157); A2–A4 pass (10 of 12 variants give feedback); A5 blocked(fixture: no stock Undo) |
Totals: 50 PASS / 2 PARTIAL / 12 FAIL / 1 BLOCKED / 0 NOT-RUN.
- 10 fails carry a product defect.
- Seven items carry a console defect: console: a member opening an app they may not access at its package-id URL gets "This app can't be opened" instead of the access-denied screen — the access probe asks the by-name route with the package id and reads its 404 as not found objectui#12285, plugin-form: saving a master-detail grid rewrites the stored position of untouched sibling lines — the child read carries no sort by the derived sort field, and the grid stamps every row's index into it on any change objectui#12286, plugin-calendar: quick-create from an empty day is a dead end on an object with a required lookup — the dialog offers only Title, auto-fills required select/boolean/number fields but no lookup, and the create answers 400 "Project is required" objectui#12291, console: the header connection chip never shows a mid-session outage — after the first successful connect no failed request moves the adapter's connection state, so a stopped backend leaves stale data on screen with no indicator objectui#12295, console UX conventions (family card): inline-edit Save All and Studio Discard draft give no feedback, and Studio's read-only Field properties controls are disabled with no reason and no keyboard path to one objectui#12303, and the existing studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862.
- Three carry a framework or showcase defect only: showcase: the "Recalculate Estimate" / "Recalculate Selection" api actions answer 500 — recalc-endpoint.ts calls ctx.ql.update with no execution context, which the security layer refuses as a principal-less write #23128 (two items) and metadata: resetting a published overlay on a packaged view answers reset:true, but the view LIST reads and the end-user list keep serving the overlay's expanded view items until restart #23149.
i18n.surface-matrixA5 shares the root ofaction-location-matrixA2 and was commented onto showcase: the "Recalculate Estimate" / "Recalculate Selection" api actions answer 500 — recalc-endpoint.ts calls ctx.ql.update with no execution context, which the security layer refuses as a principal-less write #23128. write-feedbackA1 andlabels-over-machine-namesA1 add a framework-string defect, server-authored UI text (family card): the approvals drawer's Approve says only "Approved.", and Explain access's Principal resolution prose names the user by raw id #23157.
- 2 fail on checklist clauses only (stale spec):
home-admin-cluster-linksA2 andkeyboard-shortcut-surfaceC2 / C3. Both are rows on the family card platform-checklist: items whose clauses pin shapes the product has since ruled away — found by the browser pass at objectui 1fb1ced36243; re-point or re-word each (family card) #23121. - No hop regression (see the fingerprint). No authorization finding arose on this selector.
Fails — reproduction rules and dispositions
Product defects
platform-core.builtin-apps-nav-render · A2 (P0 item): product defect, objectstack-ai/objectui#12285.
- Boot the stock showcase. Sign in through the form as the member
phone.demo@example.com/showcase123(get-session 200, positions org_member, everyone). - Open
/_console/apps/com.objectstack.setup, the package-id segment the admin's own Setup links use. - Network:
GET /api/v1/meta/app200 (setup absent), thenGET /api/v1/meta/app/com.objectstack.setup→ 404 RESOURCE_NOT_FOUND.
- Expected:
[data-testid=app-access-denied]"You don't have access to this app" (AppContent.tsxaccessVerdict==='denied', objectui#4252 / meta apps by-name route: answer an explicit permission-denied envelope for an unauthorized session, instead of being indistinguishable from "not published" (backend half of objectui#4252) #8013). - Actual:
[data-testid=app-not-found]"This app can't be opened — The server did not return this app for your account". Seen on 2 fresh contexts. - Control: a member-bearer
GET /api/v1/meta/app/setup→ 403 PERMISSION_DENIED. The by-name route keys on the app NAME, while the console probes with the ADR-0048 package-id segment (AppContent.tsxprobe.call(dataSource, appName)). The denied branch is therefore unreachable from every canonical app URL. No Setup content leaks and the page is never blank.
platform-core.console-installability-indicators · C2: product defect, objectstack-ai/objectui#12295.
- As admin on an app surface, "Connected" appears at 842 ms and is gone by 2874 ms (this half holds).
- Stop the backend mid-session by killing the server's process group.
- Poll the page every 0.5 s for 20 s for
Connected|Reconnecting|Disconnected|Connection error|Offline|Failed|Error.
- Expected: a reconnecting or error chip that stays prominent while the backend is down.
- Actual: no chip at all. The Tasks grid shows stale data while background GETs fail with
net::ERR_CONNECTION_REFUSED. Seen on 2 full stop/restart reproductions plus one emulated failure (Playwright aborting the api routes). - Self-check: the same poller sees "Connected" on load and "Offline" under
setOffline. - Mechanism:
AppHeader.tsx:702renders ConnectionStatus from the adapter's ConnectionState.data-objectstack/src/index.ts:3360-3440moves that state only insideconnect(), the initial discovery. The hop range is empty for these files.
records-forms.conditional-rules-grid · A4: product defect, objectstack-ai/objectui#12286.
- On a fresh boot,
GET /api/v1/data/showcase_invoice_line?$filter=[["invoice","=","INV-1001 ID"]]returns Consulting hours at position 0 and Widget A units at position 1. - Open
/_console/apps/showcase_app/showcase_invoice/record/INV-1001 ID/edit. The grid reads…showcase_invoice_line?top=500&filter=[invoice,=,ID]with no orderby and renders server order (Widget A first). - Change only the Consulting hours Qty (
input[aria-label=Qty]) from 10 to 11, then Save.
- Expected: only the edited line in the batch; Widget A byte-identical.
- Actual:
POST /api/v1/batchcarries an update for the untouched Widget A{position:0}. On re-read, Widget A moved 1 → 0 (updated_at bumped) and Consulting 0 → 1. Same on INV-1002, on 2 fresh loads. - Mechanism: plugin-form
MasterDetailForm.tsxreadLinesOfcallsfind(child, {$filter, $top:500})with no sort by the derived sortField. fieldsGridField.tsxemit()stampsrow[sortField]=indexon every change. The hop range is empty. The add-line edit inmaster-detail-atomic-saveshowed the same re-stamp.
records-forms.calendar-interactions · A3: product defect, objectstack-ai/objectui#12291.
- On a fresh boot as admin, open
/_console/apps/showcase_app/showcase_task/view/calendar. - Click an empty day cell (
role=gridcell, aria-label "Tuesday, October 20, 2026"), type a title and click Create.
- Expected: a real row whose due_date is the clicked day.
- Actual:
POST /api/v1/data/showcase_task {title, due_date:"2026-10-20", status:"backlog"}→ 400fields[{field:project, code:required}], and the dialog offers only Title. Reproduced on Oct 21 in a fresh context. - Mechanism: plugin-calendar
ObjectCalendar.tsxsubmitQuickCreateauto-fills required select / boolean / number fields only, so a required lookup falls through to the server error. The hop range is empty.
records-forms.action-location-matrix · A2: product defect in the showcase example (framework repo), #23128.
- On a fresh boot as admin, open
/_console/apps/showcase_app/showcase_task/record/ANY TASK ID. - Header ⋯ → "Recalculate Selection" (or "Recalculate Estimate") → Run.
- Expected: 200, with the estimate recomputed.
- Actual:
POST /api/v1/showcase/recalc {"recordId":"ID"}→ 500 "[Security] Access denied: operation 'update' on object 'showcase_task' was called with a context that carries no principal …". estimate_hours is unchanged (40 → 40). The aggregate body{_selectedIds:[…]}from the bulk-actions view gets the same 500. Reproduced 4 times. The flow, modal, script, form and url legs all round-trip. - Mechanism:
examples/app-showcase/src/system/server/recalc-endpoint.tscallsctx.ql.update('showcase_task', …, {where})with no execution context, and the security layer refuses it.
i18n.surface-matrix · A5 (toast half): product defect with the same root, commented onto #23128.
- As admin on zh-CN, open
/_console/apps/showcase_app/showcase_task/record/ANY TASK. - Record ⋯ (record_more) → 重算工时 (an api action targeting
/api/v1/showcase/recalc).
- Expected: 2xx, then the toast 工时已重算。
- Actual:
POST /api/v1/showcase/recalc→ 500 (no principal), and the raw server text is toasted. A direct POST as admin gives the same 500. Seen in 2 UI and 2 API reproductions. - These are the only zh successMessage specimens, so no zh success toast can attach to a 2xx. The label half passes live, and the confirm half passes from the objectui pins. This is a defect in the fixture against the seed (RUNNER rule 3).
studio-authoring.packaged-display-class-direct-edit · A3 and N1: product defect, #23149.
- On a fresh boot with the admin bearer,
GET /api/v1/meta/view/showcase_taskand take the item, stripping the underscore keys. Set the list label to "All Tasks (X)" and drop the progress column. PUT /api/v1/meta/view/showcase_task?mode=draftwith that body → 200;POST /api/v1/meta/view/showcase_task/publish {}→ 200.GET /api/v1/meta/viewserves showcase_task.default as "All Tasks (X)" with 6 columns (expected).DELETE /api/v1/meta/view/showcase_task→ 200{success:true, reset:true}.GET /api/v1/meta/view/showcase_task.default→ "All Tasks", 7 columns (correct).
- Expected:
GET /api/v1/meta/viewandGET /api/v1/meta/view?object=showcase_taskalso serve the base. - Actual: both still serve "All Tasks (X)" with 6 columns after 30 s, and still after more than 3 min. The end-user list's first tab reads "All Tasks (X)" for admin and for Ada, in a fresh context. A server restart heals it.
- Reproduced twice, designer-driven and API-driven, on two fresh DBs. N1, the item's own negative, is the same defect. The dashboard leg resets clean.
- Likely mechanism: publish registers the expanded view items (object.viewKey) through
hydrateExpandedViewItems(packages/metadata-protocol/src/protocol.ts~19241).deleteMetaItem's registry heal (~19540-19565) restores only the bare container entry.
ux-conventions.write-feedback · A0 (variants V2 inline edit and V11 Studio discard): product defect, objectstack-ai/objectui#12303.
- V2:
- As admin (or member), open
/_console/apps/showcase_app/showcase_task/view/gridwith inline edit on. - Open the Priority cell of "Build homepage", pick Low, then click "Save All (1)".
- Expected: visible success feedback naming the change.
- Actual:
PATCH /api/v1/data/showcase_task/ID200 and the value lands, but no[data-sonner-toast],role=statusorrole=alerttext appears within 3 s. Seen 3 times. - Source:
ObjectGrid.tsxdefaultBatchSave/defaultRowSavepersist, then call setRefreshKey only.
- As admin (or member), open
- V11:
- Take a scratch-package object with a pending draft and open
/_console/apps/setup/metadata/object/OBJ. - Click "Discard draft" and accept the native confirm.
- Expected: a confirmation naming what was discarded.
- Actual:
DELETE …?state=draft200 and the banner disappears, with no feedback text. Seen twice. - Source:
ResourceEditPage.tsxdoDiscardDraft(~1876).
- Take a scratch-package object with a pending draft and open
- The other 10 measured variants all give feedback.
ux-conventions.write-feedback · A1: product defect in a framework-declared string, #23157.
- As admin, open
/_console/apps/setup/component/approvals/inboxand open a pending request. - In the drawer, click Approve, fill the comment and Confirm.
- Expected: success text naming the request; the inline row path says
Approved "TITLE". - Actual:
POST /api/v1/approvals/requests/ID/approve200 and the toast reads only "Approved.". Seen twice. - Source:
packages/plugins/plugin-approvals/src/sys-approval-request.object.ts:474successMessage: 'Approved.'.
ux-conventions.disabled-control-reason · A0, A1, A2: product defect, objectstack-ai/objectui#12303.
- A0 / A2:
- As admin, open
/_console/studio/com.example.showcase/data?surface=object:showcase_task→ Form → field Priority → Field properties rail. - Hover the disabled Label input or "Remove".
- Expected: a tooltip or adjacent text saying why (the package is read-only).
- Actual: nothing;
titlenull, no aria-describedby, empty reason. Seen on 2 fresh reproductions (Priority and Status). - Source:
StudioDesignSurface.tsx(~5519) passes readOnly to the inspector, which disables its inputs without a reason.
- As admin, open
- A1:
- Focus "Changes" in the Studio header and press Tab: focus skips the disabled Publish, whose reason is a
titleon a disabled button with no focusable wrapper. - The rail's disabled inputs are skipped too.
- In the import wizard, a CSV without a project column leaves the disabled Next with no aria-describedby or title.
- Expected: the control, or a focusable wrapper in the tab order, carries the reason. The Archive pattern does this and passes (objectui#11811 fixed).
- Focus "Changes" in the Studio header and press Tab: focus skips the disabled Publish, whose reason is a
ux-conventions.labels-over-machine-names · A0, A2: product defect, objectstack-ai/objectui#11862 (existing card, commented).
- A0:
- As admin, open Studio, create a writable package, then More → Access → New permission set "QA Readers" (qa_readers) → Save as draft.
- Reload
/_console/studio/PKG/access: the list item readsqa_readerswhile the detail header reads QA Readers. - The Changes panel row reads "PERMISSION · 1 | qa_readers", and the lookup inspector shows "Related object: sys_user".
- Seen on 2 fresh loads.
- A2: Studio → Data → an object → Form → a Lookup field → Picker config › Display field. Each row puts the api_name first in dark monospace, with the label grey and truncated.
- Expected (both): the label primary, the machine name secondary.
ux-conventions.labels-over-machine-names · A1: product defect in a framework-built string, #23157.
- As admin, open Studio → a writable package → More → Access → Explain access (Me, an object, Read) → Explain.
- Read Evaluation pipeline › Principal resolution: "Principal USER-ID holds position(s) [...]". Seen on 2 fresh runs.
- Expected: the person's name or email.
- Source: built server-side at
packages/plugins/plugin-security/src/explain-engine.ts:2061.
Checklist clauses (stale spec, no product defect)
platform-core.home-admin-cluster-links · A2: stale spec, #23121. The item was revised to rev 3 on main by #23132.
- Driven: as admin,
/_console/apps/setup/system/roles,/system/positionsand/system/permissions, on 2 fresh loads. - Actual: the final URLs are
/_console/apps/setup/metadata/position?scope=environment(roles and positions) and…/metadata/permission?scope=environment.usersandorganizationsmatch the map. - Clause expects: the
sys_position/sys_permission_setobject routes. - Why the product is right: objectui
AppContent.tsxhas routed these to SystemCatalogRedirect since objectui#7611 (ADR-0131 D3).
platform-core.keyboard-shortcut-surface · C2 and C3: stale spec, rows on #23121. These are expected-fail probes K1a / K1b whose defects are fixed. ⚠ The item is still rev 2 on main: #23132 did not take these two rows.
- C2: the dialog inventory reads General: Close dialog / panel
Esc, Open command palette⌘ K, Show keyboard shortcuts?; Navigation: Toggle sidebar⌘ B. Bare B does nothing and Ctrl+B toggles, so display and binding agree. - C3: none of ⌘/, N, R, ⌘E or ⌘D is advertised. Each still does nothing, measured against its own effect: no search focus, 0 dialogs, 0 refetches in 1.5 s, no edit surface, theme class unchanged.
- Source: objectui#11674 ("the dialog lists only shortcuts whose handler is mounted").
- Recorded as fail per the expected-fail contract (never ticked green), and flagged for revision to the positive assertion.
Partial and blocked coverage (named, not dropped)
ai.console-ai-surface-gatingC1b: blocked(environment). The entitled side needs an agent-serving catalog (Cloud/EE service-ai, or aVITE_AI_BASE_URLconsole rebuild). This is known (qa(checklist): park the blocked partial-coverage gaps of the 17.7 pre-release runs (#21720, #21721, #21782, #21784) — each gets a fixture recipe, a pin, a re-pointed clause or a recorded knownGap #22017 row 9).records-forms.gantt-interactionsA2-leaf: blocked(fixture). Dragging a locked leaf bar needs a lockField, and the view-overlay recipe is not run-proven.records-forms.record-edit-undoA0–A3: blocked(fixture). The stock showcase has no undoable edit path at this pin (see the accuracy list).- Inside failing items:
action-location-matrixA4 half (a): blocked(fixture), because runtime-authored actions are not served.keyboard-shortcut-surfaceC4: blocked(environment), as prescribed (no agent).write-feedbackA5: blocked(fixture), because no stock surface offers Undo.
- Marketplace catalog content (
builtin-apps-nav-renderA0,marketplace-console-honestyboot A): blocked(environment). Egress tocloud.objectos.aiis denied (knownGaps, not a clause).
Fixture gaps / checklist accuracy
Recorded on passing clauses, or as fixture prerequisites. Each one closes out through the family card #23121.
records-forms.saved-view-managementsteps 0–1 and A0: the Create View dialog is draft-first (PUT …?mode=draft, then Publish). The steps omit the publish leg (stale spec).records-forms.list-view-capabilitiesA6: no stock permission set grantsallowExport. The item needs a provisioning note: a runtime set{object_permissions.showcase_task:{allowRead, allowExport}}bound bysys_user_permission_setwith the set's NAME.records-forms.record-edit-undofixtures.requires: inline edits push no Undo op, onlyundoableactions do. The showcase needs a packagedundoableaction (operation update + patch).records-forms.action-location-matrixA4 step 6(a): a runtime-authored scratch action is not served, so the locations-less probe needs a packaged specimen.records-forms.bulk-select-all-matching: the fixture is stale.showcase_contactdeclares no bulkActions and its 34 rows fit one page. The run re-pointed to the showcase_task "Bulk Actions" view with 55 scratch tasks.records-forms.form-view-gallery: the overlay recipe must carry item-levelisDefault:true, or publish drops it and the console falls back to the all-fields layout (objectui#11539).records-forms.form-dirty-guardA2 andimport-wizard-encoding-and-hintsA0: the verify stringspnpm --filter @object-ui/PKG exec vitest run src/…are refused by objectui's vitest guard (objectui#3378). Runpnpm exec vitest run packages/PKG/src/…from the objectui root.records-forms.form-dirty-guardstep 1 / negative: the footer Cancel is a deliberate discard with no prompt, by design (ModalForm.tsxL739, pinned). The wording does not distinguish it from accidental closes.dashboards.global-filters-rescopeD2 / D3: no stock dashboard declares a globalFilter withoptionsFrom, and D2 needs a writable package. Add both to fixtures.requires.ux-conventions.write-feedback: the knownGaps objectui#11817 (Invite feedback), objectui#11807 (Studio Publish) and objectui#11816 (inline no-op dirty) are fixed at this pin, and the declared invite message isInvitation sent to ${result.email}. Studio discard lives on the metadata designer, not the pillars. A scratch object needs the package namespace prefix.ux-conventions.disabled-control-reason: knownGap objectui#11811 is fixed (Archive carries a focusable reason). The Studio Publish "known PASS" calibration holds for hover only, not keyboard.ux-conventions.labels-over-machine-names: the knownGaps are partly stale. objectui#11866 is fixed, objectui#11778 is fixed for the Node Type value, and objectui#11862 is fixed for the Explain principal line and the nav editor, but still reproduces for the Access list and the Changes panel.search.command-palette-navigation: the knownGaps recipe (a scratch showcase copy with visible 'true' / 'false' nav leaves) is now run-proven.i18n.surface-matrix:…/view/tabbedrenders the grid, not the tabbed form. The knownGap claiming that the task record page's sections render EN in every locale is stale.i18n.studio-follows-app-localestep 4: metadata list / history surfaces carry no relative dates. They live on the Studio Data pillar's records grid.access-security.share-link-landing-pageC3: knownGaps[2] is stale. The console now renders a dedicated "Sign in required" state for SIGN_IN_REQUIRED, and the item asks to be revised when that happens.api-backend.api-console-discovery-executestep 1: the "Studio → Developer → API Console" nav exists only instudio.app.ts, which a stock boot does not load. Reach the page by deep link (/_console/apps/setup/developer/api-console).ai.console-ai-surface-gatingC5: expected-fail K2 is fixed (objectui#11736: a refused 501 stops the poll chain, and there is no empty state under the alert). Revise to drop the expected-fail wording.platform-core.keyboard-shortcut-surfaceC4: ⌘⇧O / ⌘⇧S are not listed in the global dialog at all (objectui#11674), so the "listed globally" premise is stale.platform-core.theme-mode-persistence: the storage key isobject-ui-theme, notvite-ui-theme, and ModeToggle lives under the avatar menu's Preferences (stale step text, still at rev 1).approvals.notification-deep-linkstep 1:POST …/remindis submitter-only (403 for the dev admin on seeded requests). The opening path (or/reassign) is the workable source (assertion defect).automation.screen-flow-roundtripA0: the verify regex/automation/[^/]+/triggeris stale. The console launches throughPOST /api/v1/actions/OBJECT/ACTION.automation.setup-packaged-automation-boardA7: at this build a plain member cannot open Setup, and the activation read answers 403, against the recorded expectation. Recorded, not adjudicated: a maintainer question per the clause.studio-authoring.packaged-automation-studio-lockA2 / A3: knownGaps[0] and the "CURRENT RECORDED FINDING" expected-fail wording are stale. Both the switch and the inspector honour readOnly.integration-system.flow-connector-pickerA0: the knownGap's installed-package lock did not reproduce for an env-wide flow.- Setup recipe: per-boot
OS_HOME+OS_STORAGE_LOCAL_ROOTdo not isolateinstall-local, which caches under the working directory's.objectstack/installed-packages. Any item that installs a package (platform-core.marketplace-console-honesty,platform-core.marketplace-install-local-lifecycle) must boot from a scratch copy. approvals.quorum-m-of-n: the stockshowcase_committee_quorumclamps 2-of-3 to 1-of-1, because every slot resolves to the admin. Scored on the runtime-fixture recipe from QA run · follow-up: 6 previously unrun or published-only items (6/6) · 316be321 + 53021e3a · 2026-10-05 · 4 PASS / 0 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #21845 (known).
Observations outside any clause (not verdicts)
Unverified product observations and UI polish, listed so they are not lost. None of them is scored, and none is filed unless a card is named.
search.command-palette-navigation: theme commands apply but leave the palette open (2 / 2 contexts, click and Enter).CommandPalette.tsx:138runCommandcaptures a first-rendersetOpenwith stale search params. Not a hop regression. Also listed on QA run · surface:browser (61/61) · 316be321 · 2026-10-04 · 38 PASS / 8 PARTIAL / 15 FAIL / 0 BLOCKED / 0 NOT-RUN #21782, and still present.approvals.notification-deep-linkA4: on an unknown id the drawer stays open and blank after the toast (ApprovalsInboxPage.tsxopenDrawer).GET …/requests/UNKNOWN/actionsanswers 200 with an empty list.records-forms.action-location-matrix: the Log Time form page renders outside the app shell under the raw headingshowcase_task.form, and toasts "Action completed successfully" before any submit. The aggregate recalc 500 shows no toast, while the per-record 500 toasts the raw security message.i18n.surface-matrix: the settings override chip reads "Overrides 默认". The raw "[Security] Access denied … (isSystem: true)" text reaches an end-user toast. The write locale lags a tenant flip by about 1 s.records-forms.list-view-capabilities: JSON export renders the booleandoneas 否 on an en session, and ignores thefields=projection.records-forms.crud-roundtripA4: History shows a currency change unformatted (1234567).ux-conventions.labels-over-machine-names:- the audit log's Object column shows API names (
object_nameis a text field); - Explain's verdict line and the flow trigger summary use object machine names;
- metadata version history reads "by USER-ID", and "Back to item" stays EN on a zh session.
- the audit log's Object column shows API names (
dashboards.chart-type-matrixA7: on a month-bucketed line, comparison rows come back keyed by the unshifted month, so the previous-period series plots beside the window.approvals.setup-nav-entryA2: the System Overview stat captions (Users / Sessions / Events) stay English under zh-CN.approvals.pending-count-surfaces: the popover header reads "1 notifications" and "1 pending approvals", with no singular form.platform-core.console-installability-indicatorsC0:#faviconhas an empty href with type image/png, because the runtime config serves no faviconUrl.identity-auth.sso-enforced-first-paintC2: the dev-instance banner still advertisesadmin@objectos.ai / admin123under SSO-only.api-backend.api-console-discovery-executeC3 (server side): an unparsable JSON body is read as empty and answered with the "required" VALIDATION_FAILED envelope, not a parse error. Also listed on QA run · surface:browser (61/61) · 316be321 · 2026-10-04 · 38 PASS / 8 PARTIAL / 15 FAIL / 0 BLOCKED / 0 NOT-RUN #21782.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 13, 2026
Close-out · PM seat
domain:devx#2record composer,session_016JB93R2KcQP4GgKaUnseVF· 2026-10-13T04:58ZSibling record: #23166 (
surface:mixed, same subject36b2889c+ objectui pin1fb1ced36243, same run). Card: #23104 (Half 2).Every
failon this record has one of the four dispositions and a carrier. Every product defect is its own card in the repository its fix lands in. The two stale-spec rows sit on the family card #23121. No authorization finding arose on this selector.Environment-blocked legs are recorded in the body and need nothing more (RUNNER extraction obligation):
ai.console-ai-surface-gatingC1b,platform-core.keyboard-shortcut-surfaceC4, and the marketplace catalog content.⚠ #23121 is closed. PR #23132 landed its first six rows and closed the card. The two
keyboard-shortcut-surfacerows (C2 / C3), appended after that claim, were not taken: the item is still rev 2 onmain. The rows parked above are added to #23121 in comment6138566194. Until #23121 is reopened, or its rows move to a successor family card, this record's closeout debt stays open, and the record stays open with it.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Parked-on target moved · PM seat
domain:devx#2,session_016JB93R2KcQP4GgKaUnseVF· 2026-10-13T05:03ZThe closeout above parks this record's checklist-accuracy and fixture rows on #23121, which had already closed (completed) after PR #23132 landed its first six rows. Those rows now live on the successor family card #23169; the lines below supersede the closeout's
Parked-on: #23121lines one for one. TheExtracted:lines above are unchanged.Parked-on: #23169 · records-forms.saved-view-management · steps 0–1 / A0 omit the publish leg
Parked-on: #23169 · records-forms.list-view-capabilities · A6 export provisioning note
Parked-on: #23169 · records-forms.record-edit-undo · A0–A3 blocked(fixture): needs a packaged undoable action
Parked-on: #23169 · records-forms.action-location-matrix · A4 step 6(a) blocked(fixture): needs a packaged specimen
Parked-on: #23169 · records-forms.bulk-select-all-matching · fixture stale (showcase_contact has no bulkActions)
Parked-on: #23169 · records-forms.form-view-gallery · overlay recipe needs item-level isDefault
Parked-on: #23169 · records-forms.form-dirty-guard · A2 verify string refused by objectui#3378
Parked-on: #23169 · records-forms.import-wizard-encoding-and-hints · A0 verify string refused by objectui#3378
Parked-on: #23169 · records-forms.form-dirty-guard · step 1 / negative: deliberate Cancel discards by design
Parked-on: #23169 · records-forms.gantt-interactions · A2-leaf blocked(fixture)
Parked-on: #23169 · dashboards.global-filters-rescope · D2 / D3 fixtures.requires
Parked-on: #23169 · ux-conventions.write-feedback · knownGaps stale (objectui#11817, objectui#11807, objectui#11816)
Parked-on: #23169 · ux-conventions.write-feedback · A5 blocked(fixture): no stock Undo
Parked-on: #23169 · ux-conventions.disabled-control-reason · knownGap objectui#11811 stale
Parked-on: #23169 · ux-conventions.labels-over-machine-names · knownGaps partly stale
Parked-on: #23169 · search.command-palette-navigation · knownGaps recipe now run-proven
Parked-on: #23169 · i18n.surface-matrix · tabbed path renders the grid; record-page sections knownGap stale
Parked-on: #23169 · i18n.studio-follows-app-locale · step 4: relative dates live on the Data pillar grid
Parked-on: #23169 · access-security.share-link-landing-page · knownGaps[2] stale
Parked-on: #23169 · api-backend.api-console-discovery-execute · step 1 nav lives only in studio.app.ts
Parked-on: #23169 · ai.console-ai-surface-gating · C5 expected-fail K2 fixed (objectui#11736)
Parked-on: #23169 · platform-core.keyboard-shortcut-surface · C4 "listed globally" premise stale
Parked-on: #23169 · platform-core.theme-mode-persistence · storage key object-ui-theme; ModeToggle under Preferences
Parked-on: #23169 · platform-core.marketplace-console-honesty · setup recipe: install-local caches under the working directory
Parked-on: #23169 · approvals.notification-deep-link · step 1: remind is submitter-only
Parked-on: #23169 · approvals.quorum-m-of-n · stock committee clamps 2-of-3 to 1-of-1
Parked-on: #23169 · automation.screen-flow-roundtrip · A0 verify route regex stale
Parked-on: #23169 · automation.setup-packaged-automation-board · A7 member posture (maintainer question)
Parked-on: #23169 · studio-authoring.packaged-automation-studio-lock · knownGaps[0] / A2–A3 expected-fail wording stale
Parked-on: #23169 · integration-system.flow-connector-picker · A0 knownGap lock did not reproduce
Generated by Claude Code