← Corpus / dididecks-ai / plan
Init DidiDecks as Core Submodule of AI-Labs
Carve out dididecks-ai as its own repo and re-attach it to ai-labs as a git submodule, following Lossless pseudomonorepo discipline — branch-aligned tiers, rollup-friendly context-v, splash-page on day one, and the parent's gitlink as the single point of truth.
- Path
- plans/Init-DidiDecks-as-core-Submodule-of-AI-Labs.md
- Authors
- Michael Staton
- Augmented with
- Claude Code on Claude Opus 4.7
- Tags
- Plan · Pseudomonorepo · Git-Submodule · Dididecks · AI-Labs · Repo-Init · Branch-Alignment
Init DidiDecks as Core Submodule of AI-Labs
Plan of record for promoting
dididecks-aifrom “a folder full of specs atai-labs/context-v/” to a first-class child of theai-labs/pseudomonorepo — its own GitHub repo, its own branch-tier (development → main → master), its owncontext-v/andchangelog/, its own splash page, and abranch =-aware submodule pointer fromai-labs/. Steps preserved verbatim from the user’s outline; each step is filled out with concrete actions, commands, and verification.
Pseudomonorepo discipline this plan honors
- The parent owns the space between children.
ai-labs/aggregates context acrossmemopop-ai,dididecks-ai, and future children. Their internals are theirs. (Seepseudomonoreposskill.) - Branch alignment across the tree. Every Lossless submodule rides a three-tier model:
development→main→master. Each tier created from the start so we don’t pay the cost later. (Seereferences/branch-alignment.mdin the pseudomonorepos skill.) - Universal directories. Every repo level has both
context-v/andchangelog/as siblings at the root. We aspire to parallel placement; we’ll set that up correctly from day one. - Rollup-friendly content. The parent splash and
ai-labs/-level splash should be able to surface this submodule’schangelog/andcontext-v/via the GitHub Content API. That implies (a)branch =is set in.gitmodules, (b) directory shapes are conventional, (c) no surprises. - Lifecycle phases. Each phase of this plan corresponds to a Start → Progress → Reflect → Publish loop position. Tracked in changelog entries as we go.
1. Move Astro-Knots projects reach-edu-hub and calmstorm-decks to ai-labs/dididecks-ai/ as client-sites/*
Final location: ai-labs/dididecks-ai/client-sites/reach-edu-hub and ai-labs/dididecks-ai/client-sites/calmstorm-decks.
Why
Both sites were originally added as submodules of astro-knots/sites/. They are, in practice, client engagements that exercise the DidiDecks pattern — not generic astro-knots sites. Re-parenting them under dididecks-ai/client-sites/ aligns their narrative parent with their git parent, makes them legible to the upcoming DidiDecks splash page, and lets the rollup mechanism surface their changelogs alongside the rest of the dididecks family.
The sites themselves do not move on GitHub — they remain their own repos at their existing URLs. Only the parent reference changes.
Constraints
- Each site’s Vercel deploy is wired to its own repo, not to astro-knots. Re-parenting must not break deploys. (Verify: open Vercel project → confirm git remote points at the site’s own repo, not
astro-knots.) - Site git history is sacred. Re-parenting touches
.gitmodulesin both astro-knots (remove) and dididecks-ai (add). The site repos themselves are not modified. developmentbranch alignment — when re-adding under dididecks-ai, setbranch = developmentin.gitmodulesso the gitlink follows the working branch.
Actions
- Pre-flight (in
astro-knots/):cd ~/code/lossless-monorepo/astro-knots git status # clean working tree before touching submodules cat .gitmodules | grep -A2 calmstorm-decks cat .gitmodules | grep -A2 reach-edu-hub - Defer the astro-knots-side removal until after step 5 (the submodule is registered against
ai-labs/dididecks-ai/). Two parents pointing at the same submodule for a brief window is fine; an orphaned gitlink is not. - In step 5, when
dididecks-ai/is its own repo, perform inside it:cd ~/code/lossless-monorepo/ai-labs/dididecks-ai mkdir -p client-sites git submodule add -b development <git@github.com:lossless-group/calmstorm-decks.git> client-sites/calmstorm-decks git submodule add -b development <git@github.com:lossless-group/reach-edu-hub.git> client-sites/reach-edu-hub git submodule sync git submodule update --init --recursive - Then in
astro-knots/:
Thecd ~/code/lossless-monorepo/astro-knots git submodule deinit sites/calmstorm-decks git rm sites/calmstorm-decks git submodule deinit sites/reach-edu-hub git rm sites/reach-edu-hub git commit -m "relocate(submodules): move calmstorm-decks and reach-edu-hub to dididecks-ai pseudomonorepo"pnpm-workspace.yamlin astro-knots also needs the correspondingsites/...lines removed (or they’ll throw onpnpm install).
Verification
- Both sites’ Vercel deploys are still green after the parent flip.
git submodule statusindididecks-ai/shows both, ondevelopment, with valid SHAs.git submodule statusinastro-knots/no longer mentions them.- A
pnpm installat theastro-knots/root succeeds.
2. Move Dididecks Context-V files into ai-labs/dididecks-ai/context-v/
[!NOTE] Rollup behavior of pseudomonorepos Context-V
A recent habit change we have implemented is that the “splash page” in
splash/(hosted through Github Pages) now collates and publishes a rollup of all the context-v projects in the pseudomonorepo — however nested. This means that the splash page will now show all the Context-V files in the pseudomonorepo, and will be updated automatically when new files are added and commit/pushed to the repository.
Files to move
From ai-labs/context-v/ → ai-labs/dididecks-ai/context-v/:
| Source | Destination |
|---|---|
ai-labs/context-v/specs/Dididecks-AI-Slide-Decks-as-Code.md | dididecks-ai/context-v/specs/Dididecks-AI-Slide-Decks-as-Code.md |
ai-labs/context-v/specs/Dididecks-AI-DD-Ready-Citation-and-Source-Access.md | dididecks-ai/context-v/specs/Dididecks-AI-DD-Ready-Citation-and-Source-Access.md |
ai-labs/context-v/specs/Dididecks-AI-Visual-and-Diagram-Component-Library.md | dididecks-ai/context-v/specs/Dididecks-AI-Visual-and-Diagram-Component-Library.md |
ai-labs/context-v/explorations/Dididecks-AI-Business-Model.md | dididecks-ai/context-v/explorations/Dididecks-AI-Business-Model.md |
(this file) ai-labs/context-v/plans/Init-DidiDecks-as-core-Submodule-of-AI-Labs.md | dididecks-ai/context-v/plans/Init-DidiDecks-as-core-Submodule-of-AI-Labs.md (once executed, this plan lives with its outcome) |
Scaffold the destination
cd ~/code/lossless-monorepo/ai-labs/dididecks-ai
mkdir -p context-v/{specs,prompts,blueprints,reminders,explorations,issues,plans}
mkdir -p changelog
Six canonical subdirectories + plans/ (already in adopted use at the ai-labs/ level — assimilated, not introduced fresh). changelog/ as a top-level sibling of context-v/ per the universal-directories aspiration in the pseudomonorepos skill.
Path adjustments after the move
Wikilinks in the moved files reference both prior-art outside dididecks-ai (which stays at the same absolute location, but the relative depth changes) and the calmstorm-decks site (which is also moving — from astro-knots/sites/ to dididecks-ai/client-sites/). New relative paths from dididecks-ai/context-v/specs/:
| Target | Old path (from ai-labs/context-v/specs/) | New path (from dididecks-ai/context-v/specs/) |
|---|---|---|
astro-knots/context-v/... | ../../astro-knots/context-v/... | ../../../../astro-knots/context-v/... |
astro-knots/sites/calmstorm-decks/... (moves) | ../../astro-knots/sites/calmstorm-decks/... | ../../client-sites/calmstorm-decks/... |
lossless-monorepo/context-v/... (root) | ../../../context-v/... | ../../../../context-v/... |
| Business-model exploration | ../explorations/Dididecks-AI-Business-Model | ../explorations/Dididecks-AI-Business-Model (unchanged — same parent-relative) |
| Sibling specs (within dididecks context-v) | Dididecks-AI-DD-Ready-Citation... | (unchanged) |
These adjustments happen in the second commit of step 5 (per user’s note: “Change relative paths to context-v files and prior art, serve as second commit”).
Actions
- Move files with
git mvif we want to preserve cross-history; otherwise plainmvis fine since the files only exist in one repo’s history. - After move, run a grep over the moved files for any
../../astro-knots/sites/calmstorm-decks/...or../../astro-knots/...patterns and update them per the table above. - Update the parent spec’s
Relatedsection to reflect the sibling specs’ new location (they’re now siblings within the same context-v/, so the cross-spec wikilinks[[Dididecks-AI-DD-Ready-Citation-and-Source-Access]]stay unchanged — good). - Re-bump
at_semantic_versionon the parent spec to reflect the relocation (minor, since the content didn’t change semantically).
Verification
dididecks-ai/context-v/specs/contains the three specs.dididecks-ai/context-v/explorations/contains the business-model doc.dididecks-ai/context-v/plans/contains this plan once executed.- All wikilinks render correctly in Obsidian (open the vault rooted at
lossless-monorepo/and verify the graph view connects). - A grep for
../../astro-knots/sites/calmstorm-decksreturns zero hits in the moved files.
3. Generate a Splash page using Astro for Didi labs
Use the context-v files to spec content hierarchy and marketing language for a splash page. Reference the agent-skills and /Users/mpstaton/code/lossless-monorepo/context-v/habits/Maintain-a-Github-Splash-Page-for-each-Repo.md.
Milestone is it builds and renders on local.
Scope
A first-pass marketing splash at dididecks-ai/splash/ — Astro Knots conventions, GitHub Pages publish target, package-isolated from the upcoming dididecks-ai core library, dark-mode default.
The splash is not the DidiDecks product. It is the README-on-the-web for the project — what lossless-group.github.io/dididecks-ai/ (or the future custom domain) will serve. It introduces the project, surfaces the context-v rollup, and changelog, and points at the GitHub repo.
Skills and references to load
maintain-splash-pagesskill — the canonical pattern (memopop-site, content-farm/splash, lfm/splash are reference implementations).astro-knotsskill — Astro 6, no React, Svelte for interactivity, hard prohibitions list.theme-systemskill — two-tier tokens, three-mode contract.lossless-flavored-markdownskill — if the splash renders any markdown content (it will, for the context-v rollup).open-graph-share-seo-geoskill — for unfurl + sitemap + llms.txt from day one.generate-consistent-og-imagesskill — splash OG card; must precede sharing.maintain-design-mdskill — writeDESIGN.mdatdididecks-ai/splash/DESIGN.mdbefore any non-trivial visual decision is locked.~/code/lossless-monorepo/context-v/habits/Maintain-a-Github-Splash-Page-for-each-Repo.md— habit doc.
Content hierarchy (drawn from the context-v files we just wrote)
Lead with The Due Diligence Bar — Didi from the parent spec — that’s the central hook for the splash hero. Then:
- Hero — “Decks for Due Diligence, not for vibes.” The DD framing as the headline.
- The two North Stars — NS-1 (two-sided private/public) and NS-2 (player so good they present live).
- The Design Principles strip — six or seven cards summarizing the recurring needs (citation discipline, non-destructive iteration, MVP-always, Keynote-grade export, etc.).
- The system map — the ingest → wow-ify → variant → publish → export → re-integrate ASCII flow from the parent spec, rendered as an actual diagram.
- The sibling-spec gallery — short cards linking to the two sibling specs and the business-model exploration. (Surfaced via the context-v rollup mechanism.)
- Built-in-public footer — link to GitHub, mention OSS posture (without committing to a license yet — that’s a business-model question still in exploration).
Mechanics
cd ~/code/lossless-monorepo/ai-labs/dididecks-ai
mkdir -p splash
cd splash
pnpm create astro@latest -- --template minimal --typescript strict --no-install
# Then adapt: add @lossless-group/lfm, copy markdown rendering pattern from
# astro-knots/sites/mpstaton-site, scaffold theme.css per theme-system skill,
# add @astrojs/sitemap, write robots.txt, add /llms.txt.
Package-isolation: dididecks-ai/splash/ is a totally separate package.json from whatever the future dididecks-ai core library publishes. The splash never imports from the core; the core never imports from the splash. This is the maintain-splash-pages discipline — do not regress.
Verification (milestone)
pnpm install && pnpm devinsidedididecks-ai/splash/serves a working site atlocalhost:4321.pnpm buildproduces adist/with no errors.- The hero renders the DD framing.
- At least one card per sibling spec is visible.
- Dark mode is the default; theme toggle works.
- The OG image exists at
public/og/default.jpgand unfurls correctly in iMessage (test viaCmd+Lpaste into a chat with yourself).
4. Use gh to create the repo, push as development, main, and master
Write README.md. Git init, create branches at parity. Push.
Why all three branches at once
Per the pseudomonorepos branch-alignment discipline: every Lossless submodule rides a three-tier model. Creating all three at init time costs nothing and avoids the “humans got lazy” drift the skill warns about. The branch = line in the parent’s .gitmodules (set in step 5) will point at development.
Actions
-
Author a minimal
README.mdatdididecks-ai/README.md:# DidiDecks-AI A code-first slide-deck operating system for Due-Diligence-grade content, built by [The Lossless Group](https://lossless.group). - Living spec: [`context-v/specs/Dididecks-AI-Slide-Decks-as-Code.md`](./context-v/specs/Dididecks-AI-Slide-Decks-as-Code.md) - Splash (in progress): [`splash/`](./splash/) - Part of the [ai-labs](https://github.com/lossless-group/ai-labs) pseudomonorepo. Status: early architecture. Not yet implementing. -
Author a minimal
LICENSE— placeholder (e.g.,Copyright (c) 2026 The Lossless Group. License terms TBD; see context-v/explorations/Dididecks-AI-Business-Model.md) until the OSS license question lands. -
Author a
CLAUDE.mdatdididecks-ai/CLAUDE.md— minimal pointer file: project intent, link to the parent spec, instructions for agents to load thecontext-vigilanceandastro-knotsskills before working here. -
Author the first
changelog/entry atdididecks-ai/changelog/2026-05-11_01.mdperchangelog-conventionsskill — covering the init itself. -
Init git + branches:
cd ~/code/lossless-monorepo/ai-labs/dididecks-ai git init git add . git commit -m "init(dididecks-ai): scaffold context-v, splash, changelog, README" git branch -M development git branch main git branch master -
Create the GitHub repo and push:
gh repo create lossless-group/dididecks-ai --public --source=. --remote=origin --description "A code-first slide-deck OS for Due-Diligence-grade content." git push -u origin development git push origin main git push origin master gh repo edit lossless-group/dididecks-ai --default-branch development
Verification
gh repo view lossless-group/dididecks-ai --json defaultBranchRef,visibilityreturnsdevelopmentas default and the chosen visibility.git branch -rshowsorigin/development,origin/main,origin/master.gh repo view lossless-group/dididecks-ai --webopens to the README.
5. cd back into ai-labs, rm dir, add as submodule
Change relative paths to context-v files and prior art, serve as second commit.
Why the rm-then-re-add dance
Until step 5, ai-labs/dididecks-ai/ was an embedded git repo — its own .git/ directory inside a parent that didn’t track it. Git tolerates this but warns. To make it a proper submodule (with a gitlink in the parent and a branch = line in .gitmodules), we remove the embedded copy and re-add it via git submodule add. The contents on disk look identical after; the parent’s tracking changes from “ignored embedded repo” to “tracked submodule pointer at SHA X on branch development.”
Actions
-
Stash anything uncommitted inside the embedded repo first:
cd ~/code/lossless-monorepo/ai-labs/dididecks-ai git status # must be clean. Commit/push anything outstanding before proceeding. -
Remove the embedded directory from ai-labs’ working tree (the repo itself, on GitHub, is unaffected):
cd ~/code/lossless-monorepo/ai-labs rm -rf dididecks-ai -
Add as a submodule, tracking the development branch:
git submodule add -b development git@github.com:lossless-group/dididecks-ai.git dididecks-ai git submodule update --init --recursive -
Verify
.gitmodulescarries thebranch =line (a.gitmodulesentry without it is a smell per the pseudomonorepos branch-alignment guidance):[submodule "dididecks-ai"] path = dididecks-ai url = git@github.com:lossless-group/dididecks-ai.git branch = development -
First commit in ai-labs — the submodule registration:
cd ~/code/lossless-monorepo/ai-labs git add .gitmodules dididecks-ai git commit -m "add(submodule): dididecks-ai pseudomonorepo child, tracking development" -
Second commit — path adjustments inside the moved context-v files. Per step 2’s path-adjustment table, fix wikilinks that depend on the new nesting depth:
cd ~/code/lossless-monorepo/ai-labs/dididecks-ai # Edit the four context-v files, update paths per the table in step 2. git add context-v/ git commit -m "fix(context-v): update wikilink relative paths after submodule promotion" git push origin development -
Update ai-labs’ gitlink to point at the new SHA:
cd ~/code/lossless-monorepo/ai-labs git add dididecks-ai git commit -m "update(submodule): bump dididecks-ai pointer after context-v path fixes" -
Final sweep — also remove the now-stale copies from
ai-labs/context-v/specs/andai-labs/context-v/explorations/, since the canonical home is now inside the submodule:cd ~/code/lossless-monorepo/ai-labs git rm context-v/specs/Dididecks-AI-Slide-Decks-as-Code.md git rm context-v/specs/Dididecks-AI-DD-Ready-Citation-and-Source-Access.md git rm context-v/specs/Dididecks-AI-Visual-and-Diagram-Component-Library.md git rm context-v/explorations/Dididecks-AI-Business-Model.md git commit -m "cleanup(context-v): remove dididecks specs+exploration; canonical home moved to submodule"
Verification
cd ai-labs && git submodule statusshowsdididecks-aiondevelopmentat a valid SHA.cat ai-labs/.gitmodulesshows thebranch = developmentline.cd ai-labs/dididecks-ai && git statusshows clean working tree.- The duplicate spec files no longer exist in
ai-labs/context-v/. - The splash builds and renders (
pnpm devinsidedididecks-ai/splash/). - The astro-knots side is also clean (sites removed from there per step 1).
- A walk of the tree from
lossless-monorepo/finds the dididecks specs in exactly one place — the canonical home inside the submodule.
After this plan is executed
The next plans in line (out of scope for this plan, but worth flagging):
- Roll up content into the ai-labs splash — once
ai-labs/splash/exists (or is built), wire it to pulldididecks-ai/context-v/anddididecks-ai/changelog/via the GitHub Content API perreferences/content-rollup.mdin thepseudomonoreposskill. - Roll up further into the lossless-monorepo splash — same mechanism, one level up.
- Promote
branch = developmentdiscipline across the rest of the ai-labs children (memopop-ai etc.) so the whole pseudomonorepo is uniform. - Write the first DidiDecks implementation prompt under
dididecks-ai/context-v/prompts/— likely “scaffold the core repo structure beyond the splash” or “extract the calmstorm-decks pattern into a reusable primitive.”
Cross-references
- [[../specs/Dididecks-AI-Slide-Decks-as-Code]] — parent spec; the why this submodule exists.
- [[../specs/Dididecks-AI-DD-Ready-Citation-and-Source-Access]] — sibling spec; moves with this plan.
- [[../specs/Dididecks-AI-Visual-and-Diagram-Component-Library]] — sibling spec; moves with this plan.
- [[../explorations/Dididecks-AI-Business-Model]] — exploration; moves with this plan.
pseudomonoreposskill — branch alignment, submodule init, content rollup mechanics.context-vigilanceskill — the framework this plan honors.maintain-splash-pagesskill — splash-page conventions referenced in step 3.astro-knotsskill — splash-tech prohibitions and conventions.changelog-conventionsskill — for thechangelog/2026-05-11_01.mdfirst entry written in step 4.~/code/lossless-monorepo/context-v/habits/Maintain-a-Github-Splash-Page-for-each-Repo.md— habit doc referenced in step 3.