12 KiB

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:

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.