Skip to content

Studio: a controlled-by-parent object's optional master can be neither authored nor shown, after #30905 made required: false on its master valid #30974

Closed

Description

@objectstack-fleet

domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

Filing gate: ① a named location, from the dev report on #30905 (comment 6685276956, out-of-scope finding) and the full Test UI run on PR #30940; ruling A on #30905 is record 6687830530. ⛔ Not a claim.

PR #30940 (card #30905) lets a controlled_by_parent object declare an optional master: a master_detail with required: false (and, at the raw parse doors, with required omitted) is a valid master whose null-master rows belong to their owner. Studio still assumes every master is required:

  1. Display. ui/packages/app-shell/src/views/studio-design/owd-sharing.ts about :49 (deriveMasterObject) names a master only when def.required === true, and about :82 forces required: true. The OWD overview panel therefore shows "no master" for an object the parse accepts with an optional master.
  2. Save. PackageOwdOverviewPanel.tsx about :136-141 makes every master_detail of a controlled_by_parent object required on save, so an optional master is turned required by a Studio save.
  3. Authoring. ObjectFieldInspector locks Required on for a cbp master, so Studio offers no way to author an optional master.

On #30940, the two display-agreement test rows ("one master without required", owd-sharing.test.ts about :80 and PackageOwdOverviewPanel.cbpRequiredMaster-12326.test.tsx about :72) are re-labelled to record this gap, not fixed.

Wanted: Studio shows an optional master as the master, a Studio save keeps an author's required: false, and the inspector lets an author choose an optional master (with the null-master owner rule explained). The re-labelled rows flip back to agreement.

Suggested grade: p2, domain:ui. Serial: after PR #30940 lands.

