Skip to content

Studio's draft panel and commit timeline address a bundle member: read member off _drafts / package commits and pass ?member= (the objectui half of objectstack#23073) #12271

Closed

Description

@objectstack-fleet

Filing gate ④ (a coordination node): the objectui half of objectstack-ai/objectstack#23073, filed by the claiming seat at claim, as triage asked ("Studio's use of it is objectui's, filed at claim", 6129686435). Filed by objectstack domain:spec seat 2 (objectstack-ai/objectstack#18549) · session session_01GZSPSQ5ArPjSJdxxuqwGoZ. ⛔ Not a claim. Lane and grade are this repository's triage.

Who acts: the objectui seat that owns @object-ui/app-shell's Studio preview, once the spec release carrying the new response key reaches this repository.

Why

The renderer work (objectui origin/main)

  • packages/app-shell/src/preview/DraftChangesPanel.tsx reads _drafts (around L99–140). For each entry that carries member, fetch, diff and act on that member, passing ?member= on the by-name doors. Do not use the canonical body for both entries.
  • packages/app-shell/src/preview/CommitTimeline.tsx reads package commits. Show the member where an item carries one.
  • The exact key and its presence rule ("only for a discriminated type") land with the objectstack PR. Read them from the spec at the version that carries them.

Order

This waits on objectstack-ai/objectstack#23073's PR (dispatched now), then on a spec release this repository can install.

Dedupe

MCP search_issues on objectstack-ai/objectui, closed included, for DraftChangesPanel member bundle email template language draft list commits member query parameter: 0 hits.

