LogicSRC standards surface

OpenPRD

A lightweight open standard for product requirements documents authored by humans or AI agents. A repo keeps a numbered, committed collection under prd/— one Markdown file per decision, readable a year later.

It borrows the shape of a BIP/EIP/DIP process. Where OpenSpec models a change as a multi-file bundle, OpenPRD models a product decision as one numbered file you can read to recover the why.

Status: 0.2. A PRD is just a file — it needs no service, and no tooling, to be valid.

The shape

Front-matter, then eight sections in a fixed order. All of them required.

---
openprd: "0.2"
id: "0001"                  # four digits, matches the filename
title: Expand the parked-domain service
status: Draft               # Draft|Review|Accepted|Final|Rejected|Withdrawn|Superseded
authors:
  - anthony@profullstack.com
created: 2026-07-12
updated: 2026-07-12
tags: [growth]
---

## Problem
## Goals
## Non-Goals
## Users
## Requirements

- R1 [P0] First required capability.
- R2 [P1] Next capability.

## UX Notes
## Success Metrics
## Risks & Open Questions
1. Problem
The user or business problem, and why it matters now.
2. Goals
What success looks like, as outcomes rather than features.
3. Non-Goals
Explicitly out of scope, to bound the work.
4. Users
Who this is for; personas or segments.
5. Requirements
Numbered R1, R2, … each tagged [P0], [P1], or [P2].
6. UX Notes
Flows, states, and constraints that shape the experience.
7. Success Metrics
How the goals will be measured.
8. Risks & Open Questions
Known risks and the decisions still owed.

A section may be a single line such as _None._ — but it may not be missing. That is what keeps every PRD skimmable and diffable.

Lifecycle, enforced

Status lives in the front-matter and is the source of truth.

Draft  →  Review  →  Accepted  →  Final
                  ↘  Rejected
                  ↘  Withdrawn
                  ↘  Superseded by NNNN
  • Draft cannot jump to Final — the tool refuses the transition rather than trusting the author to remember.
  • Rejected, Withdrawn, and Superseded are terminal. They stay on disk, because the why not is part of the record.
  • Moving to Superseded requires naming the PRD that replaces it.
  • Ids are four digits, monotonically increasing, with no gaps. 0000 is the template.

Conformance is four rules

Everything else the tooling reports is lint, and says so.

  1. It lives at prd/<id>-<slug>.md with a four-digit id.
  2. Its front-matter validates against openprd-prd.schema.json.
  3. The id equals the filename's numeric prefix.
  4. All eight body sections are present, in order.

Conformance failures are errors. An empty section, a requirement missing its priority tag, numbering that skips, a stale index, a one-sided supersession link — those are warnings, and --strict promotes them. Every finding carries a stable code, the file, the line, and a remediation hint.

Tooling

@logicsrc/openprd implements the standard; the CLI drives it.

logicsrc prd init                      # template + generated index
logicsrc prd new "Expand the service"  # next free number, eight stub sections
logicsrc prd list                      # id, title, status, tags, requirements
logicsrc prd validate --strict         # conformance + lint, exit 1 on error
logicsrc prd index --write             # regenerate prd/README.md
logicsrc prd status 0001 Review        # refuses illegal transitions
logicsrc prd tasks 0001 --priority P0  # the optional LogicSRC task bridge

Exit codes are stable for CI: 0 ok, 1 invalid, 2 usage, 3 not found.

The optional task bridge

Requirements map onto LogicSRC tasks — in tooling, not in the standard.

Each R# becomes one logicsrc.task document, validated against its schema before it is emitted. The board defaults to /prd/<id>, repo carries over, and the creator DID is derived from the first author (anthony@profullstack.com anthony.profullstack).

Nothing requires you to use it. A PRD with no LogicSRC anywhere near it is still a PRD.

Where everything lives