Skip to content

spec: every repeater item schema except dashboard header.actions still has no JSON Schema title, so 21 property-panel tables render machine keys in every locale #17232

Description

@os-bill

Found while landing #16458 (PR #17227), which fixed exactly one instance of this shape and was
scoped by dispatch to that one instance only.

The defect

Studio's property panel renders a type: 'repeater' field as a table whose column headers read
items.properties[k].title ?? k from the JSON Schema derived by z.toJSONSchema(...). When no
item-schema field carries a title, the fallback arm runs — and it runs for every locale,
English included, so the maker sees raw machine keys (actionUrl, defaultCollapsed, ...) inside
an otherwise fully translated panel. This is not a translation gap; it is a missing authoring label
in the contract, and #16458's triage refused the i18n route by name.

Measured on origin/main

22 repeater fields are declared across 11 *.form.ts files in four domains:

packages/spec/src/ai/skill.form.ts          1
packages/spec/src/automation/flow.form.ts   3
packages/spec/src/data/field.form.ts        1
packages/spec/src/data/object.form.ts       1
packages/spec/src/ui/action.form.ts         2
packages/spec/src/ui/app.form.ts            1
packages/spec/src/ui/dashboard.form.ts      3
packages/spec/src/ui/dataset.form.ts        2
packages/spec/src/ui/page.form.ts           3
packages/spec/src/ui/report.form.ts         2
packages/spec/src/ui/view.form.ts           3

Only one of them — dashboard.header.actions — now has titled row properties, landed by
PR #17227. Across packages/spec/src/**/*.zod.ts there are 37 .meta({ title occurrences, and
every one is either a driver-config schema or one of the four that PR added:

packages/spec/src/data/driver/*.zod.ts        32
packages/spec/src/system/translation.zod.ts    1
packages/spec/src/ui/dashboard.zod.ts          4   (added by #17227)

Spot control: git grep -nP 'meta\(\{ title' packages/spec/src/ui/view.zod.ts packages/spec/src/ui/dataset.zod.ts returns nothing, so view.columns, dataset.dimensions and
dataset.measures all render machine keys today.

The mechanism already exists — this is application, not design

#16458 ruled mechanism A and PR #17227 built both halves of it, so a follow-up needs no new
contract decision:

  • author .meta({ title }) on the Zod item schema (the English name);
  • resolveMetadataFormSchemaTitles (@objectstack/spec/system, new in feat(spec): item-level property names for the dashboard header-action repeater #17227) overlays a bundle's
    metadataForms.TYPE.fields.PATH.label onto the derived JSON Schema, addressing a repeater row
    property as REPEATER.PROPERTY;
  • enumerate the repeater's children in its *.form.ts so os i18n extract emits the catalog keys;
  • the mechanism is written up in content/docs/protocol/kernel/i18n-standard.mdx.

packages/platform-objects/src/apps/translations/dashboard-header-children.test.ts is the pin
shape to copy.

Suggested handling

Worth splitting per domain rather than one sweeping PR — each domain's item schemas need real
authoring names chosen, plus translated catalog leaves in zh-CN / ja-JP / es-ES, which is
copy work rather than mechanical work.

承接者: the domain:spec lane, as the downstream half of objectui#8218's property-panel
de-developerization — the same effort that filed #16458. Whoever picks up the next slice of #8218
lands on these files.

Back-links: #16458, PR #17227, objectui#8218.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions