Files
typewriter/docs/macroplan.md
Julien Calixte 56f5d18bd8 docs(macroplan): record v0.6 markdown complete in core (0.6.0)
Mark v0.6 delivered (core, host-tested; on-device gate pending): the
snippet engine, the Cmd-P/>/$ palette split retiring :e, and the just
init catalog. Note the →/≠ ISO-8859-15 caveat.
2026-07-12 10:42:56 +02:00

14 KiB
Raw Permalink Blame History

Macroplan — version details

Frequent releases. Each version is a usable artifact, not a checkpoint. This file holds the macroplan source block (below), a cross-version status roll-up, and a one-line summary of each release linking to its dedicated page. The user-facing requirements and engineering targets each release feeds into are tracked in qfd.md.

Macro-plan

Macroplan source — paste into the macroplan app to render the week-by-week view. original dates are the June 2026 baseline and never move; slips get appended as reestimates, per-item actuals live in the Status block below.

title = "Typoena — macro plan"

[[feature]]
name = "v0.1 it writes, it pushes"
start = 2026-06-01
original = 2026-06-29
delivered = 2026-07-11
learning = "Shipped 12 days late. The long pole was hardware bring-up risk, not the editor: SD on a shared SPI bus (resolved by moving it to its own SPI3, ADR-012) and on-device git (gix killed, pivoted to libgit2 as an esp-idf CMake component, ADR-004). Splash landed as a vector wordmark, not the planned 1-bit bitmap — the asset-embed/blit path is deferred to v1.0."

[[feature]]
name = "v0.2 navigation"
start = 2026-06-29
original = 2026-07-20
delivered = 2026-07-11
learning = "Delivered 9 days early. Motions/modes, Ctrl-d/u, the UTF-8 buffer, and the absolute line-number gutter all landed 2026-07-11; the last gate, Spike 13's on-panel gutter refresh check, confirmed a single-line edit repaints only rows at/below it with no extra full refresh. Relative line numbering was dropped as an e-ink ghosting cost with no proportionate gain."

[[feature]]
name = "v0.2.5 international input"
start = 2026-07-20
original = 2026-08-03
delivered = 2026-07-11
learning = "Delivered 23 days early — ahead of its own start window. Dead-key accent composer in the keymap crate (US-International, à é ê ë ñ ç), editor buffer made UTF-8-correct, typed on the bench with no panic. The side-panel pending-accent marker was dropped by decision: at typing speed it is stale before the ~630 ms panel repaint, so it conveyed nothing. Bonus: physical Esc (HID 0x29) remapped to backtick/tilde so code fences + grave/tilde accents work on a 60% board without a Fn layer."

[[feature]]
name = "v0.3 editing"
start = 2026-08-03
original = 2026-08-24
delivered = 2026-07-11
learning = "Core complete 44 days early, host-tested and partially smoke-tested on the panel. Register + yank/paste (yy/p/P), snapshot undo/redo (u/Ctrl-r, bounded 100 groups in PSRAM), and keystroke-recorded `.` repeat all landed 2026-07-11; the d/c operator grammar + text objects were already done ahead of schedule. Firmware bumped to 0.3.0. On device dd/yy/Ctrl-r confirmed; the one bug found was a multi-line paste leaving its later lines below the fold (adjust_scroll only tracked the caret) — fixed with a reveal() that scrolls the block end into view."

[[feature]]
name = "v0.4 visual + ex"
start = 2026-08-24
original = 2026-09-07
delivered = 2026-07-11
learning = "Core complete 58 days early, host-tested. Visual (v) and VisualLine (V) selection with y/d/c landed 2026-07-11 (charwise vim-inclusive of the char under the caret; linewise spans whole lines and pastes like yy/dd), plus the recorded v/V→Visual reassignment: the read-only View mode moved to `gr` (go-read). Selection is drawn as reverse-video cells on the 1-bit panel with the caret punched back to normal video so the active end stands out; 18 new editor tests (83 total). The `:` command mechanism and :fmt were already done; `:e <path>` was deliberately deferred to v0.5 where its multi-file/buffer-lifecycle machinery (Spikes 11/14) lives, rather than half-building file-open here. Firmware bumped to 0.4.0. On-device smoke-test of Visual still pending (pure editor-core, low risk)."

[[feature]]
name = "v0.5 palette + multi-file"
start = 2026-09-07
original = 2026-09-28
delivered = 2026-07-12
learning = "Delivered 2026-07-12, well ahead of the 2026-09-28 baseline, and fully on-device confirmed. Four slices: the drained Effect queue + parked-buffer LRU foundation; the Cmd-P fuzzy file palette (Spike 11 — no ghosting on the transient panel); :enew + file delete (Spike 14 caught that add_all alone doesn't stage a deletion on this libgit2 — fixed with update_all, i.e. git add -A); and the git-tracked .typoena.toml prefs with a stay-open palette `>` command mode + :settings. Both directions of the prefs loop are proven on hardware — boot-read (byte-exact parse) and on-device palette edit (a device publish flipped line_numbers on origin). Three decide-before-build calls: the idle auto-save is unformatted, and both the per-device auto_sync override and the `> auto sync` command are deferred to v0.7 where auto_sync gains behaviour. Amended 2026-07-12: a light/dark `theme` key and a set-ahead `> auto sync` preset command (2m/5m/10m/15m/30m) were added on top — the palette generalised so Enter rotates any pref to its next value (a bool is the two-option case); auto_sync is still read by nothing until v0.7. Descoped from v0.5 (not the four slices): explicit buffer close, the grey-Publish-in-Local panel cue, and the multi-file publish count."

[[feature]]
name = "v0.6 markdown"
start = 2026-09-28
original = 2026-10-12
delivered = 2026-07-12
learning = "Core complete 2026-07-12, ~92 days ahead of the 2026-10-12 baseline, host-tested (187 editor tests). The snippet feature was reshaped 2026-07-08→07-12 from a hard-coded table into a git-synced, Zed-compatible .typoena.snippets.json library: a forward-only tab-stop session ($1..$n/$0, ${n:label} stripped to $n) driven by two surfaces — inline Tab-expansion in Insert and a $ palette launcher — plus a quiet pause hint in the side panel. The Cmd-P palette generalised into a verb split: bare = files, > = a real command registry (toggles stay open, one-shots format/publish close, the parameterised `new file` two-step), $ = snippets — retiring :e. Firmware bumped 0.5.0→0.6.0; the boot-read of the library was confirmed to build for xtensa (serde_json, the one new dep — cargo check passes). `just init` now seeds a curated 17-snippet catalog (three opt-in groups). On-device smoke-test still pending (pure editor-core + a mirror of the proven prefs boot-read, low risk). Known caveat: two symbols the catalog inserts (arrow →, neq ≠) are outside ISO-8859-15, so they store/sync correctly but need a display-layer glyph overlay (in flight) to draw on the panel; the other 15 render on the stock font."

[[feature]]
name = "v0.7 search + git"
start = 2026-10-12
original = 2026-11-02

[[feature]]
name = "v0.8 battery + sleep"
start = 2026-11-02
original = 2026-11-30

[[feature]]
name = "v0.9 robustness"
start = 2026-11-30
original = 2026-12-28

[[feature]]
name = "v1.0 polish"
start = 2026-12-28
original = 2027-01-25

[[milestone]]
name = "MVP ships"
week = 2026-06-29
requires = ["v0.1 it writes, it pushes"]

Status — synced 2026-07-12

The editor core has been built 23 versions ahead of the device releases, and is now extracted into a host-testable editor crate (plus a display crate for the panel framebuffer) so cargo test exercises it off the xtensa target. v0.1 shipped 2026-07-11 (late against the 2026-06-29 baseline): SD storage, save, and git publish are all wired into the app binary and hardware-verified (:sync commits on the SD /sd/repo and pushes to a test repo), and the boot splash (Spike 9) is confirmed on the panel — a vector typoena-in-a-circle shown at startup while the SD mounts, then the editor comes up. Cold boot verified at 4258 ms (power-on → cursor, 2026-07-11; 742 ms under the ≤ 5 s gate). It first measured ~5.5 s; the fix was to bring the editor up with a full-area partial (~630 ms) instead of a second full refresh (~1.9 s) — panel confirmed clean, no ghosting. The 1-hour soak is attested from real use; the remaining post-ship acceptance checks are power-pull recovery, 1000-word no-drop, and Ctrl-G's not-yet-built pull-then-retry (→ v0.9). v0.2 navigation is COMPLETE 2026-07-11 — Spike 13's on-panel gutter refresh check passed (single-line edit repaints only rows at/below it, no extra full refresh), closing the last gate. v0.2.5 international input is hardware-verified (2026-07-11), and v0.3 editing is complete in core the same day (register + yank/paste, snapshot undo/redo, . repeat — host-tested, and partially smoke-tested on the panel: dd/yy/Ctrl-r good, a multi-line-paste scroll bug found + fixed). v0.4 visual + ex is complete in core the same day too — charwise/linewise Visual selection (v/V with y/d/c), the read-only View mode moved to gr, and the selection drawn as reverse-video on the panel; :e was deferred to v0.5. Host-tested (83 editor tests); on-device smoke-test pending. The firmware crate is bumped to 0.4.0. Most of v0.6 Markdown also already runs. Version numbers track shippable device releases, not raw core progress — the 0.4.0 bump reflects the v0.4 feature set being met. v0.5 palette + multi-file is DELIVERED 2026-07-12 (firmware 0.5.0), fully on-device confirmed: the Cmd-P fuzzy palette, :e/:enew/delete across the /sd/repo + /sd/local scopes, and the git-tracked .typoena.toml prefs (boot-read plus a stay-open palette > command mode + :settings that edits them live and syncs the change). Descoped to later: explicit buffer close, the grey-Publish-in-Local panel cue, and the multi-file publish count. v0.6 Markdown is COMPLETE in core 2026-07-12 (firmware 0.6.0), host-tested (187 editor tests), on-device smoke-test pending. The render affordances (heading bold, list continuation, soft-wrap) were done early; the headline is the snippet engine — a forward-only tab-stop session reached both inline (type a prefix + Tab in Insert) and from a $ palette launcher, fed by a git-synced, Zed-compatible .typoena.snippets.json read at boot (serde_json, confirmed to build for xtensa). The Cmd-P palette generalised into a verb split — bare = files, > = a command registry (toggles stay open, format/publish one-shots close, a two-step new file), $ = snippets — which retired :e. just init seeds a curated 17-snippet catalog (Symbols · Structure · Prose, opt-in). One caveat: / sit outside ISO-8859-15 and need a display-layer glyph overlay (in flight) to render on the panel; the other 15 draw on the stock font.

