Skip to content

Studio copilot card: draw the draft posture the tool now sends — 存为草稿 as the primary action, the applied card's lines, and 撤销 through discard-drafts (cloud#2924) #12894

Closed

Description

@objectstack-fleet

Blocked-by: objectstack-ai/cloud#2974 (the envelope this card maps; back in draft while objectstack-ai/cloud#2924 waits on the maintainer — recorded by the triage seat)

Filing gate ②: a ruling's follow-up whose renderer half lives here. Filed by repo:cloud seat 2 (seat post objectstack-ai/objectstack#24145, session session_01Cbdek8SKSHxddGqTPZXdqX) from the cloud#2924 dev's report (on objectstack-ai/cloud#2924; cloud PR objectstack-ai/cloud#2974 carries the tool half). ⛔ Not a claim; no assignee. Grading is triage's.

Pull (ruled): objectstack-ai/cloud#2924, the maintainer's 「同意」 on the StudioCopilot artboard (objectui commit 23ef817aa, docs/design/ai-build-2026-10-16/artboards/StudioCopilot.*): a copilot change to an app that is published and holds records is saved as a Studio draft. The change card's primary button reads 存为草稿, with the note 「这个应用已上线,有 N 条记录在用。改动先存为草稿;画布和右侧属性里能看到效果,你在「变更」里核对后再发布」. The applied card offers 查看变更并发布 and 撤销 (which reverts the draft). One row is drawn per change.

Reader who acts: the lane that owns packages/plugin-chatbot (one dev round). cloud#2924 stays open (Part of) until this renders at cloud's objectui pin.

Dedupe: REST enumeration of this repository's issues updated since 2026-08-15 (735 issues; control objectui#12294 found), grepped for changesConfirmLabel, detectProposedChanges, detectReplayOutcome, primaryAction, 存为草稿, discard-drafts, appliedCard, copilot … draft|撤销. One hit, objectui#12725, which is about the copilot's right-slot layout, not this card. Not this.

What the tool sends now (cloud PR #2974, packages/service-ai-studio)

  • On the changes_proposed envelope (the 确认修改 card):
    • posture (draft or publish, with the live record count);
    • primaryAction: save_draft or confirm;
    • summary, which carries the ruled note in the user's language;
    • one row per change, each with details (label, default, required).
  • On the applied (drafted) envelope:
    • draftState (the package's pending drafts, read through listDrafts, the same source as Studio's 变更 badge, plus others when the package holds drafts beyond this change);
    • existingRows;
    • appliedCard: { title, lines }, for example 「已存为草稿 · 2 项未发布」 / 「已有 12 条记录的续借次数为空」 / 「核对:结构 ✓」.

What the renderer draws at cloud's objectui pin ef71a09f9e5f

  • packages/plugin-chatbot/src/ChatbotEnhanced.tsx:1570: changesConfirmLabel = 'Confirm' is a host prop, drawn at :3168. No envelope field can make the primary button read 存为草稿.
  • :3068-3089: the drafted outcome draws a badge and a publish button only. There is no 撤销 and no appliedCard lines.
  • packages/plugin-chatbot/src/mapMessages.ts:440-458: detectProposedChanges keeps only summary and each row's verb, object, field, type, name and details. :496-528: detectReplayOutcome keeps only kind, packageId and publishFailed. The new fields are dropped before render.
  • Today the note renders, but only because it rides in summary.

Wanted

  • The change card's primary label follows primaryAction (存为草稿 for save_draft).
  • The applied card draws appliedCard.title and its lines, plus 查看变更并发布 and 撤销.
  • 撤销 calls the existing server door POST /api/v1/packages/:id/discard-drafts (framework runtime domains/packages.ts, protocol discardPackageDrafts, at framework pin be076dad28a0). That door discards every pending draft of the package. When draftState.others is non-zero, the button must say so before it runs.
  • Done when the mappers keep the new fields, pinned by tests beside mapMessages.ts, and a render of a drafted outcome shows the title, the lines and both actions.

Dedupe words: copilot card primaryAction save_draft, applied card 撤销 discard-drafts, changes card appliedCard existingRows draftState.

Activity

  1. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: pm:blocked on objectstack-ai/cloud#2974 · p2 · area:ai · domain:ui · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T14:59Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Fresh read on objectui origin/main d2b21a1225: the renderer still cannot draw the posture.
      • packages/plugin-chatbot/src/ChatbotEnhanced.tsx:1578 sets changesConfirmLabel = 'Confirm' as a host prop.
      • mapMessages.ts detectProposedChanges (:484) and detectReplayOutcome (:540) keep none of primaryAction, appliedCard or draftState.
    • Grade p2. This is a ruled follow-up: the renderer half of the maintainer's 「同意」 on cloud#2924's StudioCopilot artboard.
    • Blocked on objectstack-ai/cloud#2974. That PR defines the envelope this card maps, and it is back in draft. At 14:49Z, cloud#2924 went back to needs-user-decision: the draft posture skips cloud#1586's in-place boolean backfill, and the maintainer must say what lands first. The envelope's shape may change with that ruling, so this card waits for objectstack-ai/cloud#2974 to close. The unlock scan reads the Blocked-by: line now in the body. If objectstack-ai/cloud#2974 closes unmerged, triage re-reads the card against whatever replaced it.
    • Scope when released (the card's Wanted):
      • the primary label follows primaryAction;
      • the applied card draws appliedCard, plus 查看变更并发布 and 撤销;
      • 撤销 says so before it runs whenever draftState.others is non-zero, because discard-drafts drops every pending draft of the package;
      • the mapper tests sit beside mapMessages.ts.
    • Lane: domain:ui (packages/plugin-chatbot).

    Generated by Claude Code

  2. added
    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drives
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 17, 2026
  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer · domain:engine seat 1 (objectstack seat post #6367) · session_01JtSQQ3EWsbNPzyYMug1tXy · 2026-10-18T08:13Z. ⛔ Not a claim.

    The platform half of this card has landed: objectstack-ai/objectstack#24253, as PR objectstack-ai/objectstack#24269 (1e001c7df on objectstack main).

    • Request: POST /api/v1/packages/:id/publish-drafts with { backfill: [{ object, field }] }, or the SDK call packages.publishDrafts(id, { backfill }).
    • Refusals: every entry is judged before anything is promoted. A field the draft does not add, a field without a literal defaultValue (a runtime token or an expression is refused too), and an unknown object are each answered 400 VALIDATION_ERROR at backfill.N, and the draft stays pending.
    • Response: backfillApplied { success, fields: [{ object, field, updated, error?, code? }] }. updated counts the rows written as the caller; a failure midway stops that field with its count so far plus error and code, and the publish stands.
    • For the 补默认值 control: offer it only for a field with a literal default. On the SQL driver ADD COLUMN already fills existing rows, so updated can truthfully read 0.

    The objectui release that renders this needs an objectstack pin at or past 1e001c7df.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R4 (batch 3) · 2026-10-18T08:41Z · unlocked: the Blocked-by: objectstack-ai/cloud#2974 merged (f9e45145, ruling A on cloud#2924), and cloud PR #3004 (1e3e04f8) gives apply_blueprint's extend mode the same envelope · carries #12725's item 4 (change card v2, the same card), on the maintainer's order in this seat's chat, 2026-10-18: 「objectui #12724 和 #12725 你也负责派发。」 · pm:blocked → pm:dispatched; finding removed (graded p2 by the triage seat, 6235420694)
    Session: session_01Cbdek8SKSHxddGqTPZXdqX
    Account: os-zhuang
    Branch: claude/issue-12894-copilot-draft-card
    Worktree: objectui-issue-12894
    Domain: domain:ui
    Seat: repo:cloud#2 (seat post objectstack-ai/objectstack#24145; on the maintainer's order above)
    File surface: packages/plugin-chatbot/src/mapMessages.ts (detectProposedChanges / detectReplayOutcome keep posture, primaryAction, the rows' details, draftState, existingRows and appliedCard), packages/plugin-chatbot/src/ChatbotEnhanced.tsx (the change card's primary label, rows and posture note; the applied card's title, lines, 查看变更并发布 and 撤销), packages/i18n/src/locales/*, tests beside each, a changeset · ⛔ not packages/app-shell/** (objectui#12725's phase 5 is in flight there and in ChatDock.tsx), so the copilot composer's context chip and placeholder (item 4's last line) wait for that phase (stop on breach; explain in the report)
    Container & model: M (two mappers keep declared keys; two card states render them), mode:subagent, model: default judgment tier (the seat's per-card call)
    Clause-②: yes
    Responsibility: n/a — not a defect card (a ruled follow-up's renderer half)
    Thread-read: 6247510007
    Serial constraints cleared: #12724's phase 2 (PR #12947, 44cb469d) landed in plugin-chatbot. objectui#12725's phase 5 (claim 6247127663) holds app-shell and stays out of plugin-chatbot. The backfill control (补默认值, objectstack-ai/objectstack#24253 landed as 1e001c7df, pointer 6247510007) is #12929's and not this claim's.

    Why Clause-②: yes: @object-ui/plugin-chatbot's entry exports ProposedChanges and ReplayOutcome. Keeping the new keys widens them, so a TIER_DEFAULT contract review is owed before landing.

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12894,
      "status": "done",
      "branch": "claude/issue-12894-copilot-draft-card",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12951",
      "session": "session_01Cbdek8SKSHxddGqTPZXdqX",
      "premise_still_valid": true,
      "summary": "Draft PR #12951 (head a1601be5, base main, assignee os-zhuang, first lines Fixes #12894 / Part of #12725 / Clause-②: yes). The mappers keep only the keys cloud#2924 declares: detectProposedChanges keeps posture and primaryAction, and detectReplayOutcome keeps draftState, existingRows and appliedCard on a drafted replay. A value missing its declared required members is dropped whole, and an absent key leaves the old shape. ChatbotEnhanced draws change card v2 (ChangePlanBody) when the envelope carries the posture: 「修改方案 · N 项」, one row per change (+/✎/- symbol, kind, object · field, type and details in mono small type), the summary as an amber note on posture draft, and 存为草稿 on save_draft (the host label on confirm; the sent message is unchanged). The applied card (AppliedDraftCard) draws appliedCard.title and its lines, 查看变更并发布 through a new onReviewDrafts door, and 撤销 through a new onDiscardDrafts door. 撤销 says so and asks with the counts whenever draftState.others is above 0, there is no draftState, or the host's live fetchPendingDraftCount reads more drafts than this change staged. Measured: neither door reaches the console without packages/app-shell (the seam is below), so in the console today the applied card draws its title and lines and keeps the old inline Publish button. The dispatch's stop rule applied to both buttons, not only to 查看变更并发布.",
      "chain": [
        "producer, cloud 1e3e04f8 packages/service-ai-studio: metadata-tools.ts changesProposedEnvelope (posture via postureEnvelope, primaryAction, summary = authoring-copy confirmChangeAsDraft) and describeLandedChange (draftState via change-posture.ts readDraftState, existingRows, appliedCard via savedAsDraft / existingRowsEmpty / checkedStructure); rows from confirm-gate.ts describeEditOps / describeChange, details = changeParams",
        "lift: objectui packages/plugin-chatbot/src/mapMessages.ts detectProposedChanges (changePostureOf) and detectReplayOutcome (draftStateOf, existingRowsOf, appliedCardOf); called by uiMessageToChatMessage (live) and by app-shell AiChatPage's hydration mapper (unchanged; it calls the same detectors)",
        "render: packages/plugin-chatbot/src/ChatbotEnhanced.tsx isChangePlanV2 then ChangePlanBody (useChangeKindLabel), the primary label (primaryAction save_draft then the chatbot.changes.saveDraft key), and in the replay-outcome branch AppliedDraftCard with requestDiscardDrafts / runDiscardDrafts (state discardByToolCall)",
        "server door for 撤销: framework pin be076dad28a0 packages/runtime/src/domains/packages.ts POST /packages/:id/discard-drafts, then metadata-protocol discardPackageDrafts, which discards every listDrafts row of the package and returns success, discardedCount, failedCount, discarded, failed",
        "seam, not edited (stop rule): packages/app-shell/src/console/ai/AiChatPage.tsx ChatPane must pass onDiscardDrafts (MetadataClient has no discardPackageDrafts; PackagesPage discardDrafts uses a bare fetch to discard-drafts) and onReviewDrafts; packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx changesOpen is component state with no URL parameter or bus, so no navigation can open Studio's 变更 today (onDesignBuiltApp only goes to /studio/PKG/interfaces)"
      ],
      "items": [
        "change card, primary label follows primaryAction: DRAWN (存为草稿 / Save as draft on save_draft; host changesConfirmLabel on confirm; 调整 unchanged; outbound changesConfirmMessage unchanged because 「存为草稿」 alone does not match cloud PROPOSAL_APPROVAL_RE)",
        "change card, posture note in amber: DRAWN (summary in an amber note when posture.mode is draft; plain text otherwise)",
        "change card, one row per change (symbol, kind, object · field, machine name and parameters in small type): DRAWN (a removal row draws - in red, which is not on the artboard; a metadata type without a pack word renders as its machine name)",
        "change card, header 「修改方案 · N 项」: DRAWN (count family in all ten packs)",
        "applied card, appliedCard.title and lines: DRAWN",
        "applied card, 查看变更并发布: DRAWN behind the new host door onReviewDrafts(packageId), and tested. NOT REACHABLE in the console without app-shell (seam above). Without the door, the old inline Publish button (onPublishDrafts) keeps its place",
        "applied card, 撤销 through discard-drafts: DRAWN behind the new host door onDiscardDrafts(packageId), with the others warning and the confirm naming the counts, and tested. NOT REACHABLE in the console without app-shell: 机制假设 3 is falsified, because the chat has no authenticated fetch of its own and the publish it mirrors is a host door wired in ChatPane",
        "mappers keep the declared keys only and degrade per key: DONE (pinned beside mapMessages.ts)",
        "NOT DRAWN by the dispatch's exclusion: the composer chip 「借阅看板 ×」 and placeholder (objectui#12725 phase 5), 补默认值 (objectui#12929; existingRows is kept for it), the 变更 badge (phase 5). NOT DRAWN, no key: the artboard's 「等待确认」 and 「未发布」 chips"
      ],
      "tests": "All at a1601be5 (after merging main 0707b4ae), each through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-ou12894, VERDICT command-exit 0. (1) pnpm exec vitest run --maxWorkers=2 packages/plugin-chatbot/: Test Files 68 passed (68), Tests 711 passed (711); git ls-files counts 68 tracked test files. (2) pnpm exec vitest run --maxWorkers=2 packages/i18n/: Test Files 83 passed (83), Tests 1325 passed and 13 skipped (1338); 83 tracked. New: mapMessages.changePosture-12894.test.ts and ChatbotEnhanced.changeCardV2-12894.test.tsx, 32 tests together, all through the real mapper from raw tool parts on fixtures/changePosture.fixtures.ts (the producer's envelopes, read at cloud 1e3e04f8). ABLATION (one, on a mapper) via /home/user/objectstack/scripts/ablation-replace.mjs in wrap mode on the committed tree: anchor '...(primaryAction ? { primaryAction } : {}),' deleted from detectProposedChanges (anchor 1 to 0, blob 1b39ebbf to bd565dbe). The two new suites went red: 6 failed and 26 passed (32), four mapper cases and the zh and en render cases, where the button read 确认修改 / Confirm. Restore: blob after restore 1b39ebbf equals the HEAD blob, git diff HEAD empty, and the anchor count back to 1 by hand. No dist involved: the suites import mapMessages and ChatbotEnhanced relatively.",
      "gates": "Local at a1601be5, exit codes captured before any pipe. Through the lock: plugin-chatbot type-check 0, i18n type-check 0, plugin-chatbot lint 0 (87 warnings, 0 errors), i18n lint 0 (33 warnings, 0 errors), and none of the 120 warnings on an added line (diff-mapped). tsc -p tsconfig.test.json --listFiles lists 68 chatbot test files, the 2 new ones and the fixture among them. Lock-free, each exit 0: check:i18n-keys, check:i18n-drift (0 en values changed, 25 keys added), check:i18n-dead-keys (none of the new keys listed), check:i18n-designer-parity, check:new-line-citations (0 new), check:control-bytes, check:test-path-roots, check:unreferenced-sources, check:phantom-deps, check:unused-deps, check:self-import, check:published-tsconfig-exclude, check:changeset-claims, check:pending-changeset-literals, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:shell-escape-residue, check:comment-mask-corpus, check:lint-rule-coverage, check:spec-symbols, check:esm-specifiers, check:handler-key-reads, check:registry-bare-names, check:doc-fences, check:doc-json, check:doc-types, check:icon-record-names, check:action-ref-convention, and the scripts check-changeset-presence (15 source files of 2 released packages, 1 changeset), check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite, check-doc-links, check-doc-expression-carriage, check-type-check-coverage, check-lint-coverage. objectui has no dispatch-gates.mjs, so the list was derived by hand from package.json and .github/workflows. NOT MEASURED: @object-ui/app-shell type-check and suite (the one consumer of the widened types; its closure of 19 unbuilt packages was not built in the shared container; the widening adds optional members only), check:readme-exports and check:eager-locale-catalogues (need dists not built here; no README touched). CI (PR check-runs at a1601be5, read once at report time): 35 runs, 3 success (Changeset Fixed Group Check, label, Changeset Bump Policy), 3 skipped (the coverage pair and dependabot), 29 in_progress (Type Check, Lint, Test shards 1-16, Repo Gates, Build & E2E, Changeset Declaration and others). Their verdicts are the seat's to read.",
      "evidence": "Branch claude/issue-12894-evidence at 25b88b08 (never merged; no PNG in the PR diff): docs/design/findings/12894/ holds zh and en at 1280 px, the change card, the applied card, and 撤销 asking with one other draft pending, each as a card crop and a full page, plus a README with the render method (a temporary console dev-server page, never committed, on the real ChatbotEnhanced, I18nProvider and mapper, in a 360 px slot; faked inputs: the fixture envelopes and the three host doors as no-ops).",
      "deviations": [
        "Mechanism hypothesis 3 is falsified. discard-drafts is not reachable from a chat-side fetch: the chat has none, and publish is the host door onPublishDrafts wired in app-shell ChatPane. Rerouted per the ruling's intent: 撤销 is a host door (onDiscardDrafts) beside a review door (onReviewDrafts). Both are drawn and tested in plugin-chatbot, and neither appears in the console until app-shell wires it. The stop rule's seam therefore covers 撤销 too, not only 查看变更并发布.",
        "Exported types widened (Clause-②): ProposedChanges (+posture, +primaryAction); ReplayOutcome (+draftState, +existingRows, +appliedCard); ChatbotEnhancedToolInvocation (proposedChanges and replayOutcome now reference those two types instead of inline copies, so they widen the same way); ChatbotEnhancedProps (+onReviewDrafts, +onDiscardDrafts). New member interfaces in mapMessages.ts (ChangePosture, ChangeDraftState, PendingDraftItem, ExistingRowsLine, AppliedCard) are not re-exported from the entry. @object-ui/i18n: 25 new chatbot.changes keys (with plural slots) in all ten packs.",
        "A declared narrowing: the app-shell consumer type-check and suite were left to CI (reason in gates).",
        "Unasked: I ran git fetch origin main once in the shared checkout /home/user/cloud, which moved its refs/remotes/origin/main from 24ff557f to a commit that contains 1e3e04f8. Nothing was edited or checked out there; the producer was read by sha with git show.",
        "Judgment calls for the seat's review, made rather than left open: the v2 gate is the presence of posture or primaryAction; a removal draws -; 撤销 also asks first when there is no draftState or the live count is higher; the sent confirm message is unchanged."
      ],
      "mcp_calls": "0",
      "api_writes": "2 relay dispatches as objectstack-fleet[bot] through /home/user/objectstack/scripts/pm/fleet-write/dispatch.mjs: (1) pr_create, which is POST /repos/objectstack-ai/objectui/pulls (draft, read back 14606 bytes sent and stored, identical) plus POST /repos/objectstack-ai/objectui/issues/12951/assignees (os-zhuang); (2) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12894/comments. Zero label, claim or assignee writes on the card. Git pushes, which are not REST: the empty-branch probe, the feature commits, the merged head, and the evidence branch.",
      "open_questions": [
        {
          "question": "Where does the console wiring of the two doors land? It needs ChatPane passing onReviewDrafts and onDiscardDrafts (plus MetadataClient.discardPackageDrafts, or the bare fetch PackagesPage uses), and a way into StudioDesignSurface's changesOpen from a navigation.",
          "options": [
            "A: a sub-issue of objectui#12725, landed with or after its phase 5, which holds app-shell and ChatDock",
            "B: amend phase 5's in-flight claim to include it",
            "C: a separate card after phase 5 lands"
          ],
          "recommendation": "A. Real business need: without it neither 撤销 nor 查看变更并发布 reaches a user in Studio, and the old direct Publish button stays (measured: no host passes either door). Long-term: the doors are host contracts like onPublishDrafts, so wiring belongs in app-shell, not in a chat-side fetch. AI-error axis: an explicit door with a typed outcome beats a chat that fetches on its own. Startup focus: it is the ruled artboard's own item 4, not new scope. Fixes #12894 stays correct because the card's done-when (the mappers plus a render with title, lines and both actions) is met by the renderer half."
        }
      ],
      "out_of_scope_findings": [
        "sub-issue of objectui#12725 for the seat to file (not filed by dev): the console wiring above; seam packages/app-shell/src/console/ai/AiChatPage.tsx ChatPane plus packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx changesOpen; dedupe words: copilot onDiscardDrafts ChatPane, onReviewDrafts Studio changesOpen, applied card undo wiring",
        "carrier: none · noted, not filed: useChatConversation replayOutcomeToCachedResult keeps a minimal replay envelope, so a cache-restored conversation draws the drafted badge, not the applied card (the PR's acceptance notes)",
        "carrier: none · noted, not filed: after a reload an undone applied card offers 撤销 again. The live-count check cannot tell one unrelated pending draft from this change's own, because a count names no items, so that one case runs without asking (the PR's acceptance notes)",
        "carrier: none · noted, not filed: no schema declares the change envelopes (cloud's build-cards.schema.json covers the build cards only), so the fixtures copy the producer's source rather than a vendored contract"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12951 comment 6248461232 · contract review 6248455960 (TIER_DEFAULT, PASS) · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T09:53Z. The PR's first line is corrected to Part of #12894: the two host doors (onReviewDrafts, onDiscardDrafts) reach no console until app-shell's ChatPane passes them. Ready and auto-merge in this act (head a1601be5). This card stays open for the console wiring, dispatched after objectui#12725's phase 5.

  7. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED (Part of) · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T10:11Z · pm:dispatched → pm:blocked, assignee released (no work in flight)

    reading value
    origin/main 3da39ae4 (PR #12951), through the merge queue; the merge commit names no model
    what landed the renderer half. The mappers keep cloud#2924's declared keys (posture, primaryAction, draftState, existingRows, appliedCard). Change card v2: 「修改方案 · N 项」, one row per change, the amber posture note, and 存为草稿 on save_draft. The applied card: its title and lines, plus 查看变更并发布 and 撤销 behind the host doors onReviewDrafts / onDiscardDrafts; 撤销 asks with the counts when other drafts are pending
    records contract review 6248455960 (TIER_DEFAULT, PASS) and ACCEPT 6248461232

    What is left on this card: the console wiring.

    • app-shell's ChatPane (AiChatPage.tsx) passes onDiscardDrafts (a discard-drafts call) and onReviewDrafts.
    • A navigation opens Studio's 变更 drawer (StudioDesignSurface changesOpen).

    Until then, the console's applied card draws its title and lines and keeps the old Publish button. It dispatches with objectui#12725's next app-shell round, after PR #12952 (phase 5, the same files) lands.

    Blocked-by: #12952

  8. 1 remaining item

  9. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlocked · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T10:13Z · pm:blocked → pm:queue · the Blocked-by: PR #12952 (objectui#12725 phase 5, app-shell) merged

    The console wiring dispatches together with objectui#12725's next app-shell round (its LANDED lists the four items), at this seat's next free slot.

  10. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R4 (batch 3) · 2026-10-18T10:45Z · the console wiring, carried by #12725's phase 6 dispatch (claim beside this, same branch claude/issue-12725-copilot-composer-wiring), on the maintainer's order 「objectui #12724 和 #12725 你也负责派发。」 · pm:queue → pm:dispatched
    Session: session_01Cbdek8SKSHxddGqTPZXdqX
    Account: os-zhuang
    Branch: claude/issue-12725-copilot-composer-wiring
    Worktree: objectui-issue-12725f
    Domain: domain:ui
    Seat: repo:cloud#2
    File surface: app-shell's ChatPane passes onReviewDrafts / onDiscardDrafts, and a navigation opens Studio's 变更 drawer; as objectui#12725's phase-6 claim lists it
    Container & model: as that claim
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: 6248639424
    Serial constraints cleared: PR #12951 (this card's renderer half) and PR #12952 landed.

  11. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    This card's console wiring is in draft PR #12964 (objectui#12725 phase 6, session session_01Cbdek8SKSHxddGqTPZXdqX); the os-dev-report is #12725 (comment)


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12964 comment 6250302531 · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T13:17Z. Ready and auto-merge in this act (head a1babb11). Fixes #12894 closes this card on merge: the applied card's 查看变更并发布 opens Studio's 变更 drawer, and 撤销 discards the package's drafts.

  13. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T13:34Z · closed completed by Fixes #12894 · pm:dispatched removed, assignee released

    reading value
    origin/main 43efd078 (PR #12964), through the merge queue; the merge commit names no model
    what landed the console wiring. ChatPane passes the applied card's two doors: 查看变更并发布 opens Studio's 变更 drawer through ?changes=review (in place inside the package's Studio, otherwise the package's Interfaces pillar), and 撤销 discards the package's drafts through the SDK's packages.discardDrafts, showing the server's reason for a draft it could not drop. Either way the 变更 badge re-reads
    records ACCEPT on PR #12964 6250302531; this card's pointer 6250387349

    The renderer half landed earlier as PR #12951 (3da39ae4). The pending-drafts bar that covers the copilot composer is objectui#12965.

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

    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions