v1.10.1
·
2 commits
to main
since this release
Changed
- Recall, item get, item log-access, and memory explore now surface real SQLite fault kinds —
db_locked(busy),db_corrupt,io_error— instead of masking them asinternal. The four verbs' error-kinds sets are widened accordingly (cli-contract). Fixes the originaldatabase is locked-as-internalmisclassification on the recall write path. - SQLite extension registration is unified onto driver-global auto-extensions.
vec1(and nowfts5) are registered viasqlite3.AutoExtensionininternal/db's packageinit()(internal/db/autoext.go), so every connection the ncruces driver opens carries both modules — replacing the per-connectionloadVecExtensionshim that ran insidedb.OpenbetweenattachEventsandApply(core). One mechanism, every connection; theMaxOpenConns(1)pin is no longer load-bearing for module presence. Recorded in ADR 0042.
Fixed
stale_lock_fileshealth panel no longer false-positives every session. It previously watched the two persistent flock sentinels (.maintenance.lock,.repos-sync.lock) and flagged any present-but-unheld file via a non-blocking flock probe — but those sentinels are designed to persist on disk unheld between runs (the kernel releases the flock on fd close; the empty file stays so the next caller re-attaches to the same inode), so the panel fired on essentially every idle session: a guaranteed false positive, not a lock leak. It now watches the two PID-fenced, removed-on-release locks instead —update.lock(via its siblingupdate.lock.pidholder record) and the bootstrap mkdir-mutex.bootstrap.lock(via thepidrecord inside its directory) — and detects staleness by probing the recorded holder PID withkill(pid, 0): an absent record (a clean, idle system) or a record naming a live holder yields no row, and only a record naming a dead holder surfaces as a warning (the owning subsystem reclaims it the next time it acquires that lock — routine forupdate.lock, but for.bootstrap.lockonly on a re-bootstrap when the installed binary is missing, so a lingering bootstrap row is safe to remove manually after confirming no live holder). Rows now carry the dead holder's PID and how long the lock has lingered (age_ms) in place of a meaninglesssize_b. An empty/torn pid record is skipped quietly (it races the bootstrap pid file's non-atomic write), while a non-empty but malformed record is logged at WARN; a watched path that exists but cannot be read now surfaces as a distinct warning rather than rendering the panel falsely clean. On Windows the panel is a structural no-op (no reliable holder-liveness probe), so a clean panel there is not a positive all-clear. Thelock-primitiveglossary entry is corrected to match (the persistent flock sentinels are explicitly not flagged).- Dashboard self-terminates when orphaned (parent reparented to init) so an abnormal session exit can't leave a server holding core.db/events.db and blocking WAL checkpointing — the cause of intermittent
database is lockedon recall. - Data-dir resolver normalizes a root whose basename is
data(e.g. over-specifiedCORE_DATA_DIR=<root>/data) down to<root>, so it can't mint a stray nesteddata/data/core.db. - Release bundle now ships
post-tool-use-failure.sh; hooks.json referenced a script the allowlist omitted, so the PostToolUseFailure (error-recall) hook failed with "No such file or directory". - Recall layer survives the go-sqlite3 v0.35.0 FTS5 split. v0.35.0 removed FTS5 (and R*Tree/Geopoly) from the base driver — FTS5 must now be registered separately via
ext/fts5. The recall/memory layer rides entirely on FTS5 (items_fts/items_content_ftsexternal-content tables plus sync triggers on everyitems/items_contentwrite), so the bump would otherwise fault every recall and item write withno such module: fts5. The weekly dependency group now lands withext/fts5registered:github.com/ncruces/go-sqlite30.34.4 → 0.35.1 (its indirect wasm assetgo-sqlite3-wasm/v2→/v3) plus sixgolang.org/x/*minors (crypto0.53.0,net0.56.0,sync0.21.0,sys0.46.0,term0.44.0,tools0.46.0). Supersedes Dependabot #75.