llms.txt + llms-full.txt land on the ai-labs splash — the convention is now fully met
Two endpoint files, three markdown templates, one small provenance helper, and a `<link rel="alternate" type="text/markdown">` in BaseLayout — agentic crawlers can now ingest the entire pseudomonorepo (parent + three children, 11 changelog entries, 29 context-v notes) in one fetch instead of crawling 44 HTML pages.
Why Care?
The two child splashes (context-vigilance-kit and memopop-ai) have been serving /llms.txt and /llms-full.txt since last week. The parent ai-labs splash hadn't — agents and LLM crawlers that landed here had to scrape 44 HTML pages and reconstruct the content. That's the failure mode the llms.txt convention exists to solve. This entry fixes the gap.
After this, https://lossless-group.github.io/lossless-ai-labs/llms.txt returns a 17 KB markdown link-index (grouped by source peer — ai-labs, context-vigilance-kit, memopop-ai, dididecks-ai), and /llms-full.txt returns the entire 425 KB corpus concatenated. Both are static, built at deploy time, no runtime cost.
This was the last open item on the maintain-splash-pages skill's acceptance checklist. The ai-labs splash now meets the full convention.
What's New?
splash/src/pages/llms.txt.ts— APIRoute that reads thechangelogandcontext-vcollections, groups byfrom(the peer-slug provenance field), sorts changelog by date desc and context-v by title alpha, emits a markdown link index. Ported frommemopop-ai/apps/memopop-site/.splash/src/pages/llms-full.txt.ts— same shape but emits every entry's full body, each preceded by a metadata header (title, kind, source peer, source path, canonical URL, last-modified date) and separated by---.splash/src/llms/llms.md+llms-full.md— prose templates. The endpoints are dumb assemblers that load these via Vite's?rawimport and substitute{{TOKEN}}placeholders. All voice and framing lives here, not in TypeScript — same source-of-truth discipline as the context-vigilance-kit and memopop ports.splash/src/llms/README.md— documents the token vocabulary and the three per-splash adaptations made during the port (URL shape usesentry.iddirectly, not synthesizedfrom + slug;SITE_NAMEnotSITE_DEFAULTS.name;readProvenancefallback default isai-labs).splash/src/lib/provenance.ts— small helper module (readProvenance,pickDate,pickString) used by both endpoints to read thefrom/from_pathfields and pick the best-available date across legacy and current frontmatter shapes. Ported from memopop, withfallbackFromdefaulting toai-labs.splash/src/components/MetaTags.astro— adds<link rel="alternate" type="text/markdown" href="…llms.txt" title="llms.txt for this site">in<head>. Any agentic tool that looks there discovers the markdown corpus without parsingrobots.txtfirst.
Two adaptations versus the memopop port
Both small, both worth noting for the next splash that cribs from these:
URL shape uses
entry.iddirectly. Memopop synthesized the URL as${root}/changelog/${from}/${slug}/whereslugwasentry.idwith thefrom/prefix stripped. That works for memopop where every entry has a peer prefix. But ai-labs has parent-authored entries (the changelog at the ai-labs root, wherefrom === 'ai-labs'by fallback) whoseentry.idis bare —2026-05-11_01, notai-labs/2026-05-11_01. Synthesizing${from}/${slug}for those entries would prepend a phantomai-labs/to URLs that don't have it. The fix: just use${root}/changelog/${entry.id}/directly — which is exactly what the detail-page route already does (href={${base}changelog/${entry.id}/}in[...slug].astro). The shapes match, no synthesis needed.SITE_NAMEnotSITE_DEFAULTS.name. Memopop'sseo.tsexports aSITE_DEFAULTSobject; ai-labs's exportsSITE_NAMEas a top-level constant. The endpoint import was changed accordingly. No behavior difference, just naming.
Both adaptations are documented in the new src/llms/README.md so the next splash that ports this won't have to rediscover them.
Verification
After build (pnpm build from splash/):
$ ls -lh dist/llms*.txt
.rw-r--r--@ 17K dist/llms.txt
.rw-r--r--@ 425K dist/llms-full.txt
$ head -5 dist/llms.txt
# Lossless AI-Labs
> Lossless AI-Labs
Applied AI testbed becoming home to core products. …
$ grep -oE 'rel="alternate"[^>]*' dist/index.html
rel="alternate" type="text/markdown" href="/lossless-ai-labs/llms.txt" title="llms.txt for this site"
$ grep -c "llms.txt" dist/sitemap-0.xml
0The sitemap filter (already in place since the splash was scaffolded) correctly excludes both endpoints from sitemap-0.xml — search engines don't get them; only LLM-facing discovery does. The rel="alternate" link is in every page's <head> for tools that look there.
What this enables
One-fetch ingest. A model with web tool use can fetch
/llms-full.txtand have the entire ai-labs corpus in context — every changelog entry, every spec, every plan, every reminder, with provenance preserved per-entry.Lighter-weight scan. Tools that want a link index can fetch
/llms.txt(17 KB) and resolve specific entries on demand.Cross-peer scoping. Both files group by
from, so an agent interested in just memopop's corner can ignore the rest. Thefrom:provenance is the load-bearing facet across the whole splash — search, sort, and now LLM ingest all respect it.
Convention status
✅ splash/, astro.config, package, tsconfig
✅ Clean build from a fresh clone
✅ Pages workflow + deploy via master
✅ Pagefind search + /search route
✅ SortControls on both list pages
✅ /llms.txt + /llms-full.txt + rel="alternate" hint (this entry)
✅ OG card sextet, sitemap, robots.txt, mode toggleEvery line on the maintain-splash-pages acceptance checklist is now met. Outstanding non-skill items: the main-vs-master deployment-branch protection rule asymmetry (cosmetic), the ImageKit content-negotiation question on the OG image bytes (worth verifying with an iMessage unfurl test).
Related
The reference impls cribbed from:
ai-labs/memopop-ai/apps/memopop-site/src/pages/llms*.txt.ts(closer fit — two collections) andai-labs/context-vigilance-kit/splash/src/pages/llms*.txt.ts(single-collection variant). The README insplash/src/llms/documents the per-splash adaptations.The spec: llmstxt.org.
Previous entry:
2026-05-12_01.md(SortControls — the second-to-last convention item).
