- Auto-save drafts extended to operator notes + renew note + memory edit + comment composer (closes named rev-115 candidate)Closes the explicit rev-115 next-sprint candidate ("auto-save drafts on the seven other rev-115 toolbar surfaces"). Rev 115 shipped 7-day-TTL localStorage drafts on the artifact body editor only; rev 116 extracts that primitive into a shared draft-storage helper (src/lib/draft-storage.ts with draftKey namespacing helpers) and wires it into four more typed-input composer surfaces: rev-14 operator notes (per-task key), rev-50 renew note (per-task key), rev-7 inline memory editor (per-memory key), and the rev-26 top-level new-comment composer (per-task key). Each composer now restores any in-flight draft when re-opened with a 'Restored draft from this browser. Save or discard.' callout, persists changes debounced 500ms, and clears the draft on submit / cancel / matching-saved-state. The most-painful operator-loss flows on the dashboard โ a stray Cmd-W during a 600-char operator note, a 1000-char comment composed before the tab crashed, a memory edit interrupted by a notification โ all now survive.
- Markdown table + strikethrough + image buttons on the rev-115 toolbarCloses the named rev-115 next-sprint candidate ("markdown table support in the rev-115 toolbar") and adds two more standard markdown affordances in the same cycle. Strikethrough wraps `~~text~~` (GFM-rendered correctly by the rev-10 marked.js pipeline). Image inserts `` and selects the URL portion so the operator can paste their image URL inline (mirrors the rev-115 link insert at the image axis). Table inserts a 3-row ร 2-col GFM skeleton on its own line and selects 'Header 1' so the operator can immediately overwrite. Heading + table only render in the default (non-compact) variant since they rarely fit inline composers. The toolbar surface now carries 10 buttons across all default-variant composers (B / I / strike / `code` / link / image / quote / list / ordered-list / heading / table) and 8 across compact composers, closing the rendering symmetry on every standard markdown affordance the rev-10 marked.js pipeline already supports.
- Shared draft-storage helper extracted to src/lib/draft-storage.tsCumulative architectural cleanup. The rev-115 artifact-body-editor implemented draft persistence as a one-off per-component helper (DRAFT_TTL_MS const + draftStorageKey() / readDraft() / writeDraft() / clearDraft() inline). Rev 116 extracts that into a typed shared module with namespaced key helpers (draftKey.artifactBody, draftKey.taskOperatorNote, draftKey.taskRenewNote, draftKey.taskComment, draftKey.memoryEdit) so every composer on the dashboard speaks the same draft vocabulary. TTL stays at 7 days (the rev-78 multi-device-sync of dashboard prefs is the wrong primitive for in-progress edits โ drafts are local because they're in-progress and shouldn't fan out to other devices mid-edit). Future composers can claim a new namespace via one new draftKey helper.
- Visual polish โ shared `.ld-draft-restored` callout classCumulative micro-polish (every rev 22+ has carried one). Until rev 116 the rev-115 artifact-body-editor restored-draft callout was inline-styled (background: rgba(207,108,58,0.08); border: 1px solid rgba(207,108,58,0.32); color: #7c4520). Rev 116 promotes that into a shared CSS class (.ld-draft-restored + .ld-draft-restored-action) so the four other composers that gained auto-save in rev 116 (operator notes, renew note, memory edit, comments) read the recovered-draft state with one consistent visual vocabulary. Amber palette signals 'your previous work is here, decide what to do with it' โ distinct from the brand-color .ld-md-live-preview surface which signals 'this is what your typing will render as.' Each composer's callout copy is contextual ('Save or discard.' / 'Send or discard.' / 'Post or discard.' / 'Renew or discard.') so the action verb matches the composer's submit button.