Skip to content

fix(cli): os i18n check reads inlineHelpText as the default-locale source of a field help key - #25720

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-25683-inline-help-default-locale
Oct 25, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-25683-inline-help-default-locale

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #25683

Clause-②: no
Metadata-protocol: none

What changed

The inline source of a field's help key (objects.OBJECT.fields.FIELD.help) in packages/cli/src/utils/i18n-extract.ts is now field.help ?? field.inlineHelpText ?? field.description, per the triage route: inlineHelpText is the default-locale source, after help and before description, the same way an authored label is (#15711, ruled A). A field that authors inlineHelpText and translates help into one locale no longer has its default locale reported as missing; a non-default locale with no help is still reported.

Mechanism measured

That call is the only site where the field help key takes default-locale text (git grep for help ?? in packages/**/src finds only it). Other help-key sites, each with a verdict:

  • Flow screen fields (flows.FLOW.screens.NODE.fields.FIELD.inlineHelpText): already read inlineHelpText directly, no fallback chain. No change.
  • Form section entries (_sections.SECTION.fields.FIELD.helpText): read the entry's own helpText only, no help ?? description. No change.
  • Bulk action params (params.PARAM.help) and action params (params.PARAM.helpText): read their own single key. No change.
  • metadataForms.TYPE.fields.PATH.helpText: own single key. No change.

Landing differs from the claim's file surface (one file added)

The claim named the extractor, its tests and one changeset. The change makes the showcase example's contact.lead_score field (it authors inlineHelpText) owe a zh-CN help, so pnpm check:i18n-coverage went red (320 to 321 untranslated declared strings). Fixed by translating it in examples/app-showcase/src/system/translations/index.ts (one zh-CN help string), not by raising the baseline. Gate green again at 320.

Tests

New packages/cli/test/i18n-extract-inline-help-text.test.ts (6 cases): inlineHelpText emitted as the inline text; source order help, inlineHelpText, description; inlineHelpText-only field plus an en bundle with help leaves the default locale unreported; a non-default locale missing help is still reported; description-only case unchanged; no-inline-source case unchanged.

  • Fix commit fc0e06c: 6/6 pass.
  • Ablation on the committed fix (anchor replaced back to field.help ?? field.description through scripts/ablation-replace.mjs, anchor 1 to 0, blob changed): 3 of 6 fail (the inline emission, source-order and default-locale cases), then restored, blob equal to HEAD and git diff HEAD empty. The tests import ../src, so no rebuild leg applies.
  • pnpm --filter @objectstack/cli exec 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.

Gates (local subset, final head 8c1cdf8)

All 72 derived families run and reconciled with dispatch-gates --ran (72 derived, 72 run, 0 NOT-MEASURED). Every one exits 0 on the final tree after prerequisite builds, except check:dual-build-cjs-loads: exit 3, PREREQUISITE NOT MET (needs a full pnpm build), NOT MEASURED locally; CI runs it. Scoped eslint over the touched files: exit 0.

Acceptance

hotsrm's case (inlineHelpText plus an en help, no zh-CN entry) passes the strict coverage check: pinned by the third test case. hotsrm can drop its temporary zh-CN bundle.


Generated by Claude Code

…urce of a field's help key

Claude-Session: https://claude.ai/code/session_01R1q2xdtYgU6FKrZ7LgjPCC
Co-authored-by: Claude <noreply@anthropic.com>
…nce inlineHelpText seeds the default-locale help

Claude-Session: https://claude.ai/code/session_01R1q2xdtYgU6FKrZ7LgjPCC
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 31 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json f6ba1343ba41cb173baadfc36e6069123d3f2cfd → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 7b00fbb692ab82f72c1cdb11be9c50630a8006f4 — the merge of head 8c1cdf8bfb29788cd9f83727ef7b7caf93180f9f into base f6ba1343ba41cb173baadfc36e6069123d3f2cfd, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 7b00fbb692ab82f72c1cdb11be9c50630a8006f4 && git checkout 7b00fbb692ab82f72c1cdb11be9c50630a8006f4
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f6ba1343ba41cb173baadfc36e6069123d3f2cfd 8c1cdf8bfb29788cd9f83727ef7b7caf93180f9f && git checkout -B drift-repro f6ba1343ba41cb173baadfc36e6069123d3f2cfd && git merge --no-ff 8c1cdf8bfb29788cd9f83727ef7b7caf93180f9f

node scripts/docs-audit/affected-docs.mjs --json f6ba1343ba41cb173baadfc36e6069123d3f2cfd

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-25T00:03Z

Head 8c1cdf8bfb, report 6391178944, claim 6390644400.

item reading
Shape draft, base main, first body line Fixes #25683; Clause-②: no and Metadata-protocol: none line-initial in the body and the changeset.
Premise, measured origin/main reads field.help ?? field.description at the help key; the diff makes it field.help ?? field.inlineHelpText ?? field.description, the triage route 6387595193 verbatim.
Files (4, +85/−2) packages/cli/src/utils/i18n-extract.ts, a new unit test, the changeset 25683-inline-help-default-locale.md (@objectstack/cli patch), and examples/app-showcase/src/system/translations/index.ts. The last is outside the claim's surface: it is the fix's own consequence (showcase contact.lead_score authors inlineHelpText, so check:i18n-coverage gained one expected key) and the report declares it. The package is private: true, so it owes no changeset.
Changeset sentence check it states the old source (help then description), the new order, and that a non-default locale without help stays a gap; each matches the diff.
Tests six cases: inline emission, source order, default locale not reported, non-default still reported, description-only and no-source cases unchanged. Ablation reported: three of six turn red with the fix removed, restored to HEAD.
Gates dev union at 8c1cdf8b = this head: 72 derived, 71 exit 0, check:dual-build-cjs-loads exit 3 declared NOT MEASURED. Not governed (check-governed-merges --pr 25720), 87 changed lines. CI at this act: 14 success, 7 opt-in skipped, 17 in progress, 0 failed. Lint & Repo Gates and Type Check are owed success before ready.
Accepted deviation the example translation string, above.
Out of scope the field.help leg reads a key FieldSchema refuses on a field: kept because the ruling names it; Acceptance note, not filed (no class reach).
Landing ready + auto-merge through the relay once every check on this head is green or an expected skip.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 25, 2026 00:25
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 25, 2026 00:26
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 25, 2026
Merged via the queue into main with commit 1252db9 Oct 25, 2026
42 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-25683-inline-help-default-locale branch October 25, 2026 00:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

2 participants