Skip to content

Studio Interfaces: choose an object's view from a dropdown at the top of the preview, in the object's title, the way the running list does #30046

Open

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

The maintainer: 「或者在界面位置上,应该和前端界面保持一致,在预览区域顶部下拉选择视图。在对象的位置」 and 「立卡」 (2026-11-04). Measured by the seat in a browser on main 63b86b385d, on the example CRM (read-only) and on a throwaway writable package. No reviewer ran this pass: the maintainer asked the seat to assess it directly. No domain:* label is set: triage routes this card.

Business reason

A person tuning a list opens 商机 in Studio and sees the preview titled 商机, with the view picker far away in the right-hand panel. After switching to 商机看板 the preview becomes a kanban, while the title, the address and the left rail do not say so. A refresh returns to 全部商机, so the view cannot be linked or kept. The running list already answers this: its title reads 商机 / 全部商机 ▾. The same place should work the same way in Studio.

Measured today

Check Result
Switch to another view in the panel, read-only and writable package The preview and panel change. The header still reads the object name. The URL stays surface=object:…&nav=…
Reload after switching Back to the nav entry's view
Switch with an edit pending, writable package No prompt. The edit is kept as a draft (read back on the view's page: 2 columns, 有未发布草稿), so today's save-before-switch behaviour works
Object with one list view No picker, by design in the code, so the only door to a second view is 添加视图 below the panel's header
Same view from a row under 不在导航中 → 视图 (surface=view:…) A different page: 设计 / 运行 in the header, no picker, and a different panel with 名称, 视图类型, 对象, 条件格式化 and the English form sections
Panel title on the CRM's kanban "Pipeline (Kanban)", while the picker reads 商机看板

Code readings

Readings are on 63b86b385d. StudioDesignSurface.tsx has since been split on main, so find it by symbol.

  • ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx:50-62 and :1382-1412: the panel picker lists list views only and holds the pick in a buffer. :1423: 添加视图.
  • ui/packages/app-shell/src/views/objectViewTitleSwitcher.tsx:57-100 and :119: ObjectViewTitleSwitcher is the running list's dropdown. It takes its data as props. favorites: null removes the star (:209), and add, manage and the personal-view callbacks are optional. The pin button at :230-244 draws unconditionally, so reuse needs that one prop made optional.
  • The Interfaces item header (testId="if-item-header") takes title as a React node, so the dropdown fits there without changing StudioItemHeader's contract.
  • ui/packages/app-shell/src/views/studio-design/InterfacesNavRail.tsx:384-402: a plain object entry leaves all its views listed under 不在导航中, which is why 全部线索 reads as "not in navigation" although 线索 opens it.

Header width

Measured by putting the longer title into the live header at the real widths, with the rail and the panel open:

Viewport Header width Room for the title 商机 / 全部商机 ▾ (132 px) 商机 / 本季度开放商机视图 ▾ (222 px)
1280 680 px At least 222 px Fits Fits, chips unfolded
1024 484 px 123 px Clipped Clipped

In the 1024 test the chips did not fold on their own. That measurement changed only the text, so a real title may fold them through the #29693 mechanism; check this on the PR.

Scope

  1. The Interfaces object header reads object / view ▾ in the title, using ObjectViewTitleSwitcher, and offers the object's list views with search and 新建视图 (the existing Create View dialog).
  2. Studio does not offer the reader's personal features there: favorites, pin, recent, 另存为我的视图.
  3. The dropdown shows even when an object has one list view, so 新建视图 stays reachable.
  4. The panel's 视图 picker and 添加视图 go away, along with 返回…默认视图 if the dropdown makes it redundant. The panel keeps the open view's properties, and its title uses the same localized label as the dropdown.
  5. The open view is in the URL. A reload and a shared link return to it. A pending edit is saved before switching, as today.
  6. Opening a list view from any door lands on this one page. Properties only surface=view: offers today (条件格式化 and the form sections below it) stay reachable on it, with nothing dropped. Studio on zh-CN still mixes languages and terms: view properties panel, flow nodes, publish sheet labels, and 仪表板 beside 仪表盘 #30039 owns translating those sections.
  7. Under 不在导航中 → 视图, a list view whose object has a navigation entry is no longer listed, because the dropdown reaches it. Views of an object with no entry stay listed.
  8. Form views are not in the dropdown and stay listed under that group, under a readable name rather than crm_lead.form, and the group's heading says what remains in it. Their 视图类型 reads a real type rather than simple(未找到).

Acceptance

  1. At 1280 wide with rail and panel open, the object and view name are readable with the longest view name in the example CRM. At 1024, the view name stays readable: chips and tools fold first, then the object prefix. A long name truncates with its full text in a tooltip.
  2. On a read-only package the dropdown switches views and every write door stays disabled.
  3. On a writable package: add a view from the dropdown, switch with an edit pending, reload, and open a shared link. Each lands on the expected view with the draft intact.
  4. Tests pin the URL round trip, the pending-edit path and the group's new filter.
  5. Browser checks on both package kinds with screenshots on the PR, on latest main.

Not in this card

Prior work

#27896 put the picker in the panel to fix reopening a new view, and #27836 added Add view. #26889 added the off-navigation lists. The seat read those three cards and found no ruling that fixes the picker's place. That search covered those cards and a keyword search, not every comment.

Re-check

git grep -n "list-view-switcher-trigger" origin/main -- ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:ui · 2026-11-04T10:57Z

    ⛔ Not a claim.

    • Read fresh. A Studio Interfaces change the maintainer asked for: pick the object's view from a dropdown in the preview's title, as the running list does, and keep it in the URL. p2 kept.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Claim: PM loop round 2
    Session: session_01QSeKYnE9YNkSZen7sijLA3
    Account: os-justin
    Branch: claude/issue-30046-studio-view-dropdown
    Worktree: objectstack-issue-30046
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/views/studio-design/** (the Interfaces object item header, InterfacesNavRail.tsx 不在导航中 grouping, ObjectListViewInspector.tsx view picker / 添加视图 removal, the surface=view: door it folds in), ui/packages/app-shell/src/views/objectViewTitleSwitcher.tsx (making the pin button optional only), the Studio URL state for the open view, i18n strings in ui/packages/i18n only for labels this needs, their tests, one root .changeset/ file; ⛔ no translation of the surface=view: form sections (#30039 owns that), no spec change (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: TIER_DEFAULT — --tier: "no path-derived mandate: the surface hits none of the 4 declared glob(s)", effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6628920205
    Premise: holds (seat read on origin/main eca7cd20: ObjectViewTitleSwitcher at objectViewTitleSwitcher.tsx:119; the panel's 添加视图 at ObjectListViewInspector.tsx:1423; the rail moved out of StudioDesignSurface.tsx into InterfacesNavRail.tsx by #30014)
    Serial constraints cleared: #30059 (seat 1, InterfacesNavRail.tsx / StudioCustomizeControls.tsx) merged as 6cc0b818c — this card works on top of it. No open domain:ui pm:dispatched claim names InterfacesNavRail.tsx or ObjectListViewInspector.tsx (read 2026-11-04T18:43Z); #30089 (view panel 批量操作 section, same inspector) is ruled to follow this card and stays unclaimed.

  3. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
    os-dev-report

    {
      "issue": 30046,
      "status": "needs_decision",
      "branch": "claude/issue-30046-studio-view-dropdown",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30175",
      "session": "session_01QSeKYnE9YNkSZen7sijLA3",
      "premise_still_valid": true,
      "summary": "Scope 1-5 shipped as draft PR #30175, body `Part of #30046`. The Interfaces object header now reads object / view ▾. The view part is the running list's ObjectViewTitleSwitcher (search, New view = the existing Create View dialog; no star, pin, recent or Save as my view), and it shows for a one-view object too. The panel's picker, Add view and Back-to are removed, and the panel title uses the switcher's served label (商机看板, not Pipeline (Kanban)). The open view rides in the address as `?view=OBJECT.KEY`: reload and shared link both measured, plus pins. `ObjectViewTitleSwitcher`'s pin is now optional; the running list passes it, so it is unchanged and pinned both ways. Browser check: the title clipped at 1280 on the read-only CRM, because a composed title shrinks inside its box and the #29693 fold never saw it as cut. I fixed this in the PR: the title declares its readable width through a pseudo-element sizer, and Open in Data folds to its glyph. Now 1280 shows both names whole, and 1024 folds the tools, cuts the object prefix and keeps the view name whole. Scope 6-8 are NOT done (needs_decision, see open_questions): this PR is already 1059 changed lines; 6-8 would add an estimated 600-800 more; and Scope 8's 视图类型 fix lives in `metadata-admin/inspectors/ViewVariantInspector.tsx`, outside the claimed file surface.",
      "tests": "Head ba9af0941. `pnpm --dir ui exec vitest run --maxWorkers=2` over 40 studio-design files (every test reading the Interfaces header, list-view panel or deep link) + objectViewTitleSwitcher.test/.phoneWidth-29074 + ObjectView.titleViewSwitcher-27594/.starredView-27594/.personalViews-29635 + packages/i18n/: `Test Files 140 passed (140) · Tests 1843 passed | 13 skipped`, lock VERDICT command-exit 0. `pnpm --filter @object-ui/app-shell type-check` VERDICT command-exit 0 (both tsc programs). After the last edit (address probe in an effect) listViewSwitch-27896 was re-run: 10/10. Ablations via scripts/ablation-replace.mjs; the suites import src directly, so no dist sits in the path. (1) The mirror passes null for the view: 2 failed / 8 passed (`a pick writes ?view=`, `a link carrying the view`), then restored with blob b26a265eff49 == HEAD and git diff HEAD empty, and the restored run was 10/10. The first run of this ablation turned only 1 pin red, because the link pin read the address before the mirror write landed. I added a settle, and the re-run turned 2 red. (2) `initialView: null`: 1 failed / 9 passed, restored == HEAD. (3) Pin always drawn in objectViewTitleSwitcher: 1 failed / 14 passed, restored blob ae5d88ab26a9 == HEAD. Browser (isolated CRM --fresh backend + console dev server, Chromium /opt/pw-browsers): on read-only com.example.crm in en and zh at 1280 and 1024, switch, `&view=crm_opportunity.pipeline` written, reload restores it, and no New view is offered. On a writable fresh package: New view from the dropdown saved to the draft and opened, switch and back, reload, and a shared link in a second tab at 1024. Screenshots are in scratchpad issue-30046/shots/. The browser did not drive the pending-edit-before-switch path (the view had no column to remove); a unit pin covers it.",
      "gates": "Local, on ba9af0941: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) derived 35 families. All 35 ran and each exited 0, captured before any pipe, including `pnpm check:type-check-debt :: exit 0` (detached under the lock; `0 raw tsc error(s) total`) and `pnpm --dir ui exec vitest run scripts/ :: exit 0` (172 files, 4985 passed). `--ran` reconciliation: `35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN` ✓. Outside the derivation: `node scripts/check-sdui-manifest.mjs` exit 0; `pnpm --dir ui run check:new-line-citations` `VERDICT ... 0 new citation(s)` exit 0; `node scripts/check-platform-checklist.mjs --changed-from origin/main` exit 0 (`0 anchored files`); eslint over the 15 changed ui files exit 0 after fixing 1 error (react-hooks/globals in the test probe), with warnings only. PR #30175 check-runs at report time: Governed Surface Queue Guard success. Check Changeset, Check PR Size, Lint · (CI release & engine, ESLint, PM dispatch-gates, docs & code guards, repo & tooling, scoped x3), PR-body guards, and Type Check · (consumer, debt ledger, source, workspace) were in_progress; UI test, build and E2E lanes had not been listed yet. All NOT MEASURED: CI not converged, and convergence is PM's.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 — git push (branch probe + 7 commits, not REST); pr_create via fleet-write relay (repository_dispatch fw-20261104T203709Z-541031 -> POST /repos/objectstack-ai/objectstack/pulls, draft, no labels, no assignees, read-back identical); POST /repos/objectstack-ai/objectstack/issues/30046/comments (this os-dev-report via post-stamped.mjs)",
      "open_questions": [
        {
          "question": "Scope 6-8 of #30046 are left out of PR #30175. How should they land?",
          "options": [
            "A — a follow-up PR on the same card: Scope 6 (fold 条件格式化, with its CEL verdict wired into the list buffer's autosave hold, plus the spec-form sections into the list panel; `surface=view:` for a list view lands on the object page, including for an object with no nav entry) and Scope 7 (不在导航中 filter). Cost about 400-500 lines. Scope 8 rides it once the seat widens the claim's file surface to `metadata-admin/inspectors/ViewVariantInspector.tsx` (its type options come from the list-variant enum, so a form's `simple` reads 未找到).",
            "B — split 6 and 7+8 into two sub-issues, 6 depending on #30039's section translation. Two smaller reviews, but 6 and 7 touch the same off-nav/door code and would serialise anyway.",
            "C — fold everything into PR #30175. One ~1700-1900-line PR, well over the ~1200 reviewable bar the dispatch set, and it breaches the claimed file surface."
          ],
          "recommendation": "A, because 6 and 7 share the off-nav and door code and review together at about the size of this PR. 8's surface widening is one claim edit by the seat. #30175 stays reviewable and already closes the maintainer's visible ask (dropdown in the title, view in the URL)."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: public door — Studio Interfaces on a writable package whose object is draft-only and whose package drafts an `isDefault` list view (browser, fresh package com.acme.trial: object acmetrial_deal + drafted acmetrial_deal.all isDefault + nav entry with no viewName). The entry opens `acmetrial_deal.default`, a view that does not exist, so the switcher lists 'Default view' beside 'All deals', and the first edit there would create a second default view. Cause: `listViewTargetOf` resolves the entry's view from the shell's merged `listViews` only (`metadata.objects`), which a draft-only object is absent from. Related: Create View seeds zero columns there (`defaultListColumnsFromObject` on an undefined objectDef). Pre-existing, identical with the old panel picker; not changed here. · dedupe words: draft-only object default list view, listViewTargetOf isDefault draft, Studio Interfaces entry view draft object",
        "carrier: PR #30175 · fixed in place under the bounded-fix exemption (same defect class as Scope Acceptance 1, mechanical): the header's 'Open in Data' action now carries `data-studio-fold-label` like the other labelled actions, so #29693's fold can take its label on a narrow row"
      ],
      "deviations": "(1) Did not merge origin/main (9a53fc9fe, 5 commits) before opening: all five are backend/spec-doc paths (objectql, plugin-auth, spec data zod docs) disjoint from this diff; GitHub reports no conflict and CI builds the merge. (2) The panel title drops the object prefix for label-less views ('Default view' instead of 'Task · Default view'). This narrows objectui#13151's role naming, because the header title now names the object; its pins were updated. (3) Harness attribution asked for a model-named Co-Authored-By trailer; commits carry the model-free pair per AGENTS.md (the pre-push hook refuses a model identifier). (4) The card's header-width table (≥222 px of title room at 1280) does not hold on the read-only CRM: measured about 208 px with Customize, 只读 and Open in Data in the row."
    }
  4. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    维护者速读 · #30046 剩余三项怎么交付 · 2026-11-04T20:45Z

    一句话问题。 你点名的「在预览区顶部、对象的位置用下拉选视图」已经做好;卡上配套的「打开的视图写进地址、刷新和分享链接能回到它」也做好了。还剩三处收尾没做:从「不在导航中」打开列表视图时,仍然进入另一个长得不一样的页面;「不在导航中」里仍然列着下拉已经能到达的视图;表单视图显示成 crm_lead.form 这样的内部名,视图类型显示「simple(未找到)」,分组标题也没有说明里面还剩什么。问的是:这三处怎么交付。

    Governing text: the card's Scope 6–8 (body of #30046). The ~1200-changed-line size stop comes from the seat's dispatch order (off-thread; the dev quotes it in report 6641563779). PR #30175's body reads Part of #30046 (seat-measured).

    Protocol: no spec change in any option.

    前提(re-check)

    • PR feat(studio): pick an object list view from the Interfaces header title, and keep it in the address #30175 = Scope 1–5, +712/−347 = 1059 changed lines: gh api repos/objectstack-ai/objectstack/pulls/30175 --jq '.additions+.deletions'.
    • Scope 8's 视图类型 label: ui/packages/app-shell/src/views/metadata-admin/inspectors/ViewVariantInspector.tsx:193-209 useTypeOptions reads getListVariantSchema().properties.type.enum (list types only), and :433-434 marks an off-enum value with engine.form.notFound ((未找到)). Re-check: git grep -n "getListVariantSchema().properties.type.enum" origin/main -- ui/packages/app-shell/src/views/metadata-admin/inspectors/ViewVariantInspector.tsx. This file is outside the claimed surface and is used by every form view's inspector, not only the 不在导航中 group.

    选项

    选项 做什么 客户看到的后果 工作量
    A 同卡跟进一个 PR #30175 先落地;同卡再开一个 PR 做 6+7+8,席位把认领范围扩到 ViewVariantInspector.tsx 下拉和地址先用上;三处收尾晚一个 PR ui · 1 个 PR · 估 600–800 行(dev 估;先例 #30175:1–5 项 +712/−347)
    A′ 6+7 同卡跟进,8 单独一张小卡 同 A,但表单视图类型显示这一处单独立卡,因为它影响所有表单视图的检查器 同 A;类型显示的修复可以独立排期 ui · 2 个 PR · 合计同 A
    B 6 与 7+8 各一张子卡 拆两张子卡分别派 同 A,多一轮排队;6 和 7 改同一段代码,仍要串行 ui · 2 个 PR · 合计同 A
    C 全并进 #30175 一个 PR 做完 1–8 一次上线,但 PR 约 1650–1850 行,审得慢、风险集中 ui · 1 个 PR · 估 1650–1850 行

    业务含义直译。 A 是同一张工单分两次交货;A′ 再把一个通用零件的问题单独开单;B 是把剩下的拆成两张新工单;C 是等全部做完一次交货。

    推荐:A

    只看① 选 A;②③④ 是否翻转:否。

    项目长远合理性(领起)。 终态句:两年后,Studio 里一个对象的每个列表视图都从同一个页面、同一个下拉打开,就像 Airtable、Salesforce Lightning 的列表视图切换器那样;四个选项最终都到这个状态,差别只在怎么切 PR。A 让共享同一段「不在导航中 / 独立视图入口」代码的 6、7 在一个 PR 里一起审,最不容易互相踩;B 让它们串行,只多一轮排队;C 让单个 PR 大到难以逐行审。A′ 的好处是第 8 项的通用检查器缺陷能独立排期,代价是多一张卡。

    实际业务需求。 你点名的是下拉,地址是卡上为它配的;这两件已在 #30175。剩下三处是收尾,晚一个 PR 不影响前者先用上。

    防 AI 写错。 不涉及 AI 写的元数据。出错时谁看到什么:PR 过大时,复核席位读不完 diff,一处回归会静默进入 main,用户在 Studio 里才撞上;PR 小,复核能逐行读,回归在合并前被测试或复核拦下。

    创业阶段不扩散。 四个选项范围相同,只是切法不同,不增加需求。

    置信缺口。 600–800 行是 dev 的估计,席位未测。

    疑属不升级类。 这是交付顺序问题,不改变任何产品行为;按规则 dev 的 needs_decision 一律呈你,所以仍交你裁。

    裁后执行。 选 A:席位复核并落地 #30175,随后同卡扩认领范围,派一个 dev 做 6–8。选 A′:同 A,第 8 项另立 metadata-admin 小卡。选 B:席位立两张子卡再派。选 C:同一 dev 在 #30175 上续做,范围同扩。

    os-decision-facets

    Analysis-tier: seat (TIER_DEFAULT); reviewed by an isolated CONTRACT_REVIEW_TIER review, which returned FAIL with 9 required corrections, all applied in this text.

    Prior rulings read: #30046, Part of, Scope 6 on this thread → 0 hits; ADR none; thread: none.

  5. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
    os-dev-report

    {
      "issue": 30046,
      "status": "needs_decision",
      "branch": "claude/issue-30046-studio-view-dropdown",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30175",
      "session": "session_01QSeKYnE9YNkSZen7sijLA3",
      "premise_still_valid": true,
      "summary": "Patch round: Test UI 5/16 was red because `openPathObjectReaders-12811.test.ts` counted 34 readers against a roster of 33. The extra reader is `ObjectListViewTitle.tsx`. What the guard counts: every reader of the whole object list off the metadata context (`useMetadata().objects` and its spellings, `getItemsByType('object')`, `readObjectsByName`). It does so because reading `objects` loads the whole registry, and a reader mounted on an app's object-list open must read `readObjectScope` instead. The roster is closed so that every reader carries a kind (scope / action / byName / off): a new reader fails until someone says where it runs. The read is a MOVED one, not a new one. On base eca7cd2 the panel component `ObjectListViewInspector` read `findByName(metadata.objects, objectName)` for the Create View dialog's `existingViewLabels`, and that read moved with New view into the header's `ObjectListViewTitle`; the hook's own read in the inspector file stays, so its row stays. The header's prescription for any reader is to classify it. I added a row, `kind: 'off'` (Studio, never mounted on an app's object-list open), whose `why` names the moved read. Nothing was routed elsewhere. Scope 6-8 untouched; they wait on decision comment 6641701158.",
      "tests": "Head e609f29fe (a fresh worktree on the branch, closure rebuilt: `pnpm --filter '@object-ui/app-shell^...' build` VERDICT command-exit 0). Red before the row (head ba9af0941): `pnpm --dir ui exec vitest run packages/app-shell/src/console/__tests__/openPathObjectReaders-12811.test.ts` gave `× classifies every reader, and every row names a reader`, extra entry `+ packages/app-shell/src/views/studio-design/ObjectListViewTitle.tsx`, Tests 1 failed / 2 passed, VERDICT command-exit 1. Green after it: that file plus the 40-file studio-design set (every test reading the Interfaces header, list-view panel or deep link) in one run, `Test Files 41 passed (41) · Tests 361 passed (361)`, VERDICT command-exit 0. A first green attempt in the fresh worktree failed 38 files on `Failed to resolve import @objectstack/spec`, because the worktree was unbuilt (not a code result); it was re-run after the build above.",
      "gates": "Re-derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` on e609f29fe: the same 35 families as the first round, which all exited 0 on ba9af0941 (`--ran`: 35 run, 0 NOT-MEASURED, 0 UNRUN). This round adds only a test-file row, so I re-ran the test-path families: `pnpm check:cross-package-test-inputs :: exit 0`, `pnpm check:test-source-alias :: exit 0`, `pnpm check:nul-bytes :: exit 0`. PR check-runs on e609f29fe at report time: 31 success, 12 in_progress, 11 skipped, 0 failure. Test UI shards are among the in_progress ones, so their result is NOT MEASURED (CI not converged; convergence is PM's).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — git push (commit e609f29fe, not REST); POST /repos/objectstack-ai/objectstack/issues/30046/comments (this os-dev-report via post-stamped.mjs)",
      "open_questions": [
        {
          "question": "Scope 6-8 of #30046 (unchanged from round 1; the decision sits on comment 6641701158).",
          "options": [
            "A — follow-up PR on the same card for 6+7, with 8 once the claim's surface covers `metadata-admin/inspectors/ViewVariantInspector.tsx`",
            "B — two sub-issues",
            "C — fold into #30175"
          ],
          "recommendation": "A, as argued in round 1; nothing in this patch changes it."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: public door — Studio Interfaces, a draft-only object with a drafted isDefault view: the entry opens OBJECT.default instead (round 1, unchanged) · dedupe words: draft-only object default list view, listViewTargetOf isDefault draft"
      ],
      "deviations": "The round-1 worktree had been removed after the PR opened. I re-created it from origin/claude/issue-30046-studio-view-dropdown at ba9af0941 and rebuilt the closure before the green run; it is removed again after this report.",
      "line_budget": "+4 lines (one roster row) on top of round 1's 1059",
      "files_changed": [
        "ui/packages/app-shell/src/console/__tests__/openPathObjectReaders-12811.test.ts"
      ]
    }
  6. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    ACCEPT → PR #30175 comment 6642245775 (head e609f29f, 2026-11-04T21:12Z), Scope 1–5, Part of. Scope 6–8 stay in the decision on 6641701158. Landing waits on the maintainer's authorization in the seat session.

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Landed (Scope 1–5) · 2026-11-05T01:10Z

    Probe Reading
    PR #30175 MERGED via the merge queue, merge commit 42afac7234 (Part of #30046, no closing keyword)
    git grep -c "ObjectViewTitleSwitcher" origin/main -- ui/packages/app-shell/src/views/studio-design/ObjectListViewTitle.tsx 3

    State: the card stays open on needs-user-decision for Scope 6–8 (analysis 6641701158). The assignee stays with this seat until the clock-out Release:. Follow-up #30177 (serial behind this PR) is now unblocked.

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Release: claim 6639051222 (session_01QSeKYnE9YNkSZen7sijLA3, seat domain:ui#2) is released at clock-out, 2026-11-05T03:16Z, on the maintainer's 「当前任务处理完,合并后就下班」.
    Resume-from: none. Scope 1–5 landed through PR #30175 (42afac723); Scope 6–8 start fresh from origin/main.

    State: the card stays on needs-user-decision for Scope 6–8 (analysis 6641701158, options A/A′/B/C, seat recommends A). After the ruling, a sibling domain:ui seat re-claims. For A, the claim's file surface adds ui/packages/app-shell/src/views/metadata-admin/inspectors/ViewVariantInspector.tsx. #30177 (draft-only object default view, p2) was serial behind #30175 and is now unblocked; it stays in pm:queue for a sibling.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions