192 lines
4.9 KiB
Markdown
192 lines
4.9 KiB
Markdown
# Budget Threshold Attestation
|
|
|
|
This document describes how unknown budget thresholds are attested in verdict bundles for reproducibility and audit purposes.
|
|
|
|
## Overview
|
|
|
|
Budget attestation captures the budget configuration applied during policy evaluation, enabling:
|
|
|
|
- **Auditability**: Verify what thresholds were enforced at decision time
|
|
- **Reproducibility**: Include all inputs for deterministic verification
|
|
- **Compliance**: Demonstrate policy enforcement for regulatory requirements
|
|
|
|
## Budget Check Predicate
|
|
|
|
The budget check is included in the verdict predicate:
|
|
|
|
```json
|
|
{
|
|
"_type": "https://stellaops.dev/predicates/policy-verdict@v1",
|
|
"tenantId": "tenant-1",
|
|
"policyId": "default-policy",
|
|
"policyVersion": 1,
|
|
"verdict": { ... },
|
|
"budgetCheck": {
|
|
"environment": "production",
|
|
"config": {
|
|
"maxUnknownCount": 10,
|
|
"maxCumulativeUncertainty": 2.5,
|
|
"action": "warn",
|
|
"reasonLimits": {
|
|
"Reachability": 5,
|
|
"Identity": 3
|
|
}
|
|
},
|
|
"actualCounts": {
|
|
"total": 3,
|
|
"cumulativeUncertainty": 1.2,
|
|
"byReason": {
|
|
"Reachability": 2,
|
|
"Identity": 1
|
|
}
|
|
},
|
|
"result": "pass",
|
|
"configHash": "sha256:abc123...",
|
|
"evaluatedAt": "2025-12-25T12:00:00Z",
|
|
"violations": []
|
|
}
|
|
}
|
|
```
|
|
|
|
## Fields
|
|
|
|
### budgetCheck.config
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `maxUnknownCount` | int | Maximum total unknowns allowed |
|
|
| `maxCumulativeUncertainty` | double | Maximum uncertainty score |
|
|
| `action` | string | Action when exceeded: warn, block |
|
|
| `reasonLimits` | object | Per-reason code limits |
|
|
|
|
### budgetCheck.actualCounts
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `total` | int | Total unknowns observed |
|
|
| `cumulativeUncertainty` | double | Sum of uncertainty factors |
|
|
| `byReason` | object | Breakdown by reason code |
|
|
|
|
### budgetCheck.result
|
|
|
|
Possible values:
|
|
- `pass` - All limits satisfied
|
|
- `warn` - Limits exceeded but action is warn
|
|
- `fail` - Limits exceeded and action is block
|
|
|
|
### budgetCheck.configHash
|
|
|
|
SHA-256 hash of the budget configuration for determinism verification. Format: `sha256:{64 hex characters}`
|
|
|
|
### budgetCheck.violations
|
|
|
|
List of violations when limits are exceeded:
|
|
|
|
```json
|
|
{
|
|
"violations": [
|
|
{
|
|
"type": "total",
|
|
"limit": 10,
|
|
"actual": 15
|
|
},
|
|
{
|
|
"type": "reason",
|
|
"limit": 5,
|
|
"actual": 8,
|
|
"reason": "Reachability"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Extracting Budget Check from Verdict
|
|
|
|
```csharp
|
|
using StellaOps.Policy.Engine.Attestation;
|
|
|
|
// Parse verdict predicate from DSSE envelope
|
|
var predicate = VerdictPredicate.Parse(dssePayload);
|
|
|
|
// Access budget check
|
|
if (predicate.BudgetCheck is not null)
|
|
{
|
|
var check = predicate.BudgetCheck;
|
|
Console.WriteLine($"Environment: {check.Environment}");
|
|
Console.WriteLine($"Result: {check.Result}");
|
|
Console.WriteLine($"Total: {check.ActualCounts.Total}/{check.Config.MaxUnknownCount}");
|
|
Console.WriteLine($"Config Hash: {check.ConfigHash}");
|
|
}
|
|
```
|
|
|
|
### Verifying Configuration Hash
|
|
|
|
```csharp
|
|
// Compute expected hash from current configuration
|
|
var currentConfig = new VerdictBudgetConfig(
|
|
maxUnknownCount: 10,
|
|
maxCumulativeUncertainty: 2.5,
|
|
action: "warn");
|
|
|
|
var expectedHash = VerdictBudgetCheck.ComputeConfigHash(currentConfig);
|
|
|
|
// Compare with attested hash
|
|
if (predicate.BudgetCheck?.ConfigHash != expectedHash)
|
|
{
|
|
Console.WriteLine("Warning: Budget configuration has changed since attestation");
|
|
}
|
|
```
|
|
|
|
## Determinism
|
|
|
|
The config hash ensures reproducibility:
|
|
|
|
1. Configuration is serialized to JSON with canonical ordering
|
|
2. SHA-256 is computed over the UTF-8 bytes
|
|
3. Hash is prefixed with `sha256:` algorithm identifier
|
|
|
|
This allows verification that the same budget configuration was used across runs.
|
|
|
|
## Integration Points
|
|
|
|
### VerdictPredicateBuilder
|
|
|
|
Budget check is added when building verdict predicates:
|
|
|
|
```csharp
|
|
var budgetCheck = new VerdictBudgetCheck(
|
|
environment: context.Environment,
|
|
config: config,
|
|
actualCounts: counts,
|
|
result: budgetResult.Passed ? "pass" : budgetResult.Budget.Action.ToString(),
|
|
configHash: VerdictBudgetCheck.ComputeConfigHash(config),
|
|
evaluatedAt: DateTimeOffset.UtcNow,
|
|
violations: violations);
|
|
|
|
var predicate = new VerdictPredicate(
|
|
tenantId: trace.TenantId,
|
|
policyId: trace.PolicyId,
|
|
// ... other fields
|
|
budgetCheck: budgetCheck);
|
|
```
|
|
|
|
### UnknownBudgetService
|
|
|
|
The enhanced `BudgetCheckResult` includes all data needed for attestation:
|
|
|
|
```csharp
|
|
var result = await budgetService.CheckBudget(environment, unknowns);
|
|
|
|
// result.Budget - the configuration applied
|
|
// result.CountsByReason - breakdown for attestation
|
|
// result.CumulativeUncertainty - total uncertainty score
|
|
```
|
|
|
|
## Related Documentation
|
|
|
|
- [Unknown Budget Gates](./unknowns-budget-gates.md)
|
|
- [Verdict Attestations](../attestor/verdict-format.md)
|
|
- [BudgetCheckPredicate Model](../../api/attestor/budget-check-predicate.md)
|