Skip to content

Activity feed stores the record name in the writer's language: a reader in another locale sees the other language #29962

Closed

Description

@objectstack-fleet

Found by the hotclm app (objectstack-ai/hotclm#157, PR #202) on @objectstack/* 18.3.0.

What happens. hotclm names four child objects with a formula display_name that uses label(record.FIELD) (objectstack#26608), so toasts, related lists and the record H1 follow the reader's locale. The activity panel on the record page does not: an en-US reader of a review created by a zh-CN user reads Created Review "法务 · Legal Counsel 1", and a zh-CN reader reads 更新了 合同版本 "v6 · Clean" after a system-context update. The verb and the object label render per reader; the record name does not.

Seam. sys_activity.record_label (and the quoted name inside summary) is stored when the write happens, in the writer's Accept-Language (a system write gets the declared English labels).

Expected. The activity entry renders the record name for the reader, for example by resolving the name at read time when the object's name field is a formula, or by storing the record reference and rendering the label on read.

Dedupe: no issue mentions record_label or the activity feed's locale.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 kept · domain:ui kept · pm:queue kept · 2026-11-03T18:55Z

    ⛔ Not a claim.

    • Read fresh. sys_activity.record_label and the quoted name in summary are stored in the writer's language, so a reader in another locale sees that language in the activity feed. p3 kept: an i18n display gap on one panel.
    • If the chosen fix resolves the name on the server read rather than in the panel, that half is domain:server's. Say which in the PR.

    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

    Claim: PM loop round 1 · 2026-11-05T10:50Z
    Session: session_01L6bhgUR8Nu4M7tbtgES7q2
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: the card thread's designated claude/project-thread-* branch, named in its first report
    Worktree: objectstack-issue-29962
    Domain: domain:ui
    Seat: domain:ui#6
    File surface: ui/packages/plugin-detail/src/renderers/recordActivityFeed.ts, ui/packages/plugin-detail/src/RecordActivityTimeline.tsx, ui/packages/plugin-detail/src/recordTimelineStream.ts and their tests; read-only on ui/packages/app-shell/src/views/RecordDetailView.tsx unless the record's reader-locale name must be passed down (then only the prop that carries it); one root .changeset/ file. ⛔ packages/plugins/plugin-audit/** and any server read path: if the reader-locale name can only come from a server read, stop and report (triage 6612785923: that half is domain:server's)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: packages/plugins/plugin-audit stores sys_activity.record_label (and the quoted name in summary) in the writer's language, and the record-page activity panel in ui/packages/plugin-detail draws it as stored | none: the record page already resolves the record's own name per reader (H1, related lists) but the feed does not use it | any reader whose locale differs from the writer's on an object whose name field is a formula over label(...); reached today by the hotclm app (objectstack-ai/hotclm#157) on 18.3.0
    Thread-read: 6612785923
    Premise: holds — at a91409c4 recordActivityFeed.ts:1004 draws row.summary as stored; no ui file reads record_label at read time
    Serial constraints cleared: none in flight on ui/packages/plugin-detail/src/renderers/recordActivityFeed.ts or RecordActivityTimeline.tsx (open PRs read 10:47Z; PR #30378 touches plugin-detail body tables, not the feed). No maintainer ruling on this card; triage 6612785923 asks the PR to say which side resolves the name.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

    席位核对 · Amendment · 2026-11-05T10:52Z · claim 6656106262 branch named

    Branch: claude/project-thread-d97x01

    The card thread's harness-designated branch (a project-thread platform exception to the claude/issue-<n>-<slug> convention); the dev thread is session session_01L6bhgVKbmZ6tBvw9qv8rir. Everything else in claim 6656106262 stands.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgVKbmZ6tBvw9qv8rir
    os-dev-report
    {
    "issue": 29962,
    "status": "done",
    "branch": "claude/project-thread-d97x01",
    "pr": "#30438",
    "session": "session_01L6bhgVKbmZ6tBvw9qv8rir",
    "premise_still_valid": true,
    "summary": "Read-time ui fix, no server path touched. Measured: plugin-audit re-composes summary in the reader's language on read, but its label parameter is the stored writer-language record_label, so the reader-language sentence quotes the writer's name. activityRowToFeedItem now carries record_id and record_label as a package-local hand-off (no @object-ui/types member); RecordActivityTimeline replaces the first quoted stored name in each summary of the page record with the value of the object's name field on the page's record (the H1's name), only when that name field is a formula. Panel, stream and peek variants all read it. Text name fields are untouched (a rename does not rewrite older rows); formula-named rows show the record's current name, which is named as an acceptance note on the PR.",
    "tests": "Head 8f4210c (fix 736d4ac; two later commits add then remove evidence, net diff identical). New RecordActivityTimeline.readerRecordName-29962.test.tsx: 14 passed. Positive control with src at fdd0641: 9 failed, 5 passed (all 5 reader-name DOM tests red). Ablation via scripts/ablation-replace.mjs, anchor 'readerRecordId !== undefined && readerRecordName !== undefined' to 'false' in RecordActivityTimeline.tsx, anchor 1 to 0, restored to HEAD blob 3507152b, git diff HEAD empty: 5 failed, 9 passed (exactly the reader-name DOM tests); vitest aliases @object-ui to src, no dist leg. Package suite pnpm --dir ui exec vitest run packages/plugin-detail/: 371 files passed 1 skipped, 3311 tests passed 18 skipped, VERDICT command-exit 0. pnpm --filter @object-ui/plugin-detail run type-check (both tsconfigs): VERDICT command-exit 0. Real stack: app-showcase with a formula nameField patched in, zh-CN writer via REST, en-US Console reader: before Created Project with the zh label quoted, after Created Project with Active quoted; screenshots at evidence commit c86b862, linked from the PR.",
    "gates": "dispatch-gates --commands at 8f4210c: 35 families, all run, every one exit 0 (34 node/pnpm checks plus pnpm --dir ui exec vitest run scripts/ with 170 files passed 2 skipped). --ran reconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs: in_progress at report time; the 5 type-check CI lanes are CI's.",
    "dogfood_battery": "n/a — no ! in the PR title and Clause-② is no with no (narrowing) arm",
    "mcp_calls": "MCP GitHub writes: 0. Session tool subscribe_pr_activity on PR 30438 (a subscription, not a GitHub write). Reads used gh api.",
    "api_writes": "2 relay writes: pr_create (objectstack-ai/objectstack, PR 30438, draft, no assignees, no labels) and this comment via post-stamped.mjs. git push of the harness branch is not a REST write.",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: domain:server · noted, not filed — sys_activity summaries drawn off the record page (home or My Work feed in app-shell, Setup dashboards) still quote the writer-language record name; a per-reader name there needs the server half (store the record reference, render the label on read), which triage 6612785923 assigns to domain:server"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

    Landing · 2026-11-05T11:59Z · PR #30438 merged as df4c06e6b (2026-11-05T11:57Z; seat ACCEPT 6657085289 on head 8f4210c8)

    probe on origin/main after the merge reading
    export function withReaderRecordName in ui/packages/plugin-detail/src/renderers/recordActivityFeed.ts 1 hit
    withReaderRecordName( call in ui/packages/plugin-detail/src/RecordActivityTimeline.tsx 1 hit

    State: Fixes #29962 closed the card; pm:dispatched removed in the same stroke as this comment. Off-page activity feeds (home / My Work, Setup dashboards) stay out of scope: not measured at a public entry, so no card (ACCEPT 6657085289, 范围外去向).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions