Repository navigation
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
Description
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_proposedenvelope (the 确认修改 card):posture(draftorpublish, with the live record count);primaryAction:save_draftorconfirm;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 throughlistDrafts, the same source as Studio's 变更 badge, plusotherswhen 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 noappliedCardlines.packages/plugin-chatbot/src/mapMessages.ts:440-458:detectProposedChangeskeeps onlysummaryand each row's verb, object, field, type, name and details.:496-528:detectReplayOutcomekeeps onlykind,packageIdandpublishFailed. 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(存为草稿 forsave_draft). - The applied card draws
appliedCard.titleand its lines, plus 查看变更并发布 and 撤销. - 撤销 calls the existing server door
POST /api/v1/packages/:id/discard-drafts(framework runtimedomains/packages.ts, protocoldiscardPackageDrafts, at framework pinbe076dad28a0). That door discards every pending draft of the package. WhendraftState.othersis 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
objectstack-fleet commentedon Oct 17, 2026
Triage:
pm:blockedon objectstack-ai/cloud#2974 · p2 ·area:ai·domain:ui· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T14:59ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
origin/maind2b21a1225: the renderer still cannot draw the posture.packages/plugin-chatbot/src/ChatbotEnhanced.tsx:1578setschangesConfirmLabel = 'Confirm'as a host prop.mapMessages.tsdetectProposedChanges(:484) anddetectReplayOutcome(:540) keep none ofprimaryAction,appliedCardordraftState.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 theBlocked-by:line now in the body. If objectstack-ai/cloud#2974 closes unmerged, triage re-reads the card against whatever replaced it.primaryAction;appliedCard, plus 查看变更并发布 and 撤销;draftState.othersis non-zero, becausediscard-draftsdrops every pending draft of the package;mapMessages.ts.domain:ui(packages/plugin-chatbot).Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Pointer ·
domain:engineseat 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 (
1e001c7dfon objectstackmain).POST /api/v1/packages/:id/publish-draftswith{ backfill: [{ object, field }] }, or the SDK callpackages.publishDrafts(id, { backfill }).defaultValue(a runtime token or an expression is refused too), and an unknown object are each answered400 VALIDATION_ERRORatbackfill.N, and the draft stays pending.backfillApplied { success, fields: [{ object, field, updated, error?, code? }] }.updatedcounts the rows written as the caller; a failure midway stops that field with its count so far pluserrorandcode, and the publish stands.ADD COLUMNalready fills existing rows, soupdatedcan truthfully read 0.The objectui release that renders this needs an objectstack pin at or past
1e001c7df.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
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) givesapply_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;findingremoved (graded p2 by the triage seat,6235420694)Session:
session_01Cbdek8SKSHxddGqTPZXdqXAccount:
os-zhuangBranch:
claude/issue-12894-copilot-draft-cardWorktree:
objectui-issue-12894Domain:
domain:uiSeat:
repo:cloud#2(seat post objectstack-ai/objectstack#24145; on the maintainer's order above)File surface:
packages/plugin-chatbot/src/mapMessages.ts(detectProposedChanges/detectReplayOutcomekeepposture,primaryAction, the rows'details,draftState,existingRowsandappliedCard),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 · ⛔ notpackages/app-shell/**(objectui#12725's phase 5 is in flight there and inChatDock.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 inplugin-chatbot. objectui#12725's phase 5 (claim6247127663) holdsapp-shelland stays out ofplugin-chatbot. The backfill control (补默认值, objectstack-ai/objectstack#24253 landed as1e001c7df, pointer6247510007) is #12929's and not this claim's.Why
Clause-②: yes:@object-ui/plugin-chatbot's entry exportsProposedChangesandReplayOutcome. Keeping the new keys widens them, so aTIER_DEFAULTcontract review is owed before landing.objectstack-fleet commentedon Oct 18, 2026
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
objectstack-fleet commentedon Oct 18, 2026
ACCEPT → PR #12951 comment 6248461232 · contract review 6248455960 (
TIER_DEFAULT, PASS) ·repo:cloud#2· sessionsession_01Cbdek8SKSHxddGqTPZXdqX· 2026-10-18T09:53Z. The PR's first line is corrected toPart of #12894: the two host doors (onReviewDrafts,onDiscardDrafts) reach no console untilapp-shell'sChatPanepasses them. Ready and auto-merge in this act (heada1601be5). This card stays open for the console wiring, dispatched after objectui#12725's phase 5.objectstack-fleet commentedon Oct 18, 2026
LANDED (
Part of) ·repo:cloud#2· sessionsession_01Cbdek8SKSHxddGqTPZXdqX· 2026-10-18T10:11Z ·pm:dispatched→pm:blocked, assignee released (no work in flight)origin/main3da39ae4(PR #12951), through the merge queue; the merge commit names no modelposture,primaryAction,draftState,existingRows,appliedCard). Change card v2: 「修改方案 · N 项」, one row per change, the amber posture note, and 存为草稿 onsave_draft. The applied card: its title and lines, plus 查看变更并发布 and 撤销 behind the host doorsonReviewDrafts/onDiscardDrafts; 撤销 asks with the counts when other drafts are pending6248455960(TIER_DEFAULT, PASS) and ACCEPT6248461232What is left on this card: the console wiring.
app-shell'sChatPane(AiChatPage.tsx) passesonDiscardDrafts(adiscard-draftscall) andonReviewDrafts.StudioDesignSurfacechangesOpen).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-shellround, after PR #12952 (phase 5, the same files) lands.Blocked-by: #12952
1 remaining item
objectstack-fleet commentedon Oct 18, 2026
Unlocked ·
repo:cloud#2· sessionsession_01Cbdek8SKSHxddGqTPZXdqX· 2026-10-18T10:13Z ·pm:blocked→pm:queue· theBlocked-by:PR #12952 (objectui#12725 phase 5,app-shell) mergedThe console wiring dispatches together with objectui#12725's next
app-shellround (its LANDED lists the four items), at this seat's next free slot.objectstack-fleet commentedon Oct 18, 2026
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:dispatchedSession:
session_01Cbdek8SKSHxddGqTPZXdqXAccount:
os-zhuangBranch:
claude/issue-12725-copilot-composer-wiringWorktree:
objectui-issue-12725fDomain:
domain:uiSeat:
repo:cloud#2File surface:
app-shell'sChatPanepassesonReviewDrafts/onDiscardDrafts, and a navigation opens Studio's 变更 drawer; as objectui#12725's phase-6 claim lists itContainer & model: as that claim
Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6248639424
Serial constraints cleared: PR #12951 (this card's renderer half) and PR #12952 landed.
objectstack-fleet commentedon Oct 18, 2026
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
objectstack-fleet commentedon Oct 18, 2026
ACCEPT → PR #12964 comment 6250302531 ·
repo:cloud#2· sessionsession_01Cbdek8SKSHxddGqTPZXdqX· 2026-10-18T13:17Z. Ready and auto-merge in this act (heada1babb11).Fixes #12894closes this card on merge: the applied card's 查看变更并发布 opens Studio's 变更 drawer, and 撤销 discards the package's drafts.objectstack-fleet commentedon Oct 18, 2026
LANDED ·
repo:cloud#2· sessionsession_01Cbdek8SKSHxddGqTPZXdqX· 2026-10-18T13:34Z · closedcompletedbyFixes #12894·pm:dispatchedremoved, assignee releasedorigin/main43efd078(PR #12964), through the merge queue; the merge commit names no modelChatPanepasses 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'spackages.discardDrafts, showing the server's reason for a draft it could not drop. Either way the 变更 badge re-reads6250302531; this card's pointer6250387349The renderer half landed earlier as PR #12951 (
3da39ae4). The pending-drafts bar that covers the copilot composer is objectui#12965.