Repository navigation
The objectui#10024 plural defect on its sibling keys: common.itemCount (tab-count aria-label), detail.reactionCount and the ar collaboration counts read the wrong noun form in Russian and Arabic at 2 and above #10242
Description
Activity
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actions分诊首次定级:
priority:p3·bug·domain:ui·pm:queue—— 俄语、阿拉伯语里几处计数文案在 2 及以上时名词形式不对;照 #10024 已落地的写法逐键改Path:
packages/i18n/src/locales/ru.ts、packages/i18n/src/locales/ar.ts(common.itemCount、detail.reactionCount、collaboration.commentCount/reactionCount的 ar 值)Triage: lands in
@object-ui/i18nlocale packs ⇒domain:ui,bug,priority:p3,pm:queue; rationale: the two-key=== 1switch gives these keys a single count-not-one noun form, which is ungrammatical at 2–4 / 21 in Russian and at 2 / 11+ in Arabic; the precedent fix (PR #10240, a count-label value such as 「Noun: COUNT」, no new key) has landed, so this is pack-value rewrites only.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T17:01Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectuimain(06b82b8)上核对。本席实测
- ru:
itemCount是… элементов,detail下的reactionCount是… реакций;ar:itemCount是… عناصر,collaboration 的commentCount/reactionCount同形。与卡面一致。 components的标签页计数:Number(item.count) === 1 ? 'common.itemCountOne' : 'common.itemCount'。- 先例 PR fix(i18n): search results count reads right in ru and ar at every count (objectui#10024) #10240(finding(app-shell,i18n): the search-results count switches on === 1, but Russian needs a third form at 2–4 (результата, not результатов) and both Arabic values are byte-identical — the exact limit objectui#9664 warned the binary switch would leave behind #10024)已合并:改的是包里的值,不加新键(键对等测试不允许只有 ru 的
_few)。 - 对照:ru 的 collaboration
commentCount/reactionCount已经是计数标签写法,读起来正确。
定级说明
p3:两个语言里的语法错误,不影响功能。
执行要点
- 按 fix(i18n): search results count reads right in ru and ar at every count (objectui#10024) #10240 的写法,逐键把 count ≠ 1 的值改成在任何数字下都读得通的计数标签;⛔ 不新增键。
- 测试照 fix(i18n): search results count reads right in ru and ar at every count (objectui#10024) #10240 的形状,用
Intl.PluralRules的几个代表数字(ru:2、5、21;ar:2、3、11)各断言一次。
Generated by Claude Code
- ru:
- addedbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 24, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 —
domain:uiexecution seat 4
Session:session_01BP8CMtACxTdLjqR6rhd33C
Branch:claude/issue-10242-ru-ar-count-labels
Worktree:objectui-issue-10242
Domain:domain:ui
Seat:domain:ui#4
File surface:packages/i18n/src/locales/ru.ts: thecommon.itemCountanddetail.reactionCountvalues.packages/i18n/src/locales/ar.ts: thecommon.itemCount,collaboration.commentCountandcollaboration.reactionCountvalues.
Each value is rewritten as a count label in the objectui#10240 shape, with ⛔ no new key. Also: one pin beside the objectui#10240 pin, and one
.changeset/10242-…md. Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: opus— five pack values
Clause-②: no
Thread-read: 5818544805
Serial constraints cleared: open-PR file lists read 2026-09-24T21:25Z ⇒ none touchesru.tsorar.ts. objectui#10300, which held both, merged at 2026-09-24T21:15Z. Livepm:dispatchedclaims read 2026-09-24T21:25Z: none namespackages/i18n/src/locales/.Clause-②: no. These are pack-value rewrites only, following the landed objectui#10240 precedent. The key-parity test refuses a ru-only_few.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 10242,
"status": "blocked",
"branch": "claude/issue-10242-ru-ar-count-labels",
"pr": null,
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent run; the parent PM session, CLAUDE_CODE_REMOTE_SESSION_ID cse_01BP8CMtACxTdLjqR6rhd33C)",
"premise_still_valid": true,
"summary": "Premise confirmed at origin/main 721d1e0: the five count-not-one values hold one noun form behind a === 1 two-key switch, and the pin reproduces the shipped strings. Branch head bac9cd4 (pushed; tree clean, worktree removed) rewrites exactly the five claimed values as count labels. ru common.itemCount is 'Элементов: COUNT'. ru detail.reactionCount is 'EMOJI Реакций: COUNT'. The ar values are common.itemCount 'عدد العناصر: COUNT', collaboration.commentCount 'عدد التعليقات: COUNT' and collaboration.reactionCount 'عدد التفاعلات: COUNT'. The branch also adds one render-level pin beside the objectui#10240 pin and .changeset/10242-ru-ar-count-labels.md (patch, @object-ui/i18n). BLOCKED on the file surface: packages/i18n/src/tests/marketplace-preview-namespace-3546.test.tsx, outside the claim, asserts as a 'premise' that every pack's common.itemCount equals COUNT, a space, then the unit noun. That pins the old ru and ar value, so it goes red on this change: 'expected Элементов: COUNT to be COUNT элементов'. Any implementation of this card breaks that line. Per 'Stop on breach' I did not edit it and did not open the PR, so no known-red CI farm run and no stale write-once body. The one-hunk re-derivation keeps the exact premise for the other six packs and expects the count label for ru and ar. It is measured, not delivered: that exact patch applied under a trap restore gave 79 passed with all-locales-key-parity, and the restore was proven by blob == HEAD. The patch is saved at scratchpad issue-10242/marketplace-premise-10242.patch. Serial read for that file: 13 open PRs (a complete short page), none touches it or ru.ts/ar.ts, and release PR 5400 was paged to all 1732 files with no hit in packages/i18n/src. The 17 other live pm:dispatched claims name no packages/i18n test path. Changeset re-read: the closing sentence of .changeset/9664-search-items-available-plural.md says ar search.itemsAvailable 'now uses the same noun pair that ar's common.itemCount/itemCountOne already uses'. After this branch ar common.itemCount carries that noun only in its definite form inside a count label. The sentence is loosened, not falsified, and I did not edit it (outside the surface). The assignee (os-litant) was already set and I left it untouched. The newest Claim (5822573875) names this branch.",
"mechanism_assumptions": [
"A1 partly holds. The value shape is reused (the count-not-one half ends in a colon then COUNT; ar uses the objectui#10240 'عدد …: COUNT' device). The pin shape is reused: a real i18next instance via createI18n with the language asserted, no mocked t, an exact-string EXPECTED table, an en control, the shipped-defect strings named, Intl.PluralRules readings, and the mechanism asserted on the pack values with the same regex. Placement 'beside the #10240 pin' is packages/app-shell/src/views/tests/countLabels.ruAr-10242.test.tsx. The consumers are not app-shell views, but @object-ui/app-shell is the one package that depends on all three consumer packages (components for page:tabs, plugin-detail for ReactionPicker, collaboration for CommentThread), so one file renders each of them for real. The file header says so.",
"A2 holds. The placeholder check is all-locales-key-parity.test.ts 'placeholders match en in every pack' (passed in the packages/i18n run), plus pnpm check:i18n-keys interpolation parity (exit 0). ru detail.reactionCount keeps both EMOJI and COUNT; every other value keeps COUNT.",
"A3. The Arabic nouns are العناصر (items), التعليقات (comments) and التفاعلات (reactions), each in the definite plural after عدد ('number of'). عدد heads an idafa with the definite plural, a fixed phrase that agrees with no number. The number follows a colon as a value, so the dual, 3-10, 11-99 and 100+ rules never apply. This is the precedent's device: ar search.resultsCountPlural (objectui#10240), calendar.a11y.dayCell and ai.formAssist.suggestionCount. Note that objectui#9266 used a bare definite label (العناصر: COUNT) for preview.history.items; I followed the dispatch's #10240 form. I am not a native speaker.",
"A4 holds; nothing touched. The One halves are served only at exactly 1. ru 'COUNT элемент' and 'EMOJI COUNT реакция' are correct there. ar digit plus singular noun (1 عنصر, 1 تعليق, 1 تفاعل) is the same shape #10240 left in ar resultsCount, and not wrong at 1."
],
"tests": "Reproduction, with the pin on unmodified packs: pnpm exec vitest run packages/app-shell/src/views/tests/countLabels.ruAr-10242.test.tsx gave 'Tests 15 failed | 15 passed (30)'. Received values included '2 элементов', '21 элементов', '👍 2 реакций', '2 عناصر', '11 عناصر', and header '2 تعليقات' with tooltip '2 تفاعلات'. Fix, same file at bac9cd4: 'Tests 30 passed (30)'. Ablation, on the committed fix: five nested legs of objectstack scripts/ablation-replace.mjs, one per value, each printing 'ok mutation landed: anchor 1 to 0'. On-disk counts of the old values were 1/1/1/1/1. Result: 'Tests 15 failed | 15 passed (30)', identical to the reproduction; the direction is red as predicted. Restore: every leg printed 'ok restored: blob == HEAD'. An outer trap plus a hash proof showed ru e7d8d5ee and ar 64f927a9 == HEAD, and git diff HEAD was 0 bytes. No dist is involved, because vitest aliases @object-ui/i18n to src. Wider set at bac9cd4: packages/i18n/ plus the 10024, 9664 and 9266 pins, defaults-maps-mirror-en-pack, page-tabs-count-badge-i18n, ReactionPicker.a11yNames, comment-thread-i18n, comment-thread-no-provider-fallback, presence-avatars-i18n, LocationField.residueI18n-6888, SettingsView.i18n-4024 and scripts/tests/check-i18n-dead-keys.test.ts. Result: 'Test Files 1 failed | 82 passed (83)', 'Tests 1 failed | 1492 passed (1493)'. The 1 failure is the out-of-surface marketplace premise above. Premise patch probe (not delivered): 'Test Files 2 passed (2)', 'Tests 79 passed (79)'. Gates at bac9cd4, all exit 0: check:i18n-keys; check:i18n-drift ('No en value changed in this range'); check:i18n-dead-keys; check:i18n-designer-parity; check:control-bytes ('OK (scanned 8462 tracked text file(s)')); check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'); check-changeset-presence ('3 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'); check-changeset-no-major; check-changeset-fixed; check-changeset-overwrite ('1 changeset(s) added, 0 modified, 0 deleted'); check:changeset-claims ('No pending changeset names a file this change touches'); check:pending-changeset-literals; check-test-path-roots; check-vi-mock-override-shape. Type-check: turbo run build --filter=@object-ui/app-shell^... --concurrency=2 gave 'Tasks: 28 successful, 28 total'. Then pnpm --filter @object-ui/i18n --filter @object-ui/app-shell type-check exited 0, and both echoed 'tsc --noEmit && tsc -p tsconfig.test.json'. tsc -p packages/app-shell/tsconfig.test.json --listFilesOnly lists the new pin (1 of 4625 files). Lint, a proven narrowing: eslint --no-inline-config --format json on the 3 changed code files gave 3 files, 0 errors, 0 warnings. Population from eslint --print-config: 116 and 119 rules, with parserOptions.project and projectService undefined, so no type-aware linting runs and this diff cannot move any untouched file's verdict. The full pnpm lint and pnpm test farm is CI's: NOT MEASURED here. Lock timings are shared-box seconds.",
"mcp_calls": "0 — none",
"api_writes": "1 — POST /repos//issues/10242/comments (this os-dev-report, via scripts/pm/post-stamped.mjs). git push x2 (empty branch probe, then bac9cd4) is not REST. pr_create and label writes: unused (no PR while blocked; the dispatch names no labels).",
"open_questions": [
{
"question": "Extend the claim's file surface to packages/i18n/src/tests/marketplace-preview-namespace-3546.test.tsx? Its premise assertion pins the old ru/ar common.itemCount value, and the card cannot land without re-deriving it.",
"options": [
"A. Extend the surface. A patch round on this branch applies the measured one-hunk patch (the other six packs keep the exact COUNT-space-unit premise; ru and ar expect their count label), pushes, and opens the draft PR whose first line is this card's closing line.",
"B. Narrow the card to the three values that marketplace test does not pin (ru detail.reactionCount, ar collaboration.commentCount and reactionCount), and leave common.itemCount wrong in both packs.",
"C. Leave it to the seat to apply the patch while landing, outside a dispatch."
],
"recommendation": "A. The re-derivation is mechanical and measured (79 passed, restore proven), and the serial read shows no open PR or live claim on that file. B leaves the card's headline key broken. C moves an edit into a seat without a claim."
}
],
"out_of_scope_findings": [
"class: a · The same === 1 two-key defect on sibling values outside this card's key list, with every call-site switch verified at 721d1e0: ar detail.reactionCount 'EMOJI COUNT تفاعلات' (ReactionPicker, reaction.count === 1; the ar twin of this card's ru key). ar collaboration.presentUserCount 'COUNT مستخدمين متواجدين' and moreUserCount 'COUNT مستخدمين آخرين' (PresenceAvatars). ar list.recordCount 'COUNT سجلات' and ru list.recordCount 'COUNT записей' (ListView, totalCount === 1). ar lookup.recordCount 'COUNT سجل' (RecordPickerDialog; singular noun at 2 and 3-10). ar detail.revisionFieldsChanged 'تم تغيير COUNT حقول' (PointInTimeRestore). ar search.itemsAvailable 'COUNT عناصر متاحة' (SearchResultsPage; the value is also pinned by searchItemsAvailable-plural-9664.test.ts, so a fix re-derives that pin too). Probe: walked every XOne/X pair in the ru and ar packs whose X holds COUNT and is not a count label; Intl.PluralRules gives ru select(2)=few and select(21)=one, ar select(2)=two and select(11)=many. Suggest one card as a sub-issue of objectui#10242 (same device, same two files) · dedupe words:list.recordCount ru few·ar detail.reactionCount تفاعلات·presentUserCount ar dual·lookup.recordCount ar singular·revisionFieldsChanged ar",
"carrier: 承接者:无 · .changeset/9664-search-items-available-plural.md closing sentence ('the same noun pair that ar's common.itemCount/itemCountOne already uses') is loosened by this branch (ar common.itemCount now carries the noun as العناصر inside a count label). It is not falsified, since the lemma pair عنصر/عناصر is unchanged, and it was left unedited because it is outside the surface. Noted, not filed."
]
}objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsSeat answer to the
os-dev-reporton this card, and a claim file-surface amendmentdomain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C, 2026-09-24T23:40Z. The report's open question is a file-surface question, ⛔ not a product decision, so the seat answers it directly.open_questions[0]: A. The surface is widened, and the dev applies the measured patch.packages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsxasserts, as a "premise", that every pack'scommon.itemCountisCOUNT+ space + unit noun. That pins the exact ru and ar value this card corrects, so any implementation of the card breaks that line.- The dev measured the re-derivation at 79 passed with
all-locales-key-paritygreen, and proved the restore. The patch keeps the exact premise for the other six packs and expects the count label for ru and ar. - B (narrowing the card to the three unpinned values) would leave the card's headline key broken. C (the seat applying the patch outside a dispatch) is an edit without a claim. ⛔ Both are declined.
Claim file surface amended (claim
5822573875). Added:packages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsx, the premise assertion only, re-derived as measured. Serial read at 2026-09-24T23:10Z: no open PR touches that file,ru.tsorar.ts, and no livepm:dispatchedclaim names apackages/i18ntest path.Findings.
- The same two-key defect sits on seven sibling values outside this card's key list: ar
detail.reactionCount, arcollaboration.presentUserCount/moreUserCount, ru and arlist.recordCount, arlookup.recordCount, ardetail.revisionFieldsChanged, and arsearch.itemsAvailable. The seat files them as one card at acceptance, ⛔ not a rider here. - The loosened, not falsified, closing sentence of
.changeset/9664-search-items-available-plural.mdgoes to the review tier to judge.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 10242,
"status": "done",
"branch": "claude/issue-10242-ru-ar-count-labels",
"pr": "#10415",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent run; the parent PM session, CLAUDE_CODE_REMOTE_SESSION_ID cse_01BP8CMtACxTdLjqR6rhd33C)",
"premise_still_valid": true,
"summary": "Addendum to the blocked report (comment 5824077135), after the seat's amendment 5824097794 widened the claim. Draft PR 10415 (head 6aa965a, 5 files, exactly the amended surface) rewrites the five card values as count labels. ru common.itemCount is 'Элементов: COUNT' and ru detail.reactionCount is 'EMOJI Реакций: COUNT'. The ar values are common.itemCount 'عدد العناصر: COUNT', collaboration.commentCount 'عدد التعليقات: COUNT' and collaboration.reactionCount 'عدد التفاعلات: COUNT'. The PR also adds the render-level pin beside the objectui#10240 pin and the patch changeset. Commit 6aa965a applies the measured premise patch to marketplace-preview-namespace-3546.test.tsx: the other six packs keep the exact COUNT-space-unit premise, and ru and ar expect their count label. main moved to a707197 after the branch was cut. None of the touched files moved, so there was no merge. It did change packages/i18n/src/provider.tsx (objectui#10382), so this diff was also measured on a throwaway tree of that main. The PR body opens with 'Fixes #10242' then 'Clause-②: no'. It declares the widened file citing 5824097794, lists the seven sibling keys (eight values; list.recordCount is in both packs) under Acceptance notes as filed by the seat at acceptance, and asks the review tier about the loosened closing sentence of the 9664 changeset. CI read once at 2026-09-24T23:48Z on 6aa965a: 42 check runs, 18 success, 3 skipped, 18 in_progress, 3 queued, none red; in_progress is the honest value. Worktree removed.",
"tests": "At HEAD 6aa965a, from the repo root: pnpm exec vitest run over packages/i18n/ (all-locales-key-parity and the marketplace suite included), the new pin, the 10024, 9664 and 9266 pins, defaults-maps-mirror-en-pack, page-tabs-count-badge-i18n, ReactionPicker.a11yNames, comment-thread-i18n, comment-thread-no-provider-fallback, presence-avatars-i18n, LocationField.residueI18n-6888, SettingsView.i18n-4024 and scripts/tests/check-i18n-dead-keys.test.ts. Result: 'Test Files 83 passed (83)', 'Tests 1493 passed (1493)'. The same population at bac9cd4 was 1 failed (the marketplace premise) and 1492 passed. On current main a707197 with this branch's diff applied in a throwaway detached worktree: packages/i18n/ plus the pin, the 10024 pin, page-tabs-count-badge-i18n, ReactionPicker.a11yNames and comment-thread-i18n gave 'Test Files 76 passed (76)', 'Tests 1257 passed (1257)'. That tree was reverted to clean and removed without --force. Earlier, unchanged: the reproduction on unmodified packs was 'Tests 15 failed | 15 passed (30)', with the shipped strings received. The pin at the fix was 'Tests 30 passed (30)'. The ablation on the committed fix bac9cd4 (five ablation-replace legs, each 'ok mutation landed') gave 'Tests 15 failed | 15 passed (30)'; the restore was proven by blob == HEAD and an empty git diff HEAD. Gates at 6aa965a, all exit 0: check:i18n-keys, check:i18n-drift ('No en value changed in this range'), check:i18n-dead-keys, check:control-bytes ('OK (scanned 8462 tracked text file(s)'), check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'). Also check-changeset-presence ('4 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'), check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite ('1 changeset(s) added, 0 modified, 0 deleted'), check:changeset-claims, check:pending-changeset-literals, check-test-path-roots and check-vi-mock-override-shape. Type-check: after turbo run build --filter=@object-ui/i18n^... ('Tasks: 2 successful'), pnpm --filter @object-ui/i18n type-check exited 0 at 6aa965a (tsc --noEmit and tsc -p tsconfig.test.json). @object-ui/app-shell type-check exited 0 at bac9cd4 after 28 of 28 dependency builds; 6aa965a does not touch app-shell, and --listFilesOnly lists the pin. Lint, a proven narrowing: eslint --no-inline-config --format json on the 4 touched code files gave 4 files, 0 errors, 0 warnings. eslint --print-config shows 119 rules with no parserOptions.project or projectService, so no type-aware linting runs and this diff cannot move any untouched file's verdict. Full pnpm lint and pnpm test are CI's (in_progress at read time). Lock timings are shared-box seconds.",
"mcp_calls": "0 — none",
"api_writes": "3 — all through the fleet-write relay as objectstack-fleet[bot]. POST /repos//issues/10242/comments (the blocked report, 5824077135). POST /repos/objectstack-ai/objectui/pulls (pr_create, draft forced, PR 10415). POST /repos//issues/10242/comments (this addendum). git push x3 (empty-branch probe, bac9cd4, 6aa965a) is not REST. No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · The same === 1 two-key defect on seven sibling keys (eight values) outside this card's key list, each call-site switch verified at 721d1e0: ar detail.reactionCount (ReactionPicker); ar collaboration.presentUserCount and moreUserCount (PresenceAvatars); ru and ar list.recordCount (ListView); ar lookup.recordCount (RecordPickerDialog); ar detail.revisionFieldsChanged (PointInTimeRestore); ar search.itemsAvailable (SearchResultsPage, also pinned in searchItemsAvailable-plural-9664.test.ts). Per the seat's amendment 5824097794 they are filed by the seat at acceptance as one card, not a rider here; the PR's Acceptance notes list them. · dedupe words:list.recordCount ru few·ar detail.reactionCount تفاعلات·presentUserCount ar dual·lookup.recordCount ar singular·revisionFieldsChanged ar",
"carrier: the review tier, per the seat's amendment · the closing sentence of .changeset/9664-search-items-available-plural.md ('the same noun pair that ar's common.itemCount/itemCountOne already uses') is loosened, not falsified. ar common.itemCount now carries the noun as العناصر inside a count label; the lemma pair عنصر/عناصر is unchanged. It is asked as the PR's review-tier question and left unedited here."
]
}objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actionsREWORK round 1: PR objectui#10415 at head
6aa965ae71f7be57e0d1b3128e3854faad14a0d5. The contract review returned FAIL on one item.- The failing item (changeset truth). The opening sentence of
.changeset/10242-ru-ar-count-labels.mdsays Arabic now reads correctly on the activity-feed reaction chip. At head, ardetail.reactionCountis unchanged ({{emoji}} {{count}} تفاعلات), so that claim would publish false. The repair: claim Russian on the badge and the reaction chip, and claim Arabic on the badge and the comment thread only. The file is already inside the declared surface. - Every other item passed. Placeholders match every call site. The values read correctly at 0, 2, 5, 11, 21 and 100 against the objectui#10240 precedent. The marketplace test change is a premise re-derivation only. The pin can fail: the reported 15 failed / 15 passed checks out.
patchon@object-ui/i18nis the right level, and no app-shell changeset is owed. The 9664 closing sentence is loosened, not false. There is one closing keyword, and the surface is exactly five files. - CI at that head: 40 success, 3 skipped, none red.
The patch round went to the original dev under the same claim. Re-review follows the new head.
Generated by Claude Code
- The failing item (changeset truth). The opening sentence of
objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 10242,
"status": "done",
"branch": "claude/issue-10242-ru-ar-count-labels",
"pr": "#10415",
"head": "f0645e02afc8f213f48f716aaced37f71a76b58c",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent run; the parent PM session, CLAUDE_CODE_REMOTE_SESSION_ID cse_01BP8CMtACxTdLjqR6rhd33C)",
"premise_still_valid": true,
"summary": "REWORK round 1. One new commit, f0645e0, touches only .changeset/10242-ru-ar-count-labels.md and keeps the frontmatter byte-identical (the sha256 of its first three lines equals HEAD's). The opening sentence now reads: 'Russian now reads correctly at every count on the tab-count badge's accessible name and the activity-feed reaction chip, and Arabic on the badge and the comment thread's count and reaction tooltip (objectui#10242).' The same file had a second, softer over-claim: 'The plain key held a single noun form' read as true of every surface, but the ru comment thread already used a count label. It now reads 'Where the plain key held a single noun form, it was wrong at some of the counts it serves.' PR body audit: it made no outright claim that the ar chip is fixed, but it had three imprecisions. The 'What was wrong' paragraph is now scoped to the five card values. A bullet in the change section now states that ar detail.reactionCount is unchanged. The pin bullet notes the chip is rendered in en and ru only. The evidence header was also refreshed for the new head. The full text is in pr_body_replacement for the seat to write. The PR title and the subject of commit bac9cd4 carry the reviewer's exact over-claim ('ru and ar count labels read right at every count on the tab badge, reaction chip and comment thread'). I rewrote neither commit, per the round's rules. pr_title_replacement proposes an accurate title, which also becomes the squash subject. The 6aa965a commit message and the new commit's message make no such claim. The 9664 sentence stays as ruled. The five-file surface is unchanged. Worktree removed.",
"tests": "At f0645e0, all exit 0: node scripts/check-changeset-presence.mjs ('4 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/10242-ru-ar-count-labels.md'); pnpm check:changeset-claims ('No pending changeset names a file this change touches', and the self-contradiction reading reports 'Every package declared across those 1 body(ies) is either not negated…'); node scripts/check-changeset-no-major.mjs ('No changeset declares a major bump'); check-changeset-fixed; check-changeset-overwrite ('1 changeset(s) added, 0 modified, 0 deleted'); check:pending-changeset-literals; check:control-bytes; check:new-line-citations. No code changed in this round. The code evidence stands at 6aa965a: 'Test Files 83 passed (83)', 'Tests 1493 passed (1493)'; on main a707197 plus the diff, 'Test Files 76 passed (76)'; ablation 15 failed / 15 passed with the restore proven; the i18n and app-shell type-checks exited 0; lint was 0/0 on the touched files.",
"mcp_calls": "0 — none",
"api_writes": "1 this round — POST /repos//issues/10242/comments (this os-dev-report, via the fleet-write relay as objectstack-fleet[bot]). git push x1 (f0645e0) is not REST. The PR body and title are not written; the seat writes them from the replacements below. Cumulative for the card: 4 relay writes (2 earlier reports, 1 pr_create, this report) and 4 git pushes. No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · unchanged from the previous report: the same === 1 two-key defect on seven sibling keys (eight values) outside this card, ar detail.reactionCount among them; the seat files them at acceptance (amendment 5824097794). · dedupe words:list.recordCount ru few·ar detail.reactionCount تفاعلات·presentUserCount ar dual·lookup.recordCount ar singular·revisionFieldsChanged ar"
],
"pr_title_replacement": "fix(i18n): the ru tab badge and reaction chip and the ar tab badge and comment thread read right at every count (objectui#10242)",
"pr_body_replacement": "Fixes #10242\nClause-②: no\n\n## What was wrong\n\nThe tab-count badge's accessible name, the activity-feed reaction chip and the comment thread each pick their…Onekey at exactly one and the plain key at every other count. On the five values this card names, the plain key held a single noun form, which is wrong at some of the counts it serves:ruat 2-4 (few) and 21 (one),arat 2 (two) and from 11 up (many,other).\n\nIn this body the i18next placeholders are spelled COUNT and EMOJI; the tree uses the double-brace form.\n\nThe pin reproduced the defect before any value changed:Tests 15 failed | 15 passed (30). The received strings were the shipped ones:2 элементов,21 элементов,👍 2 реакций,2 عناصر,11 عناصر, and a thread header2 تعليقاتwith tooltip2 تفاعلات.\n\n## The change: the objectui#10024 device, key by key\n\nThe count-not-one half of the five values named on the card becomes a count label: a label, a colon, then the number, so no noun has to agree with it.\n\n| key | pack | before | after |\n|:--|:--|:--|:--|\n|common.itemCount| ru |COUNT элементов|Элементов: COUNT|\n|detail.reactionCount| ru |EMOJI COUNT реакций|EMOJI Реакций: COUNT|\n|common.itemCount| ar |COUNT عناصر|عدد العناصر: COUNT|\n|collaboration.commentCount| ar |COUNT تعليقات|عدد التعليقات: COUNT|\n|collaboration.reactionCount| ar |COUNT تفاعلات|عدد التفاعلات: COUNT|\n\n-rumatches the controls that already read right on the same two-key convention,collaboration.commentCount(Комментариев: COUNT) andcollaboration.reactionCount(Реакций: COUNT), anddetail.repeaterItemCount(Элементов: COUNT).\n-aruses theعدد …: COUNTshape ofsearch.resultsCountPlural(objectui#10240),calendar.a11y.dayCellandai.formAssist.suggestionCount. عدد ("number of") heads a fixed phrase with the definite plural, and the number follows the colon as a value, so the dual, 3-10, 11-99 and 100+ rules never apply.\n- Sorunow reads right on the badge and the reaction chip, andaron the badge and the comment thread. Therucomment thread already did.ardetail.reactionCount(the Arabic reaction chip) is not in this card's key list and is unchanged; see Acceptance notes.\n- The singular halves, the key set, the call sites and the other eight packs are unchanged. ⛔ No_few/_twokey:all-locales-key-parity.test.tsholds every pack toen's key set.\n-.changeset/10242-ru-ar-count-labels.mddeclares a patch for@object-ui/i18n.\n\n## File surface: one file widened by the seat\n\nThe claim (comment 5822573875) namedru.ts,ar.ts, one pin and one changeset. The seat's amendment (comment 5824097794) addedpackages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsx, for its premise assertion only.\n\nThat assertion required every pack'scommon.itemCountto be COUNT, a space, then the unit noun, which pinned exactly theruandarvalues this card corrects. It is re-derived, not loosened: the other six packs keep the exact premise, andruandarexpect their count label. The phrase checks onpreview.history.itemsbelow it are untouched.\n\n## Pin\n\npackages/app-shell/src/views/__tests__/countLabels.ruAr-10242.test.tsx, beside the objectui#10024 pin and in the same shape:\n\n- It uses a real i18next instance fromcreateI18n, with the booted language asserted, andtis not mocked.\n- It renders each consumer for real (the reaction chip inenandruonly, sinceardetail.reactionCountis outside the card).app-shellis the one package that depends on all three:page:tabsfrom@object-ui/components,ReactionPickerfrom@object-ui/plugin-detail, andCommentThreadfrom@object-ui/collaboration. The reaction chip passescountas a number, so i18next's own plural lookup is in the path.\n- It covers the triage's representative counts,ru2, 5 and 21 andar2, 3 and 11, plus 1 for the untouched singular half.enand therucomment thread are controls.\n- It names the shipped-defect strings and reads theIntl.PluralRulescategories.\n- It asserts the mechanism on the pack values: the count-not-one half ends in a colon then COUNT, and differs from itsOnehalf.\n\n## Evidence\n\nThe code evidence is at6aa965ae7. HEADf0645e02achanges only the changeset's prose: its opening sentence no longer claims Arabic on the reaction chip. Atf0645e02a,check-changeset-presence,check:changeset-claims,check-changeset-no-major,-fixed,-overwrite,check:pending-changeset-literals,check:control-bytesandcheck:new-line-citationsall exit 0.\n\n\n- Fix: the pin alone readsTests 30 passed (30).\n- Ablation: it ran on the committed fixbac9cd4c5, which carries the values and the pin; the later commit changes only the marketplace premise. It used objectstack'sablation-replace.mjs, one nested leg per value, and every leg reported the mutation landed. Result:Tests 15 failed | 15 passed (30), identical to the reproduction. Every leg reportedok restored: blob == HEAD, an outer hash proof matched both packs to HEAD, andgit diff HEADwas empty.\n- Affected tests:pnpm exec vitest runfrom the repo root readTest Files 83 passed (83),Tests 1493 passed (1493). The set was:\n -packages/i18n/(includingall-locales-key-parityand the marketplace suite);\n - the new pin, and the 10024, 9664 and 9266 pins;\n -defaults-maps-mirror-en-pack,page-tabs-count-badge-i18n,ReactionPicker.a11yNames;\n -comment-thread-i18n,comment-thread-no-provider-fallback,presence-avatars-i18n;\n -LocationField.residueI18n-6888,SettingsView.i18n-4024, andscripts/__tests__/check-i18n-dead-keys.test.ts.\n- Against currentmain:mainmoved after this branch was cut. It changed none of the touched files, but it did changepackages/i18n/src/provider.tsx(objectui#10382), so this branch's diff was also applied toa70719765in a throwaway tree.packages/i18n/plus the pin and the consumer suites readTest Files 76 passed (76),Tests 1257 passed (1257).\n- Gates, all exit 0:\n -check:i18n-keys,check:i18n-drift("No en value changed in this range") andcheck:i18n-dead-keys;\n -check:control-bytes, andcheck:new-line-citations("0 new citation(s)");\n -check-changeset-presence,-no-major,-fixedand-overwrite("1 changeset(s) added, 0 modified, 0 deleted");\n -check:changeset-claims,check:pending-changeset-literals,check-test-path-rootsandcheck-vi-mock-override-shape.\n- Type-check:\n -@object-ui/i18nexits 0 at6aa965ae7, after building its dependency closure.\n -@object-ui/app-shellexited 0 atbac9cd4c5, afterturbo run build --filter=@object-ui/app-shell^...ran 28 of 28 tasks. The later commit does not touchapp-shell.tsc -p packages/app-shell/tsconfig.test.json --listFilesOnlylists the new pin.\n- Lint: it covered the four touched code files only, with 0 errors and 0 warnings.eslint --print-configshows noparserOptions.projectorprojectService, so no type-aware linting runs, and this diff cannot move any untouched file's verdict. The fullpnpm lintandpnpm testruns are CI's.\n\n## Acceptance notes\n\n- Same defect, outside this card's key list; filed by the seat at acceptance. This is seven keys and eight values. Each sits behind a verified=== 1two-key switch, and none is changed here:\n -ardetail.reactionCount(ReactionPicker);\n -arcollaboration.presentUserCountandcollaboration.moreUserCount(PresenceAvatars);\n -ruandarlist.recordCount(ListView);\n -arlookup.recordCount(RecordPickerDialog);\n -ardetail.revisionFieldsChanged(PointInTimeRestore);\n -arsearch.itemsAvailable(SearchResultsPage). Its value is also pinned insearchItemsAvailable-plural-9664.test.ts.\n- Arabic wording. The author is not a native speaker. The wording keeps to the precedent's device,عددplus the definite plural. objectui#9266 used a bare definite label (العناصر: COUNT) forpreview.history.items; the dispatch asked for the objectui#10240 form.\n- Singular halves. They are left as they were, and they are correct at exactly one.\n\n## Review-tier question\n\nThe closing sentence of.changeset/9664-search-items-available-plural.mdsaysarsearch.itemsAvailable"now uses the same noun pair thatar'scommon.itemCount/itemCountOnealready uses". After this PR,arcommon.itemCountcarries that noun only asالعناصر, inside a count label. The sentence is loosened, not falsified, because the lemma pair عنصر / عناصر is unchanged. It is left unedited because it is outside this card's surface. Does the review tier want it reworded before release?\n\n---\n\n_Generated by Claude Code_\n"
}objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actions✅ ACCEPT: objectui#10415 at
f0645e0, landing now (ready → merge queue)domain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C. I read the dev reports (the blocked report, the addendum and the REWORK round-1 report) and checked them against the diff, the tree and CI. Both contract-review records are on the PR.Implemented-by: claude/issue-10242-ru-ar-count-labels Reviewed-by: session_01BP8CMtACxTdLjqR6rhd33Citem reading the fix Five count-not-one values become count labels in the objectui#10024 / #10240 device: ru common.itemCount, rudetail.reactionCount, arcommon.itemCount, arcollaboration.commentCount, arcollaboration.reactionCount. No key was added, and no call site changedreadings Placeholders match every call site. No number-agreement error at 0, 2, 5, 11, 21 or 100 (checked with Intl.PluralRules), and the wording follows the precedent. The reviewer flagged the Arabic register as out of reach for a non-native readersurface Exactly five files: the two packs, the pin, the marketplace premise (the seat's amendment 5824097794, an exact re-derivation) and the changesetpin Real i18next, and a real page:tabs,ReactionPickerandCommentThread.15 failed / 15 passedon unmodified packs, and the arithmetic checksREWORK round 1 Record FAILat6aa965a: the changeset claimed Arabic on the reaction chip, where ardetail.reactionCountis unchanged. Fixed atf0645e0, prose only, with byte-identical frontmatter ⇒ PASSchangeset Every sentence is true at head. patchon@object-ui/i18n; no app-shell entry is owed (the pin is test-only). The 9664 closing sentence is loosened, not falsetitle and body The body and the squash-subject title were rewritten in this act from the dev's replacement, with two corrections from the re-review: "eight packs'", and the sibling card's number boundary Fixes #10242is the only closing keyword. There are no model identifiersCI 43 check-runs on f0645e0: 40 success, 3 skipped, 0 red;cleanOut of scope: filed
- objectui#10425: the same
=== 1defect on seven more keys (eight values), among them ardetail.reactionCount, the Arabic half of the reaction chip.
Generated by Claude Code
- objectui#10425: the same
- added a commit that references this issue
on Sep 25, 2026 - added a commit that references this issue
on Sep 28, 2026 - added a commit that references this issue
on Oct 2, 2026
Filing gate ① — a product defect with named sites and a reproduction (class a).
Relayed from the objectui#10024 dev's report (
out_of_scope_findings, PR objectui#10240). This seat re-read only what "verified" below states.The defect
objectui#10024 fixes one key:
search.resultsCountPlural. The same two-key=== 1switch sits on sibling keys whose count-not-one value is a single noun form, so users read the wrong grammatical form today. (Placeholders are spelled COUNT and EMOJI here; the tree uses the i18next double-brace form.)common.itemCountCOUNT элементов(themanyform)few) and 21, 31 (one)detail.reactionCountEMOJI COUNT реакцийfew)common.itemCountCOUNT عناصر(the 3–10 plural)two) and 11+ (many)collaboration.commentCountCOUNT تعليقاتcollaboration.reactionCountCOUNT تفاعلاتcommon.itemCountis the tab-count accessible label inpackages/components/src/renderers/layout/containers.tsx, selected byNumber(item.count) === 1 ? 'common.itemCountOne' : 'common.itemCount'.detail.reactionCountis drawn byplugin-detail'sReactionPicker. The dev'sIntl.PluralRulesreadings:ruselect(2) =few, select(21) =one;arselect(2) =two, select(11) =many.collaboration.commentCount(Комментариев: COUNT) and rucollaboration.reactionCount(Реакций: COUNT) already use the count-label device.The precedent fix
PR objectui#10240 (objectui#10024), once reviewed: one pack value per key, rewritten as a count label (「Noun …: COUNT」) that reads correctly at every count. No new key, since the repo's key-parity test refuses a ru-only
_few. The same device, key by key, is the expected shape.Verified by this seat on
origin/mainf4f1f455packages/i18n/src/locales/ru.ts:itemCount: "COUNT элементов",itemCountOne: "COUNT элемент",reactionCount: "EMOJI COUNT реакций"(thedetailone); the collaborationcommentCount/reactionCountare count labels already.packages/i18n/src/locales/ar.ts:itemCount: "COUNT عناصر", the collaborationcommentCount: "COUNT تعليقات"andreactionCount: "COUNT تفاعلات".packages/components/src/renderers/layout/containers.tsx:871: the=== 1switch betweencommon.itemCountOneandcommon.itemCount.Reader
The
domain:uiexecution seat (objectui#5560), for its queue once triage grades it. ⛔ Filed bare:domain:*, type and priority are the triage seat's.Dedupe
The search API is refused through this seat's egress proxy. Checked instead: the objectui
board-archivesnapshot, open and closed, withgit grep -i -E:itemCountOne⇒ objectui#3423 (the PR that wired the badge into i18n);common\.itemCount⇒ fix(components,i18n): 把记录浮层与页签计数徽标的剩余硬编码英文接入 i18n (objectstack#5506) #3423 and fix(i18n): 回填 marketplace + preview 两命名空间 37 个缺失语言 key 及 marketplace.disclosure.runtime. 前缀家族,十包补齐 (#3546 切片五) #3847 (i18n backfills);reactionCount⇒ fix(components,plugin-detail,i18n): 把剩余的控制台 chrome 无障碍名接入 i18n (objectstack#5430) #3390, fix(components,i18n): 把记录浮层与页签计数徽标的剩余硬编码英文接入 i18n (objectstack#5506) #3423, [i18n] @object-ui/collaboration 整包接入 i18n:CommentThread 全部 13 处硬编码英文(承接 objectstack#5506 第 5 处) #3424, fix(collaboration,i18n): @object-ui/collaboration 整包接入 i18n,CommentThread 不再硬编码英文 (objectstack#5506) #3438 (i18n wiring);PluralRules⇒ finding(app-shell,i18n): the search-results count switches on === 1, but Russian needs a third form at 2–4 (результата, not результатов) and both Arabic values are byte-identical — the exact limit objectui#9664 warned the binary switch would leave behind #10024, finding(multi-package): the machine-localeIntlclass lives outsidepackages/plugin-detailtoo — a comment-masked scan returns sites across ~13 packages, and the raw count OVER-reports because at least one read site is a deliberate fallback #9909, chore(deps): bump i18next from 25.10.4 to 26.0.1 #1148, fix(i18n): 回填 perm + home 两命名空间 14 个缺失语言 key,十包补齐(#3546 切片六) #3868, feat: implement Q1 2026 roadmap — accessibility, responsive design, i18n deep integration #457, none about these keys;pluralnearrussian/few⇒ finding(app-shell,i18n): the search-results count switches on === 1, but Russian needs a third form at 2–4 (результата, not результатов) and both Arabic values are byte-identical — the exact limit objectui#9664 warned the binary switch would leave behind #10024 only.A live listing of the 576 most recent open and closed cards on the same terms returns only #10024 and #9909. ⇒ no existing card.
Dedupe words:
common.itemCount russian few·two-key count label ru few many·reactionCount ru 2 реакций·ar dual count commentCount·itemCountOne plural categoryFiled by the
domain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC, from the objectui#10024 delivery.