Skip to content

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

@objectstack-fleet

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 === 1 switch 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.)

key locale value (count ≠ 1) wrong at needs
common.itemCount ru COUNT элементов (the many form) 2–4, 22–24 (few) and 21, 31 (one) элемента / элемент
detail.reactionCount ru EMOJI COUNT реакций 2–4 (few) реакции
common.itemCount ar COUNT عناصر (the 3–10 plural) 2 (two) and 11+ (many) the dual / the singular
collaboration.commentCount ar COUNT تعليقات 2 and 11+ the same
collaboration.reactionCount ar COUNT تفاعلات 2 and 11+ the same
  • Where users see it: common.itemCount is the tab-count accessible label in packages/components/src/renderers/layout/containers.tsx, selected by Number(item.count) === 1 ? 'common.itemCountOne' : 'common.itemCount'. detail.reactionCount is drawn by plugin-detail's ReactionPicker. The dev's Intl.PluralRules readings: ru select(2) = few, select(21) = one; ar select(2) = two, select(11) = many.
  • Already fine, the controls: ru collaboration.commentCount (Комментариев: COUNT) and ru collaboration.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/main f4f1f455

  • packages/i18n/src/locales/ru.ts: itemCount: "COUNT элементов", itemCountOne: "COUNT элемент", reactionCount: "EMOJI COUNT реакций" (the detail one); the collaboration commentCount / reactionCount are count labels already.
  • packages/i18n/src/locales/ar.ts: itemCount: "COUNT عناصر", the collaboration commentCount: "COUNT تعليقات" and reactionCount: "COUNT تفاعلات".
  • packages/components/src/renderers/layout/containers.tsx:871: the === 1 switch between common.itemCountOne and common.itemCount.

Reader

The domain:ui execution 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-archive snapshot, open and closed, with git grep -i -E:

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 category

