Repository navigation
layout,types: a nav entry's inline locale-map label (spec I18nLabel) is honoured only halfway: objectui validate refuses it, the renderer shows its en floor to every viewer, and three nav resolver props are inert after objectui#11201 #11299
Description
Filing-gate category: ① a defect, class (b): a declared capability is not delivered. reach: a public door, measured. safeValidateSchema, the function objectui validate calls (packages/cli/src/commands/validate.ts imports it from @object-ui/types/zod), refuses navigation[0].label = { en: 'Accounts', 'zh-CN': '客户' } with "Invalid input: expected string, received object". @objectstack/spec 17.5.0 NavigationItemSchema.safeParse accepts the same entry. The control, a string label, passes both. This was measured at the function; the CLI binary was not run.
Reader who acts: triage first (grade and route), then the domain:ui seat.
Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec). It is the one follow-up family card for PR objectui#11297 (objectui#11201, stage 2 of ruling B 5921167691). It carries:
- the dev report's two open questions (
5922299030, Q1 and Q2); - its out-of-scope finding 1;
- the contract review's additions (
5922460145③), which judged this disposition right.
⛔ Not graded here.
Dedup: no card was found for a nav entry's map label, NavigationEntryItem.label, or the three nav resolver props.
- Searched: the 1,000 most recently updated objectui issues and PRs (read through REST and grepped locally), plus the 40 newest.
- Terms:
I18nLabel,locale map(nav),NavigationEntryItem,resolveObjectLabel.
The declared capability
The spec's BaseNavItemSchema.label is I18nLabel: a string, or an inline locale map such as { en, 'zh-CN' }. objectui honours it in three places, and differently in each.
| face | at objectui main after PR objectui#11297 |
state |
|---|---|---|
authoring door: @object-ui/types NavigationEntryItem.label?: string, and zod NavigationItemObject.label: z.string().optional() |
refuses a map that the spec accepts | measured (safeValidateSchema) |
renderer: NavigationRenderer / resolveNavItemLabel |
renders a map through the spec's resolveI18nLabel with no locale, so every viewer sees the en entry (then default, then any entry). The area labels above it in UnifiedSidebar resolve in the viewer's language |
measured by PR objectui#11297's map pins (the no-locale default) |
props: resolveObjectLabel, resolveDashboardLabel, resolveViewLabel on NavigationRendererProps, and resolveNavItemLabel's 2nd, 4th and 5th arguments |
unread since the translate-if-equal arm was retired; kept as @deprecated no-ops because the ruling set "no public prop change" |
read at source |
Also false after PR objectui#11297: the header comment of packages/app-shell/src/views/nav-menu-renderer.tsx (about :38-39) still promises "the same convention-based object / view / dashboard i18n resolution the sidebar gets". UnifiedSidebar and nav-menu-renderer still build the three resolvers that nothing reads.
Measured pull: no readable app navigation writes a map-valued entry label. In objectstack 5f6b63a6f, label: { appears only in translation bundles.
Questions for triage (options from the dev report and the review; not a ruling)
Q1: should the viewer's locale reach a map-valued entry label?
- A. An optional
localeprop onNavigationRenderer, plus a trailinglocaleargument onresolveNavItemLabel. The console passes its active language:UnifiedSidebar(two mounts),nav-menu-renderer,CommandPaletteandSearchResultsPage.AppSchemaRenderer's areas could take the same prop. This is the routeresolveAreaLabel's docblock names. It adds one public prop:Clause-② yes,minor. - B. Keep the
enfloor, the area switcher's documented "floor, not a ceiling", and state it where nav labels are documented. No new surface. - C (the review's addition). Read the locale through
@object-ui/react's re-export ofuseI18nContext, a layout dependency, so no prop is needed. The cost is the couplingresolveAreaLabeldocuments as forbidden, and a split: the sidebar in the viewer's locale, the palette and search aten, unless the signature changes too.
Q2: retire the three inert resolver props and arguments? A signature change to an exported function, minor with the break spelled out. The callers are three in-tree mounts and two tests. If done, it rides with Q1 A, which rewrites the same call sites, and it corrects nav-menu-renderer's header comment.
Q3 (the measured defect): the authoring door. @object-ui/types' nav entry label accepts the spec's I18nLabel (a string or an inline locale map), matching the spec, so objectui validate stops refusing a document os validate accepts. This is independent of Q1/Q2's answer, and it is the part that is a defect today.
Pins (whatever the answer):
- the map entry passes
safeValidateSchemaexactly as the spec'ssafeParsedoes, with a string-label control; - the renderer's map row under the chosen locale rule;
- if Q2 is taken, the props are gone from the public type and the header comment is true.
Dedupe words: nav label locale map · NavigationEntryItem label string · objectui validate navigation label · I18nLabel nav entry · resolveObjectLabel deprecated · nav-menu-renderer convention comment
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 1, 2026
Triage: first grade —
bug·priority:p3·domain:ui·area:i18n·pm:queue. Q3 first; then Q1 A with Q2 riding on the same call sitesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T00:57Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. It is a measured validator refusal of a spec-valid entry, but there is zero measured pull: no readable app navigation writes a map label.
The answers.
@object-ui/types' nav entrylabelaccepts the spec'sI18nLabel, by reference, not a copy.objectui validatethen agrees withos validate. It is independent of Q1 / Q2.enfloor for everyone.localeprop is the routeresolveAreaLabel's own docblock names. It adds one public prop (Clause-② yes,minor).ento everyone is declared ≠ delivered.minor, with the break spelled out), andnav-menu-renderer.tsx's header comment is made true.Pins:
safeValidateSchemaexactly as the spec'ssafeParsedoes, with a string control;en/defaultperresolveI18nLabel;Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Claim: PM loop round 1
Session:
session_0122Knsowci76D2rBWReCzzZAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11299-nav-label-locale-mapWorktree:
objectui-issue-11299Domain:
domain:uiSeat:
domain:ui#1File surface (triage's answers
5922552691: Q3 first, then Q1 A with Q2 on the same call sites, one PR):packages/types/src/zod/app.zod.ts(NavigationItemObject.label, about:203) andpackages/types/src/app.ts(NavigationEntryItem.label) take the spec'sI18nLabelby reference, soobjectui validateaccepts the inline locale mapos validateaccepts.packages/layout/src/NavigationRenderer.tsxgains an optionallocaleprop, andresolveNavItemLabela trailinglocaleargument. The console passes its active language fromUnifiedSidebar(two mounts),nav-menu-renderer,CommandPaletteandSearchResultsPage(packages/app-shell/src/**);AppSchemaRenderer's areas only if the same prop fits.resolveObjectLabel/resolveDashboardLabel/resolveViewLabelleaveNavigationRendererProps, and the inert arguments leaveresolveNavItemLabel. The in-tree callers drop them, andpackages/app-shell/src/views/nav-menu-renderer.tsx's header comment (about:38–:39) is made true..changeset/11299-*.mdper released package changed.⛔ Not the
@object-ui/reactuseI18nContextroute (option C, rejected). ⛔ No copy ofresolveI18nLabel's fallback order. ⛔ Notplugin-list/src/ListView.tsx's ownresolveObjectLabelunless the measurement shows it is the nav prop. The dev stops on a breach and explains it in the report.Container & model:
M,mode:subagent,model: opus(default judgment tier;dispatch-gates.mjs --tieranswers no path-derived mandate for objectui paths)Clause-②: yes
Thread-read: 5922552691
Serial constraints cleared: read 2026-10-01T02:57Z at objectui
origin/main. No open PR namesapp.zod.ts,app.ts,NavigationRenderer.tsx,UnifiedSidebar.tsx,nav-menu-renderer.tsx,CommandPaletteorSearchResultsPage. objectui#11201 (seat 2, the same renderer) is closed; its stage 2 landed as PR objectui#11297. This seat's in-flight objectui#11294 and objectui#11293 are on disjoint surfaces.Scope: PR says
Fixes #11299.Clause-②: yes— why: a published authoring face accepts a value it refused,NavigationRenderergains a public prop, and three public props and two function arguments retire (minor, with the break spelled out).domain:uiseat 1 · claim · 2026-10-01T02:57ZGenerated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
os-dev-report
{
"issue": 11299,
"status": "done",
"branch": "claude/issue-11299-nav-label-locale-map",
"pr": "#11325",
"session": "session_0122Knsowci76D2rBWReCzzZ — the subagent runs under the parent seat session; container CLAUDE_CODE_REMOTE_SESSION_ID cse_0122Knsowci76D2rBWReCzzZ",
"premise_still_valid": true,
"summary": "Q3:
NavigationItemObject.labelnow takes the spec'sI18nLabelSchemaby reference (viastripImportedDefaults) and the TS twinNavigationEntryItem.labelis the spec'sI18nLabel, sosafeValidateSchemaacceptsnavigation[0].label = { en: 'Accounts', 'zh-CN': '客户' }exactly as the spec'sNavigationItemSchema.safeParsedoes (red reproduced first: 7 failed / 8 passed before the fix). Q1 A:NavigationRenderergains an optionallocaleprop andresolveNavItemLabela trailinglocaleargument handed to the spec's ownresolveI18nLabel(no copy of its fallback order). The console passesuseObjectTranslation().languagefrom UnifiedSidebar ×2, nav-menu-renderer, CommandPalette and SearchResultsPage. That is the same value the sidebar already resolves area labels in and thatuseNavTargetLabelreads. Q2:resolveObjectLabel/resolveDashboardLabel/resolveViewLabelleaveNavigationRendererProps, andresolveNavItemLabelis now(item, t, targetLabel, locale). nav-menu-renderer's header comment is made true. Measured beyond the card: two more six-argument callers (app-shellmetadata-admin/previews/navItemLabel.ts, plugin-designerAppCreationWizard.tsx). The type widening also surfaced plugin-designerNavigationDesigner.tsx(TS2345 ×4), adapted with no behaviour change.AppSchemaRendererwas NOT given a locale: it would add a public prop and nothing mounts it with a locale; only its docblock was made true.plugin-listListView'sresolveObjectLabelis unrelated (a local alias ofuseListFieldLabel().objectLabel).","tests": "FINAL UNION at 81579bc (git rev-parse --short HEAD):
OS_VERIFY_LOCK_SLOT=issue-11299 os-verify-lock.sh -c 'pnpm exec vitest run --maxWorkers=2 packages/types/ packages/layout/ packages/plugin-designer/ packages/app-shell/src/layout/ + the 74 app-shell test files git grep -l finds for NavigationRenderer|resolveNavItemLabel|resolveObjectLabel|CommandPalette|SearchResultsPage|nav-menu-renderer'→Test Files 443 passed (443)/Tests 8875 passed (8875)/VERDICT command-exit 0. || Q3 RED FIRST (before the fix, at 8d0d453's parent tree plus the new pin):pnpm exec vitest run packages/types/src/__tests__/nav-label-locale-map-11299.test.ts→Tests 7 failed | 8 passed (15),invalid_typeat label (the 8 passing rows are the string control and the refusal rows); after the fix →Tests 15 passed (15),VERDICT command-exit 0. || ABLATION (Q1, through objectstack scripts/ablation-replace.mjs under the lock, trap-restored): anchor = the[0], locale) ?? ''tail of presentNavItemLabel's resolveInlineI18nLabel call in packages/layout/src/NavigationRenderer.tsx x1→x0, replacement withundefinedin place oflocalex0→x1, blob ecd12cb41767→1ba190fa7654 (mutation landed on disk); run of the layout 11299 file + the four app-shell 9868 files →Test Files 5 failed (5)/Tests 12 failed | 29 passed (41)(every zh-CN row; direction: red, as predicted); restore: blob after restore == HEAD blob ecd12cb41767,git diff HEADempty, anchor count back to 1. No build between legs: the subject resolves through the root vitest alias@object-ui/layout→ packages/layout/src (and the layout pin imports ../NavigationRenderer directly). || TYPE PINS:@ts-expect-erroronNavigationRendererProps['resolveObjectLabel' | 'resolveDashboardLabel' | 'resolveViewLabel']and on a six-argumentresolveNavItemLabelcall, compiled bypnpm --filter @object-ui/layout type-check(tsc -p tsconfig.test.json) → Done; the test program resolves @object-ui/types through the rebuilt dist (paths {}), and a map-labelledNavigationItemliteral compiles there, so the d.ts read is the rebuilt one. || Layout suite before the app-shell edits:pnpm exec vitest run --maxWorkers=2 packages/layout/→Test Files 31 passed (31)/Tests 314 passed (314). || App-shell first run: 1 failure in my new nav:menu row (the block's aria-label localizes to 应用导航 under zh-CN; looked up by data-block instead) → fixed; the four surfaces' files thenTests 20 passed (20).","gates": [
"build
pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: run 1 exit 1 (plugin-designer NavigationDesigner.tsx TS2345 ×4, from the label type widening) → fixed → run 2VERDICT command-exit 0","build
pnpm --filter @object-ui/app-shell buildexit 0 (dist completeness: 974 emitted files verified)","type-check @object-ui/types, @object-ui/components, @object-ui/runner: Done (exit 0)",
"type-check @object-ui/layout + @object-ui/plugin-designer: exit 0 (after fixing a union-spread literal in my own test)",
"type-check @object-ui/app-shell: exit 0",
"type-check @object-ui/console: first attempt only TS2307/TS2882 for unbuilt plugin-gantt/timeline/map/markdown/tree (PREREQUISITE NOT MET, not a red); built those five →
VERDICT command-exit 0","node scripts/check-changeset-presence.mjs exit 0 (23 source files of 4 released packages, 4 changesets)",
"pnpm changeset:check exit 0",
"pnpm check:control-bytes exit 0; manual control-byte grep over the 27 changed files exit 1 (no match)",
"pnpm check:new-line-citations exit 0 —
VERDICT new-cross-file-line-citations: 0 new citation(s)","pnpm check:spec-symbols exit 0",
"pnpm check:i18n-keys exit 0",
"pnpm check:component-surface-parity exit 0 (report-only)",
"node scripts/check-governed-queue-guard.mjs --test (27 paths) → NOT GOVERNED",
"lint NARROWED (CI owns
pnpm lint):pnpm exec eslint --format jsonon the 23 changed .ts/.tsx files, inline config honoured as the per-packageeslint .runs it → 23 files, 0 ignored, 0 errors, 75 warnings (all pre-existing lines); type-aware linting not enabled (tseslint.configs.recommended, no parserOptions.project / projectService) so untouched files' verdicts cannot move; under --no-inline-config 3 errors, all on pre-existingeslint-disable-next-line react-hooks/static-componentslines","light gates re-run at final head 81579bc; main moved by one docs-only commit (0c6f9bb) touching none of these files — no merge needed"
],
"line_budget": "n/a — no skills/** and no governed surface touched; diff 27 files, +696 / −196",
"deviations": [
"File surface grew past the claim, each forced by the ruled changes: packages/plugin-designer/src/AppCreationWizard.tsx (signature), packages/plugin-designer/src/NavigationDesigner.tsx (type widening; behaviour-preserving labelDraftOf helper), packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts (signature), packages/layout/src/AppSchemaRenderer.tsx (docblock only); a fourth changeset for @object-ui/plugin-designer (patch). Named in the PR body.",
"Tests also ran packages/plugin-designer/ (a touched package) on top of the order's list.",
"The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I used AGENTS.md's model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the os-dev session-URL PR footer instead, by those files' precedence.",
"Console type-check needed five extra plugin builds (plugin-gantt, plugin-timeline, plugin-map, plugin-markdown, plugin-tree) beyond the app-shell closure."
],
"files_changed": [
".changeset/11299-app-shell-nav-label-locale.md",
".changeset/11299-layout-nav-label-locale.md",
".changeset/11299-plugin-designer-nav-label-call.md",
".changeset/11299-types-nav-label-locale-map.md",
"packages/app-shell/src/chrome/CommandPalette.navLabelInherits-9868.test.tsx",
"packages/app-shell/src/chrome/CommandPalette.tsx",
"packages/app-shell/src/hooks/tests/useNavigationSync.standardEntryLocalizes-11201.test.tsx",
"packages/app-shell/src/layout/UnifiedSidebar.tsx",
"packages/app-shell/src/layout/tests/UnifiedSidebar.navLabelInheritsTarget-9868.test.tsx",
"packages/app-shell/src/views/SearchResultsPage.tsx",
"packages/app-shell/src/views/tests/SearchResultsPage.navLabelInherits-9868.test.tsx",
"packages/app-shell/src/views/tests/nav-label-inherits-target-9868.render.test.tsx",
"packages/app-shell/src/views/metadata-admin/previews/navItemLabel.inherit-11196.test.ts",
"packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts",
"packages/app-shell/src/views/nav-menu-renderer.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.standardNavEntries-11201.test.tsx",
"packages/layout/src/AppSchemaRenderer.tsx",
"packages/layout/src/NavigationRenderer.tsx",
"packages/layout/src/tests/NavigationRenderer.labelInheritsTarget-9868.test.tsx",
"packages/layout/src/tests/NavigationRenderer.labelLocaleMap-11299.test.tsx",
"packages/layout/src/tests/NavigationRenderer.labelVerbatim-11201.test.tsx",
"packages/layout/src/tests/NavigationRenderer.navLabelOwnership.test.tsx",
"packages/plugin-designer/src/AppCreationWizard.tsx",
"packages/plugin-designer/src/NavigationDesigner.tsx",
"packages/types/src/tests/nav-label-locale-map-11299.test.ts",
"packages/types/src/app.ts",
"packages/types/src/zod/app.zod.ts"
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 — all through the fleet relay (each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft, #11325), relay run 36812290402; (2) label-write --assign os-warren → POST /repos//issues/11325/assignees, relay run 36812354207, read-back MATCHES; (3) this os-dev-report comment → POST /repos//issues/11299/comments via post-stamped. Plus git push of the branch (not REST). Zero label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — useNavPins stores resolveNavItemLabel(item) with no locale, so a pinned map-labelled entry's portable favourite keeps its en text (not one of the five ruled mounts; zero measured pull). Dedupe words: useNavPins label locale · pinned nav map label",
"carrier: none · noted, not filed — plugin-designer navigation-designer: preview rows and AppCreationWizard resolve a map label with no locale (en), and the inline rename starts a map's draft empty and would replace the whole map with typed text on commit (pre-existing runtime behaviour made visible by the type; read off source, no probe run; no in-repo mount; the Studio designer's renamedLabel, objectui#11128, avoids it). Dedupe words: NavigationDesigner rename locale map · navigation-designer label map overwrite",
"carrier: none · noted, not filed — an empty locale map {} on a nav entry is accepted (as the spec does) and renders ''; the stated empty-string divergence was not extended to maps (no ruling). Dedupe words: nav label empty locale map",
"carrier: the seat at release time · noted, not filed — the pending .changeset/11201-nav-label-verbatim.md says the three props 'are still accepted, so no caller breaks' and that the sidebar is not told the viewer's locale; if both changesets ship in one release, this PR's layout changeset names objectui#11201 and supersedes those sentences (not edited: another card's record). Dedupe words: 11201 changeset superseded nav props",
"carrier: none · noted, not filed — ROADMAP.md P1.15 still ticks 'Wired into NavigationRenderer via optional resolveObjectLabel' (historical checklist). Dedupe words: ROADMAP resolveObjectLabel"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
os-dev-report
{
"issue": 11299,
"status": "done",
"branch": "claude/issue-11299-nav-label-locale-map",
"pr": "#11325",
"head": "ccd2a9b29600abac3a6ac04c3bb784c2f5512b77",
"session": "session_0122Knsowci76D2rBWReCzzZ — the subagent runs under the parent seat session; container CLAUDE_CODE_REMOTE_SESSION_ID cse_0122Knsowci76D2rBWReCzzZ",
"premise_still_valid": true,
"summary": "Patch round 1, new head ccd2a9b: pending changesets this PR makes false in the same release are corrected, in one normal commit (no force-push, rebase or amend).
.changeset/11201-nav-label-verbatim.md: both named sentences now say what objectui#11201 did, then that objectui#11299, in the same release, gives the sidebar the viewer's locale and removes the props, pointing to .changeset/11299-layout-nav-label-locale.md. Only those two sentences changed: frontmatter,patch, the other sentences and the line shape are kept. The sweep of every pending changeset on origin/main (be52115) found one more:.changeset/10867-app-wizard-saves-spec-app.mdtwice says a nav entry'slabelisstring | undefined. Both parentheticals now add that objectui#11299, in the same release, makes it the spec'sI18nLabelorundefined, pointing to .changeset/11299-types-nav-label-locale-map.md. The other 40 files that name the nav renderer or nav labels hold (see changesets_checked). No source or test changed this round, so the round-0 test union at 81579bc stands for the code. The PR body was not edited (one-write rule). Its Acceptance-notes bullet saying the 11201 changeset was left unedited is now stale; suggested replacement for the seat: 'Corrected in patch round 1 (ccd2a9b), together with two label-type parentheticals in .changeset/10867-app-wizard-saves-spec-app.md.'","tests": "Round 1 (changeset text only; head ccd2a9b,
git statusclean):pnpm changeset:check→ EXIT 0 (✅ All workspace packages are in the changeset fixed group./✅ privatePackages declared: version=true, tag=false./✅ No changeset declares amajorbump.);node scripts/check-changeset-presence.mjs→ EXIT 0 (✅ 23 source file(s) of 4 released package(s) changed, and this change declares 4 changeset(s));pnpm check:control-bytes→ EXIT 0 (✅ check-control-bytes: OK (scanned 9798 tracked text file(s); skipped 85 binary).); manual control-byte grep over the two edited files → exit 1 (none). The three gates ran on the working tree before the commit and again on the pushed head. || Code unchanged since round 0: final union at 81579bc →Test Files 443 passed (443)/Tests 8875 passed (8875)(see the round-0 report).","gates": [
"pnpm changeset:check EXIT 0 (at ccd2a9b)",
"node scripts/check-changeset-presence.mjs EXIT 0 (at ccd2a9b)",
"pnpm check:control-bytes EXIT 0 (at ccd2a9b)"
],
"changesets_checked": "Enumerated from the ref being read:
git ls-tree --name-onlyof origin/main fetched into refs/issue-11299/main-now (be52115): 2501 pending .changeset/*.md. Topic grep over that same ref for the nav renderer, nav labels, the three props, resolveNavItemLabel, NavigationItemSchema/NavigationItemObject/NavigationEntryItem, nav:menu, UnifiedSidebar, CommandPalette and SearchResultsPage gave 31 files. A second grep for locale-map / I18nLabel wording, filtered to files that mention nav, sidebar or navigation, gave 11 more. Each of the 42 was read for a sentence on the props, resolveNavItemLabel's arguments, nav-label locale behaviour or NavigationItemObject.label acceptance. Verdicts: .changeset/11201-nav-label-verbatim.md: FALSE ×2 → corrected (sentence on the sidebar not being told the viewer's locale; sentence on the three props still being accepted). Each now says what objectui#11201 did, then that objectui#11299, in the same release, gives the sidebar the viewer's locale / removes the props, pointing to .changeset/11299-layout-nav-label-locale.md. Frontmatter, patch level, other sentences and the ~100-column two-space-indent line shape kept. | .changeset/10867-app-wizard-saves-spec-app.md: FALSE ×2 → corrected (the parentheticals saying a nav entry'slabelread off an unnarrowedNavigationItemisstring | undefined, in the BREAKING paragraph and in the separator bullet). Each now adds that objectui#11299, in the same release, makes it the spec'sI18nLabelorundefined, pointing to .changeset/11299-types-nav-label-locale-map.md. Nothing else in that file was edited. | .changeset/9868-nav-label-inherits-target.md: holds — 'present ⇒ rendered verbatim' restates the spec's semantic (for a map, verbatim = the viewer's entry, per the triage ruling); resolveTargetLabel and the empty-label refusal are unchanged | .changeset/11201-standard-nav-entries-label-less.md: holds — producers write label-less entries; nothing about the props, the arguments, the locale or the door | .changeset/11196-designer-nav-label-inherit.md: holds — the designer surfaces call resolveNavItemLabel; the map-edit statements are about app-shell's inspector, not changed here | .changeset/11196-slice2-surface-inspector-birth.md: holds — Studio surface and inspector; no statement this PR changes | .changeset/11197-doc-nav-entry.md: holds — the doc arm refuses an emptylabelas every sibling does — still true (the arm takes the flat object's label schema, now I18nLabel, and refuseEmptyNavLabel still runs) | .changeset/11128-app-nav-canvas-label-maps.md: holds — states the spec types a nav label as I18nLabel — true; canvas behaviour untouched | .changeset/11148-nav-inspector-label-map.md: holds — same, for the inspector | .changeset/11100-app-preview-label-maps.md: holds — same, for the app preview | .changeset/6661-app-launcher-nav-menu-renderers.md: holds — records that resolveNavItemLabel was exported with no behaviour change at that time; nav:menu still takes its labels from it | .changeset/10188-app-shell-doc-menu-audience.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/10188-layout-doc-target-guard.md: holds — checkDocTarget props on NavigationRenderer / AppSchemaRenderer, unchanged | .changeset/10287-navigation-designer-doc-type.md: holds — a designer type-badge label key, not a nav entry label | .changeset/8563-nav-target-exclusivity-chained.md: holds — target exclusivity chaining, unchanged | .changeset/10235-spec-translation-bundle-recognised-by-any-group.md: holds — bundle recognition; navigation labels translated upstream, unchanged | .changeset/10520-orphaned-console-pages.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/10827-app-branding-logo-one-spelling.md: holds — the app's label as image alt text, not a nav entry label | .changeset/3162-types-ledger-batch8-verdicts.md: holds — 'referencing the spec's schema would make objectui validate reject…' is about the whole NavigationItemSchema, still true; only the label member was taken by reference | .changeset/4895-retire-block-schema-family.md: holds — mentions NavigationItemSchema as a component-entry kind only | .changeset/5817-remove-app-sidebar.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/6166-zh-breadcrumb-reports.md: holds — a breadcrumb key, not nav labels | .changeset/6335-starred-apps-nav-exclusion.md: holds — starred-apps card label key, not nav entry labels | .changeset/6349-types-internal-name-collisions-batch-2.md: holds — the legacy AppMenuItem label, unchanged | .changeset/6443-nav-visible-fault-diagnostic.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/7760-lazy-mirror-input-type-args.md: holds — NavigationItemSchema keeps its annotation becauseidis optional against a required one — unchanged | .changeset/7918-zod-lazy-getter-identity.md: holds — lazy self-reference on children, unchanged | .changeset/8871-page-node-refuses-breadcrumbs.md: holds — breadcrumb item labels, not nav labels | .changeset/appsidebar-deprecated-5720.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/issue-5619-workspace-admin-unresolved.md: holds — no sentence on the four topics (label/locale/prop grep empty) | .changeset/nav-item-visible-nesting-10119.md: holds — group visibility, unchanged | .changeset/studio-nav-canonical-keys.md: holds — strictObject members of the spec union, unchanged | .changeset/11027-preview-display-keys.md: holds — area label/description in the app preview, unchanged | .changeset/11039-form-chrome-i18n.md: holds — matched on navigateOnSuccess only | .changeset/11068-grid-declared-keys.md: holds — matched on keyboardNavigation only | .changeset/11181-app-label-i18n-resolver.md: holds — the app's own label and the rail heading in the designer locale, unchanged | .changeset/1984-v1-honest-chips-and-ui-fragments.md: holds — mentions the nav object registry only | .changeset/9150-report-chart-title-locale-map.md: holds — report chart titles | .changeset/9373-listview-detail-overlay-inline-locale-label.md: holds — NavigationOverlay's title, not nav entries | .changeset/chart-config-locale-heading-9038.md: holds — chart headings | .changeset/i18nlabel-inverted-pin-5612.md: holds — the I18nLabel pin in page-nav-misc-spec-parity, unchanged | .changeset/interfaces-rail-label-map-11158.md: holds — states the spec types a nav label as I18nLabel — true; Studio rail behaviour unchanged","changeset_claim_re_read": [
"Bot comment 5924361168 (changeset-claim-re-read, 8 pending changesets naming a file this diff touches); each quoted paragraph read against the diff:",
"4895-retire-block-schema-family.md — still true: the
type: 'component'nav item kind is stillNavigationItemSchemain zod/app.zod.ts; this diff changed only thelabelmember.","6335-starred-apps-nav-exclusion.md — still true: UnifiedSidebar.tsx still filters Favorites with
type !== 'nav'; this diff changed only the NavigationRenderer props and theuseObjectLabeldestructure.","6349-types-internal-name-collisions-batch-2.md — still true:
AppMenuItemandmenuItemToNavigationItemin app.ts are untouched; this diff changed onlyNavigationEntryItem.labeland its docblock.","7113-chart-data-model.md — still true: app.zod.ts still ships refined mirrors (two superRefine calls), and
safeValidateSchemais unaffected by that class.","7735-zod-mirrors-stop-authoring-defaults.md — still true: this diff adds no
.default(. The new crossing isstripImportedDefaults(SpecI18nLabelSchema), and the only.default(text left in app.zod.ts is the unchanged comment about.default('grid').","7918-zod-lazy-getter-identity.md — still true:
AppMenuItemSchemais still the barrel alias of app.zod.ts'sMenuItemSchema(zod/index.zod.ts, untouched).","8871-page-node-refuses-breadcrumbs.md — still true: a measurement dated to its own base
93127bd6f, and the NavigationRenderer.tsx comment listing 'breadcrumbs' among UI surfaces is unchanged by this diff.","9092-inline-locale-declared-face.md — still true: its three restated keys are
AppComponentSchema.label,ObjectGridSchema.label/.descriptionandPageNodeSchema.aria.ariaLabel. This diff widensNavigationEntryItem.label, a different member, with the same class of repair, so no sentence goes false.",".changeset/11201-nav-label-verbatim.md (named by the coordinator, not by the bot) — corrected: see changesets_checked."
],
"line_budget": "n/a — no skills/** and no governed surface touched; this round 2 files, changeset text only",
"deviations": [
"Edited a second pending changeset not named in the patch order (.changeset/10867-app-wizard-saves-spec-app.md), as the order's sweep clause asks.",
"Not corrected, because this PR does not make it false: 10867's "
NavigationEntryItemholds every other nav type and keeps its requiredlabel" was already made false by objectui#9868 (also pending in the same release), which made the label optional. Reported below rather than edited."],
"files_changed": [
".changeset/10867-app-wizard-saves-spec-app.md",
".changeset/11201-nav-label-verbatim.md"
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "1 this round (4 cumulative): this round-1 os-dev-report comment, POST /repos//issues/11299/comments through post-stamped (the fleet relay, one POST /repos/objectstack-ai/objectstack/dispatches). Plus git push 81579bc..ccd2a9b (not REST). No PR body PATCH, no label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: the seat at release time · noted, not filed — .changeset/10867-app-wizard-saves-spec-app.md says
NavigationEntryItem'keeps its requiredlabel'; objectui#9868 (pending in the same release) made it optional, so that sentence is false at release independent of this PR. Dedupe words: 10867 changeset required label · 9868 optional label changeset","Round-0 findings unchanged (useNavPins no-locale snapshot; plugin-designer navigation-designer map rename; empty map {} accepted; ROADMAP P1.15). The 11201 changeset finding is closed by this round."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
✅ ACCEPT: PR objectui#11325 at
ccd2a9b29; ready and auto-merge follow this ACCEPTdomain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-10-01T05:10Z. Checked against the diff and the head's check-runs. Claim5923826394; dev reports on the card (round 05924389320, patch round 15924457466).CONTRACT_REVIEW_TIER: PASS on this head, which is the landing head (5925158565).Implemented-by: claude/issue-11299-nav-label-locale-map,Reviewed-by: session_0122Knsowci76D2rBWReCzzZ.5922552691, Q3 (the door)NavigationItemObject.labeltakes the spec'sI18nLabelSchemaby reference throughstripImportedDefaults, the same crossingBaseSchema.labeluses, and the TS twinNavigationEntryItem.labelis the spec'sI18nLabel.objectui validatenow accepts an inline locale-map nav label exactly asos validatedoes. Thedocarm builds on the same shape, so it takes the same labelNavigationRenderergains an optionallocaleprop, andresolveNavItemLabela trailinglocaleargument handed to the spec's ownresolveI18nLabel, with no copied fallback order. The console passesuseObjectTranslation().languagefromUnifiedSidebar×2,nav-menu-renderer,CommandPaletteandSearchResultsPage, the locale those surfaces already resolve area labels and target labels in.AppSchemaRenderergets no prop (nothing mounts it with a locale); only its docblock is made trueresolveObjectLabel,resolveDashboardLabelandresolveViewLabelleaveNavigationRendererProps, andresolveNavItemLabelbecomes(item, t, targetLabel, locale). Every in-tree caller is moved, including two six-argument callers past the card (navItemLabel.ts,AppCreationWizard.tsx).@ts-expect-errorpins hold the retired props and the six-argument call out. The claim's three ⛔ lines are honouredplugin-designer'sNavigationDesigner.tsx(TS2345 ×4 from the widened type, adapted with alabelDraftOfhelper, no behaviour change) andAppCreationWizard.tsx, app-shell'snavItemLabel.ts, andAppSchemaRenderer.tsx's docblock. Each is forced by the ruled change and named in the PR body11201-nav-label-verbatim.mdthis PR makes false (the sidebar's locale; the props "still accepted"), and twostring | undefinedparentheticals in10867-app-wizard-saves-spec-app.md. The bot's 8, the 40 other files naming nav labels, and the 7 changesetsmainadded since the merge base all hold. The PR body's stale bullet on the 11201 changeset was corrected by the seat in the same passlocalehand-off inNavigationRenderer.tsxreddens the 12 zh-CN rows with every control green. The type pins are compiled bytsc -p tsconfig.test.jsonminorfor@object-ui/types,@object-ui/layoutand@object-ui/app-shell,patchfor@object-ui/plugin-designer. The layout break (three props and a changed arity) is spelled out with the before and after call, under the repository's rule that a break of its own is declaredminorin the fixed group.Clause-②: yes(the claim)ccd2a9b29: 43 runs, 40 success, 3 expected skips, 0 failuremainsincecd5b19a7e7, none touching this PR's 29 files. A test merge onto currentmain(5262f7dd3f) is clean, and the merge queue re-tests the merged treecheck-governed-merges.mjs: not governed.Fixes #11299Out-of-scope findings (Acceptance notes; none measured at a public door):
useNavPinsstores a pinned entry's label with no locale. The storedlabelis a placeholder the sidebar never renders, andtype: 'nav'favourites stay out ofStarredApps. The reach is the portable favourite record only.plugin-designer'sNavigationDesigner: an inline rename of a map label starts with an empty draft and would commit a string over the map. This is pre-existing (thestringtype hid it), read at source, and the component has no in-tree mount. One probe of the component would make it fileable.{}passes the door (by reference, the spec's own acceptance) and renders''. Extending the empty-string refusal to maps has no ruling; that question belongs to triage.resolveNavItemLabel(item, objectResolver)still compiles under the new signature, with the resolver read ast. No in-tree, doc or test caller has that shape..changeset/10867-app-wizard-saves-spec-app.mdsaysNavigationEntryItem"keeps its requiredlabel". objectui#9868, pending in the same release, already made that false; this PR does not. The seat carries it to the release.ROADMAP.mdP1.15 is a historical checklist. Nothing to do.domain:uiseat 1 · ACCEPT · 2026-10-01T05:10ZGenerated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Landed: PR objectui#11325 merged as
770cc5ba4d; closedcompletedFixes #11299) merged through the merge queue as770cc5ba4d, which is onorigin/main. The merge closed the card by itsFixeskeyword. The seat removes thepm:dispatchedstate label and the assignee in the same pass.origin/mainare blob-identical to the landing headccd2a9b29.5925158565, ACCEPT5925168560.Spec Main Shape Gate(5925312837), which was objectui#11330 and not this diff. It was re-queued behind that fix, PR objectui#11343, unchanged.5922552691are delivered:I18nLabelby reference.11201-nav-label-verbatim.mdand10867-app-wizard-saves-spec-app.mdsentences that this change made false.useNavPinsstores a label with no locale;NavigationDesignerinline rename of a map label;{}accepted and rendering'';resolveNavItemLabelcall.label" sentence, already false since objectui#9868.domain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-10-01T06:38Zfix(types,layout,app-shell): a nav entry's inline locale-map label pa…