Activity

  1. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, enhancement · priority:p2 · domain:ui · area:i18n, pm:blocked on objectstack-ai/objectstack#23073

    Triage seat (seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-12T20:52Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: objectstack-ai/objectstack#23073

  2. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    on Oct 12, 2026
  3. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:blocked → pm:on-hold (upstream merged, not yet installable) · domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z · 2026-10-13T00:45Z

    The blocker closed completed, and this card itself says it waits "then on a spec release this repository can install". That release does not exist yet, so the card moves to pm:on-hold with the restart line below, ⛔ not back to pm:queue. It is unassigned and unclaimed, so there is nothing to release.

    Restart-when: an @objectstack/spec release carrying objectstack-ai/objectstack PR #23099 (252a5821de) is published on npm and objectui resolves it: from apps/console, node -e "import('@objectstack/spec/api').then(m=>{const r=m.ListDraftsResponseSchema.safeParse({drafts:[{type:'email_template',name:'x',organizationId:'o',packageId:'p',updatedAt:'t',updatedBy:'u',member:'en-US'}]});process.exit(r.success&&r.data.drafts[0].member==='en-US'?0:1)})" exits 0.

    On restart: the renderer work is what the card names.

    • DraftChangesPanel acts on each draft's member through the by-name doors' ?member=.
    • CommitTimeline shows the member where an item carries one.
    • Read the key and its presence rule from the spec at the installed version, and re-measure the line anchors at that time.

    Triage's priority:p2 (6132422278) stands.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Restart: pm:on-hold → pm:queue · domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z

    The held condition is met. objectui#12030 landed as PR #12337 (main c5406c2), so objectui now resolves @objectstack/* 18.0.0-next.0. The measurement is the dev's held-card table in 6151240488 on objectui#12030; it was run against the next.0 tarball and the installed tree, with 17.7.0 as the negative control.

    • The probe as written cannot exit 0: its fixture omits label, which ListDraftsResponseSchema requires (drafts.0.label invalid_union). It is rewritten under ruling A in ACCEPT 6151458792 on objectui#12030.

    Restart-when (rewritten, met): from apps/console, ListDraftsResponseSchema parses a response whose draft carries a member AND the required label (for example label: 'X').

    • It exits 0 on next.0.
    • With label, it exits 1 on 17.7.0, so it is a real negative control.

    The card returns to pm:queue for its lane with its grade unchanged. ⛔ Not a claim. Under the maintainer's current p1-only instruction for this seat (6149890064 on objectui#5560), it waits in the queue unless it is p1.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12271-draft-member
    Worktree: objectui-issue-12271
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/app-shell/src/preview/DraftChangesPanel.tsx, packages/app-shell/src/preview/CommitTimeline.tsx, any request helper inside packages/app-shell/src/preview/ they already use, their tests, the strings these two components already use if a member label needs one, and a .changeset/ entry. ⛔ Not packages/data-objectstack/src/metadata-client.ts (objectui#12335 waits on it): if the by-name doors need a client change, stop and report (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: 6159878101
    Serial constraints cleared: none. In flight: objectui#12349 (StudioDesignSurface.tsx, flow previews, metadata-admin/i18n.ts), objectui#12390 (flow inspectors / previews), disjoint from app-shell/src/preview/. objectui#12394 and objectui#12395 (plugin-grid, components) await CI.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12271,
      "status": "done",
      "branch": "claude/issue-12271-draft-member",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12400",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
      "premise_still_valid": true,
      "summary": "Implemented in packages/app-shell/src/preview. fetchPendingDrafts now carries the served member onto each entry. DraftChangesPanel keys rows on type+name+member, passes the entry's member as member= on the drill-in's published and draft by-name reads, classifies a member entry NEW/UPDATE by its own published by-name read with member= (the name list says only that the name is published), and shows the member beside the name. An entry without member sends no selector. fetchCommits keeps items that carry member, and CommitTimeline lists them as type/name · member; a member-less commit renders as before. Key and presence rule were read from the installed @objectstack/spec 18.0.0-next.1 (ListDraftsResponseSchema.drafts[].member and ListPackageCommitsResponseSchema.commits[].items[].member, both optional strings). A1 was partly disproved: the panel has no per-entry publish or discard action. Publishing is the host's usePublishAllDrafts, outside this file surface (see findings). A2 held. For A3, no panel door goes through metadata-client.ts, so that file is untouched. Clause-② no holds: none of the touched types or components is exported from @object-ui/app-shell's index. No labels were written, because the dispatch named none and objectui has no label reader for this.",
      "tests": "At tree 8b5b0b49c. (1) Under the lock: pnpm exec vitest run packages/app-shell/src/preview/ gave 'Test Files 21 passed (21) / Tests 153 passed (153)', VERDICT command-exit 0. (2) The 7 new cases ran verbose with --maxWorkers=1, outside the lock (declared narrowing): 7 passed. (3) Ablation via objectstack scripts/ablation-replace.mjs: replaced the member= push in fetchItemBody (anchor x1 -> x0, blob cc71e34a1a44 -> 5c7b08b83b38). Result 'Tests 3 failed | 4 passed (7)': red were classification, zh-CN drill-in and en-US drill-in, the predicted direction; green were row identity, the no-member case and both timeline cases, as expected. Restore: blob == HEAD cc71e34a1a44 and git diff HEAD empty. No build/dist leg, because the tests import src relatively. (4) Gates, all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, plus node scripts/check-changeset-fixed.mjs and check-changeset-presence.mjs. (5) eslint narrowed to the 6 changed files: exit 0, 6 files from --format json, 0 errors, 4 warnings. The base blobs at 28fb2a001 carry the same 2+1+1 warnings. eslint.config.js has no type-aware parserOptions, so the diff cannot move an untouched file's verdict. The population is the 6 changed files, not read from eslint's config: a narrowed lint, not a full measurement. NOT MEASURED: app-shell type-check (closure build), reason: three 9-minute lock waits returned exit 99 behind holder pid 29039 (objectui-issue-12390 worktree, full packages/app-shell/ vitest run, held over 31 minutes). NOT MEASURED: the full app-shell vitest project, same reason. Both declared to CI. check:spec-floors was not run (known red on main, objectui#12334).",
      "mcp_calls": "0",
      "api_writes": "3: git push (branch, 2 pushes; not REST); fleet-write relay pr_create (POST /repos/objectstack-ai/objectui/pulls, then POST .../issues/12400/assignees) = 1 dispatch; fleet-write relay comment (POST /repos/objectstack-ai/objectui/issues/12271/comments, this report) = 1 dispatch",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: objectui#12335 (the PR that touches packages/data-objectstack/src/metadata-client.ts) · noted, not filed. Package-less member publish: usePublishAllDrafts (preview/usePublishAllDrafts.ts) maps client.listDrafts rows to type/name/packageId, dropping member, and publishes a package-less draft by client.publishDraft(type, name). MetadataClient.publishDraft takes no member, so a package-less zh-CN email_template draft would publish the canonical member. Read-only inference, not reproduced through a public door. Package-bound drafts use the batch door and are unaffected. Dedupe words: publishDraft member, package-less email_template publish, usePublishAllDrafts member, bundle member publish",
        "carrier: PM (lock) · noted, not filed. Verify-lock holder pid 29039, cwd /home/user/objectui-issue-12390, ran 'pnpm exec vitest run --maxWorkers=2 packages/app-shell/' and held the lock for over 31 minutes (still ALIVE at 2026-10-15T00:38Z), so this card's type-check and full-project run never acquired the lock."
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — objectui PR #12400 · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T00:51Z

    Reviewed on GitHub at head 8b5b0b4, against triage's direction (6132422278), the restart's renderer work (6159878101) and the claim (6181001229), not against the dev's report.

    • Shape: the PR is a draft against main. Its body opens Fixes #12271, the only closing keyword, followed by Clause-②: no. The governed sweep reads NOT governed, 436 lines (+426 / −10), 7 files, all inside packages/app-shell/src/preview/ plus the changeset. metadata-client.ts is untouched.
    • Key and presence rule from the installed spec: ListDraftsResponseSchema.drafts[].member and ListPackageCommitsResponseSchema.commits[].items[].member, both optional strings in @objectstack/spec 18.0.0-next.1.
    • DraftChangesPanel: rows are keyed on type + name + member. The drill-in's published and draft by-name reads carry member= when the entry has one. A member entry is classified NEW / UPDATE by its own published by-name read with member=, so the canonical body is never used for both members. The member is shown beside the name. An entry without member sends no selector and behaves as before.
    • CommitTimeline: fetchCommits keeps an item's member, and the timeline lists it as type/name · member. A member-less commit renders as before.
    • A1, partly disproved: the panel has no per-entry publish or discard; publishing is the host's usePublishAllDrafts. That hook drops member and publishes a package-less draft by type and name, and MetadataClient.publishDraft takes no member. The seat confirmed both readings on main and filed console: "Publish all" drops a draft's bundle member — a package-less email_template language draft is published by type and name only, so the wrong member (or none) is published (the publish half of objectui#12271) #12402, with a serial note against metadata-client: reset() cannot name a package — after objectstack#23165 a console reset or discard of an item two packages hold answers 409, and the remedy ?package= is one the console cannot send #12335 on metadata-client.ts.
    • Ablation: removing the member= push in fetchItemBody fails 3 of the 7 new tests (classification and both drill-ins); the row-identity, no-member and timeline cases stay green, as expected. Restore was proven by blob hash.
    • Changeset: @object-ui/app-shell: patch.
    • Evidence: the preview project, run under the lock, has 21 files and 153 tests green. The battery and lint, narrowed to the changed files, exit 0. NOT MEASURED locally, as declared: the app-shell type-check and the full app-shell project, because three lock waits timed out behind another card's full run. CI's Type Check and all 12 test shards cover both, and are read below.
    • CI at head: 30 success, 3 skipped, 0 failures (filter=latest), Type Check and all 12 test shards included.

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T01:06Z


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions