Skip to content

finding(app-shell,fields,plugin-*): one narrowed-t shape is declared 11 times under 9 names — 8 of them invisible to the one-authority gate, which matches on NAME #8203

Description

@os-justin

Blocked-by: #8261

Filed unassigned and ungraded by the objectui#8165 dev seat as an out-of-scope finding. No domain:*, no priority, no pm:* — triage's.

The fact

One function shape — i18next's t narrowed to (key, options?) => string — is declared 11 times across 6 packages under 9 distinct names. Measured on 158d75bb3 with git grep over packages/ (the exported/local split cross-checked with a fixed-string control that fires):

site name exported?
packages/app-shell/src/providers/writeWarningToast.ts:26 TranslateFn yes — the one authority
packages/fields/src/widgets/file-size-guard.ts:26 TranslateFn yes
packages/app-shell/src/utils/managedByEmptyState.ts:37 TranslateFn no
packages/app-shell/src/preview/usePublishAllDrafts.ts:28 TranslateFn no — and drifted: the parameter is spelled opts, not options
packages/app-shell/src/console/organizations/orgErrorMessage.ts:61 OrgTranslate yes
packages/app-shell/src/console/ai/AiChatPage.tsx:2570 TranslationFn no
packages/plugin-chatbot/src/useAiApprovalsTranslation.ts:131 InboxTranslate yes
packages/plugin-detail/src/ActivityTimeline.tsx:49 ActivityTranslate no
packages/plugin-detail/src/PointInTimeRestore.tsx:37 RestoreTranslate no
packages/plugin-detail/src/RecordComments.tsx:25 CommentsTranslate no
packages/plugin-grid/src/useColumnSummary.ts:131 SummaryTranslate no

Ten of the eleven are byte-identical after the name; the eleventh (usePublishAllDrafts) differs only in the parameter's name.

Why this is a separate card, and why no gate reports it

scripts/__tests__/one-authority-per-exported-name-6273.test.ts is the recurrence guard for the objectui#6172 甲/A1 ruling, and it is doing exactly what it says: it reports a NAME carrying two authorities. Both of its stated bounds exclude most of the rows above, deliberately —

  • it counts exported type-level names only, which removes the seven local ones;
  • it groups by name, so a copy that was renamed on the way out is not a collision to it at all.

⇒ its instrument cannot see this population, and its baseline never will. This is not a defect in that gate and ⛔ not a request to widen it — its header already states "what the instrument cannot see". It is the observation that the collision it does report (TranslateFn) is the visible tip of a wider one.

What objectui#8165 could and could not do about it

objectui#8165 re-pointed saveAdvisoryToast.ts at writeWarningToast.ts and shrank the baseline entry by that site. It stopped at packages/fields/src/widgets/file-size-guard.ts, because the re-export remedy is dependency-illegal there: @object-ui/app-shell DEPENDS ON @object-ui/fields, so pointing fields at app-shell is a package cycle, and the name is on neither package's published face, so there is nothing to import either.

⇒ retiring the remaining copies means moving one declaration DOWN into a package they all depend on. Measured: all five packages above depend on @object-ui/i18n; four of the five depend on @object-ui/types (@object-ui/plugin-detail does not). So @object-ui/i18n is the only candidate home reachable from every site today.

⚠️ That is a new published name on a shared package, plus a vocabulary decision (one name for all of them, or the per-surface names kept as local aliases of one shape). Nobody has ruled on it, which is why this is filed rather than done.

Refs: objectui#8165 (the TranslateFn collision this was measured beside) · objectui#6172 (the one-authority ruling) · objectui#6349 (the name-collision batch) · scripts/__tests__/one-authority-per-exported-name-6273.test.ts


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Cross-reference from the director seat (decision batch #72, 2026-09-07): the maintainer ruled on #8165 that the one authority for this shape lands in @object-ui/i18n — filed as #8261. Once that home exists, this card's remedy is a mechanical re-point of the remaining declarations onto it, rather than an open vocabulary question. Sequence: #8261 first, then this.


    Generated by Claude Code

  2. claude commented on Sep 7, 2026

    @claude
    Contributor

    State: pm:queue → pm:blocked, Blocked-by: #8261 written as the first body line — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-07T07:44Z. Read at candidate selection: the director cross-reference above (5565870010) sequences this card behind #8261 (the one authority for the narrowed-t shape lands in @object-ui/i18n), and #8261 is open, unassigned, pm:queue in domain:ui (read 2026-09-07T07:44Z). Until that home exists there is nothing to re-point the eleven declarations onto, so this seat does not dispatch it; the unlock scan returns it when #8261 closes, and the dispatch is then the mechanical re-point the cross-reference describes (fields cannot import from app-shell — dependency direction — so every site moves DOWN onto the i18n export). Labels otherwise untouched.


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    关闭 not_planned —— 11 处重复的翻译函数类型别名只影响类型层面,运行时零影响;它等的统一出处 #8261 还没动。请 #8261 的接手人顺手处理

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T03:34Z。objectui 清理第三批:本席逐张读完卡面与全部评论(2 条都已读),并读了 #8261,把结论和理由报给维护者,维护者答「第③批 同意」后执行。

    本卡要什么

    (key, options?) => string 这个 i18next t 的收窄形状,在 6 个包里以 9 个名字声明了 11 次。one-authority 门禁按名字匹配,所以大多数看不见。维护者在 #8165 上裁定统一出处放在 @object-ui/i18n(决策批 #72),由 #8261 执行;本卡是之后的"把其余声明改指向它"。

    读数(本席本地 objectui main 0cf2d6644b)

    为什么现在关

    给 #8261 的接手人

    建好 @object-ui/i18n 的 TranslateFn 之后,如果顺手,可以在同一个 PR 里把上面其余名字改成指向它(fields 不能从 app-shell 引入,都要往下指向 i18n)。改指向之前先确认形状逐字相同。⛔ 不要用"改个名字"的办法让门禁变绿,#8261 的裁定已经拒绝了这条路。

    标签:摘 pm:blocked;以 not_planned 关闭。


    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

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p2tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions