Skip to content

feat(app-shell,plugin-chatbot,i18n): one collapsed line per phase, a result card with its two doors, no navigation after a build (objectui#12724) - #12841

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-12724-ai-build-progress-result
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-12724-ai-build-progress-result

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #12724 — the plan-card and result-card rows that need the cloud builder-plan-result-payloads-v2 payload stay open (listed below).
Clause-②: yes

What changed

Target 2: progress. A turn's tool activity is one collapsed line per phase: 设计方案 · 4 步 · 0:48 · 读取编写规范 · 列出对象 ×3 · 记录待办 ×2 · 设计应用方案. Repeated calls of a tool fold into one step with a count. The phase is named for the build tool the turn called (propose_blueprint → 设计方案, apply_blueprint → 搭建). The time is measured while the turn streams; no producer persists a duration, so a reopened conversation shows none. The chevron expands the per-tool rows. They also open on their own while a step runs. A plan waiting on the user does not hold them open, because the plan card says 等待确认 itself. The line now leads its turn, above the design or build panel.

Target 3, without the verified checklist. The finished build card reads 「已搭建并上线 · APP」 when the build is live: the envelope says published, or this chat's publish signal says so. Without either it still reads 「已构建APP」 ("Built APP"), never claiming it is live. 打开应用 is the primary button: an SPA navigation to /apps/APP, the app's first navigation item. 在 Studio 中查看 is secondary: /studio/PKG/interfaces with no landing state. In the published posture, the Studio door now gets the build's own package from its envelope. Below the buttons, 「接下来可以说:…」 quotes the envelope's nextSteps, followed by 「之后的修改先存草稿,由你在 Studio 发布。」. The progress bar is gone once the build is done. A whole-app build no longer repeats its next steps as a list on the draft card.

No automatic navigation after a build. The ChatPane effect that called paneNavigate('/studio/PKG/interfaces', { state: STUDIO_RUN_LANDING }) when a build landed now only binds the conversation to the built package (A1.b, idempotent), so the Studio dock still resumes the thread. Pins changed: AiChatPage.builtTransition.test.tsx (objectui#5799 transition, its full-page opt-out and the objectui#10109 no-transition cases) and AiChatPage.builtLandsRunning-11658.test.tsx (objectui#11658 run landing) are retired. Both pinned the navigation this ruling removes. They are replaced by AiChatPage.noNavigationAfterBuild-12724.test.tsx. In that file, a reopened build (drafted or published) and a live completion make no router call except the binding's same-conversation ?package= replace, and never call location.assign. The two doors are pinned as SPA navigations with their targets.

Target 1 (plan card), from what the envelope declares. detectProposedPlan lifts blueprint.app.label, plus each field's and each view's name and label. These are the spec's SolutionBlueprintSchema keys (BlueprintAppSchema, BlueprintFieldSchema, BlueprintViewSchema). The card shows 「方案预览 · APP」 with 等待确认, the count line under it, one row per object with a chip per field, one row per view, the assumptions, 开始搭建 / 调整方案 and the reply hint. If no object carries field rows (for example the cache-fallback copy, which keeps only the count), it draws today's object chips.

Target 4. Outside an app, the build agent's placeholder is 「描述你想搭建的应用,或要改的地方…」 / "Describe the app you want to build, or what to change…", with no agent name. Inside an app it is still askOrChangeApp (objectui#11658). Other agents keep theirs. The footer reads 「↵ 发送 · Shift+↵ 换行」 through a new optional newlineHint label.

i18n. New keys in every pack: console.ai.describeAppToBuild, console.ai.newlineHint, console.ai.viewBuiltAppInStudio, chatbot.phase.build|design|stepCount (plural family)|expand|collapse, chatbot.plan.awaitingConfirm|objectsAndFields|views and chatbot.build.builtAndLive|nextStepsLead|nextStepQuote|draftPosture. console.ai.designBuiltApp retires; 在 Studio 中查看 replaces its label.

Payload rows left open (cloud builder-plan-result-payloads-v2)

Not drawn, because no current reader or recorded envelope produces them:

  • the dashed suggested-field chip (needs a per-field suggested marker);
  • the constraint in mono type on a chip, such as 13 位数字 or 邮箱格式 (needs a per-field format constraint);
  • the 「名称:自动生成…」 line under relation objects (needs the generated-name rule as display data);
  • lifecycle marks on status options (✓完成 / ⚠);
  • each view's intent line: layout, group, filter, sort;
  • 示例数据 12 条/对象 and 确认后约 1 分钟;
  • the example replies in 「也可以直接回复:…」;
  • 核对通过 7/7 and the checklist's verified numbers;
  • the third button 查看结构.

Deviations

  • ProposedPlan (exported from @object-ui/plugin-chatbot) gains three optional members: appLabel, views and objects[].fields. The ruling's field chips need them, but this goes beyond label props and i18n keys. ChatbotEnhancedToolInvocation.proposedPlan now references ProposedPlan instead of an inline copy.
  • Pins beside the touched surface were updated: the i18n censuses de-quote-pairing-3876 (one more „…“ pair), untranslated-identity-4376 (the ko quote format string) and perm-home-namespace-3546 (the retired key), plus the live-baseline expectation in useChatConversation.test.tsx.
  • The finished card's primary/secondary order reverses ADR-0080 D5's "Studio primary" per the ruled artboard. The ADR text is untouched.
  • The app-shell suite ran as 8 sequential shards; a single run exceeds the container's 10-minute foreground cap.

Screenshots (1280 px, light; evidence branch, never merged)

Rendered by the real ChatbotEnhanced under the real I18nProvider, from spec-shaped fixture envelopes lifted by the real mapMessages readers. A temporary dev-server page was used and not committed. No live build agent was reachable. Faked inputs: the envelopes, a publish-count probe answering 0, the live build-progress app label, and the clock (+48 s / +64 s while streaming).

Test evidence (head 38ceb1e)

  • pnpm --filter @object-ui/plugin-chatbot test: 62 files, 638 tests passed (run at 781fc10; 38ceb1e touches only an app-shell test).
  • pnpm exec vitest run packages/app-shell/ --shard=K/8, K=1..8: 1509 files (1508 passed, 1 skipped), 14110 tests passed, 9 skipped.
  • pnpm exec vitest run packages/i18n/: 1321 passed, 13 skipped.
  • type-check (i18n, plugin-chatbot, app-shell), build (the same three), eslint on changed files, check:i18n-keys, check:i18n-drift, check:i18n-designer-parity, check:i18n-dead-keys, check:new-line-citations and check-changeset-presence: all exit 0.
  • Ablation: each new or updated pin was mutated once on disk and went red, and the restore was proven with git diff HEAD empty (11 legs). The first attempt at one leg was a no-op that the ablation tool refused, and it was re-run.

The drafting session's link is in prose here: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL

… no navigation after a build

Part of objectui#12724, the halves that need no new payload.

- AiChatPage: a finished build no longer navigates to Studio (the
  objectui#5799 transition and its objectui#11658 run landing retire);
  the A1.b binding stays, so the Studio dock resumes the thread. The
  build agent's placeholder outside an app describes the task, and the
  composer footer adds the newline hint.
- ChatbotEnhanced: a turn's tool activity collapses to one line per
  phase with folded repeats, the step count and the measured elapsed
  time; the chevron expands the rows. The finished build card says
  built-and-live only on a publish signal, puts Open app first and
  View in Studio second, and closes with the next-steps line and the
  draft posture sentence. The plan card names the app, draws one chip
  per declared field and one row per declared view, and degrades to
  the object chips without field rows.
- mapMessages: ProposedPlan lifts the spec-declared field and view
  names and labels and the app label.
- i18n: the new keys in every pack; console.ai.designBuiltApp retires.

Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL
Co-authored-by: Claude <noreply@anthropic.com>
…not hold it open

The line now sits above the design / build panel it summarizes, and its
state is the summary strip's: a plan awaiting confirmation already says so
on its own card, so the line stays collapsed with a tick.

Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL
Co-authored-by: Claude <noreply@anthropic.com>
…opy still keeps the count

Claude-Session: https://claude.ai/code/session_01XfuGMLXaKo5XaZhNvUTbDL
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 75 chunks) 3133.4 KB 3744.1 KB
Main entry chunk (gzip) 75.7 KB 350 KB
Entry file index-BbG9b5cs.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.42KB 7.85KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 41.15KB 10.86KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 41.19KB 11.12KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 606.28KB 146.84KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.36KB 74.46KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.79KB 11.90KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 210.60KB 49.94KB
plugin-dashboard (index.js) 146.23KB 39.59KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.70KB 69.73KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.28KB 46.60KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 271.78KB 75.39KB
plugin-kanban (index.js) 62.17KB 19.22KB
plugin-list (index.js) 138.78KB 35.68KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.23KB 39.46KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#12724 (partial) · head 38ceb1e · 2026-10-17T01:21Z

Seat domain:ui#4, session session_01SJn1GEkrbbBQkhGC26wEDw. Checked against GitHub and the diff, not against the report (relayed on the card, 6227836208). The seat opened this PR from the dev's drafts (degraded channel). The body is the dev's draft verbatim; the title's scope names the three packages the change touches.

Checklist

  • Form:

    • Draft → main, assignee os-sales.
    • The first line is Part of #12724, with the reason (the v2 payload rows stay open), and the second is Clause-②: yes, as the amended claim declares (6227822757: file surface and Clause-② reason).
    • Three commits. Every message carries only the model-free trailer pair.
    • git merge-tree against current main is clean. 24 files, +1,254 / −571, no PNG.
  • Rulings, as bound:

    • Target 2: one collapsed line per phase (the phase named for the build tool the turn called, the folded step count, the elapsed time measured while the turn streamed, the steps with ×N). The chevron expands the rows, a running step opens them, and a plan waiting on the user does not hold them open. A reopened conversation shows no time, because no producer persists one.
    • Target 3, without the verified checklist: 「已搭建并上线 · APP」 only with a publish signal, otherwise "Built APP". 打开应用 is primary and 在 Studio 中查看 secondary, both SPA navigations. Then the 「接下来可以说」 line from nextSteps and the draft-posture sentence.
    • No automatic navigation after a build: the effect now only binds the conversation to the built package (a same-conversation ?package= replace), so the Studio dock still resumes the thread. location.assign is never called.
    • Target 4: outside an app the build agent's placeholder is 「描述你想搭建的应用,或要改的地方…」, with no agent name; inside an app it is unchanged. The footer reads 「↵ 发送 · Shift+↵ 换行」.
    • Target 1, from declared keys only: the plan card lifts blueprint.app.label and each field's and view's name and label, all SolutionBlueprintSchema keys. Without field rows it draws today's object chips.
  • Mechanism assumptions: all four held. Whether the tenant's 40 s boot splash came from the retired navigation is not measured: no live tenant was reachable, and the code path has no location.assign.

  • Screenshots, read by the seat (never-merged claude/issue-12724-evidence at d4e6221, 1280 px, light, zh and en):

    • Plan card: 方案预览 · 图书借阅管理 with 等待确认, one row per object with a chip per field, three view rows, the assumptions, 开始搭建 / 调整方案 and the reply hint.
    • Progress: 设计方案 · 4 步 · 0:48 with the folded steps, collapsed and expanded.
    • Result card: 已搭建并上线 · 图书借阅管理, 打开应用 (primary) and 在 Studio 中查看, then the next-steps line and the posture sentence.
    • Two full pages, a design turn and a build turn, with the new placeholder and hint.

    They are rendered by the real components from spec-shaped fixture envelopes; the envelopes, a publish probe and the clock are faked, and no live build agent was reachable. Sent to the maintainer at 2026-10-17T01:21Z.

  • Tests:

    • Two new pin files: AiChatPage.noNavigationAfterBuild-12724 (5) and ChatbotEnhanced.buildChat-12724 (10). Updated pins: AiChatPage.appContextComposer-11658, mapMessages, ChatbotEnhanced, useChatConversation, and three i18n census pins.
    • Two pin files are retired, AiChatPage.builtTransition and AiChatPage.builtLandsRunning-11658. Both pinned the navigation the maintainer's ruling removes. objectui#10109's edit guard stays pinned by useChatConversation.editKindRoundTrip-10109.
    • Eleven ablations, each red, each restored to an empty git diff HEAD.
    • Full suites: plugin-chatbot 62 files / 638 tests at 781fc10 (38ceb1e touches one app-shell test only); app-shell in 8 sequential shards at 38ceb1e, 1,509 files / 14,110 tests; i18n 83 files / 1,321 tests. All exit 0.
    • type-check and build for i18n, plugin-chatbot and app-shell, eslint on changed files (0 errors), check:i18n-keys, check:i18n-drift, check:i18n-designer-parity, check:i18n-dead-keys, line citations and changeset presence: all exit 0.
  • Changeset: @object-ui/app-shell, @object-ui/plugin-chatbot and @object-ui/i18n minor; user-facing prose.

  • Contract faces: reviewed in the TIER_DEFAULT record that follows.

  • CI: running at this record. Landing waits for green. On merge this card returns to pm:queue for its remaining rows; it does not close.

Rulings

  1. The v2 payload rows: A. They stay open on this card until the cloud card declares them in the plan and result envelopes. Nothing is inferred from groupBy, type or options: a renderer must not draw what the producer never said.
  2. The next-steps line on a published envelope: A, recorded on this card. The line promises sayable utterances, and in an auto-publish environment the published envelope is not lifted today. Both depend on the same cloud payload, so they join the open rows here, not a separate decision.
  3. The dormant run-landing reader and the full-page opt-out flag: A, retire. Both lose their other half in this PR, and nothing pulls on them. Filed as AI build: retire what the built-moment transition leaves behind after objectui#12724 — Studio's run-landing reader, the full-page opt-out flag nobody reads, and the stale "ADR-0080 D5" citation #12842, to land after this PR.
  4. "ADR-0080 D5": no ADR edit. objectstack's docs/adr/0080-ai-authored-ui-jsx-source.md has no D5 by that name. The citation exists only in a ChatbotEnhanced comment, which AI build: retire what the built-moment transition leaves behind after objectui#12724 — Studio's run-landing reader, the full-page opt-out flag nobody reads, and the stale "ADR-0080 D5" citation #12842 rewords to the ruled behaviour.
  5. The surface breaches (the three census pins, the hooks test, the ProposedPlan members, the retired key): accepted, and covered by the amended claim 6227822757.
  6. The contract conflict: as dispatched. The relay is refused from the dev's container, so the seat opened the PR and relayed the report.
  7. The cache copy keeping only field counts: that is the ruled fallback. Noted, not filed.

Implemented-by: cloud session session_01XfuGMLXaKo5XaZhNvUTbDL, branch claude/issue-12724-ai-build-progress-result


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 38ceb1ea04352c57136adbca19b91c5086cab1e9
Local-runs: none

Face: the Clause-②: yes declaration of the amended claim 6227822757 on objectui#12724. The PR's file list carries no packages/spec/src/** path and no governed path. Inputs read: the card, the claim and its amendment, the diff at the head above, the changeset, @object-ui/plugin-chatbot's entry and the PR body. Nothing was built or run locally.

① Derived judgments

  • TranslationKeys (exported from @object-ui/i18n) gains the new keys in every pack, and console.ai.designBuiltApp retires. Its one reader, AiChatPage, moves to console.ai.viewBuiltAppInStudio in this PR. On the head, the old key appears only in a census pin's comment and in CHANGELOGs. The drift, keys and dead-keys checks pass. Correct, and declared.
  • ChatbotLabels (exported from @object-ui/plugin-chatbot) gains one optional member, newlineHint. Additive; omitting it renders as before. Correct.
  • ProposedPlan (exported from @object-ui/plugin-chatbot's entry, from mapMessages.ts) gains three optional members: appLabel, views and objects[].fields. detectProposedPlan fills them only from the spec's SolutionBlueprintSchema keys (BlueprintAppSchema.label, BlueprintFieldSchema.name/label, BlueprintViewSchema.name/label); a count-only fields array lifts nothing, and that is pinned. The reader declares nothing the producer does not write. Correct: declare equals enforce.
  • ChatbotEnhancedToolInvocation.proposedPlan now references ProposedPlan instead of an inline copy: the same shape plus the optional members. Correct.
  • Behaviour: no schema the spec owns changes. The default behaviour after a build changes (no automatic navigation), on the maintainer's ruling for this card, which supersedes objectui#11658. Correct, ruled.

② Semver level

The changeset bumps @object-ui/app-shell, @object-ui/plugin-chatbot and @object-ui/i18n minor, in pre mode on tag next. New optional members, new keys, one retired key with its only reader moved, and a changed default fit minor; no major, per objectui's rule. Consistent.

③ Boundary flags

Implemented-by: session_01XfuGMLXaKo5XaZhNvUTbDL
Reviewed-by: session_01SJn1GEkrbbBQkhGC26wEDw

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Landing · head 38ceb1e · 2026-10-17T01:26Z


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 01:27
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 01:27
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit ac59073 Oct 17, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12724-ai-build-progress-result branch October 17, 2026 01:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants