Commit Graph

82 Commits

Author SHA1 Message Date
Julien Calixte
fcf5815468 docs(roadmap): track the writing column + side panel split in v0.1
The side panel was referenced from v0.2.5/v0.5/v0.8 but never defined or
scheduled. Add it as a v0.1 build item, mark it unbuilt, and link the
CONTEXT.md and product-design definitions.
2026-07-08 11:02:41 +02:00
Julien Calixte
aa068147ab docs(roadmap): replace the mermaid Gantt with Macroplan TOML
The macroplan app parses this source directly; the baseline originals
stay fixed and v0.1's slip is expressed as an at-risk status instead of
a re-drawn bar.
2026-07-08 00:19:28 +02:00
Julien Calixte
c82130a616 docs(roadmap): move the macro-plan Gantt in from the README
Kept as the original June 2026 baseline with a note pointing to the
Status block for actuals.
2026-07-08 00:04:32 +02:00
Julien Calixte
571c5ed825 docs(hardware): add part table, rationale, and bench status page
Extracted from the README so it can slim down to a summary + link.
2026-07-08 00:04:25 +02:00
Julien Calixte
77768cc85f docs(roadmap): sync marks to actual core progress
The editor core runs 2-3 versions ahead of shippable device releases (no
release has shipped; v0.1's hardware gate is still open). Mark done/partial
items across v0.1-v0.7 with [x]/[~], record what landed early (View mode,
d/c operators + text objects, :fmt), and the v0.4 decision to move View off
v/V so Visual can take them.
2026-07-07 23:44:46 +02:00
Julien Calixte
2aa4032e1f docs(notes): record why the notes repo stays full-size (pre-seed the SD)
The 150 MB of images are remanso's image CDN (it reads image bytes straight
out of git as blobs), not offloadable bloat — LFS/filter-repo/git-rm all
break remanso. libgit2 also lacks blobless partial clone. Decision: leave
the repo untouched and pre-seed the SD with a full clone from a computer, so
the device only ever takes the open + incremental fetch/push path. Also
notes the increment-C constraint: stage specific paths (not add_all) so a
media-excluding sparse checkout is safe.
2026-07-07 22:55:59 +02:00
Julien Calixte
ef755bac81 docs(postmortems): correct the FATFS delete finding (std, not read-only)
The read-only-attribute theory (and the predicted AM_RDO unlink shim) was
wrong. A diagnostic recursive walk showed every entry writable (ro=false)
and succeeded via path-based deletion, so the real blocker was
std::fs::remove_dir_all's openat/unlinkat/fdopendir usage against esp-idf's
path-based FATFS VFS. Update the increment-A/B checklist accordingly.
2026-07-07 22:49:18 +02:00
Julien Calixte
4153cae9c4 docs(postmortems): record milestone #2A verified, FAT read-only-delete finding
Increment A (persistent-clone publish cycle) is hardware-verified: clone +
persistent open + fast-forward push. Mark the follow-up checklist: git module
fold is in progress (A done; B = divergence + AM_RDO unlink shim; C = editor
wiring), tech-doc revision done, PAT-in-flash tracked as open ADR-011. Note
the FAT read-only-delete limitation and the real-notes-repo sizing caveat.
2026-07-07 08:35:11 +02:00
Julien Calixte
cce62bf9f7 docs(adr): add ADR-011 for credential provisioning (open)
The PAT-in-flash shortcut (ADR-005 v0.1) is safe for the dev's bench unit
but not for a shipped one: it's plaintext in flash, the same token on every
unit, and rotation needs a reflash. ADR-005 decided the auth model but left
provisioning mechanics open.

Capture that as ADR-011 (Proposed/Open): the options (build-time bake →
on-device paste → eFuse-encrypted NVS, per-device fine-grained PAT, GitHub
App) and the likely shape, deferred beyond v0.1. It gates the first non-dev
distribution. Point the Spike 7 postmortem's shortcut entry at it.
2026-07-07 00:03:55 +02:00
Julien Calixte
2f2f1227ec docs(technical): rewrite git module section for libgit2
The v0.1 technical doc still described the gitoxide/gix plan with an
undecided transport and a 32 KB git_task stack. Bring it in line with
what spike 7 proved:

- gix → libgit2 via the git2 crate (ADR-004 kill-switch fired: no gix push)
- transport settled: HTTPS + PAT over esp-idf mbedTLS, no custom transport
  or reqwest/rustls layer needed
- fail-closed cert verification (embedded GitHub roots + PASSTHROUGH)
- git_task stack 32 KB → 96 KB (measured ~67 KB depth); dedicated thread
- persistent-clone + fast-forward is the product flow (spike used a fresh
  per-boot throwaway branch); add --all stages deletions
- PAT via libgit2 credential callback, never logged/persisted

Also mark the Spike 7 entry done in the spikes list.
2026-07-06 23:52:02 +02:00
Julien Calixte
d397b31ca4 docs(postmortems): mark dedicated git task done
Git now runs on its own 96 KB std::thread and the main-task stack is back
to 12 KB — hardware-verified off-main. Update the follow-up checklist and
the "three bugs" caveat to reflect the completed move.
2026-07-06 23:46:55 +02:00
Julien Calixte
76fae36178 docs(postmortems): mark cert verification done, record HTTPS+PAT decision
The certificate_check bypass is retired (real trust-store, hardware-verified
2519ed8) and the product sync transport is decided (HTTPS+PAT, not SSH, since
on-device libgit2 is HTTPS-only). Remaining shortcut is PAT-in-flash.
2026-07-06 23:21:09 +02:00
Julien Calixte
bcb4ffa465 docs(postmortems): record on-device Spike 7 push completion
The full init -> commit -> push over mbedTLS HTTPS now runs on hardware
(verified device-side + via git ls-remote). Documents the three fixes that
got there -- 96 KB main stack, remove-then-rename p_rename, and the utimes
existence-gate that had silently dropped every ODB write -- plus the
shortcuts still standing (cert bypass, PAT-in-flash, SSH-vs-HTTPS remote).
2026-07-06 22:59:49 +02:00
Julien Calixte
ac70d8926f docs(postmortems): record Path 2 -- libgit2 runs on device 2026-07-05 21:28:47 +02:00
Julien Calixte
9f36d786d0 docs(postmortems): record path-1 dead end, pick libgit2 as component
CFLAGS include-injection cascades through the whole esp-idf component
graph (arpa/inet.h -> sys/ioctl.h -> ...), so path 1 is out. Decide
path 2: libgit2 as an esp-idf CMake component with USE_HTTPS=mbedTLS,
which fixes the includes and the TLS backend together.
2026-07-05 20:09:31 +02:00
Julien Calixte
80f21648ce docs(postmortems): record Spike 7 on-device probe and PSRAM
libgit2 C cross-compiles for xtensa; blocker is missing esp-idf lwIP
headers (arpa/inet.h) because libgit2-sys builds standalone. PSRAM
enabled and hardware-verified.
2026-07-05 20:04:11 +02:00
Julien Calixte
9c9ad63793 docs: record Spike 7 outcome, gix HTTPS-push kill-switch fired
Postmortem + ADR-004 outcome note + risk-table update: gitoxide has no
HTTP(S) push, so v0.1 falls back to libgit2; the on-device libgit2 <->
mbedtls cross-compile is the next gate.
2026-07-05 19:38:48 +02:00
Julien Calixte
0b52f34940 docs(postmortems): record Spike 3 SD CMD59 card incompatibility
New docs/postmortems/ folder. The bench card (133 GB SDXC) rejects CMD59
(SPI-mode CRC) as illegal; CMD0/CMD8 succeed, so wiring and firmware are
proven and the fix is a compliant card. Captures the root cause, the
keep-CRC-required decision, and the reusable findings (EPD bus lock, LFN
requirement, R1-byte diagnostic) before the work pauses for hardware.
2026-07-05 18:16:49 +02:00
Julien Calixte
f77f6697d1 docs(roadmap): add v0.2.5 international input release
US-International dead-key accents, slotted after navigation without
renumbering later versions so ADR/qfd/README anchors stay valid. Also
adds a UTF-8-correct buffer groundwork bullet to v0.2.
2026-07-05 17:57:35 +02:00
Julien Calixte
b5274b6e68 docs: authorize file delete in v0.5 scope
Spike 14 relies on file deletion, which the roadmap did not list. Add it
explicitly, flagging that a Tracked-file removal must reach the next
Publish's staged set (git rm / add -A, not plain git add .).
2026-07-05 17:27:41 +02:00
Julien Calixte
ac56bc4aec docs: extract rendering spikes into docs/spikes.md
Spikes 8-14 are a cross-release display/UX bench batch, not part of the
v0.1 integration gate — only 8 and 9 feed v0.1. Move them out of the v0.1
technical doc into their own log (with a feeds-table and dependency notes),
leaving a pointer behind; link it from the README layout map.
2026-07-05 17:27:34 +02:00
Julien Calixte
a848c05afa docs: redesign v0.1 screen as side panel + writing column
Replace the header/status-bar layout with a full-height writing column
plus an always-visible side panel holding all metadata. Canonicalize the
new region vocabulary in CONTEXT.md (Writing column, Side panel) and retire
header / status line / edit area as terms-to-avoid.

Consequent sweeps: rewrite the Error UX section in side-panel terms and
give keyboard-disconnect a home (⌨ ✗, disconnect-only); drop the "line N"
readout; reconcile the render module ops and region shadow; sweep the
status-line/edit-area wording across the technical, roadmap, qfd, notes,
README, and ADR-003 docs (incl. the ~11→~13 line-count figure).
2026-07-05 17:27:25 +02:00
Julien Calixte
d3fd6f6ed1 fix(docs): open v0.1 working file from /sd/repo not /sd/local
The product doc opened notes.md from /sd/local, the permanently-private
scope where Publish is unavailable — contradicting the headline Ctrl-G
flow and every other doc. Point it at the Tracked working copy.
2026-07-05 17:26:00 +02:00
Julien Calixte
801860fafe docs(roadmap): brand v0.1 boot splash as Typoena 2026-05-21 00:36:36 +02:00
Julien Calixte
43eead0e23 docs(quality-house): drop reMarkable W1 perception 2→1
Latency is the dominant signal for W1 (sub-second response to typing)
and on a typing-focused device the reMarkable 2 + Type Folio's e-ink
delay disqualifies a 2. Updates the TikZ perception array, the table
row + rationale, and the totals narrative (reMarkable 45 → 44, ranking
unchanged).
2026-05-19 18:44:06 +02:00
Julien Calixte
572c83095b docs(quality-house): sync empty chassis to 14x14 after H14 retirement 2026-05-19 14:55:13 +02:00
Julien Calixte
db61a83f06 fix(qfd): correct §4 roof matrix size and glyph convention
Two stale bits in §4's preamble. (a) "15×15 roof matrix" still
referenced H14's pre-retirement column count — corrected to 14×14.
(b) The symbol legend named classical QFD glyphs (◎ ○ × ⊗) but
quality-house.md's roof actually renders ASCII (++ + − −−). Both
listings now lead with the ASCII glyphs that match the source of
truth, with classical equivalents kept in parens.
2026-05-19 14:52:43 +02:00
Julien Calixte
6dff2315c8 fix(quality-house): correct H10-H15 roof coord after H14 retirement
The H10-H15 mild conflict node still pointed at C-10-15 (H15's
pre-retirement column). H14's removal renumbered H15 to column 14,
so the roof coordinate becomes C-10-14. Missed in the earlier
sweep — comment line already says "H10-H15" so the intent was
unchanged, only the cell coord was stale.
2026-05-19 14:51:17 +02:00
Julien Calixte
b85bb27a9b docs(qfd): introduce Functions layer and GLOSSARY.md ontology
The doc previously conflated functions (transformations the device
performs) with characteristics (measurable attributes). Surfacing
Functions as their own ontology layer makes HOW names — which pack
a function reference plus an attribute — readable without function
definitions staying implicit.

- new GLOSSARY.md at root: 5-layer ontology stack (WHAT / Function /
  Characteristic / Metric+Unit / Target), peer to CONTEXT.md
  (device-specific vocabulary)
- qfd.md §2 opens with a Functions inventory (Type, Save, Publish,
  Recover, Boot, Provision); Render and Reconnect noted as
  sub-functions; Provision flagged as build-time-only in v0.1
- H1 "Keypress → glyph latency" → "Type latency (keypress → glyph)"
- H4 "Cold boot → cursor ready" → "Boot latency (cold)"
  (the arrow transformation moves to the Functions inventory; the
  parenthetical keeps the residual qualifier)
- cascade through §3 priority list, §6 critical-performance-budget
  rows for H1/H4, §8 inconsistencies, and quality-house.md TikZ
  column labels

Matrix cell strengths held; no Σ recompute.
2026-05-19 14:45:12 +02:00
Julien Calixte
8a223e7837 docs(qfd): retire H14 from HOWs
Module count / public-API surface is a static source-code property,
not a runtime function nor an artifact characteristic like H10 binary
or H15 build time. It was a refactor-leverage proxy for W9 — proxies
of proxies belong in the ADRs and the component matrix, not in the
HoQ. Removed from §2, §5 matrix, §4 conflict list, and the C12
overloaded-list mention; basement Σ total drops 1674 → 1557 so rel%
recomputed in quality-house.md.
2026-05-19 11:46:07 +02:00
Julien Calixte
2aa194bdb9 fix(quality-house): drop tex fences shikiji can't load 2026-05-18 15:26:56 +02:00
Julien Calixte
7e2d6eddc5 docs(quality-house): add empty training chassis 2026-05-18 15:06:27 +02:00
Julien Calixte
e79101d841 docs(notes): add setup context before the Ctrl-G concern 2026-05-17 13:01:44 +02:00
Julien Calixte
bf36c01502 docs(notes): trim Ctrl-G essay to its core (question + apocalypse)
The post's job is to land the timing question and the apocalypse
reframe — Wi-Fi rationale, optimisation diversions, and generalising
reflections were overexpansion. Cut.
2026-05-17 13:00:31 +02:00
Julien Calixte
b7a0aa7c5c docs: add "Durability before delivery" principle to Publish UX
The user-meaningful moment of a Publish is when the local commit
lands (~0.2 s), not when the push completes (~5–10 s). New principle
in CONTEXT.md, instantiated in v0.1 product doc with staged status
transitions and a corrected on-demand Wi-Fi status example.
2026-05-17 12:54:09 +02:00
Julien Calixte
011f79f134 docs(notes): add Ctrl-G perceived-latency essay
Long-form rationale for the "durability before delivery" framing —
why a 10-second network operation in response to a single keystroke
doesn't have to feel slow. Establishes docs/notes/ as the home for
shareable design rationale (not authoritative spec).
2026-05-17 12:54:04 +02:00
Julien Calixte
d5f22c697c docs(v0.1-tech): switch Wi-Fi to on-demand model, off by default
Always-on station mode burns ~410 mAh/day on the radio alone; on-demand
drops that to ~25 mAh/day at 10 Publishes/day. Radio comes up on Ctrl-G
with a 10 s association timeout, holds for a ~90 s grace window after
each Publish, then tears down. SNTP cached up to 24 h to avoid
re-querying every Publish.

Also removes stale SoftAP provisioning bullets that contradicted the
"v0.1 has no provisioning module" stance later in the same doc.
2026-05-17 12:38:47 +02:00
Julien Calixte
cbdd6aa197 docs: lock device to one linear branch via Publish-is-sync principle
The user's mental model of Publish is a Google Doc backed by git, not a
curated commit log. Branches fall out of scope under that framing; the
device tracks one stream of work on whichever branch the remote was
cloned on, and never switches. Drops :Gbranch from v0.7 to match.
2026-05-17 12:38:36 +02:00
Julien Calixte
ffcd49588a style: apply oxfmt to docs (table padding, italic style) 2026-05-17 01:30:36 +02:00
Julien Calixte
1e1e59e716 docs(qfd): add W14 portability requirement
Captures "I can carry the device and write away from a desk" as a
distinct WHAT from W11 (multi-day battery), weight 8. Recomputed
basement Σ (1546→1674); H8 climbs #6→#3 in the §3 priority list as
its voter base widens to include W14, and H12 enters the top six at
#4. §6's "(b) narrow voter base" override for H8 is retired and a new
§7 ADR-008 vs W11+W14 unresolved-conflict bullet records that wall
power in v0.1 now disappoints two WHATs, not one.
2026-05-17 01:29:53 +02:00
Julien Calixte
b0169690c4 docs(quality-house): drop reMarkable W1 to 2 after firsthand test
reMarkable 2 with Type Folio tested less responsive than Freewrite Smart
Typewriter (Sailfish). With Smart at 3, reMarkable drops one notch to 2.
Total: reMarkable 42 → 41, now tied with Smart at 41.
2026-05-16 14:38:01 +02:00
Julien Calixte
059da87695 docs(quality-house): extend Sailfish rescore to Smart Typewriter
Sailfish ships on Smart Typewriter Gen 3 as well as Traveler, so the
same firmware-driven bumps apply: W1 2→3 (Smart still trails Traveler
by one notch on panel size), W5 3→4, W9 1→2. Smart total 38 → 41.
2026-05-16 14:27:59 +02:00
Julien Calixte
e152237477 docs: rename project to Typoena
Project gets a proper name. Replaces "Ours" / "Our product" placeholders
in the QFD perception zone and the working title "typewriter" in
README/CONTEXT headers and the npm name. "Typewriter" the category
noun (the writing-machine concept) stays unchanged — Typoena is the
brand, typewriter is the category. SoftAP SSID typewriter-setup and the
repo directory are deliberately left as-is.
2026-05-16 14:21:32 +02:00
Julien Calixte
52845849c1 docs(quality-house): note Freewrite Sailfish firmware and rescore W1/W5/W9
The Sailfish firmware (2025-11-19) rewrote the Freewrite Traveler OS in
Rust, cut keystroke latency 40–100 %, and trimmed power draw -30 %
typing / -50 % idle. Three rows are bumped: W1 3→4, W5 3→4, W9 1→2.
Freewrite now ties reMarkable at 42; Pomera still #2 at 45.
2026-05-16 14:17:52 +02:00
Julien Calixte
9573c08bad fix(quality-house): shrink Freewrite Smart marker so Traveler shows through 2026-05-16 12:53:29 +02:00
Julien Calixte
5e476a9651 docs(quality-house): add Freewrite Smart Typewriter to perception zone 2026-05-16 11:21:29 +02:00
Julien Calixte
8b161cc808 fix(quality-house): raise header height so HOW labels clear the roof 2026-05-16 01:27:02 +02:00
Julien Calixte
07bb0edcba fix(quality-house): compute WHAT-label width via pgfmath
text width={\qfdWhatW - 0.2}cm doesn't parse — the braces don't
evaluate the arithmetic, so TikZ sees "4.6 - 0.2cm" which isn't a
valid dimension. Pre-compute the narrower width with
\pgfmathsetmacro and reference the resulting macro instead.
2026-05-16 01:20:03 +02:00
Julien Calixte
3a4bd3db18 fix(quality-house): keep WHAT labels inside their column
Text box anchored at qfdLeftEdge + 0.1 with width qfdWhatW overflowed
0.1 cm past the cell's right edge into the Weight column, clipping
trailing words like "the", "lag,", "hob-". Shrink the box by 0.2 cm
so it has 0.1 cm clearance on both sides.
2026-05-16 01:05:17 +02:00
Julien Calixte
1aa1d0e3cf docs(roadmap): clarify hybrid line-number behaviour for v0.2
Spell out the Normal-vs-Insert distinction (relative with current line
absolute / absolute everywhere) so it's clear the gutter behaves like
Neovim's number+relativenumber combo, not flat absolute numbering.
2026-05-16 00:40:07 +02:00