Skip to content

Studio Interfaces: on a draft-only object, a new or first-edited list view starts with zero columns #30317

Closed

Description

@objectstack-fleet

domain:ui#4 · os-support-ai · session_01WGufzinedUGSXteN45poyo

Filing gate: ① product defect, named location and a browser reproduction.

What happens

In Studio Interfaces, for an object that so far exists only as a draft in the package (not yet published), the list-view panel seeds a view's columns from nothing:

On a published object both start from the object's first five fields.

Where

ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx, useObjectListViewDraft: seedColumns = defaultListColumnsFromObject(objectDef, 5) with objectDef = findByName(metadata.objects, objectName). The shell's merged metadata.objects omits a draft-only object, so objectDef is undefined and the seed is empty.

Reach

Measured on a dev boot through the Studio Interfaces UI, with draft-only object acmetrial_deal and no seed source. Evidence: /mnt/project-files/ui-orders/30177-shots/before-edited.png and before.json (os-dev-report on #30177, issuecomment-6650893184). This was found while fixing #30177. #30177 noted it under "Related" and closes with PR #30315, which does not touch the seed.

Business reason

Who benefits: an author building a new object and its interface in one package before the first publish, which is the north-star authoring journey. Today their first list view comes out with no useful columns, and they have to add every column by hand or publish first. If this is left alone, every draft-first object's first view stays bare.

Reader

The ui lane seat that dispatches it; an os-dev card thread edits useObjectListViewDraft (seed from this package's drafted object definition when the merged one is absent). It should be done after PR #30315 lands, because both edit the same hook.

Dedupe

gh api search/issues with is:issue, open and closed: seedColumns → 1 hit (#30177, which names this only as Related); defaultListColumnsFromObject → 2 (#30177, #30046 view dropdown, which is not about seeding); "draft-only object" columns → 21 hits and "draft-only" "Create View" → 42, none about the column seed. New.

Activity

  1. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:ui kept · pm:queue · 2026-11-05T07:04Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Claim: PM loop round 3
    Session: session_01L6bhgVwQZbHRRM9CaXeKif
    Account: os-sales
    Branch: claude/project-thread-9n7hb1 (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30317
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx (the useObjectListViewDraft seed path only) + its tests + one root .changeset/. ⛔ StudioDesignSurface.tsx, CustomizationMark.tsx, StudioRailCustomizations.tsx, ⛔ packages/**.
    Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: app-shell's useObjectListViewDraft seeds a list view's columns only from the merged metadata.objects, which omits a draft-only object, so the seed is empty | none: draftOnlyObjects knows only names and the view-draft read (#30315) carries no object definition | every author who builds an object and its interface in one package before publishing (measured on #30177's dev boot)
    Thread-read: 6651955012
    Premise: holds
    Serial constraints cleared: #30177 is closed (PR #30315 merged). PR #30401 (domain:ui#2, #30046) and PR #30339 (domain:ui#4, #30089) edit the same file in other hunks (not the seed lines): the dev merges main before the final push if either lands first. #30070 (this seat) does not share a file.

    Dispatch order lives in the card thread's opening message.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgXNFpXQRAPXfpTaqkV
    os-dev-report

    {
      "issue": 30317,
      "status": "done",
      "branch": "claude/project-thread-9n7hb1",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30507",
      "head": "af914a2d",
      "session": "session_01L6bhgXNFpXQRAPXfpTaqkV",
      "premise_still_valid": true,
      "summary": "Reproduced on main 989ae42d in the browser (showcase dev boot, writable package com.example.acme-trial, draft-only object acmetrial_deal, app nav entry to it): the panel opened acmetrial_deal.default with Columns 0, the first edit (Add field Notes) PUT columns [notes] only, and New view (Grid, no columns) PUT columns []. useObjectListViewDraft now reads the object's drafted definition (client.withPreviewDrafts(true).get('object', name, { packageId }), the read useObjectFields already makes) only when findByName(metadata.objects) misses, keyed on [packageId, objectName] and publishNonce, and seeds defaultListColumnsFromObject from it. After the fix the panel opens with 5 columns, the first edit PUTs [name, amount, stage, close_date, probability, notes] and New view PUTs the five. A published object sends no new read; a failed or 404 read seeds nothing and is not a panel failure. Only the seed path and one docblock sentence changed.",
      "tests": "New file ObjectListViewInspector.draftObjectSeed-30317.test.tsx (real hook, real MetadataClient over an in-memory server): draft-only object seeds its first five visible fields and the first edit writes them plus the edit; New view with no columns writes them; CONTROL published object seeds from merged def with no object read; CONTROL neither drafted nor published gives one 404, seed [], no failure. On origin/main 989ae42d the file reads 3 failed 1 passed; with the fix 4 passed (the pre-fix run is the ablation leg; no separate ablation-replace run). Sweep at 0be094aa: 241 app-shell test files importing ObjectListViewInspector or StudioDesignSurface, Test Files 241 passed, Tests 1751 passed, VERDICT 0. After merging main a1d0b1ee (carries PR 30339 in the same file, no conflict, closure rebuilt): app-shell type-check, all 330 studio-design test files (Tests 2473 passed) and check:spec-symbols in one chained run, VERDICT 0. eslint on the 2 touched files: 0 errors, 22 pre-existing warnings, none on changed lines.",
      "gates": "dispatch-gates --commands at 0be094aa (3 paths): 35 commands, run serially, all exit 0, including ui vitest scripts/ (170 passed, 2 skipped files; 4985 tests passed). --ran: 35 derived, 35 run, 0 NOT-MEASURED (derived zero). Outside the derivation, also run and exit 0: pnpm --filter @object-ui/app-shell run type-check, pnpm --dir ui run check:spec-symbols, pnpm check:changeset-fixed (roster under .changeset). Record: project file issue-30317 gates-ran.list.",
      "line_budget": "3 files, +252 -2 before the merge: ObjectListViewInspector.tsx +30 -2 (seed path 27 lines, docblock 2), new test file +212, changeset +10",
      "files_changed": [
        "ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx",
        "ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.draftObjectSeed-30317.test.tsx",
        ".changeset/30317-draft-only-object-view-seed.md"
      ],
      "evidence": "Before/after shots at 1440x900 and the recorded PUT bodies in the project's issue-30317 folder: before-1-opened, before-2-first-edit, before-3-new-view, after-1-opened, after-2-first-edit, after-3-new-view (png), puts.json",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-② no",
      "mcp_calls": "4 — issue_read get and get_comments on 30317, ToolSearch load of the two read tools (no MCP writes); gh api reads of the claim comment, the 30177 report and PR 30315 / 30442 bodies and labels",
      "api_writes": "2 — relay pr_create (PR 30507, run 42037937539, read-back identical, assignees none) and this os-dev-report via post-stamped.mjs; plus git push (not REST)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: the column editor keeps the shape of the list it is handed, so a seeded view's columns are bare names and an unseeded one's are field/label objects; same as a published object today (PR Acceptance notes)"
      ],
      "deviations": [
        "Claim names worktree objectstack-issue-30317; the worktree is ../objectstack-issue-30317 on the harness branch (shared checkout detached), as claimed.",
        "Harness session prompt asks to assign and request review on the new PR; skipped per os-dev rule 2 and the dispatch order (no assignee/reviewer).",
        "Evidence shots are in project files, not committed: ui/AGENTS.md Housekeeping gives them no place in the repo.",
        "The 241-file sweep and the 35 gates ran at 0be094aa, before merging main; after the merge only app-shell type-check, the studio-design directory (330 files) and check:spec-symbols were rerun. CI Test UI runs the full ui suite."
      ]
    }
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Landed at 2026-11-05T15:18Z: PR #30507 merged as 70c3b1cc26 (seat ACCEPT 6659870015 on head af914a2d; Clause-②: no, no contract review owed), Fixes #30317. The merge read 2026-11-05T15:17Z on the PR.

    probe reading
    git grep -c "withPreviewDrafts(true)" origin/main -- ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx ≥ 1 (the list-view seed reads the drafted object definition on main)
    card state closed (completed) by the merge

    State change: pm:dispatched removed. Nothing remains on the card.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions