v0.14.0 - Durable evidence, deterministic authorization, and a separate execution boundary
LatestOpt-in durable evidence and versioned state, pure recovery with explicit audit closure, copy-on-write migrations, deterministic authorization, and a separate execution boundary. SETT restores what durable evidence can support and never resumes interrupted work automatically.
✨ Added
sett.persistence:EvidenceStreamandStateRecordStorekeep append-only evidence separate from random-access state, bound byPersistenceBackend- Versioned binary formats for trace preimages, stream positions, stage-state envelopes, private-memory mutations, and migration manifests
- Durable trace evidence preserves the exact preimage used for each entry hash; recovery never reproduces a historical hash by reserialization
IntegrityPolicy,Sha256IntegrityPolicyandNoDigestPolicy; SHA-256 is documented as change detection, not authentication- In-memory reference implementations and a SQLite backend with transactional compare-and-append and idempotent state writes
- SQLite durability declarations come from effective pragma readback rather than requested settings
TraceRecorder.restore()for pure recovery andTraceRecorder.resume()for explicit continuationRecoveryReportseparates chain integrity, trace completeness, reconstructed outcome, unresolved boundaries, stage descriptors, and the last durable position- Durable stage-output persistence for
run_pipeline_controlled(), with materialization as a separate explicit operation - Opt-in
PrivateMemorypersistence through a stablememory_id; ordinary ephemeral memory is unchanged AuditClosureas an axis independent fromExecutionStatus, withAuditGapPolicyandSETTAuditClosureError- Append-only boundary dispositions with typed evidentiary bases
sett.authorization_ruler: closedGRANT/REQUIRE_APPROVAL/DENYvocabulary, detached requests with explicit field provenance, and store-backed receiptsReceiptUsedeclared per policy decision; replay requires unanimous policy consent plus a controlled request with an idempotency key- Versioned strict JSON authorization fingerprint with NFC text, signed-zero and integral-float normalization, and exact IEEE-754 hexadecimal for other floats
AuthorizationRequestResolverand optional paired executor configuration; once enabled, authorization is mandatory for every handlersett.execution_rulerowns the effect boundary that verifies authorization receiptsdocs/foreign_callers.md: the stable contract for governing an external tool loop with no dependency in either directionexamples/foreign_tool_loop.pyandexamples/governance_card.py, plus reusable adapter and phrasing-expert templates
🔄 Changed
SETTOrchestratoraccepts an optional backend and explicit persistence policy; durable execution is limited torun_pipeline_controlled()SETTAgentaccepts an optionalprivate_memory_id; omitting it preserves ephemeral behaviorExecutionResultcarriesaudit_closure, defaulting toNOT_REQUESTED- Trace event vocabulary and frame size are bounded before a lifecycle boundary can open, and only when persistence is enabled
- The documented concurrency roster now contains ten narrow guarantees
🐛 Fixed
- A durable terminal whose metadata is rejected records a framework-owned contingency terminal, so invalid terminal metadata cannot leave an already opened boundary unverifiable
- Distribution metadata now uses the PEP 639 SPDX form, declares
LICENSEthroughlicense-files, and no longer uses the deprecated license table or license classifier - The release builder now rejects unsafe destinations and option-like artifacts, handles command-line help safely, and fixes cross-platform ZIP entry metadata
- Corrected Convention #21 to record that v0.13.2 was subsequently published, without changing the rationale for its Pocket TTS exception
- Corrected stale Convention #9:
human_at_riskis an urgency and audit signal that can conservatively promoteALLOWtoWARN; it does not override the harm score - Completed the source-installation correction begun in v0.13.2 across adapter docs, runtime dependency errors, API examples, and test documentation
- Corrected
result_digest()documentation that described an unkeyed digest as unable to reveal its input - Corrected the public ethics description: numeric harm scoring comes from
ContextAnalyzer, not fromHarmCategoryweights or the rules list SQLitePersistenceBackend.open()now returns an object accepted directly bySETTOrchestratorverify()now documents that an interrupted run also returnsFalse, and points toRecoveryReportto distinguish interruption from corruption
🛡️ Audit remediation
- M-01: SQLite infrastructure errors are normalized without flattening the domain failures they must not hide
- M-02: world-readable SQLite files are documented rather than silently assumed safe
- M-03: an automated matrix now covers every declared Python version
- L-01:
SETTAdapterError.__str__()no longer carries provider-supplied text - L-02: template distribution corrected
🧹 Maintenance
CONTRIBUTING.mdfixes the lint gate to the Ruff version pinned inpyproject.toml- Convention #23 enumerates all eight structural pillars and records when the
Rulersuffix may name a class - Release archives use fixed cross-platform entry metadata and are byte-reproducible for identical source bytes under a matching Python/zlib toolchain
✅ Compatibility
- Persistence and authorization are opt-in and add no mandatory dependency; SQLite uses the standard library
- No v0.13.2 public symbol was removed or renamed
sett.SETTExecutorandsett.core_ruler.executorcontinue to resolve after the executor moved tosett.execution_ruler- Supported Python versions are 3.11, 3.12, 3.13 and 3.14;
requires-pythonis now>=3.11, correcting a v0.13.2 claim that never worked SETTAdapterError.__str__()drops provider text; structured attributes,safe_view(), reason codes and__cause__are unchanged. Code that asserted on provider wording inside a message must read__cause__- 1,255 tests pass, comprising the 1,038-test v0.13.2 baseline plus 217 new tests
- Automatic pipeline resumption, retention, compaction, cross-namespace migration, import, and production secret storage remain outside this release
⚠️ Architectural decision
Two structural pillars enter the framework. Authorization is promoted first and execution derives from it, so the dependency direction points away from the kernel. sett.core_ruler keeps its kernel contracts; its historical executor module is a compatibility reexport, and those kernel contracts have no runtime dependency on Authorization.
💖 Sponsors
Sponsors:
Eight tiers from a symbolic $1 up to logo placement on 4humanityAI.com
With explicit limits on what sponsorship does and does not buy.
See the complete itemized history in CHANGELOG.md.