The package named @workspace/ui once looked like a design system. Its exports included a global stylesheet, wildcard component paths, and hooks. It also contained a button and application-wide CSS. That made it easy to put product components there simply because the package name sounded right.

The problem was ownership, not whether the components rendered. Product UI needs to move with the product feature. Map primitives need to be reusable without importing the product's tokens, layout, or route-specific behavior. A package that owns both has no useful answer when a visual change affects only the web app.

The Aug. 20 ownership refactor removed the button, global stylesheet, and broad export patterns. The meaningful part of the change was the smaller public surface:

changes.diff+0-0
1- "./globals.css": "./src/styles/globals.css",
2- "./lib/*": "./src/lib/*.ts",
3- "./components/*": "./src/components/*.tsx",
4- "./hooks/*": "./src/hooks/*.ts"
5+ "./components/ui/map": "./src/components/ui/map.tsx",
6+ "./components/ui/map-source": "./src/components/ui/map-source.tsx",
7+ "./lib/utils": "./src/lib/utils.ts"

That historical diff is from f4f327e. The follow-up moved application runtime and map styles into explicit web-owned locations in 27e7b31. Those changes did not create a finished design system. They made the current owner visible.

This diagram shows the ownership correction in one view. The “before” side is historical; the “current” side reflects the checked-out source.

The current package exports confirm the narrower boundary:

data.json
1{
2 "exports": {
3 "./components/ui/map": "./src/components/ui/map.tsx",
4 "./components/ui/map-source": "./src/components/ui/map-source.tsx",
5 "./lib/utils": "./src/lib/utils.ts"
6 }
7}

The map entry point exports MapLibre components, markers, overlays, controls, and their types. The small cn utility is also shared by some web components. The package does not own the web app's tokens, feature cards, dialogs, route panels, or runtime layout. Those live under apps/web/src/ui. Map-specific CSS lives under apps/web/src/map/styles.css.

Current ownership

BoundaryOwnsDoes not own
packages/transitTransit data schemas, route geometry, fares, bundles, and the plannerBrowser screens and HTTP request policy
packages/contractsShared assistant request, intent, result, and validation contractsTransit facts or model prompting
packages/collectorVehicle collection, derived intelligence, Durable Objects, and D1 accessPublic CORS or dashboard rendering
apps/apiPublic HTTP routes, CORS, response caching, rate limits, and collector binding callsBrowser UI state and private operator authorization
apps/webRider UI, map composition, local persistence, place search, and planner worker useCollector database access
apps/dashboardPrivate operator UI, Access/share checks, and collector RPC requestsPublic rider features
packages/uiReusable MapLibre primitives and a small class-name utilityA durable Davao Transit design system

The dependency direction is visible in the imports. The API and browser consume @aidrecabrera/transit; the collector also uses transit geometry and generated data; the API imports the shared assistant schemas; and the browser consumes the public API type plus the shared contracts. The dashboard reaches the collector through a Cloudflare service binding rather than through the public API.

The external Spine repository is a possible design-system boundary, not a completed migration target in this source tree. No current package export establishes that the Davao Transit UI has moved to Spine. Until that changes, application UI remains web-owned and provisional.

The boundary is expressed by exports, imports, and file ownership. The package name alone does not enforce it. When a new module needs transit truth, put it near packages/transit or packages/collector. When it needs a rider-facing layout, put it in apps/web. When it needs a map primitive that has no product knowledge, consider packages/ui.

Current evidence is in packages/ui/package.json, its map entry point, the web UI tree, and the web map styles.