fix(platform-objects): restore the declared title on the System Overview by-action table and pin the default-locale bundle to the source - #8767
Merged
hotlong merged 3 commits intoAug 14, 2026
Conversation
…iew by-action table and pin the default-locale bundle to the source (#8721) `widget_recent_events` became an ADR-0021 dataset-bound breakdown of audit events by action, but all four hand-authored locale bundles kept the pre-conversion title (`Recent Audit Events` and its three translations). The translation is what renders, so the declared string reached nobody in any locale; the widget's `description` had drifted the same way. Restoring the source string exposed the duplicate it was masking: the Row 3 pie (`widget_events_by_type`) and this table both declared `Audit Events by Action` over the same dataset and dimension. The pie keeps the broad name (the share picture); the table becomes `Event Volume by Action` — the exact per-action count its `values: ['event_count']` produces, which is what its description already said. Widget ids are untouched, so no translation key or persisted widget state moves. - correct `widget_recent_events` title + description in en / zh-CN / ja-JP / es-ES (leaf values only — this half is hand-authored and regenerating it would delete the runtime-contributed nav translations) - add the default-locale content-parity assertion to `app-nav-translation-parity.test.ts`: every declared app label/description, statically declared nav label, dashboard label/description and widget title/description must appear in `en.ts` verbatim. Every pre-existing claim in that file is a key-set claim, which a stale value satisfies. - stale-marking for TRANSLATED locales when a source string changes is deliberately not designed here — it needs a product decision on what a stale translation should do. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XeQRiAa7vYRVX5Fog7Zby8
… tracking issues (#8721) The default-locale content check documents two gaps it does not close: the `pages.*` section (sources live in @objectstack/cloud-connection and @objectstack/mcp, which this package must not import) and the translated locales (what a stale translation should do is a product decision). Both were argued in the comments and tracked nowhere. - `pages.*` gap -> #8764, with the note that it is unguarded in EVERY locale including `en`, and that `check:app-nav-i18n` is the gate that can see it - translated-locale gap -> #8765, with the consequence pinning `en` has on it: the drift stops being uniform across four bundles and becomes locale-specific Comment-only; no assertion changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XeQRiAa7vYRVX5Fog7Zby8
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
This was referenced Aug 14, 2026
hotlong
marked this pull request as ready for review
August 14, 2026 21:46
hotlong
deleted the
claude/issue-8721-widget-recent-events-title-parity
branch
August 14, 2026 22:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #8721
widget_recent_eventswas converted into an ADR-0021 single-form — a dataset-bound breakdown ofsys_audit_logevents by action — but all four hand-authored locale bundles kept serving the title the widget had before that conversion. The translation is what renders, so the declared string reached nobody in any locale. Itsdescriptionhad drifted the same way, one field over.What changed
1. The four stale bundle values. Leaf-value edits only — this half is hand-authored and regenerating it would delete roughly 40 runtime-contributed nav translations per locale (
scripts/i18n-extract.config.tsdocuments why).enzh-CNja-JPes-ES2. The duplicate the stale translation was hiding. With the source string restored, the board carried the same label twice:
widget_events_by_type(a pie) andwidget_recent_events(a table) both declaredAudit Events by Action, over the same dataset and the same dimension. They looked distinct in a running instance only because one of them was serving a stale translation — so the duplicate was invisible in the UI and visible only in the source.The pair now splits on what each one adds: the pie keeps
Audit Events by Action(the share picture), the table becomesEvent Volume by Action(the exact per-action count, which is what itsvalues: ['event_count']produces and what its description already said). The pie is left untouched deliberately, so this PR does not re-translate three bundles' worth of strings that were never stale. All nine widget titles on the board are now distinct, in all four locales.Widget ids are unchanged, so no translation key, persisted widget state or dataset binding moves.
3. The gate that would have caught it. Every pre-existing claim over this half is a key-set claim —
app-nav-translation-parity.test.tsasserts a translation exists and does not outlive its declaration,check:i18n-coverageratchets untranslated labels,check:app-nav-i18njudges the merged nav tree. A key whose value is stale satisfies all of them.That test now also asserts the default locale's content: every statically declared app label, description and nav label, plus the dashboard's label, description and every widget title/description, must appear in
en.tsverbatim. The claim is available forenalone becauseenis a copy of the source rather than a translation of it — the same invariant the generated half of this package's i18n already enforces by rewriting itsenbundle on every extract.Positive control — the assertion is shown to fail
An assertion that cannot fail is worse than none, so it was broken three ways at the committed state and restored from the commit each time (never
git stash):en.tswidget title dragged back toRecent Audit Eventsdashboards.system_overview.widgets.widget_recent_events.titlewidget_events_by_user.description)en.tsapp nav label suffixed with(stale)apps.account.navigation.grp_account_inbox.labelEach run reported 1 failed, 23 passed: the 23 pre-existing key-set claims stayed green under every stale value, which is exactly the blindness this card was filed for, reproduced and then caught.
Verification
Gate union re-run after the final commit, at
aefb22fe5— all green:platform-objectstest (20 files, 380 tests) andtypecheck;check:i18n,check:i18n-coverage,check:app-nav-i18n;check:changeset-gate-self-tests,check:objectui-changeset,check-adr-0087-registration,check-changeset-no-major,check-empty-changeset;check:query-options-erasure;check:nul-bytes;check:type-check-coverageand thecheck:type-check-debtratchet over the built closure — this package'stsconfig.jsonexcludes**/*.test.ts, so the new test code's types are verified by that re-measure (it lifts the exclusion) rather than bypnpm typecheck, and its exactTEST_DEBTof 3 is unmoved.Deliberately not done here
Stale-marking for translated locales when a source string changes — a product decision on what a stale translation should do, excluded by this card's triage fence. Filed as #8765 rather than designed here, with the observation that pinning
ensharpens the asymmetry rather than reducing it: the drift stops being uniform across four bundles and becomes locale-specific, invisible to any reviewer reading the product in English.Also filed: #8764 — the
pages.*third of these bundles mirrors page metadata authored in other packages, so it is outside this walk in every locale includingen. Nothing is stale there today; the two deliberate gaps are now cross-referenced from the test's own comments instead of being argued and tracked nowhere.Neither is addressed in this PR.
Generated by Claude Code