- One-tap task duplicate (dashboard + v1 in lockstep)New duplicateTask() helper + POST /api/tasks/{id}/duplicate route + matching POST /api/v1/tasks/{id}/duplicate v1 mirror in lockstep + TaskDuplicateButton client component. Inherits kind, deliverableType, priority, assignee, tags, goal, context. Clears workLog, operatorNotes, comments, blockedByTaskIds, sourceSignalIds, sourceMemoryIds, dueAt โ the original's lifecycle stays with the original. Distinct from the rev-66 persistent task templates (generic recurring shape) โ duplicate is the most-direct re-run primitive: the operator's exact title + goal carry over with a ' (copy)' suffix, and the new task lands at the front of the queue. Diversifies away from the 11-rev blog-marketing thread (rev 99-109) back into operator-loaded surface stickiness. Mirrors the rev-37 / rev-50 / rev-95 v1-in-lockstep cadence pattern โ every dashboard mutation has a v1 equivalent in the same cycle.
- Memory entries render as markdownCloses the rendering symmetry with rev-10 artifact bodies. Memory entries promoted from outputs via the rev-26 promote-to-memory flow pull 1200 chars from artifact bodies that often carry markdown โ until rev 110 they rendered as plain text so headings, lists, code blocks, and tables read flat. The 80-char + markdown-syntax threshold gates the marked.js round-trip so short one-line preferences (the rev-22 bulk import shape) stay plain text and the marked.js cost is only paid on entries that actually benefit. New .ld-memory-md typography overrides tighten the rev-10 .app-item-md spacing for the shorter memory-entry rhythm so the rev-110 markdown render reads as a sibling of the rev-10 artifact body without inheriting full-artifact air.
- Per-panel inline keyword search on the outputs panelMirrors the rev-38 inline activity-log search on the outputs panel โ when a workspace accumulates 10+ approvals waiting after a noisy weekend, narrowing by title/summary keyword is the missing third axis alongside the rev-12 kind filter + rev-15 tag filter. Composes with both filters via intersection. Activates at 6+ outputs so quiet workspaces don't see clutter. Closes the per-panel keyword-search symmetry across the dashboard's three load-bearing list surfaces โ memory has had it since rev 8, activity log got it in rev 38, outputs closes the trio at rev 110.
- Dashboard panel polish โ animated panel-alive dot + duplicate-button affordanceCumulative micro-polish (every rev 22+ has carried at least one). New 5px brand-color dot in the top-left corner of every dashboard panel that fades in on panel hover (220ms ease) โ quiet 'this surface is alive' affordance that draws the eye on interaction without competing with the panel content. Pinned-panel surfaces (rev-22 pinned signals, rev-23 pinned tasks) opt out via #panel-{id}::before {display:none} so the rev-22 / rev-23 pulsing-dot vocabulary stays distinct. New .ld-task-duplicate-btn neutral-palette chip distinguishes the rev-110 duplicate action from the rev-50 amber renew chip and the destructive-red delete chip โ duplicate is creation, renew is recovery, delete is destructive; three orthogonal action vocabularies on one card. New .ld-artifact-search input picks up the rev-39 brand-color focus ring so the new outputs-panel keyword surface reads as part of the dashboard's existing input typography.