How to request an approval
Use this guide when a record is ready for someone else to decide on. You start with a record in Plans,
Evidence or Progress; you end with an approval record in status approved, rejected or withdrawn
and, for plans, protocols and reports, the record itself set to approved by its own approve route.
Requesting needs progress.approvals.manage; deciding needs progress.approvals.approve; the
/approve routes of Plans need plans.plans.approve, plans.protocols.approve or
plans.reports.approve.
“Approved” is reserved for the status of an approval record or of a record that passed its approve route. A completed UI action says “Saved”. An agent never approves anything.
Prerequisites
- A record to submit: a plan, protocol or report in Plans, a hypothesis in Evidence, or a milestone in Progress.
- For plans, protocols and reports: the record has been moved to
reviewwith its transition route (POST .../transitionwithto: review, needs the.managepermission of that resource).
Choose Request review on the record
Open the record, for example Plans › Protocols (/p/<slug>/plans/protocols) and select a protocol.
Choose Request review (shown only with progress.approvals.manage). Write a rationale explaining why
the record is ready and submit. The dialog calls POST /programs/{program_id}/progress/approvals with
target_type (milestone, plan, protocol, report or hypothesis) and target_id; the approval is
created as requested and the button confirms with “Saved”.
Follow the request under Progress › Approvals
In the rail choose Progress, then Approvals in the panel (/p/<slug>/progress/approvals). Each
row shows the target, status, who requested it and, later, who decided and when. Needs
progress.approvals.read. The Overview section counts pending approvals for the program.
Record the decision (approver)
An approver opens the request and chooses Record decision (needs progress.approvals.approve), picks
approved or rejected and writes a rationale. The form calls
POST .../progress/approvals/{approval_id}/decision; decided_by, decided_at and the rationale are
stored and an audit row is written in the same transaction.
Approve the record itself (plans, protocols, reports)
For a plan, protocol or report the record’s own status changes only through its approve route: open the
record and choose Approve (needs plans.plans.approve, plans.protocols.approve or
plans.reports.approve). The form calls POST .../plans/protocols/{protocol_id}/approve (or the plan or
report equivalent) with a rationale, and the record reads approved. Every
other status is set through POST .../transition with to any value other than approved.
Withdraw a request you made
While a request is still requested, the requester can choose Withdraw request (needs
progress.approvals.manage); the route is POST .../progress/approvals/{approval_id}/withdraw and the
status becomes withdrawn.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Request review is not shown | You lack progress.approvals.manage | Held by manufacturing_specialist, program_lead and program_owner |
| Record decision is not shown | You lack progress.approvals.approve or the request is no longer requested | Only program_lead and program_owner decide approvals |
| Approve on a protocol is disabled | You lack plans.protocols.approve | The scientist persona drafts but does not approve protocols or reports |