Skip to content

plugin-audit: renderTrackedChangeSummary never receives the translator, and displayFieldValue prints raw lookup ids — sys_activity.summary ships Rating Owner: ∅ → oBK25… onto every feed surface (re-routed from objectui#4055) #7230

Description

@yinlianghui

Re-routed from objectstack-ai/objectui#4055 (originally #5142, migrated 2026-08-10 under the #7167 file-at-destination ruling). The re-route exists because the dispatched dev measured the file-at-destination to be this repo, not objectui — the console never composes the string; it prints a column this repo's plugin composes at write time. Transfer per the cross-seat protocol: pm:queue only; domain:* is the triage seat's to apply (expected lane: plugin-auditdomain:identity).

Measured mechanism (objectui#4055 dev run, 2026-08-10, against objectui 59df371f7 + this repo's checkout)

  • The template ${label}: ${from} → ${to} with for empty lives at packages/plugins/plugin-audit/src/audit-writers.ts:330 (renderTrackedChangeSummary) and :308 (displayFieldValue — empty branch returns '∅'). The glyph has zero occurrences in objectui's feed/timeline path (grep evidence on the source card).
  • Label half: the single call site (audit-writers.ts:882) passes (getFieldDefs(ctx.object), oldValue, newValue)no translate — while the three sibling summary branches at :848/:852/:856 all resolve through translate(...) / displayLabelFor(ctx.object, translate). The tracked-change branch is the one branch never handed the locale-bound translator: a plain oversight against ADR-0053 / [plugin-audit] 活动 summary 硬编码英文动词 + 用对象 API 名(非 label),无 i18n(zh-CN 显示 Created os_xxx) #3039's write-time localization.
  • Value half: displayFieldValue resolves select/picklist option labels only; a Field.lookup(...) value falls through to String(value) — the raw 32-char id.
  • objectui side is a pass-through with nothing to fix (RecordDetailView.tsx:1482 maps body: row.summary; RecordActivityTimeline.tsx:473-477 prints it as text). The record HISTORY tab is a different, already-correct path.
  • Blast radius of the producer fix: every consumer of sys_activity.summary at once — record discussion feed, console home activity, header inbox, the setup sys_activity list, mobile/REST/SDUI.

Scope (adopting the dev's recommendation A — restore-invariant, both halves in one file)

  1. Thread the existing locale-bound translate into renderTrackedChangeSummary and resolve the field label through it, exactly as the three sibling branches already do.
  2. Give displayFieldValue a lookup branch: render the referenced record's display/title field (batched read per distinct target object per write — mind the write hot path), falling back to the raw id when unresolvable.
  3. The ∅ → notation stays as-is. Unit tests in plugin-audit for both halves.

Explicitly OUT of scope (needs its own ruling if ever wanted)

Release-board note (for the triage seat, not self-applied)

The user-visible symptom (untranslated label + raw id at the bottom of an otherwise fully-localized zh-CN page) was measured on a shipped deployment; objectui#4055 carried bug. Whether this makes the target:v17 board is the framework board producer's call.

Refs: objectstack-ai/objectui#4055 (evidence + full dev report), #5142 (original thread), ADR-0053, #3039, #6656.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions