Skip to content

[finding] app branding.logo is authored by the designer and documented, but no mounted component renders it since AppSidebar (never mounted) was removed #10827

Closed

Description

@objectstack-fleet

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 objectui main fb91ac9b0:
    • packages/plugin-designer/src/AppCreationWizard.tsx:616 writes branding.logo (value={branding.logo ?? ''}). Per objectstack#20146, plugin-designer's BrandingEditor also writes it with a preview, and EditAppPage pre-fills it;
    • downstream, objectstack-ai/hotcrm's crm.app.ts sets it, as objectstack#20146 records;
    • the published @object-ui/app-shell CHANGELOG tells authors to set branding.logo on 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 (Remove AppSidebar from @object-ui/app-shell once the deprecation window closes (follow-up to #5720) #5817) removed it. The console renders UnifiedSidebar. AppSchemaRenderer reads a top-level logo, not branding.logo.
    • wizardDraftToAppSchema (packages/types/src/app.ts) copies a wizard draft's branding.logo into that top-level logo, so only a wizard-authored logo can surface, and only in an AppSchemaRenderer host.
    • This seat re-read the removal on main (AppSidebar.tsx is absent at fb91ac9b0) 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 or AppShell's branding (useAppShellBranding, which already carries primaryColor from ConsoleLayout).
  • When it lands, the objectstack ledger row flips planned → live, citing this reader at the .objectui-sha pin that carries it.
  • Spelling: objectstack's AppSchema declares only branding.logo. A top-level logo on an app is REFUSED: AppSchema.safeParse answers unrecognized_keys with a did-you-mean logo → branding (packages/spec/src/ui/app.zod.ts, the suggestion table). No conversion rewrites it. So branding.logo is 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's AppSchemaRenderer top-level logo read should move to branding.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

  1. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: changing a running app without code | 缺项 (no item sets branding.logo in the designer and looks for it in the running app) | P1

    Triage: 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 or AppShell's branding (useAppShellBranding) ⇒ domain:ui. Rationale: the key is authored and documented, and nothing that ships renders it.

    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 row app.branding.logo to planned, naming this card).

    Execution notes.

    1. Render branding.logo in the mounted chrome, beside the primaryColor that useAppShellBranding already carries from ConsoleLayout. A missing logo keeps today's fallback, which is the control.
    2. One spelling. objectstack's AppSchema declares only branding.logo, and a top-level logo folds into it through the alias table. Move AppSchemaRenderer's top-level logo read to branding.logo, and make wizardDraftToAppSchema stop copying into the top-level key. If a measured writer of top-level logo exists outside the wizard, stop and report it here.
    3. Pin through the real console chrome: an app with branding.logo shows it, and one without shows the fallback.
    4. After it lands at an .objectui-sha pin, the objectstack ledger row flips planned → live, citing this reader. Post the back-link on objectstack#20146.
  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 27, 2026
  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 — domain:ui execution seat 4
    Session: session_01MCg3z5cGrV51xEddpGcxEY
    Account: os-litant
    Branch: claude/issue-10827-render-app-branding-logo
    Worktree: objectui-issue-10827
    Domain: domain:ui
    Seat: domain:ui#4
    File surface:

    • the mounted chrome that renders branding.logo: packages/app-shell/src/layout/UnifiedSidebar.tsx (its header) and/or packages/layout/src/AppShell.tsx (useAppShellBranding), with the ConsoleLayout.tsx hand-off that already carries primaryColor;
    • the one spelling: packages/layout/src/AppSchemaRenderer.tsx (its top-level logo read moves to branding.logo) and packages/types/src/app.ts (wizardDraftToAppSchema stops copying into a top-level logo; the type's top-level logo, if declared, per the triage's direction);
    • tests beside them; .changeset/10827-…md for each touched package.
      ⛔ Not plugin-designer's BrandingEditor / AppCreationWizard (writers, already right). ⛔ Not the objectstack ledger row (it flips at a later .objectui-sha pin). Stop on breach; explain in the report.
      Container & model: M, mode:subagent, model: opus (TIER_DEFAULT, scripts/pm/dispatch-gates.mjs:12534 on objectstack 17bd3187; --tier refuses objectui paths).
      Clause-②: no
      Thread-read: 5858929399
      Serial constraints cleared: open-PR file lists read 2026-09-27T19:32Z at objectui origin/main 8eaa1a0 (12 open PRs): none touches packages/layout/src/, app-shell/src/layout/, types/src/app.ts or plugin-designer. No in-flight lane claim names these files (the 12 pm:dispatched cards' newest claims checked).

    Clause-②: no: a declared key (branding.logo) gains its reader, and the alias spelling (top-level logo) stops being read or written. That narrows and does not widen: no accept set grows and no export is added.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#10849 at 6ea8f67

    domain:ui seat 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.

    Implemented-by:  claude/issue-10827-render-app-branding-logo
    Reviewed-by:     session_01MCg3z5cGrV51xEddpGcxEY
    
    item reading
    shape draft → main; first line Fixes #10827; objectstack-ai/objectstack#20146 and objectui#10842 referenced with no closing keyword; Clause-②: no at line start; PR assignee os-litant
    the change ENFORCE per objectstack-ai/objectstack#20146. The console's mounted UnifiedSidebar draws the active app's branding.logo in 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.logo is never on the TS face and refused by name on the zod mirror (「Did you mean logo → branding?」, the spec's own answer, measured on 17.4.0). wizardDraftToAppSchema stops writing it. AppSchemaRenderer and the runner's LayoutRenderer read branding.logo as the image and take an icon only from icon. The census stop gate is clear: the wizard was the only production writer, and no authored app puts an icon name in logo
    route The logo is not added back to AppShellBranding: 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 the AppSidebar the ruling named. The triage's 「beside the primaryColor」 locates the chrome and does not order the carrier. No conflict remains
    scope beyond the claim packages/runner/src/LayoutRenderer.tsx (a hard tsc error under logo?: never), types/src/zod/app.zod.ts (the same type's mirror), app-schema.mdx (compiled by check:doc-snippets), console-architecture.md. All are the producer side of the same change, and all are declared in the PR
    contract review PASS 5859662264 (93/93 at tier): four pins run at the head, 25/25, each red on base by construction
    clause ② no holds (the accept set shrinks, no export added)
    semver @object-ui/types minor with the break stated (top-level logo → branding: { logo }, icon → icon); layout, app-shell, runner patch; no major. It names the 17.6.0 app-shell CHANGELOG sentence it makes false
    CI 40 success, 3 skipped, 0 red on 6ea8f67; NOT GOVERNED (15 paths)

    Out of scope / notes:

    • The dev's three findings carry to objectui#10842, the open sibling card on the same wizard output (a comment there in this act). They are: (1) EditAppPage's pre-fill still falls back to appToEdit.logo, and its save spread would re-save a stored top-level logo; (2) favicon has the same two spellings, where AppSchemaRenderer reads the top-level one and the console reads branding.favicon; (3) the wizard document still carries type, title, favicon and layout, 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 run javascript: URLs, and data: images render inertly.
    • After this lands at an .objectui-sha pin, objectstack's ledger row app.branding.logo flips planned → live citing 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: ready and auto-merge go through the relay ops pr_ready + automerge_enable in this act. The card closes on merge (Fixes).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions