# DSH Kanban Design - Status: Draft for user review - Date: 2026-10-21 - Upstream reference: - Delivery: native DeepSeek Harness plugin, no iframe ## 1. Summary DSH Kanban is a native task board for DeepSeek Harness. It borrows the project/task model and operating principles of `dashi-taskboard`, while using the final four-column interface agreed with the user: ```text Backlog | Running | Needs you | Done ``` The board is backed by a Host plugin and DSH `storageDomain`; the Client is a native React page registered in the Harness main column. No separate Node process, SQLite database, or iframe is used. The four columns are a view over a smaller stored workflow. Blocking and waiting-for-input are attention overlays, not duplicate workflow states, so a task never loses its underlying stage when it needs human attention. ## 2. Locked Decisions 1. Delivery is a native DSH plugin with Host persistence. 2. Persistence uses `storageDomain`, not SQLite and not localStorage. 3. Client-to-Host communication uses a same-origin `/kanban-api` HTTP route. 4. `Needs you` is an automatic attention queue. It cannot be selected by drag. 5. Project archive is read-only and restorable. This is an extension over upstream, which only supports deleting empty projects. 6. First release is the usable core: projects, four-column board, tasks, task detail, comments, attachments, external links, activity, approval. 7. Upstream Dashboard, Gantt, list view, Jira, Cloud, AI Chat, task relations, DSH session binding, and agent tools are out of scope for v1. ## 3. Product Model ### 3.1 Hierarchy ```text All projects └─ Project └─ Task ├─ Comments ├─ Attachments ├─ External links └─ Activity ``` A project is a first-class grouping and lifecycle container. A task belongs to exactly one project. A board is a view over tasks; it is not a child object of a project. ### 3.2 Views v1 has one primary view: the board. The project switcher chooses between all projects and one project. There is no separate list, dashboard, or Gantt view. ### 3.3 Attention Attention is derived, never stored as a column. A task needs human attention when it has an unresolved question, a blocker, or is waiting for review. ## 4. Architecture ### 4.1 Runtime Shape ```text DSH Web UI └─ Kanban page (React) │ fetch /kanban-api ▼ DSH Host └─ Kanban Host plugin ├─ KanbanService ├─ storageDomain └─ webServer route ``` ### 4.2 Module Boundaries ```text dsh-kanban/ ├─ package.json ├─ cordis.patch.yml ├─ index.js generated Host bundle ├─ client.js generated Client bundle ├─ src/ │ ├─ shared/ │ │ ├─ statuses.js statuses, column mapping, labels │ │ ├─ rules.js attention, archive, identifier rules │ │ └─ __tests__/ │ ├─ host/ │ │ ├─ entry.js apply(), dependency injection │ │ ├─ domain.js storageDomain spec and zod schemas │ │ ├─ service.js KanbanService, all mutations │ │ ├─ http.js /kanban-api router │ │ ├─ attachments.js DSH attachment adapter │ │ └─ __tests__/ │ └─ client/ │ ├─ entry.js __ModuleLoader__.load handoff │ ├─ api.js fetch wrapper │ ├─ store.js snapshot, optimistic updates, errors │ ├─ components/ │ │ ├─ App.js │ │ ├─ Board.js │ │ ├─ Column.js │ │ ├─ TaskCard.js │ │ ├─ ProjectSwitcher.js │ │ ├─ TaskDrawer.js │ │ ├─ dialogs.js │ │ └─ icons.js │ └─ styles.css ├─ scripts/ │ └─ build.mjs esbuild Host + Client bundles └─ docs/ ├─ superpowers/specs/ └─ superpowers/plans/ ``` ### 4.3 Host Responsibilities - Open and close the `storageDomain` domain. - Validate every write. - Serialize writes through one operation queue. - Generate project IDs, task prefixes, task identifiers, and timestamps. - Maintain `version` and reject stale task updates. - Enforce archived-project read-only behavior. - Store attachment metadata and delegate bytes to DSH attachments. - Serve `/kanban-api` with JSON envelopes and no-store caching. ### 4.4 Client Responsibilities - Register the `kanban` main panel and sidebar icon. - Render the project switcher, board, cards, drawer, and dialogs. - Keep a client snapshot and apply optimistic updates. - Call the API through `src/client/api.js`. - Roll back optimistic changes on failure. - Use DSH theme tokens and locale dictionaries. - Persist only UI preferences in localStorage: collapsed columns. ### 4.5 Build - Host: esbuild, Node platform, ESM, external `@deepseek-ai/*` packages. - Client: esbuild, browser platform, IIFE, external `react`. - JSX uses `React.createElement` (classic transform), so no `react/jsx-runtime` dependency is required. - CSS is imported as text and rendered as a component-local `