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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(app-shell): Studio's nav-item inspector shows a locale-map label as "[object Object]", and one keystroke writes a plain string over the whole map #11148
Filing-gate category: ① a product defect with a named site, class (a), loss of authored metadata. reach: a public door, measured. The objectui#11128 dev ran an uncommitted probe at PR objectui#11146's head 9d2fb10d8. It rendered the Studio app pillar's nav-item inspector (StudioNavItemInspector) with label: { en: 'Accounts', 'zh-CN': '客户' }. The Label input showed [object Object], and one keystroke wrote the plain string Customers over the whole map, so the zh-CN text was lost.
Reader: triage first (grade and route), then the seat that dispatches it. Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the ACCEPT of PR objectui#11146 (objectui#11128), from the dev report's out_of_scope_findings[0]. That PR's contract review (5899177331, ③ c) confirmed it at the head, in the same family as objectui#11128, and asked for a sibling card. ⛔ Not graded here.
The site (read at objectui origin/main385ebc5c6, packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx)
StudioNavItemInspector (:1426) reads const curLabel = String(node.label ?? node.title ?? node.name ?? '') (:1464), so a map becomes [object Object]. It also reads title and name, which are not nav-item keys.
The Label input writes patch({ label: e.target.value }), which replaces a map with a string.
The inspector is rendered beside the app designer's canvas in the Studio app pillar. After PR objectui#11146 the canvas keeps a map on rename while this inspector, next to it, still deletes it.
Direction (for triage, not a ruling)
This is objectui#11128's rule, applied to the second editor of the same label:
Display resolves through the spec's resolveI18nLabel(label, locale) in the designer locale.
An edit writes the designer locale's entry of a map and keeps every other entry, using the same key choice as PR objectui#11146's renamedLabel (exact tag, else bare language, else a new exact-tag entry), ideally by sharing that helper so the two editors cannot disagree.
A plain-string label stays a string.
title / name are not read as a label.
Pins: a map label shows the resolved text under en and zh; an edit under zh changes only zh-CN; a plain string edits as today.
Serial: StudioDesignSurface.tsx is also objectui#11136's file (the Interfaces pillar's inspectors), a different component in the same file.
Dedupe
The 1170 most recently updated objectui issues and PRs, open and closed (down to #2231), were grepped:
StudioNavItemInspector: 1 hit, PR objectui#11146 (the source).
Path: studio — a translated label survives an edit | 缺项 (Studio's nav-item inspector shows a locale-map label as [object Object], and one keystroke writes a plain string over the whole map, so every other locale's text is lost) | P2
Triage: first grade — bug · priority:p2 · domain:ui · area:studio · pm:queue. Direction: objectui#11128's rule on the second editor, through the same helper, so the canvas and the inspector cannot disagree
Triage: lands in packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (StudioNavItemInspector) ⇒ domain:ui. It is the sibling objectui#11128's contract review asked for.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-29T23:01Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p2. It takes objectui#11128's grade (p2): the same loss of authored translations, on the second editor of the same label.
It is not p1 because the input shows [object Object] before any keystroke. So the author is told the label is not what was authored.
It is not lower because after PR objectui#11146 the canvas beside it keeps the map, while this inspector still deletes it.
Direction.
Display. The inspector resolves the label through the spec's resolveI18nLabel(label, locale), in the designer locale, the way the canvas does.
Edit. An edit writes only the designer locale's entry of a map and keeps every other entry. A plain-string label stays a string.
It uses PR objectui#11146's renamedLabel (previews/AppNavCanvas.tsx:198, module-private today), moved to one module both editors import.
⛔ No second copy of the key choice (exact tag, else bare language, else a new exact-tag entry).
Keys.title / name are not read as a nav item's label.
Pins:
a map label shows the resolved text under en and under zh;
an edit under zh changes only zh-CN;
a plain string edits as it does today;
PR objectui#11146's canvas pins stay green.
Serial.StudioDesignSurface.tsx is also PR objectui#11152's file (objectui#11136, ACCEPTed and open) and objectui#11153's. They are different components in one file: whichever lands second rebases. The dispatching seat reads PR objectui#11152's state at claim.
Claim: PM loop round 6 — domain:ui execution seat 2
Session: session_011p7ikEivgXefNDaE5S5Uec
Account: os-support-ai (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-11148-nav-inspector-label-map
Worktree: objectui-issue-11148
Domain: domain:ui
Seat: domain:ui#2
File surface (triage 5900721690: objectui#11128's rule on the second editor, through the same helper):
display: curLabel (:1464) resolves through resolveI18nLabel(label, locale) in the designer locale;
edit: patch({ label: e.target.value }) (:1476) writes only the designer locale's entry of a map and keeps every other entry. A plain string stays a string;
title / name are not read as a nav item's label.
packages/app-shell/src/views/metadata-admin/previews/AppNavCanvas.tsx: renamedLabel (:198, module-private) moves to ONE module both editors import. ⛔ No second copy of the key choice.
Pins:
a map label shows the resolved text under en and under zh;
an edit under zh changes only zh-CN;
a plain string edits as today;
PR objectui#11146's canvas pins stay green.
One changeset.
Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier --repo objectstack-ai/objectui over this surface: no path-derived mandate, at objectstack 288611e3)
Clause-②: no
Why no: a Studio editor keeps what the author wrote, and a module-private helper moves to a shared internal module. No schema, prop, type or accepted set moves.
Thread-read: 5900721690
Serial constraints cleared: read 2026-09-29T23:34Z at objectui origin/main3a0e7ab05. PR objectui#11152 (objectui#11136, InterfacesPillar in this file) merged as d71d972ae. PR objectui#11146 (objectui#11128, AppNavCanvas.tsx) merged as 9babfa433. No open PR touches either file. objectui#11153 (pm:queue, the same file's nav deep link) is serial behind this card.
{
"issue": 11148,
"status": "done",
"branch": "claude/issue-11148-nav-inspector-label-map",
"pr": "https://github.com/objectstack-ai/objectui/pull/11157",
"session": "session_011p7ikEivgXefNDaE5S5Uec — subagent of the PM session (parent id, as the claim names it)",
"premise_still_valid": true,
"summary": "StudioNavItemInspector now shows a nav item's I18nLabel resolved in the designer locale (useMetadataLocale) through the spec's resolveI18nLabel, and its Label input writes only the designer locale's entry of a map, keeping every other entry; a plain-string label still edits to a plain string, and title / name are no longer read as the label. renamedLabel moved verbatim out of AppNavCanvas.tsx into one internal module, packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts (not exported from the package root), beside navItemLabelText (the resolve step); the canvas and the inspector both import it, so there is one copy of the key choice. Binding an object keeps a real label as authored and adopts the object's label on a placeholder through renamedLabel (see deviations). Premise verified at origin/main 3a0e7ab05: the String(label ?? title ?? name) read and the patch({ label: e.target.value }) write were present in StudioNavItemInspector, and NavigationItemSchema accepts a map label (safeParse true for { en, zh-CN }). Reach note for the seat: loading a map-labelled app into the Interfaces pillar crashes its left rail before nav-edit mode is reachable (out_of_scope_findings[0]), so today the inspector meets a map in the full pillar only when the map arrives while nav-edit mode is already on (not measured).",
"tests": "At HEAD 575bbb6e6: (1) pnpm exec vitest run packages/app-shell/src/views/studio-design/ packages/app-shell/src/views/metadata-admin/previews/: 'Test Files 153 passed (153)', 'Tests 1505 passed (1505)', VERDICT command-exit 0 (os-verify-lock). (2) pnpm exec vitest run packages/app-shell/src/views/metadata-admin/studio-locale.i18n.test.tsx (the other AppNavCanvas importer's test outside those dirs): 5 passed. (3) New file StudioDesignSurface.navItemInspectorLabelMaps-11148.test.tsx: 8 passed; with the canvas 11128 pins and the 4881 inspector pins: 'Test Files 3 passed (3)', 'Tests 18 passed (18)'. (4) Ablation, one-off, after the fix was committed (575bbb6e6), each leg via objectstack scripts/ablation-replace.mjs in wrap mode under a trap, anchor 1 to 0 and replacement 0 to 1 on disk, blob ef59753464eb: changed: A1 display (curLabel back to String(node.label ?? node.title ?? node.name ?? '')): 4 failed | 4 passed; A2 edit (onChange back to patch({ label: e.target.value })): 3 failed | 5 passed; A3 bind (back to isPlaceholder && obj ? obj.label : curLabel): 1 failed | 7 passed; every restore proven: blob after restore ef59753464eb == HEAD blob, git diff HEAD empty (0 bytes). No build/dist leg: the test imports the subject from source (./StudioDesignSurface), not through a dependency's exports. (5) pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json') exit 0, after pnpm exec turbo run build --filter=@object-ui/app-shell^... --concurrency=2 ('Tasks: 28 successful, 28 total'); tsc -p tsconfig.test.json --listFilesOnly lists both the new test and navItemLabel.ts. (6) eslint on the 4 changed files: exit 0, 0 errors / 20 warnings (--format json count: 4 files); per-rule counts on AppNavCanvas.tsx and StudioDesignSurface.tsx identical at base 3a0e7ab05 and head, both with and without --no-inline-config (with it, both sides carry the same 1 react-hooks/static-components error per file); population = the four changed files inside the @object-ui/app-shell lint target; eslint.config.js sets no parserOptions.project / projectService, so linting is not type-aware and the diff cannot move a verdict on an untouched file. (7) Probe (uncommitted, deleted, tree clean after): real InterfacesPillar with a map-labelled nav item: console.error 'Objects are not valid as a React child (found: object with keys {en, zh-CN})', neither nav button rendered; control leg with a plain-string label: 0 errors, rail renders 'Home'.",
"gates": {
"head": "575bbb6e6",
"vitest studio-design/ + metadata-admin/previews/": "exit 0 · 153 files / 1505 tests passed",
"vitest metadata-admin/studio-locale.i18n.test.tsx": "exit 0 · 5 passed",
"type-check @object-ui/app-shell": "exit 0 (closure built: 28/28 turbo tasks)",
"eslint changed files": "exit 0 · 0 errors · per-rule counts base == head",
"check-changeset-presence": "exit 0 · '1 changeset(s) added'",
"check:control-bytes": "exit 0",
"check:new-line-citations": "exit 0 · 'VERDICT new-cross-file-line-citations: 0 new citation(s)'",
"check:unreferenced-sources": "exit 0",
"check:test-path-roots": "exit 0",
"check:i18n-keys": "exit 0",
"CI": "in_progress — not awaited (CI convergence is the PM's); full pnpm test / pnpm lint farm declared to CI"
},
"line_budget": "n/a — no skills/** or ledgered governed surface touched",
"files_changed": [
".changeset/11148-nav-inspector-label-map.md (new, 11 lines)",
"packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts (new, 53 lines)",
"packages/app-shell/src/views/metadata-admin/previews/AppNavCanvas.tsx (renamedLabel moved out; navLabel over navItemLabelText; header comment)",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (StudioNavItemInspector only)",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.navItemInspectorLabelMaps-11148.test.tsx (new, 170 lines, 8 tests)",
"total: 5 files, +260 / -30, one commit 575bbb6e6"
],
"deviations": [
"Zone 2 item 1 (mechanism assumption) said to keep curLabel's semantics 'on the resolved text' at the object-bind site. Read literally that writes the resolved string over a map label (this card's defect by another door); ablation leg A3 is that literal reading and turns the bind pin red. Implemented instead: a real label is kept as authored; a placeholder adopts the object's label through renamedLabel (plain-string placeholder behaviour unchanged).",
"PR assignee write not made: node /home/user/objectstack/scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11157 --assign os-support-ai was refused by the harness auto-mode classifier ('[External System Writes]') before it ran; no request was sent. Per the role file: stopped, not re-routed; the seat sets the PR assignee os-support-ai.",
"PR #11157 carries labels 'tests' and 'package: app-shell' that this run did not write (objectui labeler.yml); left as found.",
"Zone 2 line addresses re-measured at 3a0e7ab05 matched (StudioNavItemInspector, curLabel read, onChange write, navLabel, renamedLabel); the PR body cites them by content, not by line, per objectui AGENTS.md #11.",
"Container restart mid-run: the first probe run was queued behind another seat's lock and killed (exit 137, 'Terminated' before acquire); re-run after restart through os-verify-lock, results above."
],
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 — (1) POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/fleet-write/dispatch.mjs, relay run 36648751629 (conclusion success) executing POST /repos/objectstack-ai/objectui/pulls (draft PR #11157, body read back byte-identical, 6818 chars, no first differing index); (2) this os-dev-report comment via scripts/pm/post-stamped.mjs. git push (not a REST write): branch created then 3a0e7ab05..575bbb6e6. Refused before sending: label-write --assign (see deviations).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door measured — the Studio Interfaces pillar (real InterfacesPillar, mocked metadata client, the objectui#11136 harness) with navigation [{ id: 'nav_home', type: 'page', label: { en: 'Home', 'zh-CN': '...' }, pageName: 'home' }, a plain Landing page]: React logs 'Objects are not valid as a React child (found: object with keys {en, zh-CN})' and neither nav button renders (the pillar's rail is gone); control leg, same harness with label 'Home': 0 errors, the rail renders 'Home' · evidence: NavTree in StudioDesignSurface.tsx renders node.label raw ('{node.label || surface?.name}', and the group heading '{node.label}'), and resolveSurface in studio-design/navSurface.ts does String(node.label ?? '') into Surface.label, which the canvas title prints as '[object Object]'; NavigationItemSchema accepts the map (safeParse true). Same family as objectui#11128 / this card (a nav item's I18nLabel read as a string in the Studio); severity is a crash, not a mis-read. navSurface.ts is also the nav deep-link file objectui#11153 queues behind this card. Not fixed here: outside the claim's named component (StudioNavItemInspector), and resolveSurface has no locale parameter, so the fix widens a signature the deep-link code reads · dedupe words: 'Objects are not valid as a React child' NavTree; resolveSurface label String; Interfaces pillar rail locale map label; navSurface Surface.label [object Object]",
"carrier: none — comments in AppNavCanvas.tsx, StudioDesignSurface.tsx and nav-selection.ts still name an 'AppNavInspector' component that no longer exists in the tree; noted, not filed (PR Acceptance notes)"
]
}
StudioNavItemInspector shows a nav item's I18nLabel resolved in the designer locale (useMetadataLocale()), through the spec's resolveI18nLabel, the way the canvas does. Its Label input writes only the designer locale's entry of a map, and keeps every other entry. A plain-string label still edits to a plain string. title / name are no longer read as the label
one key choice
PR objectui#11146's renamedLabel moved verbatim (byte-identical body) out of AppNavCanvas.tsx into one internal module, previews/navItemLabel.ts, beside navItemLabelText (the resolve step). The canvas and the inspector both import it. It is not in the package root and has no exports entry
object bind
A real label is kept as authored, and a placeholder adopts the object's label through renamedLabel. This departs from the seat's own Zone-2 wording, whose literal reading writes a resolved string over a map (ablation leg A3). The review (① 5) judged the implemented rule right and inside the card
tests
StudioDesignSurface.navItemInspectorLabelMaps-11148 (8 tests) renders the real exported inspector under I18nProvider. It pins: en and zh display of a map; a zh edit that changes only zh-CN; one new entry, not one per keystroke, through a stateful harness; the plain-string control; title / name not read; a bind that keeps a real map. PR objectui#11146's canvas pins are byte-unchanged and green. Ablation: A1 turns 4 cases red, A2 3, A3 1
changeset
'@object-ui/app-shell': patch; Clause-②: no (no accepted set or export moves; the helper move is internal)
none of the 5 paths is on objectui's governed surfaces
PR assignee
unset. The dev's assignee write was refused by its own permission layer before it was sent. The seat does not re-route a refused write and has surfaced it to the maintainer. No gate reads a PR assignee
Out of scope, one line each:
Studio's Interfaces pillar crashes its nav rail on a locale-map nav-item label: NavTree renders node.label raw, and resolveSurface in navSurface.ts stringifies it. The dev measured this at a public door, through the real InterfacesPillar with a plain-string control. The review confirmed it real at the head, pre-existing and untouched here. filed objectui#11158. Until it lands, this card's fix is reachable end to end only when a map arrives after nav-edit mode is on. objectui#11153 is ordered with it on the same load path.
The dev's note that an AppNavInspector component "no longer exists" is wrong at the head. inspectors/AppNavInspector.tsx exists and is registered in inspectors/index.ts, so the comments naming it are accurate. dropped — the premise is false. The PR body's Acceptance-notes sentence repeating it is inaccurate. The body is not PATCHed: this line is the correction of record.
Activity
objectstack-fleet commentedon Sep 29, 2026
Path: studio — a translated label survives an edit | 缺项 (Studio's nav-item inspector shows a locale-map label as
[object Object], and one keystroke writes a plain string over the whole map, so every other locale's text is lost) | P2Triage: first grade —
bug·priority:p2·domain:ui·area:studio·pm:queue. Direction: objectui#11128's rule on the second editor, through the same helper, so the canvas and the inspector cannot disagreeTriage: lands in
packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx(StudioNavItemInspector) ⇒domain:ui. It is the sibling objectui#11128's contract review asked for.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-29T23:01Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It takes objectui#11128's grade (p2): the same loss of authored translations, on the second editor of the same label.
[object Object]before any keystroke. So the author is told the label is not what was authored.Direction.
resolveI18nLabel(label, locale), in the designer locale, the way the canvas does.renamedLabel(previews/AppNavCanvas.tsx:198, module-private today), moved to one module both editors import.title/nameare not read as a nav item's label.zh-CN;Serial.
StudioDesignSurface.tsxis also PR objectui#11152's file (objectui#11136, ACCEPTed and open) and objectui#11153's. They are different components in one file: whichever lands second rebases. The dispatching seat reads PR objectui#11152's state at claim.objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 6 —
domain:uiexecution seat 2Session:
session_011p7ikEivgXefNDaE5S5UecAccount:
os-support-ai(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11148-nav-inspector-label-mapWorktree:
objectui-issue-11148Domain:
domain:uiSeat:
domain:ui#2File surface (triage
5900721690: objectui#11128's rule on the second editor, through the same helper):packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx,StudioNavItemInspector(:1426):curLabel(:1464) resolves throughresolveI18nLabel(label, locale)in the designer locale;patch({ label: e.target.value })(:1476) writes only the designer locale's entry of a map and keeps every other entry. A plain string stays a string;title/nameare not read as a nav item's label.packages/app-shell/src/views/metadata-admin/previews/AppNavCanvas.tsx:renamedLabel(:198, module-private) moves to ONE module both editors import. ⛔ No second copy of the key choice.zh-CN;Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface: no path-derived mandate, at objectstack288611e3)Clause-②: no
Why no: a Studio editor keeps what the author wrote, and a module-private helper moves to a shared internal module. No schema, prop, type or accepted set moves.
Thread-read: 5900721690
Serial constraints cleared: read 2026-09-29T23:34Z at objectui
origin/main3a0e7ab05. PR objectui#11152 (objectui#11136,InterfacesPillarin this file) merged asd71d972ae. PR objectui#11146 (objectui#11128,AppNavCanvas.tsx) merged as9babfa433. No open PR touches either file. objectui#11153 (pm:queue, the same file's nav deep link) is serial behind this card.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
os-dev-report
{ "issue": 11148, "status": "done", "branch": "claude/issue-11148-nav-inspector-label-map", "pr": "https://github.com/objectstack-ai/objectui/pull/11157", "session": "session_011p7ikEivgXefNDaE5S5Uec — subagent of the PM session (parent id, as the claim names it)", "premise_still_valid": true, "summary": "StudioNavItemInspector now shows a nav item's I18nLabel resolved in the designer locale (useMetadataLocale) through the spec's resolveI18nLabel, and its Label input writes only the designer locale's entry of a map, keeping every other entry; a plain-string label still edits to a plain string, and title / name are no longer read as the label. renamedLabel moved verbatim out of AppNavCanvas.tsx into one internal module, packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts (not exported from the package root), beside navItemLabelText (the resolve step); the canvas and the inspector both import it, so there is one copy of the key choice. Binding an object keeps a real label as authored and adopts the object's label on a placeholder through renamedLabel (see deviations). Premise verified at origin/main 3a0e7ab05: the String(label ?? title ?? name) read and the patch({ label: e.target.value }) write were present in StudioNavItemInspector, and NavigationItemSchema accepts a map label (safeParse true for { en, zh-CN }). Reach note for the seat: loading a map-labelled app into the Interfaces pillar crashes its left rail before nav-edit mode is reachable (out_of_scope_findings[0]), so today the inspector meets a map in the full pillar only when the map arrives while nav-edit mode is already on (not measured).", "tests": "At HEAD 575bbb6e6: (1) pnpm exec vitest run packages/app-shell/src/views/studio-design/ packages/app-shell/src/views/metadata-admin/previews/: 'Test Files 153 passed (153)', 'Tests 1505 passed (1505)', VERDICT command-exit 0 (os-verify-lock). (2) pnpm exec vitest run packages/app-shell/src/views/metadata-admin/studio-locale.i18n.test.tsx (the other AppNavCanvas importer's test outside those dirs): 5 passed. (3) New file StudioDesignSurface.navItemInspectorLabelMaps-11148.test.tsx: 8 passed; with the canvas 11128 pins and the 4881 inspector pins: 'Test Files 3 passed (3)', 'Tests 18 passed (18)'. (4) Ablation, one-off, after the fix was committed (575bbb6e6), each leg via objectstack scripts/ablation-replace.mjs in wrap mode under a trap, anchor 1 to 0 and replacement 0 to 1 on disk, blob ef59753464eb: changed: A1 display (curLabel back to String(node.label ?? node.title ?? node.name ?? '')): 4 failed | 4 passed; A2 edit (onChange back to patch({ label: e.target.value })): 3 failed | 5 passed; A3 bind (back to isPlaceholder && obj ? obj.label : curLabel): 1 failed | 7 passed; every restore proven: blob after restore ef59753464eb == HEAD blob, git diff HEAD empty (0 bytes). No build/dist leg: the test imports the subject from source (./StudioDesignSurface), not through a dependency's exports. (5) pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json') exit 0, after pnpm exec turbo run build --filter=@object-ui/app-shell^... --concurrency=2 ('Tasks: 28 successful, 28 total'); tsc -p tsconfig.test.json --listFilesOnly lists both the new test and navItemLabel.ts. (6) eslint on the 4 changed files: exit 0, 0 errors / 20 warnings (--format json count: 4 files); per-rule counts on AppNavCanvas.tsx and StudioDesignSurface.tsx identical at base 3a0e7ab05 and head, both with and without --no-inline-config (with it, both sides carry the same 1 react-hooks/static-components error per file); population = the four changed files inside the @object-ui/app-shell lint target; eslint.config.js sets no parserOptions.project / projectService, so linting is not type-aware and the diff cannot move a verdict on an untouched file. (7) Probe (uncommitted, deleted, tree clean after): real InterfacesPillar with a map-labelled nav item: console.error 'Objects are not valid as a React child (found: object with keys {en, zh-CN})', neither nav button rendered; control leg with a plain-string label: 0 errors, rail renders 'Home'.", "gates": { "head": "575bbb6e6", "vitest studio-design/ + metadata-admin/previews/": "exit 0 · 153 files / 1505 tests passed", "vitest metadata-admin/studio-locale.i18n.test.tsx": "exit 0 · 5 passed", "type-check @object-ui/app-shell": "exit 0 (closure built: 28/28 turbo tasks)", "eslint changed files": "exit 0 · 0 errors · per-rule counts base == head", "check-changeset-presence": "exit 0 · '1 changeset(s) added'", "check:control-bytes": "exit 0", "check:new-line-citations": "exit 0 · 'VERDICT new-cross-file-line-citations: 0 new citation(s)'", "check:unreferenced-sources": "exit 0", "check:test-path-roots": "exit 0", "check:i18n-keys": "exit 0", "CI": "in_progress — not awaited (CI convergence is the PM's); full pnpm test / pnpm lint farm declared to CI" }, "line_budget": "n/a — no skills/** or ledgered governed surface touched", "files_changed": [ ".changeset/11148-nav-inspector-label-map.md (new, 11 lines)", "packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts (new, 53 lines)", "packages/app-shell/src/views/metadata-admin/previews/AppNavCanvas.tsx (renamedLabel moved out; navLabel over navItemLabelText; header comment)", "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (StudioNavItemInspector only)", "packages/app-shell/src/views/studio-design/StudioDesignSurface.navItemInspectorLabelMaps-11148.test.tsx (new, 170 lines, 8 tests)", "total: 5 files, +260 / -30, one commit 575bbb6e6" ], "deviations": [ "Zone 2 item 1 (mechanism assumption) said to keep curLabel's semantics 'on the resolved text' at the object-bind site. Read literally that writes the resolved string over a map label (this card's defect by another door); ablation leg A3 is that literal reading and turns the bind pin red. Implemented instead: a real label is kept as authored; a placeholder adopts the object's label through renamedLabel (plain-string placeholder behaviour unchanged).", "PR assignee write not made: node /home/user/objectstack/scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11157 --assign os-support-ai was refused by the harness auto-mode classifier ('[External System Writes]') before it ran; no request was sent. Per the role file: stopped, not re-routed; the seat sets the PR assignee os-support-ai.", "PR #11157 carries labels 'tests' and 'package: app-shell' that this run did not write (objectui labeler.yml); left as found.", "Zone 2 line addresses re-measured at 3a0e7ab05 matched (StudioNavItemInspector, curLabel read, onChange write, navLabel, renamedLabel); the PR body cites them by content, not by line, per objectui AGENTS.md #11.", "Container restart mid-run: the first probe run was queued behind another seat's lock and killed (exit 137, 'Terminated' before acquire); re-run after restart through os-verify-lock, results above." ], "mcp_calls": "0 — no MCP GitHub tool called", "api_writes": "2 — (1) POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/fleet-write/dispatch.mjs, relay run 36648751629 (conclusion success) executing POST /repos/objectstack-ai/objectui/pulls (draft PR #11157, body read back byte-identical, 6818 chars, no first differing index); (2) this os-dev-report comment via scripts/pm/post-stamped.mjs. git push (not a REST write): branch created then 3a0e7ab05..575bbb6e6. Refused before sending: label-write --assign (see deviations).", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door measured — the Studio Interfaces pillar (real InterfacesPillar, mocked metadata client, the objectui#11136 harness) with navigation [{ id: 'nav_home', type: 'page', label: { en: 'Home', 'zh-CN': '...' }, pageName: 'home' }, a plain Landing page]: React logs 'Objects are not valid as a React child (found: object with keys {en, zh-CN})' and neither nav button renders (the pillar's rail is gone); control leg, same harness with label 'Home': 0 errors, the rail renders 'Home' · evidence: NavTree in StudioDesignSurface.tsx renders node.label raw ('{node.label || surface?.name}', and the group heading '{node.label}'), and resolveSurface in studio-design/navSurface.ts does String(node.label ?? '') into Surface.label, which the canvas title prints as '[object Object]'; NavigationItemSchema accepts the map (safeParse true). Same family as objectui#11128 / this card (a nav item's I18nLabel read as a string in the Studio); severity is a crash, not a mis-read. navSurface.ts is also the nav deep-link file objectui#11153 queues behind this card. Not fixed here: outside the claim's named component (StudioNavItemInspector), and resolveSurface has no locale parameter, so the fix widens a signature the deep-link code reads · dedupe words: 'Objects are not valid as a React child' NavTree; resolveSurface label String; Interfaces pillar rail locale map label; navSurface Surface.label [object Object]", "carrier: none — comments in AppNavCanvas.tsx, StudioDesignSurface.tsx and nav-selection.ts still name an 'AppNavInspector' component that no longer exists in the tree; noted, not filed (PR Acceptance notes)" ] }objectstack-fleet commentedon Sep 30, 2026
✅ ACCEPT: PR objectui#11157 at
575bbb6e6; ready and auto-merge follow this ACCEPTdomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec. Checked against the diff and the head's check-runs, not against the report's own account.5901098091, on triage5900721690.5901455875.5901615510, atCONTRACT_REVIEW_TIER: PASS on this head.StudioNavItemInspectorshows a nav item'sI18nLabelresolved in the designer locale (useMetadataLocale()), through the spec'sresolveI18nLabel, the way the canvas does. Its Label input writes only the designer locale's entry of a map, and keeps every other entry. A plain-string label still edits to a plain string.title/nameare no longer read as the labelrenamedLabelmoved verbatim (byte-identical body) out ofAppNavCanvas.tsxinto one internal module,previews/navItemLabel.ts, besidenavItemLabelText(the resolve step). The canvas and the inspector both import it. It is not in the package root and has noexportsentryrenamedLabel. This departs from the seat's own Zone-2 wording, whose literal reading writes a resolved string over a map (ablation leg A3). The review (① 5) judged the implemented rule right and inside the cardStudioDesignSurface.navItemInspectorLabelMaps-11148(8 tests) renders the real exported inspector underI18nProvider. It pins: en and zh display of a map; a zh edit that changes onlyzh-CN; one new entry, not one per keystroke, through a stateful harness; the plain-string control;title/namenot read; a bind that keeps a real map. PR objectui#11146's canvas pins are byte-unchanged and green. Ablation: A1 turns 4 cases red, A2 3, A3 1'@object-ui/app-shell': patch;Clause-②: no(no accepted set or export moves; the helper move is internal)575bbb6e6: 43 runs, 40 success, 3 expected skips, 0 failureFixes #11148onlyOut of scope, one line each:
NavTreerendersnode.labelraw, andresolveSurfaceinnavSurface.tsstringifies it. The dev measured this at a public door, through the realInterfacesPillarwith a plain-string control. The review confirmed it real at the head, pre-existing and untouched here. filed objectui#11158. Until it lands, this card's fix is reachable end to end only when a map arrives after nav-edit mode is on. objectui#11153 is ordered with it on the same load path.AppNavInspectorcomponent "no longer exists" is wrong at the head.inspectors/AppNavInspector.tsxexists and is registered ininspectors/index.ts, so the comments naming it are accurate. dropped — the premise is false. The PR body's Acceptance-notes sentence repeating it is inaccurate. The body is not PATCHed: this line is the correction of record.domain:uiseat 2 · ACCEPT · 2026-09-30T00:28ZGenerated by Claude Code
fix(app-shell): Studio's nav-item inspector shows a locale-map label …