/llms.txt (an index of every page), /llms-full.txt (the integration pages in full), and /openapi.bundled.yaml (every endpoint, with its schema).
0. Know what Parmana will and will not do
- Parmana decides whether an action may run, under a versioned policy. It does not run the action itself. A connector runs it, after Parmana releases it.
- Every action needs a decision and a record. A refusal is a normal outcome, not an error to work around.
- A rule that needs a person returns a refusal the first time. A person approves, and then you send the request again with the approval attached.
- Do not change a refusal into an approval by setting a signal to
true. The server checks signed approvals, and it refuses atrueit cannot verify.
1. Check the server is up
200 with {"status":"UP"}.
If it is not UP, stop. Do not send actions to a server that cannot check them.
2. Find out what a request must carry
200 with capability, policy (name, version, schemaVersion), and signals:
signals.facts: every name you must send undersignals.signals.schema: the type of each fact.signals.bound: facts that must equal a value in your intent.signals.approval: the approval signals, and the path in your request that each approval must name.
policy object exactly as returned. Send one signal for every name in signals.facts.
If you get 404 with CAPABILITY_NOT_BOUND, no policy governs that capability on this server. Stop. Do not invent a policy name.
3. Build the request
Every request toPOST /execute has this shape. Replace every UUID with a new one, and every timestamp with the current time in ISO 8601:
metadata.businessTransactionIdequalsbusinessTransactionId.authorization.authorityIdequalsauthority.authorityId.intent.authorizationIdequalsauthorization.authorizationId.policy.name,policy.versionandintent.actionare not empty.- Every
businessTransactionIdis a valid UUID. - A signal bound to an intent value must equal that value exactly. A mismatch is refused as
POLICY_DENIED, with a message saying the declared signals do not match the executed intent.
4. Send it
5. If a person must approve
A refusal for want of an approval is not a failure. Parmana does not hold your request open. Do this:- Tell the operator what needs approving: the action, the target, and any amount.
- Wait for a signed approval artifact from a trusted approval issuer. Do not create one yourself.
- When you hold the artifact, send the request again, with a new
businessTransactionId, the approval signal set totrue, and the artifact exactly as received insignals.approvalArtifact.
6. Keep the record
A release returns a signed Execution Trust Record. Store it. It is the evidence that the action was allowed, and it can be checked later with the public key fromGET /keys/default and the offline verifier.
7. When something is unclear
- Read the status table in step 4, and the troubleshooting page.
- To look up a transaction, use
GET /execution-intents/<businessTransactionId>. If it is not found, the server did not record it. - If the outcome is
EXECUTION_OUTCOME_UNKNOWNorEXECUTION_RECORD_INCOMPLETE, do not retry. Tell the operator thebusinessTransactionIdand theauthorizationIdfrom the response.