Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sdk-feature-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ The four shared preset names configure **different things per SDK**. Each cell i
| Semantic | Python | Rust | TypeScript |
| :--- | :--- | :--- | :--- |
| Preset TTL defaults | **None — entries never expire** unless `ttl=` is passed (through 0.19.0, PyPI wheel inspected 2026-09-24; fix in [cachekit-py#318](https://github.com/cachekit-io/cachekit-py/pull/318), cell flips to a version floor — with the client-L1 SWR row¹⁰ — when a PyPI release carries it) | 300 / 600 / 600 / 3 600 s (`intents.rs:78`, `:118`, `:165`, `:214`) | 300 / 600 / 600 / 3 600 s |
| `minimal`: L1 | **on** (SWR / invalidation off) | **off** (`no_l1()`, `intents.rs:79`) | **on** (SWR / invalidation off) |
| `minimal`: L1 | **on** (SWR / invalidation off) | **off** on 0.7.0 (`no_l1()`, `intents.rs:79`); **on** (SWR / invalidation off) from the first release containing the fix in [cachekit-rs#85](https://github.com/cachekit-io/cachekit-rs/pull/85) — unreleased as of 2026-09-23 | **on** (SWR / invalidation off) |
| `minimal`: integrity checksums | **off** (`integrity_checking=False`) | n/a — values carry no envelope | **on** (ByteStorage on by default) |
| `minimal`: reliability | circuit breaker / timeout off, backpressure on | **off** — the `reliability` layer is only attached by `production`/`encrypted`/`io` | circuit breaker neutered (∞ threshold), no retry, degradation off |
| Encrypted preset | `.secure(master_key=…)` — hex string, ≥64 hex chars; falls back to `CACHEKIT_MASTER_KEY` | `::encrypted(url, key: &[u8])` — **raw bytes, ≥32**; argument only, no env fallback | `.secure({ masterKey })` — hex; falls back to `CACHEKIT_MASTER_KEY` |
Expand Down
8 changes: 5 additions & 3 deletions spec/intent-presets.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,10 @@ its Rust twin by an unbounded margin.
**Rationale.** `minimal` means minimal *features*, not minimal *layers*. L1 is what turns
a hit into tens of nanoseconds instead of a network round trip, and the staleness it
introduces on `minimal` — no invalidation — is already bounded by the 300 s TTL the same
preset accepts. Rust's `.no_l1()` (`intents.rs:77`) makes `minimal` the only preset whose
every read crosses the network, which contradicts its own "speed-first" rustdoc. On
preset accepts. Rust 0.7.0's `.no_l1()` (`intents.rs:77`) makes `minimal` the only preset whose
every read crosses the network, contradicting its own "speed-first" rustdoc (fix in
[cachekit-rs#85](https://github.com/cachekit-io/cachekit-rs/pull/85), unreleased as of
2026-09-23). On
`secure`, ciphertext in L1 costs nothing in the zero-knowledge model (decryption happens
only at read time, on the client) and removes the incentive to trade security for speed.

Expand Down Expand Up @@ -409,7 +411,7 @@ rows were re-checked against the PyPI 0.19.0 wheel on 2026-09-24 (unchanged); th
| :--- | :--- | :--- | :--- |
| Finite default TTL 300 / 600 / 600 / 3 600 s | ❌ none — entries never expire (`wrapper.py:499`) — LAB-4641; fix in [cachekit-py#318](https://github.com/cachekit-io/cachekit-py/pull/318) | ✅ `intents.rs:76,117,167,217` | ✅ `intents-core.ts:220,242,265,297` |
| No process-wide default-TTL override (rule 3) | ❌ `CACHEKIT_DEFAULT_TTL` is offered — `settings.py:226`, env-settable and documented — even though nothing on the decorator path reads it; rule 3 forbids offering one — LAB-4641; fix in [cachekit-py#318](https://github.com/cachekit-io/cachekit-py/pull/318) | ❌ `from_env()` reads `CACHEKIT_DEFAULT_TTL` (`config.rs:165`), an override this specification no longer defines — LAB-4664 | ✅ |
| `minimal`: L1 on, SWR / invalidation off | ✅ `decorator.py:335-350` | ❌ `.no_l1()` (`intents.rs:77`) — LAB-4644 | ✅ `intents-core.ts:221-230` |
| `minimal`: L1 on, SWR / invalidation off | ✅ `decorator.py:335-350` | ❌ `.no_l1()` (`intents.rs:77`) on 0.7.0 — LAB-4644, fixed in [cachekit-rs#85](https://github.com/cachekit-io/cachekit-rs/pull/85) (unreleased as of 2026-09-23; flips ✅ when a release carries it) | ✅ `intents-core.ts:221-230` |
| `secure`: L1 on, ciphertext only | ❌ `@cache.secure(backend=None)` sets `_explicit_l1_only` (`decorators/intent.py:136`) → `ObjectCache`, which stores raw Python objects with no serializer in the path — encryption in cachekit-py is a serializer wrapper, so plaintext lands in L1 (`decorators/wrapper.py:659`) — LAB-4665 | ✅ `client.rs:656` | ✅ `cache-core.ts:654,831` |
| Reliability stack on for `production` / `secure` / `io` | ✅ | ✅ `ReliabilityConfig::default()` | ✅ `PRODUCTION_RELIABILITY` |
| `secure` takes a hex key and falls back to `CACHEKIT_MASTER_KEY` | ✅ ≥ 32 B (`validation.py:95`) | ❌ `encrypted(url, &[u8])` — raw bytes only, no env fallback, `len() >= 32` accepts more than exactly 32 B (`intents.rs:160-163`; `encryption.rs:101`) — LAB-4645, LAB-4663 | ✅ exactly 32 B (`constants.ts:138`) |
Expand Down
Loading