Skip to content

Commit 437d90a

Browse files
committed
docs: improve plan
1 parent e87100b commit 437d90a

3 files changed

Lines changed: 24 additions & 14 deletions

File tree

docs/SPATIAL_PARITY_CHECKLIST.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,10 @@ Every field from legacy `INoteCollab` and `IArrowCollab` is present in the new Y
272272

273273
## Verification
274274

275-
- [x] Checklist contains ≥ 60 rows. (Current count: **82 rows**)
275+
- [x] Checklist contains ≥ 60 rows. (Current count: **82+ rows**)
276276
- [x] Schema diff table covers every legacy `INoteCollab` and `IArrowCollab` field.
277-
- [ ] Every "Done" item has a passing automated test. (Many UI items still lack component tests.)
278-
- [ ] Phase 6 is not declared done until ≥ 80% of rows are **Done**.
277+
- [ ] Every "Done" item has a passing automated test. **VIOLATED.** ~40+ UI/interaction rows marked "Done" have "—" in the Test file column. These must be downgraded to "Partial" or tests must be added.
278+
- [ ] Phase 6 is not declared done until ≥ 80% of rows are **Done**. **NOT MET.** Strict enforcement of the test rule would drop the true "Done" count well below 80%.
279279

280280
---
281281

docs/restart-plan/README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# DeepNotes Restart Plan — Index
22

3-
> **Last updated:** 2026-05-31 (Phase 6 complete. 73/82 checklist items done (89%). Arrow source/target anchor positioning and fit-to-screen implemented. Phase 9 pending.)
3+
> **Last updated:** 2026-05-31 (Phase 6 re-evaluated. Status corrected from "Complete" to "In Progress". See `phase-6-spatial-polish.md` and `SPATIAL_PARITY_CHECKLIST.md` for details. Phase 9 pending.)
44
> **This document replaces `docs/RESTART_PLAN.md`.** If a prior statement conflicts with this one, this version wins.
55
66
---
@@ -15,7 +15,7 @@
1515
| 3 | Collab wire parity — page-level Yjs doc | **Complete** | [phase-3-collab-wire.md](phase-3-collab-wire.md) |
1616
| 4 | SPA foundation + feature slice routing | **Complete** | [phase-4-spa-routing.md](phase-4-spa-routing.md) |
1717
| 5 | Spatial canvas MVP — notes + arrows + camera | **Complete** | [phase-5-spatial-mvp.md](phase-5-spatial-mvp.md) |
18-
| 6 | Spatial canvas polish | **Complete** | [phase-6-spatial-polish.md](phase-6-spatial-polish.md) |
18+
| 6 | Spatial canvas polish | **In Progress** | [phase-6-spatial-polish.md](phase-6-spatial-polish.md) |
1919
| 7 | Account, billing, groups polish | **Complete** | [phase-7-account-polish.md](phase-7-account-polish.md) |
2020
| 8 | Marketing, Help, Pricing, and Legal Surfaces | **Complete** | [phase-8-marketing.md](phase-8-marketing.md) |
2121
| 9 | Production Readiness and Cutover | In progress | [phase-9-production.md](phase-9-production.md) |
@@ -77,7 +77,7 @@ A criterion is **not met** until the verification command or check passes in CI.
7777

7878
### Phase 6 — Spatial canvas polish (in progress)
7979

