# Backend Workbench Alignment Design

## Goal

Align the Go backend with the latest Svelte workbench prototype. The frontend currently models a Discord-like project workbench with dynamic projects, project-scoped channels, and channel-specific first-screen data.

## API Contract

Add `GET /api/projects/:id/workspace`.

The response intentionally matches `apps/web/src/features/workbench/types.ts` and uses camelCase field names:

- `project`
- `channels`
- `tags`
- `recentSessions`
- `inbox`
- `tasks`
- `aiSessions`
- `notesSources`
- `cronPlans`

## Project

The project payload contains:

- `id`
- `name`
- `description`
- `initials`
- `unreadCount`

`unreadCount` is the count of open inbox items in the requested project.

## Channels

System channels are derived by the backend for every project:

- `overview`
- `inbox`
- `tasks`
- `ai_sessions`
- `notes_sources`
- `cron`

Custom channels are stored in the database as project-scoped URL shortcuts:

- `title`
- `icon`
- `url`
- `sortOrder`

System channel counts are derived from project data. Custom channels do not have counts.

## Channel Data

The workspace response includes first-screen channel data:

- Inbox items map to mail-like message rows.
- Tasks map to todo-style cards with a `completed` boolean.
- AI sessions map to session list rows.
- Notes and sources are merged into one attachment/file-management list.
- Cron plans are metadata-only scheduled plans.

Cron plans do not execute autonomous agent work in this MVP.

## Access Control

The endpoint only returns a workspace when the authenticated user owns the project. This follows the existing protected router and project dashboard behavior.

## Tests

Backend tests should verify:

- The workspace rejects projects owned by another user.
- The workspace returns camelCase fields aligned with the frontend type.
- System channel counts are scoped to the requested project.
- Custom channels and Cron plans are project-scoped.

