SilvectorDocs
Silvector docsConceptsUpdated 2026-11-07

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

InvariantChecked 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.