Changes for version 0.300 - 2026-05-27

  • Docker: bundle libgit2 (Alien::Libgit2 share build) so the runtime image is self-contained. Builder installs cmake/pkg-config/zlib/ libssh2 dev headers and sets ALIEN_INSTALL_TYPE=share; runtime-base installs libssl3/libssh2-1/zlib1g (the shared libs the vendored libgit2.so links against). Needed since Git::Native moved to Git::Libgit2 (libgit2 FFI).
  • Add .github/workflows/ci.yml (perl 5.36/5.38/5.40) using the [@Author::GETTY] dzil-test composite action; installs libgit2-dev so Alien::Libgit2 links the system libgit2 (>= 1.5) in CI.
  • Git.pm: read git config (user.name/email) and validate helper ref names through Git::Native (Config + reference_name_is_valid) instead of poking Git::Libgit2::FFI directly. New Git.pm `ref_oids` helper.
  • karr-foundation: detect board changes via Git::Native instead of shelling out to `git for-each-ref` — no git binary needed for that path anymore. Sync (`--pull`) and open-task detection now run in-process via App::karr::Git/BoardStore instead of forking the `karr` CLI.
  • karr-foundation: drain each board instead of a single run — invoke the agent command repeatedly until no actionable task (non-terminal and unblocked) remains. A task the agent claims but never moves is auto-blocked after `max_attempts` stalls (default 2) so the drain always terminates; the agent's own `--block` reason still wins. Observable common errors (non-zero/timeout exit, or a log match against rate-limit/auth/network/5xx patterns, extensible via `error_patterns`) never penalize a task and instead trigger an exponential per-repo cooldown (1, 2, 4, … minutes, capped). New `.karr` keys: `drain`, `max_attempts`, `max_iterations`, `cooldown_base`, `cooldown_max`, `error_patterns`.
  • cpanfile: require Git::Native 0.003 and Git::Libgit2 0.004.
  • Fix `karr context` / `karr context --json` crashing with "Can't locate object method 'strftime' via package 'Sun May ...'": Cmd::Context now `use Time::Piece`, so `gmtime` returns a Time::Piece object instead of a plain string. Added t/07-context.t covering the plain, --json, and recently-completed cutoff paths.
  • Fix `karr config show` (and get/set) crashing with "Can't locate object method 'board_dir'": Cmd::Config now builds its config via `$self->store->effective_config` and persists with `$self->store->save_config`, instead of calling the non-existent `board_dir` on itself. Added t/06-config-cmd.t.
  • Drop hard-coded `tags = latest` / `tags = user` in the Docker subsections so the new `[@Author::GETTY::Docker]` default (`latest %V %v`) applies. `runtime-user` keeps a `-user` suffix on each tag.
  • Add `karr-foundation` binary and `App::karr::Foundation` module: single-shot daemon for periodic agent execution across multiple karr boards. Reads `~/.config/karr-foundation/config.yml` (dirs: / scan:), checks each repo for board changes or open tasks, and invokes the per-repo `.karr` command. Supports `--force`, `--dry-run`, `--verbose`. Per-repo state in `.karr.state` / `.karr.lock` / `.karr.log` (gitignored).

Documentation

Kanban Assignment & Responsibility Registry
Single-shot foundation daemon for periodic karr agent execution

Modules

Kanban Assignment & Responsibility Registry
Activity log writer for karr board operations
Ref-backed board storage for karr
Generate a random two-word agent name
Archive a task (soft-delete)
Export the ref-backed karr board as YAML
Show board summary
View or modify board configuration
Generate board context summary for embedding
Create a new task
Delete a task
Destroy the ref-backed karr board
Modify an existing task
Fetch helper payloads from a Git ref
Hand off a task for review
Initialize a new karr board
List tasks with filtering and sorting
Show activity log
Change a task's status
Atomically find and claim the next available task
Restore the ref-backed karr board from YAML
Store helper payloads in a Git ref
Show full details of a task
Install, check, and update bundled agent skills
Sync karr board with remote
Board configuration management
Single-shot foundation daemon — periodic agent execution across karr boards
Git operations for karr sync (all-native via Git::Native + libgit2)
Lock management via Git refs
Role providing board discovery, sync lifecycle, and task access
Role providing minimal board discovery and config access
Shared claim timeout logic
Role providing common output format options
Role providing sync lifecycle with retry and guard insurance
Push guard with automatic retry on scope exit
Task object representing a single kanban card