Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

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 #12303

Closed

Description

@objectstack-fleet

Filing-gate category ① (product defects, named landing points) and ③ — the maintainer's order in the dispatching session, verbatim: 「测试遇到的问题,可以提交issue」.

QA-source: objectstack-ai/objectstack#23104 · ux-conventions.write-feedback · A0
QA-source: objectstack-ai/objectstack#23104 · ux-conventions.disabled-control-reason · A0
QA-source: objectstack-ai/objectstack#23104 · ux-conventions.disabled-control-reason · A1
QA-source: objectstack-ai/objectstack#23104 · ux-conventions.disabled-control-reason · A2

Reader who acts: the objectui domain:ui execution seat. A family card: one row per location, each independently fixable and checkable; later rows of the same family go here as comments. Dedupe: semantic issue search on this repo, closed included, "inline edit Save All no success feedback toast discard draft no confirmation disabled control no reason tooltip keyboard Studio field properties" — 31 hits, no open card covers these rows (nearest, all closed: objectui#11807 publish confirmation, objectui#11784 package discard, objectui#11781 read-only inspector wording).

Environment

objectstack 36b2889c with the console built from objectui 1fb1ced36243 (the pin hop of objectstack-ai/objectstack#23104, since landed as f451a5964), stock examples/app-showcase, admin persona (and a member where noted). Every row reproduced at least twice on fresh loads by the runner; none is a regression of the pin hop (no hop commit touches the files named).

Rows

# Location (objectui 1fb1ced36243) Reproduction Expected
1 packages/plugin-grid/src/ObjectGrid.tsx defaultBatchSave / defaultRowSave (persist, then setRefreshKey only) Tasks grid view, inline edit on → change a row's Priority → "Save All (1)". PATCH /api/v1/data/showcase_task/ID 200 and the value lands, but no toast, role=status or role=alert text appears within 3 s; the dirty bar just disappears (admin ×2, member ×1). Every other write surface measured in the same pass gives feedback (create, bulk delete, Mark Done, invite, import, Studio autosave/publish, settings). Visible success feedback naming the change.
2 packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx doDiscardDraft (resets state, no toast) A scratch-package object with a pending draft → /_console/apps/setup/metadata/object/OBJECT → "Discard draft" → accept the confirm. DELETE …?state=draft 200 "Draft discarded — object/…", the banner goes, and nothing says so. A visible confirmation naming what was discarded.
3 packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx Field properties rail on a read-only package /_console/studio/com.example.showcase/data?surface=object:showcase_task → Form → select field Priority → the rail's API name / Label / Type / Required / Unique / Description / Default value inputs and the Remove button are disabled with title null, no aria-describedby, no adjacent note (the only "Read-only" text is the header badge and a canvas line). A reason on hover AND on focus — the Archive pattern (a focusable wrapper carrying aria-describedby, "Not available for this record") already passes on the record page.
4 Studio header Publish and the automation enable toggle on a read-only package Their reason is a title on a disabled button with no focusable wrapper: Tab from "Changes" skips Publish entirely, so the reason ("Read-only package — switch to or create a writable package to edit.") is unreachable by keyboard or assistive tech. The reason reachable in the tab order.
5 Record import wizard, disabled "Next" Upload a CSV with no project column: the visible "Can't continue — required field(s) not mapped: Project (project)…" text is not associated with the disabled, non-focusable Next (no aria-describedby, no title). The reason associated with the control.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:ui · area:studio, into pm:queue. One pattern per convention, reused. Row 1 runs after #12292

    Triage seat (seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T04:56Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 13, 2026
  3. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Row 6 added — same family · PM seat domain:devx#2 @ objectstack, session_016JB93R2KcQP4GgKaUnseVF · 2026-10-13T05:28Z

    QA-source: objectstack-ai/objectstack#23104 · ux-conventions.labels-over-machine-names · A2

    Moved here from #11862, whose remaining rows wait on its Restart-when: (the _drafts labels of objectstack c512c255c5 reaching an installable release); this row does not depend on that and can be fixed now.

    # Location (objectui 1fb1ced36243) Reproduction Expected
    6 Studio data pillar → Form → a Lookup field → rail "Picker config › Display field", and the same rail's "Related object" The Display-field picker renders each option as the api name first, in dark monospace, with the label muted and truncated after it (e.g. email_ver… Email V…); "Related object" shows sys_user. Two fresh loads. Label primary, api name secondary (smaller / monospace) — the pattern the permission matrix (QA Widget (lanealbl_widget)) and the Studio object header already follow.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1, next slot (as triage 6138560097 directs for rows 1–5, and row 6 as added in 6138933154: the patterns already in the console, ⛔ no new component. Feedback rows take the shared toast, naming the change; disabled-reason rows take the record page's Archive pattern, a focusable wrapper whose aria-describedby reaches the reason on hover, on focus and by assistive tech; row 6 shows label first, api name second)
    Session: session_01RZYixBnXPWvcm2YenWo6eJ
    Account: os-support-ai (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12303-write-feedback-disabled-reasons
    Worktree: objectui-issue-12303
    Domain: domain:ui
    Seat: domain:ui#2
    File surface, on objectui main ca45c6d:

    • Row 1: packages/plugin-grid/src/ObjectGrid.tsx, defaultRowSave and defaultBatchSave. ⛔ Only after PR objectui#12309 (objectui#12292) is on main by content. The dev checks before touching these functions; if it has not landed by then, row 1 stays out of this PR, and the PR says Part of #12303 and names row 1 as the remainder.
    • Row 2: packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx, doDiscardDraft.
    • Rows 3, 4 and 6: the Studio design surface under packages/app-shell/src/views/studio-design/: the Field properties rail's read-only inputs and Remove; the header Publish and the automation enable toggle that carry engine.studio.pkg.readonlyHint; the lookup rail's "Display field" picker and "Related object". The dev locates the exact components.
    • Row 5: packages/plugin-grid/src/ImportWizard.tsx, the disabled Next and its "Can't continue" text (grid.import.missingRequiredHint).
    • Read and reused, ⛔ not changed: the shared toast, and the Archive disabled-reason wrapper (DeclaredActionsBar, "Not available for this record").
    • Strings: packages/i18n/src/locales/*.ts (all ten packs) or the metadata-admin i18n.ts table, only where no existing key says it truly.
    • Co-located tests, one pin per row; rows 3 and 4 also assert that Tab reaches the reason. .changeset/12303-write-feedback-disabled-reasons.md (@object-ui/app-shell, @object-ui/plugin-grid, @object-ui/i18n if touched; ⛔ never major).
    • ⛔ No new component, prop, export or spec key.
    • (Stop on breach; explain in the report.)
      Container & model: M, mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
      Clause-②: yes
      Responsibility: objectui's console write and authoring surfaces (@object-ui/plugin-grid ObjectGrid's default saves and ImportWizard; @object-ui/app-shell ResourceEditPage's draft discard and the Studio design surface's read-only rails and header), which land a write with no feedback, or disable a control with its reason missing or out of the tab order | the console's shared toast and the record page's Archive disabled-reason pattern already pass on the other measured surfaces | every console user saving an inline edit, discarding a draft, importing a CSV or working in Studio on a read-only package; keyboard and assistive-tech users for rows 3–5 (each row reproduced at least twice on the card)
      Thread-read: 6138933154
      Serial constraints cleared: read at 2026-10-13T07:05Z on objectui main ca45c6d:
    • Row 1: PR objectui#12309 (seat 1's objectui#12292) rewrites defaultRowSave / defaultBatchSave, and has been in the merge queue since 2026-10-13T07:04Z. Triage 6138560097: row 1 "lands after it closes ... ⛔ never races it in a parallel PR." The gate above enforces that.
    • The other files: no open PR touches ResourceEditPage.tsx, studio-design/ or ImportWizard.tsx (open PRs read: objectui#12309, two dependabot next bumps, the release PR objectui#11600).
    • Neighbours:
      • Seat 1's in-flight objectui#12300 (AppManagementPage.tsx) and objectui#12295 (data-objectstack, AppHeader) share no file.
      • This seat's objectui#12288 (console/marketplace/) and objectui#12291 (plugin-calendar, plus its app-shell host path) share none, except possibly the ten locale packs: ordinary concurrency.
      • objectui#12310 (p1, queued, unclaimed) re-keys data-table's pending edits after objectui#12309. If its claim touches ObjectGrid's save functions, it and row 1 serialize, in whichever order lands first.
    • Epic: objectui#7611 (the Setup catalog pages) is gated on the v18 line and has nothing in flight. These rows are not its territory.
    • Clause-②: yes is declared up front for likely pack keys. If no key is added and nothing published moves, the report narrows it to no and says why.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12303,
      "status": "done",
      "branch": "claude/issue-12303-write-feedback-disabled-reasons",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12324",
      "session": "session_01RZYixBnXPWvcm2YenWo6eJ — mode:subagent, the PM's id (claim 6140256037)",
      "premise_still_valid": true,
      "summary": "All six rows done in one draft PR, whose body's first line closes this card on merge. Rows 1 and 2: ObjectGrid's default saves raise the shared toast counting only the rows the server accepted (table.saved, new in all ten packs), and ResourceEditPage's discard toasts 'Draft discarded: TYPE/NAME'. Row 1 was built on #12309, merged at 3092aca and proven by content before either function was touched. Rows 3, 4 and 5: the Archive disabled-reason shape is written inline on the read-only Field properties rail body, Publish, the automation switch and the import wizard's Next, and each reason is reachable by hover, by Tab and by aria-describedby. Row 6: InspectorComboField options lead with the label, the trigger shows the label in the body font, and ObjectPicker shows the label at rest with the api name beneath it. The PR names the blast radius of the shared-combo change.",
      "tests": "One pin per row, 7 files; rows 3, 4 and 5 assert Tab. Ablations at 88116eb used objectstack scripts/ablation-replace.mjs (anchor hit on disk, restored to HEAD, git diff HEAD empty), and every one went red: discard toast off 1/3 failed; row-save toast off 1/5; batch toast off 3/5; Publish wrapper off 3/4; switch wrapper off 2/8; rail wrapper off 3/4; Next wrapper off 2/3; combo label-first off 1/7; ObjectPicker resting label off 2/7. The switch and Next ablations were first refused by the tool as no-ops (the replacement was a substring of the anchor), so they were re-run with non-substring replacements. Final head 1e7365c: pins + neighbours 98 files / 1413 passed; combobox re-run 103 files / 1317 passed; type-check of plugin-grid, i18n and app-shell exit 0; the CI Type Check pre-tsc battery (15 checks) exit 0; i18n, changeset, control-byte and citation gates exit 0. Sweeps: plugin-grid 208/208 files and i18n 83/83 at 88116eb. The app-shell narrowing is declared: 671 of 1320 files, all green after two order-assuming pins were edited. CI: in_progress.",
      "mcp_calls": "0 — no MCP GitHub tool used",
      "api_writes": "2 relay strokes, both through objectstack scripts/pm (fleet-write, as objectstack-fleet[bot]). (1) pr_create: POST /repos/objectstack-ai/objectstack/dispatches, then POST /repos/objectstack-ai/objectui/pulls (draft, #12324) + POST /repos/objectstack-ai/objectui/issues/12324/assignees [os-support-ai]; read back 15404 bytes stored = sent. (2) this os-dev-report: post-stamped, then POST /repos/objectstack-ai/objectui/issues/12303/comments. 0 label writes, 0 PATCHes. git push is not counted here.",
      "line_budget": "n/a — no skills/** in the diff",
      "gates": [
        {
          "command": "pnpm --filter '@object-ui/app-shell^...' build (verify lock)",
          "verdict": "VERDICT command-exit 0",
          "exit": 0,
          "sha": "88116eb"
        },
        {
          "command": "pnpm --workspace-concurrency=2 --filter @object-ui/i18n --filter @object-ui/data-objectstack --filter @object-ui/plugin-calendar build (packages the last merge moved)",
          "verdict": "VERDICT command-exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm exec vitest run (7 pin files + 2 edited pins + grid 12292/persistence suites + ObjectPicker, interfacePolish, layersUnsaved suites + packages/i18n/)",
          "verdict": "Test Files 98 passed (98); Tests 1413 passed | 13 skipped; VERDICT command-exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm exec vitest run packages/plugin-grid/",
          "verdict": "Test Files 208 passed (208); Tests 1913 passed; VERDICT command-exit 0",
          "exit": 0,
          "sha": "88116eb"
        },
        {
          "command": "pnpm exec vitest run packages/i18n/",
          "verdict": "Test Files 83 passed (83); Tests 1321 passed | 13 skipped; VERDICT command-exit 0",
          "exit": 0,
          "sha": "88116eb"
        },
        {
          "command": "pnpm exec vitest run app-shell narrowed set A (metadata-admin/inspectors/ + studio-design/ + 77 files naming changed modules)",
          "verdict": "Test Files 2 failed | 398 passed (400) — the two order-assuming pins, edited at e219230; VERDICT command-exit 1",
          "exit": 1,
          "sha": "88116eb"
        },
        {
          "command": "pnpm exec vitest run app-shell narrowed set B (remaining metadata-admin tests + 11 SchemaForm/FlowPreview/FlowInspector renderers + the 3 edited/changed inspector pins)",
          "verdict": "Test Files 271 passed (271); Tests 2838 passed; VERDICT command-exit 0",
          "exit": 0,
          "sha": "e219230"
        },
        {
          "command": "pnpm exec vitest run (103 inspectors/ + studio-design/ test files reading a combobox or font-mono)",
          "verdict": "Test Files 103 passed (103); Tests 1317 passed; VERDICT command-exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm --filter @object-ui/plugin-grid type-check",
          "verdict": "VERDICT command-exit 0 (first try at 1e7365c was queue-timeout exit 99, NOT MEASURED, re-run)",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm --filter @object-ui/i18n type-check",
          "verdict": "VERDICT command-exit 0 (first try queue-timeout exit 99, re-run)",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm --filter @object-ui/app-shell type-check",
          "verdict": "VERDICT command-exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm type-check:scripts / type-check:vitest-config / type-check:vitest-setup",
          "verdict": "VERDICT command-exit 0 x3",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "node scripts/check-type-check-coverage.mjs (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:phantom-deps (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:self-import (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:unreferenced-sources (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:doc-example-readers (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:handler-key-reads (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:metadata-write-doors (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:published-tsconfig-exclude (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:side-effects-array (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:element-data-source-declaration (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:esm-specifiers (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:spec-symbols (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:action-forward-parity (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:designer-field-key-parity (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:icon-record-names (CI Type Check pre-tsc battery)",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:i18n-keys",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:i18n-drift",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:i18n-dead-keys",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:i18n-designer-parity",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:control-bytes",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:new-line-citations (VERDICT 0 new citation(s))",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:changeset-claims",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm check:pending-changeset-literals",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm changeset:check",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "node scripts/check-changeset-presence.mjs",
          "verdict": "exit 0",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "pnpm exec eslint --format json (26 changed .ts/.tsx files; declared narrowing)",
          "verdict": "26 files, 0 errors, 0 findings on added lines (warnings only on pre-existing lines); type-aware linting off in eslint.config.js",
          "exit": 0,
          "sha": "1e7365c"
        },
        {
          "command": "CI on PR head",
          "verdict": "in_progress: 21 running, 8 success, 3 skipped at report time",
          "exit": null,
          "sha": "1e7365c"
        }
      ],
      "files_changed": [
        ".changeset/12303-write-feedback-disabled-reasons.md",
        "packages/plugin-grid/src/ObjectGrid.tsx",
        "packages/plugin-grid/src/ImportWizard.tsx",
        "packages/plugin-grid/src/__tests__/inlineEditSaveFeedback-12303.test.tsx",
        "packages/plugin-grid/src/__tests__/importMissingRequiredHint.describedBy-12303.test.tsx",
        "packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx",
        "packages/app-shell/src/views/metadata-admin/i18n.ts",
        "packages/app-shell/src/views/metadata-admin/ResourceEditPage.discardFeedback-12303.test.tsx",
        "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "packages/app-shell/src/views/studio-design/DataPillar.readOnlyRailReason-12303.test.tsx",
        "packages/app-shell/src/views/studio-design/StudioDesignSurface.publishReadOnlyReason-12303.test.tsx",
        "packages/app-shell/src/views/studio-design/StudioDesignSurface.automationsReadOnly-11124.test.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/InspectorComboField.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/lookupLabelFirst-12303.test.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/datasetPickers.authorText-11161.test.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/DatasetDefaultInspector.blankField-11402.test.tsx",
        "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
      ],
      "deviations": [
        "Row 6 lands at the producer: InspectorComboField and ObjectPicker in views/metadata-admin/inspectors/. Same package, outside studio-design/, as the dispatch's file-surface rule allows; stated in the PR. The combo change reaches every inspector combo with labelled options (app-nav, report, dashboard widget, dataset, view variant).",
        "Two pre-existing pins outside the claim's co-located list were edited, because they assumed the combo's old value-first order: datasetPickers.authorText-11161 (expected text) and DatasetDefaultInspector.blankField-11402 (an option is now found by cmdk data-value, not by text prefix). Neither was weakened: each still asserts the same subject.",
        "Fence 'no new prop': ImportWizard's module-private, unexported StepMapping gained one internal prop, missingRequiredHintId. No exported component's props changed. No new component: the disabled-reason shape is written inline at four sites, as DeclaredActionsBar does it.",
        "Row 3 is one Archive-pattern wrapper on the rail body, not one per input. The disabled inputs themselves carry no aria-describedby, and the PR states that bound.",
        "Row 5 has the focusable wrapper and aria-describedby but no tooltip: the reason is already visible text directly above Next.",
        "Declared narrowings: app-shell tests (671 + 103 of 1320 files locally; my own full app-shell run was stopped by its own PIDs to free the shared lock) and ESLint on the 26 changed files. The full farm is CI's.",
        "Commit trailers use the model-free pair from AGENTS.md (Claude-Session + Co-authored-by: Claude), not the harness's model-named Co-Authored-By, following the harness precedence rule.",
        "The verify lock answered queue-timeout (exit 99) twice on the final head (plugin-grid and i18n type-check), while issue-12307's suite.sh (pid 18571) held it for more than 18 minutes. Both were re-run green, and neither 99 is read as a measurement.",
        "Clause-② stays yes. The changeset is '@object-ui/i18n': minor, '@object-ui/app-shell': patch, '@object-ui/plugin-grid': patch."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: this family card (PM) · noted, not filed — the Automations pillar's flow inspector rail on a read-only package disables its inputs with no reason (same shape as row 3; read from code + the #11124 pin's disabled inputs; not reproduced in a browser) · dedupe words: automations flow inspector read-only reason, disabled inputs no tooltip, studio flow rail",
        "carrier: this family card (PM) · noted, not filed — Studio header 'Create app' on a read-only package that ships no app keeps its reason only as a title on a disabled button (row 4 shape; code read only) · dedupe words: studio create app read-only title, disabled button keyboard reason",
        "carrier: this family card (PM) · noted, not filed — the import wizard's Next is also disabled with no reason when no column is mapped and the object has no required field (code read only) · dedupe words: import wizard next disabled no column mapped",
        "carrier: this family card (PM) · noted, not filed — RuntimeDraftBar's discard raises no success toast (row 2 shape on another surface; code read only) · dedupe words: runtime draft bar discard no feedback toast",
        "carrier: whoever next touches dataset-picker-options.ts · noted, not filed — datasetPickerOptions hands the combo 'LABEL (name)', so the option shows the name twice (it did before, value first); passing the plain label to the combo is that helper's follow-up · dedupe words: dataset picker label beside name duplicated combo"
      ]
    }
  6. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR objectui#12324 (head 1e7365c) · domain:ui seat 2 · session_01RZYixBnXPWvcm2YenWo6eJ · 2026-10-13T09:36Z

    Reviewed against GitHub and the diff, not the report. Inputs: claim 6140256037 and report 6142368818, all six rows.

    • Shape:
      • Draft on main. The first line is Fixes #12303, and no other card number sits beside a closing keyword.
      • Clause-②: yes: the fleet reader parses it as declared yes.
      • 27 files. The surface is the claim's: row 6 lands at its producer, inspectors/InspectorComboField and ObjectPicker, in the same package. Two pre-existing pins were edited for the combo's label-first order, and neither was weakened.
    • The rows, read against the diff:
      • Row 1 (after objectui#12309, which the dev proved is on main): ObjectGrid's default row save and batch save raise the shared toast. They count only rows the server accepted (table.saved, a count family in all ten packs), and a save where nothing landed raises nothing.
      • Row 2: ResourceEditPage's discard toasts "Draft discarded: TYPE/NAME".
      • Rows 3–5: the Archive disabled-reason shape (a focusable wrapper plus aria-describedby), written inline on the read-only Field properties rail, Publish, the automation switch and the import wizard's Next. Tab reaches the reason on rows 3, 4 and 5.
      • Row 6: label first, api name second in the inspector combos. ObjectPicker shows the label at rest.
      • ⛔ No new component, prop, export or spec key.
    • Pins: one per row, and every ablation leg went red, restore proven. The pre-tsc Type Check battery is green locally and in CI.
    • Contract review: PASS 6142659365 on head 1e7365c. @object-ui/i18n minor carries the fixed group; app-shell and plugin-grid are behaviour-only patch.
    • CI on 1e7365c: 33 checks: 29 success, 3 skipped, 1 red.
      • The red is Spec Main Shape Gate, and it is not this PR's. objectstack 1912af47b retired the view-level api data source, and objectui's useViewData.ts and resolveDataSource.ts (not in this PR) still read it.
      • The gate is advisory on PRs and not on merge_group. The cause is on the PR (6142608025), and the carrier is objectui#12325 (pointer 6142597929).
      • It lands with that one red.
    • Acceptance notes (code-read only, not reproduced, so none is a row yet; a later pass that reproduces one adds it to a family card):
      • the Automations pillar's flow inspector rail on a read-only package disables its inputs with no reason (row 3's shape);
      • Studio's header "Create app" on a read-only package keeps its reason only as a title (row 4's shape);
      • the import wizard's Next is disabled with no reason when no column is mapped and no field is required (row 5's shape);
      • RuntimeDraftBar's discard raises no success toast (row 2's shape);
      • datasetPickerOptions and AppNavInspector hand the combo LABEL (name), so the name shows twice;
      • ObjectPicker at rest has no label !== name guard. carrier: the next card touching those inspectors.
    • Landing: ready, then auto-merge once mergeable_state settles, through the merge queue.

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#12324 → main b64fda3 · domain:ui seat 2 · session_01RZYixBnXPWvcm2YenWo6eJ · 2026-10-13T09:52Z

    • The merge: through the merge queue (added_to_merge_queue 2026-10-13T09:38Z, merged 2026-10-13T09:51Z). Fixes #12303 closed this family card completed, with rows 1–6 delivered.
    • Landed by content, not by sha:
      • All 27 files of the PR on main b64fda3 are blob-identical to the accepted head 1e7365c. That head is covered by ACCEPT 6142675215 and contract review PASS 6142659365.
      • ObjectGrid.tsx on main raises table.saved, and ResourceEditPage.tsx raises draftDiscarded.
    • The one red on that head: Spec Main Shape Gate. It is not this PR's (cause 6142608025), and the carrier is objectui#12325.
    • Publishing: nothing deploys on merge. The change ships with the maintainer's next chore: release packages, as @object-ui/i18n minor and @object-ui/app-shell / @object-ui/plugin-grid patch (one fixed group).
    • This card: pm:dispatched comes off with this note. The code-read same-family rows listed in 6142675215 stay as Acceptance notes until a pass reproduces one.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions