Skip to content

fix(ui): the maker's edit-mode starter offers sample data, not an automation v1 cannot build (#7709) - #7766

Merged
hotlong merged 1 commit into
mainfrom
fix/edit-mode-chip-v1-honest-7709
Sep 5, 2026
Merged

fix(ui): the maker's edit-mode starter offers sample data, not an automation v1 cannot build (#7709)#7766
hotlong merged 1 commit into
mainfrom
fix/edit-mode-chip-v1-honest-7709

Conversation

@hotlong

@hotlong hotlong commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Closes #7709. Verified on 4d1e0be1b.

⚠️ cloud needs a .objectui-sha bump before this reaches the product — the chip a tenant sees does not change until that pin moves. cloud#2008 / PR #2009 is already queued and carries objectui#7710; this one needs the next bump after it.


The ruling

The card laid out two honest options and said which one was right is a product call, not a translation fix. The ruling on the epic cloud#1955 lane, 2026-09-05, is option 2 — replace the fourth chip with sample data, and the reasoning is the shape of the family:

另外三个编辑态 chip(加字段 / 加对象 / 加仪表盘)都在加结构,而一个已有应用最常见的缺失是没有数据 …… 换成页面或日历视图都更小众;砍成三个则白丢一个位置且与 v2 回滚不对称。

So: the three surviving chips all add STRUCTURE, and what an app that already HAS objects most often lacks is DATA. A page or a calendar view is the more niche ask; dropping to three starters throws a slot away and is asymmetric with the v2 restore.

Checked on contact rather than assumed, because a second broken promise would have been worse than the first: seed is on v1's authoring whitelist — cloud packages/service-ai-studio/src/authoring-whitelist.ts, V1_METADATA_TYPES, listed with the comment "seed (sample data)". The whitelist is version-scoped, not mode-scoped, and its own header states that every authoring path reads it and nothing else, apply_edit — the edit-mode path — named among them. So the maker bound to an existing app can author this, and the new chip is not a second refusal.

What was wrong

editAppSuggestions() renders four starters for the maker bound to an existing app (?package=). The fourth was console.ai.suggestions.editApp.addAutomation:

  • en: Add an automation — an approval, a status flow, or a notification.
  • zh: 「加一个自动化 —— 审批、状态流转或通知。」

