feat(openprd): revise standard to DIP-style numbered proposals (0.2) (#96)

Reshape OpenPRD from a private single-file (prd/<slug>/prd.md, gitignored) into a
published, numbered proposal collection like BIP/EIP/DIP: prd/NNNN-slug.md +
0000-template.md + a README index, committed to the repo, with a lifecycle
(Draft → Review → Accepted → Final; Rejected/Withdrawn/Superseded).

Tools (e.g. moshcode /prd) consume this to publish PRDs into whatever repo the
user is working in.

- docs/openprd.md — rewritten: numbering, lifecycle, directory layout, conformance.
- docs/openprd/0000-template.md — the canonical template.
- packages/schemas/schemas/openprd-prd.schema.json — 4-digit id, status enum,
  authors, discussion/implementation, supersedes/superseded-by.
- fixture updated to 0.2.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-07-12 08:55:19 -07:00 committed by GitHub
parent 9346d02a39
commit 756c3f6f21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 142 additions and 78 deletions

View file

@ -1,10 +1,12 @@
openprd: "0.1"
id: park-service-expansion
title: Parked-domain service expansion
status: draft
owner: moshcoder.coinpay
openprd: "0.2"
id: "0001"
title: Expand the parked-domain service
status: Draft
authors:
- anthony@profullstack.com
repo: moshcoder/moshcoding
created: 2026-07-12
updated: 2026-07-12
tags:
- growth
- monetization

View file

@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://schemas.logicsrc.com/openprd-prd.schema.json",
"title": "OpenPRD Product Requirements Document",
"description": "The front-matter manifest of an OpenPRD document. OpenPRD is a deliberately lightweight, single-file PRD standard: one prd/<slug>/prd.md per product decision, authored by a human or an AI agent. The document body is Markdown with a fixed set of sections; this schema governs only the YAML front-matter. PRD documents are private by convention (gitignored) — only the OpenPRD standard itself is published.",
"description": "The front-matter manifest of an OpenPRD document. OpenPRD is a lightweight, DIP-style proposal standard: a repo publishes a numbered collection of PRDs under prd/ (prd/NNNN-slug.md), with a 0000-template.md and a README index, committed to the repo like a BIP/EIP/DIP process. This schema governs the YAML front-matter; the body is Markdown with a fixed set of sections.",
"type": "object",
"required": ["openprd", "id", "title", "status"],
"additionalProperties": false,
@ -10,26 +10,33 @@
"openprd": {
"type": "string",
"pattern": "^\\d+\\.\\d+(\\.\\d+)?$",
"description": "OpenPRD standard version this document conforms to, e.g. '0.1'."
"description": "OpenPRD standard version this document conforms to, e.g. '0.2'."
},
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]*$",
"description": "Kebab-case slug, unique within the repo. Also the directory name: prd/<id>/prd.md."
"pattern": "^\\d{4}$",
"description": "Four-digit zero-padded number, monotonically increasing with no gaps. Matches the filename prefix: prd/<id>-<slug>.md."
},
"title": {
"type": "string",
"minLength": 1,
"description": "Human-readable product/feature title."
"description": "Short imperative title — start with a verb where possible."
},
"status": {
"type": "string",
"enum": ["draft", "review", "active", "shipped", "archived"],
"description": "Lifecycle stage of the PRD."
"enum": ["Draft", "Review", "Accepted", "Final", "Rejected", "Withdrawn", "Superseded"],
"description": "Lifecycle stage. Draft → Review → Accepted → Final; or Rejected/Withdrawn/Superseded."
},
"authors": {
"type": "array",
"items": { "type": "string" },
"minItems": 1,
"uniqueItems": true,
"description": "Author identities — email, handle, or DID."
},
"owner": {
"type": "string",
"description": "Optional DID or handle of the accountable owner, e.g. a LogicSRC agent or account DID."
"description": "Optional DID or handle of the accountable owner (e.g. a LogicSRC account/agent DID)."
},
"repo": {
"type": "string",
@ -45,6 +52,14 @@
"format": "date",
"description": "ISO date (YYYY-MM-DD) of the last substantive edit."
},
"discussion": {
"type": "string",
"description": "Optional URL to the PR/issue/thread where this PRD is discussed."
},
"implementation": {
"type": "string",
"description": "Optional URL/reference to the implementation PR or tracking issue."
},
"tags": {
"type": "array",
"items": { "type": "string" },
@ -52,10 +67,14 @@
"description": "Optional freeform labels for grouping PRDs."
},
"supersedes": {
"type": "array",
"items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
"uniqueItems": true,
"description": "Optional ids of earlier PRDs this one replaces."
"type": "string",
"pattern": "^\\d{4}$",
"description": "Optional id of an earlier PRD this one replaces."
},
"superseded-by": {
"type": "string",
"pattern": "^\\d{4}$",
"description": "Optional id of a later PRD that replaces this one."
}
}
}