cookiebite v0.6.0
Feature + hardening release from a deeper self-audit: cookiebite was dogfooded end-to-end across 5 report types (dashboard, postmortem, explainer, comparison, code-review) and audited across runtime, scripts, theming, and docs by parallel agents — 70 raw findings deduped to 32, then fixed and verified through render regression, a unit/script harness, and an adversarial review (all browser-verified, not just node --check).
Added
CB.compare— side-by-side comparison grid (theinteractions.md§12 fast path): options-as-columns with rows aligned by construction,{label, tone}cells viaCB.pill, an accent ring + badge on the recommended option, responsive stacking, and an optional recommendation callout.CB.tabs/CB.reveal— vanilla (no-Alpine) tab shell with aria + arrow-key nav that lazily renders each panel andresize()s any chart inside it on first show, killing the "#1 cause of an empty chart box".CB.copyButton+CB.sectionToMarkdown— a themed copy-as-markdown affordance that reuses the shippedCB.copy(clipboard fallback + "Copied ✓" flash) instead of re-hand-rolling it.CB.glossary(map, scope?)— set the glossary from inside aDOMContentLoadedhandler (the obvious place); the parse-timewindow.GLOSSARYpath still works.CB.categoricalColors(n)— on-theme palette ofnspaced hues derived from the accent, for 3+ peer-series charts (the default 2-accent palette made comparison series indistinguishable).- Print/PDF stylesheet — a single
@media printblock (light-locked, TOC + theme toggle hidden,break-inside:avoidon sections/cards) so the advertised "light-locked exec PDF" actually works. chart.__cbUpdate(option)onCB.chartinstances — apply a filter/metric change through it and the reader's selection survives a dark-mode toggle (was snapping back to the original series).CB.kpisergonomics —decimalscontrol (and inference, so8.4no longer rolls to8.40), stringvaluefor status/severity cards, andcolsauto-picked by item count.CB.findingsgainssevLabels/chipLabelsoverrides and Korean locale defaults.
Fixed
deepMergeshared array references with the module-levelbaseChart, so a mutation corrupted the base across dark re-themes — base array values are now cloned.moneyShortwas positive-only and mis-rounded at unit boundaries (999999→1000K,99,999,999→10000만); it now bands onMath.abs, re-applies the sign, and rounds before band selection.CB.chartcaption is now escaped by default (config.captionHtmlopts into trusted HTML), closing a markup/XSS gap that the aria + table cells already guarded.CB.tablenumericColsauto-formats rawNumbercells with thousands separators, and its right-align<style>is keyed/replaced instead of leaking on every re-render.- Glossary auto-linker skips section headings (no more dotted underline on an
<h2>) and null-guards detached text nodes. apply-theme.pyresolves a preset by name (no moreFileNotFoundErroronapply-theme.py neutral …), itsBLOCK_REcan no longer swallow the title/runtime/markers when a stray<!-- THEMEcomment precedes the block, it rewrites<html lang>from the preset locale, and the dark override now also flips--accent-onfor near-blackaccentDarkpresets (Vercel/Resend accent text was invisible on dark).inline.shtreats re-inlining an already-inlined file as an idempotent no-op instead of a hard error.verify-report.shsurfaces auto-inline stderr, guards against an empty-DOM JSON reporting false success, handles non-hex accents in the theme assert, excludes self-scrollingoverflow-xblocks from the overflow check, and guardsrm -rfto a.verifysentinel.- Docs. Corrected the inverted Tailwind/runtime load-order claim in
SKILL.md, refreshed the helper table + fast-path gotchas, reordered the echarts/countup deletion guidance, and removed a.gloss/.tippy-boxCSS duplication trap.
Full changelog: v0.5.1...v0.6.0