260 lines
12 KiB
Markdown

# 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.