Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
bf19c5e
fix: hash objects by __slots__/__dict__ state instead of memory address
jolovicdev Jun 21, 2026
932f15a
fix: track ResultRefs nested in custom-object attributes
jolovicdev Jun 21, 2026
e6f7a54
fix: hash referenced global dict/list/set consistently with scalars
jolovicdev Jun 21, 2026
6379475
fix: tolerate a locked database when bumping last_accessed_at
jolovicdev Jun 21, 2026
48ca44f
fix: do not fail eviction when post-eviction VACUUM is blocked
jolovicdev Jun 21, 2026
7b347c7
fix: prevent Redis tag index key collisions
jolovicdev Jun 21, 2026
15dc57a
fix: make Redis blob delete idempotent against a missing ref counter
jolovicdev Jun 21, 2026
a1fc110
fix: enforce server request size limit on the bytes actually received
jolovicdev Jun 21, 2026
e552656
fix: validate input and add error barriers to all server handlers
jolovicdev Jun 21, 2026
db5ff24
fix: report commits skipped during a lossy import
jolovicdev Jun 21, 2026
1a6bd67
fix: exit non-zero from CLI show/get when a commit is missing
jolovicdev Jun 21, 2026
7efffa9
fix: canonicalize function source with ast.unparse for cross-version …
jolovicdev Jun 21, 2026
4c3a8e6
perf: O(1) running-claim lookup in Redis via a per-fingerprint index
jolovicdev Jun 21, 2026
8c8f997
refactor: stop recomputing the DAG in sync submit_many
jolovicdev Jun 21, 2026
5035c1e
fix: cancel in-flight batch tasks when one fails
jolovicdev Jun 21, 2026
aad3609
chore: release 0.4.5
jolovicdev Jun 21, 2026
5c5512d
docs: rewrite README for clarity and concision
jolovicdev Jun 21, 2026
582d7fe
fix: reject unauthenticated requests before buffering the request body
jolovicdev Jun 21, 2026
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
57 changes: 57 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,62 @@
# Changelog

## 0.4.5 - 21.6.2026.

### Fixed
- Hash objects by their `__slots__`/`__dict__` state instead of the memory
address. Slotted value types (including `@dataclass(slots=True)`) cached by
identity before, so identical calls missed the cache every run and lossy
custom reprs could collide. Truly opaque objects now warn instead of silently
address-hashing.
- Record `ResultRef` values nested inside custom-object attributes in commit
lineage, matching what the hasher already accounts for, so garbage collection
cannot evict a blob a commit still depends on.
- Hash referenced module-global `dict`/`list`/`set` values consistently with
scalars, so config-style globals invalidate the cache when they change.
- Canonicalize function source with `ast.unparse` instead of `ast.dump`, which
keeps the same comment/whitespace/docstring insensitivity but stays stable
across Python versions whose `ast.dump` field set differs.
- Treat the `last_accessed_at` bump on a cache hit as best-effort so a locked
database no longer turns a successful lookup into an error.
- Skip a post-eviction `VACUUM` that is blocked by a concurrent writer instead
of failing an eviction whose deletes already committed.
- Prevent Redis tag index key collisions: presence and value indexes now use
distinct prefixes and the value key length-prefixes the tag key, so a `:` in
a key or value can no longer cross-match unrelated commits.
- Make the Redis blob delete script idempotent against a missing reference
counter so it cannot drop a blob another commit still references.
- Enforce the HTTP server request size limit on the bytes actually received,
closing a bypass for chunked requests that omit `Content-Length`. On
token-protected servers, unauthenticated requests are now rejected before any
body is buffered.
- Validate handler input (returning 400) and wrap every server handler in a
generic 500 barrier so malformed input and internal errors no longer leak
stack traces; `/gc` also accepts an empty body and falls back to defaults.
- Report commits skipped during a lossy import. A truncated archive no longer
looks like a clean import.
- Exit non-zero from `cashet show` and `cashet get` when a commit is missing,
matching `cashet rm`.
- Cancel in-flight sibling tasks when a parallel `submit_many` task fails,
instead of leaving them running after the error is surfaced.

### Performance
- Redis `find_running_by_fingerprint` uses a per-fingerprint running-claim index
for O(1) lookup instead of scanning a fingerprint's full commit history on
every submit.

### Changed
- `import_archive` (sync and async) now returns an `ImportResult(imported,
skipped)` named tuple instead of a bare imported count.
- Sync `submit_many` no longer recomputes the dependency graph that the async
client already builds.

### Notes
- The hashing fixes change function and argument cache keys, so results cached
by earlier versions recompute on first access. Blobs are content-addressed and
remain until garbage collected.
- The Redis tag index key scheme changed. Tag indexes written by older versions
are not migrated; rewrite affected commits to rebuild them.

## 0.4.4 — 11.5.2026.

### Fixed
Expand Down
Loading
Loading