You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio 变更 drawer: on publish, offer 补默认值 per new field that carries a default, through the protocol's opt-in backfill (ruling A on cloud#2924) #12929
Unblocked: #12971 closed completed when PR #13043 merged as 8aa8e3e1e5 (objectui's pin is now objectstack mainf4755a68a797); re-derived with no new blocker (unlock comment below).
Filed by the director seat (summon #43 continuation 4, session_01QJC7i981TSs9L1CGJK59Ax) on the maintainer's ruling A on objectstack-ai/cloud#2924 (batch #362 item 1, 「其他同意」; the ruling record is that card's Ruled: line), under the maintainer's standing 口径 「平台相关的功能,应该尽量先改平台」: the protocol half is objectstack-ai/objectstack#24253 and lands first. ⛔ Not a claim. Filing gate ①: a ruled design element with a named consumer.
What is measured
The ruled StudioCopilot design (cloud#2924, the maintainer's 「同意」): a copilot change to a live app with records is saved as a Studio draft; the applied card says 「已有 N 条记录的 X 为空,发布时可选补 0」. The console's 变更 drawer publishes through publishPackageDrafts, which today takes no backfill; the card's 「可选补 0」 therefore stays off until this lands.
Scope
In the 变更 drawer, each pending field addition that carries a defaultValue shows an unchecked 「补默认值(N 条已有记录)」 option; publishing passes the checked fields to the protocol's opt-in backfill and shows the per-field count the response returns.
No option for a field without a default; nothing is backfilled unless checked.
Clause-②: no (a drawer control over an existing publish action; no new @object-ui export).
Done when
A test: a draft adding a boolean with a default over N rows publishes with the option checked and the response count N is shown; unchecked, nothing is written.
cloud's applied-card copy may then say 「发布时可选补 0」 (cloud#2924's follow-up, one line).
This card still cannot start honestly. The opt-in backfill on publishPackageDrafts reaches the console only in the first @objectstack/* release that carries 1e001c7df. npm next is 18.0.0-next.3, which does not carry it.
So the body's Blocked-by: line now names chore: version packages (next) objectstack#24168, the Version Packages PR that publishes next.4. That PR is the maintainer's to merge. The dispatching seat confirms next.4 is on npm before the dev starts. The engine seat's note stands: offer 补默认值 only for a literal default.
Claim: PM loop round 1 (priority:p2)
Session: session_014MXhk1yjWh37d634hLy3p7
Account: huangyiirene (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12929-publish-backfill
Worktree: objectui-issue-12929
Domain: domain:ui
Seat: domain:ui#1
File surface: packages/data-objectstack/src/metadata-client.ts (MetadataClient.publishPackageDrafts(packageId) gains the protocol's opt-in backfill, about :1527 of objectui mainbc98626; it sends body: '{}' today), the Studio 变更 drawer and the publish path it calls (packages/app-shell/src/preview/DraftChangesPanel.tsx, and views/studio-design/StudioDesignSurface.tsx about :1448 or preview/usePublishAllDrafts.ts, whichever the drawer's Publish runs), the user-facing strings it adds (@object-ui/i18n packs or the app-shell table, as the drawer already does), tests beside them, and one .changeset/12929-publish-backfill.md. Stop on breach; explain in the report.
Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over this surface reads no path-derived mandate)
Clause-②: yes
Responsibility: n/a — not a defect card (a ruled design element: ruling A on objectstack-ai/cloud#2924, protocol half objectstack-ai/objectstack#24253)
Thread-read: 6269724388
Serial constraints cleared: no open objectui PR touches metadata-client.ts, DraftChangesPanel.tsx, StudioDesignSurface.tsx, usePublishAllDrafts.ts or PackagesPage.tsx (open PRs #13087, #13086, #13085, #13084, file lists read at this claim). Prerequisite re-verified: objectstack 1e001c7df (PR objectstack-ai/objectstack#24269, publishPackageDrafts takes backfill) is an ancestor of objectui's pin f4755a68a797 (git merge-base --is-ancestor, exit 0; control leg ca426cb65d, exit 0). PublishPackageDraftsResponse.backfillApplied is declared at the pin (packages/spec/src/api/protocol.zod.ts:1582).
Why Clause-②: yes, correcting the card body's Clause-②: no: MetadataClient is exported from @object-ui/data-objectstack (src/index.ts:7273), and its publishPackageDrafts takes only packageId today. Passing the protocol's backfill through it adds an option to a published method's accepted input. That widens a published face, whatever the drawer itself adds. The card's line was written before that client existed on the path (it reasoned from "no new @object-ui export").
os-dev-report
{
"issue": 12929,
"status": "done",
"branch": "claude/issue-12929-publish-backfill",
"pr": "#13090",
"session": "session_014MXhk1yjWh37d634hLy3p7 — the harness-stamped Claude-Session id of this run (subagent = the PM's)",
"premise_still_valid": true,
"summary": "MetadataClient.publishPackageDrafts(packageId, options?) (@object-ui/data-objectstack) sends the protocol's opt-in backfill only when given (type picked off @objectstack/client packages.publishDrafts); without it the body stays '{}' byte for byte. The Studio 变更 drawer (DraftChangesPanel) offers an unchecked 「补默认值(N 条已有记录)」 under each field a draft adds to an already-published object whose draft fields map declares a literal defaultValue (spec discriminateDefaultValueShape, the door's own function); N is the console footer probe adapter.find(object, {$top: 0}).total as the caller, shown only when numeric. Publish all passes the checked fields; StudioDesignSurface.doPublish forwards them only when given (an unchecked publish is the exact prior call) and the toast reports backfillApplied per field (updated count, or a warning with the server's error for a field that stopped short). Strings: preview.changes.backfillOption (count family, all ten packs) + backfillOptionNoCount; engine.studio.backfillWritten / backfillStopped (en, zh). Published faces widened: data-objectstack publishPackageDrafts gains an optional 2nd param (type not re-exported from the entry; dist d.ts now type-references ObjectStackClient from @objectstack/client, an existing dependency); app-shell no exported name changes type (DraftChangesPanel is not on the entry, StudioDesignSurface props unchanged); i18n two new key families. H1 holds (only Studio passes onPublish; usePublishAllDrafts/PackagesPage/AiChatPage/PendingDraftsBar unchanged, still '{}'); H2 holds (installed spec declares backfillApplied, client pin parses its fixture against it; R = 18.0.0-next.5); H3 holds; H4: an honest count source exists (protocol counts the zero-row page with the caller's context).",
"tests": "Final union at head ca83ad0, repo-root vitest under os-verify-lock: pnpm --filter @object-ui/data-objectstack test exit 0 — Test Files 97 passed (97), Tests 1179 passed (1179); 26 app-shell files (12 DraftChangesPanel.* + DraftPreviewBar, 12 Studio publish-path files incl. heldPublish-11786 / heldWidgetPublish-11910 / itemDraftLine-12725 that pin the exact publishPackageDrafts(PKG) call, + the new Studio pin) exit 0 — Test Files 26 passed (26), Tests 126 passed (126); packages/i18n/ exit 0 — Test Files 84 passed (84), Tests 1319 passed | 13 skipped. New pins: metadata-client.publishBackfill-12929.test.ts (3), DraftChangesPanel.backfill-12929.test.tsx (10), StudioDesignSurface.publishBackfill-12929.test.tsx (3: checked -> body {"backfill":[{"object":"b2r4_ticket","field":"done"}]} and toast description carries N=12; stopped -> warning with rows + reason; unchecked -> body '{}' and no backfill line). First regression run at 6348eef was red on those three existing pins (call arity publishPackageDrafts(PKG, undefined)); fixed in ca83ad0 by passing options only when given, then green. Ablation at 6348eef via ablation-replace.mjs (anchor x1 -> x0, landed on disk, restore proven blob == HEAD and git diff HEAD empty; suites resolve @object-ui/data-objectstack through the vitest src alias, so no build between mutate and run): (1) client body -> '{}': 3 failed | 3 passed; (2) delete the literal-shape check in backfillCandidates: 6 failed | 4 passed; (3) footer -> void onPublish(): 3 failed | 10 passed. All red in the expected direction.",
"gates": "Local, exit captured to files before any pipe. data-objectstack lint exit 0 (0 errors), type-check exit 0 (at 6348eef; --listFilesOnly includes the new test; package unchanged since). app-shell lint exit 0 (0 errors; one new react-refresh/only-export-components warning on exported backfillCandidates, same kind as existing computeChangeDetail; no warning ratchet in lint.yml), type-check exit 0 (both programs, at ca83ad0; --listFilesOnly lists both new tests). At ca83ad0, exit 0 each: check:i18n-keys, check:i18n-drift (4 pack keys + 2 table keys added, 0 en values changed), check:i18n-designer-parity, check:new-line-citations (0 new), check:control-bytes, check:spec-symbols, check:metadata-write-doors, check:phantom-deps, check:esm-specifiers, check-changeset-{presence,no-major,fixed,claims,overwrite}, check-vi-mock-{inherit,override-shape,specifiers}, check-test-path-roots, check-type-check-coverage. check:i18n-dead-keys exit 0 (report; new keys not listed). check-governed-queue-guard --test over the 18 paths: NOT GOVERNED. dispatch-gates.mjs refuses objectui, so this list is hand-derived from objectui's workflows and manifests (no --ran reconciliation exists for this repo). Not run locally (CI's): full app-shell suite, repo-wide lint, check:eager-closure (needs a console build; NOT MEASURED locally — the diff adds a runtime @objectstack/spec/data import to an eager-graph module, already a runtime import of @object-ui/core and claimed whole by the vendor-objectstack chunk), check:published-dist, check:spec-floors (no floor moves). PR check-runs at ca83ad0 when this report was written: 35 total, 29 in_progress, 3 success, 3 skipped, 0 failed — in_progress.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/13090/assignees (huangyiirene), read back 14020 bytes sent = stored; (2) comment = POST /repos//issues/12929/comments (this report). Plus git push x2 (empty-branch probe, then ca83ad0), not REST. Labels: none written (the PR's path labels are labeler.yml's).",
"deviations": [
"Floor clause not applied: the @objectstack/spec ranges of @object-ui/data-objectstack (^18.0.0-next.1) and @object-ui/app-shell (^18.0.0-next.3) are unchanged. objectui AGENTS.md §9 「依赖与锁文件」 says those ranges act only at objectui's own release and must not be edited to align with the pin; scripts/objectstack-floor.mjs computes every floor at publish from .objectstack-sha as the earliest spec release whose tag contains the pin. R = 18.0.0-next.5 (is-ancestor 1e001c7df vs the next.5 tag commit exit 0; vs next.3 exit 1, control leg next.2-in-next.3 exit 0; next.4 never tagged; npm next = 18.0.0-next.5). The pin f4755a68a797 is after next.5 (next.5 is-ancestor of pin exit 0; pin in next.5 exit 1), so the computed floor will be a release after next.5 and publishing waits for it (that script's exit 2): either way nothing older than R is admitted. Named here as a dispatch-vs-landing-repo conflict rather than picked silently.",
"No new helper module: the receipt formatter lives in StudioDesignSurface.tsx to stay inside the claimed file surface.",
"Design judgement: the choice is offered only for added fields of an already-published object (a never-published object has no existing records); the drawer places it in the drill-in under the + field row, so in the review posture it shows once the row is expanded (the confirm posture expands every row)."
],
"diff": "18 files changed, 949 insertions(+), 24 deletions(-) vs BASE b3007fd: .changeset/12929-publish-backfill.md; packages/data-objectstack/src/metadata-client.ts (+ metadata-client.publishBackfill-12929.test.ts); packages/app-shell/src/preview/DraftChangesPanel.tsx (+ tests/DraftChangesPanel.backfill-12929.test.tsx); packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (+ StudioDesignSurface.publishBackfill-12929.test.tsx); packages/app-shell/src/views/metadata-admin/i18n.ts; packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (read-only inference, no public-door reproduction) — ObjectStackAdapter.normalizeQueryResult answers total as total ?? count ?? records.length, and find returns {data: [], total: 0} for a resource memoised as missing (404): a $top: 0 count read could show a confident 0 if a server omitted total ($count=false, which the console does not send) or for a resource that 404ed earlier in the session. In PR Acceptance notes.",
"carrier: 承接者:无 · noted, not filed (behaviour as specified) — on the SQL driver the column DEFAULT fills existing rows at ADD COLUMN, so backfillApplied.updated truthfully reads 0 while the drawer named N existing records; the spec calls that 0 a complete answer. In PR Acceptance notes."
]
}
os-dev-report
{
"issue": 12929,
"status": "done",
"branch": "claude/issue-12929-publish-backfill",
"pr": "#13090",
"session": "session_014MXhk1yjWh37d634hLy3p7 — the harness-stamped Claude-Session id of this run (subagent = the PM's)",
"premise_still_valid": true,
"summary": "PATCH ROUND 1 (REWORK, one item): .changeset/12929-publish-backfill.md now declares '@object-ui/i18n': minor (was patch). The en pack's new preview.changes.backfillOption family and backfillOptionNoCount widen the published TranslationKeys, which is an additive public-type change. Only that frontmatter line changed (1 insertion, 1 deletion), committed as fe229b7 and pushed; no code change and no merge of main (PR mergeable, state behind, no conflict). Round 0, unchanged: MetadataClient.publishPackageDrafts(packageId, options?) (@object-ui/data-objectstack) sends the protocol's opt-in backfill only when given (type picked off @objectstack/client packages.publishDrafts); without it the body stays '{}' byte for byte. The Studio 变更 drawer (DraftChangesPanel) offers an unchecked 「补默认值(N 条已有记录)」 under each field a draft adds to an already-published object whose draft fields map declares a literal defaultValue (spec discriminateDefaultValueShape, the door's own function); N is the console footer probe adapter.find(object, {$top: 0}).total as the caller, shown only when numeric. Publish all passes the checked fields; StudioDesignSurface.doPublish forwards them only when given (an unchecked publish is the exact prior call) and the toast reports backfillApplied per field (updated count, or a warning with the server's error for a field that stopped short). Strings: preview.changes.backfillOption (count family, all ten packs) + backfillOptionNoCount; engine.studio.backfillWritten / backfillStopped (en, zh). Published faces widened: data-objectstack publishPackageDrafts gains an optional 2nd param (type not re-exported from the entry; dist d.ts now type-references ObjectStackClient from @objectstack/client, an existing dependency); app-shell no exported name changes type (DraftChangesPanel is not on the entry, StudioDesignSurface props unchanged); i18n two new key families. H1 holds (only Studio passes onPublish; usePublishAllDrafts/PackagesPage/AiChatPage/PendingDraftsBar unchanged, still '{}'); H2 holds (installed spec declares backfillApplied, client pin parses its fixture against it; R = 18.0.0-next.5); H3 holds; H4: an honest count source exists (protocol counts the zero-row page with the caller's context).",
"tests": "Patch round 1 changes one changeset frontmatter line, so no test reruns are owed (no code moved). Round 0 readings, which stand for the code at fe229b7: Final union at head ca83ad0, repo-root vitest under os-verify-lock: pnpm --filter @object-ui/data-objectstack test exit 0 — Test Files 97 passed (97), Tests 1179 passed (1179); 26 app-shell files (12 DraftChangesPanel.* + DraftPreviewBar, 12 Studio publish-path files incl. heldPublish-11786 / heldWidgetPublish-11910 / itemDraftLine-12725 that pin the exact publishPackageDrafts(PKG) call, + the new Studio pin) exit 0 — Test Files 26 passed (26), Tests 126 passed (126); packages/i18n/ exit 0 — Test Files 84 passed (84), Tests 1319 passed | 13 skipped. New pins: metadata-client.publishBackfill-12929.test.ts (3), DraftChangesPanel.backfill-12929.test.tsx (10), StudioDesignSurface.publishBackfill-12929.test.tsx (3: checked -> body {"backfill":[{"object":"b2r4_ticket","field":"done"}]} and toast description carries N=12; stopped -> warning with rows + reason; unchecked -> body '{}' and no backfill line). First regression run at 6348eef was red on those three existing pins (call arity publishPackageDrafts(PKG, undefined)); fixed in ca83ad0 by passing options only when given, then green. Ablation at 6348eef via ablation-replace.mjs (anchor x1 -> x0, landed on disk, restore proven blob == HEAD and git diff HEAD empty; suites resolve @object-ui/data-objectstack through the vitest src alias, so no build between mutate and run): (1) client body -> '{}': 3 failed | 3 passed; (2) delete the literal-shape check in backfillCandidates: 6 failed | 4 passed; (3) footer -> void onPublish(): 3 failed | 10 passed. All red in the expected direction.",
"gates": "Patch round 1, at fe229b7, exit captured before any pipe: node scripts/check-changeset-presence.mjs exit 0 ('17 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)'); node scripts/check-changeset-no-major.mjs exit 0; node scripts/check-changeset-fixed.mjs exit 0; pnpm check:changeset-claims exit 0 ('No pending changeset names a file this change touches'). PR check-runs at fe229b7 when written: 10 so far, 5 queued, 4 in_progress, 1 skipped — in_progress. At ca83ad0 (prior head): 35 total, 12 success, 3 skipped, 20 in_progress, 0 failed. Round 0 gates, unchanged for the code: Local, exit captured to files before any pipe. data-objectstack lint exit 0 (0 errors), type-check exit 0 (at 6348eef; --listFilesOnly includes the new test; package unchanged since). app-shell lint exit 0 (0 errors; one new react-refresh/only-export-components warning on exported backfillCandidates, same kind as existing computeChangeDetail; no warning ratchet in lint.yml), type-check exit 0 (both programs, at ca83ad0; --listFilesOnly lists both new tests). At ca83ad0, exit 0 each: check:i18n-keys, check:i18n-drift (4 pack keys + 2 table keys added, 0 en values changed), check:i18n-designer-parity, check:new-line-citations (0 new), check:control-bytes, check:spec-symbols, check:metadata-write-doors, check:phantom-deps, check:esm-specifiers, check-changeset-{presence,no-major,fixed,claims,overwrite}, check-vi-mock-{inherit,override-shape,specifiers}, check-test-path-roots, check-type-check-coverage. check:i18n-dead-keys exit 0 (report; new keys not listed). check-governed-queue-guard --test over the 18 paths: NOT GOVERNED. dispatch-gates.mjs refuses objectui, so this list is hand-derived from objectui's workflows and manifests (no --ran reconciliation exists for this repo). Not run locally (CI's): full app-shell suite, repo-wide lint, check:eager-closure (needs a console build; NOT MEASURED locally — the diff adds a runtime @objectstack/spec/data import to an eager-graph module, already a runtime import of @object-ui/core and claimed whole by the vendor-objectstack chunk), check:published-dist, check:spec-floors (no floor moves). PR check-runs at ca83ad0 when this report was written: 35 total, 29 in_progress, 3 success, 3 skipped, 0 failed — in_progress.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "Patch round 1: 1 relay stroke (POST /repos/objectstack-ai/objectstack/dispatches -> comment = POST /repos//issues/12929/comments, this report) + git push x1 (ca83ad0..fe229b7, not REST). Round 0: 2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/13090/assignees (huangyiirene), read back 14020 bytes sent = stored; (2) comment = POST /repos//issues/12929/comments (this report). Plus git push x2 (empty-branch probe, then ca83ad0), not REST. Labels: none written (the PR's path labels are labeler.yml's).",
"deviations": [
"Floor clause not applied: the @objectstack/spec ranges of @object-ui/data-objectstack (^18.0.0-next.1) and @object-ui/app-shell (^18.0.0-next.3) are unchanged. objectui AGENTS.md §9 「依赖与锁文件」 says those ranges act only at objectui's own release and must not be edited to align with the pin; scripts/objectstack-floor.mjs computes every floor at publish from .objectstack-sha as the earliest spec release whose tag contains the pin. R = 18.0.0-next.5 (is-ancestor 1e001c7df vs the next.5 tag commit exit 0; vs next.3 exit 1, control leg next.2-in-next.3 exit 0; next.4 never tagged; npm next = 18.0.0-next.5). The pin f4755a68a797 is after next.5 (next.5 is-ancestor of pin exit 0; pin in next.5 exit 1), so the computed floor will be a release after next.5 and publishing waits for it (that script's exit 2): either way nothing older than R is admitted. Named here as a dispatch-vs-landing-repo conflict rather than picked silently.",
"No new helper module: the receipt formatter lives in StudioDesignSurface.tsx to stay inside the claimed file surface.",
"Design judgement: the choice is offered only for added fields of an already-published object (a never-published object has no existing records); the drawer places it in the drill-in under the + field row, so in the review posture it shows once the row is expanded (the confirm posture expands every row).",
"Patch round 1: the worktree was removed after round 0, so it was re-created from origin/claude/issue-12929-publish-backfill at ca83ad0 (no install needed for the four changeset scripts) and removed again after the push.",
"Stale PR-body line, for the seat to amend (a dev writes the PR body once and does not PATCH it): in PR #13090's What changes list, the bullet reading '.changeset/12929-publish-backfill.md: data-objectstack minor, app-shell minor, i18n patch.' should end 'i18n minor.'"
],
"diff": "Round 1 adds 1 file changed, 1 insertion(+), 1 deletion(-) (.changeset/12929-publish-backfill.md). Branch total vs BASE b3007fd stays 18 files changed, 949 insertions(+), 24 deletions(-): .changeset/12929-publish-backfill.md; packages/data-objectstack/src/metadata-client.ts (+ metadata-client.publishBackfill-12929.test.ts); packages/app-shell/src/preview/DraftChangesPanel.tsx (+ tests/DraftChangesPanel.backfill-12929.test.tsx); packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (+ StudioDesignSurface.publishBackfill-12929.test.tsx); packages/app-shell/src/views/metadata-admin/i18n.ts; packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (read-only inference, no public-door reproduction) — ObjectStackAdapter.normalizeQueryResult answers total as total ?? count ?? records.length, and find returns {data: [], total: 0} for a resource memoised as missing (404): a $top: 0 count read could show a confident 0 if a server omitted total ($count=false, which the console does not send) or for a resource that 404ed earlier in the session. In PR Acceptance notes.",
"carrier: 承接者:无 · noted, not filed (behaviour as specified) — on the SQL driver the column DEFAULT fills existing rows at ADD COLUMN, so backfillApplied.updated truthfully reads 0 while the drawer named N existing records; the spec calls that 0 a complete answer. In PR Acceptance notes."
],
"head": "fe229b72f187a7032406e3c1d04a066b81d471f1"
}
ACCEPT → PR #13090 comment 6278072404 · contract review 6278057016 (TIER_DEFAULT, declaration face, PASS, head fe229b7) · domain:ui#1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-19T21:44Z. The flip to ready and auto-merge wait for green check-runs on this head.
#13090 merged through the merge queue at 2026-10-19T22:09Z; merge commit 6058bf8, which git merge-base --is-ancestor places on origin/main (exit 0)
queue
no gh-readonly-queue/main/pr-13090-* branch remains
landed content
on origin/main: metadata-client.ts sends backfill only when given (options.backfill !== undefined, 1 hit); DraftChangesPanel.tsx carries export function backfillCandidates (1 hit). Positive control: async publishPackageDrafts is still the one door (1 hit)
records
claim 6277021967 (Clause-②: yes, correcting this card's body line), dev reports (round 0 and patch round 1), contract review 6278057016 (TIER_DEFAULT, PASS), ACCEPT 6278072404
closing
closed completed at 2026-10-19T22:09Z through the PR's Fixes #12929, the only card closed since the merge; pm:dispatched is removed in this act
Follow-up named by this card's body: objectstack-ai/cloud#2924's applied-card copy may now say 「发布时可选补 0」 (cloud's one-line follow-up). It reaches users when cloud's objectui pin moves past 6058bf8.
Activity
objectstack-fleet commentedon Oct 18, 2026
Blocked-by:re-pointed to the release ·pm:blockedstays · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T09:22ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
publishPackageDraftstakes an opt-in per-field backfill of existing rows with the new default, so a copilot draft that adds a field can fill existing records on publish (ruling A on cloud#2924) objectstack#24253 (the protocol half) is closed. It landed as objectstack1e001c7df(PR feat(metadata-protocol): publishPackageDrafts takes an opt-in backfill of new fields' literal defaults, written as the caller objectstack#24269) at 08:11Z.publishPackageDraftsreaches the console only in the first@objectstack/*release that carries1e001c7df. npmnextis18.0.0-next.3, which does not carry it.Blocked-by:line now names chore: version packages (next) objectstack#24168, the Version Packages PR that publishesnext.4. That PR is the maintainer's to merge. The dispatching seat confirmsnext.4is on npm before the dev starts. The engine seat's note stands: offer 补默认值 only for a literal default.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Unlock:
pm:blocked→pm:queue·domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-19T14:31Z⛔ Not a claim.
completedwhen PR chore(deps): build @objectstack/* from objectstack main 2ec6827962 and follow its contract (objectui#12971) #13043 merged as8aa8e3e1e5. objectui's.objectstack-shais now objectstackmainf4755a68a797(18.0.0-next.5).f4755a68a797carries1e001c7df(thepublishPackageDraftsbackfill).Blocked-by:line in the body is replaced with anUnblocked:line in the same act.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 1 (
priority:p2)Session:
session_014MXhk1yjWh37d634hLy3p7Account:
huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12929-publish-backfillWorktree:
objectui-issue-12929Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/data-objectstack/src/metadata-client.ts(MetadataClient.publishPackageDrafts(packageId)gains the protocol's opt-inbackfill, about :1527 of objectuimainbc98626; it sendsbody: '{}'today), the Studio 变更 drawer and the publish path it calls (packages/app-shell/src/preview/DraftChangesPanel.tsx, andviews/studio-design/StudioDesignSurface.tsxabout :1448 orpreview/usePublishAllDrafts.ts, whichever the drawer's Publish runs), the user-facing strings it adds (@object-ui/i18npacks or the app-shell table, as the drawer already does), tests beside them, and one.changeset/12929-publish-backfill.md. Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface reads no path-derived mandate)Clause-②: yes
Responsibility: n/a — not a defect card (a ruled design element: ruling A on objectstack-ai/cloud#2924, protocol half objectstack-ai/objectstack#24253)
Thread-read: 6269724388
Serial constraints cleared: no open objectui PR touches
metadata-client.ts,DraftChangesPanel.tsx,StudioDesignSurface.tsx,usePublishAllDrafts.tsorPackagesPage.tsx(open PRs #13087, #13086, #13085, #13084, file lists read at this claim). Prerequisite re-verified: objectstack1e001c7df(PR objectstack-ai/objectstack#24269,publishPackageDraftstakesbackfill) is an ancestor of objectui's pinf4755a68a797(git merge-base --is-ancestor, exit 0; control legca426cb65d, exit 0).PublishPackageDraftsResponse.backfillAppliedis declared at the pin (packages/spec/src/api/protocol.zod.ts:1582).Why
Clause-②: yes, correcting the card body'sClause-②: no:MetadataClientis exported from@object-ui/data-objectstack(src/index.ts:7273), and itspublishPackageDraftstakes onlypackageIdtoday. Passing the protocol'sbackfillthrough it adds an option to a published method's accepted input. That widens a published face, whatever the drawer itself adds. The card's line was written before that client existed on the path (it reasoned from "no new@object-uiexport").Claimed at: 2026-10-19T20:49Z
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 12929,
"status": "done",
"branch": "claude/issue-12929-publish-backfill",
"pr": "#13090",
"session": "session_014MXhk1yjWh37d634hLy3p7 — the harness-stamped Claude-Session id of this run (subagent = the PM's)",
"premise_still_valid": true,
"summary": "MetadataClient.publishPackageDrafts(packageId, options?) (@object-ui/data-objectstack) sends the protocol's opt-in backfill only when given (type picked off @objectstack/client packages.publishDrafts); without it the body stays '{}' byte for byte. The Studio 变更 drawer (DraftChangesPanel) offers an unchecked 「补默认值(N 条已有记录)」 under each field a draft adds to an already-published object whose draft fields map declares a literal defaultValue (spec discriminateDefaultValueShape, the door's own function); N is the console footer probe adapter.find(object, {$top: 0}).total as the caller, shown only when numeric. Publish all passes the checked fields; StudioDesignSurface.doPublish forwards them only when given (an unchecked publish is the exact prior call) and the toast reports backfillApplied per field (updated count, or a warning with the server's error for a field that stopped short). Strings: preview.changes.backfillOption (count family, all ten packs) + backfillOptionNoCount; engine.studio.backfillWritten / backfillStopped (en, zh). Published faces widened: data-objectstack publishPackageDrafts gains an optional 2nd param (type not re-exported from the entry; dist d.ts now type-references ObjectStackClient from @objectstack/client, an existing dependency); app-shell no exported name changes type (DraftChangesPanel is not on the entry, StudioDesignSurface props unchanged); i18n two new key families. H1 holds (only Studio passes onPublish; usePublishAllDrafts/PackagesPage/AiChatPage/PendingDraftsBar unchanged, still '{}'); H2 holds (installed spec declares backfillApplied, client pin parses its fixture against it; R = 18.0.0-next.5); H3 holds; H4: an honest count source exists (protocol counts the zero-row page with the caller's context).",
"tests": "Final union at head ca83ad0, repo-root vitest under os-verify-lock:
pnpm --filter @object-ui/data-objectstack testexit 0 — Test Files 97 passed (97), Tests 1179 passed (1179); 26 app-shell files (12 DraftChangesPanel.* + DraftPreviewBar, 12 Studio publish-path files incl. heldPublish-11786 / heldWidgetPublish-11910 / itemDraftLine-12725 that pin the exact publishPackageDrafts(PKG) call, + the new Studio pin) exit 0 — Test Files 26 passed (26), Tests 126 passed (126); packages/i18n/ exit 0 — Test Files 84 passed (84), Tests 1319 passed | 13 skipped. New pins: metadata-client.publishBackfill-12929.test.ts (3), DraftChangesPanel.backfill-12929.test.tsx (10), StudioDesignSurface.publishBackfill-12929.test.tsx (3: checked -> body {"backfill":[{"object":"b2r4_ticket","field":"done"}]} and toast description carries N=12; stopped -> warning with rows + reason; unchecked -> body '{}' and no backfill line). First regression run at 6348eef was red on those three existing pins (call arity publishPackageDrafts(PKG, undefined)); fixed in ca83ad0 by passing options only when given, then green. Ablation at 6348eef via ablation-replace.mjs (anchor x1 -> x0, landed on disk, restore proven blob == HEAD and git diff HEAD empty; suites resolve @object-ui/data-objectstack through the vitest src alias, so no build between mutate and run): (1) client body -> '{}': 3 failed | 3 passed; (2) delete the literal-shape check in backfillCandidates: 6 failed | 4 passed; (3) footer -> void onPublish(): 3 failed | 10 passed. All red in the expected direction.","gates": "Local, exit captured to files before any pipe. data-objectstack lint exit 0 (0 errors), type-check exit 0 (at 6348eef; --listFilesOnly includes the new test; package unchanged since). app-shell lint exit 0 (0 errors; one new react-refresh/only-export-components warning on exported backfillCandidates, same kind as existing computeChangeDetail; no warning ratchet in lint.yml), type-check exit 0 (both programs, at ca83ad0; --listFilesOnly lists both new tests). At ca83ad0, exit 0 each: check:i18n-keys, check:i18n-drift (4 pack keys + 2 table keys added, 0 en values changed), check:i18n-designer-parity, check:new-line-citations (0 new), check:control-bytes, check:spec-symbols, check:metadata-write-doors, check:phantom-deps, check:esm-specifiers, check-changeset-{presence,no-major,fixed,claims,overwrite}, check-vi-mock-{inherit,override-shape,specifiers}, check-test-path-roots, check-type-check-coverage. check:i18n-dead-keys exit 0 (report; new keys not listed). check-governed-queue-guard --test over the 18 paths: NOT GOVERNED. dispatch-gates.mjs refuses objectui, so this list is hand-derived from objectui's workflows and manifests (no --ran reconciliation exists for this repo). Not run locally (CI's): full app-shell suite, repo-wide lint, check:eager-closure (needs a console build; NOT MEASURED locally — the diff adds a runtime @objectstack/spec/data import to an eager-graph module, already a runtime import of @object-ui/core and claimed whole by the vendor-objectstack chunk), check:published-dist, check:spec-floors (no floor moves). PR check-runs at ca83ad0 when this report was written: 35 total, 29 in_progress, 3 success, 3 skipped, 0 failed — in_progress.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/13090/assignees (huangyiirene), read back 14020 bytes sent = stored; (2) comment = POST /repos//issues/12929/comments (this report). Plus git push x2 (empty-branch probe, then ca83ad0), not REST. Labels: none written (the PR's path labels are labeler.yml's).",
"deviations": [
"Floor clause not applied: the @objectstack/spec ranges of @object-ui/data-objectstack (^18.0.0-next.1) and @object-ui/app-shell (^18.0.0-next.3) are unchanged. objectui AGENTS.md §9 「依赖与锁文件」 says those ranges act only at objectui's own release and must not be edited to align with the pin; scripts/objectstack-floor.mjs computes every floor at publish from .objectstack-sha as the earliest spec release whose tag contains the pin. R = 18.0.0-next.5 (is-ancestor 1e001c7df vs the next.5 tag commit exit 0; vs next.3 exit 1, control leg next.2-in-next.3 exit 0; next.4 never tagged; npm next = 18.0.0-next.5). The pin f4755a68a797 is after next.5 (next.5 is-ancestor of pin exit 0; pin in next.5 exit 1), so the computed floor will be a release after next.5 and publishing waits for it (that script's exit 2): either way nothing older than R is admitted. Named here as a dispatch-vs-landing-repo conflict rather than picked silently.",
"No new helper module: the receipt formatter lives in StudioDesignSurface.tsx to stay inside the claimed file surface.",
"Design judgement: the choice is offered only for added fields of an already-published object (a never-published object has no existing records); the drawer places it in the drill-in under the + field row, so in the review posture it shows once the row is expanded (the confirm posture expands every row)."
],
"diff": "18 files changed, 949 insertions(+), 24 deletions(-) vs BASE b3007fd: .changeset/12929-publish-backfill.md; packages/data-objectstack/src/metadata-client.ts (+ metadata-client.publishBackfill-12929.test.ts); packages/app-shell/src/preview/DraftChangesPanel.tsx (+ tests/DraftChangesPanel.backfill-12929.test.tsx); packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (+ StudioDesignSurface.publishBackfill-12929.test.tsx); packages/app-shell/src/views/metadata-admin/i18n.ts; packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (read-only inference, no public-door reproduction) — ObjectStackAdapter.normalizeQueryResult answers total as total ?? count ?? records.length, and find returns {data: [], total: 0} for a resource memoised as missing (404): a $top: 0 count read could show a confident 0 if a server omitted total ($count=false, which the console does not send) or for a resource that 404ed earlier in the session. In PR Acceptance notes.",
"carrier: 承接者:无 · noted, not filed (behaviour as specified) — on the SQL driver the column DEFAULT fills existing rows at ADD COLUMN, so backfillApplied.updated truthfully reads 0 while the drawer named N existing records; the spec calls that 0 a complete answer. In PR Acceptance notes."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 12929,
"status": "done",
"branch": "claude/issue-12929-publish-backfill",
"pr": "#13090",
"session": "session_014MXhk1yjWh37d634hLy3p7 — the harness-stamped Claude-Session id of this run (subagent = the PM's)",
"premise_still_valid": true,
"summary": "PATCH ROUND 1 (REWORK, one item): .changeset/12929-publish-backfill.md now declares '@object-ui/i18n': minor (was patch). The en pack's new preview.changes.backfillOption family and backfillOptionNoCount widen the published TranslationKeys, which is an additive public-type change. Only that frontmatter line changed (1 insertion, 1 deletion), committed as fe229b7 and pushed; no code change and no merge of main (PR mergeable, state behind, no conflict). Round 0, unchanged: MetadataClient.publishPackageDrafts(packageId, options?) (@object-ui/data-objectstack) sends the protocol's opt-in backfill only when given (type picked off @objectstack/client packages.publishDrafts); without it the body stays '{}' byte for byte. The Studio 变更 drawer (DraftChangesPanel) offers an unchecked 「补默认值(N 条已有记录)」 under each field a draft adds to an already-published object whose draft fields map declares a literal defaultValue (spec discriminateDefaultValueShape, the door's own function); N is the console footer probe adapter.find(object, {$top: 0}).total as the caller, shown only when numeric. Publish all passes the checked fields; StudioDesignSurface.doPublish forwards them only when given (an unchecked publish is the exact prior call) and the toast reports backfillApplied per field (updated count, or a warning with the server's error for a field that stopped short). Strings: preview.changes.backfillOption (count family, all ten packs) + backfillOptionNoCount; engine.studio.backfillWritten / backfillStopped (en, zh). Published faces widened: data-objectstack publishPackageDrafts gains an optional 2nd param (type not re-exported from the entry; dist d.ts now type-references ObjectStackClient from @objectstack/client, an existing dependency); app-shell no exported name changes type (DraftChangesPanel is not on the entry, StudioDesignSurface props unchanged); i18n two new key families. H1 holds (only Studio passes onPublish; usePublishAllDrafts/PackagesPage/AiChatPage/PendingDraftsBar unchanged, still '{}'); H2 holds (installed spec declares backfillApplied, client pin parses its fixture against it; R = 18.0.0-next.5); H3 holds; H4: an honest count source exists (protocol counts the zero-row page with the caller's context).",
"tests": "Patch round 1 changes one changeset frontmatter line, so no test reruns are owed (no code moved). Round 0 readings, which stand for the code at fe229b7: Final union at head ca83ad0, repo-root vitest under os-verify-lock:
pnpm --filter @object-ui/data-objectstack testexit 0 — Test Files 97 passed (97), Tests 1179 passed (1179); 26 app-shell files (12 DraftChangesPanel.* + DraftPreviewBar, 12 Studio publish-path files incl. heldPublish-11786 / heldWidgetPublish-11910 / itemDraftLine-12725 that pin the exact publishPackageDrafts(PKG) call, + the new Studio pin) exit 0 — Test Files 26 passed (26), Tests 126 passed (126); packages/i18n/ exit 0 — Test Files 84 passed (84), Tests 1319 passed | 13 skipped. New pins: metadata-client.publishBackfill-12929.test.ts (3), DraftChangesPanel.backfill-12929.test.tsx (10), StudioDesignSurface.publishBackfill-12929.test.tsx (3: checked -> body {"backfill":[{"object":"b2r4_ticket","field":"done"}]} and toast description carries N=12; stopped -> warning with rows + reason; unchecked -> body '{}' and no backfill line). First regression run at 6348eef was red on those three existing pins (call arity publishPackageDrafts(PKG, undefined)); fixed in ca83ad0 by passing options only when given, then green. Ablation at 6348eef via ablation-replace.mjs (anchor x1 -> x0, landed on disk, restore proven blob == HEAD and git diff HEAD empty; suites resolve @object-ui/data-objectstack through the vitest src alias, so no build between mutate and run): (1) client body -> '{}': 3 failed | 3 passed; (2) delete the literal-shape check in backfillCandidates: 6 failed | 4 passed; (3) footer -> void onPublish(): 3 failed | 10 passed. All red in the expected direction.","gates": "Patch round 1, at fe229b7, exit captured before any pipe: node scripts/check-changeset-presence.mjs exit 0 ('17 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)'); node scripts/check-changeset-no-major.mjs exit 0; node scripts/check-changeset-fixed.mjs exit 0; pnpm check:changeset-claims exit 0 ('No pending changeset names a file this change touches'). PR check-runs at fe229b7 when written: 10 so far, 5 queued, 4 in_progress, 1 skipped — in_progress. At ca83ad0 (prior head): 35 total, 12 success, 3 skipped, 20 in_progress, 0 failed. Round 0 gates, unchanged for the code: Local, exit captured to files before any pipe. data-objectstack lint exit 0 (0 errors), type-check exit 0 (at 6348eef; --listFilesOnly includes the new test; package unchanged since). app-shell lint exit 0 (0 errors; one new react-refresh/only-export-components warning on exported backfillCandidates, same kind as existing computeChangeDetail; no warning ratchet in lint.yml), type-check exit 0 (both programs, at ca83ad0; --listFilesOnly lists both new tests). At ca83ad0, exit 0 each: check:i18n-keys, check:i18n-drift (4 pack keys + 2 table keys added, 0 en values changed), check:i18n-designer-parity, check:new-line-citations (0 new), check:control-bytes, check:spec-symbols, check:metadata-write-doors, check:phantom-deps, check:esm-specifiers, check-changeset-{presence,no-major,fixed,claims,overwrite}, check-vi-mock-{inherit,override-shape,specifiers}, check-test-path-roots, check-type-check-coverage. check:i18n-dead-keys exit 0 (report; new keys not listed). check-governed-queue-guard --test over the 18 paths: NOT GOVERNED. dispatch-gates.mjs refuses objectui, so this list is hand-derived from objectui's workflows and manifests (no --ran reconciliation exists for this repo). Not run locally (CI's): full app-shell suite, repo-wide lint, check:eager-closure (needs a console build; NOT MEASURED locally — the diff adds a runtime @objectstack/spec/data import to an eager-graph module, already a runtime import of @object-ui/core and claimed whole by the vendor-objectstack chunk), check:published-dist, check:spec-floors (no floor moves). PR check-runs at ca83ad0 when this report was written: 35 total, 29 in_progress, 3 success, 3 skipped, 0 failed — in_progress.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "Patch round 1: 1 relay stroke (POST /repos/objectstack-ai/objectstack/dispatches -> comment = POST /repos//issues/12929/comments, this report) + git push x1 (ca83ad0..fe229b7, not REST). Round 0: 2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/13090/assignees (huangyiirene), read back 14020 bytes sent = stored; (2) comment = POST /repos//issues/12929/comments (this report). Plus git push x2 (empty-branch probe, then ca83ad0), not REST. Labels: none written (the PR's path labels are labeler.yml's).",
"deviations": [
"Floor clause not applied: the @objectstack/spec ranges of @object-ui/data-objectstack (^18.0.0-next.1) and @object-ui/app-shell (^18.0.0-next.3) are unchanged. objectui AGENTS.md §9 「依赖与锁文件」 says those ranges act only at objectui's own release and must not be edited to align with the pin; scripts/objectstack-floor.mjs computes every floor at publish from .objectstack-sha as the earliest spec release whose tag contains the pin. R = 18.0.0-next.5 (is-ancestor 1e001c7df vs the next.5 tag commit exit 0; vs next.3 exit 1, control leg next.2-in-next.3 exit 0; next.4 never tagged; npm next = 18.0.0-next.5). The pin f4755a68a797 is after next.5 (next.5 is-ancestor of pin exit 0; pin in next.5 exit 1), so the computed floor will be a release after next.5 and publishing waits for it (that script's exit 2): either way nothing older than R is admitted. Named here as a dispatch-vs-landing-repo conflict rather than picked silently.",
"No new helper module: the receipt formatter lives in StudioDesignSurface.tsx to stay inside the claimed file surface.",
"Design judgement: the choice is offered only for added fields of an already-published object (a never-published object has no existing records); the drawer places it in the drill-in under the + field row, so in the review posture it shows once the row is expanded (the confirm posture expands every row).",
"Patch round 1: the worktree was removed after round 0, so it was re-created from origin/claude/issue-12929-publish-backfill at ca83ad0 (no install needed for the four changeset scripts) and removed again after the push.",
"Stale PR-body line, for the seat to amend (a dev writes the PR body once and does not PATCH it): in PR #13090's What changes list, the bullet reading '.changeset/12929-publish-backfill.md: data-objectstack minor, app-shell minor, i18n patch.' should end 'i18n minor.'"
],
"diff": "Round 1 adds 1 file changed, 1 insertion(+), 1 deletion(-) (.changeset/12929-publish-backfill.md). Branch total vs BASE b3007fd stays 18 files changed, 949 insertions(+), 24 deletions(-): .changeset/12929-publish-backfill.md; packages/data-objectstack/src/metadata-client.ts (+ metadata-client.publishBackfill-12929.test.ts); packages/app-shell/src/preview/DraftChangesPanel.tsx (+ tests/DraftChangesPanel.backfill-12929.test.tsx); packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (+ StudioDesignSurface.publishBackfill-12929.test.tsx); packages/app-shell/src/views/metadata-admin/i18n.ts; packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (read-only inference, no public-door reproduction) — ObjectStackAdapter.normalizeQueryResult answers total as total ?? count ?? records.length, and find returns {data: [], total: 0} for a resource memoised as missing (404): a $top: 0 count read could show a confident 0 if a server omitted total ($count=false, which the console does not send) or for a resource that 404ed earlier in the session. In PR Acceptance notes.",
"carrier: 承接者:无 · noted, not filed (behaviour as specified) — on the SQL driver the column DEFAULT fills existing rows at ADD COLUMN, so backfillApplied.updated truthfully reads 0 while the drawer named N existing records; the spec calls that 0 a complete answer. In PR Acceptance notes."
],
"head": "fe229b72f187a7032406e3c1d04a066b81d471f1"
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
ACCEPT → PR #13090 comment 6278072404 · contract review 6278057016 (
TIER_DEFAULT, declaration face, PASS, headfe229b7) ·domain:ui#1·session_014MXhk1yjWh37d634hLy3p7· 2026-10-19T21:44Z. The flip to ready and auto-merge wait for green check-runs on this head.objectstack-fleet commentedon Oct 19, 2026
LANDED ·
domain:uiseat 1 ·session_014MXhk1yjWh37d634hLy3p7· 2026-10-19T22:10Z ·pm:dispatchedcleared6058bf8, whichgit merge-base --is-ancestorplaces onorigin/main(exit 0)gh-readonly-queue/main/pr-13090-*branch remainsorigin/main:metadata-client.tssendsbackfillonly when given (options.backfill !== undefined, 1 hit);DraftChangesPanel.tsxcarriesexport function backfillCandidates(1 hit). Positive control:async publishPackageDraftsis still the one door (1 hit)6277021967(Clause-②: yes, correcting this card's body line), dev reports (round 0 and patch round 1), contract review6278057016(TIER_DEFAULT, PASS), ACCEPT6278072404completedat 2026-10-19T22:09Z through the PR'sFixes #12929, the only card closed since the merge;pm:dispatchedis removed in this actFollow-up named by this card's body: objectstack-ai/cloud#2924's applied-card copy may now say 「发布时可选补 0」 (cloud's one-line follow-up). It reaches users when cloud's objectui pin moves past
6058bf8.