Activity

  1. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:ui · pm:blocked · 2026-11-06T15:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Claim: PM loop round 1 · 2026-11-07T15:43Z
    Session: session_01FEkQ5mJLhZasj7G83LSvsv (card thread, dev) · seat session_01FEkQ5nLA7wiVY5YWjT9Svr
    Account: os-project-manager
    Branch: claude/project-thread-a6g2ku
    Worktree: objectstack-issue-30974
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/app-shell/src/views/studio-design/owd-sharing.ts, PackageOwdOverviewPanel.tsx, the ObjectFieldInspector Required lock for a cbp master, their tests (incl. owd-sharing.test.ts, PackageOwdOverviewPanel.cbpRequiredMaster-12326.test.tsx), i18n help text, root .changeset/
    Container & model: M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui/packages/app-shell Studio code in objectstack produces it (a save rewrites required: false to true); no platform path covers it; every Studio author of a controlled_by_parent object reaches it since PR #30940
    Thread-read: 6689206616
    Premise: holds: #30905 closed, PR #30940 merged; owd-sharing.ts:49 (required === true) and :82 (forces required: true) on origin/main 56baf78e
    Serial constraints cleared: none — no other domain:ui card is pm:dispatched on these files

    Scope: the card's three items; the two re-labelled rows flip back. PR says Fixes #30974. Order: /mnt/project-files/pm-orders/ui/order-30974.md. Summons: the maintainer's 「开一个 devx 席位,开一个 spec 席位,开一个 ui 席位」 (this project, 2026-11-07).

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Claim amendment · 2026-11-07T16:54Z · claim 6709225345 · the declaration, measured by the dev

    Clause-②: yes (widening)
    Metadata-protocol: none

    The claim said Clause-②: no as a default. The diff adds one key to @object-ui/i18n's published studio catalogue (designer.field.requiredCbpOptionalMaster, en and zh) and removes or rewords none, so it widens a published surface. The seat owes a TIER_DEFAULT review of the declaration before landing. Everything else in the claim stands.

  6. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5mJLhZasj7G83LSvsv
    os-dev-report
    {
    "issue": 30974,
    "status": "done",
    "branch": "claude/project-thread-a6g2ku",
    "pr": "#31202",
    "head": "f7f98072faba226b37b93efee7d08f8c561c2731",
    "session": "session_01FEkQ5mJLhZasj7G83LSvsv",
    "premise_still_valid": true,
    "summary": "Studio now reads, keeps and authors the optional controlled_by_parent master of ADR-0055 §1 as amended (ruling A, record 6687830530). deriveMasterObject names the master the spec's controlledByParentMasterOf names, after reading an omitted required on the only master_detail as required (the D2 conversion's reading, ruling A's 'Studio still defaults it to required'); two-master shapes are the spec's call, not Studio's. requireCbpMasterDetails (both save paths, and the overview's 409 prerequisite list through the shared predicate cbpMasterDetailDefaultsRequired) defaults only an omitted required and keeps an explicit required: false. ObjectFieldInspector unlocks Required on a cbp object's only master_detail, writes required: false when cleared, and shows new help text designer.field.requiredCbpOptionalMaster (en, zh) on the null-master owner rule; beside another master_detail the lock and old text stand. The two re-labelled rows flip back to agreement.",
    "tests": "Head 3c18a37 (code; f7f9807 adds only the changeset arm): pnpm --dir ui exec vitest run owd-sharing.test.ts + PackageOwdOverviewPanel.cbpRequiredMaster-12326.test.tsx + ObjectFieldInspector.cbpRequiredMaster-12326.test.tsx: 3/3 files, 38/38. Wider: studio-design/ + metadata-admin/inspectors/ + packages/i18n/: 659/659 files, 7206 passed 14 skipped (lock VERDICT command-exit 0). Type-check: @object-ui/app-shell exit 0, @object-ui/i18n exit 0. Ablations through scripts/ablation-replace.mjs, each restore blob == HEAD and git diff HEAD empty: omitted-required default dropped -> 2 red; old required===true count instead of controlledByParentMasterOf -> 3 red; save predicate back to required !== true -> 2 red; inspector commit back to v || undefined -> 2 red; inspector lock back -> 2 red; help key back -> 1 red. No dist build involved: app-shell tests resolve these modules from src.",
    "gates": {
    "derived": 36,
    "run": 36,
    "not_measured": 0,
    "nonzero_final": 0,
    "reconcile": "dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED (a DERIVED zero — all 36 recorded an exit code and none of them is 3)",
    "reruns": [
    {
    "cmd": "pnpm check:type-check-debt",
    "first": 3,
    "final": 0,
    "why": "first run queued behind my own lock hold (app-shell type-check + suite) and measured nothing; re-run under the lock on f7f9807"
    }
    ],
    "on_final_head": "gate loop on 3c18a37; the four changeset families and check:type-check-debt re-run on f7f9807, exit 0",
    "extra": "ui eslint on the 9 changed ui files exit 0 (0 errors; 17 warnings all on untouched lines); ui check:new-line-citations exit 0, 0 new",
    "ci": "not read: PR just opened; Test UI runs the full app-shell suite"
    },
    "line_budget": {
    "skills": "n/a: no skills/** in the diff",
    "diff": "10 files, +239 / -102"
    },
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "deviations": [
    "Clause-②: the claim said no; measured yes (widening) on the diff because it adds one key to the published @object-ui/i18n studio catalogue, per the seat's note. Changeset level stays patch (Metadata-protocol: none). The seat amends the claim.",
    "ui/packages/app-shell/src/views/studio-design/ObjectSettingsPanel.tsx is outside the claim's file surface: a comment-only edit, because its comment said the save forces every master_detail required, which this change makes false.",
    "Local package suite narrowed from the whole app-shell (2,210 files, stopped after ~15 min at maxWorkers=2) to studio-design/, metadata-admin/inspectors/ and packages/i18n/ (659 files); CI's sharded Test UI runs the rest.",
    "The ui/ engine closures (spec, formula, client, lint, sdui-parser) and @object-ui/app-shell^... were built before the tests and type-check."
    ],
    "files_changed": [
    ".changeset/30974-studio-optional-cbp-master.md",
    "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.cbpRequiredMaster-12326.test.tsx",
    "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx",
    "ui/packages/app-shell/src/views/studio-design/ObjectSettingsPanel.tsx",
    "ui/packages/app-shell/src/views/studio-design/PackageOwdOverviewPanel.cbpRequiredMaster-12326.test.tsx",
    "ui/packages/app-shell/src/views/studio-design/PackageOwdOverviewPanel.tsx",
    "ui/packages/app-shell/src/views/studio-design/owd-sharing.test.ts",
    "ui/packages/app-shell/src/views/studio-design/owd-sharing.ts",
    "ui/packages/i18n/src/namespaces/studio/en.ts",
    "ui/packages/i18n/src/namespaces/studio/zh.ts"
    ],
    "mcp_calls": "5 — reads only: issue_read get (#30974), issue_read get_comments (#30974 x3, #30905 x1); no write tool",
    "api_writes": "2 relay writes: fleet-write pr_create (#31202, 8447 bytes read back identical, no assignees, no labels) and this os-dev-report comment via post-stamped; git push x2 (not REST)",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "observation, not filed · carrier: none · the spec parse accepts a master_detail declared required: false beside a required one (controlledByParentMasterOf names the required one), while ObjectSchema.create() throws on it and relationship/master-detail-required reports it at error. Studio's refusal line reads the parse, so it does not flag that shape; Studio itself cannot author it (the inspector locks Required on beside another master_detail). Seat may add it to the PR's acceptance notes.",
    "observation, not filed · carrier: none · the OWD overview names an optional master the same way as a required one (no 'optional' marker); the inspector's help text carries the explanation."
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    ACCEPT → PR #31202 comment 6710893194 · 2026-11-07T17:49Z · head f7f98072faba226b37b93efee7d08f8c561c2731. Landing by relay pr_ready + automerge_enable.

  8. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Landed · 2026-11-07T18:24Z

    Reading Value
    PR #31202 MERGED 2026-11-07T18:24Z, merge commit 1c669888c33d70a2bf544f11f2d8b9bef4191102 on main
    #30974 closed completed by Fixes #30974; open domain:ui inventory otherwise unchanged (no card closed by a stray keyword)

    State: pm:dispatched removed, assignee cleared.

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

Metadata

Metadata

Assignees

No one assigned

    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