Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

observation: AppSidebar has no mount point in this repo — ConsoleLayout renders UnifiedSidebar, and the two carry near-duplicate admin nav clusters #5720

Closed

Description

@os-zhuang

Measured while implementing #5619, which had to reason about every surface that gates on the workspace-admin verdict.

Observation

packages/app-shell/src/layout/AppSidebar.tsx is exported from the package barrel but is rendered by nothing in this repository. A git grep for AppSidebar outside its own file, tests, and prose returns only a doc comment in ExpressionProvider.tsx and a cross-reference comment in AppContent.tsx. The component that actually mounts is UnifiedSidebar:

packages/app-shell/src/layout/ConsoleLayout.tsx:29:import { UnifiedSidebar } from './UnifiedSidebar.js';

It is a published export, so this is not dead code in the strict sense — a consumer can mount it. But nothing in this repo exercises it in a real tree, which has two consequences worth recording:

  1. Its admin nav cluster is a near-duplicate of UnifiedSidebar's and drifts silently. Both build the same sys-settings / sys-apps / sys-marketplace / sys-objects / sys-datasources / sys-users / sys-orgs / sys-roles / sys-config list, gated on the same predicate, with the same #3660 / #3739 canonical-route notes copied across both. They already differ: AppSidebar gates only sys-marketplace on the admin flag and leaves the other eight ungated, while UnifiedSidebar gates the whole cluster. Whether that difference is deliberate is not recorded in either file.

  2. It gets counted as a live surface in triage. The grading on useIsWorkspaceAdmin collapses "not resolved yet" into false, so an org-role admin renders once as a non-admin — every admin-gated surface can refuse or hide from a real admin #5619 lists AppSidebar as one of four "hide-affordance" surfaces where an admin nav entry is dropped and re-added. That is true of the code, but on this repo's console no user reaches it — the observable count is three (UnifiedSidebar, AppHeader, HomePage). A reader auditing that card's blast radius will over-count without this note.

Not claimed

That it should be deleted. It is published, it may have consumers outside this repo, and #3631 is already open on UnifiedSidebar's own storage-key behaviour — so the two are not obviously interchangeable. The disposition is a judgement call: keep and dedupe the shared cluster into one builder, keep and document why the two gate differently, or retire it under the usual published-export process. That call is triage's, which is why this is filed rather than acted on.

Refs

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Aug 22, 2026
  2. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    Triage: pm:queue, domain:ui, Task. AppSidebar has no mount point in this repo while ConsoleLayout renders UnifiedSidebar, and the two carry near-duplicate admin nav clusters — dead-or-duplicate surface. Establish-first: census consumers INCLUDING downstream repos and published exports before deleting (dead-code discipline: the reviewer verifies the reference surface); if AppSidebar is published API with external consumers, the delivery is a deprecation note + convergence plan instead of a delete.


    Generated by Claude Code

  3. claude commented on Aug 23, 2026

    @claude
    Contributor

    Claim — domain:ui execution seat.

    Dispatching this round (R27) as the establish-first card triage graded it: census consumers — including downstream repos and the published export surface — before deleting anything. If AppSidebar is published API with external consumers, the delivery is a deprecation note + convergence plan, ⛔ not a delete.


    Generated by Claude Code

  4. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    os-dev-report

    {
      "issue": 5720,
      "status": "done",
      "branch": "claude/issue-5720-appsidebar-census",
      "pr": "https://github.com/objectstack-ai/objectui/pull/5818",
      "premise_still_valid": true,
      "summary": "Census confirmed AppSidebar has no in-repo mount point (ConsoleLayout renders UnifiedSidebar) and no downstream consumer visible across this org's GitHub repos, but it IS a genuinely published export -- present in both the source barrel and the built dist/index.d.ts, and @object-ui/app-shell actively publishes to the public npm registry (publishConfig.access: public, live NPM_TOKEN publish step). Per the triage ruling that routes 'published API with external consumers' to deprecate-not-delete, and because a public npm package's external consumers are structurally invisible to any in-org census, I deprecated rather than deleted: added @deprecated JSDoc to AppSidebar (module + function) and its barrel re-exports pointing at UnifiedSidebar, updated content/docs/guide/console-architecture.md, added a patch changeset, and filed #5817 as the removal follow-up (component/tests/exports/stale-comments cleanup) once the deprecation window closes.",
      "tests": "From repo root, head 33580937c: `pnpm --filter '@object-ui/app-shell^...' build` then `pnpm --filter '@object-ui/app-shell' build` (tsc) clean, confirms AppSidebar in built dist/index.d.ts. `pnpm exec vitest run packages/app-shell/src/layout/__tests__/AppSidebar.derivedAreaVisibility.test.tsx packages/app-shell/src/layout/__tests__/appSidebarSettingsTargets.test.tsx --maxWorkers=2` -> Test Files 2 passed (2), Tests 9 passed (9). `pnpm exec vitest run packages/app-shell/src/layout/__tests__/systemNavDatasourcesHop.test.tsx packages/app-shell/src/layout/__tests__/systemNavObjectsHop.test.tsx packages/app-shell/src/layout/__tests__/systemNavSettingsTarget.test.tsx --maxWorkers=2` -> Test Files 3 passed (3), Tests 9 passed (9). `pnpm exec eslint src/layout/AppSidebar.tsx src/layout/index.ts src/index.ts` (from packages/app-shell/) -> exit 0, 15 problems (0 errors, 15 warnings), all pre-existing at lines inside the untouched function body. `node scripts/check-changeset-presence.mjs` -> pass (1 changeset for 3 changed source files). `node scripts/check-changeset-no-major.mjs` -> pass. Manual control-byte grep on every changed file -> clean. Skipped a full apps/console build/typecheck: this diff is additive JSDoc only (no type/signature/export-shape change) and apps/console -- the sole in-repo dependent of @object-ui/app-shell -- was already confirmed not to import AppSidebar. Remote CI just started at report time (draft PR opened seconds ago); only the trivial Vercel 'ignored build' status has reported so far, real lint/test/build workflows still in_progress -- reporting now per the draft-PR reporting convention rather than polling.",
      "open_questions": [],
      "out_of_scope_findings": ["filed as #5817: remove AppSidebar (component, tests, barrel exports, stale cross-reference comments) once its deprecation window closes -- deliberate planned follow-up from this issue's own disposition, not a chance-encountered defect"]
    }

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions