loobric-server 0.15.0 — batch sync doors
Added
- Batch sync doors (
docs/BATCH_SYNC.md, grilled 2026-08-17):POST /tool-instance-records/syncandPOST /tool-catalog-records/sync— upsert many records in ONE transaction per batch (cap 200). Items compose the existing doors:data(sync lane),asserts(the assert door's shared code path, every guard included),presets(the contribution door: floor + replace-own). Per-item outcomes (created | updated | unchanged | exists | error) in request order;?include=recordsopt-in; merge-only — deliberately no snapshot mode. Scopes compose per lane: a sync-only key gets blocked/skipped counts, never a rejected batch. Catalog natural-key matches areexists: no canonical writes, but the client's own section still syncs. OneSYNC_BATCHaudit row per batch plus the per-entity rows as before.
Changed
- Same-value asserts are now no-ops on the single-record assert doors (value + unit + actor all matching the stored leaf): re-syncs are idempotent end to end — no source overwrite, no version bump, no audit churn. A different actor's identical value still applies in full, so corroboration stays a recorded provenance claim. This is the release's one behavior change.
Why: a 327-tool CAM library import was ~2,600 requests ≈ 11 minutes against SQLite's single writer even with 8 parallel client workers; through the door it is 3 requests ≈ 4 seconds. Pairs with loobric-cli 1.8.0 (sync_tool_records() / sync_catalog_records()).