Add Tech Stack and Monetization sections to OpenPRD (0.3) (#144)
Some checks are pending
CI / build (push) Waiting to run
test / test (push) Waiting to run

OpenPRD 0.2 fixed eight body sections, none of which asked what the thing is
built on or how it earns. The stack got chosen in the first implementation PR
instead of at review, and a PRD could be filled out completely without anyone
writing down who pays. PRD 0006 had already grown a hand-rolled
`## Business model` section, which is the gap showing.

0.3 adds two required sections between `UX Notes` and `Success Metrics`:

  - Tech Stack — languages, frameworks, datastores, third-party services, and
    anything the work must not depend on. It makes the requirements costable.
  - Monetization — the revenue model: who pays, for what, how much, and when.
    `_None._` stays a valid answer, but it now has to be said out loud.

Adding required sections would normally invalidate every document already
written, so a document is now held to the section list its own `openprd:` key
fixes. A 0.2 document keeps conforming with eight sections, forever; a 0.3
document needs ten. Adoption is per document, and `logicsrc prd validate
--expect-version 0.3` (new flag, wiring up the validator option that already
existed) reports the stragglers as OP-L-VERSION.

The front-matter schema is untouched — both additions are body sections.

Conformance bundle proves both directions: invalid/missing-monetization.md
fails with OP-C-SECTION-MISSING, and valid/legacy-0-2.md passes unedited.

This repo's own PRDs 0001-0006 stay at 0.2 as standing evidence that the
compatibility rule holds. PRD 0007 records the decision at 0.3.


Claude-Session: https://claude.ai/code/session_017XRNNm6pK6nPi7rJ6bJNHu

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-09-06 16:50:11 -07:00 committed by GitHub
parent ca0283caa9
commit 91834179b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
36 changed files with 679 additions and 80 deletions

View file

@ -1,6 +1,6 @@
{
"openprdConformance": "0.2",
"description": "Conformance fixtures for OpenPRD 0.2. Every valid fixture must parse and validate with no errors; every invalid fixture must fail with the stated code. `file` is the filename the fixture must be validated as, since the standard's rules depend on it.",
"openprdConformance": "0.3",
"description": "Conformance fixtures for OpenPRD 0.3. Every valid fixture must parse and validate with no errors; every invalid fixture must fail with the stated code. `file` is the filename the fixture must be validated as, since the standard's rules depend on it. A document is held to the section list its own `openprd:` version fixes, so valid/legacy-0-2.md still conforms with the eight sections 0.2 defined.",
"valid": [
{
"fixture": "valid/minimal.md",
@ -25,6 +25,11 @@
{
"fixture": "valid/none-sections.md",
"file": "0005-keep-every-section-even-when-empty.md"
},
{
"fixture": "valid/legacy-0-2.md",
"file": "0006-keep-a-0-2-document-valid.md",
"reason": "A 0.2 document has eight sections and must keep conforming under 0.3."
}
],
"invalid": [
@ -32,7 +37,13 @@
"fixture": "invalid/missing-section.md",
"file": "0001-missing-a-section.md",
"code": "OP-C-SECTION-MISSING",
"reason": "The eight body sections are all required; Users is absent."
"reason": "The body sections are all required; Users is absent."
},
{
"fixture": "invalid/missing-monetization.md",
"file": "0001-omit-the-monetization-section.md",
"code": "OP-C-SECTION-MISSING",
"reason": "0.3 requires Tech Stack and Monetization; Monetization is absent."
},
{
"fixture": "invalid/out-of-order.md",

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Bad filename
status: Draft
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "1"
title: Two digit id
status: Draft
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Unknown status
status: Shipped
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Updated before created
status: Draft
@ -33,6 +33,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Duplicate requirement id
status: Draft
@ -32,6 +32,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0042"
title: Id does not match
status: Draft
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -0,0 +1,45 @@
---
openprd: "0.3"
id: "0001"
title: Omit the monetization section
status: Draft
authors:
- anthony@profullstack.com
---
## Problem
The thing is broken and it costs us money every week.
## Goals
_None._
## Non-Goals
_None._
## Users
_None._
## Requirements
- R1 [P0] First required capability.
## UX Notes
_None._
## Tech Stack
_None._
## Success Metrics
_None._
## Risks & Open Questions
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Missing a section
status: Draft
@ -27,6 +27,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
status: Draft
authors:
@ -30,6 +30,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -24,6 +24,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Sections out of order
status: Draft
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Superseded with no replacement
status: Superseded
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Unknown front matter key
status: Draft
@ -32,6 +32,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0002"
title: Use bold requirement markers
status: Review
@ -31,6 +31,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Expand the parked-domain service
status: Draft
@ -38,6 +38,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -0,0 +1,41 @@
---
openprd: "0.2"
id: "0006"
title: Keep a 0.2 document valid
status: Draft
authors:
- anthony@profullstack.com
---
## Problem
The thing is broken and it costs us money every week.
## Goals
_None._
## Non-Goals
_None._
## Users
_None._
## Requirements
- R1 [P0] First required capability.
## UX Notes
_None._
## Success Metrics
_None._
## Risks & Open Questions
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0001"
title: Expand the parked-domain service
status: Draft
@ -31,6 +31,14 @@ _None._
_None._
## Tech Stack
_None._
## Monetization
_None._
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0005"
title: Keep every section even when empty
status: Accepted
@ -31,6 +31,14 @@ _None._
_None._
## Tech Stack
_None._
## Monetization
_None._
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0003"
title: Organize a long requirements section
status: Draft
@ -37,6 +37,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._

View file

@ -1,5 +1,5 @@
---
openprd: "0.2"
openprd: "0.3"
id: "0004"
title: Retire the old flow
status: Superseded
@ -32,6 +32,15 @@ _None._
_None._
## Tech Stack
TypeScript on Node 22, Postgres, and the existing Cloudflare worker. No new
runtime.
## Monetization
Bundled into the existing Pro plan at $19/mo; no separate SKU.
## Success Metrics
_None._