All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Version bump with packaging corrections
- pip install scyvera resolves to this release as latest stable
- T8 warning now correctly emitted via logging module (scyvera.enforcer logger) instead of warnings.warn
- T7 wildcard rejection enforced at JSON schema level in addition to Python load-time check — validate_contract() now catches wildcards independently of ContractEnforcer
ContractEnforcerclass: load, freeze, gate, audit, integrity verificationContractEnforcer.gate(action_name, action_type)decorator — default-deny enforcement of declared side_effects and permissionsContractEnforcer.verify_integrity()— SHA-256 check detects contract file replacement after load (T5)ContractEnforcer.get_audit_log()— returns deep-copy frozen AuditEntry list (T9)ContractVersionError— raised on schema version mismatch (T10)ContractTamperError— raised on frozen object mutation or disk file replacement (T5, T9)ApprovalPendingError— raised when action hits an approval_point; approval channel routing is caller's responsibility (stub, documented)assert_gated(fn)utility for integration test suites (T4)- T7: wildcard permissions rejected at schema level AND Python load time
- T8: irreversible side effect + empty approval_points emits logging.WARNING via scyvera.enforcer logger
- 59-test suite covering all threat models T1–T10
- ContractEnforcer.load / gate / get_audit_log / verify_integrity / assert_gated
- ContractViolationError, ContractTamperError, ApprovalPendingError, ContractVersionError, AuditEntry
- Cannot prevent gate bypass if integrator calls ungated function directly (T4 — known limitation)
- Cannot verify that gated function's internal behavior matches its declared permission string (T6 — known limitation)
- Integrity check protects AFTER load only, not before (T5)
lifecyclefield added to contract spec (optional, backward compatible)- v1.1 JSON schema at schemas/v1.1/contract.schema.json
- Default applied by loader when lifecycle absent: {mode: request-response, initiation: human-only, resumability: stateless}
- loader emits logging.WARNING when defaults are applied
irreversibleboolean field on side_effects entries- RFC 0002 (lifecycle field) added to rfcs/
- Three worked examples in spec: request-response, scheduled, persistent
- T1/T2/T3 threat mitigations documented
- All v1 contracts (no lifecycle field) remain valid
- No breaking changes to validate_contract() or CLI
- Canonical filename is now contract.yaml everywhere; contract.yml references removed
- Loader raises actionable error on contract.yml: "Found contract.yml — rename to contract.yaml"
- Backslash folder issue resolved (if it existed)
- Rename any contract.yml files to contract.yaml