Skip to content

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

Description

@hotlong

Found while doing cloud#1984 (PR reworded the five from-scratch start chips so they promise only what ADR-0112 v1 delivers). Filed rather than folded in: the five chips that card names are the console.ai.suggestions.metadataAssistant.* family, and this is a different family with a different answer.

Observation

packages/app-shell/src/console/ai/AiChatPage.tsx editAppSuggestions() renders the empty-state starters for the maker bound to an EXISTING app (?package=). Its fourth chip is, in all ten packs:

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

Every noun in it — approval, status flow, notification — names a capability ADR-0112 v1 (cloud#1956 / PR #1970) does not author. It is the same defect class cloud#1984 was filed for, on the same surface, one chip family over: the product recommends something the first version will not build, and the measured behaviour on the sibling chips was a silent degrade into a view rather than a refusal.

The other three edit-mode chips (addField, addObject, addDashboard) are all inside v1's whitelist.

Why this is not just "reword it like the other five"

The from-scratch chips each had a v1-honest business scenario to fall back to. This one does not: rewording it to ask for a field, a view or a dashboard duplicates one of the three chips beside it, so the honest options are

  1. drop the fourth chip in v1 and restore it in v2 (three starters instead of four), or
  2. replace it with a fourth v1 capability that is not already offered — a page, a calendar/gallery view, or sample data.

Which of those is right is a product call on the maker's edit-mode surface, not a translation fix, which is why this is a separate card.

Where

  • packages/app-shell/src/console/ai/AiChatPage.tsx — editAppSuggestions(), key console.ai.suggestions.editApp.addAutomation and its defaultValue
  • packages/i18n/src/locales/*.ts — the same key in all ten packs

Re-check: open the maker bound to an existing app (?package=) on an empty thread and read the fourth starter.

Related: cloud#1984 (the from-scratch chips, fixed), ADR-0112 D2 (the v2 line where the automation wording comes back).

Activity

  1. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    Triage routing: domain:ui + needs-user-decision + priority:p2 + i18n;finding 保留。

    objectui 分诊(由中央分诊席兼理,session_01SwJQDFKe8tVit3BXQ9EfR5,R+163)。⛔ 本席不认领、不派工、不写代码、⛔ 不裁决 —— 下面只把决策摆清楚。origin/main = 4ce14f1。

    复现:逐条成立

    AiChatPage.tsx:2619
      t('console.ai.suggestions.editApp.addAutomation',
        { defaultValue: 'Add an automation — an approval, a status flow, or a notification.' }),
    
    三个 v1 白名单内的姊妹(卡称"都在 v1 内"):
      :2616  editApp.addField      'Add a field to one of the objects.'
      :2617  editApp.addObject     'Add a new object and relate it to an existing one.'
      :2618  editApp.addDashboard  'Add a dashboard for the key metrics.'
    
    语言包:10 个文件携带该键(与卡面「in all ten packs」一致)
      zh.ts:1834  addAutomation: '加一个自动化 —— 审批、状态流转或通知。'
    

    ⇒ 四个 chip 里,第四个是唯一一个承诺 v1 造不出来的东西的。

    为什么进决策箱(⛔ 不入队)

    卡自己把界划得很准,本席照办:

    Which of those is right is a product call on the maker's edit-mode surface, not a translation fix, which is why this is a separate card。

    ⇒ 两条路都自洽,且都不是"照着另外五个 chip 重写一遍"能得到的 —— 因为它们各有一个真实代价(见下)。⇒ 需要产品侧拍板,⛔ 本席不代选。

    ⚠️ 并且这是本会话不能裁的那一类:本席是 claude-opus-5,CONTRACT_REVIEW_TIER 硬闸要求 fable。⇒ 仅归档、摆证据。

    四facet 决策块

    ① 问题:绑定到已有 app(?package=)的 maker 空态第四个起始 chip,推荐用户去做审批 / 状态流转 / 通知 —— 三个名词全部是 ADR-0112 v1(cloud#1956 / PR #1970)不生成的能力。v1 应当推荐哪一件事?

    ② 两个选项(卡面所列,本席未增删)

    • (1) v1 里去掉第四个 chip,v2 再放回来 —— 起始项从 4 个变 3 个。
      • 代价:空态少一个入口;⭐ 但 ADR-0112 D2 已经明确了 v2 会把自动化措辞放回来,所以这是有归期的临时收缩,⛔ 不是永久删功能。
    • (2) 换成另一个 v1 能做、且尚未被提供的能力 —— 卡列出三个候选:页面、日历/画廊视图、样例数据。
      • 代价:需要产品决定哪一个最值得占这个位置;⛔ 不能选字段/视图/仪表盘(会与旁边三个重复 —— 这正是卡指出的、使"照抄改写"不可行的原因)。

    ③ 证据

    • 同类先例已修:cloud#1984 把五个 from-scratch chip 改成只承诺 v1 能交付的东西 ⇒ 同一缺陷类、同一表面、隔壁 chip 家族。
    • ⚠️ 实测的失败模式是静默降级,⛔ 不是拒绝 —— 卡面:「the measured behaviour on the sibling chips was a silent degrade into a view rather than a refusal」。⇒ 用户点了这个 chip,不会被告知"v1 做不了",而是拿到一个视图。这是本卡定 p2 而非 p3 的关键。
    • 三个姊妹 chip 均在 v1 白名单内(上节实测),⇒ 问题孤立在第四个。

    ④ 未测量

    • 该 chip 的实际点击率(若极低,选项 1 的代价接近零)——本席无此数据面。
    • 三个候选替代能力(页面 / 日历-画廊视图 / 样例数据)在 v1 里各自的完成度:卡说它们在 v1 内,但⛔ 未逐个验证其空态体验是否足以撑起一个起始 chip。⇒ 若走选项 2,这一项必须先测,否则可能把一个"承诺做不到"换成另一个。

    priority:p2

    ⛔ 不按"改几行文案"降 p3:这不是措辞问题,是产品在向用户推荐它做不到的事,且失败方式是静默降级(用户以为自己得到了自动化,实际拿到一个视图)。⇒ 用户可见、且会侵蚀对 maker 的信任。

    ⛔ 不给 p1:无数据损失、无安全面,影响限于空态引导。

    ⭐ 提级条件:若测到用户点击该 chip 后产生了看起来成功但语义错误的产物(而非仅仅"变成一个视图"),重估 p1。

    ⛔ 一条给接手人的边界

    ⛔ 不要把本卡当成 cloud#1984 的补丁去做。卡明确写了:那五个是 console.ai.suggestions.metadataAssistant.* 家族,本卡是另一个家族、另一个答案(console.ai.suggestions.editApp.*)。⇒ 两者的修法不同:前者每个都有 v1-honest 的业务场景可退,本卡这个没有。

    ⭐ 裁决落地后,改动面很小且已由卡定位清楚:AiChatPage.tsx:2619 一处 + packages/i18n/src/locales/*.ts 十个包同一个键。⚠️ 若选选项 1,请同时决定这十个包里的键是删除还是保留待 v2——ADR-0112 D2 说措辞会回来,保留(不渲染)可能比删了再加回来省事,但那要看本仓对"未使用的 i18n 键"的既有规矩,本席未查,据实标明。


    Generated by Claude Code

  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    Status note (director seat, objectstack#12708 summon #15, 2026-09-05T15:3xZ): the maintainer has assigned this card to someone else — verbatim, live director chat: 「7709 已经安排其他人处理了」. This seat withdraws it from decision batch #50, records no ruling, and does not follow it; labels left as they are for whoever the maintainer named.


    Generated by Claude Code

  3. self-assigned this
    on Sep 5, 2026
  4. hotlong commented on Sep 5, 2026

    @hotlong
    ContributorAuthor

    Claim + 产品裁决(epic cloud#1955 车道,2026-09-05 22:40 CST)

    裁决:选项 2,第四个 chip 换成「补示例数据」。

    理由:另外三个编辑态 chip(加字段 / 加对象 / 加仪表盘)都在加结构,而一个已有应用最常见的缺失是没有数据 —— 复验里「应用开出来是空的」是一条独立发现(cloud 侧 create-seed-empty 系列),用户建完应用第一件想做的事就是让它看起来像真的。换成页面或日历视图都更小众;砍成三个则白丢一个位置且与 v2 回滚不对称。

    Claim: epic cloud#1955 lane
    Session: wonderful-driscoll-ac0895 (cloud PM session, Fable 5.1)
    Branch: fix/edit-mode-chip-v1-honest-7709
    Worktree: ~/Documents/GitHub/objectui-issue-7709
    Domain: objectui i18n 文案 + maker 编辑态空状态
    File surface: packages/app-shell/src/console/ai/AiChatPage.tsx(editAppSuggestions() 与其 key/defaultValue), packages/i18n/src/locales/.ts(十个语言包的同一 key), 相应测试, .changeset/
    Container & model: general-purpose subagent reading objectstack/.claude/agents/os-dev.md, inherit tier
    Clause-②: no
    Serial constraints: cloud#2008 的 pin bump(PR #2009)已入队并含 #7710;本卡合入后需要下一次 .objectui-sha bump 才到云端

    Generated by Claude Code

  5. hotlong commented on Sep 5, 2026

    @hotlong
    ContributorAuthor

    os-dev-report

    {
      "issue": 7709,
      "status": "done",
      "branch": "fix/edit-mode-chip-v1-honest-7709",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7766",
      "premise_still_valid": true,
      "summary": "Premise re-verified on origin/main 3e377c931: all four editApp chips are exactly where the card says, and all ten packs carried a full translation of console.ai.suggestions.editApp.addAutomation (none was fallback-only). The PM ruling (option 2, sample data) also holds on contact — cloud service-ai-studio/src/authoring-whitelist.ts lists 'seed' in V1_METADATA_TYPES with the comment 'sample data', and that whitelist is version-scoped rather than mode-scoped (its header names apply_edit, the edit-mode path, among the callers that read it), so the maker bound to an existing app can actually author what the new chip asks for. Implemented: the key is now addSampleData in all ten packs and in the call-site defaultValue fallback, with a real business sentence per locale rather than a literal 'add sample data'. JUDGEMENT CALL worth PM review: I RENAMED the key instead of only swapping its value — a key named addAutomation serving a sample-data sentence is declared-vs-actual drift, and the rename makes the v2 restore additive; check:i18n-drift reads it as a key-set change and defers to all-locales-key-parity, which is green. A REVERT note sits beside the keys in every pack and at the call site and says specifically that THIS chip's automation wording returns as addAutomation at ADR-0112 v2; each pack's retired sentence is kept verbatim in the new guard suite so v2 need not reconstruct ten translations. One standing-clause conflict, flagged not silently chosen: os-dev.md asks for the session-URL Generated-by footer on a created PR body, the dispatch word asked for the 'Generated with Claude Code' footer that merged sibling PR 7710 carries; I followed the dispatch and the repo precedent.",
      "tests": "All re-run on the final commit 4d1e0be1b. Host is macOS/Node v26.7.0 and scripts/pm/os-verify-lock.sh printed 'VERDICT command-exit 0 · UNLOCKED (declared) · no usable flock on this host' on every heavy run — declared narrowing, nothing was serialized. Exit codes captured by redirecting first, never through a pipe. 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 packages 'Done'; both packages' tsconfig.test.json include src/**/*.test.ts, so the two new suites ARE compiled, not merely excluded-and-green. vitest packages/i18n/ packages/app-shell/src/console/ai/ exit 0 — 'Test Files 84 passed (84)', 'Tests 1162 passed (1162)'. The two new suites plus the two 7710 suites plus all-locales-key-parity: exit 0, 'Test Files 5 passed (5)', 'Tests 114 passed (114)'; new suites alone are 42 + 4 cases. pnpm lint (whole farm) exit 0 — 'Tasks: 47 successful, 47 total', '2883 problems (0 errors, 2883 warnings)', the same warning count main carries; targeted eslint --format json on the 13 changed files: 13 files, 0 errors, 31 warnings, every one pre-existing in AiChatPage.tsx and none in the edited region. Gates: check:i18n-keys 0, check:i18n-drift 0 ('0 en value(s) changed (1 key(s) added, 1 removed — those are all-locales-key-parity's)'), check:control-bytes 0 ('scanned 6322 tracked text file(s)'), check-changeset-presence.mjs 0 ('13 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'), check-changeset-no-major.mjs 0. No ablation run: nothing here is a new gate, so the non-vacuity duty is discharged IN the suites — each pack's banned list is re-run against the addAutomation sentence that pack actually shipped and must flag it, and the call-site control pins the three terms (automat/approv/notif) the retired English sentence must hit, so a list that stops matching fails the suite instead of passing it. Pack edits were applied by script and each one proved on disk by reading the file back and asserting the new line present / retired sentence absent — the edit tool's exit code was not used as evidence. CI on 4d1e0be1b is FULLY GREEN and was watched to convergence per the dispatch's per-card exception: 32 check runs, 29 completed/success, 3 completed/skipped, 0 failures, 0 pending — Lint, Type Check, Build and E2E, Bundle Analysis and all four Test shards among the successes.",
      "mcp_calls": "0 — no MCP GitHub calls; every read and write went through the gh CLI (REST for check-runs, since GraphQL has been rate-limited)",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Not done, stated rather than implied: 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', which 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 two new suites. And cloud needs a .objectui-sha bump before any of this reaches the product — cloud#2008 / PR #2009 is queued and carries objectui#7710, so this one needs the bump after it.

    Generated by Claude Code

  6. hotlong commented on Sep 5, 2026

    @hotlong
    ContributorAuthor

    ACCEPT — PR #7766 入队(14 文件,29 项检查成功 / 3 跳过 / 0 失败)。

    你把裁决在动手前验了一遍,这是对的顺序。 我在裁决里给的理由是「示例数据在第一版白名单内」,你没有采信,而是去 cloud 的 authoring-whitelist.ts 确认 seed 确实在 V1_METADATA_TYPES 里、且那份白名单是按版本而不是按模式划分的(其头部把 apply_edit 这条编辑态路径列在读取者中)。所以绑定到已有应用的 maker 真能造出新 chip 承诺的东西——不是第二个空头承诺。这正是这张卡存在的意义,如果反过来,我要的是你停下来上报。

    重命名 key 而不是只换值,我认可,并且认为它比原方案好。 一个叫 addAutomation 的键服务于一句示例数据文案,就是声明与实际的漂移——本专题今天已经在四五个地方吃过这种亏(诊断报启动模型、守卫漏列工具组、验收词拼错路径)。改名让 v2 的恢复是增量而不是再改一次值,而且你把每个语言包退场的那句原文逐字保存在新的守卫套件里,v2 不必重新翻十遍。

    非空转的处理也对:没有新增门禁就不做消融,而是让每个语言包的禁词表回跑它自己曾经发布的那句自动化文案并且必须判红——词表一旦失效,套件会红而不是绿。这比一句「测试通过」有意义得多。

    落地路径:本 PR 合入 objectui 后,需要下一次 .objectui-sha bump 才到云端。当前的 pin bump(cloud#2008 / PR #2009)已入队但不含本 PR,所以这一条会随发版前的最后一次 bump 一起过去,我已记在 epic #1955 的发版清单上。

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions