16 KiB
SLICE 9 — Include opted-in note cards in kanban and matrix views
State-saving rule: update this file and
TASKS.mdafter every completed task and whenever work pauses. Automated checks and manual Joplin acceptance must be recorded separately.
Status
COMPLETE. Phases 1–7 are complete. Automated validation, production packaging, and manual Joplin acceptance all passed.
Goal
Allow ordinary Joplin notes (is_todo: 0) containing a gtd fenced block to
appear as cards in kanban and matrix views. Preserve existing to-do behavior and
continue excluding normal notes that have not explicitly opted in.
Confirmed behavior
- A normal note is eligible only when
extractGtdBlockreportsfound: true. - An empty
gtdblock is a valid opt-in, matching existing calendar semantics. - A malformed
gtdblock still opts the note in and surfaces the existing warning; fallback card properties come from the source note. - The existing
todos:option continues to govern only to-dos. It does not disable or broaden normal-note inclusion. - No new
notes:option is introduced in this slice. - Kanban placement for normal notes:
- configured in-progress tag -> In Progress;
- otherwise -> Backlog;
- never -> Done.
- Matrix placement for normal notes:
- Eisenhower mode uses the existing important and urgent tags;
- Skeleton mode uses the existing in-progress tag plus urgent tag/date rules.
- A note date comes only from the
gtdblock. To-do date resolution remains block date first, thentodo_due. - Note cards reuse block title, colours, icon, and text; missing values fall back exactly as existing cards do.
- Normal notes are never completed and never show the recurring-to-do marker, even if they happen to carry the configured recurrence tag.
- The host kanban/matrix note remains excluded from its own results.
- SLICE8 batching counts note and to-do cards together after final sorting.
Inclusion decision table
| Item | gtd block |
todos: |
Kanban | Matrix |
|---|---|---|---|---|
| Normal note | absent | any | excluded | excluded |
| Normal note | present/empty/malformed | any | included | included |
| To-do | absent | gtd-only |
excluded | excluded |
| To-do | absent | all |
included | included if incomplete |
| To-do | present | gtd-only or all |
included | included if incomplete |
| To-do | any | none |
excluded | excluded |
| Completed to-do | any included mode | any | Done-window rules | excluded |
Architecture and data flow
scoped RawNote
|
+-- host note? ------------------------------> exclude
|
+-- ordinary note
| extract gtd block
| absent -> exclude
| found -> build note card -> tags -> bucket
|
+-- to-do
existing todos/completion rules
-> extract block -> tags -> build card -> bucket
combined bucket -> existing sort -> SLICE8 incremental rendering
Collection remains responsible for eligibility, card normalization, tags, bucketing, sorting, warnings, and totals. The webview should not need separate rendering logic for note cards.
Implementation plan
Phase 1 — Card model and shared builder
- Add an explicit card discriminator to
KanbanCardinsrc/Gtd/types.ts, preferablyisTodo: boolean, so completion/recurrence rendering does not infer item kind indirectly. - Extract duplicated kanban/matrix card construction into a small shared helper only if doing so reduces real duplication without changing public collector contracts.
- For normal notes set:
isTodo: false;completed: falseandcompletedTime: 0;isRecurring: false;- date via
resolveEventDate(note, block), which correctly ignorestodo_duefor normal notes.
- For to-dos preserve current completion and recurrence behavior and set
isTodo: true. - Update
renderCardonly as needed to choose a neutral note glyph when a normal note has no custom icon; retain current checkbox glyphs for to-dos. - Decide and document the neutral fallback glyph during implementation using an existing project-compatible symbol; do not alter custom icons.
Phase 1 completion record
- Added
isTodoto the shared card model and centralized kanban/matrix card normalization inbuildKanbanCard. - Normal-note cards are forced incomplete and non-recurring; to-do completion, recurrence, due-date, styling, and override behavior remain unchanged.
- The neutral fallback is
📄, matching the existing calendar note glyph. Custom icons still take precedence, and absentisTodovalues retain the legacy checkbox fallback for compatibility. - Focused validation: 3 suites and 63 tests passed.
- Full validation: 13 suites and 168 tests passed.
- TypeScript validation and webview JavaScript syntax checks passed.
- No manual Joplin test is required for Phase 1 because normal-note collection is not enabled until later phases.
Phase 2 — Kanban eligibility and bucketing
- Refactor the
collectKanban.tsloop so host exclusion occurs first, then item-kind-specific eligibility. - For to-dos, preserve
todos: none,gtd-only, andallbehavior exactly. - For normal notes, call
extractGtdBlockand exclude only when no block is found. - Surface malformed-block warnings for included notes with the existing message format.
- Fetch tags only after an item is eligible.
- Bucket completed to-dos into Done using the existing done-window cutoff.
- Bucket incomplete to-dos and normal notes by the configured in-progress tag; untagged eligible notes go to Backlog.
- Sort the combined note/to-do arrays with the existing configured sorter.
Phase 2 completion record
- Kanban eligibility now branches by item kind after host-note exclusion.
- Ordinary notes require a found
gtdblock; to-dos retain the existingnone,gtd-only, andallrules. - Eligible note cards use existing warning, tag, bucketing, sorting, styling, count, and navigation paths. They can enter Backlog or In Progress, never Done.
- Tag lookup occurs only after eligibility is established.
- Focused validation: 2 suites and 38 tests passed.
- Full validation: 13 suites and 174 tests passed.
- TypeScript, whitespace, and prohibited-reference checks passed.
- Phase 4 still must request bodies in
todos: nonemode before opted-in notes work with that setting against the Joplin data adapter. - No manual Joplin test is required yet; mixed-view acceptance remains Phase 7.
Phase 3 — Matrix eligibility and bucketing
- Apply the same host, item-kind, and shortcode eligibility split in
collectMatrix.ts. - Preserve completed-to-do exclusion.
- Allow eligible normal notes through because they have no completion state.
- Fetch tags only after eligibility is established.
- Reuse the current Eisenhower tag axes without note-specific exceptions.
- Reuse the current Skeleton active/due-soon rules; dateless normal notes naturally fall into the not-due-soon column unless marked urgent.
- Sort combined note/to-do quadrant arrays with the existing sorter.
Phase 3 completion record
- Matrix eligibility now branches by item kind after host-note exclusion.
- Completed to-dos remain excluded; ordinary notes require a found
gtdblock and are not excluded by to-do completion fields. - Eligible notes reuse the existing Eisenhower and Skeleton axes, sorting, warnings, tags, styling, totals, and navigation paths.
todos: nonecontinues to exclude only to-dos at the collector level.- Tag lookup occurs only after eligibility is established.
- Focused validation: 2 suites and 37 tests passed.
- Full validation: 13 suites and 176 tests passed.
- TypeScript, webview syntax, whitespace, and prohibited-reference checks passed.
- Phase 4 still must request bodies in
todos: nonemode for the real Joplin adapter; the collector contract itself is covered. - No manual Joplin test is required yet; mixed-view acceptance remains Phase 7.
Phase 4 — Body-fetch contract
Normal-note eligibility can be known only by reading the body. Consequently,
kanban and matrix collectors must request bodies for every scanned folder even
when todos: none. The previous needsBody = config.todos !== "none"
optimization is no longer valid for these two views.
- Set
includeBody: truefor kanban and matrix folder-note fetches. - Update collector comments so they no longer claim
todos: noneguarantees an empty board. - Update
src/tests/Gtd/fieldsHint.test.tsto expect body fetches in all kanban/matrix modes. - Leave calendar and Gantt body-fetch behavior unchanged.
- Document this intentional performance tradeoff in SPEC.md: explicit note opt-in requires body inspection, but tag requests remain limited to eligible items.
Phase 4 completion record
- Kanban and matrix now request bodies for every in-scope note, including under
todos: none, so ordinary-notegtdopt-in can always be evaluated. - Calendar body-fetch behavior remains unchanged; Gantt code was not modified.
- Tag requests remain deferred until an item passes eligibility.
fieldsHint.test.tsnow records the new board contract in all to-do modes.- SPEC.md documents the intentional performance tradeoff.
- Focused validation: 3 suites and 76 tests passed.
- Full validation: 13 suites and 176 tests passed.
- TypeScript, webview syntax, whitespace, and prohibited-reference checks passed.
- No manual Joplin test is required for this data-fetch contract; mixed-view acceptance remains Phase 7.
Phase 5 — Automated tests
Kanban
- Include a normal note with a valid block.
- Include a normal note with an empty block.
- Include a malformed-block note and retain its warning.
- Exclude a normal note without a block.
- Exclude the host note even when it has a block.
- Place tagged notes in In Progress and untagged notes in Backlog.
- Prove normal notes never enter Done and never become recurring.
- Preserve all
todos:modes and done-window behavior. - Verify mixed sorting for due date, title, and modified date.
Matrix
- Cover all four Eisenhower quadrants with normal notes.
- Cover Skeleton active/inactive and due-soon/not-due-soon combinations.
- Cover dateless and explicitly urgent normal notes.
- Include empty and malformed blocks; exclude absent blocks and the host.
- Preserve completed-to-do exclusion and all
todos:modes. - Verify mixed sorting for due date, title, and modified date.
Shared/integration contracts
- Update existing
KanbanCardfixtures for the item discriminator. - Verify tags are not requested for ineligible plain notes or excluded to-dos.
- Verify
cardCountincludes all eligible note and to-do cards once. - Verify SLICE8 works on the combined ordered arrays without renderer changes.
- Run focused kanban, matrix, and fields-hint suites.
- Run the complete Jest suite and record suite/test totals.
- Run
npm run distand record the produced.jplpath. - Run
git diff --checkand the prohibited-reference audit.
Phase 5 completion record
- Added comprehensive mixed note/to-do coverage for valid, empty, malformed, absent, and host-note blocks.
- Covered kanban placement, both matrix modes, all to-do modes, completion and recurrence invariants, source IDs, warnings, and exact card totals.
- Verified mixed due-date, title, and modified-date sorting.
- Verified
page-size: 1does not truncate complete collector arrays or totals; existing SLICE8 rendering consumes those combined arrays unchanged. - Focused validation: 4 suites and 89 tests passed.
- Full validation: 13 suites and 185 tests passed.
- TypeScript validation passed.
- Production build passed:
publish/com.victorwiebe.joplin.plugin.gtd-calendar.jpl(155 KB; SHA-2567257bb2bdbb8340539cdad3f88a2ac5f8b55bfa960816f16e472e047311db1cc). git diff --checkand the prohibited-reference audit passed.- No manual Joplin acceptance was performed; that remains Phase 7.
Phase 6 — Documentation
- Update README.md kanban and matrix sections with a normal-note example.
- State clearly that normal notes require a
gtdblock and thattodos:controls only to-dos. - Document kanban placement, both matrix placement modes, note date rules, malformed/empty block behavior, and fallback glyph behavior.
- Update SPEC.md inclusion tables, collection flow, card model, and body-fetch tradeoff.
- Add an unreleased SLICE9 entry to CHANGELOG.md without changing the package version until release scope is decided.
Phase 6 completion record
- README.md now documents ordinary-note opt-in, kanban placement, both matrix
modes, note dates,
todos:isolation, empty/malformed blocks, fallback glyphs, custom icons, and clickable source-note behavior. - SPEC.md now records the inclusion table, shared card model, collection flow, rendering rules, body-fetch tradeoff, and completed unreleased feature.
- CHANGELOG.md includes the unreleased SLICE9 feature and validation results without changing the package version.
- The strict prohibited-reference and contradictory-wording audits passed.
Phase 7 — Manual Joplin acceptance
Use mixed views containing ordinary notes, incomplete to-dos, completed to-dos, empty blocks, malformed blocks, and plain notes.
Acceptance package: publish/com.victorwiebe.joplin.plugin.gtd-calendar.jpl
(SHA-256
7257bb2bdbb8340539cdad3f88a2ac5f8b55bfa960816f16e472e047311db1cc).
Accepted: the user reported all manual checks passed on 2026-07-27.
- Confirm only opted-in normal notes appear.
- Confirm empty blocks opt in and malformed blocks warn without disappearing.
- Confirm normal-note Backlog/In Progress placement on kanban.
- Confirm normal notes never appear in Done.
- Confirm all four quadrants in both matrix modes behave as specified.
- Confirm block title/date/colour/icon/text overrides render on normal notes.
- Confirm neutral note glyph and custom-icon precedence.
- Confirm normal notes do not show completion or recurrence styling.
- Confirm clicking note cards opens the correct source note.
- Confirm
todos: none,gtd-only, andallstill affect only to-dos. - Confirm SLICE8 limits and remaining counts include the mixed card total.
- Confirm sorting, warnings, headings, statistics, and reload behavior.
- Record user sign-off here; do not mark manual acceptance complete before confirmation.
Acceptance criteria
SLICE9 is complete only when:
- Every normal note with a found
gtdblock appears exactly once in its expected bucket, while every plain normal note remains excluded. - Existing to-do inclusion, completion, recurrence, done-window, and matrix rules remain unchanged.
- Note styling, dates, navigation, warnings, totals, and sorting are correct.
- Mixed arrays obey SLICE8 batching without special renderer branches.
- Focused tests, the full suite, and the production package build pass.
- Manual Joplin acceptance is explicitly confirmed.
Files expected to change
src/Gtd/types.tssrc/Gtd/collectKanban.tssrc/Gtd/collectMatrix.ts- Optional shared card-builder module if justified by implementation
src/gtd-calendar-webview.jssrc/tests/Gtd/kanban.test.tssrc/tests/Gtd/matrix.test.tssrc/tests/Gtd/fieldsHint.test.tsREADME.mdSPEC.mdCHANGELOG.mdSLICE9.mdTASKS.md
Out of scope
- Including normal notes that lack a
gtdblock. - Adding a general
notes: allornotes: noneoption. - Giving normal notes a completion workflow.
- Editing notes or tags from a kanban/matrix card.
- Changing calendar or Gantt inclusion behavior.
- Child-notebook grouping from SLICE10.
Dependency and resume point
Implement after SLICE8. Start with collector tests and the explicit card-kind model, then change eligibility/body fetching. Finish automated regression checks before documentation and manual acceptance.