# SLICE 15 — Eisenhower drag and drop with Skeleton quadrant names > **Filename note:** this file is named `SLIDE15.md` as requested. Its feature > sequence and heading identify it as SLICE 15. > > **State-saving rule:** update this file after every completed task and whenever > work pauses. Keep implementation, automated validation, production packaging, > and manual Joplin acceptance as separate status boundaries. ## Status **PLANNED; BLOCKED ON SLICE 14.** Begin only after the shared mutation service, interaction model, automated validation, and manual kanban acceptance in SLICE 14 are complete. ## Goal Make Eisenhower matrices editable by moving cards between quadrants. Each move persists the urgent/important tag combination represented by the destination. At the same time, replace the classic action labels with the more constructive Skeleton labels while retaining Eisenhower's urgent/important axes: | | **Urgent** | **Not urgent** | |---|---|---| | **Important** | **Do Next** | **Scheduled** | | **Not important** | **On Deck** | **Backlog** | This means the current **Eliminate** quadrant becomes **Backlog**. The underlying quadrant remains “not urgent and not important”; only its displayed name changes. ## Confirmed product contract - The label change applies to every Eisenhower matrix, editable or read-only. - Eisenhower's axes remain `urgent-tag` and `important-tag`; no date-derived urgency or in-progress semantics are introduced. - All four Eisenhower quadrant names adopt Skeleton's names: `Do Next`, `Scheduled`, `On Deck`, and `Backlog`. - Skeleton mode remains available and unchanged in v2.0.0, but does not receive drag and drop in this slice. - `editable: yes` enables Eisenhower mutation and defaults to `no`. - Setting `editable: yes` with `mode: skeleton` warns that editing is unavailable and renders a read-only Skeleton matrix. It must not expose inert handles. - Both ordinary opted-in notes and incomplete native to-dos can be moved. - Completed to-dos and notes carrying `done-tag` remain excluded; dragging does not change completion state. - A move changes only the configured urgent/important tag memberships. It does not edit dates, in-progress state, completion, notebook, or unrelated tags. - Pointer drag and keyboard **Move to…** use the shared SLICE 14 behavior. - Sorting remains controlled by `sort` and `sort-type`; drag does not establish manual ordering within a quadrant. - Moves remain within the current notebook group. ## Eisenhower transition rules | Destination | Urgent tag | Important tag | Persisted change | |---|---:|---:|---| | Do Next (top-left) | yes | yes | Add both configured tags. | | Scheduled (top-right) | no | yes | Remove urgent; add important. | | On Deck (bottom-left) | yes | no | Add urgent; remove important. | | Backlog (bottom-right) | no | no | Remove both configured tags. | The rules are identical for ordinary notes and native to-dos. Joplin note type, native completion, `done-tag`, `in-progress-tag`, `gtd` block, dates, and all unrelated tags remain unchanged. If `urgent-tag` and `important-tag` normalize to the same title, the two axes cannot represent four persistent states. Existing parser behavior must be audited. For an editable Eisenhower matrix, treat this configuration as non-editable with a clear warning rather than applying ambiguous mutations. Read-only collection may retain its existing precedence for compatibility. ## Label migration Update the canonical `matrixLabels("eisenhower")` result: | Position | v1 label | v2 label | |---|---|---| | top-left | Do First | Do Next | | top-right | Schedule | Scheduled | | bottom-left | Delegate | On Deck | | bottom-right | Eliminate | Backlog | Remove duplicated fallback label literals in the webview or update them from the same shared contract so an absent/legacy payload cannot silently restore the old wording. Update code comments, tests, README.md, SPEC.md, and accessible labels. No saved data migration is needed because quadrant labels are not persisted. ## Architecture SLICE 15 extends, rather than duplicates, the SLICE 14 pathway: ```text matrix pointer drop or keyboard Move to… | v { view: "matrix", hostNoteId, cardId, destination, rawConfig, viewInstanceId } | v shared message validation - config reparses as mode:eisenhower + editable:yes - card remains admitted, incomplete, in scope, and in the same group | v shared tag mutation primitives apply urgent/important target state | v canonical matrix recollection, sorting, totals, pagination, and rerender ``` Use a matrix-specific semantic destination union (`topLeft | topRight | bottomLeft | bottomRight`, or equivalent named states). Do not let the webview submit arbitrary tag titles or add/remove lists. The main process derives tag operations from freshly parsed configuration and the fixed destination table. ### Fresh-state validation Before writing, confirm all SLICE 14 host, scope, type, grouping, and `gtd` eligibility checks, plus: - mode is still `eisenhower`; - `editable` is still enabled; - urgent and important tag names remain distinct after normalization; - the item is still incomplete under native or note `done-tag` semantics; - the destination is one of the four fixed quadrants. If the item became complete or the block changed mode/configuration during a drag, make no write, report stale state, and refresh the matrix. ## Interaction and rendering rules - Reuse SLICE 14 pointer thresholds, capture, cancellation, pending/error states, request sequencing, focus recovery, live announcements, and canonical refresh. - Highlight only quadrants in the same matrix instance and notebook group. - Use the new quadrant labels everywhere, including **Move to…** options and announcements. - Do not infer a source quadrant in the main process from stale DOM data; fetch current tags and calculate a minimal target-state change. - Same-quadrant moves are no-ops. - A canonical refresh may sort the card to a different position or beyond the currently visible `page-size`; counts and **List more** remain authoritative. - Read-only Eisenhower matrices receive the label change without drag handles, move menus, mutation requests, or new focus stops. - Skeleton matrices receive the label-independent shared rendering regressions only and remain read-only. ## Implementation plan ### Phase 1 — Label change and compatibility tests - [ ] Change Eisenhower labels to Do Next, Scheduled, On Deck, and Backlog. - [ ] Update comments and remove/update fallback literals that contain Do First, Schedule, Delegate, or Eliminate. - [ ] Update unit and rendering tests for single and grouped layouts. - [ ] Confirm Skeleton labels and both modes' row/column axes remain unchanged. - [ ] Confirm the label-only change applies when `editable` is omitted. ### Phase 2 — Matrix configuration and protocol - [ ] Add `editable: boolean` to `MatrixConfig`, defaulting to `false`. - [ ] Parse `editable: yes | no` using the SLICE 14 validation contract. - [ ] Warn and disable editing for `mode: skeleton`. - [ ] Warn and disable editable Eisenhower when normalized axis tags are equal. - [ ] Define constrained matrix move intents and fixed destinations using the shared host/view identity and typed result model. - [ ] Add parser/protocol tests for defaults, invalid values, mode interaction, equal-axis tags, and backward compatibility. ### Phase 3 — Eisenhower mutation planning - [ ] Implement the four urgent/important target states through shared tag primitives from SLICE 14. - [ ] Calculate minimal, idempotent tag membership changes from fresh data. - [ ] Preserve completion, progress, dates, body, note type, notebook, and unrelated tags. - [ ] Cover notes and to-dos, custom tag names, casing, duplicate tags, all 12 cross-quadrant moves, same-quadrant no-ops, and partial failures. - [ ] Prove a completed or newly filtered item cannot be mutated. ### Phase 4 — Message validation and refresh - [ ] Add the matrix move message to the main-process handler. - [ ] Reparse and validate editable Eisenhower configuration and fresh eligibility. - [ ] Reject arbitrary destinations, tag operations, fields, modes, host notes, out-of-scope items, cross-group moves, and stale completions. - [ ] Return typed results and refresh only the initiating matrix instance. - [ ] Guard against older responses overwriting newer renders. ### Phase 5 — Pointer and keyboard interaction - [ ] Reuse the SLICE 14 drag affordance and pointer lifecycle for quadrants. - [ ] Constrain active targets to the same matrix instance and notebook group. - [ ] Add new-label drag feedback, pending/error states, and cancellation. - [ ] Add keyboard **Move to…** options for the other three quadrants. - [ ] Preserve click-to-open, hover details, pagination, scrolling, focus, and screen-reader announcements. - [ ] Verify read-only Eisenhower and all Skeleton matrices expose no mutation UI. ### Phase 6 — Documentation and complete validation - [ ] Update README.md examples, option tables, quadrant table, read-only text, controls, and limitations. - [ ] Update SPEC.md configuration, label contract, transition table, protocol, mutation safety, accessibility, and refresh behavior. - [ ] Update the unreleased v2.0.0 CHANGELOG entry. - [ ] Decide whether Skeleton remains documented as a supported alternative or is marked as legacy/non-editable; do not remove it in this slice. - [ ] Run focused parser, labels, collector, mutation, handler, render, grouping, pagination, and accessibility tests. - [ ] Run the complete Jest suite, TypeScript, webview syntax, CSS/build, whitespace, and prohibited-reference checks. - [ ] Build and inspect the production JPL without publishing v2.0.0 yet. ### Phase 7 — Manual Joplin acceptance - [ ] Every Eisenhower matrix shows Do Next, Scheduled, On Deck, and Backlog. - [ ] No visible or accessible Eisenhower UI says Do First, Schedule, Delegate, Eliminate, or “Drop this.” - [ ] Read-only Eisenhower matrices retain click, hover, sorting, and pagination behavior without mutation affordances. - [ ] An editable Eisenhower matrix moves an ordinary note through all four quadrants and persists the exact urgent/important tag state after reload. - [ ] An editable Eisenhower matrix moves a native to-do through all four quadrants without changing native completion or progress state. - [ ] Custom distinct axis tags work; equal axis tags warn and disable editing. - [ ] Same-quadrant, cancelled, outside, Escape, and interrupted drags do not write. - [ ] A normal click opens the note; a drag does not accidentally open it. - [ ] Keyboard-only **Move to…** reaches every quadrant and restores focus. - [ ] Stale completion, filtering, scope, group, and API-failure cases converge to canonical state without unrelated data changes. - [ ] Single, grouped, multiple-block, scrolling, and paginated matrices work. - [ ] Skeleton matrices remain correct and read-only. - [ ] Record explicit user sign-off separately from automated checks. ## Out of scope - Skeleton drag and drop. - Removing Skeleton mode or migrating Skeleton blocks to Eisenhower. - Date-derived urgency changes. - Changing completion or in-progress state from an Eisenhower move. - Manual ordering within a quadrant. - Dragging between notebook groups or changing notebook ownership. - Editing arbitrary tags or card fields. - Calendar, Gantt, or mobile drag and drop. - Publishing v2.0.0 before consolidated release acceptance. ## Acceptance criteria - Eisenhower retains urgent/important semantics but consistently uses Skeleton's four constructive quadrant names. - Mutation occurs only for an explicitly editable, valid Eisenhower block. - Every destination persists exactly the configured urgent/important state and preserves completion, progress, content, notebook, and unrelated tags. - Pointer and keyboard interaction share SLICE 14's validated safety and accessibility foundation. - Skeleton mode remains available, correct, and read-only. - Automated validation, production packaging, and explicit manual Joplin acceptance are completed and recorded separately.