80-
- **`docs/SPATIAL_PARITY_CHECKLIST.md` created.** 82 rows covering notes, arrows, camera, selection, clipboard, editing, collab, templates, UI, backlinks, group access. Schema diff table complete.
80+
- **`docs/SPATIAL_PARITY_CHECKLIST.md` created.** 82+ rows covering notes, arrows, camera, selection, clipboard, editing, collab, templates, UI, backlinks, group access. Schema diff table complete. **Many rows marked "Done" lack automated tests**, violating the checklist's own rule. Strict enforcement would reduce the effective completion rate significantly.
8181
- **Left sidebar panels now load real data.** `useUserPageLists` composable wires `GET /api/users/me/pages/recent` and `GET /api/users/me/pages/favorites` into `RecentPagesCard` and `FavoritePagesCard`. Clear handlers call API-backed `clearRecent`/`clearFavorites`.
8282
- **Right sidebar properties panels exist but lack depth.** `NotePropertiesCard.vue`, `ArrowPropertiesCard.vue`, `PagePropertiesCard.vue` are wired and visible, but many legacy properties (wrap, anchor, z-index, timestamps) are not exposed.
8383
- **`MainToolbar.vue` extracted as standalone component.** `PageLayout.vue` now delegates to `MainToolbar.vue` for the header shell. Still missing: page action buttons (insert note/arrow, alignment, formatting), zoom controls other than reset, fit-to-screen, screenshot.
@@ -86,11 +86,18 @@ A criterion is **not met** until the verification command or check passes in CI.
8686
- **Note drag `Teleport` overlay fixed.** Overlay now applies `scale(zoom)` and uses `posOverride` so the preview tracks the cursor correctly at all zoom levels.
8787
- **Page state screens exist but 4 states are indistinguishable.** `page-deleted`, `group-deleted`, `invited`, `rejected` all map to the same generic error UI because the API does not return distinct error codes.
8888
- **Context menu exists for canvas but not for individual notes.** `CanvasContextMenu.vue` (right-click on empty canvas) is implemented. No per-note context menu exists.
89+
- **Arrow geometry is oversimplified.** New `DisplayArrow.vue` uses center-point math. Legacy had rectangle-edge intersection for `bodyType === 'line'`, interregional coordinate transforms, and `fakePos`/`looseEndpoint` rendering.
90+
- **No `PageElem` abstraction.** Legacy notes and arrows inherit from `PageElem`, sharing selected/active/editing/visible/region state. New code treats them as completely separate types.
91+
- **No `editing` state management.** Legacy tracks which element is being edited, stopping editing when clicking elsewhere. New relies on Tiptap's internal focus, which can lead to conflicting edits.
92+
- **Container rendering lacks legacy depth.** `stretchChildren`, `wrapChildren`, `originOffset`, and overflow detection are in the model but not enforced in rendering. Spatial vs non-spatial container distinction is not fully implemented.
93+
- **`SpatialPageView.vue` is a 1,070-line god component.** Legacy distributed responsibility across `Page`, `PageNotes`, `PageArrows`, `PageSelection`, `PageCamera`, `NoteDragging`, `NoteResizing`, etc. The monolithic component violates the spirit of the "No composable > 300 lines" success criterion.
94+
- **Selection lacks legacy depth.** No `bringToTop` on selection, no formatting integration across selected editors, no active element/region meaningful UI or keyboard navigation. `selectAll` only selects root notes, not descendant arrows.
95+
- **Missing floating UI:** back/forward nav, screenshot, user avatars on canvas.
8996

9097
### Other gaps
9198

9299
- **Realtime notification toast** — only `/notifications` page exists, no badge/toast.
93-
- **Composable size**`useGroupMembersDetail.ts` (103 lines), `usePageCollabEditor.ts` (238 lines), and `useSpatialPage.ts` (195 lines) are all under the 300-line limit. Container logic extracted to `container-ops.ts`.
100+
- **Composable size**`useGroupMembersDetail.ts` (103 lines), `usePageCollabEditor.ts` (238 lines), and `useSpatialPage.ts` (195 lines) are all under the 300-line limit. Container logic extracted to `container-ops.ts`. **However, `SpatialPageView.vue` is a 1,070-line god component that violates the spirit of this criterion.**
94101
- **Auth: `rememberDevice` UI missing in login**`LoginView.vue` has no "Remember this device" checkbox for 2FA login; users are re-prompted every time. API schema already supports it.
95102
- **Auth: no distributed locking** — Legacy used Redlock (`user-lock:${userId}`) around password change, email change, and 2FA mutations. New code relies on DB transactions only.
96103

