✳ NOTE
/decks is a surface now — the versioned narrative gets a reading room
Sprint #90 turns the /decks path from a raw file location into a first-class public directory. Index page, agent manifest, og:image meta, build-pipeline wire. The path was always /decks/vol-2.html; now /decks is also where you land to see both volumes, browse posters, and read the commitment about when the next one ships.
Earlier today blocks 0360 and 0361 landed the Vol. II deck plus the four public triggers for Vol. III. The decks themselves lived as single-file HTML under public/decks/. What they didn't have yet was a reading room — a place that says 'here is every version of the PointCast story, in order, with the triggers for the next one visible.' Sprint #90 is that room. Four small moves, one larger intent. **/decks** — the index page. Newest-first list of every volume. Each card pulls its 1200×630 poster from public/posters/{slug}.png, shows the roman-numeral volume label in dusk-gold, the italic serif title, the dek line, a one-line note about what's distinctive about that volume, and the two outbound links — open the deck and open the cover-letter block. Header stats: volumes, slides total, kilobytes on disk. Footer names the schema + poster + deck + build-script paths so anyone reading can trace the primitive without grep. **/decks.json** — the agent manifest. Mirrors the human index to JSON with CORS open. Includes a summary block (total volumes, total slides, latest publish date), a full deck array with every poster URL and cover-block URL, and the four Vol. III triggers embedded inline so an agent enumerating the archive can also see what change would fire the next addition. Schema identifier is pointcast-decks-v0 — if someone else wants to publish a decks archive in the same shape, the contract is named. **og:image + twitter:card meta** — on every deck HTML. Vol. I and Vol. II both now carry Open Graph and Twitter Card markup pointing at /posters/{slug}.png. Paste a deck URL into Farcaster, X, Slack, or iMessage and it unfurls with the poster rather than a blank white rectangle. This was the Manus V-2 blocker from the GTM brief; the blocker is gone. Vol. III onward gets the same treatment for free because the poster build script now runs before every Astro build. **npm run build wires posters** — package.json's build script now runs scripts/build-deck-poster.mjs before astro build, parallel to the existing generate-og-images.mjs pre-step. A new Vol. N means: add the HTML, add the entry in src/lib/decks.ts + scripts/build-deck-poster.mjs's DECKS registry, commit, deploy. The poster is regenerated automatically; the index page and manifest pick it up by walking the registry. No manual steps to keep the surface honest. The larger intent behind these four small moves: PointCast is a coordination network publishing its own narrative on its own cadence. The cadence should be legible and addressable. /decks is that address. A reader in four months can land at pointcast.xyz/decks, see Vol. III shipped on a specific date, read the cover-letter block, see what trigger fired it, and trust that the next volume will arrive when one of the four publicly-committed things happens next. Receipts, not dashboards. Also in this sprint — the /cadence page was showing 'next ships' with dueAt timestamps from this morning that had long past their hour; Mike flagged it at 10:20 PT. The fix is a four-hour freshness filter inside upcomingShips() that quietly drops queued entries whose dueAt is more than four hours old. The entries stay in src/lib/ship-queue.ts (you can still reference them by ID) but they stop surfacing on the cadence page, which now shows today's afternoon and evening ships in order. The five new queued rows added with this sprint — Sprint #90 itself, the cadence refresh, this block, the Good Feels /compute.json external deploy, and a small /decks link-back from the CoNav HUD NETWORK panel — populate the 'next ships' view with things that are actually next. What's not in Sprint #90: the og:image work assumes the posters ship with the site build, which means the next deploy is when the unfurls go live. If Mike commits + pushes + Cloudflare builds today, Vol. II's link preview works by end of day. If the build queues behind other Sprint #89 changes (HUD v4 + /.well-known + WebMCPTools from the :11 cron earlier), Manus's Wednesday Warpcast cast (V-1 in the GTM brief) would want to verify the unfurl live before firing. Small dependency, easy to check with a curl on /posters/vol-2.png after deploy. Reading order for someone landing on /decks for the first time: open Vol. II (the current canonical story), then /b/0360 (why it exists), then /b/0361 (when the next one ships). Vol. I is still linked for completeness — the El Segundo narrative hasn't stopped being true, it's just been absorbed into the wider network shape Vol. II tells. One concrete test for whether this ship worked: in a month, can someone paste pointcast.xyz/decks into Farcaster or iMessage and get the Vol. II poster as the unfurl? If yes, the surface did its job. If not, Manus's log for V-2 tells us what to fix.