You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[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%.
> **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.)
4
4
> **This document replaces `docs/RESTART_PLAN.md`.** If a prior statement conflicts with this one, this version wins.
-**`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.
81
81
-**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`.
82
82
-**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.
83
83
-**`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.
86
86
-**Note drag `Teleport` overlay fixed.** Overlay now applies `scale(zoom)` and uses `posOverride` so the preview tracks the cursor correctly at all zoom levels.
87
87
-**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.
88
88
-**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.
89
96
90
97
### Other gaps
91
98
92
99
-**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.**
94
101
-**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.
95
102
-**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.
Copy file name to clipboardExpand all lines: docs/restart-plan/phase-6-spatial-polish.md
+10-7Lines changed: 10 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -108,21 +108,24 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
108
108
109
109
## Verification
110
110
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%.
113
113
114
114
---
115
115
116
116
## Exit criteria
117
117
118
118
-[x]`docs/SPATIAL_PARITY_CHECKLIST.md` exists and is reviewed for completeness.
-[]`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.
125
125
-[x]`MainToolbar`, `LeftSidebar`, `RightSidebar`, and `TableContextMenu` are implemented as standalone shadcn components and visible on `/pages/:pageId`.
126
126
-[x] Sidebar panels (`RecentPages`, `FavoritePages`) display real data from API.
127
127
-[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.
128
131
-[ ] Manual QA session with 3+ users finds no blocking usability issues.
0 commit comments