• v1.7.0 6214780244

    feat: provider-result caching with time expiry + DSL fact-level TTL
    CI / publish (push) Successful in 9s
    CI / test (push) Successful in 18s

    Dvorak released this 2026-08-03 21:32:15 +00:00 | 8 commits to master since this release

    Automatically-retrieved facts (balances, sessions, etc.) are now cached with
    a time expiry so repeated checks don't re-invoke the underlying data store.

    • check(): registered providers cache their normalized edges per
      (relation, subject, object) with a TTL; a fresh entry is reused without
      re-invoking the provider. Per-check factProviders are one-off observations
      and stay cache-transparent (no read, no write).
    • TTL resolution: DSL-declared 'BEHAVES { ttl }' on a fact >
      setFactTTL(relation, ms) > policy.providerCacheTTL (default 30s; 0 disables).
    • Grammar: facts may now declare a freshness window via
      'fact balance(user, amount) BEHAVES { ttl 1h }' (previously BEHAVES only
      accepted 'AS edge|transitive|hierarchical|symmetrical_graph'). The runtime
      indexes it as the fact's ttlMs.
    • registerFact/unregisterFact, graph mutations (add/update/remove node or
      relation), and invalidateProviderCache(relation?) keep the cache consistent.
    • Injectable clock (default wall clock) drives cache freshness, mirroring the
      core's unpinned-clock contract.

    Tests: DSLRuntimeCache (reuse within TTL, expiry re-invoke, per-check
    override transparency, registerFact invalidation, mutation invalidation,
    per-relation/all invalidation, policy default, DSL-declared 1h TTL).

    Downloads