Skip to content

Studio: customize an installed package's dataset, showing what else it changes before the customer publishes #30064

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

The maintainer: 「全部立,继续测试验证」 (2026-11-04), on the seat's evaluation of which metadata types should support override.

Measured by the seat through the metadata API and in a browser on main 63b86b385d, on examples/app-crm and examples/app-showcase, each overriding through its paired customization package. No domain:* label is set: triage routes this card.

Business reason

A vendor's dashboard says 在途商机总额, and the customer defines that figure differently. They can edit the dashboard, not the number under it, and Studio shows the dataset as 只读. A dataset feeds every dashboard and report built on it, so changing one changes them all. The person must be able to see that before publishing.

Measured

  • The override of opportunity_metrics with total_amount's aggregate changed from sum to avg: publish published, and the running dashboard's 在途商机总额 moved from ¥814,400 to ¥135,733.
  • Removal returned ¥814,400.
  • Changing that measure's field to expected_revenue was refused at publish. The seat did not read why; the refusal has to reach the person in the door.

Acceptance

  1. A read-only base's dataset offers 定制, saved as a whole copy into the pair with the declaration, with 恢复原版.
  2. Before publish, the person sees which dashboards and reports use this dataset. Use the existing 引用关系 read if it answers this.
  3. A publish refusal is shown in the Console's language at the item.
  4. Marks, the 仅看定制 count and the All metadata tile cover datasets.
  5. A browser check: change a measure, publish, see the dashboard change, restore, see it return.
  6. No server or spec change is expected. If one is needed, report it here.

Where

ui/packages/app-shell/src/views/studio-design/StudioCustomizeControls.tsx:73. dataset is overridable by OVERRIDE_TYPE_CLASSIFICATION. A dataset's designer door in a read-only package was not measured.

Re-check

