Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: chrisguidry/docket
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.17.7
Choose a base ref
...
head repository: chrisguidry/docket
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.17.8
Choose a head ref
  • 6 commits
  • 31 files changed
  • 2 contributors

Commits on Feb 14, 2026

  1. Clear known from runs hash on cancel so add() can reschedule (#336)

    When a scheduled task gets cancelled via `docket.cancel()`, the cancel
    Lua
    script removes it from the stream/queue but leaves the `known` field in
    the
    runs hash. Later, when `_schedule_all_automatic_perpetual_tasks` (or any
    `docket.add()`) tries to reschedule the same key, the schedule script
    sees
    `known` and returns EXISTS. The task stays silently unscheduled until
    `execution_ttl` expires (default 15 min).
    
    The fix adds an `HDEL runs_key 'known' 'stream_id'` to the cancel
    script,
    clearing the dedup markers while keeping `state=cancelled` and
    `completed_at`
    for observability. The schedule script's existing fallback (`state ==
    'running'`
    → EXISTS) already handles cancelled tasks correctly once `known` is
    gone.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 14, 2026
    Configuration menu
    Copy the full SHA
    61bc093 View commit details
    Browse the repository at this point in the history
  2. Handle AlreadyExists race in cluster image build (#337)

    `build_cluster_image` does a check-then-build that can race when
    parallel
    test sessions try to build the same image. The `images.get()` check
    passes
    for both, then one build succeeds and the other gets a `BuildError` with
    `AlreadyExists`. This showed up as every test failing in a CI cluster
    job:
    
    
    https://github.com/chrisguidry/docket/actions/runs/22020705636/job/63639829973
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 14, 2026
    Configuration menu
    Copy the full SHA
    aace0e1 View commit details
    Browse the repository at this point in the history

Commits on Feb 15, 2026

  1. Serialize cluster image builds and split CLI tests into separate CI j…

    …ob (#338)
    
    Two changes to improve CI reliability:
    
    **Serialize cluster image builds with file lock**
    
    The `AlreadyExists` fix in #337 handled one symptom of parallel xdist
    workers racing to build the same cluster image, but there's a second
    failure mode showing up in CI:
    
    
    https://github.com/chrisguidry/docket/actions/runs/22025132964/job/63640478732
    
    When concurrent builds target the same tag, the Docker SDK's `build()`
    completes successfully in the daemon, then tries to inspect the
    resulting image by its short ID. If another worker's build re-tagged the
    image in the meantime, the first image ID gets orphaned and the inspect
    404s. This knocked out 485 of 686 tests in the cluster job.
    
    Rather than catching yet another exception type, this serializes the
    builds with `fcntl.flock` so only one worker builds at a time. The
    others wait and find it already built. Eliminates both the
    `AlreadyExists` and `ImageNotFound` races structurally.
    
    **Split CLI tests into separate CI job**
    
    Cluster CI jobs consistently run right at the 4-minute timeout, and when
    any test runs slightly slow the whole job gets cancelled. This has been
    showing up in roughly a third of recent CI runs:
    
    
    https://github.com/chrisguidry/docket/actions/runs/22025359927/job/63641245074
    
    The 91 CLI tests are subprocess-based and don't exercise
    backend-specific behavior — they spawn `python -m docket ...` processes
    and check output. Running them against every Python x Backend
    combination (30 matrix entries) is wasted effort.
    
    This moves CLI tests to their own job that varies by Python version but
    uses a single Redis backend (8.0). The main test matrix now passes
    `--ignore=tests/cli` so cluster/valkey/memory jobs only run the tests
    that actually care about the backend. Local `pytest` runs are
    unaffected.
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 15, 2026
    Configuration menu
    Copy the full SHA
    f410dfb View commit details
    Browse the repository at this point in the history

Commits on Feb 17, 2026

  1. Fix high CPU on Windows memory:// backend and add Windows CI (#340)

    Docket's worker loops rely on Redis blocking behavior that fakeredis
    doesn't implement — `get_message()` and `xread()` return immediately
    instead of blocking, turning the loops into CPU spinners. The
    `xreadgroup` loop already had a workaround; this applies the same
    pattern to the cancellation listener and strike monitor.
    
    Also fixes a few things that prevent running on Windows at all: signal
    handler registration (raises `NotImplementedError` on Windows instead
    of working), `fcntl` import (doesn't exist on Windows — swapped for
    cross-platform locking with `msvcrt`), and Docker SDK imports in
    conftest that fail when Docker isn't installed.
    
    Adds a Windows CI job (memory:// only, 3 Python versions) and a
    regression test that directly measures idle CPU usage.
    
    Closes #339
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 17, 2026
    Configuration menu
    Copy the full SHA
    1191537 View commit details
    Browse the repository at this point in the history
  2. Support redis-py 7.2.0 and bump CI to Redis 8.6 (#342)

    redis-py 7.2.0 deprecated `lib_name`/`lib_version` on
    `Connection.__init__`
    in favor of `DriverInfo`, but their own `RedisCluster` still passes
    `lib_name="redis-py"` internally, which triggers a `DeprecationWarning`.
    Our `filterwarnings = ["error"]` promotes that to an exception, breaking
    cluster tests. We pinned `<7.2` in #340 as a stopgap.
    
    This adds a targeted warning filter for that specific deprecation so we
    can run with redis-py 7.2.0 unpinned. Also bumps the Redis version in CI
    from 8.0 to 8.6 to track the latest release.
    
    Closes #341
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 17, 2026
    Configuration menu
    Copy the full SHA
    5969e1e View commit details
    Browse the repository at this point in the history
  3. Migrate docs from mkdocs-material to Zensical (#343)

    mkdocs-material has entered maintenance mode in favor of Zensical, which
    is built by the same team and reads mkdocs.yml directly. This swaps the
    docs dependencies and build command accordingly.
    
    Also removes a stale top-level sitecustomize.py that snuck in with #170,
    adds site/ to .gitignore, and updates the README with current
    Redis/Valkey test versions and a note on working with docs locally.
    
    Closes #273
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    chrisguidry and claude authored Feb 17, 2026
    Configuration menu
    Copy the full SHA
    a63b5f3 View commit details
    Browse the repository at this point in the history
Loading