Breaking changes
Pre-1.0: breaking changes ship in a minor release. Full detail in CHANGELOG 0.15.0.
- Partial batch failures are no longer success.
items create,collections create, andimport filedecode thefailedmap Zotero returns inside an HTTP 200 and exit 13, naming the source index, status, and message of each rejected element. Scripts that only checked for exit 0 will now see failures they were blind to. import doipreviews by default and requires--yes;--max-changesis checked before the CrossRef request.import file --format csljsonrequires--via connectorinstead of posting untranslated CSL fields that Zotero stores incompletely.collections updatesendsIf-Unmodified-Since-Version, so a stale update fails instead of silently overwriting a concurrent edit.- One writer at a time. Applied writes take an installation lock (
~/.zotio/.writer.lock), or a canonical output-path lock for export snapshots, collection bundles, and vaults. Writers never queue: a second writer in the same scope exits 9 immediately with retry guidance. Reads and previews stay concurrent. See ADR-0005. - MCP results carrying library content are framed as untrusted data with a top-level
_zotio_provenancemarker; result shapes and MIME types are unchanged, but library resources now adopt the 60-KB bound. - MCP
sqlrenders every[]bytecolumn as text. TEXT columns stop arriving as unreadable base64; BLOB columns change from lossless base64 to a possibly lossy string — read them withhex(). zotio watch <resource>watches that resource instead of quietly syncing the whole library each tick.collections bundlefails on a full-text read error instead of writing an incompletesynthesis.mdand exiting 0.zotio-mcpexits 0 on SIGTERM while a client holds the SSE stream; it used to burn the 5-second drain and exit 1.- Source builds require Go 1.26.5 (
go.modis patch-level): 1.26.5 fixes CVE-2026-42505 incrypto/tls. Release artifacts were never affected.
Changelog
Features
- cf043b9: feat(concurrency): enforce the ADR-0005 single-writer contract (@enieuwy)
- 0442b74: feat(concurrency): establish cross-platform single-writer contract (@enieuwy)
- b99bef5: feat(health): color the human health report by severity (@enieuwy)
Fixes
- b942192: fix(cli): correct watch scoping, date/version parsing, tag dedupe, and silent error paths (@enieuwy)
- 1e098d1: fix(cli): honour Zotero batch failures, version preconditions, and the write gate (@enieuwy)
- ea162ec: fix(concurrency): align lock eligibility with effective profiles (@enieuwy)
- 2e1919c: fix(concurrency): close single-writer contract gaps (@enieuwy)
- 0c43453: fix(infra): close context, DOI routing, and privacy review gaps (@enieuwy)
- 79e8816: fix(infra): harden persistence, cancellation, MCP shutdown, and command capture (@enieuwy)
- 47a1b0f: fix(lint): clear golangci-lint findings from the concurrency work (@enieuwy)
- 50686e7: fix(mcp): frame native library data with provenance (@enieuwy)
Documentation
- 98b3e0c: docs: correct the release notes and write contract against the code (@enieuwy)
- a2c8589: docs: cut 0.15.0 (@enieuwy)
- c280cd7: docs: document the winget install path, correct the release runbook (@enieuwy)
- 59e5c96: docs: move preview card to the stats frame (@enieuwy)
- f6912a1: docs: record the concurrency, write-contract, and MCP framing changes (@enieuwy)
- 999d68e: docs: version-less Linux install + static preview card (@enieuwy)
Curated history: CHANGELOG.md · Install: brew install orgmentem/tap/zotio