You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Form view thank-you title and message have no translation key, so a public form's confirmation stays in the authoring language #28004
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.
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/main9f13ee81; 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.
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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D
Claim: PM loop round 2
Session:
session_01L9qibx5r5nhDMwpRs4SL6DAccount:
os-teslaBranch:
claude/project-thread-dlxqz6(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28004Domain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/system/translation.zod.ts(the_viewsentry gains the thank-youtitle/message),packages/spec/src/system/i18n-resolver.ts(translateViewoverlays them), the_viewstranslation lint/coverage reader (named in the report), tests, regenerated artefacts, changesets. The ui half is a follow-updomain:uicard the seat files when the key lands; ⛔ noui/**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 atCONTRACT_REVIEW_TIERis the seat's own, on the maintainer's 「你有 fable,可以自己契约复审」),effort: highClause-②: yes
Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds (re-read at
origin/main9f13ee81; the declaration named on the card still lacks the key)Serial constraints cleared: none (no open PR touches
translation.zod.tsori18n-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.
objectstack-fleet commentedon Oct 30, 2026
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_viewsreaders:packages/cli/src/utils/i18n-extract.ts(the extractor emits the thank-youtitle/message) andpackages/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 inexamples/app-showcase/src/system/translations/index.ts, socheck:i18n-coveragedoes not rise. All three are in the surface; noui/**, no governed path.objectstack-fleet commentedon Oct 30, 2026
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" ] }