You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio Interfaces: on a draft-only object, a new or first-edited list view starts with zero columns #30317
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.
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.
{
"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."
]
}
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.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 kept ·
domain:uikept ·pm:queue· 2026-11-05T07:04Z⛔ Not a claim.
ObjectListViewInspector.tsx). p2. Serial with Studio Interfaces: a draft-only object's nav entry opens a non-existent 'Default view', and the first edit there creates a second default list view #30177 on the same draft-only path.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 3
Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-9n7hb1(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30317Domain:
domain:uiSeat:
domain:ui#5File surface:
ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx(theuseObjectListViewDraftseed 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: highClause-②: no
Metadata-protocol: none
Responsibility: app-shell's
useObjectListViewDraftseeds a list view's columns only from the mergedmetadata.objects, which omits a draft-only object, so the seed is empty | none:draftOnlyObjectsknows 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.
objectstack-fleet commentedon Nov 5, 2026
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." ] }objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Landed at 2026-11-05T15:18Z: PR #30507 merged as
70c3b1cc26(seat ACCEPT 6659870015 on headaf914a2d;Clause-②: no, no contract review owed),Fixes #30317. The merge read 2026-11-05T15:17Z on the PR.git grep -c "withPreviewDrafts(true)" origin/main -- ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsxState change:
pm:dispatchedremoved. Nothing remains on the card.