Approval, status flow and notification are all refused by ADR-0112 v1 (cloud#1956 / PR #1970). The measured failure mode on the sibling chip family (cloud#1984) was not a refusal but a silent degrade into a view — so the product recommended an automation and would have handed back a page, with nothing telling the user that is what happened.

Rewording it the way the five from-scratch chips were reworded was not available: a field, a view or a dashboard duplicates one of the three chips beside it. That is exactly why the card was filed separately instead of folded into #7710.

What changed

The key is now console.ai.suggestions.editApp.addSampleData, in all ten packs and in the call-site defaultValue fallback — the second copy of the same string, which #7710 measured is where a scope fix gets applied to only one of the two and keeps the old promise alive on precisely the surface with the least i18n. All ten packs carried a full translation of the old key (none was fallback-only), so ten real sentences went in, each written as a business ask in its own language rather than a literal rendering of "add sample data":

pack new fourth chip
en Fill the existing objects with realistic sample records so I can demo the app.
zh 给现有对象补一批贴近真实的示例数据,好拿去演示。
ja 既存のオブジェクトに、デモで使えるリアルなサンプルデータを入れてください。
ko 기존 객체에 데모에서 보여 줄 만한 현실적인 샘플 데이터를 채워 주세요.
de / fr / es / pt / ru / ar same ask, each in its own idiom — see the diff

Key renamed, not just revalued. A key literally named addAutomation serving a sample-data sentence is the declared-vs-actual drift this repo keeps paying for, and it would send a future editor grepping for "automation" to the wrong conclusion. Renaming also makes the v2 restore additive: addAutomation comes back under its own name instead of overwriting the chip that replaced it. check:i18n-drift reads the rename as a key-set change and correctly defers to all-locales-key-parity, which is green.

The REVERT note is beside the keys in every pack and at the call site, following #7710's precedent, and it is specific to THIS chip: when ADR-0112 v2 re-adds flows and actions, this chip's automation wording comes back as addAutomation. Each pack's retired sentence is kept verbatim in the new guard suite, so v2 does not have to reconstruct ten translations from git history.

Verification

Host is macOS on Node v26.7.0; CI runs Node 22.x. scripts/pm/os-verify-lock.sh reported UNLOCKED (declared) on every run — no usable flock on this host, so the shared verify lock was never taken and nothing was serialized. Declared, not claimed.

what command result
build (dep closures) pnpm --filter '@object-ui/i18n^...' --filter '@object-ui/app-shell^...' run build exit 0
type-check pnpm --filter @object-ui/i18n --filter @object-ui/app-shell run type-check exit 0, both Done
tests pnpm exec vitest run packages/i18n/ packages/app-shell/src/console/ai/ exit 0Test Files 84 passed (84), Tests 1162 passed (1162)
the two new suites + the two #7710 suites + key parity pnpm exec vitest run on the five files exit 0Test Files 5 passed (5), Tests 114 passed (114)
lint (whole farm) pnpm lint exit 0Tasks: 47 successful, 47 total, 0 errors (2883 warnings, the same count main carries)
lint (this diff) eslint --no-inline-config --format json on the 13 changed files exit 0 — 13 files, 0 errors, 31 warnings, every one pre-existing in AiChatPage.tsx and none in the edited region
i18n gates check:i18n-keys, check:i18n-drift, check:control-bytes exit 0, 0, 0 — drift: "0 en value(s) changed (1 key(s) added, 1 removed — those are all-locales-key-parity's)"
changeset gates check-changeset-presence.mjs, check-changeset-no-major.mjs exit 0, 0"13 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)"

The whole table was re-run on the final commit 4d1e0be1b; exit codes were captured before any pipe.

The two new suites

packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts (42 cases) — all four keys present, non-empty and exactly four in each of the ten packs (which is also what proves no pack kept an addAutomation behind); the four chips are four DIFFERENT asks in every pack, which is the constraint that made "reword it like the others" unavailable in the first place; and no chip matches that pack's OWN automation/approval vocabulary. Scanning in each pack's own script matters: an English-only scan would have declared the five non-Latin packs clean without reading a character of them. The banned lists are #7710's automation vocabulary verbatim (one v1 boundary, two families reading it) plus an approval stem per locale, which this chip's wording needed and that list did not name.

packages/app-shell/src/console/ai/__tests__/AiChatPage.editChips-7709.test.ts (4 cases) — the call-site copy: the editing branch is reached at all (and the from-scratch branch still returns five, so the suite cannot silently be guarding the wrong family), byte-equality with the en pack, and the same ban on the fallbacks.

Non-vacuity

Both suites carry their control in the file rather than as a one-off run: each pack's banned list is re-run against the addAutomation sentence that pack actually shipped, and must flag it. A list that silently stops matching therefore fails the suite instead of passing it. The call-site control additionally pins which three terms the retired English sentence must hit (automat, approv, notif), so deleting any one of them from the list turns the suite red rather than quietly narrowing it.

Not done

No browser run. The card's re-check is "open the maker bound to an existing app on an empty thread and read the fourth starter", and that needs a tenant environment with a published package; the change is ten strings plus one defaultValue, and both copies are pinned to each other and to the packs by the suites above. Stated rather than implied.

🤖 Generated with Claude Code

…omation v1 cannot build

The fourth edit-mode start chip — shown when the maker is bound to an existing
app (`?package=`) — asked for 「加一个自动化 —— 审批、状态流转或通知」. Approval,
status flow and notification are all refused by ADR-0112 v1 (cloud#1956 /
PR #1970), and the measured behaviour on the sibling chip family was not a
refusal but a silent degrade into a view, so the product recommended an
automation and would have handed back a page.

Rewording it was not available: a field, a view or a dashboard duplicates one
of the three chips beside it. Product ruling (epic cloud#1955): replace it with
sample data. The three surviving chips all add STRUCTURE; what an app that
already has objects most often lacks is DATA, and `seed` is on v1's authoring
whitelist (`V1_METADATA_TYPES`, commented "sample data").

`console.ai.suggestions.editApp.addAutomation` is now `addSampleData` in all ten
packs and in the call-site `defaultValue` fallback, which is a second copy of
the same string. A REVERT note beside the keys in every pack and at the call
site names ADR-0112 v2 as where this chip's automation wording returns, and the
retired sentence for each pack is kept verbatim in the new guard suite.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions github-actions Bot added the tests label Sep 5, 2026
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3187.1 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-BHUfuQMG.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) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 510.63KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.44KB 61.25KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
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) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
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) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
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) 0.20KB 0.18KB
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) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(i18n): the maker's EDIT-mode chip still offers 「加一个自动化 —— 审批、状态流转或通知」, which ADR-0112 v1 cannot build

1 participant