Marks: [x] done in core · [~] partially done · [ ] not started. An inline (✓) marks the done half of a split item.

Each version below links to its dedicated page, which carries the full scope checklist and status.


v0.1 — MVP: "it writes, it pushes" — [x]

The minimum thing that justifies the hardware existing — boot, type one file, :w to save, :sync to publish to GitHub. SHIPPED 2026-07-11 (late vs the 2026-06-29 baseline); cold boot verified at 4258 ms. Design: product · technical.

v0.2 — Vim navigation — [x]

Modal Normal/Insert/View, h j k l/w b e/0 $/gg G motions, Ctrl-d/u half-page scroll, the UTF-8-correct buffer, and the absolute line-number gutter. COMPLETE 2026-07-11. Detail: v0.2-navigation.md.

v0.2.5 — International input — [x]

US-International dead-key accent composition (à é ê ë ñ ç) in the keymap crate, plus the Esc→backtick/tilde remap for a 60% board. Hardware-verified 2026-07-11. Detail: v0.2.5-international-input.md.

v0.3 — Vim editing — [x]

Register + yank/paste (yy/p/P), snapshot undo/redo (u/Ctrl-r), . repeat, and the d/c operator grammar + text objects. COMPLETE in core 2026-07-11, partially smoke-tested on the panel. Detail: v0.3-editing.md.

v0.4 — Visual mode + ex commands — [x]

Charwise v / linewise V selection with y/d/c, the : command line (:w/:fmt/:sync/:gl), and View mode moved to gr. COMPLETE in core 2026-07-11, on-device smoke-test pending. Detail: v0.4-visual-and-ex.md.

v0.5 — File palette + multi-file — [x]

The Cmd-P fuzzy file palette, :e/:enew/delete across /sd/repo + /sd/local, the parked-buffer LRU, and the git-tracked .typoena.toml prefs with a palette > command mode + :settings. DELIVERED 2026-07-12 (firmware 0.5.0), fully on-device confirmed. Detail: v0.5-palette-and-multi-file.md.

v0.6 — Markdown affordances — [x]

Heading bolding, list continuation, and soft-wrap, plus the trigger-driven snippet engine (net-new scope, added 2026-07-08): a tab-stop session reached inline (prefix + Tab) and from the $ palette, fed by a git-synced, Zed-compatible .typoena.snippets.json; the Cmd-P palette generalised into a files/> commands/$ snippets split (retiring :e); and a just init catalog. COMPLETE in core 2026-07-12 (firmware 0.6.0), on-device smoke-test pending. Detail: v0.6-markdown.md.

v0.7 — Search + better git — [~]

/ forward search (n/N) and :gl pull (fetch + fast-forward only). The :gl editor command landed 2026-07-11; the on-device fetch and search are still to build. Detail: v0.7-search-and-git.md.

v0.8 — Power: battery + sleep — [ ]

Bench current-draw measurement, 18650 + charge board, light/deep sleep, and a battery indicator. Not started. Detail: v0.8-battery-and-sleep.md.

v0.9 — Robustness — [ ]

Crash-safe writes, interrupted-push recovery, SD removal handling, Wi-Fi reconnect, and on-device provisioning (the first release usable by a non-author). Not started. Detail: v0.9-robustness.md.

v1.0 — Polish — [ ]

≤ 3 s boot, runtime-switchable fonts, enclosure files, and a user guide (light/dark theme landed early, in v0.5). Not started. Detail: v1.0-polish.md.

v1.x — Stretch / nice-to-have

Post-1.0 ideas, not committed to any release (10.3" panel, multiple remotes, writing stats, BLE-HID fallback). Detail: v1.x-stretch.md.