Skip to content

Commit 1679f7b

Browse files
committed
Merge main into paper ink bleed
2 parents 7d89998 + d90e089 commit 1679f7b

109 files changed

Lines changed: 12381 additions & 68 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.

.paper-issues/00-tracker.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# PAPER-00 · Master Tracker · Paper & Graphite, Ember Edition Overhaul
2+
3+
## Thesis
4+
5+
Adopt the **Paper & Graphite, Ember Edition** visual + interaction system across the Taskdeck frontend. The system encodes the product's core thesis — capture → review → apply with no silent mutations — directly in materials (cream paper, hairline rules, italic serif, single seal-red ember accent) rather than helper labels. Trust signals are physical: applied stamps emboss, undo windows literally erase as the 6-hour grace closes.
6+
7+
Source of truth: `design_handoff_taskdeck_paper/` checked into the repo (README + JSX prototypes + `paper/tokens.css`).
8+
9+
## Strategic intent
10+
11+
- Replace the current Obsidian-toned shell across all primary surfaces with Paper-Light as canonical, Paper-at-Night as the dark companion (strict mirror of metaphor).
12+
- Make Review the centerpiece: implement the *deep* version with provenance, side-effects, conflicts, history, confidence dial, undo timeline, similar-past decisions.
13+
- Replace every `loading…` / spinner state in LLM flows with **Ink Bleed** — a 5-phase, 4.6s motion that dries to a stamp.
14+
- Keep behavior unchanged: this is presentation + interaction polish, not a backend rewrite. All capture / proposal / approval semantics remain the same.
15+
16+
## Non-goals
17+
18+
- No backend changes beyond what surface needs require (e.g., new fields the dossier needs).
19+
- No new product features beyond what the design implies (e.g., "Seal day", "A line for tomorrow", undo timer).
20+
- No removal of the existing `--td-*` token system in this overhaul. Paper sits parallel under `.paper` / `.paper-night` scope until migration is ready to flip canonical.
21+
- Multiplayer/CRDT explicitly out of scope.
22+
23+
## Phasing
24+
25+
### Phase 1 · Foundation (must land first, blocks everything else)
26+
- **PAPER-01** Tokens + theme classes + fonts + paper substrate
27+
- **PAPER-02** Component primitives (Stamp, HLBtn, Tagstamp, Card, kbd, hairline icons)
28+
29+
### Phase 2 · Shell
30+
- **PAPER-03** Sidebar + TopBar in Paper
31+
32+
### Phase 3 · Surfaces (parallelizable after Phase 1+2)
33+
- **PAPER-04** Home / morning reset
34+
- **PAPER-05** Board / kanban with index card variant
35+
- **PAPER-06** Review *deep* — central surface
36+
- **PAPER-07** Inbox / capture (composer + nib)
37+
- **PAPER-08** Today / end-of-day dossier
38+
- **PAPER-09** Misc surfaces (Card detail, ⌘K palette, Shortcuts overlay, Toasts, Empty states)
39+
40+
### Phase 4 · Motion + responsive + dark
41+
- **PAPER-10** Ink Bleed motion system (signature LLM thinking state)
42+
- **PAPER-11** Narrow companions (375 phone, 768 tablet)
43+
- **PAPER-12** Paper at Night dark theme verification across all surfaces
44+
45+
## Acceptance gates per slice
46+
47+
Every slice must:
48+
- Land behind the Paper feature flag (or `.paper` body class scope) so existing Obsidian surfaces remain green during migration.
49+
- Ship vitest unit/component tests for new primitives + DOM-level assertions for view changes.
50+
- Pass `npm run typecheck` + `npm run lint` (max 20 warnings) + backend `dotnet build` if backend touched.
51+
- Pass an adversarial review pass that explicitly checks: token misuse, ember-accent overuse (must remain ≤5% of any surface's surface area), serif italic in non-decision copy, missing reduced-motion fallback for any animation, focus rings replacing browser default, hairlines surviving zoom 200%.
52+
- Update `docs/STATUS.md` if user-visible behavior changes; cross-link the master tracker.
53+
54+
## Risk register
55+
56+
- **Token collision**`--td-*` and Paper variables both define ember/paper hues. Mitigation: scope all Paper variables under `.paper`/`.paper-night` and namespace anything new (`--td-paper-*`).
57+
- **Serif loading** — Fraunces is heavy and italic-variable. Self-host with `font-display: swap` to avoid FOUC; pre-cache critical weights.
58+
- **Density** — Paper is a high-density system. 200-card boards must remain frame-stable. Re-verify the perf budget (`docs/PERFORMANCE_BUDGETS.md`).
59+
- **Accent overuse** — single-pigment metaphor breaks if ember leaks into incidental UI. Linter rule: ember class allow-list per surface.
60+
- **Motion accessibility** — Ink Bleed is bold motion. `@media (prefers-reduced-motion)` must reduce to a 200ms opacity fade, no exceptions.
61+
62+
## Reference
63+
64+
- README: `design_handoff_taskdeck_paper/README.md` (canonical spec)
65+
- Tokens: `design_handoff_taskdeck_paper/paper/tokens.css`
66+
- Components: `design_handoff_taskdeck_paper/paper/components.jsx`
67+
- Surfaces: `design_handoff_taskdeck_paper/paper/surface-*.jsx`
68+
- Prototype entry: open `design_handoff_taskdeck_paper/Taskdeck Paper Edition.html` in a browser
69+
70+
## Definition of done for the whole tracker
71+
72+
- All PAPER-01 .. PAPER-12 closed and merged behind the Paper flag.
73+
- A `/styleguide?theme=paper` (and `paper-night`) page renders every component primitive + every surface.
74+
- A workspace toggle promotes Paper to canonical; a follow-up tracker decommissions Obsidian.
75+
- Adversarial review on the integrated experience signs off on accent discipline and motion accessibility.
76+
77+
---
78+
79+
## Child issues
80+
81+
| Phase | Issue | Title |
82+
|---|---|---|
83+
| 1 | #997 | PAPER-01 · Foundation — tokens, theme, fonts, substrate |
84+
| 1 | #998 | PAPER-02 · Component primitives |
85+
| 2 | #999 | PAPER-03 · Sidebar + TopBar shell |
86+
| 3 | #1000 | PAPER-04 · Home / Reset |
87+
| 3 | #1001 | PAPER-05 · Board / Kanban |
88+
| 3 | #1002 | PAPER-06 · Review (Deep) |
89+
| 3 | #1003 | PAPER-07 · Inbox / Capture |
90+
| 3 | #1004 | PAPER-08 · Today / End-of-day dossier |
91+
| 3 | #1005 | PAPER-09 · Misc surfaces |
92+
| 4 | #1006 | PAPER-10 · Ink Bleed motion |
93+
| 4 | #1007 | PAPER-11 · Narrow companions |
94+
| 4 | #1008 | PAPER-12 · Paper at Night |

.paper-issues/01-tokens.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# PAPER-01 · Foundation — Paper tokens, theme classes, fonts, substrate
2+
3+
Part of the **Paper & Graphite, Ember Edition** overhaul (master tracker: PAPER-00).
4+
5+
## Goal
6+
7+
Land the foundation that every later slice depends on: Paper tokens, theme scope, type utilities, paper-substrate background, and font loading. **Nothing else can ship before this.**
8+
9+
## Scope
10+
11+
### CSS / tokens
12+
- Add `frontend/taskdeck-web/src/paper-tokens.css` mirroring `design_handoff_taskdeck_paper/paper/tokens.css` exactly:
13+
- `:root, .paper { … }` light defaults
14+
- `.paper-night { … }` strict dark mirror
15+
- Paper substrate: `repeating-linear-gradient` long-fiber + SVG fleck noise via `background-blend-mode: multiply`
16+
- All typography utility classes: `.tk-display`, `.tk-h1`, `.tk-h2`, `.tk-h3`, `.tk-lede`, `.tk-body`, `.tk-meta`, `.tk-eyebrow`, `.tk-num`, `.tk-serial`, `.tk-ink-italic`
17+
- `.hr-line`, `.hr-soft`, `.hr-double`, `.rule-ledger`
18+
- `.stamp` / `.stamp.ember` / `.stamp.applied` / `.stamp b` / `.stamp .stamp-num`
19+
- `.letterpress`, `.tagstamp`
20+
- `.card`, `.card-lift`, `.well`, `.surface`, `.halo-ember`
21+
- `.btn`, `.btn-primary`, `.btn-ember`, `.btn-ghost`, `.kbd`, `.kbd-light`
22+
- `.hl-icon` / `-md` / `-lg`
23+
- `.status` family (proposed/applied/overdue/draft/live + pulse keyframes)
24+
- `.diff-add`, `.diff-rem`, `.erase-line`
25+
- Import the new sheet from `main.ts` after `design-tokens.css` so Paper sits parallel, not replacing Obsidian.
26+
- Self-host Fraunces, Inter, JetBrains Mono via `@font-face` with `font-display: swap`. Critical weights: Fraunces italic 400 + 500, Inter 400/500/600, JetBrains Mono 500.
27+
28+
### Theme scoping
29+
- Add `frontend/taskdeck-web/src/store/paperThemeStore.ts` Pinia store: `mode: 'paper' | 'paper-night' | 'auto' | 'off'` (default `off`).
30+
- App root applies `paper`/`paper-night` class to `<body>` when mode is on. Persists to `localStorage` key `td.paper.mode`.
31+
- Honor `prefers-color-scheme: dark` only when mode is `auto`.
32+
33+
### Style-guide route
34+
- Add `frontend/taskdeck-web/src/views/PaperStyleGuideView.vue` route at `/styleguide/paper`.
35+
- Render every type utility, component class, status pill, diff strip, stamp variant, both themes side-by-side.
36+
37+
### Tests
38+
- vitest: store mode persistence and body-class application.
39+
- vitest: snapshot `.tk-display em`, `.stamp.ember`, `.tagstamp` for token drift.
40+
41+
## Files to touch / create
42+
43+
- create: `frontend/taskdeck-web/src/paper-tokens.css`
44+
- create: `frontend/taskdeck-web/src/store/paperThemeStore.ts`
45+
- create: `frontend/taskdeck-web/src/views/PaperStyleGuideView.vue`
46+
- create: `frontend/taskdeck-web/public/fonts/*.woff2`
47+
- modify: `frontend/taskdeck-web/src/main.ts`
48+
- modify: `frontend/taskdeck-web/src/App.vue`
49+
- modify: `frontend/taskdeck-web/src/router/index.ts`
50+
51+
## Adversarial review checklist
52+
53+
- [ ] Paper variables scoped under `.paper`/`.paper-night` (no leak when mode is off).
54+
- [ ] No `--td-*` token renamed or removed.
55+
- [ ] Fraunces italic loads via `font-display: swap` — no FOUC.
56+
- [ ] `.tk-display em` renders in `--ember`.
57+
- [ ] Background substrate respects `prefers-reduced-transparency` and zoom 200%.
58+
- [ ] `.paper-night` does not require a `data-theme` attribute swap — class only.
59+
60+
## Acceptance
61+
62+
- `npm run dev` shows `/styleguide/paper` with all type, components, both themes.
63+
- `npm run typecheck` and `npm run lint` clean.
64+
- Master tracker referenced.

.paper-issues/02-primitives.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# PAPER-02 · Component primitives — Stamp, HLBtn, Tagstamp, Card variants, Kbd, Hairline icons
2+
3+
Part of the Paper overhaul (master tracker: PAPER-00). **Blocked by:** PAPER-01.
4+
5+
## Goal
6+
7+
Provide reusable Vue SFC primitives that every Paper surface composes from. Match the JSX reference behavior pixel-for-pixel within Vue 3 idioms.
8+
9+
## Components (under `frontend/taskdeck-web/src/components/paper/`)
10+
11+
- **`PaperStamp.vue`** — props `kind: 'applied' | 'proposed' | 'captured' | 'overdue' | 'draft'`, `date`, `time`, `num`, `rotate?` (default −7° to −9° randomized once on mount). Embossed inset on `applied`. On undo, crossfade to `proposed` over 240ms.
12+
- **`PaperHLBtn.vue`** — props `label`, `kbd?`, `icon?` (slot), `variant: 'default' | 'primary' | 'ember' | 'ghost'`. Renders the keyboard hint inline with a 1px vertical divider. `:active` `translateY(1px)`.
13+
- **`PaperTagstamp.vue`** — slot for label, `tone?: 'ember' | 'applied' | 'overdue' | 'mute'`. Letter-spacing **.22em**.
14+
- **`PaperCard.vue`**`variant: 'flat' | 'lift' | 'well'`, `halo?: boolean`. Default slot.
15+
- **`PaperKbd.vue`** — slot for the key glyph. `light?: boolean`.
16+
- **`PaperHairlineIcons.vue`** — exporting named icon components mirroring `paper/icons.jsx` (Plus, Search, Stamp, Sparkle, ArrowRight, X, Check, Pages, Pen, Cursor, Tag, Dot, Eye, Bell, ChevronD, ChevronR, Settings, Sun, Moon). 14–16px, `stroke="currentColor"`, no fill.
17+
- **`PaperStatusPill.vue`**`kind: 'proposed' | 'applied' | 'overdue' | 'draft' | 'live'`. `live` pulses at 0.6Hz.
18+
- **`PaperLedgerRow.vue`**`idx`, `title`, `meta`, `status?`, click-to-open.
19+
- **`PaperConfidenceDial.vue`**`value: number 0..1`, 84px SVG, ember stroke-dasharray, serif italic value, mono "CONF" caption.
20+
- **`PaperUndoTimeline.vue`**`appliedAt`, `windowMs = 6h`, dashed timeline crossfading dashes left-to-right. `requestAnimationFrame` capped at 1Hz with reduced-motion fallback.
21+
22+
## Tests
23+
24+
- vitest unit tests per component.
25+
- Storybook stories in `src/stories/paper/` per primitive in both themes.
26+
- Snapshot test for `PaperConfidenceDial value={0.84}`.
27+
28+
## Adversarial review checklist
29+
30+
- [ ] Stamp rotation computed once on mount.
31+
- [ ] HLBtn `kbd` slot does not break layout for wide keys (`space`, `⌘K`).
32+
- [ ] Confidence dial respects `prefers-reduced-motion`.
33+
- [ ] Undo timeline cleans up rAF on unmount.
34+
- [ ] No primitive imports a surface or store.
35+
- [ ] All primitives render correctly inside `.paper-night` without a dark-mode prop.
36+
- [ ] Hairline icons use `currentColor`.

.paper-issues/03-shell.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# PAPER-03 · Shell — Sidebar + TopBar in Paper
2+
3+
Part of the Paper overhaul (master tracker: PAPER-00). **Blocked by:** PAPER-01, PAPER-02.
4+
5+
## Goal
6+
7+
Reskin the persistent shell (sidebar + top bar) to match the Paper specification, behind the Paper feature flag.
8+
9+
## Spec
10+
11+
### Sidebar (220–232px)
12+
- Background `--paper-2`, right border `1px solid var(--line)`.
13+
- Header: serif "Taskdeck" 18px medium + tk-eyebrow ("Precision Mode · active" — "active" word in `--ember`).
14+
- Workspace switcher: paper-card chip (22px serif italic letter glyph) + workspace name + ChevronD.
15+
- Section groups (each preceded by `tk-eyebrow` label):
16+
- Primary loop: Home, Today, Review (badge), Boards, Inbox (badge)
17+
- Workbench tools: Views, Notifications, Chat, Calendar, Metrics, Integrations, Activity, Ops
18+
- Meta (no eyebrow, muted): Settings, API Keys, Preferences, Shortcuts, Logout
19+
- Items: 36px height, 6px 20px padding, mono single-letter glyph + 12.5px Inter label, optional `· N` mono badge.
20+
- Active: 2px left border `--ember`, gradient background, glyph ember, label weight 600.
21+
- Footer: live status pill + version mono.
22+
23+
### TopBar (48–56px)
24+
- Background `--paper`, border-bottom `1px solid var(--line)`.
25+
- Left: breadcrumb sans 12.5px, `/` separator in `--whisper`.
26+
- Right: ⌘K trigger (paper-card chip), `SYNCED · LOCAL-FIRST` live pill, vertical hairline, Bell + Settings ghost buttons, 26px circular avatar serif italic.
27+
28+
## Implementation
29+
30+
- Create `PaperSidebar.vue` and `PaperTopBar.vue`.
31+
- Modify `AppShell.vue` to render Paper variants when `paperThemeStore.mode !== 'off'`.
32+
- Wire breadcrumb from `route.meta.breadcrumb`.
33+
- ⌘K trigger emits to existing palette composable.
34+
- Theme toggle (☼ / ☾) in sidebar footer.
35+
36+
## Tests
37+
- vitest: sidebar groups; active item ember class; badge.
38+
- vitest: topbar emits `palette:open` on ⌘K.
39+
- Playwright: smoke load under both themes.
40+
41+
## Adversarial review
42+
43+
- [ ] No double sidebar when toggling.
44+
- [ ] Active route detection survives nested routes.
45+
- [ ] Theme toggle persists across reload.
46+
- [ ] Sidebar collapses cleanly to icon-only at narrow viewports (soft contract for PAPER-11).
47+
- [ ] No hard-coded color literals in SFC `<style>`.
48+
- [ ] Breadcrumb truncates with ellipsis at narrow widths.

.paper-issues/04-home.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# PAPER-04 · Home / Reset surface
2+
3+
Part of the Paper overhaul (master tracker: PAPER-00). **Blocked by:** PAPER-01, PAPER-02, PAPER-03.
4+
5+
## Goal
6+
7+
Re-skin `HomeView` as the morning-reset surface — serif italic greeting, queued items, quick capture.
8+
9+
## Spec
10+
- Greeting in serif italic 36–44px ("Good morning, Daniel."), period auto-derived from local clock.
11+
- `tk-lede` subtitle summarizing today's queue count + focus block reminder.
12+
- Three "queued for you" cards (proposals + carry-overs) styled as Paper cards with serial, serif title, mono metadata.
13+
- Quick capture single-line at the bottom: serif italic placeholder, hairline border, ⌘; hint.
14+
15+
## Implementation
16+
- Create `frontend/taskdeck-web/src/views/paper/PaperHomeView.vue`.
17+
- Modify `HomeView.vue` to delegate when paper mode is on (lazy-loaded).
18+
- Reuse existing home-queue composable; do not refetch.
19+
- Quick capture wires through existing capture store.
20+
21+
## Tests
22+
- vitest: greeting picks correct period from a fixed clock.
23+
- vitest: empty queue shows the empty state primitive.
24+
- Playwright: smoke load with seeded user.
25+
26+
## Adversarial review
27+
- [ ] Greeting reads naturally with no first name (fallback "Hello").
28+
- [ ] Quick capture doesn't dispatch on empty Enter.
29+
- [ ] Cards keep ember accent only on the proposal subset.
30+
- [ ] No layout shift when queue resolves.

.paper-issues/05-board.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# PAPER-05 · Board / Kanban surface in Paper
2+
3+
Part of the Paper overhaul (master tracker: PAPER-00). **Blocked by:** PAPER-01, PAPER-02, PAPER-03.
4+
5+
## Goal
6+
7+
Re-skin `BoardView` as the Paper kanban — 4 columns, index card variant, hairline density.
8+
9+
## Spec
10+
- Columns: 280px wide, `--paper-2` background, `1px var(--line-soft)` border, 16px gap.
11+
- Header: mono serial (`§ 04`) + serif name + count badge.
12+
- Card variant A — Index card (default):
13+
- Top: mono serial number (`C-090`).
14+
- Title serif 14.5px medium.
15+
- Optional 1-line body.
16+
- 11px mono metadata bottom strip.
17+
- Card variant B — Tag ribbon: 4px colored ribbon left edge keyed to label.
18+
- Column footer: hairline `+ capture` button.
19+
- WIP-limit warning surfaces as overdue tagstamp on column header.
20+
21+
## Implementation
22+
- Create `views/paper/PaperBoardView.vue`, `PaperBoardColumn.vue`, `PaperBoardCard.vue`.
23+
- Reuse existing drag-drop composable + `boardStore` actions.
24+
- Hover lifts card 1px via `box-shadow` (no scale).
25+
- Card max-width 248px inside column; body line-clamp 1.
26+
27+
## Tests
28+
- vitest: variant A by default; variant B with prop.
29+
- Playwright: drag a card across columns; assert audit-log entry.
30+
- Accessibility: 2px ember focus ring with 1px gap.
31+
32+
## Adversarial review
33+
- [ ] No re-render storm on drag.
34+
- [ ] 200-card columns scroll smoothly (60fps).
35+
- [ ] Empty column shows hairline placeholder.
36+
- [ ] Done column heuristic still applies for metrics.

.paper-issues/06-review-deep.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# PAPER-06 · Review (Deep) — central surface
2+
3+
Part of the Paper overhaul (master tracker: PAPER-00). **Blocked by:** PAPER-01, PAPER-02, PAPER-03. **Recommended:** PAPER-10.
4+
5+
## Goal
6+
7+
Replace `ReviewView` with the Paper deep-Review surface — the most important screen.
8+
9+
## Spec (paper/surface-review-deep.jsx + README §3)
10+
11+
3-column grid `280px | flex | 320px`:
12+
13+
### Queue rail
14+
- Eyebrow `Queue · N awaiting · M stale` + filter pills.
15+
- `Q` rows with serial, age, serif title, author + confidence + reach.
16+
- Active item: 2px ember left border + ember-bloom gradient.
17+
- "Recently applied · undoable" with `↶ time-left`.
18+
- "This week" mini cadence (7 bars) + apply/undo rates.
19+
20+
### Main
21+
- Header: PROPOSED tagstamp, serial, serif italic 36–44px title with `<em>` highlights, lede, 200px confidence dial card right-aligned.
22+
- Sticky decision rail: tagstamp DECISION + summary mono + Reject/Edit/Defer/Apply (ember).
23+
- §I The change: 2-col before/after card. Field diff strip below.
24+
- §II Provenance: 5 rows (primary/contextual/excluded/inferred), 32px icon + 200px italic key + value.
25+
- §III Side effects: 7-row table + Reversibility card with `PaperUndoTimeline`.
26+
- §IV Conflicts & warnings (warn rust / info mute / ok sage).
27+
- §V History: ledger table, serial + event + age + status pill.
28+
29+
### Right rail
30+
- Author card with proposed Stamp absolutely positioned top-right rotated −9°; confidence breakdown bars.
31+
- Why-now card.
32+
- Similar past decisions (3) with verdict tagstamps.
33+
- Decide-with-keys card in ember tint.
34+
35+
## Keyboard
36+
⏎ Apply · ⌫ Reject · E Edit · D Defer 1h · P Provenance · Space Preview
37+
38+
## Implementation
39+
- Create `views/paper/PaperReviewView.vue` orchestrator.
40+
- Decompose into `ReviewQueueRail.vue`, `ReviewMain.vue`, `ReviewRightRail.vue`, plus subcomponents.
41+
- Reuse `useReviewProposals`; extend with provenance/sideEffects/confidenceBreakdown/conflicts/history/similarPast selectors.
42+
- If backend lacks fields, ship feature-flagged stubs with mock data and open follow-up issues per gap.
43+
- `useReviewKeymap` composable scoped to route.
44+
45+
## Backend gaps to file as sub-issues
46+
- Provenance fullReadSet link target.
47+
- SimilarPastDecisions query (apply rate windowed).
48+
- ConfidenceBreakdown 4-component.
49+
- Reversibility per-proposal (defaults to 6h).
50+
51+
## Tests
52+
- vitest: confidence dial; status pill mapping; keyboard map dispatches.
53+
- Playwright: open Review; press ⏎; assert applied stamp + undo timer.
54+
55+
## Adversarial review
56+
- [ ] Decision rail stays sticky without overlap (z-index 2).
57+
- [ ] Apply remains atomic — single ledger entry post-apply.
58+
- [ ] ⏎ inside text inputs (defer reason, edit composer) does NOT apply.
59+
- [ ] Erase-line on Reversibility animates linearly over configured window.
60+
- [ ] No ember leak into conflicts table (warn = `--overdue`).
61+
- [ ] Stamp on author card doesn't intercept clicks.

0 commit comments

Comments
 (0)