Commands
Every command takes --config prodc.toml (default) and --json. prodc -C DIR … runs as if started in DIR. Exit 0 ok · 1 gate failed · 2 config/load error.
Read
| Command | Does | Example |
|---|---|---|
status |
The board: needs vs proofs, per who, with goals/releases/roster/handoffs/recurrence/orphans | prodc status --only-must |
lint |
CI gate: exit 1 on BROKEN proof or a must-have with no evidence; warns on dupes, unlinked recurrence, stale evidence, importance off-scale/unrevisited, who-name variants (see [lint]) |
prodc lint --strict |
show <id> |
One need as a citable answer: grounds, warrant, sources, proofs | prodc show N-1 |
brief <client> |
Pre-meeting agenda for one client: its opinions and HOLEs, must first | prodc brief acme |
plan |
Ranked backlog: must + state + evidence + recurrence; importance refines |
prodc plan --json |
diff <snapshot> |
State changes since a saved status --json |
prodc diff last.json |
portfolio <path>… |
Many boards, one scoreboard (+ totals footer); a path is a prodc.toml or a dir to discover boards under (prunes VCS/vendor/hidden dirs, --max-depth default 4) |
prodc portfolio projects/ |
dupes |
Candidate duplicate need pairs by text similarity; --threshold overrides [lint].duplicate_threshold |
prodc dupes --threshold 0.7 |
recurrence |
Baselines shared across clients; --suggest proposes unlinked cross-client needs that could share one (set variant_of or not_variant_of); --suggest --apply --baseline-id ID --file F creates a shared baseline for the top group and links its members (--dry-run to preview); --threshold overrides [lint].duplicate_threshold |
prodc recurrence --suggest --apply --baseline-id B-1 --file needs/base.yaml |
suggest [id] |
Candidate proof locators for HOLE needs, ranked by text similarity to adapter inventories; --min-score --top --kind; --apply writes the best per need as a proof (--dry-run to preview) |
prodc suggest H-1 --min-score 0.4 --apply |
report |
Render the board as a shareable document for a PM to read, share, or print. --format md (default) is a readable markdown document; --format html is a single self-contained, interactive, read-only viewer (filter by state/client, search, expand a need, regroup by client/goal/release/state, print to PDF) with no external assets. -o PATH writes a file, --client ID scopes it |
prodc report --format html -o status.html |
sync |
Run the configured lifecycle callbacks ([callbacks]) for needs whose state changed since the last sync: resolves the board, diffs it against the state ledger, pipes each changed need + board context to the callback command as JSON on stdin, and writes the ledger forward. First run records a baseline and fires nothing; a failed callback is reported, exits non-zero, and leaves its need un-advanced so the next sync retries. --dry-run shows what would fire |
prodc sync |
agent |
Print prodc's agent playbook so a coding agent runs prodc as the project's PM; --write PATH writes it into the repo (--force to overwrite) |
prodc agent >> AGENTS.md |
guide |
Print prodc's short human CLI onboarding guide; --write PATH writes it into the repo |
prodc guide |
status flags
| Flag | Effect |
|---|---|
--wide |
never clip need text |
--columns id,state,text,… |
flat table of just those columns (id state grounds text who role warrant declared must opinion goal release client) |
--only-must |
must-haves only |
--include-drafts |
include draft (staged) needs; by default they are hidden and uncounted (#60) |
--stale DAYS |
only needs whose newest observed_at is older than DAYS ([lint].stale_after_days makes it a lint warning) |
--client ID / --goal ID |
scope board and coverage to one client / goal |
--strict |
also exit 1 on any opinion |
--min-coverage 0.8 |
exit 1 below that delivered/total |
--max-dangling N |
tolerate N BROKEN proofs (default 0) |
--max-orphans N |
exit 1 above N proofs claimed by no need |
Needs with product: false are listed out of scope and not counted.
Write
Each rewrites one YAML file, re-loads the whole model as validation, reverts on failure, prints the diff. All take --dry-run and --expect-sha SHA256 (refuse if the file changed since you read it).
| Command | Does | Example |
|---|---|---|
set <id> key=value |
set one field; key+=value appends to proofs/children; importance=<n\|label> is checked against the [importance] rubric and stamps importance_set_at |
prodc set N-2 importance=needed |
capture <id> --kind K |
append a source (K = primary|secondary|assumption; old interview/artifact/proxy/internal still accepted); --who --date --quote --locator --observed-at (observed-at defaults to today, for staleness) |
prodc capture N-3 --kind primary --who Ana --date 2026-10-05 --quote "…" |
accept <id> --who W --date D |
add an accept:W@D proof; --revoke removes it |
prodc accept N-2 --who jorge --date 2026-10-05 |
attest <id> --by X --date D |
record a review that the proofs establish the need; --verdict pass\|concerns\|fail (only pass clears it — anything else warns), --ai --comment |
prodc attest N-1 --by claude-fable-5-1 --ai --date 2026-10-05 --verdict pass |
withdraw <id> --reason R |
record a decision against the need: off the board + out of coverage, the record kept; --kind wont_do\|out_of_scope\|duplicate, --of (the original, required for duplicate), --principle (the vision it rests on); --date defaults to today |
prodc withdraw N-7 --reason "dup" --kind duplicate --of N-3 |
withdraw decision <id> --reason R / reinstate decision <id> |
supersede / restore a decision (noun-first; ids are unique per noun) | prodc withdraw decision D-1 --reason "superseded by D-7" |
reinstate <id> |
remove a need's withdrawal, putting it back on the board (errors if not withdrawn) | prodc reinstate N-7 |
add need <id> --text T --who W --file F |
new need with agent provenance; --kind assumption\|secondary (never primary — that's earned by a real user); warns on a possible duplicate, --strict-dupes refuses, --no-dupe-check skips; --draft stages it off the board (promote later with set <id> draft=false) |
prodc add need N-9 --text "…" --who bot --file needs/bot.yaml --draft |
add role <id> --text T --file F |
declare a Role in F's roles: list (new file created if needed); duplicate id refused |
prodc add role owner --text "owns the roastery" --file needs/roles.yaml |
add principle <id> --text T --file F |
declare a product principle (the vision); --from-need <id> promotes a need, copying its text + sources |
prodc add principle P-1 --text "local-first" --file needs/principles.yaml |
revise principle <id> [--text] [--date] |
re-state a principle; re-stamps revised_at, which flags decisions taken under the old version for re-review |
prodc revise principle P-1 --text "…" |
add decision <id> --text T --needs IDS --file F |
the solution chosen for a need (OST); --alternative (repeatable, the rejected options), --consequences, --principles, --date |
prodc add decision D-1 --text "store as FLAC" --needs N-1 --alternative WAV --file needs/decisions.yaml |
set fields: text who must importance claim goal release variant_of client product draft; lists: proofs children contradicts.