Last updated: 2026-08-21 · commit
cafc3ccSingle source of truth for what is being worked on and what has shipped.
Upcoming or partially complete. Files live in ongoing/.
T-009–T-026 came out of the full-codebase audit on 2026-08-18. They are grouped below
by theme rather than by ID, because within each group the sequencing matters.
| ID | Task | Priority | Status | Blocked on |
|---|---|---|---|---|
T-002 |
Fix README ↔ API drift | High | Proposed | Developer answers (memory Q1, Q2) |
T-009, T-010 and T-003 were one story, and all three have landed (C-011, C-012,
C-013). sanitize: true now means something in the browser. On the server it means
something only if you also pass sanitizer — see open question 14 for whether the
no-sanitizer fallback should escape rather than pass through.
| ID | Task | Priority | Status | Blocked on |
|---|---|---|---|---|
T-013 |
Stop building the debug node tree eagerly | Medium | Proposed | API decision (see task) |
T-011 and T-012 have both landed (C-016, C-017): 39.2 ms → 0.40 ms per decoration build on a 5,000-line document. Its one open acceptance criterion is the playground checklist, which needs a browser.
T-015 was re-measured and mostly dropped. Its premise did not survive C-016 and C-017:
emoji.emojify costs 0.36 µs, so even 100 visible shortcodes add 0.036 ms to a 0.40 ms
decoration build, and renderMath no longer runs per keystroke now that widgets are
reused. Both caches are dropped as not worth the code, along with the proposed lib/lru.ts.
It was rescoped to the one part that was never a caching argument — two mermaid widgets
with the same definition sharing one in-flight render — and landed as C-030.
Nothing outstanding.
T-016, T-018 and T-017 have all landed (C-018, C-019, C-026).
DraftlyPlugin.onViewDestroy exists, the view plugin implements destroy(), the async
widget paths are guarded, and plugin instances are now per-editor via
createEssentialPlugins() / createAllPlugins(). The deprecated essentialPlugins /
allPlugins arrays were removed in C-028, a major.
Nothing outstanding.
T-020 landed as C-024 for its first three steps, and its fourth became T-028,
which has now landed as C-027. MermaidPlugin, MathPlugin and EmojiPlugin sit
behind draftly/plugins/{mermaid,math,emoji}, and createAllPlugins() behind
draftly/plugins/all.
C-027 turned out to be far more than a tidy-up. import { HeadingPlugin } from "draftly/plugins" bundled to 8.0 MB — one small plugin dragging in mermaid, KaTeX and
node-emoji, because tsup emitted all 14 plugins as one chunk whose top level imported all
three. It is now 2.5 MB with none of them. C-024's sideEffects: false could not have
caught this: a bundler cannot drop a third-party package it cannot prove pure, and CJS has
no tree-shaking at all.
C-026's deprecation cycle is over: the arrays were removed in C-028.
T-027 has landed as C-025 — the KaTeX stylesheet is now a generated TypeScript
constant, so no bundler-specific specifier reaches dist/. It surfaced open question 17
(KaTeX's font URLs are relative and have never resolved for consumers), which landed
separately as C-029: katex is now an optional peer dependency, and the stylesheet —
fonts inlined as data: URIs — is injected only behind MathPluginOptions.injectStyles.
| ID | Task | Priority | Status | Blocked on |
|---|---|---|---|---|
T-026 |
ThemeEnum.AUTO ignores the system theme |
Medium | Proposed | Developer decision — behaviour change |
| ID | Task | Priority | Status | Blocked on |
|---|---|---|---|---|
T-001 |
Establish a test suite | High | Proposed | Developer decision on runner (memory Q5) |
T-005 |
Decompose oversized plugin files | Medium | Proposed | Developer approval (memory Q6) |
T-006 |
Resolve or remove plugin.dependencies |
Medium | Proposed | Developer decision (memory Q3) |
T-024 |
Dead configuration surfaces | Low | Proposed | Developer decision (memory Q8) |
T-007 |
Wire up the type-check task | Low | Proposed | Naming decision (memory Q4) |
Implementation of the unblocked items began 2026-08-18, on the developer's instruction
to work the ongoing list. Rows still marked Proposed with a "Developer decision" in the
Blocked on column are untouched and stay that way until answered — see the open questions
in ../memory.md.
Both follow-ups created by completed work have now landed — C-026's deprecation cycle closed in C-028, and open question 17 in C-029 — along with the last unblocked ongoing task, C-030.
What remains is entirely tasks whose Blocked on column names a developer decision:
T-001, T-002, T-005, T-006, T-007, T-013, T-024, T-026. Nothing in the
list can move without an answer to the corresponding open question in
../memory.md.
T-001 (a test suite) cuts across all of it, and is the one worth answering first.
C-016, C-017, C-029 and C-030 are exactly the changes that are hard to verify by eye in a
playground, and the pure layers they touch — the KaTeX generator's URL rewriting, the
mermaid de-duplication key, editor/utils.ts, the table text utilities — are the testable
ones.
| Plan | Priority | Status | Blocked on |
|---|---|---|---|
Migrate the logits fork's improvements |
High | Complete | — |
All nine workstreams landed (38df166…5b9fac7). The design-token layer, shared base
styles, documented shortcuts, paragraph spacing and five bug fixes are in; the fork's
80-column reformat and app-specific values were rejected as planned. Two findings are now
open questions 15 (the LaTeX parser's AGPL licence) and 16 (plugin themes emit each
surface's rules to both).
Files live in completed/. Reconstructed from git history at artifact
bootstrap, so entries before 2026-08-18 are summaries rather than full task records.
Proposed → In Progress → Complete
↓
Blocked / Dropped
- Create — add a file in
ongoing/using the template below, add a row here. - Start — set status to
In Progressin both the file and this index. - Finish — move the file to
completed/, renameT-NNN→C-NNN, fill in the outcome, and move its row to the Completed table. - Drop — leave the file in
ongoing/with statusDroppedand a reason. Do not delete it; the reasoning is the value.
- One task file per coherent unit of work, matching one logical commit or a short series of related commits. If a task needs three unrelated commits, it is three tasks.
- IDs are never reused.
T-NNNwhile ongoing,C-NNNwhen complete. - Update the task file as you work, not at the end — a half-finished task with good notes is far more useful to the next session than a perfect one written from memory.
- Anything durable you learn goes to
../memory.md; anything structural goes to../architecture/. Task files hold the work, not the knowledge.
# T-NNN — <title>
**Status:** Proposed | In Progress | Blocked | Complete | Dropped
**Priority:** High | Medium | Low
**Created:** YYYY-MM-DD
**Blocked on:** <what, or —>
## Problem
What is wrong or missing, and why it matters.
## Proposed approach
How to solve it. Note alternatives considered and why they lost.
## Affected areas
Files, modules, and which architecture docs will need updating.
## Acceptance
Concrete, checkable conditions for done.
## Notes
Running log. Append as you work — findings, dead ends, decisions.