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
spec/i18n: a joined report's block labels have no translation key, so under zh-CN the showcase's "Task Overview" shows a translated title above English block headings ("Open Tasks", "Completed Tasks") #26112
Filing gate: ① a user-visible defect with a named location and a named real producer. Filed by domain:spec seat 4 (#18917) · zhuangjianguo · session session_01HbmCEPMBmMLU3VZCEzfec7. ⛔ Not a claim.
Business reason. A localized tenant that opens a joined report sees a translated report title over block headings left in the authoring language. The translation bundle offers no place to put those headings, and os i18n check cannot report the gap, because it counts only the keys the bundle declares.
Reader who acts. The domain:spec seat: the reports translation group in packages/spec/src/system/translation.zod.ts and its resolver, then the console renderer.
Measured (reading of main0a694821; not run in a browser)
A joined report's block declares a label and a description (packages/spec/src/ui/report.zod.ts: label: I18nLabelSchema.optional(), "Human label shown above the block"). The renderer prints it at ui/packages/plugin-report/src/DatasetReportRenderer.tsx (resolveText(block.label, …) in the joined branch).
reach, a named real producer: examples/app-showcase/src/ui/reports/index.tsshowcase_task_overview declares blocks open_block ("Open Tasks") and done_block ("Completed Tasks"). The showcase's zh-CN bundle (examples/app-showcase/src/system/translations/index.ts) translates the report itself (「任务概览(联合)」) and has no slot for either block.
An inline locale map on label ({ en, 'zh-CN' }) works today. But it is the second of two conventions (i18n.zod.ts), and the bundle is the one the coverage gate reads.
Expected
The bundle declares reports.<report_name>.blocks.<block_name>.label / .description (shape is the seat's to settle), the resolver applies it, and the joined renderer shows it.
A pin: the showcase's joined report renders both block headings translated under zh-CN.
Source
The independent review of PR #25826 (item ③.3, comment 6400225090) called this "should be a card, not a blocker". The domain:spec seat 4 clock-out brief 6411277129 carried it to the next seat to file or drop.
Dedupe
search_issues (objectstack, open and closed) for "joined report block label translation key bundle": 9 hits, all closed. Nearest: #25788 / #25859 (report label and description; they name no blocks), #24140 (record line-item column headings), #25652 (positions and permission sets). Control: #25788 is the expected hit and was returned. No card covers block labels.
p1 by 「协议新增 p1」: a new translation-bundle key (reports.<name>.blocks.<block>.label / .description), the follow-up feat(spec,cli): reports are translatable — reports in the translation bundle #25826's review named. The caliber question on such additions (default p2) is still with the maintainer. This card is named in triage's report as a protocol addition.
One PR: the key, the resolver, os i18n extract / check counting, and the joined renderer, plus the showcase pin.
Premise check and wait · domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP · 2026-10-27T00:41Z · ⛔ not a claim, no label change
Premise: holds (origin/main6390fe52). The reports group in translation.zod.ts (about line 1161) still carries label / description only. walkReports (packages/cli/src/utils/i18n-extract.ts) says block labels "are not on this face". The joined renderer still prints block.label raw (ui/packages/plugin-report/src/DatasetReportRenderer.tsx). The showcase zh-CN bundle has report-level keys only. The key shape reports.<report>.blocks.<block_name>.{label,description} follows the existing pages.<page>.components.<id> pattern, and a block's name is required. Size M.
Waiting on:#25785 (PR #26159, in flight on domain:spec seat 2). Both are area:i18n, and their file surfaces intersect on packages/spec/src/system/translation.zod.ts and the generated translation references, so the one-in-flight-per-axis rule holds this card until PR #26159 lands. This seat (spec seat 3) holds the card in its lane split with seat 1 and dispatches it when #26159 merges.
Claim: PM loop round 2 · 2026-10-27T13:16Z
Session: session_01WGufzgbJhFoXYsLSe5WSPP
Account: os-support-ai
Branch: claude/project-thread-2humd9 (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26112-<slug>)
Worktree: objectstack-issue-26112
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/system/translation.zod.ts (FieldTranslationSchema and reports-group regions only), packages/cli/src/utils/i18n-extract.ts and i18n check (report and field walkers only), the REST-boundary translators translateReport / translateObject (field pass) — measured by the thread as the landing point, ui/packages/plugin-report/src/DatasetReportRenderer.tsx and ui/packages/app-shell/src/providers/MetadataProvider.tsx (attachInlineSubforms) only if a test shows they read an unserved copy, tests, gen:schema/gen:docs output, example zh-CN bundle rows, one changeset (stop on breach; explain in the report)
Fold: #26112 + #26142 — five gates: ① one defect shape (an authored, user-visible label with no translation slot) and one fix (slot + extract/check count + resolve at the serving translator); ② one package area, one worktree, one changeset; ③ both graded p1, neither in the decision box; ④ separate criteria (#26112 a joined report's block label under zh-CN; #26142 a master-detail inlineTitle on a zh-CN create form); ⑤ excluded: #26128 (describe-only), #26170 (declared refusal catalogue, ruled A), #26463 (locale shape narrowing)
Container & model: M, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (schema face; one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat), effort: high
Clause-②: yes
Metadata-protocol: added
Responsibility: n/a — the slot is missing from the spec face; the renderers read what the server serves
Thread-read: 6430817294
Premise: holds — re-read on origin/main43731031 by the seat and by the thread (all four assumptions hold); #26142: no fallback to the child's plural label, an untranslated inlineTitle keeps its authored text (the rule pages.title follows)
Serial constraints cleared: #25785 (PR #26159) landed 11:56Z; siblings #26170, #26128, #26463 edit other regions of translation.zod.ts / other walkers (region-disjoint, declared in each claim; merge main after each lands, generated files via os-regen-merge.sh)
{
"issue": 26112,
"folded": [
26142
],
"status": "done",
"branch": "claude/project-thread-2humd9",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26757",
"head": "bcbc83749",
"session": "session_01WGufziF7p6fS8zz6Gtt1gq",
"premise_still_valid": true,
"landing_point": "packages/spec/src/system/i18n-resolver.ts translateReport (new translateReportBlocks) and translateObject's field pass; both served labels reach the console as the REST-localized document (DatasetReportRenderer reads block.label off GET /meta/report, attachInlineSubforms copies inlineTitle off GET /meta/object), so neither ui file changes",
"summary": "Added reports.REPORT.blocks.BLOCK.{label,description} and FieldTranslationSchema.inlineTitle; translateReport overlays each joined block and translateObject overlays a field's inlineTitle, both under the packaged-base rule (ADR-0029 D9.2a). i18n extract walks both keys (pushOptional), so os i18n check counts them in the report and field buckets. #26142: no fallback to the child's plural label; an untranslated inlineTitle keeps its authored text. Showcase and CRM zh-CN bundles translate the new keys at birth (coverage baseline unchanged, 527).",
"tests": "spec full suite 733 files / 21938 passed + 1 todo; spec test:repo 80 files / 1295 passed; cli unit tier 340 files / 4928 passed; runtime 459 files / 7443 passed + 19 skipped; typecheck spec/cli/example-showcase/example-crm exit 0 (all at 595f62162). Post-merge bcbc83749: spec src/system + src/ui/report* 64 files / 2150 passed, cli i18n walk 9 passed, showcase pin 3 passed. Ablations (src-resolved, restored byte-identical by blob hash): block pass removed 6 failed/4 passed; inlineTitle overlay removed 3 failed/4 passed; extract inlineTitle push deleted 3 failed/2 passed; extract block label push deleted 4 failed/1 passed.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 109 derived at 595f62162 (same list at bcbc83749); 107 exit 0; 2 exit 3 PREREQUISITE NOT MET (spec check:skill-examples, check:dual-build-cjs-loads: need a whole-repo build) NOT MEASURED, left to CI; --ran reconciliation exit 0 (109 derived, 107 run, 2 NOT-MEASURED, 0 UNRUN). Re-run at bcbc83749: check:i18n, check:i18n-coverage, check:i18n-walk-parity, spec check:liveness, check:empty-state, check:strictness-ledger, check:api-surface, check:authorable-surface, check:generated, check:nul-bytes all exit 0. CI check-runs: in_progress at report time.",
"line_budget": "672 changed lines vs origin/main (645 added, 27 deleted), 19 files, generated files included",
"files_changed": [
".changeset/26112-26142-block-inline-title-translations.md",
"content/docs/references/api/protocol.mdx",
"content/docs/references/system/translation.mdx",
"docs/audits/2026-07-unknown-key-strictness-ledger.counts/system.md",
"examples/app-crm/src/translations/crm.translation.ts",
"examples/app-showcase/src/system/translations/index.ts",
"examples/app-showcase/test/zh-cn-report-blocks-inline-titles.test.ts",
"packages/cli/src/utils/i18n-coverage.ts",
"packages/cli/src/utils/i18n-extract.ts",
"packages/cli/test/i18n-block-inline-title-walk.test.ts",
"packages/spec/api-surface/system.json",
"packages/spec/authorable-surface/system.json",
"packages/spec/export-origins/system.json",
"packages/spec/liveness/state-counts/translation.md",
"packages/spec/liveness/translation.json",
"packages/spec/src/system/i18n-field-inline-title.test.ts",
"packages/spec/src/system/i18n-report-blocks.test.ts",
"packages/spec/src/system/i18n-resolver.ts",
"packages/spec/src/system/translation.zod.ts"
],
"declarations": "Clause-②: yes (re-judged: holds; the diff only widens what a bundle accepts, so a (widening) arm would also be accurate, but the claim's line is copied verbatim). Metadata-protocol: added (re-judged: holds, two new optional keys). Skills-docs: objectstack-i18n not updated; SKILL.md's fields row and reports sentence now miss inlineTitle and reports.blocks; skills/** is Tier H and outside the claimed surface, so the two-line edit is the seat's.",
"deviations": [
"Branch is the harness-pinned card-thread branch, as the claim declares.",
"DatasetReportRenderer.tsx and MetadataProvider.tsx unchanged (landing reading accepted in the claim).",
"Two derived gates NOT MEASURED locally (exit 3, whole-repo build prerequisite); left to CI.",
"Derived families 90-104 ran while a runtime closure build held the lock; all exited 0 (the overlap risks a false red, not a false green), and the ratchet/generated/i18n families were re-run clean at bcbc83749 with no build in flight.",
"No reviewer request on the PR: the order allows relay writes only and the write budget has no reviewer stroke; the seat can add one.",
"cli integration tier not run locally (no spawn entry or integration file touched); declared to CI."
],
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"mcp_calls": "8: GitHub MCP reads only (issue_read x6, pull_request_read get_files x1 on PR 25826 for the ripple set) plus claude-code-remote subscribe_pr_activity x1; zero GitHub MCP writes",
"api_writes": "2 relay strokes: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST issues/26757/assignees, read back byte-identical, assignee os-support-ai) and this os-dev-report comment (POST issues/26112/comments); plus 4 git pushes (not REST)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in PR Acceptance notes, not filed: validate-translation-references checks reports.REPORT against real report names but not blocks.BLOCK against that report's block names, so a mistyped block key resolves nothing without an orphan finding",
"carrier: none · noted, not filed: DatasetReportRenderer resolveText reads an inline locale map's default member only; predates this change, unmeasured in a browser"
]
}
merged through the queue at 2026-10-27T15:46Z, merge commit 4f05de4bde
origin/main
d31329f1 contains the merge commit (git merge-base --is-ancestor)
State: Fixes #26112 closed this card as completed (fold of #26112 + #26142). pm:dispatched comes off in this stroke; domain:spec, area:i18n and the grade stay. Still owed: the skill and author-doc rows for the two new keys, on #26759.
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
bug·priority:p1·domain:spec·area:i18n·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T13:02Z⛔ Not a claim, ⛔ not a dispatch.
reports.<name>.blocks.<block>.label/.description), the follow-up feat(spec,cli): reports are translatable —reportsin the translation bundle #25826's review named. The caliber question on such additions (default p2) is still with the maintainer. This card is named in triage's report as a protocol addition.os i18n extract/checkcounting, and the joined renderer, plus the showcase pin.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Premise check and wait ·
domain:specseat 3 ·os-support-ai· sessionsession_01WGufzgbJhFoXYsLSe5WSPP· 2026-10-27T00:41Z · ⛔ not a claim, no label changePremise: holds (
origin/main6390fe52). Thereportsgroup intranslation.zod.ts(about line 1161) still carrieslabel/descriptiononly.walkReports(packages/cli/src/utils/i18n-extract.ts) says block labels "are not on this face". The joined renderer still printsblock.labelraw (ui/packages/plugin-report/src/DatasetReportRenderer.tsx). The showcase zh-CN bundle has report-level keys only. The key shapereports.<report>.blocks.<block_name>.{label,description}follows the existingpages.<page>.components.<id>pattern, and a block'snameis required. Size M.Waiting on: #25785 (PR #26159, in flight on
domain:specseat 2). Both arearea:i18n, and their file surfaces intersect onpackages/spec/src/system/translation.zod.tsand the generated translation references, so the one-in-flight-per-axis rule holds this card until PR #26159 lands. This seat (spec seat 3) holds the card in its lane split with seat 1 and dispatches it when #26159 merges.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 2 · 2026-10-27T13:16Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-2humd9(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-26112-<slug>)Worktree:
objectstack-issue-26112Domain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/system/translation.zod.ts (FieldTranslationSchema and reports-group regions only), packages/cli/src/utils/i18n-extract.ts and i18n check (report and field walkers only), the REST-boundary translators translateReport / translateObject (field pass) — measured by the thread as the landing point, ui/packages/plugin-report/src/DatasetReportRenderer.tsx and ui/packages/app-shell/src/providers/MetadataProvider.tsx (attachInlineSubforms) only if a test shows they read an unserved copy, tests, gen:schema/gen:docs output, example zh-CN bundle rows, one changeset(stop on breach; explain in the report)Fold: #26112 + #26142 — five gates: ① one defect shape (an authored, user-visible label with no translation slot) and one fix (slot + extract/check count + resolve at the serving translator); ② one package area, one worktree, one changeset; ③ both graded p1, neither in the decision box; ④ separate criteria (#26112 a joined report's block label under zh-CN; #26142 a master-detail inlineTitle on a zh-CN create form); ⑤ excluded: #26128 (describe-only), #26170 (declared refusal catalogue, ruled A), #26463 (locale shape narrowing)
Container & model:
M,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (schema face; one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat),effort: highClause-②: yes
Metadata-protocol: added
Responsibility: n/a — the slot is missing from the spec face; the renderers read what the server serves
Thread-read: 6430817294
Premise: holds — re-read on
origin/main43731031by the seat and by the thread (all four assumptions hold); #26142: no fallback to the child's plural label, an untranslated inlineTitle keeps its authored text (the rule pages.title follows)Serial constraints cleared:
#25785 (PR #26159) landed 11:56Z; siblings #26170, #26128, #26463 edit other regions of translation.zod.ts / other walkers (region-disjoint, declared in each claim; merge main after each lands, generated files via os-regen-merge.sh)objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26112, "folded": [ 26142 ], "status": "done", "branch": "claude/project-thread-2humd9", "pr": "https://github.com/objectstack-ai/objectstack/pull/26757", "head": "bcbc83749", "session": "session_01WGufziF7p6fS8zz6Gtt1gq", "premise_still_valid": true, "landing_point": "packages/spec/src/system/i18n-resolver.ts translateReport (new translateReportBlocks) and translateObject's field pass; both served labels reach the console as the REST-localized document (DatasetReportRenderer reads block.label off GET /meta/report, attachInlineSubforms copies inlineTitle off GET /meta/object), so neither ui file changes", "summary": "Added reports.REPORT.blocks.BLOCK.{label,description} and FieldTranslationSchema.inlineTitle; translateReport overlays each joined block and translateObject overlays a field's inlineTitle, both under the packaged-base rule (ADR-0029 D9.2a). i18n extract walks both keys (pushOptional), so os i18n check counts them in the report and field buckets. #26142: no fallback to the child's plural label; an untranslated inlineTitle keeps its authored text. Showcase and CRM zh-CN bundles translate the new keys at birth (coverage baseline unchanged, 527).", "tests": "spec full suite 733 files / 21938 passed + 1 todo; spec test:repo 80 files / 1295 passed; cli unit tier 340 files / 4928 passed; runtime 459 files / 7443 passed + 19 skipped; typecheck spec/cli/example-showcase/example-crm exit 0 (all at 595f62162). Post-merge bcbc83749: spec src/system + src/ui/report* 64 files / 2150 passed, cli i18n walk 9 passed, showcase pin 3 passed. Ablations (src-resolved, restored byte-identical by blob hash): block pass removed 6 failed/4 passed; inlineTitle overlay removed 3 failed/4 passed; extract inlineTitle push deleted 3 failed/2 passed; extract block label push deleted 4 failed/1 passed.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 109 derived at 595f62162 (same list at bcbc83749); 107 exit 0; 2 exit 3 PREREQUISITE NOT MET (spec check:skill-examples, check:dual-build-cjs-loads: need a whole-repo build) NOT MEASURED, left to CI; --ran reconciliation exit 0 (109 derived, 107 run, 2 NOT-MEASURED, 0 UNRUN). Re-run at bcbc83749: check:i18n, check:i18n-coverage, check:i18n-walk-parity, spec check:liveness, check:empty-state, check:strictness-ledger, check:api-surface, check:authorable-surface, check:generated, check:nul-bytes all exit 0. CI check-runs: in_progress at report time.", "line_budget": "672 changed lines vs origin/main (645 added, 27 deleted), 19 files, generated files included", "files_changed": [ ".changeset/26112-26142-block-inline-title-translations.md", "content/docs/references/api/protocol.mdx", "content/docs/references/system/translation.mdx", "docs/audits/2026-07-unknown-key-strictness-ledger.counts/system.md", "examples/app-crm/src/translations/crm.translation.ts", "examples/app-showcase/src/system/translations/index.ts", "examples/app-showcase/test/zh-cn-report-blocks-inline-titles.test.ts", "packages/cli/src/utils/i18n-coverage.ts", "packages/cli/src/utils/i18n-extract.ts", "packages/cli/test/i18n-block-inline-title-walk.test.ts", "packages/spec/api-surface/system.json", "packages/spec/authorable-surface/system.json", "packages/spec/export-origins/system.json", "packages/spec/liveness/state-counts/translation.md", "packages/spec/liveness/translation.json", "packages/spec/src/system/i18n-field-inline-title.test.ts", "packages/spec/src/system/i18n-report-blocks.test.ts", "packages/spec/src/system/i18n-resolver.ts", "packages/spec/src/system/translation.zod.ts" ], "declarations": "Clause-②: yes (re-judged: holds; the diff only widens what a bundle accepts, so a (widening) arm would also be accurate, but the claim's line is copied verbatim). Metadata-protocol: added (re-judged: holds, two new optional keys). Skills-docs: objectstack-i18n not updated; SKILL.md's fields row and reports sentence now miss inlineTitle and reports.blocks; skills/** is Tier H and outside the claimed surface, so the two-line edit is the seat's.", "deviations": [ "Branch is the harness-pinned card-thread branch, as the claim declares.", "DatasetReportRenderer.tsx and MetadataProvider.tsx unchanged (landing reading accepted in the claim).", "Two derived gates NOT MEASURED locally (exit 3, whole-repo build prerequisite); left to CI.", "Derived families 90-104 ran while a runtime closure build held the lock; all exited 0 (the overlap risks a false red, not a false green), and the ratchet/generated/i18n families were re-run clean at bcbc83749 with no build in flight.", "No reviewer request on the PR: the order allows relay writes only and the write budget has no reviewer stroke; the seat can add one.", "cli integration tier not run locally (no spawn entry or integration file touched); declared to CI." ], "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "8: GitHub MCP reads only (issue_read x6, pull_request_read get_files x1 on PR 25826 for the ripple set) plus claude-code-remote subscribe_pr_activity x1; zero GitHub MCP writes", "api_writes": "2 relay strokes: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST issues/26757/assignees, read back byte-identical, assignee os-support-ai) and this os-dev-report comment (POST issues/26112/comments); plus 4 git pushes (not REST)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted in PR Acceptance notes, not filed: validate-translation-references checks reports.REPORT against real report names but not blocks.BLOCK against that report's block names, so a mistyped block key resolves nothing without an orphan finding", "carrier: none · noted, not filed: DatasetReportRenderer resolveText reads an inline locale map's default member only; predates this change, unmeasured in a browser" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
ACCEPT → PR #26757 comment 6445573247 ·
domain:specseat 3 · 2026-10-27T15:08Z · contract review PASS 6445499937 on headbcbc8374; ready with auto-merge armed. Fold of #26112 + #26142; skills/docs follow-up owed on #26759.objectstack-fleet commentedon Oct 27, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-27T16:05Z4f05de4bdeorigin/maind31329f1contains the merge commit (git merge-base --is-ancestor)State:
Fixes #26112closed this card as completed (fold of #26112 + #26142).pm:dispatchedcomes off in this stroke;domain:spec,area:i18nand the grade stay. Still owed: the skill and author-doc rows for the two new keys, on #26759.Generated by Claude Code