git grep -n " dataset: listed" origin/main -- packages/spec/src/kernel/customization-package.ts

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-04T13:07Z

    ⛔ Not a claim.

    • Read fresh. Studio customization of an installed package's dataset, showing what else the change affects before publish. The override door already exists, so this is StudioCustomizeControls.tsx. p2 kept.

    Generated by Claude Code

  2. 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-04T13:09Z

    ⛔ Not a claim.

    • Read fresh. Studio customization of an installed package's dataset, showing what else the change affects before publish. The override door already exists, so this is StudioCustomizeControls.tsx. p2 kept.

    Generated by Claude Code

  3. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    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 4, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Claim: PM loop round 5
    Session: session_01QSeKYnE9YNkSZen7sijLA3
    Account: os-justin
    Branch: claude/issue-30064-studio-dataset-customize
    Worktree: objectstack-issue-30064
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/views/studio-design/StudioCustomizeControls.tsx (the dataset door), the dataset designer and its publish refusal display in ui/packages/app-shell/src/views/**, the 引用关系 read it reuses, marks / 仅看定制 count / All metadata tile for datasets, i18n strings in ui/packages/i18n as needed, their tests, one root .changeset/ file; ⛔ no server or spec change — the card says none is expected; if one is needed, stop and report (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: TIER_DEFAULT — --tier: "no path-derived mandate", effort: high
    Clause-②: yes
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6631485407
    Premise: holds (triage 6631451282; dataset is overridable per OVERRIDE_TYPE_CLASSIFICATION; seat read StudioCustomizeControls.tsx on origin/main 31fe289f, after #30059 6cc0b818c)
    Serial constraints cleared: #30059 (seat 1) landed 6cc0b818c in StudioCustomizeControls.tsx; #30063 (page door, same file) is unclaimed and left to seat 3 by split — whichever lands second merges origin/main. #30175 (this seat, in the merge queue) does not touch StudioCustomizeControls.tsx (read 2026-11-05T00:43Z).

    Correction (2026-11-05T02:28Z, seat domain:ui#2, appended): Clause-② was no at claim time and is corrected to yes (widening). PR #30224 adds the optional fields fromLabel and kind to MetadataReference, which @object-ui/data-objectstack exports from its entry (src/index.ts:7993). The same diff narrows what MetadataClient.references() accepts: an answer that FindReferencesToMetaResponseSchema refuses now throws instead of reading as []. Because of that narrowing, a CONTRACT_REVIEW_TIER review is owed before the queue.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Serial note · 2026-11-05T01:20Z. #30062 item 4 (claim 6646593490, branch claude/project-thread-yenpdr) changes typeStateWord in ui/packages/app-shell/src/views/metadata-admin/PageShell.tsx: on a read-only package, the All metadata tile's "可定制" will read the customize door's own type table (isStudioCustomizeType + AREA_FORM_EDITOR_TYPES + flow) instead of allowEnvironmentOverlay. It does not touch StudioCustomizeControls.tsx, so when this card adds its door the tile follows. Whichever PR lands second updates the #29705 test's tile expectation for page / dataset from 只读 to 可定制. No file intersection; the merge queue arbitrates.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

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

    {
      "issue": 30064,
      "status": "done",
      "branch": "claude/issue-30064-studio-dataset-customize",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30224",
      "session": "session_01QSeKYnE9YNkSZen7sijLA3",
      "premise_still_valid": true,
      "summary": "A read-only package's dataset now opens in the All metadata area's form editor (StudioBundleItemEditor, routed by the new AREA_CUSTOMIZE_EDITOR_TYPES only on a read-only package) with its registered designer (DatasetDefaultInspector) and preview, and Customize writes the whole dataset into BASE.custom declaring overrides {package, basedOn}, with Restore package original on the override mark: the existing #28711/#28569 route, no second path. Before publish the editor lists what uses the dataset from the existing references read; that read was broken in the client (MetadataClient.references() read data.items, which GET /meta/:type/:name/references never serves; the declared answer is {references:[{type,name,label,path,kind}]}), so it returned [] for every item and Setup's References tab and Studio's item tools said Safe to delete; fixed in place under the claim's declared surface ('the references read it reuses'), parsed by FindReferencesToMetaResponseSchema, off-contract answer throws. A refused publish is placed on the measure or dimension and the designer's input (datasetMemberLocator) and shown at the dataset's editor as well as on its Pending changes entry. Why field: expected_revenue was refused: it is a formula field and the authoring gate's measure-aggregate-field-type-refused refuses sum/avg over a virtual field. Marks, the only-customized count and the directory tile needed no code (they read the customization read by type) and were measured in the browser. Acceptance 6: no server or spec change needed.",
      "tests": "Head aefff1f66. pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design/ -> Test Files 324 passed (324), Tests 2412 passed (2412), lock VERDICT command-exit 0. data-objectstack + i18n + item-tools + ResourceEditPage.references + DatasetDefaultInspector on 66709ceb4 -> 1 red (studio-namespace placeholder parity, usedByOne en lacked {count}); fixed aefff1f66; packages/i18n/ -> Test Files 95 passed, Tests 1443 passed / 13 skipped. type-check of @object-ui/data-objectstack, @object-ui/i18n, @object-ui/app-shell -> all Done, VERDICT command-exit 0. New pins: StudioBundleItemEditor.customize-28569.test.tsx describe 30064 (6 cases), metadata-client.references-30064.test.ts (4), metadataError.publishRefusal-26730.test.ts describe 30064 (2), metadataArea.test.ts describe 30064 (3), all green in verbose run. Ablation via scripts/ablation-replace.mjs on committed head, both subjects imported from source (no dist): (1) blocking hold removed, anchor 1->0, blob 8500a768->53bc7c49, the blocking pin x, Tests 1 failed; restored blob == HEAD, git diff HEAD empty. (2) fromType: ref.type -> ref.kind, anchor 1->0, mapping pin x, Tests 1 failed / 3 passed; restored blob == HEAD. Browser (CRM example fresh backend + Console vite, Chromium, zh-CN): Customize + aggregate sum->avg -> draft in pair with overrides; publish -> dashboard 在途商机总额 710,000 -> 177,500; tile 已定制 1, list 仅看定制(1) and row mark; field -> expected_revenue + publish -> 未发布。请检查度量「总金额」的「聚合方式」 at the editor and the Pending changes entry; Restore -> 710,000. Screenshots: /tmp/claude-0/-home-user-objectstack/f9f51d50-8b75-58d2-a29b-04e76abe5f26/scratchpad/issue-30064/shots/.",
      "gates": "Local, head aefff1f66: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 35 commands; every one exit 0 (exit captured before any pipe, recorded as 'cmd :: exit N'); --ran: 35 derived famil(ies) accounted for, 35 run, 0 NOT-MEASURED (a DERIVED zero). node scripts/check-sdui-manifest.mjs exit 0. ui check-new-cross-file-line-citations: 0 new citation(s), exit 0. CI on PR head aefff1f66 at report time: Check Changeset, Lint (ESLint, repo & tooling, docs & code guards, CI release & engine, PM dispatch-gates, scoped), Type Check (workspace, source, consumer, debt ledger), Governed Surface Queue Guard, PR-body guards: in_progress; Test UI / Type Check UI / Build & E2E UI not yet listed. Not waited on, per contract.",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no with no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no labels, no assignees) and this report comment via post-stamped.mjs (POST /repos/objectstack-ai/objectstack/issues/30064/comments); git push is not a REST write",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: PR 30224 · the references read defect (MetadataClient.references read data.items; every item read as Safe to delete) is fixed in place inside the claim's declared surface and named with its evidence in the PR's Acceptance notes; not filed",
        "carrier: none · the dataset designer's own count line (useDatasetUsage, a client list scan) now sits beside the references-read list: two reads of one fact, they agreed in the browser check; noted in Acceptance notes, not filed (polish)"
      ],
      "files_changed": [
        ".changeset/30064-studio-dataset-customize.md",
        "ui/packages/app-shell/src/views/studio-design/StudioBundleItemEditor.customize-28569.test.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioBundleItemEditor.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioCustomizeControls.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioMetadataArea.tsx",
        "ui/packages/app-shell/src/views/studio-design/metadataArea.test.ts",
        "ui/packages/app-shell/src/views/studio-design/metadataArea.ts",
        "ui/packages/app-shell/src/views/studio-design/metadataError.publishRefusal-26730.test.ts",
        "ui/packages/app-shell/src/views/studio-design/metadataError.ts",
        "ui/packages/data-objectstack/src/metadata-client.references-30064.test.ts",
        "ui/packages/data-objectstack/src/metadata-client.ts",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts"
      ],
      "line_budget": "n/a — no skills/** in the diff; 14 files, +681 / -28 vs merge base",
      "deviations": [
        "Commit trailers are the model-free pair AGENTS.md prescribes (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line.",
        "Local test scope narrowed: the full @object-ui/app-shell suite was not run locally; studio-design/ (324 files), item-tools/, the references and DatasetDefaultInspector tests, and the full data-objectstack and i18n packages were; Test UI runs the rest in CI.",
        "After the PR opened, origin/main gained 5 commits touching none of the changed files; no second merge (AGENTS §10)."
      ]
    }
  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Landed · 2026-11-05T03:15Z

    Probe Reading
    PR #30224 MERGED via the merge queue, merge commit 6f095b9c10
    git grep -c "FindReferencesToMetaResponseSchema" origin/main -- ui/packages/data-objectstack/src/metadata-client.ts 3 (the references read now parses the served answer)

    State: card closed completed by Fixes #30064; pm:dispatched removed in this stroke.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions