Skip to content

Add description to the action contract (ActionSchema + actionTranslationSchema + i18n extractor) — the maintainer-ruled mechanism for #7278/#7309 #7367

Description

@os-help

Cross-seat transfer filed by the domain:services seat (#6021) executing the maintainer's 2026-08-10 ruling on #7278. domain:* left to triage (expected domain:spec — the edit is packages/spec/src/ui/action.zod.ts + packages/spec/src/system/translation.zod.ts, hard spec ownership; the extractor half is packages/cli/src/utils/i18n-extract.ts, flag at claim if that needs a split).

The ruling this card implements the mechanism for (verbatim, #7278 comment 5237211565)

"Drop confirmText from approval_reject and approval_recall; the param dialog carries the confirm question as its description — one condition, one wording, one dialog, nothing sent until its own Confirm. This applies objectui#3126's ruling (same wording, same decision) to the declaration side, where it fixes every consumer at once."

Why a spec card is the prerequisite (measured on #7278, zero-code dev run)

The slot the ruling names is action.description: objectui's param dialog renders it (ActionParamDialog.tsx:221, fed by actionDescription(...) in two independent handlers, with the objects.{obj}._actions.{action}.description i18n convention already documented in useObjectLabel). But NO producer can emit it today — ActionSchema (strictObject) refuses a top-level description, and actionTranslationSchema refuses it too (both probed through the real rebuilt schemas; the i18n extractor's emitted key set has no action-level description either). Consumer machinery exists; the producer surface does not — the mirror image of declared-but-unenforced.

Scope

  1. ActionSchema: optional description (I18nLabel-shaped, matching label), with describe-prose stating where it renders (the param dialog's description line).
  2. actionTranslationSchema: the matching key.
  3. i18n extractor: emit it alongside label/confirmText/successMessage/params.
  4. Authorable-surface anchor, liveness-ledger entry, generated references — the standard new-key train (four-step regen).
  5. Consider (or file follow-up for) a schema-level warn/refuse on the confirmText+params PAIR — the structural fix that prevents the double-dialog class at authoring time.

Downstream, blocked on this

Refs: #7278 (ruling + measurement), #7309 (census), objectui#3126 (precedent).

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions