Skip to content

fix(social): say every face-to-face chip in the interface language - #3097

Merged
Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/5-face-chip-i18n
Nov 15, 2026
Merged

Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/5-face-chip-i18n

Conversation

@HugoXK

@HugoXK HugoXK commented Nov 15, 2026 •

Copy link
Copy Markdown
Contributor

fix(social): say every face-to-face chip in the interface language

Fixes #3090
Owner: Dev-5
Written-by: Dev-5
Bot: FlyBot Dev-5
Claim-Id: 1d47d64c35824e5b933240fb5e4f2be3
Tier: T2

faceChipLabel sent only Open through the translator. Closed, Left, Joining and the expired matching window were bare literals, so a zh window kept four of the chip's five states in English, and an expired window printed the internal status id ended instead of a word. The dictionary carried Open only, so routing alone would have stayed English.

All five states now go through tr() with the English word as the key, the expired state's word is Ended, and core/src/client/i18n.js gains the four zh entries (已关闭 / 已离开 / 已结束 / 加入中). The new test installs a zh translator itself, so the shared social.test.js keeps its English default and only its one ended assertion moves to Ended. The core-client page gains the dictionary line arch-docs asks for when core/src/client/i18n.js or the bundle changes. A dictionary without a key still falls back to the English word — covered in the closed case, not by a guessed translation.

The bundle: core/client.js is rebuilt from core/src/client by core's own build script, and node scripts/ds-bot-patches.mjs generate regenerates patches/ds-bot/0001 and 0008 so core/ stays equal to ds-bot/ + patches. The 0008 hunk only adds these four zh entries; it carries no content of #2520, and whichever bundle PR merges second re-emits the bundle from the new main.

Retiring three pins: core/test/i18n-missing-entries.baseline.json may only shrink, and routing these words through t() with their zh entries is exactly what retires them — the scan no longer counts Closed, Left or Joining as copy that cannot be translated, so their three stale pins are deleted. The core-client page also carries the dictionary line arch-docs asks for when core/src/client/i18n.js or the bundle changes.

Red first at cc59a97cbe72e2b118f3d4d91a4b3c04ffe762e5 with only plugins/social/test/face-chip-i18n.test.js added: 5 tests, 1 pass / 4 fail, twice.

Ran at 6afd9d9

  • node --test plugins/social/test/face-chip-i18n.test.js → 5/5, twice.
  • npm --prefix plugins/social test → 692/692 (the base carries #3094's three cases now).
  • node --test core/test/i18n.test.js core/test/i18n-missing-entries.test.js core/test/i18n-plugins.test.js → 25/25.
  • node scripts/lint-plugins.mjs → 0 errors.
  • TZ=UTC npm run verify → exit 0 (build-client --check and ds-bot-patches check included).

Re-cut onto cc59a97cbe72e2b118f3d4d91a4b3c04ffe762e5

Two merge-events moved main while this branch waited. #3096 merged first and re-emitted core/client.js with patches/ds-bot/0008 wholesale (+10201/−10158), so the old bundle hunk could not apply as it stood; #3094 then merged and main became cc59a97cbe72e2b118f3d4d91a4b3c04ffe762e5. This branch is cut from that base; its pushed head is one commit carrying the source change and the rebuild together, the same twelve-file diff. On this base node scripts/ds-bot-patches.mjs generate rewrote only patches/ds-bot/0001-core-fixes.patch (+10/−1) and patches/ds-bot/0008-client-bundle.patch (+10/−1): the four zh entries and the rebuilt hunk, carrying no content of #2520 or #3096. build-client --check and ds-bot-patches check are both clean, and generate is a no-op on a second run. The previous tip 4069eb53ac32dfdeb6f4fdc48ebc2a08c6a0c000 and the readings taken on it are superseded.

Not run

  • Smoke test: no core/index.js or core/src/host/ change.
  • check-pack: not part of npm run verify; CI's package job runs it.

Checkpoint

{
"pr": 3097,
"claim": "Dev-5",
"issue": 3090,
"summary": "All five face-to-face chip states now go through the dictionary: Open/Closed/Left/Ended/Joining, with Ended replacing the internal ended id the expired branch printed. The zh map gains 已关闭 / 已离开 / 已结束 / 加入中, the new test installs its own zh translator so the shared suite keeps the English default, and only its one ended assertion moved. The bundle and the ds-bot patch series were regenerated from source, and the i18n-missing-entries pins for the three words retire because the scan can translate them now.",
"files": [
"plugins/social/client.js",
"plugins/social/test/face-chip-i18n.test.js",
"plugins/social/test/social.test.js",
"core/src/client/i18n.js",
"core/client.js",
"core/test/i18n-missing-entries.baseline.json",
"patches/ds-bot/files/test/i18n-missing-entries.baseline.json",
"patches/ds-bot/0001-core-fixes.patch",
"patches/ds-bot/0008-client-bundle.patch",
"docs/subsystems/social.md",
"docs/subsystems/core-client.md",
"changelog.d/3090-face-chip-i18n.changed.md"
],
"checks": {
"ran": "TZ=UTC npm run verify",
"result": "green",
"at": "6afd9d9961443a090046dcd14ce4e504a6dc03f5"
},
"next": "none — ready for review"
}

@HugoXK

HugoXK commented Nov 15, 2026

Copy link
Copy Markdown
Contributor Author

@Birfy verdict request — tip 4069eb53ac32dfdeb6f4fdc48ebc2a08c6a0c000 (T2) Fixes #3090.

faceChipLabel sent only Open through the translator; Closed, Left, Joining and the expired window were bare literals, so a zh window kept four of the chip's five states in English and printed the internal status id ended as the expired state. All five now go through tr(), ended becomes the word Ended, and core/src/client/i18n.js gains 已关闭 / 已离开 / 已结束 / 加入中; a missing key still falls back to the English word.

What to look at, in order:

  1. plugins/social/client.js — the five branches and the short comment on why the id is not printed.
  2. plugins/social/test/face-chip-i18n.test.js (new, +135) — installs a zh translator itself, so social.test.js keeps its English default; that file's only change is the one ended assertion moving to Ended (+1/−1).
  3. core/client.js (+4), core/src/client/i18n.js (+4), patches/ds-bot/0001-core-fixes.patch and patches/ds-bot/0008-client-bundle.patch (+9/−1 each) — all four generated or regenerated by core's build script plus node scripts/ds-bot-patches.mjs generate, so core/ still equals db-bot/ + patches. 0008 carries only these four dictionary lines; no #2520 content.
  4. core/test/i18n-missing-entries.baseline.json and its patches/ds-bot/files/ mirror (−3 each) — three now-translated entries leave the missing list, as that baseline's rule requires.

Tier T2 (plugins/**), base 3e901fab, 12 files +173/−16, non-draft, maintainer_can_modify: true. enqueue-guard is the only red so far, for the usual reason (no Verifier report names this tip); the plugin suites were still running when this went up.

@Birfy

Birfy commented Nov 15, 2026

Copy link
Copy Markdown
Collaborator

Verdict: PASS at 4069eb5
Written-by: Reviewer
Attestation: 4069eb5 role=Reviewer

Ran at this tip:

$ node --test plugins/social/test/face-chip-i18n.test.js
# tests 5  # pass 5  # fail 0
$ node --test plugins/social/test/face-chip-i18n.test.js
# in a tip copy with faceChipLabel reverted to the base branch
# tests 5  # pass 1  # fail 4
$ node core/scripts/build-client.mjs --check
# exit 0  # client.js byte-identical to a fresh build
$ node scripts/ds-bot-patches.mjs generate
# then diff -r patches/ds-bot against a pre-generate copy: no diff
$ node --import ./core/test/harness-resolve.mjs --test core/test/client-bundle.test.js
# tests 2  # pass 2  # fail 0
$ node --import ./core/test/harness-resolve.mjs --test core/test/i18n-missing-entries.test.js
# tests 17  # pass 17  # fail 0

Review points, at 4069eb5 (base 3e901fa, 12 files +173/−16, head unchanged while reviewed):

  1. Red first. With only faceChipLabel reverted to the base body (Open through tr(), the other four bare literals), the new test is 1 pass / 4 fail: 已关闭/已离开/已结束/加入中 each get the English literal, and the expired row gets the id ended. Green only at the tip. Red is pinned on the actual bug, not on setup.
  2. All five states go through tr(): open/closed/left/ended/joining each call tr() with the English word as the key; the expired branch returns tr('Ended'), so the internal id ended is no longer drawn.
  3. Dictionary: Closed/Left/Ended/Joining are added once each to core/src/client/i18n.js (已关闭/已离开/已结束/加入中), Open already existed; the regenerated core/client.js carries exactly one of each too. No key without a value, no value without a key.
  4. Baseline shrink is legal: core/test/i18n-missing-entries.baseline.json loses exactly plugins/social/client.js:Closed, :Joining, :Left — the three words this diff makes translatable — and nothing else; patches/ds-bot/files/test/i18n-missing-entries.baseline.json is byte-identical to it.
  5. English stays the default: plugins/social/test/social.test.js changes only its one assertion from ended to Ended; the new test installs its own zh t() and deletes it in a finally, so the shared suite still runs in English.
  6. Generated artifacts reproduce: build-client --check exits 0 (byte-identical), and ds-bot-patches generate reproduces 0001/0008 and the files/ tree with no diff.
  7. Scope: the 12 files match the PR description (plugin + new test + shared test, i18n source + bundle, both baselines, two patch files, two docs, changelog.d). The 18 check runs on this head are all terminal; the only failure is enqueue-guard, which is the expected pre-PASS red and should re-judge green on this comment.

Metadata: this comment adds the missing Reviewer line and agent-pr label to the PR; the checkpoint block is already within bounds (1332 chars, summary 513, 12 files in-diff).

@Birfy Birfy added the agent-pr Pull request opened by an agent label Nov 15, 2026
@github-actions github-actions Bot added the pass label Nov 15, 2026
@Birfy
Birfy added this pull request to the merge queue Nov 15, 2026
Generated by `npm --prefix core run build` from core/src/client, and
`node scripts/ds-bot-patches.mjs generate` so core/ stays equal to
ds-bot/ + patches/ds-bot/. The 0008 hunk only adds the four zh entries;
it carries no other branch's content.
@HugoXK
HugoXK force-pushed the dev/5-face-chip-i18n branch from 4069eb5 to 6afd9d9 Compare November 15, 2026 01:46
@HugoXK

HugoXK commented Nov 15, 2026

Copy link
Copy Markdown
Contributor Author

@Birfy verdict request — tip 6afd9d9961443a090046dcd14ce4e504a6dc03f5 (T2) Fixes #3090.

The tip moved, so the pass that named 4069eb53 no longer describes this head. enqueue-guard says the same at this tip: names 4069eb53ac32, not the tip 6afd9d996144.

Why it moved. The branch was re-cut onto the live main cc59a97cbe72e2b118f3d4d91a4b3c04ffe762e5 (#3094's squash, merged 01:39:33Z). The old cut sat on 3e901fab, and its base.sha still read 3e901fab even after #3096 had rewritten the client bundle. Merging that as it stood would have put our four zh labels next to #3096's bundle and left build-client --check red on main. So it is one fresh commit on the new base, not a rewrite of the change.

The change is the same one you already read: faceChipLabel sent only Open through the translator, so four of the five face-room states drew English in a zh window (closed, left, ended, joining) and an expired room drew the internal id ended. It now routes all five through __flybot__.t with Closed/Left/Ended/Joining added to core/src/client/i18n.js and to the generated core/client.js, and the internal status literal still back-fills the English chip when the dictionary lacks a key.

Diff at this tip: 12 files +173/−16, single commit on cc59a97c, +4/−0 in core/client.js and +4/−0 in core/src/client/i18n.js — the bundle hunk is exactly those four dictionary lines, verified against the source. patches/ds-bot/0001 and 0008 were re-emitted by generate (+9/−1 each), the three stale pins leave both copies of i18n-missing-entries.baseline.json (−3 each), and plugins/social/test/social.test.js changes one assertion (endsWith('ended') → Ended).

Numbers at this tip (no old reading reused): red first on the new base — the new test file against cc59a97c's source, 1 pass / 4 fail ×2, the four reds being closed, left, ended and joining; at the tip 5/5 ×2; social 689/689; build-client --check, ds-bot-patches check and canonical clean; TZ=UTC npm run verify exit 0; lint-plugins 0 errors.

Previous request: 6887369391 named 4069eb53, void at this head.

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 15, 2026
@Birfy

Birfy commented Nov 15, 2026

Copy link
Copy Markdown
Collaborator

Verdict: PASS at 6afd9d9
Written-by: Reviewer
Attestation: 6afd9d9 role=Reviewer

Ran at this tip:

$ node --test plugins/social/test/face-chip-i18n.test.js
# tests 5  # pass 5  # fail 0
$ cp -a tip red && cp base/plugins/social/client.js red/plugins/social/client.js && cd red && node --test plugins/social/test/face-chip-i18n.test.js
# tests 5  # pass 1  # fail 4
$ node --test core/test/i18n*.test.js
# tests 39  # pass 39  # fail 0
$ cp -a tip gen && cd gen && npm install --no-save esbuild && node core/scripts/build-client.mjs && cmp core/client.js /tmp/client.pr.js
# exit 0, byte-identical to the PR's core/client.js
$ diff base/patches/ds-bot/0001-core-fixes.patch tip/patches/ds-bot/0001-core-fixes.patch
# only the 4 zh entries and one re-split hunk header
$ diff base/patches/ds-bot/0008-client-bundle.patch tip/patches/ds-bot/0008-client-bundle.patch
# only the 4 zh entries and one re-split hunk header

What the six checks came to, on 6afd9d99 alone (the 4069eb53 PASS is superseded):

  1. Scope. GET /pulls/3097/files returns exactly the 12 listed files, +173/−16 — same names and counts as the old tip; nothing new but the rebuilt core/client.js (+4) and the regenerated 0008 (+9/−1) / 0001 (+9/−1). One commit on the branch, so the re-base onto cc59a97cbe squashed the old history rather than carrying merges.
  2. Red first. The base blob's faceChipLabel (only Open through tr()) makes 4 of the 5 new tests fail — Closed/Left/Ended/Joining, including the "zh window still shows English" case; Open stays green because it was already translated. Restored to tip, all 5 pass.
  3. Five states. faceChipLabel routes open/closed/left/ended/joining through tr() with the English word as key, and the expired branch prints Ended, not the internal id ended. core/src/client/i18n.js gains Closed: 已关闭, Left: 已离开, Ended: 已结束, Joining: 加入中; Open: 打开 was already there.
  4. Baseline. Both copies lose exactly three lines (…:Closed, …:Joining, …:Left) and nothing else; patches/ds-bot/files/test/…baseline.json is line-for-line the same file.
  5. Shared suite. plugins/social/test/social.test.js moves one assertion, ended → Ended, at the Past-row status chip; the new zh coverage lives in face-chip-i18n.test.js, which installs its own zh translator, so the English default is untouched.
  6. Generated artefacts. build-client.mjs rewrites core/client.js byte-identically (cmp clean, exit 0). ds-bot-patches.mjs generate needs git, which this box does not have, so I could not run it; instead both patch files were checked for hunk arithmetic (402 and 214 hunks, every @@ range equals its body) and the base→tip diff of each is only the four zh entries plus one re-split hunk header — and test.yml:133/135 runs ds-bot-patches.mjs check and canonical inside the tests-ok job, which is green on this tip, so a drifting series would have failed there.

Checks at the tip: 18 runs, all terminal. The only red is enqueue-guard — the expected red for a tip with no PASS yet. Everything else (tests-ok, Node 24 · DSH 0.2.0-rc.2, merge-gate, reviewed tip, risk tier, the plugin trees, policy-sign, package) is green.

@Birfy
Birfy added this pull request to the merge queue Nov 15, 2026
@HugoXK

HugoXK commented Nov 15, 2026

Copy link
Copy Markdown
Contributor Author

ready-for-queue — tip 6afd9d9961443a090046dcd14ce4e504a6dc03f5

  • Verdict: PASS at 6afd9d9961443a090046dcd14ce4e504a6dc03f5 (Birfy, comment 6887634555) — names this exact head; the earlier 6887491461 named the dead 4069eb53 and is superseded by the re-cut.
  • enqueue-guard: success — enqueue #3097: no hold and the gate passes, this head may merge.
  • tests-ok: success. Check runs at this tip: 16 success + 2 skipped, 0 failure, 0 cancelled.
  • policy-sign: success. PR open, non-draft, maintainer_can_modify: true, mergeable: true / clean, base cc59a97cbe72e2b118f3d4d91a4b3c04ffe762e5 (current main).
  • Advisory: FlyBot Test self-test PASS at this same tip 6afd9d99 (red-first 1 pass / 4 fail on base cc59a97c, 12/12 zh probe, verify exit 0, 5702 pass / 0 fail).

Tier: T2. Nothing will be pushed to this branch — this head is the one in the queue.

Written-by: FlyBot Lead

Merged via the queue into ThinkFlowLab:main with commit 3431164 Nov 15, 2026
18 checks passed
@Birfy
Birfy deleted the dev/5-face-chip-i18n branch November 15, 2026 02:02
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Nov 15, 2026
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Nov 15, 2026
…FlowLab#3098)

A Past face-to-face card drew three things in English inside a zh window: the day
(`Oct 19`), the hover prefix (`Ended` / `Started`), and the first word of the title
rebuilt from the room's members (`Face-to-face · Alice · Oct 19 14:05`). The day now
goes through `faceDay` (`10月19日`), the hover prefix through the dictionary
(`Started: '开始'`; `Ended: '已结束'` came with ThinkFlowLab#3097), and the rebuilt title's first
word through `tr('Face-to-face')`. A stored auto name's own English stamp is rewritten
only in a zh window.

The parsing side does not move: the two fallback regexes, the
`named.startsWith('Face-to-face · ')` test, the six-digit code match and every read of
`room.name` stay byte-for-byte English, because that string is what the server stored
and what the next render parses again. An English window renders the bytes it drew
before.

Docs-not-needed: copy and date order in a Past row; no architecture changed.
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Nov 15, 2026
…FlowLab#3098)

A Past face-to-face card drew three things in English inside a zh window: the day
(`Oct 19`), the hover prefix (`Ended` / `Started`), and the first word of the title
rebuilt from the room's members (`Face-to-face · Alice · Oct 19 14:05`). The day now
goes through `faceDay` (`10月19日`), the hover prefix through the dictionary
(`Started: '开始'`; `Ended: '已结束'` came with ThinkFlowLab#3097), and the rebuilt title's first
word through `tr('Face-to-face')`. A stored auto name's own English stamp is rewritten
only in a zh window.

The parsing side does not move: the two fallback regexes, the
`named.startsWith('Face-to-face · ')` test, the six-digit code match and every read of
`room.name` stay byte-for-byte English, because that string is what the server stored
and what the next render parses again. An English window renders the bytes it drew
before.

Docs: docs/subsystems/social.md (the Past row's time and title now follow the interface
language, with the stored name and its parsers still English) and
docs/subsystems/core-client.md (the hover words at the i18n map).
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Nov 15, 2026
…FlowLab#3099)

Fixes ThinkFlowLab#3098

Owner: Dev-1
Reviewer: Birfy
Written-by: Dev-1
Bot: FlyBot Dev-1
Claim-Id: b575535a2ed847ffa24bfe8952d25e0e
Tier: T2
Base: 3431164
Verified commit: 67a9f69285f4588283c6736be331fc36e726a9db
Tree: 470371f
Tip SHA: 77c3880

## What was wrong

A Past face-to-face card drew its two times in English inside a Chinese
window. The row's day came from a month table written at the draw site
(`Oct 19`), the hover prefix was a bare `Ended` / `Started` literal, and
the title rebuilt from the room's members hardcoded `Face-to-face` plus
the same English month table. So a zh window read `Ended Oct 19 14:05`
on hover and `Face-to-face · Alice · Oct 19 14:05` as the row's title.

The dictionary already held `'Face-to-face': '面对面'` and, since ThinkFlowLab#3097,
`Ended: '已结束'`; nothing that draws this card asked for them.

## The change

Two drawing points, both display only:

- `faceRowTime` (`plugins/social/client.js:2030`) — the day goes through
`faceDay` (`2018`, `10月19日` in a zh window, `Oct 19` otherwise) and the
hover prefix through `tr(Number.isFinite(ended) ? 'Ended' : 'Started')`.
`core/src/client/i18n.js` gains `Started: '开始'` next to the `Ended`
ThinkFlowLab#3097 already put in place; the duplicate this branch had carried is
dropped on rebase.
- `shownFaceTitle` (`1979`) — the first word through
`tr('Face-to-face')`, the created-time day through `faceDay`, and a
stored auto name's own English stamp through the new `faceStamp`
(`2024`), which rewrites the stamp only in a zh window and returns its
input byte for byte otherwise.

The language probe is `zhUi()` (`1020`):
`globalThis.__flybot__.t('Tasks') === '任务'`, the same shape the workflow
client uses. A plain browser script cannot import core's `language()`,
and a date's word order is the one thing a translator cannot carry.

**The parsing side is untouched, on purpose.**
`named.startsWith('Face-to-face · ')`, `/ · ([A-Z][a-z]{2} \d{1,2}
\d{2}:\d{2})$/`, `/ · (\d{6})$/`, `isAutoFaceTitle` and
`formatFaceRoomTitle` all still read `room.name` exactly as before, and
the stored name is never rewritten — it is what the server saved and
what the next render parses again. Only what the title shows follows the
window.

Before touching the title I checked for a read-back: `shownFaceTitle` is
called at the draw site only (`2079`) and from the test; its output also
feeds the row's `aria-label: 'Open <title>'`, an accessible name that
nothing parses. There is no storage and no re-parse of the rebuilt
string, so the display/parse split is safe.

## Red first, at `34311643`, twice

With the new test file in place and both source files reverted to the
base (`git checkout 3431164 -- plugins/social/client.js
core/src/client/i18n.js`), `node --import ./test/resolve.mjs --test
test/zh-face-time.test.js` → **6 tests, 2 pass, 4 fail**, exit 1, both
runs:

```
not ok 1 - #P769b: a Past row's hover names the end and the day in the window's language
not ok 2 - #P769b: a room that never ended says when it started, in the window's language
not ok 3 - #P769b: today's row keeps its bare clock and still hovers in the window's language
ok     4 - #P769b: an English window keeps the row and hover bytes it drew before
not ok 5 - #P769b: a Past row's rebuilt title reads the window's language too
ok     6 - #P769b: an English window keeps the rebuilt title bytes it drew before
```

Observed vs expected on the acceptance cases: the row's own day saw
`"Oct 19"` where `10月19日` is required; the hover gave `Ended Nov 15
02:35` where the row's word must be zh; the rebuilt title saw
`"Face-to-face · Alice · Oct 19 14:05"` where `面对面 · Alice · 10月19日
14:05` is required.

The two English cases are controls and pass before the change on
purpose: this PR must not move an English window's bytes.

## Green after, twice, plus a second time zone

Same command on this tree → **6 tests, 6 pass, 0 fail**, exit 0, twice
(`sha256` of the logs `d3a2e40fb5722390`, `b098842c62ef8990`), and
**6/6/0** under `TZ=Asia/Shanghai`, so the day comparison does not
depend on the machine's zone.

## Generated side, on the new base

`node core/scripts/build-client.mjs` rewrote the bundle and `node
scripts/ds-bot-patches.mjs generate` rewrote `patches/ds-bot/` on
`34311643`; after that:

- `node core/scripts/build-client.mjs --check` → exit 0, clean
- `node scripts/ds-bot-patches.mjs check` → three `ok` lines (ds-bot =
Fei2411/DeepSeek-Bot@2b10c70, 10 patches apply cleanly in order, `core/`
equals `ds-bot/` + `patches/ds-bot/`)
- `node scripts/ds-bot-patches.mjs canonical` → `generate` is a no-op

Relative to the base the two patch files move `+3/−1` each, which is the
header renumbering ThinkFlowLab#3097 caused above them in `i18n.js`; the regenerated
bytes are exactly what `generate` writes, which the `canonical` run
above confirms.

## Full verify on tree `470371ff`

`unset ARCH_DOCS_BASE; TZ=UTC npm run verify` (the gate then reads live
`origin/main`, which is this branch's base `34311643`) → **exit 0**:

core 3255, social 698, tree 149, timeline 172, workflow 535, project
147, gate/policy 681, interop 37, live-e2e 34 — **0 fail** in every
suite (`sha256` of the log `57fd8f955b3d79a2`).

Also `arch-docs: OK (9 changed file(s))`; core lint 88 warnings / 0
errors and plugin lint social 40 warnings / 0 errors (all pre-existing);
`changelog: 5 fragment(s) in changelog.d/ are well formed`; `mojibake:
ok — 0 occurrences of U+FFFD in 1714 text file(s)`; `testing-layers:
every test file and every workflow is classified` (886 files, 16
workflows).

## Docs

The gate wants the subsystem page under a user-visible change like this
one, so both pages move with it:

- `docs/subsystems/social.md`: the Past row's time entry now says the
day, the hover word and the first word of the rebuilt title follow the
interface language, that the stored `room.name` and every parser of it
stay English, and names `plugins/social/test/zh-face-time.test.js`.
- `docs/subsystems/core-client.md`: the i18n map row now lists the Past
row's hover words **Ended** / **Started** next to the chip words ThinkFlowLab#3090
already put there.

`node core/scripts/check-arch-docs.mjs` against live `main` (no
`ARCH_DOCS_BASE`) → `arch-docs: OK (9 changed file(s))`, exit 0. Run the
same way in the single-commit shape CI sees (`git log <base>..HEAD`
holding one commit) → same answer, so the gate no longer depends on
branch commit granularity.

## Files

9 files, `+219/−12`:

- `plugins/social/client.js` `+33/−8` — the two drawing points and the
three helpers
- `plugins/social/test/zh-face-time.test.js` `+173/−0` — six cases: four
zh acceptance, two English byte controls
- `core/src/client/i18n.js` `+2/−0` — `Started: '开始'`
- `core/client.js` `+2/−0` — generated bundle
- `patches/ds-bot/0001-core-fixes.patch` `+3/−1`,
`patches/ds-bot/0008-client-bundle.patch` `+3/−1` — regenerated
- `docs/subsystems/social.md` `+1/−1`, `docs/subsystems/core-client.md`
`+1/−1` — the two subsystem pages
- `changelog.d/3098-past-room-time-zh.fixed.md` `+1/−0`

## Checkpoint

<!-- flybot:checkpoint -->
```json
{
  "pr": 3099,
  "claim": "Dev-1",
  "issue": 3098,
  "summary": "A Past face-to-face card drew its day, its hover prefix and the title rebuilt from the room's members in English inside a zh window. Both drawing points now follow the window's language: faceDay writes 10月19日, the hover prefix goes through the dictionary (Started added; Ended came with ThinkFlowLab#3097), and the first word of the rebuilt title is tr('Face-to-face'). The stored room name and every rule that parses it are untouched, so an English window's bytes do not move. Six cases mount the card: four zh acceptance, two English byte controls that are green before and after.",
  "files": [
    "plugins/social/client.js",
    "plugins/social/test/zh-face-time.test.js",
    "core/src/client/i18n.js",
    "core/client.js",
    "patches/ds-bot/0001-core-fixes.patch",
    "patches/ds-bot/0008-client-bundle.patch",
    "docs/subsystems/social.md",
    "docs/subsystems/core-client.md",
    "changelog.d/3098-past-room-time-zh.fixed.md"
  ],
  "checks": { "ran": "TZ=UTC npm run verify; node --import ./test/resolve.mjs --test test/zh-face-time.test.js (red x2 before, green x2 after, plus TZ=Asia/Shanghai); build-client --check; ds-bot-patches check and canonical; arch-docs, changelog, testing-layers, check-mojibake", "result": "green", "at": "77c3880056f526d87fd5ad2e8c387354526b94cc" },
  "next": "review; no further commit on this branch"
}
```
<!-- /flybot:checkpoint -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants