Skip to content

cli/i18n: os i18n check does not read a field's inlineHelpText as the default-locale source of its help key, so translating help into en turns the default locale red #25683

Closed

Description

@objectstack-fleet

Filing gate: ① product defect, measured once through os i18n check --strict on a real app.

Reach. objectstack-ai/hotsrm (spec/cli 18.0.0, defaultLocale: 'zh-CN', labels authored in Chinese, an en bundle). A field authored with inlineHelpText: '原始值达到此值得 100 分…' plus the English translation objects.srm_kpi.fields.full_score_value.help in the en bundle fails the gate:

✗ objects.srm_kpi.fields.full_score_value.help
  Field "srm_kpi" fields.full_score_value.help missing translation for locale "zh-CN"

Removing the en help entry makes the check pass (and leaves English users with Chinese help text, unflagged). Labels on the same field pass without any zh-CN entry, because the authored label counts as the default-locale text (#15711, ruled A).

Where it lands. packages/cli/src/utils/i18n-extract.ts (~:1376 on main fc4ac58, see git grep -n "'fields', fieldName, 'help'"): the field help key's inline source is field.help ?? field.description. FieldSchema spells help text inlineHelpText (help is only an alias), so an app that authors inlineHelpText has no inline source for the key, and the default locale is reported missing as soon as any bundle carries help.

Expected. inlineHelpText is the default-locale source of fields.<f>.help (e.g. field.help ?? field.inlineHelpText ?? field.description), like an authored label: no zh-CN bundle needed, and a non-default locale without help is reported as a gap.

Workaround in use (temporary). hotsrm ships a zh-CN bundle holding only those two help strings, reusing the same constants as the field definitions (hotsrm PR #58).

Who acts. triage, then the lane owning packages/cli i18n extraction (os i18n check).

Dedupe. Searched i18n check help inlineHelpText default locale in objectstack-ai/objectstack, open and closed: 6 hits (#25652, #25459, #21948, #16251, #15711, #3370); none about the help key's default-locale source. Nearest: #21948 (runtime overlay writes help, closed) and #15711 (authored label = default-locale text, ruled).

Reported from objectstack-ai/hotsrm#50 (session https://claude.ai/code/session_019iE32XA4FKxNMr2rdfpj1D).


Generated by Claude Code

Activity

  1. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 24, 2026
  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:server · area:i18n · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-24T17:55Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC
    Account: os-project-manager (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25683-inline-help-default-locale
    Worktree: objectstack-issue-25683
    Domain: domain:server
    Seat: domain:server#1
    File surface: packages/cli/src/utils/i18n-extract.ts (the inline default-locale source of objects.<o>.fields.<f>.help), its tests, one changeset (stop on breach; explain in the report)
    Container & model: S mechanical, mode:subagent, model: sonnet (the floor of dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the platform's own extractor in packages/cli produces the false "missing translation" | no platform path covers it (the only escape is a default-locale bundle duplicating the authored text) | any app that authors inlineHelpText and ships a non-default bundle carrying help reaches it through os i18n check; hotsrm uses it today (workaround in its PR #58)
    Thread-read: 6387595193
    Premise: holds (read 2026-10-24T23:01Z on origin/main 47af3dd: git grep -n "'fields', fieldName, 'help'" origin/main -- packages/cli/src/utils/i18n-extract.ts → line 1380, inline source field.help ?? field.description, no inlineHelpText)
    Serial constraints cleared: no open PR touches packages/cli/src/utils/i18n-extract.ts (all 19 open PRs' file lists read this fire). Same-day merges on it: 47af3dd (#25701) and 42d9fe8 (#25620).

  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 25683,
    "status": "done",
    "branch": "claude/issue-25683-inline-help-default-locale",
    "pr": "#25720",
    "session": "session_01R1q2xdtYgU6FKrZ7LgjPCC",
    "premise_still_valid": true,
    "summary": "The inline source of the field help key in packages/cli/src/utils/i18n-extract.ts is now field.help ?? field.inlineHelpText ?? field.description (triage route verbatim), so an app authoring inlineHelpText with an en help bundle no longer has its default locale reported; a non-default locale without help is still a gap. Mechanism hypothesis confirmed: that call is the only site reading help ?? description; flow screen fields already read inlineHelpText, form section entries, bulk and action params and metadataForms each read their own single key (no change, verdicts in the PR body). File surface breached by one file, as a consequence of the fix: the showcase example's contact.lead_score authors inlineHelpText, so check:i18n-coverage went 320 to 321; fixed by one zh-CN help string in examples/app-showcase/src/system/translations/index.ts, baseline untouched. Clause-② no and Metadata-protocol none measured on the diff and match the claim (no key, value or type an author can write changed).",
    "tests": "New packages/cli/test/i18n-extract-inline-help-text.test.ts, 6 cases (vitest, unit project): 6/6 pass at fc0e06c. Ablation on the committed fix via scripts/ablation-replace.mjs (anchor 1 to 0, blob 73ad3d73 to 1be8fcb1, tests import src so no dist leg): 3 of 6 fail (inline emission, source order, default-locale not reported); restore proven, blob equals HEAD and git diff HEAD empty. Direction observed: red, as expected. vitest run --project unit test/i18n: 31 files, 341 tests pass. @objectstack/example-showcase test: 39 files, 484 tests pass. @objectstack/cli typecheck exit 0. Full cli unit project hit the 570s foreground ceiling (exit 124) and was narrowed to the i18n tests, declared; integration layer declared to CI.",
    "gates": "Local: dispatch-gates --commands derived 72 families at final head 8c1cdf8; all run, exit codes captured before any pipe, --ran reconciliation: 72 derived, 72 run, 0 NOT-MEASURED (the tool notes it cannot see exit codes). Exit 0 on the final tree for 71. check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs a full pnpm build), NOT MEASURED, left to CI. Reruns after prerequisite builds: check:i18n 0, check:i18n-walk-parity 0, check:i18n-coverage first 1 (320 to 321, fixed in the example, rerun 0), check:plugin-teardown-shape --self-test first 3 (shallow clone, fetched the pinned object, rerun 0), check:query-options-erasure and check:type-check-debt first 124 (250s cap), rerun 0. Two families appeared after the example edit (check:examples-live-imports, check:react-page-adapter-contract), both 0. Scoped eslint --no-inline-config over the 4 touched ts files exit 0; pnpm --filter lint matches no script (lint is root-level, a CI-owned repo scan). CI families: PR check-runs not yet read, in_progress.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 — no MCP GitHub calls; card and comments read through gh api REST GETs",
    "api_writes": "2 relay writes: repository_dispatch to objectstack-ai/objectstack carrying pr_create (draft, assignees os-project-manager, PR 25720, read-back 3449 of 3449 bytes identical), and this report comment via post-stamped; plus 3 git pushes (empty-branch probe, fix, example translation). Write budget spent: 3 pushes, 1 pr_create, 1 report comment.",
    "open_questions": [],
    "out_of_scope_findings": ["carrier: none noted, not filed · FieldSchema rejects help as an alias of inlineHelpText (strict key), so the field.help leg in the extractor reads a key an author cannot write on a field; kept because the triage ruling names it explicitly (help, then inlineHelpText, then description). Acceptance note only; carrier: none."]
    }

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer · domain:server seat 1 · 2026-10-25T00:05Z: ACCEPT → PR #25720 comment 6391194486 (head 8c1cdf8bfb). Lands through the queue once CI is green.

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed

    PR #25720 merged at 2026-10-25T00:59Z by the merge queue as squash 1252db9a7 on main.

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/*' for pr-25720 0 refs (left the queue)
    origin/main by content git grep inlineHelpText origin/main -- packages/cli/src/utils/i18n-extract.ts line 1386 field.help ?? field.inlineHelpText ?? field.description
    origin/main by content test packages/cli/test/i18n-extract-inline-help-text.test.ts and .changeset/25683-inline-help-default-locale.md both present

    State change: card closed by Fixes #25683 (completed); pm:dispatched removed. Seat's PR subscription ended with the merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions