- I2: .wd-row now wraps and .wd-output takes the full row width, so streamed
output no longer gets crushed beside the button on the filename's line.
- I3: split .webinar-dash into token scope + a new .wd-bar toolbar above a
.wd-grid two-pane layout. Extracted renderAll (called from onload) which
renders a global "Sync coverage" button, generalised runIngest's subprocess
handling into a shared runClaude keyed by run id, and added spawnGate to
preflight-disable both the sync and per-file ingest buttons when claude
can't be spawned (no desktop Obsidian / no child_process). A successful
ingest or sync now re-renders the dashboard instead of requiring reopen.
- I6: the right pane now shows the tracked script path and last-synced date
from the coverage file's metadata, and flags when cfg.script disagrees
with it.
- Minors: documented the unescaped-pipe split regex, added role="img" to the
coverage meter alongside its aria-label.
- readPipeline no longer filters raw/sources to .md only; CLAUDE.md
documents txt and pdf as valid raw source types, and hiding them from
the queue silently was the same invisibility bug the dashboard exists
to remove.
- Dark-mode accent now tracks the installed tesanti theme (same signal
red, no base-color lift) instead of contradicting it; status colors
(ok/warn/danger) keep their lifted dark values for AA contrast on
small text, per design-system separation of status tokens from the
brand accent.