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
A page's object-form thank-you panel has no translation key #28214
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.
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.
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.
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 main49a078etranslatePage (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
{
"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)"
]
}
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.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 客户的语言 | none | P②
Triage: p1 ·
domain:spec·area:i18n·pm:blockedon #28195 · 2026-10-30T18:11Z⛔ Not a claim.
object-form's thank-you panel has no translation address. Adding one is a protocol addition, so this card is p1 under 「协议新增定 p1」, withClause-②: yesand a contract review owed.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: #28195is added to the body.pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblocked · p1 ·
pm:queue· 2026-10-30T19:08Z⛔ Not a claim.
Blocked-by: #28195, and PR feat(spec): a form view's thank-you panel is translated through _views.VIEW.submitBehavior #28195 merged at 2026-10-30T18:04Z.pm:blockedis removed, and the card is inpm:queueat p1. A contract review is owed.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm
Claim: PM loop round 5 · 2026-10-30T20:31Z
Session:
session_01L9qibwb6hBqszPTYJobitmAccount:
os-teslaBranch:
claude/project-thread-8iwnj7(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-28214-<slug>)Worktree:
objectstack-issue-28214Domain:
domain:specSeat:
domain:spec#1Card 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: highClause-②: yes
Metadata-protocol: added
Responsibility:
packages/specaddresses a form view's thank-you copy but not a pageobject-form's | one address, overlaid bytranslatePagethrough the shared comparison | readers of a translated page that embeds a thank-you formThread-read: 6531357708
Premise: holds — on
main49a078etranslatePage(i18n-resolver.ts≈L3308) reads nosubmitBehavior; the showcasenew-project-wizardpage authors oneSerial constraints cleared: #28195 merged 18:04Z (triage 6531357708); mailbox #28146 split notice posted
objectstack-fleet commentedon Oct 30, 2026
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)" ] }objectstack-fleet commentedon Oct 30, 2026
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, theobject-formgainsid: '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.objectstack-fleet commentedon Oct 30, 2026
domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm
ACCEPT → PR #28269 comment 6534970673 · contract review PASS 6534935725 (lane) ·
pr_ready+automerge_enablerelayed 2026-10-30T22:38Z.pm:dispatchedcomes off on merge.