Repository navigation
[finding] app branding.logo is authored by the designer and documented, but no mounted component renders it since AppSidebar (never mounted) was removed #10827
Description
Filing gate: ① a declared key with measured producers and no runtime reader (ADR-0049 enforce-or-remove; the direction is ENFORCE per objectstack triage).
reach:named producers on objectuimainfb91ac9b0:packages/plugin-designer/src/AppCreationWizard.tsx:616writesbranding.logo(value={branding.logo ?? ''}). Per objectstack#20146, plugin-designer'sBrandingEditoralso writes it with a preview, andEditAppPagepre-fills it;- downstream,
objectstack-ai/hotcrm'scrm.app.tssets it, as objectstack#20146 records; - the published
@object-ui/app-shellCHANGELOG tells authors to setbranding.logoon the app schema.
- Rendered by nothing that ships.
AppSidebar.tsx, never mounted, was the only component that read it, and PR refactor(app-shell)!: remove the unmounted AppSidebar (objectui#5817) #10617 (RemoveAppSidebarfrom@object-ui/app-shellonce the deprecation window closes (follow-up to #5720) #5817) removed it. The console rendersUnifiedSidebar.AppSchemaRendererreads a top-levellogo, notbranding.logo.wizardDraftToAppSchema(packages/types/src/app.ts) copies a wizard draft'sbranding.logointo that top-levellogo, so only a wizard-authored logo can surface, and only in anAppSchemaRendererhost.- This seat re-read the removal on
main(AppSidebar.tsxis absent atfb91ac9b0) and the wizard write above. It did not re-run the full reader census; that comes from objectstack#20146's contract-reviewed table.
Carrier for the objectstack ledger row app.branding.logo (packages/spec/liveness/app.json). That row moves to planned and names this card, in the objectstack#20146 PR. Filed by the objectstack domain:spec execution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post objectstack#6017), as objectstack#20146's triage grade (5832699195) directs: 「the claiming seat files that card in objectui with a back-link」. ⛔ Filed bare: routing and grading belong to objectui triage. ⛔ Not a claim.
What the fix is (for the dispatch to confirm)
- A mounted component renders the app's
branding.logo:UnifiedSidebar's header orAppShell's branding (useAppShellBranding, which already carriesprimaryColorfromConsoleLayout). - When it lands, the objectstack ledger row flips
planned→live, citing this reader at the.objectui-shapin that carries it. - Spelling: objectstack's
AppSchemadeclares onlybranding.logo. A top-levellogoon an app is REFUSED:AppSchema.safeParseanswersunrecognized_keyswith a did-you-meanlogo → branding(packages/spec/src/ui/app.zod.ts, the suggestion table). No conversion rewrites it. Sobranding.logois the one spelling. (Corrected 2026-09-27 from this card's first text, which said the key "folds into"branding. The objectstack#20146 dev measured it; see PR objectstack#20302.) The dispatch measures whether objectui'sAppSchemaRenderertop-levellogoread should move tobranding.logo.
Dedupe
A local scan of every open and recently closed objectui issue and PR for branding.logo|branding?.logo|AppSidebar…logo|logo…(UnifiedSidebar|AppShell) finds 1 hit: PR #10617 (the removal), which carries no renderer.
Activity
objectstack-fleet commentedon Sep 27, 2026
Path: changing a running app without code | 缺项 (no item sets
branding.logoin the designer and looks for it in the running app) | P1Triage: first grade —
bug·priority:p2·domain:ui·area:studio·pm:queue. Direction: ENFORCE (render it)Triage: lands in the console's mounted chrome:
UnifiedSidebar's header orAppShell's branding (useAppShellBranding) ⇒domain:ui. Rationale: the key is authored and documented, and nothing that ships renders it.AppCreationWizardandBrandingEditorwritebranding.logo, the latter with a preview, and hotcrm sets it.@object-ui/app-shellCHANGELOG tells authors to set it.AppSidebar, was removed by PR refactor(app-shell)!: remove the unmounted AppSidebar (objectui#5817) #10617.An author who sets a logo in the designer sees it in the preview and never in the running app. That is on the road, and it runs but is wrong ⇒ p2 (priority rule 2). The ENFORCE direction is objectstack#20146's triage grade (
5832699195), and mainstream app builders all render an app logo.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T19:14Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments) and objectstack#20146 (pm:dispatched; it moves the ledger rowapp.branding.logotoplanned, naming this card).Execution notes.
branding.logoin the mounted chrome, beside theprimaryColorthatuseAppShellBrandingalready carries fromConsoleLayout. A missing logo keeps today's fallback, which is the control.AppSchemadeclares onlybranding.logo, and a top-levellogofolds into it through the alias table. MoveAppSchemaRenderer's top-levellogoread tobranding.logo, and makewizardDraftToAppSchemastop copying into the top-level key. If a measured writer of top-levellogoexists outside the wizard, stop and report it here.branding.logoshows it, and one without shows the fallback..objectui-shapin, the objectstack ledger row flipsplanned→live, citing this reader. Post the back-link on objectstack#20146.objectstack-fleet commentedon Sep 27, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 4Session:
session_01MCg3z5cGrV51xEddpGcxEYAccount:
os-litantBranch:
claude/issue-10827-render-app-branding-logoWorktree:
objectui-issue-10827Domain:
domain:uiSeat:
domain:ui#4File surface:
branding.logo:packages/app-shell/src/layout/UnifiedSidebar.tsx(its header) and/orpackages/layout/src/AppShell.tsx(useAppShellBranding), with theConsoleLayout.tsxhand-off that already carriesprimaryColor;packages/layout/src/AppSchemaRenderer.tsx(its top-levellogoread moves tobranding.logo) andpackages/types/src/app.ts(wizardDraftToAppSchemastops copying into a top-levellogo; the type's top-levellogo, if declared, per the triage's direction);.changeset/10827-…mdfor each touched package.⛔ Not
plugin-designer'sBrandingEditor/AppCreationWizard(writers, already right). ⛔ Not the objectstack ledger row (it flips at a later.objectui-shapin). Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT,scripts/pm/dispatch-gates.mjs:12534on objectstack17bd3187;--tierrefuses objectui paths).Clause-②: no
Thread-read: 5858929399
Serial constraints cleared: open-PR file lists read 2026-09-27T19:32Z at objectui
origin/main8eaa1a0(12 open PRs): none touchespackages/layout/src/,app-shell/src/layout/,types/src/app.tsorplugin-designer. No in-flight lane claim names these files (the 12pm:dispatchedcards' newest claims checked).Clause-②: no: a declared key (branding.logo) gains its reader, and the alias spelling (top-levellogo) stops being read or written. That narrows and does not widen: no accept set grows and no export is added.Generated by Claude Code
objectstack-fleet commentedon Sep 27, 2026
os-dev-report
{ "issue": 10827, "status": "done", "branch": "claude/issue-10827-render-app-branding-logo", "pr": "https://github.com/objectstack-ai/objectui/pull/10849", "session": "session_01MCg3z5cGrV51xEddpGcxEY — this run's harness-stamped id (subagent: the parent's; the same id the fleet relay derived from the container)", "premise_still_valid": true, "summary": "The premise holds: `branding.logo` is authored by the designer, but nothing mounted in the console drew it. UnifiedSidebar (mounted by ConsoleLayout) now reads the active app's `branding.logo` and draws it as a header image, with the app label as alt text. It does this in app context only. With no logo there is no header, so the sidebar is unchanged (the control). One spelling: `AppComponentSchema.logo` is now `never` (TS) and an aliasKeyRefusal on the zod mirror ('Did you mean `logo` → `branding`?', the spec's own answer). wizardDraftToAppSchema no longer copies the logo to the top level. AppSchemaRenderer and the runner's LayoutRenderer read `branding.logo` as an image URL, including relative paths and data: URIs, and take an icon name from `icon`. The docs example in app-schema.mdx moved to `branding: { logo }`. Route change (B3 falsified): the logo is NOT added back to AppShellBranding. objectui#4818's maintainer ruling removed AppShellBranding.logo (shipped in 17.6.0) and rejected the 'AppShell branding context' option; the single logo path is the app schema's branding.logo, read directly by the sidebar. So the route is the claim's other option, the UnifiedSidebar header, and AppShell.tsx and ConsoleLayout.tsx are untouched. Census stop gate clear: there is one production writer of a top-level app `logo` (the wizard, removed) and no icon-name writer on AppComponentSchema. Card nuance: the spec's alias table REFUSES a top-level logo (unrecognized_keys with a pointer to branding); it does not fold it.", "tests": "All at HEAD 6ea8f67. New pins, each red on the defect: (1) ConsoleLayout.appBrandingLogo-10827.test.tsx mounts the real ConsoleLayout, AppShell and UnifiedSidebar under the real NavigationProvider. Cases: branded app shows its img, named by its label; CONTROL no-logo app has no img; top-level-only logo shows nothing; the active app wins over the first; Home shows no logo. (2) AppSchemaRenderer.brandingLogo-10827: relative, absolute and data URIs drawn; CONTROL shows FileText and no img; the alias is drawn neither as img nor as icon name. (3) runner LayoutRenderer.brandingLogo-10827: the same, with the Box control. (4) types app-logo-one-spelling-10827: invalid_type at path logo for every value; @ts-expect-error on the TS face; wizard output has no logo key and parses green; spec controls. Suites: `pnpm exec vitest run --maxWorkers=2 packages/types/ packages/layout/ packages/runner/` → 'Test Files 282 passed (282) / Tests 5682 passed (5682)'. `pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/layout/ packages/app-shell/src/__tests__/` → 'Test Files 48 passed (48) / Tests 626 passed (626)'. `pnpm --workspace-concurrency=2 --filter @object-ui/types --filter @object-ui/layout --filter @object-ui/app-shell --filter @object-ui/runner run type-check` → all four scripts echoed ('packages/X type-check$ tsc --noEmit && ... tsc -p tsconfig.test.json') and Done, exit 0. It ran after `turbo run build --filter=@object-ui/app-shell^... --filter=@object-ui/runner^...` ('Tasks: 28 successful, 28 total'), and --listFiles shows each new test inside its tsconfig.test.json. REVERSE VERIFICATION: a temp runner/src probe `{ type:'app', logo:'/x.svg' }` made runner tsc exit 2 with TS2322 ('string' not assignable to 'undefined'), which proves the runner reads the rebuilt dist/app.d.ts. The probe was removed and the tree is clean. ABLATION (committed first, objectstack scripts/ablation-replace.mjs in WRAP mode): UnifiedSidebar anchor 'activeApp?.branding?.logo : undefined;' became 'activeApp?.logo : undefined;', anchor 1→0, blob 0ef580a5b1b1→0b4febdb08ed. The console pin went '3 failed | 2 passed (5)': the branded, alias and active-app cases went red and the CONTROL and Home cases stayed green, the expected direction. Restore via git checkout HEAD -- ABS_PATH: blob == HEAD 0ef580a5b1b1, git diff HEAD empty. Vitest resolves the subject through a relative import to src, so no dist was involved. DOCS CONTROL: the app-schema.mdx example was reverted to a top-level logo, and check:doc-snippets failed with 'content/docs/core/app-schema.mdx … TS2322', '678 of 678 block(s) judged, 1 failed'. The restore was proven the same way. At HEAD: '678 of 678 block(s) judged, 0 failed'. NOT MEASURED: the rest of packages/app-shell (the whole-package run exceeded the 590s foreground cap and was killed, exit 124; it is declared to CI). Browser rendering is also not measured.", "gates": [ { "cmd": "node scripts/check-changeset-presence.mjs", "exit": 0, "verdict": "✅ 12 source file(s) of 4 released package(s) changed, and this change declares 1 changeset(s): .changeset/10827-app-branding-logo-one-spelling.md." }, { "cmd": "node scripts/check-changeset-fixed.mjs", "exit": 0, "verdict": "✅ privatePackages declared: version=true, tag=false." }, { "cmd": "node scripts/check-changeset-no-major.mjs", "exit": 0, "verdict": "✅ No changeset declares a `major` bump." }, { "cmd": "node scripts/check-changeset-overwrite.mjs", "exit": 0, "verdict": "✅ No pre-existing changeset was modified or deleted." }, { "cmd": "pnpm check:changeset-claims", "exit": 0, "verdict": "12 pending changeset(s) describe a file this change touches (report-only); each paragraph read, none speaks of the app logo, none falsified" }, { "cmd": "pnpm check:pending-changeset-literals", "exit": 0, "verdict": "✅ No test source names a pending changeset." }, { "cmd": "pnpm check:new-line-citations", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0" }, { "cmd": "pnpm check:control-bytes", "exit": 0, "verdict": "✅ check-control-bytes: OK (scanned 9054 tracked text file(s); skipped 85 binary)." }, { "cmd": "pnpm check:vi-mock-specifiers", "exit": 0, "verdict": "✅ check-vi-mock-specifiers: OK" }, { "cmd": "pnpm check:vi-mock-inherit", "exit": 0, "verdict": "✅ check-vi-mock-inherit: OK" }, { "cmd": "pnpm check:vi-mock-override-shape", "exit": 0, "verdict": "✅ check-vi-mock-override-shape: OK" }, { "cmd": "pnpm check:test-path-roots", "exit": 0, "verdict": "✅ check-test-path-roots: OK" }, { "cmd": "pnpm check:doc-snippets", "exit": 0, "verdict": "Every covered documentation snippet compiles against the built types. (678 of 678 block(s) judged, 0 failed)" }, { "cmd": "pnpm check:doc-examples", "exit": 0, "verdict": "Every covered `@example` compiles, or fails exactly as its ledger row declares." }, { "cmd": "pnpm check:doc-types", "exit": 0, "verdict": "✅ Every documented component type is registered." }, { "cmd": "pnpm check:doc-fences", "exit": 0, "verdict": "✅ check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript" }, { "cmd": "pnpm check:doc-example-ids", "exit": 0, "verdict": "✅ 414 real reference(s) all resolve in the catalog registry." }, { "cmd": "node scripts/check-doc-expression-carriage.mjs", "exit": 0, "verdict": "✅ Controls pass; ✅ Blind spot: none (report-only)" }, { "cmd": "pnpm docs:check-links", "exit": 0, "verdict": "Links are valid across 17 scan roots." }, { "cmd": "pnpm check:i18n-keys", "exit": 0, "verdict": "Every in-scope call-site key resolves against the en pack (3040 keys)" }, { "cmd": "pnpm check:spec-symbols", "exit": 0, "verdict": "exit 0 (standing excluded-by-name notice only)" }, { "cmd": "pnpm check:unreferenced-sources", "exit": 0, "verdict": "OK Every shipped source file in every covered package is reachable." }, { "cmd": "node scripts/check-governed-queue-guard.mjs --test (15 paths)", "exit": 0, "verdict": "✅ NOT GOVERNED — 15 path(s) checked against 5 governed surface(s); none matched." }, { "cmd": "type-check x4 (types, layout, app-shell, runner)", "exit": 0, "verdict": "each 'type-check: Done'" }, { "cmd": "lint narrowed: pnpm exec eslint --format json (12 touched .ts/.tsx)", "exit": 0, "verdict": "files linted 12, errors 0, warnings 18, 0 warnings on added lines. Population: every package lint is `eslint .`, and the rule objects match **/*.{ts,tsx}. Invariance: no parserOptions.project/projectService (not type-aware), and no custom rule reads the disk." } ], "gates_head": "6ea8f67", "line_budget": "n/a — no skills/** touched", "files_changed": [ ".changeset/10827-app-branding-logo-one-spelling.md", "content/docs/core/app-schema.mdx", "content/docs/guide/console-architecture.md", "packages/app-shell/src/layout/UnifiedSidebar.tsx", "packages/app-shell/src/layout/__tests__/ConsoleLayout.appBrandingLogo-10827.test.tsx", "packages/layout/src/AppSchemaRenderer.tsx", "packages/layout/src/__tests__/AppSchemaRenderer.brandingLogo-10827.test.tsx", "packages/runner/src/LayoutRenderer.tsx", "packages/runner/src/__tests__/LayoutRenderer.brandingLogo-10827.test.tsx", "packages/types/src/__tests__/app-creation-types.test.ts", "packages/types/src/__tests__/app-logo-one-spelling-10827.test.ts", "packages/types/src/__tests__/page-app-dashboard-spec-parity.test.ts", "packages/types/src/__tests__/phase2-schemas.test.ts", "packages/types/src/app.ts", "packages/types/src/zod/app.zod.ts" ], "deviations": [ "ROUTE (Zone 2 B3 falsified; Zone 1 wording read, conflict named): the logo is not routed through AppShellBranding. objectui#4818 (maintainer ruling, 'not re-litigable') removed AppShellBranding.logo and rejected the 'AppShell branding context for sidebar/navbar' option; 17.6.0 shipped that removal. The render is in the UnifiedSidebar header, the claim's other named option. packages/layout/src/AppShell.tsx and packages/app-shell/src/layout/ConsoleLayout.tsx are unchanged. If the seat reads Zone 1's 'beside the primaryColor that useAppShellBranding already carries' as binding on the carrier, that conflicts with #4818 and needs the maintainer.", "FILE SURFACE beyond the claim: packages/runner/src/LayoutRenderer.tsx and its new test. This was forced: with logo?: never, `app.logo.includes(...)` is a tsc error. Same defect class, no open PR holds it, same gate family. Also packages/types/src/zod/app.zod.ts, the same type's mirror face, with a refusal arm so the retirement is loud under .passthrough(). Docs: app-schema.mdx and console-architecture.md (Zone 3). The claim's Clause-② rationale is unchanged (narrowing only).", "B2 measured differently: at base the header's fallback icon was NOT on `icon`. AppSchemaRenderer used resolveIcon(schema.logo), which gives FileText when absent, and the runner drew an icon from logo or else Box. Both now take the icon name from `icon`. With no icon the fallback is unchanged: FileText or Box.", "REFUSED COMMANDS: (a) `node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectui --actions-file .../10827-actions-pr.json --json` → exit 10 'write-pace: REFUSED — 40 write(s) by this token in the trailing hour is the budget (40)'. Nothing was written; it was re-run after write-pace --status read 'the next write may go' and succeeded. (b) `node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 10849 --assign os-litant` → exit 10, the same write-pace refusal; re-run after the window reopened, and the read-back MATCHES.", "NOT A MEASUREMENT: running a scratch copy of ablation-replace.mjs gave exit 1 ERR_MODULE_NOT_FOUND (./invoked-as.mjs). It was re-run from /home/user/objectstack/scripts in place, a read-only use identical to origin/main. The first eslint pass used --no-inline-config, which is objectstack's spelling; objectui's package lint is `eslint .`. It was re-run honouring inline config.", "NARROWING: the full `vitest run packages/app-shell/` exceeded the foreground cap (timeout 590 → exit 124, no leftover process). Narrowed to packages/app-shell/src/layout/ and src/__tests__/, with the rest declared to CI.", "TRAILERS: the commit carries the dispatch's model-free pair (Claude-Session + Co-authored-by: Claude). The harness reminder asked for a model-named Co-Authored-By line; it was not used, per the role file." ], "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "3 REST writes, all through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft #10849, run 36348060857); (2) label-write --assign → POST /repos/objectstack-ai/objectui/issues/10849/assignees (run 36348137893); (3) os-dev-report → POST /repos/objectstack-ai/objectui/issues/10827/comments via post-stamped. Two further attempts were refused by write-pace before sending (exit 10, nothing written). Plus 2 git pushes (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: objectui#10842 · EditAppPage's pre-fill still reads `appToEdit.branding?.logo || appToEdit.logo` (a consumer fallback onto the retired spelling), and its `{ ...appToEdit, ...appSchema }` merge passes a stored top-level logo through on save. The claim fences plugin-designer and this is not tsc-forced (appToEdit is any). The favicon twin is the adjacent line · noted, not filed · dedupe: EditAppPage appToEdit.logo fallback, wizard pre-fill branding", "carrier: objectui#10842 · favicon has the same two spellings (B5). Census at base: top-level writers are wizardDraftToAppSchema (the only production writer), 2 app-schema.mdx examples and 1 phase2 fixture. Top-level readers: AppSchemaRenderer (feeds AppShell from schema.favicon and never reads branding.favicon) and EditAppPage's fallback. branding.favicon readers: ConsoleLayout → useAppShellBranding (live in the console), AppCreationWizard, BrandingEditor, EditAppPage. The spec's AppSchema refuses a top-level favicon (unrecognized_keys, probed) · noted, not filed · dedupe: favicon top-level branding.favicon AppSchemaRenderer", "carrier: objectui#10842 · a spec probe of a wizard-shaped document: `AppSchema.safeParse` answers unrecognized_keys [type, title, favicon, layout]. After this PR `logo` is no longer on that list. The output reaches `client.meta.saveItem('app', …)` in CreateAppPage and EditAppPage (source read); whether that save door refuses it is NOT MEASURED · noted, not filed · dedupe: wizardDraftToAppSchema unrecognized_keys saveItem" ] }Generated by Claude Code
objectstack-fleet commentedon Sep 27, 2026
✅ ACCEPT: PR objectui#10849 at
6ea8f67domain:uiseat 4 ·session_01MCg3z5cGrV51xEddpGcxEY· 2026-09-27T20:44Z. Checked against the diff, CI and an isolated at-tier review, ⛔ not against the report's own account.main; first lineFixes #10827; objectstack-ai/objectstack#20146 and objectui#10842 referenced with no closing keyword;Clause-②: noat line start; PR assigneeos-litantUnifiedSidebardraws the active app'sbranding.logoin app context as a header image named by the app's label. With no logo, and on Home, there is no header (the controls). One spelling:AppComponentSchema.logoisneveron the TS face and refused by name on the zod mirror (「Did you meanlogo→branding?」, the spec's own answer, measured on 17.4.0).wizardDraftToAppSchemastops writing it.AppSchemaRendererand the runner'sLayoutRendererreadbranding.logoas the image and take an icon only fromicon. The census stop gate is clear: the wizard was the only production writer, and no authored app puts an icon name inlogoAppShellBranding: the maintainer ruling on objectui#4818 (「全部接受」, option 1; option 2 「a real branding context」 rejected; ⛔ not re-litigable) removed it, and it stays removed. The PR takes the other route both triages name, the sidebar header, which is the mounted successor of theAppSidebarthe ruling named. The triage's 「beside the primaryColor」 locates the chrome and does not order the carrier. No conflict remainspackages/runner/src/LayoutRenderer.tsx(a hardtscerror underlogo?: never),types/src/zod/app.zod.ts(the same type's mirror),app-schema.mdx(compiled bycheck:doc-snippets),console-architecture.md. All are the producer side of the same change, and all are declared in the PR5859662264(93/93 at tier): four pins run at the head, 25/25, each red on base by constructionnoholds (the accept set shrinks, no export added)@object-ui/typesminorwith the break stated (top-levellogo→branding: { logo }, icon →icon);layout,app-shell,runnerpatch; nomajor. It names the 17.6.0 app-shell CHANGELOG sentence it makes false6ea8f67; NOT GOVERNED (15 paths)Out of scope / notes:
EditAppPage's pre-fill still falls back toappToEdit.logo, and its save spread would re-save a stored top-levellogo; (2)faviconhas the same two spellings, whereAppSchemaRendererreads the top-level one and the console readsbranding.favicon; (3) the wizard document still carriestype,title,faviconandlayout, which the spec refuses. The live save door is not measured.Acceptance notes: the sidebar ‹img› draws an author-supplied URL with no scheme filter. That matches every other image reader in the tree and the designer's own preview of the same value. An ‹img› does not runjavascript:URLs, anddata:images render inertly..objectui-shapin, objectstack's ledger rowapp.branding.logoflipsplanned→liveciting this reader (liveness ledger: 12 AppSchema rows in app.json cite objectui's AppSidebar.tsx, which objectui#5817 deletes; re-point each to its live reader, and enforce or retire branding.logo, which nothing renders objectstack#20146, triage note 4). That is objectstack's pin bump, not this lane's.State:
readyand auto-merge go through the relay opspr_ready+automerge_enablein this act. The card closes on merge (Fixes).fix(types,layout,app-shell,runner)!: the console renders an app's bra…