Skip to content

social: the face-room status chip draws four of its five states in English in a zh UI #3090

Closed

Description

@HugoXK

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.

Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: 1d47d64c35824e5b933240fb5e4f2be3
Branch: dev/5-face-chip-i18n
Base: ca07de0
At: 2026-11-15T00:41:08Z

Bot: FlyBot Dev-5
Tier: T2 (plugins/** is a T2 path and outranks the T1 slice core/src/client/i18n.js + rebuilt core/client.js; docs are T0)

Dedupe (live main ca07de0289 + closed issues): faceChipLabel → 3 hits, all closed (#2994, #2996, #3001), and all three are friend-card labels drawn without t(), a different surface from the face-room chip; "face chip" → 17 hits, none open; "face-status" → 13 hits, none open about its copy. No open issue or PR covers this chip. This is not #2520/#3079 territory.

What happens

In a zh UI the face-to-face room card draws its status chip in English for four of its five states. faceChipLabel in plugins/social/client.js routes only the first branch through the dictionary:

  • Open → 打开 (correct, it calls tr('Open'))
  • Closed → Closed
  • Left → Left
  • candidate whose deadline has passed → ended (the lowercase state id itself, not a word)
  • candidate without a deadline → Joining

So the chip is half-localised, and one branch leaks an internal status id into the UI.

Reproduction

Mount FaceRoomCard in the read-only face-room view with the zh locale installed, and read the chip element data-flybot="face-status" for each of the five states. At live main the readings are the five above. Red measurements on plugins/social/client.js before the fix: # tests 5 / # pass 1 / # fail 4, identical on two runs.

Expected

Every one of the five states goes through the dictionary, and the zh readings are 打开 / 已关闭 / 已离开 / 已结束 / 加入中. The fallen-candidate branch must not print the raw status id, so its word form becomes Ended (and the existing assertion that pins the lowercase ended literal moves with it).

The dictionary in core/src/client/i18n.js has Open: '打开' only; Closed, Left, Ended, Joining are missing, so routing alone is not a fix — a missing key falls back to the key itself and the chip stays English. Both halves belong in one PR.

Scope

  • plugins/social/client.js — faceChipLabel: four branches through t(), ended → Ended, plus the short comment saying why the id is not printed.
  • core/src/client/i18n.js — four zh entries: 已关闭 / 已离开 / 已结束 / 加入中.
  • core/client.js — rebuilt with node core/scripts/build-client.mjs; one rebuild, as the last commit before the tip, one push. Do not touch patches/ds-bot/0008-client-bundle.patch or any other file of #2520; if the rebuild makes a pack/patch check fail, stop and report before pushing.
  • plugins/social/test/face-chip-i18n.test.js — new: one case per state, asserting the chip text equals that locale's dictionary value (a bare string or a misspelled key stays red), and the missing-key fallback is covered.
  • plugins/social/test/social.test.js — the existing includes('ended') assertion moves to Ended.
  • docs/subsystems/social.md — the chip's states, in the owned path (arch-docs reads it).
  • changelog.d/<n>-face-chip-i18n.changed.md — one user-visible line.

Acceptance (red first)

  1. At the base, the new test is red: 1 pass / 4 fail, the four readings above.
  2. With both halves applied: the new test is 5/5, npm --prefix plugins/social test is fully green, and node scripts/lint-plugins.mjs reports 0 errors.
  3. TZ=UTC npm run verify exits 0, including build-client --check (the committed bundle matches its source) and arch-docs.
  4. With the zh dictionary removed again but the plugin fix kept, the chip reads English — that is what makes the two halves one change rather than two.

Notes

This PR shares the client-bundle lane with #2520 under the owner-side ruling: this is the only second bundle PR allowed, it does not touch #2520's files, and whichever merges second regenerates core/client.js and runs the full suite again.

Activity

  1. HugoXK commented on Nov 15, 2026

    @HugoXK
    ContributorAuthor

    Claimed — FlyBot (ours).

    • Claim-Id: 1d47d64c35824e5b933240fb5e4f2be3
    • Claimed-by: FlyBot Lead
    • Owner: FlyBot Dev-5
    • Branch: dev/5-face-chip-i18n (base ca07de0289a6, live main)
    • PR follows within 24h with Fixes #3090.

    Scope in one line: route the four English faceChipLabel branches through the dictionary, add the four missing zh entries in core/src/client/i18n.js, rebuild core/client.js once as the last commit before the tip, and cover it with a new test plus the docs line.

    Bundle-lane rule (owner-side ruling, this is the only second bundle PR allowed): do not touch patches/ds-bot/0008-client-bundle.patch or any file of #2520; whichever of the two merges second regenerates core/client.js and runs the full suite again.

  2. HugoXK commented on Nov 15, 2026

    @HugoXK
    ContributorAuthor

    Heartbeat

    Written-by: FlyBot Lead
    Still-working: 1d47d64c35824e5b933240fb5e4f2be3
    At: 2026-11-15T00:47:42Z

  3. HugoXK commented on Nov 15, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: 1d47d64c35824e5b933240fb5e4f2be3
    Reason: Delivered: PR #3097 merged 2026-11-15T02:02:43Z as 3431164; issue closed completed.
    At: 2026-11-15T02:06:22Z

  4. added 2 commits that reference this issue on Nov 15, 2026
    3431164
    6c7c002
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions