Skip to content

Form view thank-you title and message have no translation key, so a public form's confirmation stays in the authoring language #28004

Closed

Description

@objectstack-fleet

domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

Filing gate: ③ triage-directed. The order on #27398 (rows 2–3) said: take what is ui-only, card the rest. The card thread read the code on current main (report 6517203519, out_of_scope_findings). Row 2 is taken in PR #28003.
Reach: any public form read in another language. The heading and field labels are translated, but the thank-you panel is not (#27398 row 3).
Reader who acts: domain:spec.
Duplicate search: search_issues "form submitBehavior thank-you message translation or record number interpolation public form" → #27417 and #7441, both closed and about other gaps.

Observed

A form view's submitBehavior thank-you member carries title and message as plain strings. The bundle's objects.OBJECT._views.VIEW entry (TranslationItemSchema, strict) declares label, description, title, emptyState and bulkActions, with no submitBehavior copy. translateView overlays only bulkActionDefs, sections and title.

Wanted

Declare the thank-you title and message on the _views entry and overlay them in translateView (packages/spec/src/system/translation.zod.ts, packages/spec/src/system/i18n-resolver.ts), with the translation lint/coverage that reads _views. No ui change is needed: the public door GET /api/v1/forms/SLUG already serves the translated view config under Accept-Language, and the console form page reads form.submitBehavior from it.

Dedupe words: submitBehavior translation, thank-you title translate, _views submitBehavior, public form confirmation locale.

Related: #27398 (row 3).


Generated by Claude Code

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 30, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

    Claim: PM loop round 2
    Session: session_01L9qibx5r5nhDMwpRs4SL6D
    Account: os-tesla
    Branch: claude/project-thread-dlxqz6 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28004
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/system/translation.zod.ts (the _views entry gains the thank-you title / message), packages/spec/src/system/i18n-resolver.ts (translateView overlays them), the _views translation lint/coverage reader (named in the report), tests, regenerated artefacts, changesets. The ui half is a follow-up domain:ui card the seat files when the key lands; ⛔ no ui/** and no governed path (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (Clause-②: yes ⇒ default judgment tier to build; the contract review at CONTRACT_REVIEW_TIER is the seat's own, on the maintainer's 「你有 fable,可以自己契约复审」), effort: high
    Clause-②: yes
    Metadata-protocol: added
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds (re-read at origin/main 9f13ee81; the declaration named on the card still lacks the key)
    Serial constraints cleared: none (no open PR touches translation.zod.ts or i18n-resolver.ts)
    Ruling-ref: none on the shape; dispatch authority = the maintainer's 「p3 也可以开发」 (2026-10-30T12:41Z) and 「每个座位并发可以5」 (2026-10-30T15:04Z); the card's filing gate ③ (triage-directed)

    Dispatched 2026-10-30T15:11Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

    Claim amendment · file surface · #28004 · 2026-10-30T15:15Z

    Amends claim 6526132447 (same session, same branch claude/project-thread-dlxqz6). The card thread named the _views readers: packages/cli/src/utils/i18n-extract.ts (the extractor emits the thank-you title / message) and packages/lint/src/validate-translation-references.ts (form-only tail). It also adds the four zh-CN strings the showcase's two thank-you panels now owe in examples/app-showcase/src/system/translations/index.ts, so check:i18n-coverage does not rise. All three are in the surface; no ui/**, no governed path.

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-tesla · session_01L9qibxqJVde7kDCjJSHEUo
    os-dev-report

    {
     "issue": 28004,
     "status": "done",
     "branch": "claude/project-thread-dlxqz6",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/28195",
     "session": "session_01L9qibxqJVde7kDCjJSHEUo",
     "premise_still_valid": true,
     "summary": "The strict _views translation entry gains submitBehavior.{title,message}, and translateView overlays them onto a served form's config.submitBehavior when its kind is thank-you (authored copy only, missing key keeps the authored string, ADR-0029 D9.2a override per string). The CLI extractor (pushFormViewCopy) scaffolds the two keys for every container form and form item, and the lint accepts them on form views only (FORM_ONLY_VIEW_TAILS). Public door verified: packages/rest/src/form-routes.ts:353 runs translateMetadataDocument('view', match.view, …) in GET /api/v1/forms/SLUG and :357 serves view.config as form. Showcase zh-CN gains its two panels' four strings (surface amended by the seat).",
     "tests": "head af93f347: spec i18n-resolver.form-thank-you.test.ts 11/11 (new); spec full test 756 files / 22530 passed (on 1fb17014, af93f347 only added the two schema-face cases); lint full test 178 files / 7647 passed (+3 new); cli --project unit 352/354 files, 5072 passed, the 2 failures were published-subpath-{console,hook-body}.pin refusing an unbuilt packages/cli, both green after pnpm --filter @objectstack/cli build (4 files / 39 tests incl. the new i18n-form-thank-you-coverage 5 cases and the narrowed i18n-form-title-coverage); typecheck spec/lint/cli exit 0. No ablation: behaviour pins are new, not a changed tested behaviour.",
     "gates": "dispatch-gates --ran 28004-gates-ran-af93f347.list: 108 derived, 107 run exit 0, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads exit 3, needs every package built; CI Lint & Repo Gates runs it), 0 unrun. Re-runs after a spec rebuild on af93f347: check:api-surface/dual-source-exports/entry-nameability/exported-any/generated/skill-examples exit 0; changeset gates exit 0; check-plugin-teardown-shape --self-test exit 0 after fetching control 621a4876; check:i18n-coverage exit 0 'OK (14 config(s), 527 baselined, none new)'. PR check-runs: in_progress at report time.",
     "line_budget": "598 additions / 39 deletions across 12 files (dispatch-gates count 617 changed lines at 1fb17014), under the 3000 human-merge threshold; no skills/** touched",
     "deviations": [
      "files_changed outside the dispatch's named list: packages/cli/src/utils/i18n-extract.ts (the extractor), packages/lint/src/validate-translation-references.ts (the lint), examples/app-showcase/src/system/translations/index.ts (4 zh-CN strings); all three added to the claim's surface by the seat's amendment",
      "packages/cli/test/i18n-form-title-coverage.test.ts path filter narrowed, since its endsWith('.title') filter now also matched the new submitBehavior.title slot",
      "the derived-gate loop ran across 1fb17014..af93f347 (one test file + changeset wording in between); every gate reading those files was re-run on af93f347"
     ],
     "files_changed": [
      ".changeset/28004-form-thank-you-translation.md",
      "content/docs/references/system/translation.mdx",
      "docs/audits/2026-07-unknown-key-strictness-ledger.counts/system.md",
      "examples/app-showcase/src/system/translations/index.ts",
      "packages/cli/src/utils/i18n-extract.ts",
      "packages/cli/test/i18n-form-thank-you-coverage.test.ts",
      "packages/cli/test/i18n-form-title-coverage.test.ts",
      "packages/lint/src/validate-translation-references.test.ts",
      "packages/lint/src/validate-translation-references.ts",
      "packages/spec/src/system/i18n-resolver.form-thank-you.test.ts",
      "packages/spec/src/system/i18n-resolver.ts",
      "packages/spec/src/system/translation.zod.ts"
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2); 0 writes",
     "api_writes": "2 — relay pr_create (run 41088245575, PR #28195); post-stamped comment on #28004 (this report)",
     "decision_for_maintainer": "Shape taken: nested _views.VIEW.submitBehavior.{title,message}, mirroring the authored path, as emptyState is nested. Not taken: flat thankYouTitle/thankYouMessage on the view node, which invents names the authoring schema lacks and puts a second heading beside the form's own title key.",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: the seat · the ui follow-up domain:ui card the order reserves; on the read in the PR body the console FormPage already draws loaded.form.submitBehavior title/message (FormPage.tsx:2577, :2957-2958), so it may be verification-only",
      "carrier: the seat · Skills-docs follow-up owed: skills/objectstack-i18n/SKILL.md _views row lacks submitBehavior.title/.message",
      "carrier: none · noted, not filed: ObjectFormPropsSchema.submitBehavior (a page object-form component's thank-you block) has no translation key in this change; no reach measured"
     ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions