Repository navigation
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 aReservationobject with a two-phasetrack(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.pygainedArchivePhaseCountsreconciliation plus_progress_binding_matchesand_progress_receipthelpers, covered by new cases intests/test_archive_phase_store.py.
Memory Scopes
docs/users/sharing-memory.mdnow 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
sharedscope is marked retired: Sibyl refuses new writes and recall does not return shared captures. A new "Legacy Shared Captures" section documentssibyld 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.mdanddocs/guide/synthesis.mdwere corrected to pass a team UUID to--scope-keyinstead of a slug such asplatformorproj_auth.
Web
- The header no longer flashes "Sign in" while
/auth/meis still in flight.UserMenureadsisLoadingfromuseMe()and renders a pulsing avatar placeholder withrole="status"andaria-label="Loading account"until the request settles. Newuser-menu.test.tsxcovers 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.
certifito 2026.10.19 (compromised emSign roots in earlier bundles)pillowto 13.0.0 (19 CVEs)aiohttpto 3.14.5 with a workspace floor of>=3.14.4(three denial-of-service advisories)authlibpinned to>=1.9.1,<1.10inapps/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, andastral-sh/setup-uvto v10.3.0 inhomebrew-formula.ymlandpublish.yml
Developer Experience
tymoved to 0.0.86. Typeshed now deprecatescontextmanagerandasynccontextmanagerfunctions that returnIterator, so 36 context managers across 27 files were updated toGeneratororAsyncGenerator. Stricter dict-unpacking validation against function parameters fixed seven call sites.ruff0.17 sortstomllibas standard library and flagged four async timeout hits in inventory lint.pydantic2.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/sibylversion and appVersion,charts/surrealdbversion; 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 runsibyld migrate retire-sharedto 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
ArchiveConflictif 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-keyfor team scope need the team UUID instead. - First run of
sibyl ingest memoriesis worth previewing with--dry-run; add--shareonly 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.11Remote 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 loginHomebrew
brew install hyperb1iss/tap/sibyl
sibyl upArch Linux (AUR)
paru -S sibyl
sibyl upHeadless server
curl -fsSL https://raw.githubusercontent.com/hyperb1iss/sibyl/main/install.sh | sh -s -- --version 1.4.11 --no-openKubernetes (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.11Artifacts
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.