# 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 **COMPLETE.** Phases 1–7 are complete. Focused and full automation passed, the production JPL was built and inspected, and the user confirmed the manual Joplin acceptance tests passed on 2026-07-31. ## 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 - [x] Change Eisenhower labels to Do Next, Scheduled, On Deck, and Backlog. - [x] Update comments and remove/update fallback literals that contain Do First, Schedule, Delegate, or Eliminate. - [x] Update unit and rendering tests for single and grouped layouts. - [x] Confirm Skeleton labels and both modes' row/column axes remain unchanged. - [x] Confirm the label-only change applies when `editable` is omitted. #### Phase 1 completion record - Canonical Eisenhower labels and the defensive legacy-payload webview fallback now use Do Next, Scheduled, On Deck, and Backlog. Labels remain display-only; no card data or persisted state changed. - Updated matrix source comments, current README/SPEC contracts, and the unreleased CHANGELOG entry. Historical version notes remain historical. - Added exact label/axis tests for both modes. Eisenhower still uses Important/Not important rows and Urgent/Not urgent columns; Skeleton still uses Active/Not active and Due soon/Not due soon. - Focused validation passed: 3 suites, 78 tests. Full regression validation passed: 20 suites, 299 tests. TypeScript with `--skipLibCheck`, webview syntax, and `git diff --check` passed. No JPL or manual test was performed in Phase 1. ### Phase 2 — Matrix configuration and protocol - [x] Add `editable: boolean` to `MatrixConfig`, defaulting to `false`. - [x] Parse `editable: yes | no` using the SLICE 14 validation contract. - [x] Warn and disable editing for `mode: skeleton`. - [x] Warn and disable editable Eisenhower when normalized axis tags are equal. - [x] Define constrained matrix move intents and fixed destinations using the shared host/view identity and typed result model. - [x] Add parser/protocol tests for defaults, invalid values, mode interaction, equal-axis tags, and backward compatibility. #### Phase 2 completion record - Added strict scalar `editable: yes | no` parsing to matrix configuration, defaulting to read-only. Invalid/non-scalar values warn and use `no`. - `editable: yes` is effective only for Eisenhower mode with distinct normalized urgent/important tags. Skeleton and equal-axis configurations warn clearly and return `editable: false`, preventing inert mutation UI. - Added fixed positional matrix destinations, a constrained matrix intent, and a runtime guard. Matrix payloads now echo the per-render `viewInstanceId`, the canonical host note ID, and effective editable state. - Focused validation passed: 3 suites, 76 tests. Full regression validation passed: 20 suites, 310 tests. TypeScript with `--skipLibCheck` and `git diff --check` passed. No JPL or manual testing occurred in Phase 2. ### Phase 3 — Eisenhower mutation planning - [x] Implement the four urgent/important target states through shared tag primitives from SLICE 14. - [x] Calculate minimal, idempotent tag membership changes from fresh data. - [x] Preserve completion, progress, dates, body, note type, notebook, and unrelated tags. - [x] Cover notes and to-dos, custom tag names, casing, duplicate tags, all 12 cross-quadrant moves, same-quadrant no-ops, and partial failures. - [x] Prove a completed or newly filtered item cannot be mutated. #### Phase 3 completion record - Exported and reused Slice 14's deterministic case-insensitive find/create, attach, and detach primitives. Matrix mutation maps each fixed destination to the exact urgent/important target state and performs only missing changes. - Covered every source/destination combination for ordinary notes and native to-dos: 24 cross-state cases and eight same-state no-ops across both item types. No completion or note-field adapter operation is available to the matrix service. - Tests cover custom names, existing case variants, duplicate attached tags, missing-tag creation, unrelated-tag preservation, fresh-state rejection, disappeared cards, and partial failures without stale compensation. - Focused validation passed: 2 suites, 50 tests. Full regression validation passed: 21 suites, 347 tests. TypeScript with `--skipLibCheck` and `git diff --check` passed. Packaging and manual acceptance remain pending. ### Phase 4 — Message validation and refresh - [x] Add the matrix move message to the main-process handler. - [x] Reparse and validate editable Eisenhower configuration and fresh eligibility. - [x] Reject arbitrary destinations, tag operations, fields, modes, host notes, out-of-scope items, cross-group moves, and stale completions. - [x] Return typed results and refresh only the initiating matrix instance. - [x] Guard against older responses overwriting newer renders. #### Phase 4 completion record - Registered `moveMatrixCard` and added a testable validation service between untrusted webview intent and the Phase 3 mutation service. - Exact message keys, fixed positional destinations, matching selected host, reparsed effective editable Eisenhower mode, fresh notebook/scope ownership, item filters, `gtd` opt-in, native completion, and note `done-tag` state are validated before writes. Skeleton, equal-axis, completed, filtered, host, out-of-scope, malformed, and expanded requests cannot write. - User-safe success/stale/error results reuse the Slice 14 result model; unexpected API details remain in plugin-process logs. The Phase 5 webview will use echoed `viewInstanceId` and request sequencing for initiating-only refresh. - Focused validation passed: 3 suites, 79 tests. Full regression validation passed: 22 suites, 370 tests. TypeScript with `--skipLibCheck` and `git diff --check` passed. Packaging and manual acceptance remain pending. ### Phase 5 — Pointer and keyboard interaction - [x] Reuse the SLICE 14 drag affordance and pointer lifecycle for quadrants. - [x] Constrain active targets to the same matrix instance and notebook group. - [x] Add new-label drag feedback, pending/error states, and cancellation. - [x] Add keyboard **Move to…** options for the other three quadrants. - [x] Preserve click-to-open, hover details, pagination, scrolling, focus, and screen-reader announcements. - [x] Verify read-only Eisenhower and all Skeleton matrices expose no mutation UI. #### Phase 5 completion record - Editable Eisenhower cards now reuse Slice 14a's compact control stack: a pointer drag handle with a disclosure-controlled keyboard menu beneath it. The menu uses the payload's Do Next, Scheduled, On Deck, and Backlog labels and disables the card's current quadrant. - Pointer targets are resolved only within the card's own matrix grid, so a grouped notebook board cannot accept a drop from another group. Threshold, capture, Escape cancellation, edge scrolling, click suppression, pending state, and canonical post-move rendering match the Kanban interaction. - Matrix moves post only fixed positional destinations with the host and view identities, then refresh only the initiating matrix through a guarded request sequence. Live success/error status and focus recovery survive rerendering. - Controls are created only from the main process's effective `editable` payload; read-only Eisenhower and all Skeleton matrices add no handles, menus, or focus stops. Existing card opening, hover detail, sorting, and List more rendering remain shared and unchanged. - Focused validation passed: 3 suites, 67 tests. Full regression validation passed: 22 suites, 374 tests. Webview syntax and `git diff --check` passed. Packaging and manual Joplin acceptance remain pending. ### Phase 6 — Documentation and complete validation - [x] Update README.md examples, option tables, quadrant table, read-only text, controls, and limitations. - [x] Update SPEC.md configuration, label contract, transition table, protocol, mutation safety, accessibility, and refresh behavior. - [x] Update the unreleased v2.0.0 CHANGELOG entry. - [x] Decide whether Skeleton remains documented as a supported alternative or is marked as legacy/non-editable; do not remove it in this slice. - [x] Run focused parser, labels, collector, mutation, handler, render, grouping, pagination, and accessibility tests. - [x] Run the complete Jest suite, TypeScript, webview syntax, CSS/build, whitespace, and prohibited-reference checks. - [x] Build and inspect the production JPL without publishing v2.0.0 yet. #### Phase 6 completion record - README, specification, and unreleased changelog now document the opt-in Eisenhower control, all four persisted tag states, fresh validation, scoped pointer/keyboard behavior, canonical refresh, accessibility, and unchanged completion/sorting/pagination semantics. Skeleton remains a supported, intentionally read-only default mode rather than being marked legacy. - Focused interaction/mutation/handler validation passed at 3 suites and 67 tests; the complete Jest run passed at 22 suites and 374 tests. TypeScript (`--skipLibCheck`), webview JavaScript syntax, whitespace, and current-source prohibited visible-label checks passed. - `npm run dist` completed. The inspected production artifact is a POSIX-tar JPL containing the manifest and four expected runtime assets, including bundled matrix mutation UI and CSS. This pre-version-bump artifact was version 1.0.0, 193,024 bytes, with SHA-256 `a24ca6bf464c2f4e0aa0cc3815d6a4dc7d565c084b35a8a7c962af1443dcb903`. - The build could not embed Git metadata because the sandbox denied its internal Git subprocess; this does not affect the plugin assets. No publish, version bump, or manual Joplin acceptance was performed. - After Phase 7 user acceptance, the package, lockfile root package, and Joplin manifest were advanced to 2.0.0. The rebuilt 2.0.0 JPL is 193,024 bytes with SHA-256 `fcffaecda3ded4ee11d70e21bd86fa8ede7a7d018b98feb857bce0aae2b67503`. This version change remains uncommitted and unpushed as requested. ### Phase 7 — Manual Joplin acceptance - [x] Every Eisenhower matrix shows Do Next, Scheduled, On Deck, and Backlog. - [x] No visible or accessible Eisenhower UI says Do First, Schedule, Delegate, Eliminate, or “Drop this.” - [x] Read-only Eisenhower matrices retain click, hover, sorting, and pagination behavior without mutation affordances. - [x] An editable Eisenhower matrix moves an ordinary note through all four quadrants and persists the exact urgent/important tag state after reload. - [x] An editable Eisenhower matrix moves a native to-do through all four quadrants without changing native completion or progress state. - [x] Custom distinct axis tags work; equal axis tags warn and disable editing. - [x] Same-quadrant, cancelled, outside, Escape, and interrupted drags do not write. - [x] A normal click opens the note; a drag does not accidentally open it. - [x] Keyboard-only **Move to…** reaches every quadrant and restores focus. - [x] Stale completion, filtering, scope, group, and API-failure cases converge to canonical state without unrelated data changes. - [x] Single, grouped, multiple-block, scrolling, and paginated matrices work. - [x] Skeleton matrices remain correct and read-only. - [x] Record explicit user sign-off separately from automated checks. #### Phase 7 completion record - The user reported all manual Slice 15 tests passed on 2026-07-31 after using the editable Eisenhower acceptance block. This sign-off is recorded separately from the 374-test automated run and production package inspection. ## 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.