Lossless Changelog
fleet

Splash catches up: augment-it, a Studies landing page, nested-pseudomonorepo rollup, and OpenPanel

ai-labs grew a fourth active child (augment-it) and three of memopop-ai's apps started shipping their own changelogs, but the splash didn't know it. This round teaches the rollup to recurse into pseudomonorepo children's `apps/*`, adds a dedicated `/studies/` landing page that reads each study's `.gitmodules` and README at build time, surfaces augment-it in every count and card on the homepage, and wires OpenPanel analytics the same way the other splash sites do it.

Michael StatonMusic Editoraugmented with Claude Code on Claude Opus 4.7 (1M context)

Why Care?

The splash is supposed to be the truthful surface for what's happening across ai-labs. The minute it stops reflecting reality — a new child arrives, an app inside an existing child starts shipping its own ship-notes, a study gets pinned — readers lose the ability to trust it as a current read. This round closes four such gaps at once: a new child (augment-it) is now first-class on every count and card; the rollup now recurses into pseudomonorepo children's own apps/* so memopop-ai's three internal apps (memopop-native, memopop-orchestrator, memopop-site) contribute their changelog and context-v files; the three studies finally have a dedicated landing page that reads itself from the pinned-repo metadata rather than hand-maintained card copy; and OpenPanel analytics is wired the same way the other splash sites do it so we'll actually know whether anyone reads any of this.

What's New?

augment-it is now visible everywhere

Three small edits make the new child first-class:

  • childSlugs in splash/src/pages/index.astro gains 'augment-it' — the hero meta-strip now reads 4 active.

  • CHILDREN in splash/scripts/rollup-sync.ts gains the matching entry — augment-it's changelog/ and context-v/ now roll up alongside the others (12 changelog entries on first sync — augment-it has been shipping).

  • A new splash/src/content/product-highlights/04-augment-it.md adds the bench-card in ch.02 · active builds. The lede notes it as the outlier in the labs — React + Next.js + Module Federation + Turbo, where the rest is Astro/Svelte — "because Module Federation pays off where the architecture warrants it."

Rollup learns about pseudomonorepo children

memopop-ai is itself a pseudomonorepo with apps/memopop-native, apps/memopop-orchestrator, and apps/memopop-site as nested submodules, each carrying its own changelog/ and context-v/. The previous rollup only walked each child's root, so memopop-ai showed 2 changelog entries when there were really ~80 across its apps.

rollup-sync.ts now auto-discovers sub-children:

  • A new Source type decouples where files live on disk from the provenance slug stamped on each rolled-up file.

  • discoverSubChildren(child) walks <child>/apps/, returns every directory inside it that has at least one of changelog/ or context-v/, with slug <child>/<app> and dir <child>/apps/<app>.

  • resolveSources() flattens the top-level CHILDREN into the full source list — each top-level child immediately followed by its discovered sub-children, preserving presentation order.

  • syncCollection was changed to take a sources: Source[] argument instead of reading the constant directly — same loop body, broader iteration.

Result on the first run:

changelog : 107 files (was 26)
           · context-vigilance-kit: 4
           · memopop-ai: 2
           · memopop-ai/memopop-native: 6
           · memopop-ai/memopop-orchestrator: 72
           · memopop-ai/memopop-site: 3
           · dididecks-ai: 8
           · augment-it: 12

context-v : 125 files (was 54)
           · memopop-ai/memopop-orchestrator: 70  (the big jump)

The from provenance field on each rolled file is now <child>/<app> for nested entries, which the existing changelog and context-v list pages render as a proper provenance pill (memopop-ai/memopop-native).

The convention generalizes: any future top-level child that turns into a pseudomonorepo (apps + changelog inside each app) gets its inner apps surfaced automatically, no rollup-sync edit required.

/studies/ — a real landing page for the pinned reading

The ch.05 · studies row on the homepage was the only one without a destination. It now has one at splash/src/pages/studies/index.astro, which:

  • Reads itself from the source. At build time it walks each study's .gitmodules for the authoritative pinned-repo list and lifts the first > blockquote from each README as the working question. Bump a study's submodules and the next splash build shows the change without touching this page.

  • Has a hero with the same eyebrow/gradient/lede shape as the homepage, plus a meta-strip with study count and total pinned-repo count.

  • Renders one section per study, each with: numbered eyebrow, h2 title, blockquote of the question (accent-bar left border), meta row (pinned-count pill · study repo → external link · #slug permalink anchor), and a responsive grid of pinned-repo cards. Each card shows the local slug (mono, larger) above owner/name (mono, dim) and links to the upstream GitHub URL.

  • Has an outro — ch · why pin — explaining the discipline in three bench-cards: grounded (read source, not folklore), stable (SHA-pinned, doesn't rot), scoped (one study, one question).

The homepage's ch.05 section now has a browse all studies → link in the section header, and each of its three cards is a real <a> deep-linking to /studies/#<slug> with a lift-on-hover affordance. Studies also joined the top nav in Header.astro, slotted between Products and Changelog.

OpenPanel analytics, finally

The other splash sites (astro-knots, content-farm, lfm, context-vigilance-kit) have been wired for OpenPanel for over a week. ai-labs/splash was the holdout. Same pattern, no surprises:

  • splash/src/components/Analytics.astro — OpenPanel-only (no Fathom history here to layer in), gated on import.meta.env.PROD && openPanelClientId so localhost can't pollute the dashboard and a misconfigured CI can't ship a broken <script> tag. The familiar queue-then-flush op shim, then https://openpanel.dev/op1.js deferred.

  • splash/src/layouts/BaseLayout.astro — imports and renders <Analytics /> at the tail of <head> so every page emits the script tags.

  • splash/.env.example — new, documents OPENPANEL_CLIENT_ID with the two operational gotchas (repo Variable not Secret; OpenPanel project must have https://lossless-group.github.io/ on its supported-domains list, otherwise events 401 server-side — the bug that bit the other three splashes for a full day).

  • .github/workflows/pages.yml — env: OPENPANEL_CLIENT_ID: ${{ vars.OPENPANEL_CLIENT_ID }} on the Build step.

  • context-v/prompts/Setup-Analytics-Across-Sites.md (at the monorepo level) — appended a row to the GitHub Pages rollout matrix capturing the wiring + the three remaining manual steps.

Three manual steps remain (dashboard work, not commit-able): create the OpenPanel project (suggested name splash_ai-labs), set the OPENPANEL_CLIENT_ID repo Variable, add https://lossless-group.github.io/ to the project's supported domains.

Status-line refresh on context-vigilance-kit

The product card's status: v0 · 583 files indexed was stale — the kit now powers four ChromaDB collections, not just the original context-v indexer. The card now reads v0 · four collections live with a lede that names all four (context-vigilance-corpus, lossless-changelog, claude-code-sessions, claude-code-tool-traces) and the MCP wiring.

One graduated card removed

The "graduated" strip on the homepage used to include investment-memo-orchestrator with the note "now MemoPop backend." But the orchestrator no longer stands as its own root — it lives nested inside memopop-ai at apps/memopop-orchestrator/. Calling it "graduated to its own home" reads as the opposite of where it ended up. Dropped the card; the memopop-ai product card's lede already preserves the lineage: "the backend is the former investment-memo-orchestrator, now nested."

Parent-level exploration: shared auth for the applied-AI-labs

Not on the splash, but related to the shape of where ai-labs is going: a new exploration landed at context-v/explorations/Shared-Auth-for-Applied-AI-Labs.md (versioned to 0.0.0.3). Three of the active children (memopop-ai, dididecks-ai, augment-it) all need an auth system soon, at a scale that doesn't justify Auth0 / Clerk costs but does justify shared patterns. The exploration captures the recommended shape (TS @lossless/auth-core + Python validator companion, per-app libSQL via Turso, lossless_id UUID + auth_events_outbox as the roll-up seam, org-as-firm dual vocabulary, two-surface viewer auth for published memos on client subdomains), the six forks considered (with rejected paths recorded), and three structured sections — user stories, hard/soft/out requirements, open ideas — ready for Mike to riff into. Next step is a sibling spec.

How to Test

  1. Local rebuild + dev preview:

    BASH
    cd ai-labs/splash
    pnpm rollup:sync    # regenerates src/rollup/* including the new sub-children
    pnpm dev

    Open http://localhost:4321/lossless-ai-labs/ — hero meta-strip should read 4 active. Click Studies in the top nav — /studies/ should render with three sections, each lifting its question from the upstream READMEs.

  2. Verify nested rollup picked up the new memopop-native entry: splash/src/rollup/changelog/memopop-ai/memopop-native/2026-05-17_01.md should exist with from: "memopop-ai/memopop-native" in its frontmatter.

  3. OpenPanel (after the three manual steps): push to main or master, wait for the Actions deploy, then view-source:https://lossless-group.github.io/lossless-ai-labs/ should show the inline op queue + the deferred openpanel.dev/op1.js script tag near the end of <head>. Verify with DevTools Network in an incognito window (extensions block openpanel.dev by default) — look for a POST api.openpanel.dev/track returning 200 (a 401 means the supported-domains step on OpenPanel got skipped).

What's Next

  • The three OpenPanel manual steps to finish the analytics rollout.

  • The Trustworthy Citations Phase 1 work (orchestrator-side) is still the original thread we were on before this splash sweep — apps/memopop-orchestrator/context-v/plans/Trustworthy-Citations-Source-Harvester-Rollout.md. Phase 1 is the no-architecture fixes: the self-disabling citation_validator.py:302 clause, the HEAD-only urllib probe replaced with a real GET, the verdict ladder, the reputable-gated publisher allow-list.

  • The shared-auth exploration converges next into a spec at context-v/specs/Shared-Auth-Core-Package.md, with per-app implementation prompts following.

  • An optional follow-up on the splash itself: a small "cross-cutting at the parent" section that surfaces ai-labs's own context-v/explorations/ and context-v/plans/ separately from the child-rolled feed. Would have surfaced today's auth exploration automatically.