The strategies collection is rebuilt from the ground up: eight Scroll-UI pitch decks generated from audited, verification-hardened pitch narratives — every number carrying a canonical hex-code citation that renders as ordered [n] markers with hover popovers and a paginated Sources slide. Deck slugs now match the reach-edu corpus strategy slugs; the June drafts are archived, not lost. Presentation mode grew up too: auto-hiding header, full-viewport slides, and typography sized for funder-age eyes on 16:9 screens.
The hub was public by design, back when the site was mostly a friendly hello. Now that it's carrying real fundraise decks for a specific stakeholder, it needed a door. So it has one — the lightest one that still actually works.
The slot-rating matrix that already drove Play-UI work on other dididecks sites is now one click from every strategy card. While wiring it up, two long-standing shell chrome bugs surfaced — the pagination pill overlapping the header, and unreadable dark-mode colors — and got fixed at the root.
The first Play-UI build for any reach-edu-hub deck: eleven static, presentation-ready slides for Rural Income Boosts through Apprenticeship Degrees, plus a script that turns them into a PDF, a PPTX, and a Google-Slides-ready deck on demand. Two real rendering bugs in the shell's /play surface got found and fixed along the way.
Each of the six Strategy decks now ships a one-pager: a self-contained, print-ready brief that a funder can read in sixty seconds. A new 1-Pager pill appears at the top-right of every strategy card on /strategies — click it, read the brief in-browser, and download the PDF in one step.
Workforce Development ships as the seventh Strategy deck. And every strategy deck — new and old — just went through its first real citation audit: seven parallel research agents fetched primary sources for every stat, wired the real ones into the citation system, and caught several numbers that were flat wrong.
reach-edu-hub becomes the shell's fourth consumer, joining chroma, humain, and lossless. The onboarding also produced two reusable ideas the shell doesn't have yet: deck collections (a menu layer above single-deck convergence) and a token-driven deck-primitives system — both prototyped in reach as lift candidates. The pass also surfaced one concrete shell limitation: the slot registry is keyed by variant slug alone, so sibling decks can't reuse a variant name.
reach-edu-hub now consumes the shared @dididecks/shell instead of its own hand-rolled deck chrome: the three decks moved onto the shell's /scroll/[deck]/[variant] routing (with redirects from the old URLs), every section gained slot annotations, and the shell's TOC + in-deck ranking light up. On top of that we added a new layer above single-deck convergence — deck collections (Stories / Automations / Strategies) with their own menus — and shipped the first Strategy deck end-to-end: Rural Income Boosts through Apprenticeship Degrees, built on a new token-driven, mode-aware section system.
The Strategies collection grows from one deck to three. Improving Literacy & Numeracy in Working Adults makes the grant case that the two skills most tightly tied to wages and promotions can be lifted — and measured — inside the Apprenticeship Degree. NCAD Forge proposes a shared, cross-member agentic product lab where apprenticeship domain experts build the software the degree actually needs. Both are web-researched Scroll-UI drafts built on the token-driven deck-primitives system, so light/dark/vibrant work without per-element variant classes, and both are framed for grant-seeking philanthropy rather than a fundraise.
What started as an empty menu is now a six-deck portfolio of web-researched strategy decks, each authored as a narrative and designed into a Scroll-UI deck on the shared token-driven system. Today added the last two — Reverse Engineer Available Funding and Opinionated Program Design: Frontier Job Demand — and promoted Strategies into the hub's top navigation so the whole collection is one click from anywhere.
The Improving Literacy & Numeracy strategy deck (ln-v1) gains its first sourced, clickable citation: a verbatim Lumina Foundation pull-quote on slide 07, where the deck argues for embedding foundational skills into the work. Lumina is a major Reach funder, and the quote — 'integrating foundational literacy, numeracy and digital skills directly into workforce training rather than treating them as separate requirements' — has the funder's own voice seconding the deck's core strategy.
27 canonical slide types — problem, why-now, fund-thesis, lighthouse-customers, blue-ocean-strategy — each with the names they go by in the wild, the tags they belong to, and a soft sequencing graph. The first layer of a deck-scheming substrate that lets DidiDecks recognize a slide by its purpose, no matter what the original deck called it.
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.
A new TechBio investor (humain.vc) became the third client deck. The full Fund I deck — 29 slots, three competing design variants — landed end-to-end against a shell consumption contract. But the onboarding also surfaced a structural drift: six deck-generic primitives (scroll-snap + keyboard nav, per-slide shell, mode toggle + runtime, registry-derivation lib, build-status matrix) had been built inside chroma-decks before the @dididecks/shell carve-out and never lifted, so every new client risked re-implementing or copy-pasting. All six are now in the shell, humain consumes them via clean @dididecks/shell imports, and a three-mode theme architecture bug that made the mode toggle a visible no-op got named, fixed, and codified as a per-client invariant. Chroma's own migration off its local copies is deferred until humain validates the lifted versions in browser.
After this morning's onboarding flurry we kept going. Chroma — the older sibling that originally carried every deck-generic primitive locally before @dididecks/shell existed — now consumes the shell for five of those primitives via thin shim re-exports. Net effect: 781 lines of duplicated implementation deleted in chroma, 119 lines of shim added, ~25 downstream importers untouched. Then a small but instructive correction: humain's landing was showing the lightweight SlideStatusMatrix where it should have been showing the rich audit-rated DeckMatrix that Chroma's landing already uses. The rich version was in the shell the whole time. Now both clients land on the same matrix UI.
A++.2 closed: `/play/[slot].astro` now consumes `<DeckOverlay--Play-UI>`, replacing the inline calmstorm-port chrome bars with the themable `<DeckChrome>` floating capsule and lighting up the in-play `<SlideRankPill>` via the section-wrap adapter. Phase 1 of the TOC-redesign plan also shipped: the audits storage migrated from one-rating-per-(deck, variant, slot) (schema 1) to up-to-two-ratings-per-row keyed by surface (schema 2 — `{scroll?, play?}`), with an auto-migrating loader, a one-shot CLI migrator, and the chroma audits file rewritten in place against its 18-row backlog. And the workflow-shaped TOC the founder asked for — variants as columns, slots as rows, paired scroll-rating + play-rating chips per cell, per-column shippability rollup, per-row drift indicator — is now a written plan ready for execution.
Mid-afternoon detour from the dididecks TOC redesign: the calmstorm-decks fundraise deck was stuck in an auth loop — submit `staycalm`, land on a page once, then every subsequent navigation bounced back to `/access`. Server logs said `[middleware] /play/variant/v2: no cookie → /access` even though DevTools showed `cs_session` sitting in the browser cookie jar with all the right attributes. The HAR export looked like the browser wasn't sending cookies at all. The real culprit, after three rounds of red herrings: `/play/variant/[variant].astro` and `/play/section/[slot].astro` both had `export const prerender = true`. In Astro 6 with `output: "server"`, prerendered routes serve through a code path where the middleware's request context doesn't surface the inbound `Cookie` header — so the cookie was being set correctly and sent correctly, but the middleware was structurally blind to it. Worse, in production those routes would be static HTML files served directly by the Vercel CDN, **bypassing the auth gate entirely**. Flipping both to `prerender = false` makes every request to a gated route flow through the middleware properly, in dev and prod. The auth hardening done before discovering the prerender issue (explicit `Set-Cookie` headers on manually-constructed redirect Responses in verify / logout / link redemption) stays — it removes ambiguity from a part of the stack that has bitten this codebase before.
After the morning's TOC matrix work and the calmstorm auth detour, the founder pulled up calmstorm-decks' /play surface and named what was missing from the shell side: the rich top-and-bottom border chrome that exposes section title, status rating buttons, variant cycle pill, audit link, keyboard hints, and variant switches. Today's third chunk lands that as `<DeckFrame--Play-UI>` — a new full-chrome component sitting alongside the existing floating `<DeckChrome>` capsule. The bigger move tucked inside it: a new orthogonal dimension on top of the shell's existing `surface` axis — `intent: "workflow" | "presentation"` — that gates which affordances render. Workflow chrome is the VC-firm / Lossless-Group authoring view (variant cycle pill, inline status, audit link, variant switches, 1-4 status keyboard). Presentation chrome is the end-user / LP view (exit, section title, counter, clean nav hints — no workflow controls at all). One URL parameter (`?intent=presentation`) swaps the whole thing. Two follow-ups baked in: an Astro scoped-CSS bug that was silently breaking the `C` chrome-toggle key, and a UX iteration that replaced the row of N-1 "Switch to {variant}" buttons with a single "Variant ▾" popover menu navigable by click or arrow keys.
Three in-browser review passes on chroma's index produced four DeckMatrix refinements and one plan revision. The matrix the morning shipped was structurally right but visually noisy and wrong on two specific decisions — the per-surface rollup rendered as five separate count pills wrapping onto two lines per surface (ten pills per column for a 4-variant deck); the column-level OPEN link buried the scroll-vs-play surface distinction into one button that dumped readers into 'the deck' without saying which surface; and a `getStaticPaths`-free variant with zero slots was vacuously satisfying the Ready badge's 'no blockers found' check. Fixing those produced one larger consequence: the per-variant `/toc/[deck]/[variant]/` route, originally slated for deprecation-to-redirect in Phase 6 of the redesign plan, gets to stay alive — the deck-level matrix and the per-variant TOC serve different workflow needs (cross-variant comparison vs. land-in-one-variant), and the variant-name in each column header now links to the latter as the variant's landing surface.
Chroma's home page already had a reviewer audit panel — the four-tile row above the matrix counting variants, slide files, people, companies — but the People and Companies tiles pointed at /data/team/ and /data/investors/ which were never actual routes. The audit pages themselves existed in calmstorm-decks (as /data-assets/companies and /data-assets/people) but had never been ported to the shell. This entry closes both gaps. Two new shell-injected routes — /data-assets/companies and /data-assets/people — discover .md files via consumer-root Vite globs that catch both calmstorm's single-firm data layout (data/firms/{firm}/portfolio|team/) and chroma's multi-investor layout (data/investors/{firm}/portfolio/, flat data/team/) without configuration. A new <DeckStatsPanel> shell component replaces chroma's local AssetsDataPanel, doing its own count math from registries + globs so the figures always match the audit pages. The work also surfaced three Astro-pipeline traps worth documenting: JSDoc terminators inside path strings, esbuild misclassifying inline block comments + slash-heavy regex literals as unterminated regex, and Astro's <Image> taking down a 373-row page over one corrupted SVG in the consumer's data tree.
DidiDecks has shipped two client engagements so far (calmstorm-decks, chroma-decks) and a third is in flight. Both production sites carry sensitive fundraise materials: portfolio company graphs, named advisors, deal flow that's not for the open web. Calmstorm had an owned-auth gate from day one. Chroma did not — `output: 'static'`, no DB, no middleware, no /access. Tonight that changed: chroma got the full calmstorm pattern installed greenfield (with four exploration-named additions baked in), the shell picked up two latent prerender-bypass fixes that benefit every consumer, and the deck-level organization-naming convention got locked into the parent ai-labs exploration. The pattern is now ready to install into every future client engagement with one well-shaped plan file.
After Phase A+ shipped `@dididecks/shell` to its first cross-client functional state on 2026-05-12, the next four days were spent giving the shell its bones: a calmstorm-grade themable chrome (with the `--ddd-chrome-*` CSS-custom-property contract), a `<SlideCanvas>` + `/print` PDF-export route, the `<DeckOverlay--Scroll-UI>` / `<DeckOverlay--Play-UI>` paired-suffix discipline for any UI-mode-specific composition, a `context-v/sitemap/` living map that turns the shell's component+route surface into agent-readable mini-specs, and a status-discipline framework codified at the skill level that swept all nine plans into accurate state-of-record. None of this is shippable code-as-product on its own; together it's the architectural ledger that makes the next iteration tractable.
A long day inside calmstorm-decks surfaced four patterns that are now ready to migrate up the tree and seed every other client-site: a unified two-axis navigation grammar across Scroll and Play modes, a two-route discipline that splits the design contract from the component catalog, a typed component registry as single source of truth for both stakeholders and the embedded chat-composer, and a `ContentFit + swappable info-display` mechanic that ends the per-slide font-and-margin tuning war. None of these are calmstorm-specific.
DidiDecks just gained its first shared frontend module. `@dididecks/shell` — an Astro integration that wraps a client-site with shared chrome — boots inside chroma-decks today, injects a TOC route and a slide-ranking API, and operationalizes the Phase 1 → Phase 2 boundary of the deck-iteration workflow with a one-click `scaffold per-slide file` button. Each client-site stays a standalone repo deploying to its own Vercel project; only the shell travels. Along the way we learned why a workspace dep can't cross a `.npmrc` line that says `ignore-workspace=true` — a lesson the eventual publish solves cleanly.
Phase A shipped the integration that proved the architecture works. Phase A+ — landed the same day — closes the three concrete gaps the founder named seconds after first opening the smoke-test build. The shell now ships a global nav that auto-mounts on every shell-injected route, a floating `<SlideRankPill>` that lets a founder rank slots from inside a scroll deck via IntersectionObserver, and a `/play/[deck]/[variant]/[slot]` runtime with keyboard nav (← / → / Space / Home / End / F / C / T / Esc) plus a friendly empty-slot placeholder. Two seed per-slide files in chroma — a faithful cover recreation and a redesigned ask — prove the rank → decompose → recreate loop end-to-end. The whole release moves the shell from `0.0.1` to `0.1.0-rc.0`. Workspace-link mode throughout; Phase A.7 publish still queued.
Promoted DidiDecks from `ai-labs/context-v/specs/` folder to a first-class child of the ai-labs pseudomonorepo — its own GitHub repo, its own three-tier branches, its own context-v/ + changelog/, its own splash, and the two driving client engagements re-parented from astro-knots.
Pipeline & Automation lands as an 11-slide scroll deck — the Lossless side of the partnership, mapped to the Build Smarter pillar. While building it we found `/story` v1 baseline never responded to the mode toggle, so we retrofitted that too. Both decks now read clean in light, dark, and vibrant; the section-indicator pill stops glowing as a white artifact on dark backgrounds.
Corrected vibrant mode implementation to be dark-based (not light-based) with multi-color gradients, glassmorphic surfaces, and neon borders. Light and vibrant modes now visually distinct.
From a placeholder home to a working hub in one session — two scroll-deck story variants, Tailwind wired to all three modes, a sticky Header with a scroll-deck variant cycler, and a homepage that finally says what the partnership is for.
After last entry's end-to-end build, today is the second pass — the tab now reads Reach goes Lossless, the Header carries a circular favicon, the index has an editorial right-bump and a 70vw content band, a three-column cross-credit Footer ported from fullstack-vc lands at the bottom, and the mode toggle finally lights up in dark and vibrant.