Skip to content

Commit d21193e

Browse files
tyler-daneclaude
andauthored
refactor: remove unused priority event-tagging feature (#2101)
* refactor(core,backend,web): remove unused priority event-tagging feature Priority tagging (work/self/relations/unassigned) was never adopted by users. Removes the backend priority CRUD module, the Priority/Priorities schema and field across contracts, and the form/context-menu picker UI. Event colors now use a single flat neutral color everywhere they were previously keyed by priority (grid cards, event form, save button, tags). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(scripts): migrate away stale priority data, document in runbook Adds a migration to $unset the now-dead priority field from legacy event documents and drop the orphaned standalone priority collection left over from the removed priority-CRUD feature. Independent of the sub-calendar v1 cutover (doesn't touch event_new or any validator); documented in the event migration runbook and upgrades guide so self-hosters know to run it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
1 parent d0a4036 commit d21193e

165 files changed

Lines changed: 389 additions & 1858 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

DESIGN.md

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
**Creative North Star: "The Dark Calendar Canvas, One Accent"**
66

7-
Compass is a near-black blue canvas where the only truly saturated color is a single sky-blue accent (`#57c1ff`). Everything structural, the grid lines, panels, borders, and most text, lives in a narrow blue-gray band against a deep `#0d1017` background. Color enters the screen only where it carries meaning: the accent marks selection and primary actions, and a small set of muted priority colors (work, relations, self, unassigned) tints the event blocks themselves. The interface is dim and low-contrast at rest so the user's events and current task are the brightest things on screen.
7+
Compass is a near-black blue canvas where the only truly saturated color is a single sky-blue accent (`#57c1ff`). Everything structural, the grid lines, panels, borders, and most text, lives in a narrow blue-gray band against a deep `#0d1017` background. Color enters the screen only where it carries meaning: the accent marks selection and primary actions, and a single muted slate tints the event blocks themselves. The interface is dim and low-contrast at rest so the user's events and current task are the brightest things on screen.
88

99
This is a planning tool for people who want the calendar to get out of the way. Density is welcome where it serves the task (a full week of events, a packed sidebar), but chrome is kept quiet: no borders until you interact, no decorative fills, no second accent competing for attention. The one deliberately human note is handwriting: the Caveat script font is a personal touch at the margin of an otherwise precise instrument.
1010

@@ -14,27 +14,25 @@ What this system rejects: the cluttered toolbars and nested menus of Google/Outl
1414

1515
- Deep blue-black surface (`#0d1017`), built up by tonal layering, not boxes.
1616
- Exactly one bright accent (`#57c1ff`); meaning, not decoration.
17-
- Muted priority colors are the only other saturation, and only on events.
17+
- A single flat muted event color is the only other saturation, and only on events.
1818
- Quiet, borderless controls that reveal themselves on hover/focus.
1919
- One UI typeface (Rubik), with Caveat handwriting as a single human accent.
2020

2121
## 2. Colors
2222

23-
A monochrome blue-gray system on a near-black base, punctuated by one sky-blue accent and a muted priority palette reserved for event content.
23+
A monochrome blue-gray system on a near-black base, punctuated by one sky-blue accent and a single muted neutral reserved for event content.
2424

2525
### Primary
2626

2727
- **Sky Accent** (`#57c1ff`, `hsl(202 100 67)`): The single saturated color. Used for the current selection, primary actions, links, info status, and the first tag color. It is the brightest, most attention-pulling element on any screen; that scarcity is the point.
2828

2929
### Secondary
3030

31-
- **Soft Cyan** (`#aed3e0`, `hsl(196 45 78)`): The light end of the accent gradient (`accent-primary → soft-cyan`) and the Work priority tint. A calmer companion to the sky accent, never used as a competing focal point.
31+
- **Soft Cyan** (`#aed3e0`, `hsl(196 45 78)`): The light end of the accent gradient (`accent-primary → soft-cyan`). A calmer companion to the sky accent, never used as a competing focal point.
3232

33-
### Tertiary (priority palette, events only)
33+
### Tertiary (Event Fill)
3434

35-
- **Relations Teal** (`#86d0bb`, `hsl(163 44 67)`): The Relations priority color on event blocks.
36-
- **Self Blue-Gray** (`#9fb0bf`, `hsl(205 36 62)`): The Self priority color.
37-
- **Unassigned Slate** (`#8293a1`, `hsl(207 14 57)`): The default/unassigned priority color.
35+
- **Event Fill / Slate** (`#8293a1`, `hsl(207 14 57)`): The single flat color used everywhere an event is represented — event card fill, the save button, tags, and the event form background. No other event color exists; every event looks the same regardless of category.
3836

3937
### Neutral
4038

@@ -53,7 +51,7 @@ A monochrome blue-gray system on a near-black base, punctuated by one sky-blue a
5351

5452
**The One Accent Rule.** Exactly one saturated accent (`#57c1ff`) on any screen, reserved for selection, primary action, and info. If a second saturated hue appears anywhere outside an event block or a status signal, it is wrong.
5553

56-
**The Color-Means-Something Rule.** Saturation is forbidden as decoration. The accent means "selected / primary / info"; priority colors mean "this event's category"; status colors mean "this state." Structural chrome stays in the blue-gray band.
54+
**The Color-Means-Something Rule.** Saturation is forbidden as decoration. The accent means "selected / primary / info"; the event fill color marks something as an event block; status colors mean "this state." Structural chrome stays in the blue-gray band.
5755

5856
## 3. Typography
5957

@@ -101,9 +99,9 @@ Controls are quiet, borderless, and hover-revealing: they sit flush on their sur
10199

102100
### Buttons
103101

104-
- **Shape:** Small radius (`2px` for priority buttons, `4px` default).
105-
- **Priority button:** Background is the priority color (darkened at rest); `text-dark` (`#0d1017`) label; `min-width` ~158px; `padding: 0 8px`. Disabled drops to `opacity: 0.5` and `pointer-events: none`.
106-
- **Hover:** Background shifts to `bg-primary` and the label color brightens toward the priority color (`brighten()`); ~0.5s color transition. This hover-reveal is the signature button behavior.
102+
- **Shape:** Small radius (`2px` for the event save button, `4px` default).
103+
- **Save button:** Background is the event fill color (darkened at rest); `text-dark` (`#0d1017`) label; `min-width` ~158px; `padding: 0 8px`. Disabled drops to `opacity: 0.5` and `pointer-events: none`.
104+
- **Hover:** Background shifts to `bg-primary` and the label color brightens toward the event fill color (`brighten()`); ~0.5s color transition. This hover-reveal is the signature button behavior.
107105
- **Focus:** A `2px solid` dark border (`border-primary-dark`) appears on focus, the one place a border is added intentionally.
108106

109107
### Inputs / Fields
@@ -113,10 +111,10 @@ Controls are quiet, borderless, and hover-revealing: they sit flush on their sur
113111
- **Hover:** Background shifts to `border-primary`; the field reveals itself rather than carrying a permanent box.
114112
- **Focus:** `outline: none` globally; focus is conveyed by context (selection state, surrounding chrome), consistent with the quiet-control philosophy.
115113

116-
### Tags / Priority Chips
114+
### Tags
117115

118-
- **Style:** Filled with the muted priority color (Work soft-cyan, Relations teal, Self blue-gray, Unassigned slate); `text-dark` label.
119-
- **State:** Hover brightens the fill via `brighten()`. Used to categorize events; never as decorative accents elsewhere.
116+
- **Style:** Filled with the flat event fill slate (`#8293a1`); `text-dark` label.
117+
- **State:** Hover brightens the fill via `brighten()`. Used to mark event-related content; never as decorative accents elsewhere.
120118

121119
### Navigation / Planner Sidebar
122120

@@ -125,7 +123,7 @@ Controls are quiet, borderless, and hover-revealing: they sit flush on their sur
125123
### Calendar Grid (signature surface)
126124

127125
- **Grid lines:** `grid-line-primary` hairlines (`hsl(219 18 34 / 20%)`) structure the Timed Grid without visual weight.
128-
- **Events:** Priority-colored blocks are the brightest content on the canvas. A selected event uses `event-selected` (`#abb9c4`). During drag/resize, a Draft Event carries a state shadow while the source element either dims (`dim-source`) or hides (`hide-source`).
126+
- **Events:** Event blocks are the brightest content on the canvas. A selected event uses `event-selected` (`#abb9c4`). During drag/resize, a Draft Event carries a state shadow while the source element either dims (`dim-source`) or hides (`hide-source`).
129127

130128
### Command Palette
131129

@@ -142,7 +140,7 @@ Controls are quiet, borderless, and hover-revealing: they sit flush on their sur
142140
- **Do** keep exactly one saturated accent (`#57c1ff`) per screen, for selection, primary action, and info only.
143141
- **Do** build depth by stepping surface lightness (`#0d1017``#11151c` → translucent panels), per the Layer-By-Light Rule.
144142
- **Do** leave controls borderless at rest and reveal them via background/color shift on hover and focus.
145-
- **Do** reserve priority colors (Work/Relations/Self/Unassigned) for event blocks and tags, not chrome.
143+
- **Do** reserve the flat event fill color for event blocks and tags, not chrome.
146144
- **Do** carry all UI in Rubik, using weight (400/500/700) and the fixed rem scale for hierarchy.
147145
- **Do** confine Caveat handwriting to the Dedication.
148146
- **Do** hold body/label text to WCAG AA contrast against the dark surfaces; bump muted blue-grays toward `fg-primary` when contrast is close.

docs/acceptance/events.md

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ Use this guide to validate:
99
- creating timed events on the calendar grid
1010
- creating all-day events
1111
- editing events via the form
12-
- changing event priority via the right-click context menu
1312
- deleting standalone events
1413
- dragging events to a new time slot
1514
- resizing events
@@ -102,37 +101,16 @@ Right-clicking an event and selecting Edit (or clicking the event directly) open
102101
2. Right-click the event and select Edit (or click the event).
103102
3. Change the title.
104103
4. Change the start time.
105-
5. Change the priority to a different value.
106-
6. Submit the form.
104+
5. Submit the form.
107105

108106
### Expected Results
109107

110-
- The event block on the grid updates immediately to reflect the new title, time, and priority color.
108+
- The event block on the grid updates immediately to reflect the new title and time.
111109
- Changes persist after a page reload.
112110

113111
---
114112

115-
## Scenario 4: Change Event Priority Via Right-Click Context Menu
116-
117-
### UX
118-
119-
Right-clicking an event opens a context menu with a quick priority picker. This is faster than opening the full form.
120-
121-
### Steps
122-
123-
1. Right-click a timed event on the grid.
124-
2. Select a different priority from the context menu (Work, Self, or Relations).
125-
3. Click elsewhere to close the menu.
126-
127-
### Expected Results
128-
129-
- The event block color updates immediately to match the new priority.
130-
- No full form is required.
131-
- The priority change persists after a page reload.
132-
133-
---
134-
135-
## Scenario 5: Delete A Standalone Event
113+
## Scenario 4: Delete A Standalone Event
136114

137115
### UX
138116

@@ -151,7 +129,7 @@ Deleting a standalone event (non-recurring) removes it immediately. No scope dia
151129

152130
---
153131

154-
## Scenario 6: Drag An Event To A New Time Slot
132+
## Scenario 5: Drag An Event To A New Time Slot
155133

156134
### UX
157135

@@ -174,7 +152,7 @@ Users can click-hold and drag an event block to a new time or date. The event sn
174152

175153
---
176154

177-
## Scenario 7: Resize An Event
155+
## Scenario 6: Resize An Event
178156

179157
### UX
180158

@@ -197,7 +175,7 @@ Hovering near the top or bottom edge of an event reveals a resize cursor. Draggi
197175

198176
---
199177

200-
## Scenario 8: Duplicate An Event (Cmd+D)
178+
## Scenario 7: Duplicate An Event (Cmd+D)
201179

202180
### UX
203181

@@ -211,13 +189,13 @@ With an event form open, pressing Cmd+D (Mac) or Ctrl+D (Windows) creates a copy
211189

212190
### Expected Results
213191

214-
- A new event appears on the grid with the same title, time, priority, and description as the original.
192+
- A new event appears on the grid with the same title, time, and description as the original.
215193
- Both the original and the duplicate are present on the grid.
216194
- The duplicate persists after a page reload.
217195

218196
---
219197

220-
## Scenario 9: Undo An Event Deletion (Cmd+Z / Ctrl+Z)
198+
## Scenario 8: Undo An Event Deletion (Cmd+Z / Ctrl+Z)
221199

222200
### UX
223201

@@ -248,7 +226,7 @@ blocked.
248226

249227
---
250228

251-
## Scenario 10: Create An Event On A Specific Calendar
229+
## Scenario 9: Create An Event On A Specific Calendar
252230

253231
### UX
254232

@@ -279,11 +257,11 @@ operable.
279257

280258
---
281259

282-
## Scenario 11: Duplicating An Event Defaults To Its Source Calendar
260+
## Scenario 10: Duplicating An Event Defaults To Its Source Calendar
283261

284262
### UX
285263

286-
Cmd+D (see Scenario 8) creates a copy on the same calendar as the
264+
Cmd+D (see Scenario 7) creates a copy on the same calendar as the
287265
original, as long as that calendar is still writable.
288266

289267
### Steps
@@ -302,7 +280,7 @@ original, as long as that calendar is still writable.
302280

303281
---
304282

305-
## Scenario 12: Editing Shows The Calendar As Read-Only Text
283+
## Scenario 11: Editing Shows The Calendar As Read-Only Text
306284

307285
### UX
308286

@@ -323,7 +301,7 @@ form — moving an event to a different calendar is out of scope for v1 (A6).
323301

324302
---
325303

326-
## Scenario 13: Read-Only Calendar Events Are Inspectable But Never Editable
304+
## Scenario 12: Read-Only Calendar Events Are Inspectable But Never Editable
327305

328306
### UX
329307

@@ -345,7 +323,7 @@ action is unavailable.
345323
no Save button appears, and a note reads "Read-only — you don't have
346324
permission to edit this event."
347325
- The right-click context menu shows "View" (not "Edit"), "Duplicate", and
348-
no Delete option or priority-color picker.
326+
no Delete option.
349327
- The event cannot be picked up and dragged to a new time or day; no drag
350328
preview appears.
351329
- No resize cursor or resize handle appears at the event's edges.
@@ -355,7 +333,7 @@ action is unavailable.
355333

356334
---
357335

358-
## Scenario 14: Busy Private Events Show No Details
336+
## Scenario 13: Busy Private Events Show No Details
359337

360338
### UX
361339

@@ -375,7 +353,7 @@ title, description, or attendees.
375353
- The event displays with the title "Busy" on the grid and in its form,
376354
regardless of the event's real Google title.
377355
- No description, location, or attendee details are shown anywhere.
378-
- The event is read-only the same way Scenario 13 describes. (Busy content
356+
- The event is read-only the same way Scenario 12 describes. (Busy content
379357
forces read-only even on a calendar you can otherwise write to — the
380358
redaction is per-event, not just per-calendar.)
381359

@@ -389,13 +367,12 @@ If time is limited, run these checks before shipping event-related changes:
389367
2. Submitting a new event places it on the grid and it survives a page reload.
390368
3. All-day events appear in the all-day row, not the hourly grid.
391369
4. Editing an event updates the grid block immediately.
392-
5. Right-click priority change updates the event color without opening the full form.
393-
6. Deleting a standalone event shows no scope dialog.
394-
7. Dragging an event to a new slot moves it and persists after reload.
395-
8. Resizing an event updates the duration and persists after reload.
396-
9. Cmd+D duplicates an event with the same properties.
397-
10. Cmd+Z / Ctrl+Z after deletion restores the event.
398-
11. A new/duplicate event form offers only writable calendars, defaulting to
370+
5. Deleting a standalone event shows no scope dialog.
371+
6. Dragging an event to a new slot moves it and persists after reload.
372+
7. Resizing an event updates the duration and persists after reload.
373+
8. Cmd+D duplicates an event with the same properties.
374+
9. Cmd+Z / Ctrl+Z after deletion restores the event.
375+
10. A new/duplicate event form offers only writable calendars, defaulting to
399376
primary; an existing event's form shows its calendar as read-only text.
400-
12. Read-only calendar events can be inspected (`M` / context-menu "View")
377+
11. Read-only calendar events can be inspected (`M` / context-menu "View")
401378
but never dragged, resized, or deleted.

docs/acceptance/google-sync.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ is never touched.
401401
removed.
402402
- The Compass-local calendar, and the scheduled events you
403403
created on it before ever connecting Google, remain exactly as they
404-
were — nothing about the account, priorities, or local data is deleted.
404+
were — nothing about the account or local data is deleted.
405405
- The toast and reconnect-prompt behavior matches Scenario 7.
406406

407407
---

docs/acceptance/recurring-events.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ When creating an event, enabling the Repeat toggle reveals recurrence options. S
5353
### Expected Results
5454

5555
- The event appears on every Monday and Wednesday going forward in the calendar.
56-
- Each instance is visually identical (same title, priority, and time).
56+
- Each instance is visually identical (same title and time).
5757
- The series persists after a page reload.
5858

5959
---

docs/architecture/event-and-task-domain-model.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ recorded reasoning instead of rediscovering it:
5656
manages sharing/ACLs on a provider calendar (A1, A15). Calendar lifecycle
5757
stays server-owned and Google-authoritative in v1.
5858
- **Per-event Google colors.** Compass models calendar identity as an
59-
accent/marker plus text label, while an event card's fill stays
60-
priority-driven (A9) — there is no per-event color field in
59+
accent/marker plus text label, while an event card's fill stays a single
60+
flat neutral color (A9) — there is no per-event color field in
6161
`event.contracts.ts` anywhere, so Google's per-event `colorId` overrides are
6262
neither imported nor exposed. Surfacing them would need a second color
6363
dimension on the card that A9 deliberately avoided.
@@ -74,7 +74,6 @@ Important event fields:
7474
- `startDate`, `endDate`: ISO datetime or date strings
7575
- `isAllDay`: display semantics
7676
- `origin`: where the event came from
77-
- `priority`: shared priority enum
7877
- `gEventId`: Google event id when synced
7978
- `gRecurringEventId`: Google recurring parent id when relevant
8079
- `recurrence.rule`: RRULE array for recurring bases

docs/backend/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ Backend routes are registered from
2525
| Config | `packages/backend/src/config/config.routes.config.ts` | Public runtime config used by the web app. |
2626
| Auth | `packages/backend/src/auth/auth.routes.config.ts` | Compass-owned auth helpers and authenticated Google connect. SuperTokens also mounts recipe routes under `/api`. |
2727
| User | `packages/backend/src/user/user.routes.config.ts` | Profile and metadata for the active session. |
28-
| Priority | `packages/backend/src/priority/priority.routes.config.ts` | Priority CRUD for authenticated users. |
2928
| Events | `packages/backend/src/event/event.routes.config.ts` | Event CRUD and reorder/delete helpers. |
3029
| Event stream | `packages/backend/src/events/events.routes.config.ts` | Authenticated SSE stream at `GET /api/events/stream`. |
3130
| Sync | `packages/backend/src/sync/sync.routes.config.ts` | Google import, maintenance, debug, and notification routes. |

docs/development/feature-file-map.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,9 @@ Use this document to find the first files to inspect for common Compass changes.
9090
- Google import internals: `packages/backend/src/sync/services/import`
9191
- Google/Compass event propagation: `packages/backend/src/sync/services/event-propagation`
9292

93-
## Users / Metadata / Priority
93+
## Users / Metadata
9494

9595
- User queries/services: `packages/backend/src/user`
96-
- Priority feature: `packages/backend/src/priority`
9796
- User metadata service: `packages/backend/src/user/services/user-metadata.service.ts`
9897
- Mobile waitlist gate (web-only external link): `packages/web/src/components/MobileGate/MobileGate.tsx`
9998

docs/features/password-auth-flow.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,6 @@ temporary recipe user id.
387387
- keeps an existing Google payload unless a new one is provided
388388
- keeps the original `signedUpAt` on updates
389389
- updates `lastLoggedInAt`
390-
- creates default priorities only for a new Compass user
391390

392391
For repeated auth on the same user or same normalized email, this writes to the
393392
existing Compass user instead of creating a duplicate record.

docs/self-hosting/event-migration-runbook.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,18 @@ promptly or not at all.
192192
the new schema — no production code reads it.
193193
- Dev databases use the `_dev.` collection prefix; the commands above show
194194
production names.
195+
- `priority-data-cleanup` (`2026.07.14T10.00.00`) is unrelated to this
196+
runbook's two migrations and does not require the staging-first rollout
197+
above — it's independent storage hygiene, not a schema cutover. The
198+
priority-tagging feature was removed (events, contracts, and UI); this
199+
migration `$unset`s the now-dead `priority` field from legacy `event`
200+
documents and drops the orphaned standalone `priority` collection from the
201+
old priority-CRUD feature. Safe to run anytime, in any order relative to
202+
the calendar/event-record migrations — it does not touch `event_new`, the
203+
`calendar` collection, or any validator. `event_new` needs no equivalent
204+
cleanup: it's fully rebuilt from legacy `event` on every backfill rerun, so
205+
it stops carrying `priority` automatically the next time
206+
`event-record-backfill` runs (its transform no longer reads the field).
207+
Like the other migrations here, its `down()` is a non-destructive no-op —
208+
the removed field and dropped collection are not recoverable without a
209+
backup.

0 commit comments

Comments
 (0)