- types.ts: consolidate NoteDoc, WorkspaceDoc, NoteAgentActionDoc etc. from client files - notes-client.ts: import from types.ts, optimize getNoteDetail with direct GET /notes/:id - review-client.ts: import from types.ts, use /note-agent-actions/pending (eliminates N+1) - notes-client.ts: use /workspaces/summaries (eliminates fetch-all-notes for counts) - backend: add GET /workspaces/summaries with noteCount per workspace - backend: add GET /note-agent-actions/pending (cross-workspace) - backend: add countNotesByWorkspaces + listPendingActions repository functions - Add createNote, archiveNote, restoreNote, createNoteRelationship client functions - Fix existing tests for new route counts and mock order
18 KiB
NoteLett — Implementation Tracker
Created: March 19, 2026
Source: docs/GAP_ANALYSIS.md (25 gaps across 5 categories)
Companion docs: docs/PRD.md, docs/ROADMAP.md, AGENTS.md
How to Use This Document
- Each task has its own checkbox. Check it off and add the commit SHA in parentheses when done.
- Run the verification commands listed in each phase before marking it done.
- Dependency chain: Phase 1 → Phase 2 → Phase 3 (critical path).
- After Phase 1: Phase 5 (DevOps) can start in parallel.
- After Phase 3: Phases 4, 6, 7 can be parallelized.
- Phase 8 (docs) runs last, after all other phases.
Baseline (before this tracker)
| Surface | Typecheck | Tests | Build |
|---|---|---|---|
| Backend | ✅ pass | 24 tests (12 files) | ✅ tsc |
| Web | ✅ pass | 6 tests (5 files) | ✅ next build |
| Mobile | ✅ pass | 0 tests | n/a |
Phase 1 — Bug Fixes (Gaps A1–A6, D3–D4) [x]
Goal: Eliminate all runtime bugs and latent crash risks. Clean dead code. Estimated effort: 2–3 hours Dependencies: None — start here.
Tasks
-
1.1 Lazy-init
extractionApiinweb/src/lib/extraction-client.ts(Gap A1) (dbb1a84)- Replace
const extractionApi = createApiClient(...)with lazy singletonfunction getExtractionApi() - Pattern: same as NomGap
protocol-client.ts/social-client.ts - File:
web/src/lib/extraction-client.ts
- Replace
-
1.2 Lazy-init
blobClientinweb/src/lib/blob-client.ts(Gap A1) (dbb1a84)- Replace
const blobClient = createBlobClient(...)with lazy singletonfunction getBlobClient() - Update all 4 call sites within the file (
blobClient.getSasUrl(...)→getBlobClient().getSasUrl(...)) - Remove dead re-export
export { blobClient }on line 48 (zero external imports) - File:
web/src/lib/blob-client.ts
- Replace
-
1.3 Add
"use client"directive toweb/src/lib/notes-client.ts(Gap A6) (dbb1a84)- This file imports
extraction-client.ts(module-scope API client). Without"use client", any future server-component import would crash. - Add
"use client";as the first line of the file. - File:
web/src/lib/notes-client.ts
- This file imports
-
1.4 Add
output: "standalone"toweb/next.config.ts(Gap A2) (dbb1a84)- Required for Docker builds.
outputFileTracingRootis already set. - File:
web/next.config.ts
- Required for Docker builds.
-
1.5 Delete dead code:
web/src/lib/mock-data.ts(Gap D3) (dbb1a84)- Confirmed zero imports. 228 lines of unused scaffold-era mock data.
- Delete:
web/src/lib/mock-data.ts
-
1.6 Delete dead code:
web/src/lib/review-data.ts(Gap D4) (dbb1a84)- Confirmed zero imports. Superseded by
review-client.ts. - Delete:
web/src/lib/review-data.ts
- Confirmed zero imports. Superseded by
Verification
cd web && npm run typecheck && npm test && npm run build
Commit convention
fix(web): lazy-init extraction + blob clients, add use-client to notes-client
- extraction-client.ts: lazy singleton (SSR crash fix) [A1]
- blob-client.ts: lazy singleton [A1]
- notes-client.ts: add "use client" directive [A6]
- next.config.ts: add output: "standalone" [A2]
- Delete mock-data.ts and review-data.ts (dead code) [D3, D4]
Phase 2 — Code Quality (Gaps D1–D2, A3–A4) [ ]
Goal: Consolidate duplicate types, optimize N+1 queries. Estimated effort: 2–3 hours Dependencies: Phase 1 (lazy-init changes affect the same files).
Tasks
-
2.1 Consolidate backend response types into
web/src/lib/types.ts(Gap D1)- Extract
NoteDoc,NoteAgentActionDoc,NoteTaskDoc,NoteArtifactDoc,NoteRelationshipDoc,WorkspaceDocfromnotes-client.tsandreview-client.tsintotypes.ts - Update imports in
notes-client.ts,review-client.ts,extraction-client.ts - Files:
web/src/lib/types.ts,web/src/lib/notes-client.ts,web/src/lib/review-client.ts
- Extract
-
2.2 Optimize
getNoteDetail()to callGET /notes/:iddirectly (Gap A3)- Current: fetches ALL notes then
.find()by ID - Fix: Call
GET /notes/:id?workspaceId=...directly - Requires: either pass
workspaceIdas parameter, or add a backend route that resolves bynoteIdalone - Option A: Add
workspaceIdparameter togetNoteDetail(noteId, workspaceId) - Option B: Add backend
GET /notes/:idroute without requiringworkspaceId(look up by userId + noteId) - File:
web/src/lib/notes-client.ts, possiblybackend/src/modules/notes/routes.ts
- Current: fetches ALL notes then
-
2.3 Optimize
listWorkspaceSummaries()to avoid fetching all notes (Gap A4)- Option A: Add
GET /workspaces/summariesbackend endpoint that includesnoteCountper workspace - Option B: Add
noteCountfield to workspace list response via a Cosmos cross-query - File:
web/src/lib/notes-client.ts,backend/src/modules/workspaces/
- Option A: Add
-
2.4 Add backend endpoint for cross-workspace pending agent actions (Gap D2)
GET /note-agent-actions/pending— returns all pending actions for the current user across workspaces- Eliminates the N+1 pattern in
review-client.ts→listApprovalQueue() - Files:
backend/src/modules/note-agent-actions/routes.ts,web/src/lib/review-client.ts
Verification
cd backend && npm run typecheck && npm test
cd web && npm run typecheck && npm test && npm run build
Commit convention
refactor(web): consolidate types, optimize N+1 queries [D1, A3, A4, D2]
Phase 3 — Backend Test Depth (Gap A5) [ ]
Goal: Replace registration-only route tests with real API behavior tests. Estimated effort: 3–4 hours Dependencies: Phase 2 (new backend endpoints should be tested too).
Tasks
-
3.1 Add integration tests for
notesroutes- Test: POST create → GET list → GET by ID → PATCH update → POST archive
- Test: search query, validation errors, auth enforcement, 404 on missing
- Target: 8–12 tests
- File:
backend/src/modules/notes/routes.test.ts
-
3.2 Add integration tests for
workspacesroutes- Test: POST create → GET list → GET by ID → PATCH update
- Test: validation, auth, 404
- Target: 6–8 tests
- File:
backend/src/modules/workspaces/routes.test.ts
-
3.3 Add integration tests for
note-tasksroutes- Test: POST create → GET list (by noteId + workspaceId) → PATCH update
- Target: 4–6 tests
- File:
backend/src/modules/note-tasks/routes.test.ts
-
3.4 Add integration tests for
note-artifactsroutes- Test: POST create → GET list (by noteId + workspaceId)
- Target: 3–5 tests
- File:
backend/src/modules/note-artifacts/routes.test.ts
-
3.5 Add integration tests for
note-relationshipsroutes- Test: POST create → GET list (by workspaceId + noteId)
- Note: no DELETE route exists — only GET and POST are implemented
- Target: 3–4 tests
- File:
backend/src/modules/note-relationships/routes.test.ts
-
3.6 Add integration tests for
note-agent-actionsroutes- Test: POST create → GET list → PATCH review (approve/reject) → POST batch-review
- Test: reviewedBy/reviewedAt auto-set on approve/reject
- Target: 6–8 tests
- File:
backend/src/modules/note-agent-actions/routes.test.ts
-
3.7 Add integration tests for
saved-viewsroutes- Test: POST create → GET list → GET by ID → PATCH update → DELETE
- Target: 5–7 tests
- File:
backend/src/modules/saved-views/routes.test.ts
Verification
cd backend && npm run typecheck && npm test
# Target: ~60–75 tests (up from 24)
Commit convention
test(backend): add integration tests for all 7 route modules [A5]
Phase 4 — Web Feature Gaps (Gaps B1, B2, B8) [ ]
Goal: Add missing web CRUD flows that the PRD requires. Estimated effort: 3–4 hours Dependencies: Phase 2 (type consolidation), Phase 3 (backend endpoints tested).
Tasks
-
4.1 Add "Create Note" flow to web UI (Gap B2)
- Add
CreateNoteModalcomponent (title, body, workspace selector, tags) - Wire to
POST /notesvianotes-client.ts - Add "New Note" button on dashboard and workspace pages
- Files:
web/src/components/CreateNoteModal.tsx,web/src/lib/notes-client.ts, dashboard + workspace pages
- Add
-
4.2 Add note restore backend endpoint (Gap B1)
- Add
POST /notes/:id/restoreroute (setsstatus: 'active') - Mirror the existing
POST /notes/:id/archivepattern - File:
backend/src/modules/notes/routes.ts
- Add
-
4.3 Add archive/restore UI on note detail page (Gap B1)
- Show "Archive" button for active/draft notes, "Restore" button for archived notes
- Wire to
POST /notes/:id/archiveandPOST /notes/:id/restore - File:
web/src/app/(app)/notes/[noteId]/page.tsx
-
4.4 Add "Link Note" relationship creation UI (Gap B8)
- Add "Link Note" button on note detail page
- Show note search/picker modal to select target note
- Wire to
POST /note-relationshipsvianotes-client.ts - Files:
web/src/components/LinkNoteModal.tsx, note detail page
-
4.5 Add web unit tests for new components
- Test: CreateNoteModal renders, validates, calls API
- Test: LinkNoteModal renders, searches, creates relationship
- Target: 4–6 tests
- Files:
web/src/components/CreateNoteModal.test.tsx,web/src/components/LinkNoteModal.test.tsx
Verification
cd backend && npm run typecheck && npm test
cd web && npm run typecheck && npm test && npm run build
Commit convention
feat(web): add create note, archive/restore, link note flows [B1, B2, B8]
Phase 5 — DevOps (Gaps C1–C5) [ ]
Goal: Docker builds, CI, and deployment readiness.
Estimated effort: 2–3 hours
Dependencies: Phase 1 only (output: "standalone" must be set first). Can run in parallel with Phases 2–3.
Tasks
-
5.1 Add
backend/Dockerfile(Gap C1)- Multi-stage build: install → build → runtime
- Follow the NomGap/ActionTrail pattern
- Exclude test files via tsconfig (already done in backend)
- File:
backend/Dockerfile
-
5.2 Add
web/Dockerfile(Gap C1)- Multi-stage build with
output: "standalone" - Add dummy build-time env vars for Next.js page data collection
- Follow the NomGap/ActionTrail pattern
- File:
web/Dockerfile
- Multi-stage build with
-
5.3 Add
scripts/docker-prep.sh(Gap C5)- Pack
@bytelyst/*packages into tarballs - Rewrite
package.jsonfile: refs to tarball paths - Add
--restoreflag to undo - File:
scripts/docker-prep.sh
- Pack
-
5.4 Add
docker-compose.yml(Gap C2)- Services: backend (port 4016), web (port 3000)
- Environment variable pass-through for Cosmos, JWT, etc.
- File:
docker-compose.yml
-
5.5 Add GitHub Actions CI workflow (Gap C3)
- Jobs: backend (typecheck + test + build), web (typecheck + test + build), mobile (typecheck)
- Triggered on push to main and PRs
- File:
.github/workflows/ci.yml
Verification
# Docker build smoke test
cd scripts && ./docker-prep.sh
docker build -f backend/Dockerfile .
docker build -f web/Dockerfile .
cd scripts && ./docker-prep.sh --restore
Commit convention
feat(devops): Dockerfiles, docker-compose, CI, docker-prep [C1–C5]
Phase 6 — E2E & Mobile Tests (Gaps B7, C4) [ ]
Goal: Playwright E2E for web, Vitest for mobile. Estimated effort: 3–4 hours Dependencies: Phase 4 (web features must exist to E2E test).
Tasks
-
6.1 Add Playwright config and setup (Gap C4)
- Add
playwright.config.tswith base URL, web server auto-start - Add
web/e2e/directory - Add
@playwright/testdev dependency - Files:
web/playwright.config.ts,web/package.json
- Add
-
6.2 Add Playwright navigation E2E tests
- Test: landing page → dashboard → workspaces → search → reviews → settings
- Test: sidebar navigation, keyboard shortcuts
- Target: 6–8 tests
- File:
web/e2e/navigation.spec.ts
-
6.3 Add Playwright CRUD flow E2E tests
- Test: create note (requires Phase 4.1) → edit → archive → restore
- Test: search notes, link notes, create artifact, create task
- Test: approval queue review (approve/reject)
- Target: 10–15 tests
- Files:
web/e2e/notes.spec.ts,web/e2e/reviews.spec.ts
-
6.4 Add mobile Zustand store tests (Gap B7)
- Test:
notes-store.ts— CRUD state transitions - Test:
workspace-store.ts— workspace selection, switching - Test:
inbox-store.ts— approval state, approve/reject actions - Test:
auth-store.ts— login/logout state - Target: 8–12 tests
- Files:
mobile/src/store/notes-store.test.ts,mobile/src/store/workspace-store.test.ts,mobile/src/store/inbox-store.test.ts,mobile/src/store/auth-store.test.ts
- Test:
-
6.5 Add mobile API client tests (Gap B7)
- Test:
notes.ts— API request construction, response parsing - Test:
workspaces.ts— list, create - Test:
note-agent-actions.ts— approve, reject - Target: 6–8 tests
- Files:
mobile/src/api/notes.test.ts,mobile/src/api/workspaces.test.ts,mobile/src/api/note-agent-actions.test.ts
- Test:
Verification
# Web E2E (requires backend running)
cd backend && npm run dev &
cd web && npx playwright test
# Mobile unit tests
cd mobile && npm test
# Target: 15+ tests (up from 0)
Commit convention
test(web): Playwright E2E — navigation + CRUD flows [C4]
test(mobile): add store and API client unit tests [B7]
Phase 7 — AI Enrichment & Advanced Features (Gaps B3, B6) [ ]
Goal: Add extraction-backed enrichment and import/export. Estimated effort: 3–4 hours Dependencies: Phase 3 (backend test patterns), Phase 4 (web CRUD flows). Note: Gap A4 (workspace note count optimization) is fully addressed in Phase 2 task 2.3 — not duplicated here.
Tasks
-
7.1 Add note summarization via extraction-service (Gap B6)
- Add
POST /notes/:id/summarizebackend route - Call extraction-service with
summarizationtask type - Store summary as a note artifact (type:
summary) - Add "Summarize" button on web note detail page
- Files:
backend/src/modules/notes/routes.ts,web/src/lib/extraction-client.ts, note detail page
- Add
-
7.2 Add note export (JSON/Markdown) (Gap B3)
- Add
GET /notes/exportbackend endpoint (query params: format, workspaceId) - Support
format=jsonandformat=markdown - Add "Export" button on web workspace page
- Files:
backend/src/modules/notes/routes.ts,web/src/app/(app)/workspaces/page.tsx
- Add
-
7.3 Add tests for new endpoints
- Test: summarize route (mock extraction-service)
- Test: export route (JSON + Markdown formats)
- Target: 4–8 tests
- Files:
backend/src/modules/notes/routes.test.ts
Verification
cd backend && npm run typecheck && npm test
cd web && npm run typecheck && npm test && npm run build
Commit convention
feat(backend): note summarization + export endpoints [B3, B6]
feat(web): summarize + export UI triggers [B3, B6]
Phase 8 — Documentation Alignment (Gaps E1–E2) [ ]
Goal: Update all docs to reflect the final implementation state. Estimated effort: 1 hour Dependencies: All previous phases.
Tasks
-
8.1 Update
docs/ROADMAP.mdphase checklists (Gap E1)- Check off all Phase 0–3 items that are now implemented
- Add Phase 4–5 items as needed
- Update progress notes section with new commits
-
8.2 Update
AGENTS.mdwith current state- Update test counts across all surfaces
- Add any new API endpoints added in Phases 2–7
- Update repo layout if new files/dirs were added
-
8.3 Update
docs/GAP_ANALYSIS.mdfinal status- Add completion notes to each resolved gap
- Update the totals table with final numbers
Verification
# Ensure all docs reference accurate file paths and counts
cd backend && npm run typecheck && npm test
cd web && npm run typecheck && npm test && npm run build
cd mobile && npm run typecheck && npm test
Commit convention
docs: update ROADMAP, AGENTS, GAP_ANALYSIS to reflect completed implementation
Deferred (V2+ / Post-Launch)
These gaps are explicitly deferred per the gap analysis:
| Gap | Description | Reason |
|---|---|---|
| B4 | Webhook/event hooks | Low priority for V1. Implement after core flows are hardened. |
| B5 | Note sharing within workspace | Requires workspace-level access model redesign. Phase 2+ feature. |
| E2 | WINDSURF_CONTEXT.md | Low priority — AGENTS.md covers most of this. |
Progress Log
Track completed phases and commits here as work progresses.
| Date | Phase | Commit | Summary |
|---|---|---|---|
| 2026-03-19 | Phase 1 | dbb1a84 |
Bug fixes: lazy-init SSR clients, use-client directive, standalone output, delete dead code |
Test Target Summary
| Surface | Before | After Phase 3 | After Phase 6 | After Phase 7 |
|---|---|---|---|---|
| Backend | 24 tests (12 files) | ~60–75 tests | ~60–75 tests | ~70–85 tests |
| Web unit | 6 tests (5 files) | 6 tests | ~12 tests | ~12 tests |
| Web E2E | 0 | 0 | ~20 tests | ~20 tests |
| Mobile | 0 | 0 | ~15 tests | ~15 tests |
| Total | 30 | ~66–81 | ~107–122 | ~117–132 |
Full Verification Checklist (run before marking any phase complete)
# ── Backend ────────────────────────────────────────
cd backend && npm run typecheck && npm test && npm run build
# ── Web ────────────────────────────────────────────
cd web && npm run typecheck && npm test && npm run build
# ── Mobile ─────────────────────────────────────────
cd mobile && npm run typecheck && npm test
# ── E2E (after Phase 6) ───────────────────────────
cd web && npx playwright test