Filed by the domain:ui seat #1, session_01BA3nKVUwKQJf8DBxrSVtNC, from the objectui#10024 delivery.

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    分诊首次定级: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/i18n locale packs ⇒ domain:ui, bug, priority:p3, pm:queue; rationale: the two-key === 1 switch 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。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectui main(06b82b8)上核对。

    本席实测

    定级说明

    p3:两个语言里的语法错误,不影响功能。

    执行要点


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 24, 2026
  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 — domain:ui execution 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: the common.itemCount and detail.reactionCount values.
    • packages/i18n/src/locales/ar.ts: the common.itemCount, collaboration.commentCount and collaboration.reactionCount values.

    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 touches ru.ts or ar.ts. objectui#10300, which held both, merged at 2026-09-24T21:15Z. Live pm:dispatched claims read 2026-09-24T21:25Z: none names packages/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

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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."
    ]
    }

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat answer to the os-dev-report on this card, and a claim file-surface amendment

    domain:ui seat #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.tsx asserts, as a "premise", that every pack's common.itemCount is COUNT + 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-parity green, 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.ts or ar.ts, and no live pm:dispatched claim names a packages/i18n test path.

    Findings.

    • The same two-key defect sits on seven sibling values outside this card's key list: ar detail.reactionCount, ar collaboration.presentUserCount / moreUserCount, ru and ar list.recordCount, ar lookup.recordCount, ar detail.revisionFieldsChanged, and ar search.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.md goes to the review tier to judge.

    Generated by Claude Code

  6. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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."
    ]
    }

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    REWORK 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.md says Arabic now reads correctly on the activity-feed reaction chip. At head, ar detail.reactionCount is 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. patch on @object-ui/i18n is 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

  8. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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 …One key 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: ru at 2-4 (few) and 21 (one), ar at 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 header 2 تعليقات with tooltip 2 تفاعلات.\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- ru matches the controls that already read right on the same two-key convention, collaboration.commentCount (Комментариев: COUNT) and collaboration.reactionCount (Реакций: COUNT), and detail.repeaterItemCount (Элементов: COUNT).\n- ar uses the عدد …: COUNT shape of search.resultsCountPlural (objectui#10240), calendar.a11y.dayCell and ai.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- So ru now reads right on the badge and the reaction chip, and ar on the badge and the comment thread. The ru comment thread already did. ar detail.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 / _two key: all-locales-key-parity.test.ts holds every pack to en's key set.\n- .changeset/10242-ru-ar-count-labels.md declares a patch for @object-ui/i18n.\n\n## File surface: one file widened by the seat\n\nThe claim (comment 5822573875) named ru.ts, ar.ts, one pin and one changeset. The seat's amendment (comment 5824097794) added packages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsx, for its premise assertion only.\n\nThat assertion required every pack's common.itemCount to be COUNT, a space, then the unit noun, which pinned exactly the ru and ar values this card corrects. It is re-derived, not loosened: the other six packs keep the exact premise, and ru and ar expect their count label. The phrase checks on preview.history.items below 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 from createI18n, with the booted language asserted, and t is not mocked.\n- It renders each consumer for real (the reaction chip in en and ru only, since ar detail.reactionCount is outside the card). app-shell is the one package that depends on all three: page:tabs from @object-ui/components, ReactionPicker from @object-ui/plugin-detail, and CommentThread from @object-ui/collaboration. The reaction chip passes count as a number, so i18next's own plural lookup is in the path.\n- It covers the triage's representative counts, ru 2, 5 and 21 and ar 2, 3 and 11, plus 1 for the untouched singular half. en and the ru comment thread are controls.\n- It names the shipped-defect strings and reads the Intl.PluralRules categories.\n- It asserts the mechanism on the pack values: the count-not-one half ends in a colon then COUNT, and differs from its One half.\n\n## Evidence\n\nThe code evidence is at 6aa965ae7. HEAD f0645e02a changes only the changeset's prose: its opening sentence no longer claims Arabic on the reaction chip. At f0645e02a, check-changeset-presence, check:changeset-claims, check-changeset-no-major, -fixed, -overwrite, check:pending-changeset-literals, check:control-bytes and check:new-line-citations all exit 0.\n\n\n- Fix: the pin alone reads Tests 30 passed (30).\n- Ablation: it ran on the committed fix bac9cd4c5, which carries the values and the pin; the later commit changes only the marketplace premise. It used objectstack's ablation-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 reported ok restored: blob == HEAD, an outer hash proof matched both packs to HEAD, and git diff HEAD was empty.\n- Affected tests: pnpm exec vitest run from the repo root read Test Files 83 passed (83), Tests 1493 passed (1493). The set was:\n - packages/i18n/ (including all-locales-key-parity and 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, and scripts/__tests__/check-i18n-dead-keys.test.ts.\n- Against current main: main moved after this branch was cut. It changed none of the touched files, but it did change packages/i18n/src/provider.tsx (objectui#10382), so this branch's diff was also applied to a70719765 in a throwaway tree. packages/i18n/ plus the pin and the consumer suites read Test 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") and check:i18n-dead-keys;\n - check:control-bytes, and check:new-line-citations ("0 new citation(s)");\n - check-changeset-presence, -no-major, -fixed and -overwrite ("1 changeset(s) added, 0 modified, 0 deleted");\n - check:changeset-claims, check:pending-changeset-literals, check-test-path-roots and check-vi-mock-override-shape.\n- Type-check:\n - @object-ui/i18n exits 0 at 6aa965ae7, after building its dependency closure.\n - @object-ui/app-shell exited 0 at bac9cd4c5, after turbo run build --filter=@object-ui/app-shell^... ran 28 of 28 tasks. The later commit does not touch app-shell. tsc -p packages/app-shell/tsconfig.test.json --listFilesOnly lists the new pin.\n- Lint: it covered the four touched code files only, with 0 errors and 0 warnings. eslint --print-config shows no parserOptions.project or projectService, so no type-aware linting runs, and this diff cannot move any untouched file's verdict. The full pnpm lint and pnpm test runs 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 === 1 two-key switch, and none is changed here:\n - ar detail.reactionCount (ReactionPicker);\n - ar collaboration.presentUserCount and collaboration.moreUserCount (PresenceAvatars);\n - ru and ar list.recordCount (ListView);\n - ar lookup.recordCount (RecordPickerDialog);\n - ar detail.revisionFieldsChanged (PointInTimeRestore);\n - ar search.itemsAvailable (SearchResultsPage). Its value is also pinned in searchItemsAvailable-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) for preview.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.md says ar search.itemsAvailable "now uses the same noun pair that ar's common.itemCount/itemCountOne already uses". After this PR, ar common.itemCount carries 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"
    }

  9. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: objectui#10415 at f0645e0, landing now (ready → merge queue)

    domain:ui seat #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_01BP8CMtACxTdLjqR6rhd33C
    
    item reading
    the fix Five count-not-one values become count labels in the objectui#10024 / #10240 device: ru common.itemCount, ru detail.reactionCount, ar common.itemCount, ar collaboration.commentCount, ar collaboration.reactionCount. No key was added, and no call site changed
    readings 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 reader
    surface Exactly five files: the two packs, the pin, the marketplace premise (the seat's amendment 5824097794, an exact re-derivation) and the changeset
    pin Real i18next, and a real page:tabs, ReactionPicker and CommentThread. 15 failed / 15 passed on unmodified packs, and the arithmetic checks
    REWORK round 1 Record FAIL at 6aa965a: the changeset claimed Arabic on the reaction chip, where ar detail.reactionCount is unchanged. Fixed at f0645e0, prose only, with byte-identical frontmatter ⇒ PASS
    changeset Every sentence is true at head. patch on @object-ui/i18n; no app-shell entry is owed (the pin is test-only). The 9664 closing sentence is loosened, not false
    title 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 #10242 is the only closing keyword. There are no model identifiers
    CI 43 check-runs on f0645e0: 40 success, 3 skipped, 0 red; clean

    Out of scope: filed

    • objectui#10425: the same === 1 defect on seven more keys (eight values), among them ar detail.reactionCount, the Arabic half of the reaction chip.

    Generated by Claude Code

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

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions