Skip to content

v1.4.11

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Oct 23:51

Release Notes v1.4.11

Released: 2026-10-27

This patch release lands a new CLI path for importing memory files that Claude Code and Codex already keep on disk, hardens backup archive integrity and concurrent free-space accounting, and closes a batch of security advisories that blocked the cut. Team scope is now documented as a production scope, with a retirement path for legacy shared captures.

Highlights

sibyl ingest memories

New subcommand that imports the memory files Claude Code and Codex maintain locally, instead of requiring full transcript ingestion. It reads ~/.claude/projects/*/memory/*.md (plus the project mapping in ~/.claude.json) and ~/.codex/memories/rollout_summaries/*.md with ~/.codex/memories/memory_summary.md, converting each file into one raw memory with agent:{name} tags and agent_memory metadata. Flags: --from claude-code|codex (repeatable), --share, --dry-run, --yes/-y, --claude-dir, --codex-dir, --json/-j.

Safe re-runs by design

Each file maps to a stable source ID (agent-memory:{owner_hash}:{agent}:{file_key}:{project_id_or_unlinked}) backed by capture-mode idempotency keys, so repeated imports contend for the same record rather than duplicating. The planner reports per-file outcomes (created, updated, unchanged, relinked, kept, failed) and --dry-run previews them without writing. Memories are private by default; --share only widens visibility for memories from linked repositories, and personal profile memories always stay private.

Truncated backup archives no longer adopted silently

The restore loader stopped at the tar end marker and never validated the gzip trailer, so a truncated or corrupted archive tail could pass as valid when adopting an archive from an earlier failed backup. _verify_published_archive() now decompresses the full gzip stream in 1 MiB chunks before the digest comparison, forcing CRC and length validation. Failures raise ArchiveConflict and leave the damaged archive in place.

Concurrent backups share free-space claims

Directory-backed archive stores now write a .reserve-<backup_id> claim file before the space check and read peers' claims when computing headroom, so two backups starting at once can no longer both commit to the same free bytes. Claims track staged versus reserved bytes to avoid double-counting, age out after 24 hours, and are read with O_NOFOLLOW | O_NONBLOCK and a 4 KB cap. Out-of-space errors now report how much other running backups hold.

Recoverable archive apply progress

read_archive_apply_progress() recovers the winning phase token from the saved plan and native history when an apply commits but the acknowledgement is lost. It returns a frozen CheckedArchiveApplyProgress with one of not_required, missing, missing_initialized, committed, closed, or unavailable, validating organization and run membership, binding hashes, plan counts, and physical identity uniqueness before handing back a token. Later edits to target entities do not erase historical completion. The reader is read-only and internal; the apply/resume coordinator is follow-up work.

Backups and Migration

  • Archive download responses now return 206 Partial Content only when the store actually served the requested byte range, and 200 when the Range header was ignored. Previously 206 was returned regardless.
  • store.reserve() returns a Reservation object with a two-phase track(staging_dir) / require(additional_bytes) / release() lifecycle, so staging bytes are accounted separately from outstanding claims.
  • Gzip validation runs before digest comparison because corruption presents identically across store types, while SHA256 checks only apply to S3.
  • archive_phase_store.py gained ArchivePhaseCounts reconciliation plus _progress_binding_matches and _progress_receipt helpers, covered by new cases in tests/test_archive_phase_store.py.

Memory Scopes

  • docs/users/sharing-memory.md now lists team as a production scope for knowledge a team shares across its projects, with the scope key documented as the team's UUID.
  • The shared scope is marked retired: Sibyl refuses new writes and recall does not return shared captures. A new "Legacy Shared Captures" section documents sibyld migrate retire-shared, which moves captures to team scope when the scope key is a team UUID and the author is a team member or org admin, and writes tombstones otherwise. Preview and apply modes, conflict handling, and rerun behavior are described.
  • Examples in docs/cli/context.md and docs/guide/synthesis.md were corrected to pass a team UUID to --scope-key instead of a slug such as platform or proj_auth.

Web

  • The header no longer flashes "Sign in" while /auth/me is still in flight. UserMenu reads isLoading from useMe() and renders a pulsing avatar placeholder with role="status" and aria-label="Loading account" until the request settles. New user-menu.test.tsx covers the loading, signed-out, and signed-in states.

Security and Dependencies

Two rounds of advisory closures were needed for this cut; image scans initially failed on seven HIGH/CRITICAL advisories published after the dry run.

  • certifi to 2026.10.19 (compromised emSign roots in earlier bundles)
  • pillow to 13.0.0 (19 CVEs)
  • aiohttp to 3.14.5 with a workspace floor of >=3.14.4 (three denial-of-service advisories)
  • authlib pinned to >=1.9.1,<1.10 in apps/api (signature verification bypass and two authentication bypasses in 1.7.2); usage is limited to the Starlette OIDC client
  • New workspace floors: brotli>=1.2.1, dnspython>=2.9.0, filelock>=4.2.1 (resolves to 4.2.4), nltk>=3.10.4
  • uvicorn[standard]>=0.54.0, pyjwt[crypto]>=2.15.1, prettier ^3.9.10, and astral-sh/setup-uv to v10.3.0 in homebrew-formula.yml and publish.yml

Developer Experience

  • ty moved to 0.0.86. Typeshed now deprecates contextmanager and asynccontextmanager functions that return Iterator, so 36 context managers across 27 files were updated to Generator or AsyncGenerator. Stricter dict-unpacking validation against function parameters fixed seven call sites.
  • ruff 0.17 sorts tomllib as standard library and flagged four async timeout hits in inventory lint.
  • pydantic 2.14 tightened __init__ typing; the archive history reader now validates credentials explicitly.

Upgrade Notes

  • Charts and the Ansible collection move to 1.4.11 (charts/sibyl version and appVersion, charts/surrealdb version; the SurrealDB appVersion stays at 3.2.4). Update pinned image tags, for example --tag 1.4.11.
  • Operators still holding shared-scope captures must run sibyld migrate retire-shared to move them to team scope; until then those captures are not returned by recall.
  • Backups adopted from previously interrupted runs may now fail fast with ArchiveConflict if their gzip tail is truncated. This surfaces corruption that was previously undetected; rerun the backup rather than reusing the damaged archive.
  • On shared backup volumes, simultaneous backups can now be refused with an insufficient-space error that names the bytes held by peers. Retry once the concurrent run completes.
  • Scripts passing a slug to --scope-key for team scope need the team UUID instead.
  • First run of sibyl ingest memories is worth previewing with --dry-run; add --share only if memories from linked repositories should be visible to their project.

Install

Local server

curl -fsSL https://raw.githubusercontent.com/hyperb1iss/sibyl/main/install.sh | sh -s -- --version 1.4.11

Remote CLI

curl -fsSL https://raw.githubusercontent.com/hyperb1iss/sibyl/main/install.sh | sh -s -- --remote --version 1.4.11
sibyl init --remote https://sibyl.example.com
sibyl auth login

Homebrew

brew install hyperb1iss/tap/sibyl
sibyl up

Arch Linux (AUR)

paru -S sibyl
sibyl up

Headless server

curl -fsSL https://raw.githubusercontent.com/hyperb1iss/sibyl/main/install.sh | sh -s -- --version 1.4.11 --no-open

Kubernetes (Helm)

helm repo add sibyl https://raw.githubusercontent.com/hyperb1iss/sibyl/gh-pages
helm repo update sibyl
helm upgrade --install sibyl sibyl/sibyl --version 1.4.11

Artifacts

This release includes Python wheels and sdists, the generated
Homebrew formula, the generated AUR PKGBUILD, Helm charts, Docker
SBOMs, aggregate dual-registry cosign receipts, and a SHA256 checksum
manifest.