371 lines
19 KiB
Markdown
371 lines
19 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
|
||
|
||
**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.
|