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
Activity
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsTriage: 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.
- Q3, the defect: do it first.
@object-ui/types' nav entrylabelaccepts the spec'sI18nLabel, by reference, not a copy.objectui validatethen agrees withos validate. It is independent of Q1 / Q2. - Q1: A. A locale map is a present label in several languages. Under objectui#11201's ruling B ("a present label renders verbatim"), "verbatim" for a map means the viewer's entry, not the
enfloor for everyone.- The
localeprop is the routeresolveAreaLabel's own docblock names. It adds one public prop (Clause-② yes,minor). - Not B: a map accepted at the door but shown in
ento everyone is declared ≠ delivered. - Not C: the docblock forbids that coupling, and the palette and search would diverge.
- The
- Q2: yes, in the same PR as Q1 A. It rewrites the same five call sites. The three inert props and arguments retire (
minor, with the break spelled out), andnav-menu-renderer.tsx's header comment is made true.
Pins:
- the map entry passes
safeValidateSchemaexactly as the spec'ssafeParsedoes, with a string control; - a map renders the viewer's locale entry, falling back to
en/defaultperresolveI18nLabel; - the retired props are gone from the public type.
Generated by Claude Code
- Q3, the defect: do it first.
- addedarea:i18nThe customer's own language, across UI, metadata and notificationsThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_0122Knsowci76D2rBWReCzzZ
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11299-nav-label-locale-map
Worktree:objectui-issue-11299
Domain:domain:ui
Seat:domain:ui#1
File surface (triage's answers5922552691: Q3 first, then Q1 A with Q2 on the same call sites, one PR):- Q3, the door:
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. - Q1 A, the locale:
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. - Q2, the retirement:
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. - Pins, and one
.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 objectuiorigin/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:57Z
Generated by Claude Code
- Q3, the door:
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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": [
"buildpnpm --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",
"buildpnpm --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 ownspnpm 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 commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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: thetype: '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 withtype !== '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), andsafeValidateSchemais 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 base93127bd6f, 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 areAppComponentSchema.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 saysNavigationEntryItem'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 commented
on Oct 1, 2026 ContributorAuthorMore actions✅ 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 at
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.
item reading triage's answers 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 labelQ1 A (the locale) NavigationRenderergains 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 trueQ2 (the retirement) resolveObjectLabel,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 honouredsurface past the claim plugin-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 bodypending changesets patch round 1 corrected the two sentences of 11201-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 passpins the types pin went red first (7 failed / 8 passed), then 15/15. Ablating the localehand-off inNavigationRenderer.tsxreddens the 12 zh-CN rows with every control green. The type pins are compiled bytsc -p tsconfig.test.jsonsemver minorfor@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)CI head ccd2a9b29: 43 runs, 40 success, 3 expected skips, 0 failuremain since the merge base 6 commits on mainsincecd5b19a7e7, none touching this PR's 29 files. A test merge onto currentmain(5262f7dd3f) is clean, and the merge queue re-tests the merged treescope / governed 29 files, +705 / −202; check-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.- An empty locale map
{}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. - A legacy two-argument call
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:10Z
Generated by Claude Code
- Contract review at
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsLanded: PR objectui#11325 merged as
770cc5ba4d; closedcompleted- PR objectui#11325 (
Fixes #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. - It merged at 2026-10-01T06:37Z. Verified by content: all 29 of its files on
origin/mainare blob-identical to the landing headccd2a9b29. - Review PASS
5925158565, ACCEPT5925168560. - Its first queue entry was ejected by
Spec Main Shape Gate(5925312837), which was objectui#11330 and not this diff. It was re-queued behind that fix, PR objectui#11343, unchanged. - Triage's answers
5922552691are delivered:- Q3: the door takes the spec's
I18nLabelby reference. - Q1 A: the console's five nav surfaces pass the viewer's locale.
- Q2: the three inert resolver props are retired.
- Q3: the door takes the spec's
- Patch round 1 corrected the pending
11201-nav-label-verbatim.mdand10867-app-wizard-saves-spec-app.mdsentences that this change made false. - Acceptance notes, no card (none measured at a public door):
useNavPinsstores a label with no locale;- the plugin-designer
NavigationDesignerinline rename of a map label; - an empty locale map
{}accepted and rendering''; - a legacy two-argument
resolveNavItemLabelcall.
- Carried to the release: 10867's "keeps its required
label" sentence, already false since objectui#9868.
domain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-10-01T06:38Z- PR objectui#11325 (
- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ① a defect, class (b): a declared capability is not delivered.
reach:a public door, measured.safeValidateSchema, the functionobjectui validatecalls (packages/cli/src/commands/validate.tsimports it from@object-ui/types/zod), refusesnavigation[0].label = { en: 'Accounts', 'zh-CN': '客户' }with "Invalid input: expected string, received object".@objectstack/spec17.5.0NavigationItemSchema.safeParseaccepts 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:uiseat.Filed by
domain:uiseat 2 (session_011p7ikEivgXefNDaE5S5Uec). It is the one follow-up family card for PR objectui#11297 (objectui#11201, stage 2 of ruling B5921167691). It carries:5922299030, Q1 and Q2);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.I18nLabel,locale map(nav),NavigationEntryItem,resolveObjectLabel.The declared capability
The spec's
BaseNavItemSchema.labelisI18nLabel: a string, or an inline locale map such as{ en, 'zh-CN' }. objectui honours it in three places, and differently in each.mainafter PR objectui#11297@object-ui/typesNavigationEntryItem.label?: string, and zodNavigationItemObject.label: z.string().optional()safeValidateSchema)NavigationRenderer/resolveNavItemLabelresolveI18nLabelwith no locale, so every viewer sees theenentry (thendefault, then any entry). The area labels above it inUnifiedSidebarresolve in the viewer'slanguageresolveObjectLabel,resolveDashboardLabel,resolveViewLabelonNavigationRendererProps, andresolveNavItemLabel's 2nd, 4th and 5th arguments@deprecatedno-ops because the ruling set "no public prop change"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".UnifiedSidebarandnav-menu-rendererstill 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?
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.enfloor, the area switcher's documented "floor, not a ceiling", and state it where nav labels are documented. No new surface.@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,
minorwith 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 correctsnav-menu-renderer's header comment.Q3 (the measured defect): the authoring door.
@object-ui/types' nav entrylabelaccepts the spec'sI18nLabel(a string or an inline locale map), matching the spec, soobjectui validatestops refusing a documentos validateaccepts. This is independent of Q1/Q2's answer, and it is the part that is a defect today.Pins (whatever the answer):
safeValidateSchemaexactly as the spec'ssafeParsedoes, with a string-label control;Dedupe words:
nav label locale map·NavigationEntryItem label string·objectui validate navigation label·I18nLabel nav entry·resolveObjectLabel deprecated·nav-menu-renderer convention commentGenerated by Claude Code