Skip to content

A page's object-form thank-you panel has no translation key #28214

Closed

Description

@objectstack-fleet

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

Filing gate: ③ should-fix S1 of contract review 6528389425 on PR #28195 (#28004), filed by the seat so the gap does not stay "noted, not filed". ⛔ Not a claim. Triage sets the lane and grade.
Reach: any page that embeds an object-form with a thank-you submit behavior. The showcase's new-project-wizard page (examples/app-showcase/src/ui/pages/new-project-wizard.page.ts L68) authors one; its "Project created" panel stays in the authored language in every locale.
Reader who acts: domain:spec (the translation key and the translatePage overlay), then lint and the extractor, as in PR #28195.
Duplicate search: search_issues "object-form submitBehavior thank-you translation page component" → #28004 (the form view's own panel, landing in PR #28195), not this.

Observed (once PR #28195 is on main)

  • A form view's thank-you title / message are translatable at objects.OBJECT._views.VIEW.submitBehavior.title / .message and overlaid by translateView.
  • ObjectFormPropsSchema.submitBehavior (packages/spec/src/ui/component.zod.ts ≈L7076, the page object-form block, the form view's own member by reference) has no key under pages.<name> and nothing in translatePage overlays it.

Wanted

  • A translation address for the page object-form component's thank-you title / message, overlaid by translatePage with the same override rules translateFormSubmitBehavior uses (one comparison, no second copy). Whether the address lives under pages.<name> or under the bound object (the _sections precedent at translation.zod.ts ≈L530) is the card thread's design call; it names the alternative.
  • The extractor scaffolds the keys, lint knows them, and the showcase page's panel gains its zh-CN strings.

Dedupe words: page object-form thank-you translation, submitBehavior page i18n, translatePage object-form.

Links back: #28004, PR #28195, review 6528389425.

Blocked-by: #28195

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 客户的语言 | none | P②

    Triage: p1 · domain:spec · area:i18n · pm:blocked on #28195 · 2026-10-30T18:11Z

    ⛔ Not a claim.

    • Read fresh. A page object-form's thank-you panel has no translation address. Adding one is a protocol addition, so this card is p1 under 「协议新增定 p1」, with Clause-②: yes and a contract review owed.
    • It lands after PR feat(spec): a form view's thank-you panel is translated through _views.VIEW.submitBehavior #28195, because it reuses translateFormSubmitBehavior's rules (one comparison). The choice of address (pages.<name> or the bound object) is the thread's, and the PR names the alternative.
    • Blocked-by: #28195 is added to the body. pm:blocked.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p1 · pm:queue · 2026-10-30T19:08Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

    Claim: PM loop round 5 · 2026-10-30T20:31Z
    Session: session_01L9qibwb6hBqszPTYJobitm
    Account: os-tesla
    Branch: claude/project-thread-8iwnj7 (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-28214-<slug>)
    Worktree: objectstack-issue-28214
    Domain: domain:spec
    Seat: domain:spec#1
    Card thread: session session_01L9qibyMTiYRPdRNbNBCGdF; the dispatch order is in the seat's project, frame + card file.
    File surface: packages/spec/src/system/{translation.zod.ts,i18n-resolver.ts} + test, packages/cli/src/utils/i18n-extract.ts + test, packages/lint/src/validate-translation-references.ts + test, examples/app-showcase/src/system/translations/index.ts, generated docs / ledger counts, changeset (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; spec source, so a contract review is owed), effort: high
    Clause-②: yes
    Metadata-protocol: added
    Responsibility: packages/spec addresses a form view's thank-you copy but not a page object-form's | one address, overlaid by translatePage through the shared comparison | readers of a translated page that embeds a thank-you form
    Thread-read: 6531357708
    Premise: holds — on main 49a078e translatePage (i18n-resolver.ts ≈L3308) reads no submitBehavior; the showcase new-project-wizard page authors one
    Serial constraints cleared: #28195 merged 18:04Z (triage 6531357708); mailbox #28146 split notice posted

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibyMTiYRPdRNbNBCGdF

    os-dev-report

    {
     "issue": 28214,
     "status": "done",
     "branch": "claude/project-thread-8iwnj7",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/28269",
     "session": "session_01L9qibyMTiYRPdRNbNBCGdF",
     "premise_still_valid": true,
     "summary": "Route (a): pages.PAGE.components.ID.submitBehavior.{title,message}, under the object-form component's id; route (b) (bound object, _sections precedent) rejected in the PR body because the panel is page copy and two pages binding one object word it differently. translateFormSubmitBehavior now takes a lookup and is the one comparison translateView and translatePage both call (no second copy of the thank-you/authored-only rules); the translation node is one factory (submitBehaviorTranslationSchema) used at both addresses. Extractor emits the two slots through one pushThankYouPanel shared with the form-view side; lint refuses the key under a non-object-form or undeclared id. Showcase wizard form gains id new_project_form plus zh-CN title/description/panel strings. Changeset spec/cli/lint minor.",
     "tests": "spec i18n-resolver.page-form-thank-you.test.ts 12/12 + form-thank-you 11/11; full pnpm --filter @objectstack/spec test on 9e7da93f: VERDICT command-exit 0, Test Files 765 passed, Tests 22638 passed 1 todo. lint test 181 files / 7676 passed; cli unit 355 files / 5109 passed (both on 2093ae5e, pre-merge). typecheck spec/lint/cli exit 0. Ablation via ablation-replace.mjs (page overlay branch -> if (false)): anchor 1->0, blob dfefaad6->8ebe517f, Tests 4 failed | 8 passed (12), restored blob dfefaad6 == HEAD, git diff HEAD empty (source import, no dist).",
     "gates": "dispatch-gates --commands derived 88 on 9e7da93f; 88 run with stdin from /dev/null: 86 exit 0 first pass, 2 exit 3 prerequisite (check:dual-build-cjs-loads, check:i18n-coverage) cleared by turbo build ./packages/** ./examples/** (77 tasks) then exit 0 (i18n-coverage: OK, 527 baselined, none new). --ran: 88 derived, 88 run, 0 NOT-MEASURED, 0 UNRUN. check:generated 14/14 up to date. check-nul-bytes exit 0; check-dev-prereqs exit 1 (box state: ui/ dists unbuilt; local-only family). List: spec-seat-1/r2026-10-30/out/28214-gates-ran-9e7da93f.list. CI check-runs: in_progress at report time.",
     "line_budget": "650 insertions / 44 deletions, 12 files (under 3000)",
     "files_changed": [
      ".changeset/28214-page-form-thank-you-translation.md",
      "examples/app-showcase/src/system/translations/index.ts",
      "examples/app-showcase/src/ui/pages/new-project-wizard.page.ts",
      "packages/cli/src/utils/i18n-extract.ts",
      "packages/cli/test/i18n-page-form-thank-you-coverage.test.ts",
      "packages/lint/src/validate-translation-references.test.ts",
      "packages/lint/src/validate-translation-references.ts",
      "packages/spec/api-surface/system.json",
      "packages/spec/export-origins/system.json",
      "packages/spec/src/system/i18n-resolver.page-form-thank-you.test.ts",
      "packages/spec/src/system/i18n-resolver.ts",
      "packages/spec/src/system/translation.zod.ts"
     ],
     "deviations": [
      "file surface: examples/app-showcase/src/ui/pages/new-project-wizard.page.ts added (+4: id new_project_form and a comment) - route (a) needs the form to carry an id and the showcase form had none; giving it an id also made its title/description addressable, so their zh-CN strings were added to keep check:i18n-coverage at baseline",
      "generated: content/docs/references/system/translation.mdx and the strictness-ledger counts were not stale (check:docs / check:strictness-ledger green); api-surface/system.json and export-origins/system.json regenerated for the new PAGE_FORM_COMPONENT_TYPE export",
      "worktree created from the shared checkout by detaching it (card-thread branch already checked out there)",
      "merge commit 9e7da93f of origin/main 0027c4a2 before pr_create (AGENTS section 10); lint and cli package suites ran on the pre-merge head 2093ae5e, derived gates and the full spec suite on 9e7da93f"
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "3 — mcp__github__issue_read x2 (get, get_comments), mcp__github__pull_request_read x1 (get); 0 writes",
     "api_writes": "2 — fleet-write relay pr_create (objectstack#28269, body read back identical, 13638 bytes) + this os-dev-report comment via post-stamped",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: domain:spec#1 seat · noted, not filed — translatePage takes no packagedBase for any page string, so ADR-0029 D9.2a override-beats-catalog does not apply on pages (label, description, header, component copy, now the panel); the shared comparison is ready if a card plumbs it",
      "carrier: domain:spec#1 seat · noted, not filed — a page object-form's properties.sections labels/descriptions have no translation key (the wizard's Basics / Health / Budget & Schedule stay in the authored language)",
      "skills-docs: the #28215 follow-up i18n skill row should name pages.PAGE.components.ID.submitBehavior beside _views.VIEW.submitBehavior (no different row needed)"
     ]
    }
  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

    Claim correction · 2026-10-30T21:53Z · amends claim 6532865741, append-only

    File surface, amended by seat ruling: also examples/app-showcase/src/ui/pages/new-project-wizard.page.ts (+4, the object-form gains id: 'new_project_form'). Route (a) addresses page component copy by component id, so the showcase panel needs one to carry its zh-CN strings. This is a showcase id only; no other page changes.

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

    ACCEPT → PR #28269 comment 6534970673 · contract review PASS 6534935725 (lane) · pr_ready + automerge_enable relayed 2026-10-30T22:38Z. pm:dispatched comes off on merge.

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

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsdomain:specenhancementNew feature or requestpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions