What Override is for
Parmana’s runtime authorization is allow-or-block, evaluated once, deterministically — a Decision is never paused mid-evaluation to wait on a human. If a human authority needs to correct an outcome afterward (approving something Policy rejected, for instance), that correction is recorded as a new, immutableOverride artifact appended to the Execution Trust Record — the original Decision and Execution are untouched.
Using OverrideService directly
OverrideService.create() (packages/runtime/src/services/override-service.ts) enforces two rules: the Business Transaction must exist, and only one Override is allowed per transaction — a second call throws "Override already exists for this Business Transaction." The created Override is appended via ExecutionTrustRecordRepository.appendOverride(), alongside executions, verifications, and receipts.
This is not the same as human-in-the-loop approval
“Human-in-the-loop,” as a pattern, usually implies pausing an in-flight operation to wait for a person before continuing. Override is the opposite: the operation already ran to completion (approved or rejected), and a human is instead appending a correction to the historical record afterward. If you need an actual pause-and-wait approval step before execution, that has to be built into your own call site — hold the Business Transaction, get approval, and only then callPOST /execute — Parmana’s runtime itself has no notion of a pending/awaiting-approval transaction state that blocks mid-pipeline.
examples/07-human-approval’s run.ts is currently an unimplemented stub (console.log("Parmana Example 07 - Human Approval")) — despite the name, it does not yet demonstrate this pattern in runnable code.Related
Override (concept)
The domain model and field-drift details.
Execution Trust Record
Where the Override is appended.
FAQ
More on Override vs. human-in-the-loop.
runtime package
Where
OverrideService lives today.