Skip to content

The report config panel is titled "Title" and the empty state says "Object Not Found" — call sites asking for a key whose value is not the copy for that slot #4118

Description

@yinlianghui

Surfaced by #3810's census (43 call sites whose inline defaultValue disagreed with the en value). Aligning them is mechanical and correct — the pack value is what renders — but a handful of the divergences are evidence of a different defect: the call site is asking for a key whose value was written for another slot, so users read the wrong copy today. Those are not fixable by alignment, and they are not in #3810's scope.

The clearest case: the report editor panel

packages/app-shell/src/views/ReportConfigPanel.tsx:143,147 asks for report.editor.title for BOTH the panel's aria-label and its heading. That key is the field label of the report's Title input, not a panel name — its neighbours in packages/i18n/src/locales/en.ts:1052 make that unambiguous:

editor: {
  breadcrumb: 'Configuration',
  basic: 'Basic',
  title: 'Title',
  titlePlaceholder: 'e.g. Pipeline by Quarter',
  description: 'Description',
  ...

So the panel heading reads "Title", and the complementary landmark is announced as "Title". The call site's own dead fallback said 'Edit report', which is what the author meant. Two users are affected differently: a sighted user sees an odd heading; a screen-reader user gets a landmark whose name says nothing about what the region is.

Others from the same census

call site key en renders the author's dead fallback
app-shell/src/views/InterfaceListPage.tsx:436 empty.objectNotFound Object Not Found Source object not found
app-shell/src/layout/InboxPopover.tsx:315 sidebar.activityFeed Activity feed Activity (a tab label beside Inbox)
app-shell/src/layout/AppSidebar.tsx:647 layout.appSwitcher.systemConsole System Console System
app-shell/src/views/RecordDetailView.tsx:1796 detail.unknownUser Unknown Unknown user
plugin-list/src/components/ViewSettingsPopover.tsx:216 list.color Color Row color
app-shell/src/console/home/HomePage.tsx:330 home.welcome Build your business system with AI Welcome to {{product}}

Each row is one of three things, and they need different fixes — which is why this is a triage card, not a patch:

  1. Wrong key — the slot needs a key of its own (report.editor.panelTitle, empty.interfaceSourceObjectNotFound). Adding a key obliges the other nine packs (all-locales-key-parity), so it is a real change, not a rename.
  2. Right key, pack copy is stale — e.g. list.color really is the "Row color" section. Then the fix is an en edit plus the nine translations (scripts/check-i18n-en-drift.mjs, i18n 门禁:en 文案变更时其余九包必须同批跟改(或显式挂账)——#3582/#3625 族缺陷缺的那道不变量 #3650).
  3. Deliberate, and the fallback was simply wrong — no action beyond what [finding] 8 处 auth 调用点的内联 defaultValue 与 en 包值不一致 —— key 存在故兜底是死代码,三道 i18n 门禁按设计都看不见这一类 #3810 already did.

home.welcome carries a second, independent defect: the call site passes a product parameter and the en value has no {{product}} hole, so i18next drops it silently. That is the class #3845 filed (its own instance was marketplace.action.updateTo); noting it there too.

None of this blocks #3810 — that PR aligns all 43 call sites to the pack, which is right regardless of how these rows are judged. What it does is make the mismatch visible in one place instead of hidden behind a dead string.


Generated by Claude Code

Activity

  1. self-assigned this
    on Aug 10, 2026
  2. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    CollaboratorAuthor

    Claim: PM loop round 5 (rolling slot refill; graded bug — the rendered copy is wrong TODAY at seven sites, e.g. ReportConfigPanel's heading and aria-label read "Title" because the call site borrows the Title FIELD's label key)
    Session: session_017Qqyix2QcnpUC9XeYVDzx3 · Branch: claude/issue-4118-wrong-slot-keys · Worktree: objectui-issue-4118
    File surface: the seven call sites the card enumerates (ReportConfigPanel + empty.objectNotFound, sidebar.activityFeed, layout.appSwitcher.systemConsole, detail.unknownUser, list.color, home.welcome — re-verify each) and, where the right key does not exist yet, new keys added to ALL TEN locale packs per the #3546 discipline (en value = what the site should say; nine translations follow the pack's existing sibling patterns). ⛔ en values of EXISTING keys are not changed (the drift gate's territory). Serial constraints: overlaps the i18n pack files that #3845 does NOT touch (its ruling deletes params, adds no keys); still, if both need en.ts, later-lands rebases — note it.
    Container & model: S, mode:subagent, model: opus


    Generated by Claude Code

  3. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    CollaboratorAuthor

    ACCEPT (objectui seat PM, session session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4137, delivered across a host restart by a continuation agent.

    The continuation protocol worked as designed: the dead dev's inventory (two call-site fixes, ten pack additions, both test files, changeset, five triage verdicts) was independently re-derived from source rather than trusted — every verdict confirmed, including the subtle one (site 6's toolbar-vs-popover key distinction, proven by the hidden sm:inline-flex responsive collapse making them the same panel). Two real wrong-slot defects fixed (the "panel titled Title" heading+landmark pair via a new ten-pack key; the colour section moved to the key ListView already uses for the same feature); the five class-3 verdicts each carry per-site evidence. The main merge brought #4136's gate and one sub-defect resolved upstream (home.welcome's inert param — correctly left alone, reported). Reverse verification split 6-red/2-green with the 2 greens being pack-premise guards that a call-site revert correctly cannot move.

    #4145 is a find worth its own attention: the report.editor.* namespace — 106 keys × 10 packs — has zero consumers now that its last accidental reader is fixed; no existing gate can see key→call-site orphans by construction. Held as observation-class for grading.

    Flipping ready + auto-merge. The freed slot goes to the v17 endgame (spec rc.6 pin bump + objectstack#7100's Studio removals, one PR).


    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