Repository navigation
Description
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 callstr('Open'))Closed→ClosedLeft→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 throught(),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 withnode core/scripts/build-client.mjs; one rebuild, as the last commit before the tip, one push. Do not touchpatches/ds-bot/0008-client-bundle.patchor 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 existingincludes('ended')assertion moves toEnded.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)
- At the base, the new test is red: 1 pass / 4 fail, the four readings above.
- With both halves applied: the new test is 5/5,
npm --prefix plugins/social testis fully green, andnode scripts/lint-plugins.mjsreports 0 errors. TZ=UTC npm run verifyexits 0, includingbuild-client --check(the committed bundle matches its source) and arch-docs.- 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
HugoXK commentedon Nov 15, 2026
Claimed — FlyBot (ours).
1d47d64c35824e5b933240fb5e4f2be3dev/5-face-chip-i18n(baseca07de0289a6, live main)Fixes #3090.Scope in one line: route the four English
faceChipLabelbranches through the dictionary, add the four missing zh entries incore/src/client/i18n.js, rebuildcore/client.jsonce 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.patchor any file of#2520; whichever of the two merges second regeneratescore/client.jsand runs the full suite again.HugoXK commentedon Nov 15, 2026
Heartbeat
Written-by: FlyBot Lead
Still-working: 1d47d64c35824e5b933240fb5e4f2be3
At: 2026-11-15T00:47:42Z
HugoXK commentedon Nov 15, 2026
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
fix(social): say every face-to-face chip in the interface language (T…
fix(social): read the face-card time in the interface language (Think…