procurement-policy-check · git:20261023.420f372 · 2026-10-23 · sha256 838a8fffdfa8d622
procurement-policy-check git:20261023.420f372A
Immutable. This exact content never changes and is served at /api/v1/blob/838a8fffdfa8d622.
--- name: procurement-policy-check description: Decide whether one proposed procurement request is allowed under an explicit procurement policy before any spend flow starts, refusing budget overages and unapproved payees instead of guessing. --- # Procurement Policy Check Procurement Policy Check is the pre-spend decision gate. It answers one question, is this procurement request allowed under the supplied procurement policy, and it answers it deterministically. It never moves money; `pay` and the payment rails own execution, and this skill's sealed decision is what a caller carries into that flow. ## Procedure 1. Native `data.digest` binds the exact procurement request and procurement policy before any judgment. 2. Deterministic rules apply in order: the payee must be in `approved_payees`, the request currency must match the policy currency, and the amount must fit both `remaining_budget` and `request_cap`. The first failed rule refuses with a named `refused_reason`. 3. An in-policy amount that reaches `approval_threshold` returns `needs_human` with the policy's `human_lane` (default `procurement-review`); approval below the threshold is `approved`. 4. A policy missing any required authority field refuses with `missing_policy_authority` and findings; nothing is inferred or invented. `spend_executed` is always false. The decision packet carries both input digests so a downstream spend can prove which request and policy were decided. ## Output `procurement_approval` (`runx/procurement-policy-check.approval.v1`) carries `decision` (`approved`, `refused`, `needs_human`), `reason`, `payee`, `amount`, `currency`, `ceiling_amount`, `human_lane`, `refused_reason`, `policy_ids`, `validation`, and the two digests. Inputs are `procurement_request` and `procurement_policy`.