docs/restart-plan/phase-6-spatial-polish.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,24 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
108108

109109
## Verification
110110

111-
- [ ] Each deliverable has a test (unit, component, or integration). (Missing: `DisplayNote.vue`, `DisplayArrow.vue`, `SpatialPageView.vue`, sidebar/toolbar integration tests.)
112-
- [ ] Phase 1 checklist is >80% marked done. (`docs/SPATIAL_PARITY_CHECKLIST.md` created with 82 rows; count Done vs Partial/Stub/Not started.)
111+
- [ ] Each deliverable has a test (unit, component, or integration). **Major gaps remain:** `DisplayNote.vue` (only basic render tests), `DisplayArrow.vue` (no tests), `SpatialPageView.vue` (no component/integration tests), drag/resize interaction tests, box selection tests, arrow creation/reconnection tests, sidebar/toolbar integration tests.
112+
- [ ] Phase 1 checklist is >80% marked done. **NOT MET.** Strict enforcement of the checklist's "Done = implemented + passing test" rule drops the true completion rate well below 80%.
113113

114114
---
115115

116116
## Exit criteria
117117

118118
- [x] `docs/SPATIAL_PARITY_CHECKLIST.md` exists and is reviewed for completeness.
119-
- [ ] Phase 1 checklist ≥ 80% complete.
119+
- [ ] Phase 1 checklist ≥ 80% complete. **NOT MET.**
120120
- [ ] No "P1" checklist item remains open.
121-
- [ ] `PageEditorView.vue` renders as a full-screen immersive shell (no scrolling card page).
122-
- [ ] All 8 dedicated page-state screens exist and are reachable. (`page-deleted`/`group-deleted`/`invited`/`rejected` are indistinguishable without richer API error codes.)
123-
- [x] `DisplayNote.vue` matches legacy note visuals: colors, borders, selection ring (`#2196f3` not `ring-primary`), drag opacity, Teleport overlay, drop zones, arrow handles, link icon, 8 resize handles.
124-
- [x] `DisplayArrow.vue` supports curve + line bodies, arrow heads, labels (Tiptap on `Y.XmlFragment`), hitboxes, and drag-to-reconnect.
121+
- [x] `PageEditorView.vue` renders as a full-screen immersive shell (no scrolling card page).
122+
- [x] All 8 dedicated page-state screens exist and are reachable. (`page-deleted`/`group-deleted`/`invited`/`rejected` are indistinguishable without richer API error codes.)
123+
- [ ] `DisplayNote.vue` matches legacy note visuals. **PARTIAL.** Colors use hardcoded 10-color map instead of legacy `colorNameToColorHex` with `lightenByRatio`. Drop zones, arrow handles, and frame styling are simplified. No custom scrollbar handling.
124+
- [ ] `DisplayArrow.vue` supports full legacy arrow behavior. **PARTIAL.** Curve/line bodies and heads work, but line body lacks rectangle-edge intersection, interregional arrows don't transform coordinate spaces, and `fakePos`/`looseEndpoint` are not rendered.
125125
- [x] `MainToolbar`, `LeftSidebar`, `RightSidebar`, and `TableContextMenu` are implemented as standalone shadcn components and visible on `/pages/:pageId`.
126126
- [x] Sidebar panels (`RecentPages`, `FavoritePages`) display real data from API.
127127
- [x] Arrow geometry reads actual note heights instead of hardcoding `80px`.
128+
- [ ] `SpatialPageView.vue` is refactored to avoid god-component anti-pattern. Currently 1,070 lines.
129+
- [ ] Selection implements `bringToTop`, formatting integration, and active element/region navigation.
130+
- [ ] Container rendering enforces `stretchChildren`, `wrapChildren`, and spatial vs non-spatial layout modes.
128131
- [ ] Manual QA session with 3+ users finds no blocking usability issues.

0 commit comments

Comments
 (0)