Parent PRD
#12
What to build
A thin vertical slice that validates the architecture before any article is written.
Define the article content collection with its Zod schema, including the series discriminator (enum: build-log | essay) and the conditional episode_number requirement (required when series === "build-log"). Define the independent SCHEMA_VERSION_ARTICLE marker.
Commit one placeholder article entry (real frontmatter shape, throwaway prose, episode_number: 0 reserved for stubs). Verify that the existing Dual-Format Serving deep module from PRD #1 resolves both /articles/<slug> and /articles/<slug>.md without per-route code. Verify that the existing Feed Generators deep module includes the new collection in rss.xml, llms.txt, sitemap.xml without code changes.
Build the /articles/ listing page as composition over the collection — sorted by episode_number ascending for build-log entries, inline by date for essays.
Extend the schema-rejection tests to cover article-specific malformed cases. Extend the dual-format integration tests to iterate over the new collection.
See plans/slice-11-build-log.md Phase 1 for full details.
Acceptance criteria
Blocked by
None — can start immediately.
User stories addressed
Reference by number from PRD #12:
- User story 12 (LLM agent —
.md ingestion)
- User story 13 (LLM agent —
llms.txt listing)
- User story 14 (LLM agent — RSS inclusion)
- User story 16 (author — schema enforces required frontmatter)
- User story 19 (author —
series discriminator)
- User story 20 (author —
commit_range as internal metadata)
Parent PRD
#12
What to build
A thin vertical slice that validates the architecture before any article is written.
Define the
articlecontent collection with its Zod schema, including theseriesdiscriminator (enum:build-log|essay) and the conditionalepisode_numberrequirement (required whenseries === "build-log"). Define the independentSCHEMA_VERSION_ARTICLEmarker.Commit one placeholder article entry (real frontmatter shape, throwaway prose,
episode_number: 0reserved for stubs). Verify that the existing Dual-Format Serving deep module from PRD #1 resolves both/articles/<slug>and/articles/<slug>.mdwithout per-route code. Verify that the existing Feed Generators deep module includes the new collection inrss.xml,llms.txt,sitemap.xmlwithout code changes.Build the
/articles/listing page as composition over the collection — sorted byepisode_numberascending forbuild-logentries, inline by date for essays.Extend the schema-rejection tests to cover article-specific malformed cases. Extend the dual-format integration tests to iterate over the new collection.
See
plans/slice-11-build-log.mdPhase 1 for full details.Acceptance criteria
articlecontent collection with Zod-validated frontmatter is live;SCHEMA_VERSION_ARTICLEmarker is defined and exportedseriesenum, missingepisode_numberwhenseries === "build-log", malformedcommit_range) fails CI before merge; error message identifies the bad field/articles/<slug>(200text/html) and/articles/<slug>.md(200text/markdown) with body matching the source markdownrss.xml,llms.txt, andsitemap.xmlinclude the placeholder article alongside existing statements/articles/listing page renders the placeholder, sorted byepisode_numberascendingpnpm types && pnpm test && pnpm lint && pnpm knipall pass in CIBlocked by
None — can start immediately.
User stories addressed
Reference by number from PRD #12:
.mdingestion)llms.txtlisting)seriesdiscriminator)commit_rangeas internal metadata)