- Auto-save drafts on memory bulk import (closes the named rev-117 next-sprint candidate)Rev 117's running state explicitly named the rev-22 memory bulk import composer as the only typed-input composer left without auto-save β the previous eight composers (artifact body, operator note, renew note, memory edit, comment, signal-add, memory-add, task-create) all carried the rev-115/116/117 auto-save primitive but the bulk paste-list, the most-painful loss-of-work surface on the dashboard (up to 30 lines Γ β€600 chars), did not. Rev 118 closes that. New `draftKey.memoryBulkImport` namespace + workspace-scoped storage. The composer restores any in-flight paste on open with the rev-116 amber 'Restored draft from this browser. Import or discard.' callout, persists debounced 500ms, fires the rev-117 brand-color teal 'β Draft saved' chip on every persist, and clears the draft on submit / Discard / empty-textarea. Closes the auto-save symmetry across every typed-input composer on the dashboard β nine composers, one consistent persistence vocabulary.
- Markdown toolbar on the bulk import textarea (extends rev-115/116 toolbar coverage to the ninth surface)Rev 115 shipped the markdown toolbar (B / I / `code` / link / quote / list / ordered-list / heading + rev-116 strikethrough / image / table) above every typed-input composer that drives the rev-113/114 live-preview surface. The bulk import was the only typed-input composer that didn't carry the toolbar even though operators pasting structured memory entries (bulleted brand-voice rules, decision rationales with sub-points) benefit from the same one-tap insert affordance. Rev 118 closes that by mounting the compact toolbar variant above the bulk paste-list textarea (skipHeading=true since heading-level structure rarely fits a memory entry's title-from-content split). Closes the help-typing affordance on the ninth composer surface.
- Row-by-row staged preview cards mirroring the server splitterThe server-side `bulkAddMemoryEntries` helper splits each line at the first `.:!?` separator to derive a title + content pair. Until rev 118 that split was server-side only β operators routinely mis-formatted a line ('Brand voice; warm, direct, never corporate' splits at the wrong character) and only discovered it post-creation when the memory list rendered with ugly title/content boundaries. Rev 118 closes the gap with a client-side mirror of the splitter + a row-by-row staged preview showing what each entry will become before the operator submits. Capped at 5 visible rows so a 30-line paste doesn't grow the panel unbounded; 'β¦and N more' tail when truncated. Brand-color left-border + soft gradient anchors the preview as a sibling of the rev-112 template-goal preview surface.
- 'N staged' chip on the closed Bulk import button + extracted scoped CSS classes for the bulk-import surfaceUntil rev 118 the operator had no signal that an in-progress paste-list was waiting inside the closed bulk-import panel β the rev-117 auto-save was invisible on the closed trigger. Rev 118 surfaces a small brand-color teal 'N staged' chip on the closed button whenever a draft has at least one valid line (4+ chars). Same colour vocabulary as the rev-117 transient 'β Draft saved' chip so the persistence narrative reads as one across the open and closed states of the composer. Plus cumulative architectural cleanup: the bulk-import composer's previous inline-styled treatment (style={{}} attributes on every element) is replaced with scoped `.ld-memory-bulk-*` classes in globals.css so the panel finally reads as part of the rev-22+ design language thread that the rest of the dashboard follows. New 220ms slide-in animation on the open panel matches the rev-114 live-preview entry animation so all the dashboard's expanding panels feel uniform.