Commit Graph

30 Commits

Author SHA1 Message Date
meels
2685fc9ba2 revert: remove the webinar dashboard entirely
Removes the webinar-dash plugin, dashboard.md, wiki/script-coverage.md,
the spec and plan under docs/, and the git infrastructure added for the
work. CLAUDE.md, index.md and log.md are restored to their pre-dashboard
content, so Workflow D, the #coverage tag and the sync log entry are gone.

The vault now matches its state at the start of the dashboard work. The
work remains reachable at the dashboard-work-archive tag.
2026-07-28 19:00:02 +02:00
meels
1361dd76f9 chore: move the webinar script and plan into raw/notes
They are webinar deliverables rather than sources to ingest.
2026-07-28 19:00:02 +02:00
meels
ef2e2bd14f fix: give table cells symmetric horizontal padding
th and td were padded '... 0' on the left, so the concept column ran
flush against the pane edge and every other column sat hard against the
preceding cell's text. Group-header rows inherit the change, so they stay
aligned with the cells below them.
2026-07-28 16:53:25 +02:00
meels
605e57751c fix: move responsive overrides after the rules they override
At-rules do not raise specificity, so a rule inside @container or @media
competes with the base rule on source order alone. The collapse blocks
sat above .wd-pane-right's base rule, so the base rule won and the
stacked layout silently never applied. All overrides now live at the end
of the file.
2026-07-28 16:50:30 +02:00
meels
4803c009a2 fix: restore the coverage pane's divider and inset
Revert the dashboard-level gutter from the previous commit - it addressed
the wrong element.

The approved mockup gave the right pane a hairline divider and a 24px
left inset (.pane-div). The plan's renderRightPane only ever created a
plain .wd-pane, so neither reached the implementation. The table cells
are deliberately zero-padded on the left so the concept column aligns
with the eyebrow above it, which only reads correctly when the pane
supplies the inset - without it the table ran flush against the grid gap.

Marked with an explicit class rather than :nth-child, since an error box
can occupy that grid slot. Collapsed to one column, the divider moves to
the top edge.
2026-07-28 16:21:46 +02:00
meels
81676e9daa fix: restore a side gutter after lifting the width cap
Lifting the host's readable-line-width cap also removed the centring
that was supplying the note's side margins, so content ran flush to the
pane edge. Add margin-inline:auto and a 24px padding-inline on the
dashboard itself rather than reaching into Obsidian's layout: centred
when the pane exceeds the 1600px cap, and a fixed inset at every width.
2026-07-28 16:18:39 +02:00
meels
70b9e2a44f fix: find the width cap by measuring, not by class name
Measured chain from live preview showed the cap on .cm-content at 700px,
while .cm-sizer - the element closest() matched first - is already
uncapped at 1680px. The class-name shortcut therefore locked onto the
wrong element and returned before the fallback walk could find the real
one, so the cap survived and the container query correctly collapsed the
grid to one column.

widenHost now always measures computed max-width outward from the
dashboard's parent. The decision is extracted as firstCappedIndex and
tested against the real measured chains for both live preview and
reading view, so a class-name assumption cannot silently break it again.
Adds .cm-content to the CSS fallback.
2026-07-28 16:12:53 +02:00
meels
c374099a12 fix: lift the readable-line-width cap from JS, not CSS alone
The CSS-only fix lost a specificity fight: Obsidian qualifies the sizer
with its view class, outranking a bare .markdown-preview-sizer:has(...)
declaration with no !important. The cap stayed, the container query
correctly saw a ~700px container, and the grid collapsed to one column.

widenHost() now lifts the cap inline at render time, which cannot lose on
specificity and does not depend on Obsidian's class names staying stable.
The CSS rules remain as belt-and-braces, now with the view-class variants
and !important.
2026-07-28 15:24:55 +02:00
meels
5de50b155a chore: renormalize line endings under the new .gitattributes
Line-ending only. Verified: 3667 insertions against 3667 deletions with
zero content difference under --ignore-cr-at-eol.
2026-07-28 15:20:55 +02:00
meels
51c85e6994 chore: stop line-ending churn, track the enabled plugin
Obsidian writes CRLF on Windows, so git reported untouched files as
modified. That matters because `git diff HEAD` is the review surface
after a headless ingest and is useless if everything shows as changed.
`* -text` stores bytes as-is.
2026-07-28 15:20:33 +02:00
meels
e92c93d6f3 fix: let the dashboard use the full pane width
Obsidian caps note content at --file-line-width (~700px) with readable
line length on, which squeezed the two-pane grid into a column. Widen
only the sizer that contains a dashboard via :has(), so every other note
keeps its readable width, and cap the dashboard itself at 1600px.

Also swap the collapse breakpoint to a container query. A media query
measures the window, so a wide window with the dashboard in a narrow
split pane kept two cramped columns; the container query responds to the
pane. The media query stays as a floor for a narrow window.
2026-07-28 15:19:57 +02:00
meels
0a7271136a Specify the coverage file shape and wire Workflow A into Workflow D (I4, I5)
- I4: added a fourth Required Page Template for wiki/script-coverage.md
  spelling out the exact positional shape parseCoverageTable requires
  (metadata line syntax, column order, station spelling, lowercase all/yes) —
  Workflow D described the fields but never the shape, so a compliant write
  could still fail every parse. Also spelled out the seven station names in
  Workflow D step 3 and resolved the step 4 (pinned rows are protected) vs
  step 5 (stale rows are removed) ambiguity for a pinned row whose concept
  page is gone.
- I5: added Workflow A step 9, pointing any ingest that touches
  wiki/concepts/ at Workflow D before reporting — previously that trigger
  lived only inside Workflow D's own list, so an ingest run top to bottom
  never synced coverage and the right pane went stale silently.
- log.md: added "sync" to the intent docstring's valid values (Workflow D
  already required it) and corrected the 2026-07-28 entry's attribution —
  the concept grouping lives in index.md, not in script-coverage.md itself.
2026-07-28 14:58:12 +02:00
meels
9eb29bb41e Add sync coverage button, preflight-disable buttons, fix output wrapping (I2, I3, I6)
- 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.
2026-07-28 14:57:11 +02:00
meels
3bc1afa9f1 Fix ingest subprocess dropping the filename argument (C1)
spawn(..., { shell: true }) made Node concatenate argv without quoting;
cmd.exe re-tokenized it and the ingest prompt arrived as a bare "ingest"
with the filename silently discarded, while the run still reported
success. claude.exe is a real executable here, so no shell is needed:
drop shell: true and pass argv directly. isSafeFilename is unchanged
(still correct defence in depth) but its comment now reflects that the
spawn path carries no injection surface today.
2026-07-28 14:55:04 +02:00
meels
84fe67632a docs: fold Task 7 security findings into the plan
Caret and control characters added to the filename guard, file-keyed in-flight
registry replacing the row-scoped one, try/catch around spawn, single finish()
exit path, UTF-8 chunk decoding, bounded output buffer.
2026-07-28 14:39:52 +02:00
meels
fa1e14c8d1 fix: reject cmd.exe caret and control chars; fix subprocess lifecycle bugs in runIngest 2026-07-28 14:34:43 +02:00
meels
79d3240aa2 feat: spawn headless claude ingest with filename validation 2026-07-28 14:15:49 +02:00
meels
2bb0be0a64 feat: render coverage meter and station-grouped table 2026-07-28 14:07:44 +02:00
meels
a5ca1b0ee4 docs: correct the absent-concept grouping claim
index.md groups integration-dead-ends and leave-less-room-for-imagination
under Machine side, and both are absent from the script. The claim that every
absent concept is human-side or strategy-side was wrong: it is 8 of 10.
2026-07-28 14:03:07 +02:00
meels
2522c70463 fix: correct absent-concept grouping claim in script coverage notes 2026-07-28 14:02:30 +02:00
meels
c88a5d002c docs: fold review findings back into the plan
Corrections made during execution as reviews surfaced defects in the plan
itself: duplicate raw-path claim handling and its one-pass orphaned filter,
unescaped-pipe table split, RAW_EXTENSIONS widening, dark accent tracking the
installed theme, the bare node --test command, and test counts.
2026-07-28 13:55:32 +02:00
meels
39d8fffdcb feat: add script coverage file and Workflow D sync contract 2026-07-28 13:54:31 +02:00
meels
0304757982 feat: parse the script coverage table 2026-07-28 13:45:24 +02:00
meels
3e28180f8b fix: include txt/pdf raw sources in queue, match dark accent to theme
- 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.
2026-07-28 13:39:18 +02:00
meels
1045082df6 feat: render source pipeline in left pane 2026-07-28 13:23:40 +02:00
meels
7958d225d5 fix: prevent double-counting orphaned pages in conflicting scenarios 2026-07-28 13:17:51 +02:00
meels
80ef971d1a fix: handle duplicate raw-path claims by routing to orphaned 2026-07-28 13:13:33 +02:00
meels
027dcb4e4e feat: derive source pipeline from raw path claims 2026-07-28 13:06:28 +02:00
meels
af247326b3 feat: scaffold webinar-dash plugin with config block 2026-07-28 13:01:52 +02:00
meels
b75730fda3 chore: initial commit of vault before dashboard work 2026-07-28 13:00:04 +02:00