Skip to content

docs(i18n): the translations guide lists the bulkActions and datasets groups (#15435) - #15772

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-15435-translations-guide-bulkactions-datasets
Sep 5, 2026
Merged

docs(i18n): the translations guide lists the bulkActions and datasets groups (#15435)#15772
baozhoutao merged 1 commit into
mainfrom
claude/issue-15435-translations-guide-bulkactions-datasets

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Fixes #15435

content/docs/ui/translations.mdx carries the page's inventory of the bundle surface,
the "What you can translate" table. It omitted two groups that shipped live in 17.3.0
(#14253) — and the word dataset did not occur on the page at all, so the datasets
group had no concept to hang a row on.

The key shapes, read from the schema on this branch's base

Both groups are declared in packages/spec/src/system/translation.zod.ts:

  • :206objects.OBJECT._views.VIEW.bulkActions.DEF.*
  • :281bulkActions: z.record(z.string(), strictObject({ — declaring label,
    confirmText, confirmLabel, and params (:327), whose members declare
    label / help / placeholder
  • :734-:737 — the datasets convention, verbatim:
    datasets.NAME.label, datasets.NAME.description,
    datasets.NAME.dimensions.DIM.label,
    datasets.NAME.measures.MEASURE.label
  • :770datasets: z.record(z.string(), strictObject({

Every key written is one a reader actually reads

Not declared-only — each is quoted at its reading site in
packages/spec/src/system/i18n-resolver.ts:

Key Read at
bulkActions.DEF.label / .confirmText / .confirmLabel :750 function translateBulkActionDefs, called from translateView at :852 against config.bulkActionDefs
bulkActions.DEF.params.PARAM.label / .help / .placeholder same function — the per-param branch overlays all three onto def.params[]
datasets.NAME.label / .description :1282 translateDataset via lookupDatasetAttr
datasets.NAME.dimensions.DIM.label / .measures.MEASURE.label :1231 translateDatasetMembers via lookupDatasetMemberLabel

params was checked specifically, because a declared-but-unread sub-key would have had to
be left out or marked declared-only. It is read: the param branch of
translateBulkActionDefs resolves label, help and placeholder per param name and
overlays them. Nothing in either group is declared-only.

os i18n extract produces exactly these keys — packages/cli/src/utils/i18n-extract.ts:332
pushBulkActionDefs and :1293 walkDatasets, both listed in that file's own key
inventory at :37-:40 and :58-:60. Neither group is behind the liveness gate that
holds flows back (:68, authorWarnedTranslationGroups), so os lint coverage reports
both.

Liveness: packages/spec/liveness/translation.json:57 records datasets as
"status": "live", "verifiedAt": "2026-09-02", and the file header records it as
"seeded LIVE and DRILLED by #14253 with its reader (translateDataset) in the same
change"
. bulkActions has no ledger row of its own by design — it sits under objects,
below the boundary that header states ("every group is a z.record keyed by target names
— the drill sees each record's VALUE shape one level; the deeper per-key conventions … are
governed by the resolvers cited per row, not by ledger rows"
), so its liveness evidence is
the resolver and extractor quoted above.

What changed on the page

Three table rows, in the existing row style and placed beside the surfaces they belong to
(bulk actions after the view row; datasets after the dashboard-widget row, mirroring how
dashboards already takes two rows — one for label/description, one for its members):

  • objects.NAME._views.VIEW.bulkActions.DEF.label / .confirmText / .confirmLabel / .params.PARAM.label / .help / .placeholder
  • datasets.NAME.label / description
  • datasets.NAME.dimensions.DIM.label / datasets.NAME.measures.MEASURE.label

The def key is spelled DEF rather than NAME, because NAME is already the object
in that same path; DEF is also how the extractor's own inventory spells it. The row
carries one trailing clause naming the help / helpText divergence, in the style the
flows row already uses for its trailing note — a bulk param declares help, an action
param declares helpText, and the schema calls that out as a known divergence at :276.

One Callout type="info" for datasets, since the page introduced no dataset concept
anywhere: why the group is top-level rather than nested under dashboards (one definition
that N widgets across M dashboards bind to by reference), and that label is the only copy
below the dataset — description belongs to the dataset itself, which is why writing one
on a dimension or measure is rejected.

One line beyond the two rows, called out for review

The paragraph directly under the table read "The metadata types resolved per request are
object, view, action, app, dashboard, and page"
— six of the seven entries in
METADATA_DOCUMENT_TRANSLATORS (i18n-resolver.ts:929-:939), which has carried
dataset: translateDataset (:938) since 17.3.0; TRANSLATABLE_METADATA_TYPES is derived
from that table at :946. This is the same omission as the table's, one paragraph down, and
adding a dataset row while the next sentence excludes dataset from the resolved types would
have shipped a self-contradicting page. Added the one word. Flagging it because it is the
only edit outside the table and the callout.

⛔ The _validations row is untouched — confirmed present on this branch's base at
translations.mdx:72 before any edit, and it stays exactly as #14402 landed it.
#14402 is not addressed here. No file under packages/ or content/docs/releases/ is touched.

Verification

Grep controls on the page, base → HEAD:

Control Base ef60224fc HEAD
grep -c 'bulkActions' content/docs/ui/translations.mdx 0 (exit 1) 1 (exit 0)
grep -c -i 'dataset' content/docs/ui/translations.mdx 0 (exit 1) 9 (exit 0)
positive control — grep -c 'bulkActions' packages/spec/src/system/translation.zod.ts 6 (exit 0) unchanged
positive control — grep -c -i 'dataset' packages/spec/src/system/translation.zod.ts 41 (exit 0) unchanged

Both zeros were real absences, not a broken pattern — the same pattern fires on the schema file.

Gate family derived, not recalled:
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack
→ exit 0, 38 commands, derived at commit 4405a8b4d against merge base ef60224fc.
All 38 run; exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?).

37 of the 38 measured green; the one remaining is the NOT MEASURED entry below, which is not a red. Includes check:doc-authoring, check:doc-frontmatter,
check:docs-section-name, check:docs-single-h1, check:doc-anchors,
check:docs-redirects, check:docs-audit-scope, check:docs-transcript-drift,
check:section-landing-index, check:doc-route-spelling, check:nul-bytes,
and the @objectstack/lint / @objectstack/spec doc families.

Four gates hit a build prerequisite on first run and were re-run after building through the
shared verify lock (OS_VERIFY_LOCK_SLOT=issue-15435, two locked runs, verdicts verbatim:
VERDICT command-exit 0 · held the lock 172s (2m52s) · waited 0s and
VERDICT command-exit 0 · held the lock 384s (6m24s) · waited 120s (2m00s)):
check:docs-transcript-drift (needed packages/lint/dist, as predicted), and the
@objectstack/lint / @objectstack/spec families needing @objectstack/formula,
@objectstack/spec and @objectstack/client-react built. All four green on re-run —
check:skill-examples last, at ✅ 257 prose examples type-check across 3 surface(s).

NOT MEASURED, by name:

  • pnpm --filter @objectstack/spec run check:docs — exit 1, PREREQUISITE NOT MET:
    "packages/spec/json-schema is missing … it is a gitignored build artifact". Not run
    because regenerating it would rewrite a tracked baseline inside a docs-only PR. Nothing
    was measured; this is not a finding. CI builds and runs it.
  • The three families whose argv takes a value from the workflow and has none outside a CI run,
    as the derivation printed them: check-cross-package-test-inputs.mjs --union-into "$RUNNER_TEMP/…",
    check-shard-attestation.mjs --shard ${{ matrix.shard }}, and
    check-test-completeness.mjs "$RUNNER_TEMP/test-core.log".

Governed-surface predicate, re-run on the final file list:
node scripts/pm/check-governed-merges.mjs --test content/docs/ui/translations.mdx → exit 0,
"✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list."

Control-character self-scan beyond the gate:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' content/docs/ui/translations.mdx → exit 1, clean.

Changeset: none, skip-changeset applied. content/ sits at the repo root and matches no
glob in pnpm-workspace.yaml, and the root package is private: true — so this diff
publishes nothing from any released package, which is exactly what AGENTS.md reserves the
label for.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…ons guide

The "What you can translate" table is this page's inventory of the bundle
surface, and it omitted two groups that shipped live in 17.3.0 (#14253):
`objects.<name>._views.<view>.bulkActions.<def>.*` and `datasets.<name>.*`.
The word `dataset` did not occur on the page at all. Both are declared in
`packages/spec/src/system/translation.zod.ts`, read by `translateView`
(via `translateBulkActionDefs` against `config.bulkActionDefs`) and by
`translateDataset`, and emitted by `os i18n extract` — so an author scanning
the inventory concluded two live surfaces were not translatable.

Adds one bulk-action row, two dataset rows, and the short callout the
`datasets` group needs (the page introduced no dataset concept anywhere).
Also names `dataset` in the resolved-metadata-types sentence, which listed
six of the seven entries in `METADATA_DOCUMENT_TRANSLATORS` — the same
omission, one paragraph down from the table.

The `_validations` row is untouched; it landed with #14402.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@github-actions github-actions Bot added the size/s label Sep 5, 2026
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 5, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 5, 2026
@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — PR #15772 (head 4405a8b4d, content/docs/ui/translations.mdx +21/−2) reviewed against the GitHub three-dot diff, not the report.

Docs-only, as ruled: three table rows (bulkActions copy incl. per-param label / help / placeholder, which the resolver's per-param branch really overlays — so params is live and documented without a caveat; datasets.<name>.label / description; dimension and measure labels) in the page's row style, one Callout introducing the dataset group (the page had no dataset section), and the one edit outside the letter — adding dataset to the resolved-metadata-types sentence — accepted as in-scope: shipping a dataset row while that sentence excluded dataset would have made the page contradict itself, and dataset: translateDataset is in METADATA_DOCUMENT_TRANSLATORS (i18n-resolver.ts:938).

Measured by this seat: branch blob greps bulkActions = 1, dataset (ci) = 9 (main: 0 / 0); schema anchors on main translation.zod.ts:206 (objects.<object>._views.<view_name>.bulkActions.<def_name>.*), :281 (bulkActions: z.record(…)); readers translateBulkActionDefs i18n-resolver.ts:750, translateDataset :1282, dataset: translateDataset :938; git merge-tree --write-tree origin/main <branch> → EXIT=0; governed test per the report NOT governed. NOT MEASURED here: check:docs (gitignored packages/spec/json-schema prerequisite, as the dev reported) and the docs build.

bulkActions having no liveness-ledger row is by design (under objects, below the ledger's walk boundary) — the PR body quotes the header clause. Dev-filed #15775 (liveness/translation.json header count) is domain:spec's.

Flip + arm when both required jobs report success on 4405a8b4d. On landing #15435 closes.


Generated by Claude Code

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Flipped ready + auto-merge enabled (07:32Z, method: MERGE). Required jobs on 4405a8b4d: Lint & Repo Gates = success, TypeScript Type Check = success; git merge-tree --write-tree origin/main <branch> → EXIT=0 against the current main. Watched; on landing #15435 closes.


Generated by Claude Code

@baozhoutao
baozhoutao added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit 5315098 Sep 5, 2026
43 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-15435-translations-guide-bulkactions-datasets branch September 5, 2026 08:10
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 skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(i18n): the translations guide's "What you can translate" table omits the bulkActions and datasets groups that shipped live in 17.3.0

2 participants