Concept
Decision
The outcome a policy gives one request, with the rule and the facts behind it.
Definition
A decision is the output of decide(), a pure function of the request context and the policy bundle. It has no clock, network, randomness or model inside it. It names one outcome, the rule that produced it, human-readable reasons and the facts it relied on.
Shape
type Outcome = "allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy";
interface Decision {
outcome: Outcome;
ruleId: string; // for example "allow.default", "deny.delegation_chain"
reasons: string[];
facts: { kind: string; detail: string }[];
}
Invariants
| Invariant | Checked by |
|---|---|
| decide() is deterministic, and a deny always cites a verified fact. | packages/engine/src/engine.test.ts: "decide is deterministic and deny always cites a verified fact" |
| The Rust core and the TypeScript engine agree on the shared golden vectors. | tests/parity/golden-vectors.test.ts, crates/ag47-core/tests/parity.rs |
| An explicit deny wins over every other rule. | crates/ag47-core/tests/properties.rs: explicit_deny_wins |
| Fail-open keeps deny, step-up and admin outcomes. | packages/engine/src/engine.test.ts: "fail-open keeps deny, step-up, and admin outcomes" |
Out of scope
- Judgment calls by a model. A model may propose; a deterministic checker accepts or rejects.
- Whether the request was a good idea. A decision applies a policy; it does not review it.
Evidence grade
Evidence grade
Rung 2 · Operational
- Covers
- Which rule decided this request and that the record was not changed after signing. Not whether the sender was an AI agent.
- Confidence
- None stated. No calibrated confidence applies to this record.
- Calibration
- Uncalibrated
- Known error rates
- None measured. Silvector publishes no detection error rate yet.
- Basis
- Deterministic decide() rule allow.default
- Ed25519 signature over the canonical receipt body, checked against the published JWKS
- Bias risks
- The decision is only as good as the facts it was given. A request with no signature claim is not_identified, which is not a finding that a person or an agent sent it.
- Next step
- To ask who was behind a series of requests, keep the receipts and escalate to rung 3 with at least two independent signal families. How escalation works
- Assigned by
- These docs, from the rung definitions. The grade is not a signed field of the receipt.