You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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-audit ⇒ domain: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)
Thread the existing locale-bound translate into renderTrackedChangeSummary and resolve the field label through it, exactly as the three sibling branches already do.
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.
The ∅ → notation stays as-is. Unit tests in plugin-audit for both halves.
Explicitly OUT of scope (needs its own ruling if ever wanted)
Historical rows keep their write-time composition; only new writes improve. This is accepted under this card.
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.
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:queueonly;domain:*is the triage seat's to apply (expected lane:plugin-audit⇒domain:identity).Measured mechanism (objectui#4055 dev run, 2026-08-10, against objectui
59df371f7+ this repo's checkout)${label}: ${from} → ${to}with∅for empty lives atpackages/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).audit-writers.ts:882) passes(getFieldDefs(ctx.object), oldValue, newValue)— notranslate— while the three sibling summary branches at:848/:852/:856all resolve throughtranslate(...)/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.displayFieldValueresolves select/picklist option labels only; aField.lookup(...)value falls through toString(value)— the raw 32-char id.RecordDetailView.tsx:1482mapsbody: row.summary;RecordActivityTimeline.tsx:473-477prints it as text). The record HISTORY tab is a different, already-correct path.sys_activity.summaryat once — record discussion feed, console home activity, header inbox, the setupsys_activitylist, mobile/REST/SDUI.Scope (adopting the dev's recommendation A — restore-invariant, both halves in one file)
translateintorenderTrackedChangeSummaryand resolve the field label through it, exactly as the three sibling branches already do.displayFieldValuea 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.∅ →notation stays as-is. Unit tests in plugin-audit for both halves.Explicitly OUT of scope (needs its own ruling if ever wanted)
sys_activity.summaryfrom "the user-facing display string" (the contract plugin-audit captureBefore still fetches its own pre-image — retire the second read once the engine binds ctx.previous before every before* dispatch #6656's masking and ADR-0053 assume) to "a fallback for client recomposition", and it fixes one of four consumer surfaces. If per-viewer locale is judged a requirement, that is a framework-contract change to decide explicitly — not to smuggle into this bug fix.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 thetarget:v17board is the framework board producer's call.Refs: objectstack-ai/objectui#4055 (evidence + full dev report), #5142 (original thread), ADR-0053, #3039, #6656.