Lossless-decks comes online as the first markdown-first engagement — and the shell's hardcoded chrome tokens get refactored to references-only along the way
The Lossless Group becomes its own client. Unlike Calmstorm / Chroma / Humain / Reach — all of which recreated a management-supplied deck — lossless-decks starts from *nothing visual* and generates the deck from per-slide markdown concept files. That workflow earned the corpus a new `narratives/slides-content/` convention (then promptly relocated to per-client-site `context-v/` once we saw the concepts were engagement-specific), four slide concepts authored from Michael's running notes, and an Astro scaffold consuming `@dididecks/shell` that renders the four slides at `/scroll/firm/v1/`. Building it surfaced a separate structural debt: the shell shipped a `--ddd-chrome-*` token system whose defaults were calmstorm-flavored hardcoded white/grey/black RGB values. On lossless-decks's dark mode the floating section indicator rendered as a light-on-dark capsule because the shell's defaults were fighting the consumer's brand. Fixed by rewriting every chrome color and font reference to resolve against the consumer's functional tokens (`--color-surface`, `--color-text`, `--color-border`, `--font-body`, `--font-mono`) — system-tier references functional, never hardcoded, per the discipline the new `setup-new-dddecks-workspace` skill encodes. Same day: SlidePaginator extracted as a standalone shell component with type-to-jump, positioned left of the mode toggle. Same day earlier: high-severity devalue DoS (CVE-2026-42570) patched in deck-shell + splash via astro 6.3.1 → 6.4.4 bump.
Why Care?
Five engagements now ship through dididecks-ai: calmstorm-decks, chroma-decks, humain-vc-decks, reach-edu-hub, and now lossless-decks — and lossless-decks is unlike the other four. Every prior engagement started from a management-supplied artifact (a PDF, a slide deck, an existing site) that we recreated into Scroll-UI then Play-UI. The recreation discipline is captured in /api/slide-decompose and the per-slot file conventions. Lossless-decks has no source artifact. The whole point was to test what the dididecks workflow looks like when the input is markdown narrative scheming and the deck is generated from that.
That workflow shift surfaces three things this changelog ratifies:
A new content-authoring convention. Per-slide concept files (one .md per slide, frontmatter-contracted, body skeleton oriented around "what this slide says / why it exists / content / substantiation / authoring notes") give an engagement a place to live that isn't either "a Google doc" (lossy, search-broken, AI-unfriendly) or "the Astro components themselves" (too coupled to layout to be the editorial source of truth). Convention initially landed at
corpus/narratives/slides-content/on the theory that narratives were cross-engagement reusable. One day in, that turned out to be wrong — per-slide concepts are deeply engagement-specific — and the convention relocated toclient-sites/<slug>/context-v/slides-content/where it lives alongside the .astro components that render it. The corpus retains its substantiation-material role plus any top-level full-deck outlines (the two ChromaDB outlines from earlier work remain there as legacy precedent).A scaffolding skill that ties the half-dozen hand-rolled steps a new engagement currently takes into a single composable flow.
context-v/agent-skills/setup-new-dddecks-workspace/SKILL.mdlands as a stub — phases named, sibling skills it composes linked — and gets its first real run against lossless-decks. The skill encodes two operationally-important disciplines surfaced during that run: (a) Mode A vs Mode B branding — website-parse for external clients, source-code-copy when the brand source is code we own (lossless's case), with the translation requirement when the source predates the three-mode discipline; (b) the three-layer token convention — system (Tailwind utilities) → functional (kebab CSS vars) → named (BEM-ish__named tokens) — with the reach order encoded explicitly: system first, functional next, named as last resort and refactor candidate. The skill names "DRY at cross-project, cross-repo scale" as the architectural justification: a slide layout that worked for Calmstorm should drop into Lossless with the same component code and pick up the destination brand automatically, but only if components never reach to the named tier and bake in source-specific colors.A shell theme discipline that wasn't actually being followed in the shell itself. The new skill says "system tokens reference functional, never hardcoded." Lossless-decks's dark mode then exposed that
apps/deck-shell/src/styles/chrome-tokens.csshad been doing exactly that — shipping defaults like--ddd-chrome-bg: rgb(255 255 255 / 0.85)and--ddd-chrome-fg: rgb(55 65 81)that overrode the consumer's brand intent. The floating "1/4" section indicator rendered as a light capsule on Lossless's dark background because the shell was asserting its own colors instead of inheriting the consumer's. Fix: every chrome color and font token in chrome-tokens.css now resolves tovar(--color-surface)/var(--color-text)/var(--color-border)/var(--font-body)/var(--font-mono)— references all the way down.neutral.csscollapses to a pass-through@import. Mode-awareness comes from the consumer's existing[data-mode]cascade on functional tokens; no per-mode override blocks needed in the shell. The only literal values left are geometric tuning (2pxradius,28pxbutton size,200msfade) — not theme.
What Else Shipped Today
SlidePaginator extraction. The "NN / total" indicator that used to live inline at the bottom of
PageAsDeckWrapper.astrobecomesapps/deck-shell/src/components/SlidePaginator.astro— a standalone component withtype-to-jump(numeric<input>, Enter to navigate, Escape to revert, propagation stopped on edit keys so it doesn't fight the wrapper's PageDown nav). Positionedtop: 1rem / right: 4.25remso it sits cleanly left of the ModeToggle. Available to every client-site usingPageAsDeckWrapper.Four slide concepts authored from running conversation.
lossless-group--credibility.md(two years of applied AI for clients),lossless-group--firm-wide-emergent-practices.md(discovery-driven methodology with the compositional claim that distinguishes Lossless from per-tool / process / future-of-work pitches),lossless-group--born-from-lived-experience.md(Michael's GP→founder→2024-cut origin, with "Only personal productivity and burnout" preserved verbatim and the "30 with 3" pivot question rendered in Poor Story),lossless-group--ideal-engagement.md(the sequenced three-phase contract — discovery / reduce drag / catch white whales, authored via a parallel workflow that ran narrative + slide-component agents concurrently).Astro scaffold consuming
@dididecks/shell. package.json + astro.config + tsconfig + data/decks.ts + data/slides.ts + /scroll/firm/v1/ rendering the four slides via PageAsDeckWrapper from the shell. Build green; the only remaining warnings are shell-internal getStaticPaths in server mode (separate cleanup).High-severity devalue CVE patched. GHSA-77vg-94rm-hx3p (sparse-array deserialization DoS) closed in
apps/deck-shell+splash/by bumping astro 6.3.1 → 6.4.4 within its^6.xrange. Remaining vuln (drizzle-orm SQL injection) lives inside chroma-decks submodule and needs a commit inside that repo to clear from the parent's Dependabot signal.Bridging-PLG exploration. Captures the architectural fork the collaborator's Postgres-on-her-server move surfaced: not engine disagreement, but unit of authoring disagreement (slide = row vs. slide = component file emitted by agent). Proposes slide-as-spec-row + build-emits-component hybrid as the reconciliation, with R2/MinIO object storage for blobs and PLG-vs-DD-grade pulled into the open as Decision 5 of the Cloud-Workspace spec.
Agent-skills
loops/reorganization. Recurring-maintenance-discipline skills clustered together — git-conventions, maintain-design-md, maintain-filemap all undercontext-v/agent-skills/loops/. New blueprintcontext-v/blueprints/Three-Modes-Derivation.mdcaptures the Chroma light-brand → three-mode derivation that became the theme-system basis.
What Comes Next
Slide ordering decision — the four-slide deck currently renders credibility → emergent-practices → ideal-engagement → convener. The convener slide's narrative open-questions flag the before-or-after-credibility decision as the one that changes whether the deck reads as thesis pitch (convener first) or capability pitch (credibility first). Worth a deliberate pick before the deck goes in front of anyone.
Three skill / index editorial passes still owed:
agent-skills/README.mdneeds re-sectioning around the newloops/category (currently lists git-conventions + maintain-design-md as top-level entries).theme-systemskill (in astro-knots, not in this tree) should reference the dididecks-specific three-tier extension; right now it only describes the two-tier (named + functional) convention.Naming collision on
--font-displayin lossless-decks's theme.css (Tier 2 has it as Poor Story; Tier 3 Tailwind utility resolves to Eczar). Already noted in the slide commits; wants a rename to--font-handwritingto remove the confusion.
chroma-decks devalue + drizzle-orm bumps inside that repo, then the parent submodule pointer + Dependabot signal clears.
OG image generation for lossless-decks (Phase 7 of the skill) — brand is locked, recipe in
generate-consistent-og-imagesis ready, ~30-minute pass to make the repo unfurl in a chat.
Related
context-v/agent-skills/setup-new-dddecks-workspace/SKILL.md— the skill that ratified its first real run todaycontext-v/explorations/Bridging-PLG-Self-Serve-with-Previous-Approach.md— the architectural fork the collaborator's Postgres move surfacedcontext-v/specs/Cloud-Workspace-for-Dididecks.md— still a stub; the bridging exploration is the live documentchangelog/2026-06-06_01.md— Humain Ventures onboarding + the six shell primitives that got lifted out of chroma-decks (the lifted shell + its theme tokens are what today's chrome discipline fix tunes)changelog/2026-06-06_02.md— chroma's migration off its local primitive copies (sibling context for today's chrome-tokens work)
