19 KiB
Raw Permalink Blame History

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 17 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:

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

  • 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 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

  • 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 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

  • 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 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

  • 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 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

  • 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 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

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

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.