版本发布 2
chore(release): provision v0.15.0 — bump @loomcycle/client (#298) Memory ranking, dedup & pluggable backends (RFC I) merged with its REVISIONS v0.15.0 entry. Bump the TS adapter to 0.15.0 so tagging v0.15.0 publishes @loomcycle/client with the memoryBackendDef() method that landed with the feature (the adapter had stayed at 0.14.1 through the merge). After merge: tag v0.15.0 → goreleaser release + npm publish. Co-authored-by: Dennis Gubsky <denn-gubsky@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Production-critical follow-on to v0.8.9. Includes the Gemini `\$ref` / `oneOf` / `anyOf` / `allOf` sanitizer from v0.8.9, plus the sqlite migration ordering fix that was blocking v0.8.6+ upgrades from v0.8.4/v0.8.5 deployments. ## What ships | Capability | PR | |---|---| | **Gemini schema sanitizer** — `\$ref` inlining (cycle-safe), `oneOf`/`anyOf`/`allOf` merge-all, type-conflict defense, key stripping. Fixes 400 INVALID_ARGUMENT on MCP tool schemas containing Zod-shaped discriminatedUnion + nested \$defs. | #86 | | **sqlite migration ordering fix** — `channel_messages_by_visible` index moved past the `addColumns` ALTER block. Required for the upgrade path v0.8.4/v0.8.5 → v0.8.6+ where channel_messages exists from migration 0004 without `visible_at`. Pre-fix the migration failed with `SQL logic error: no such column: visible_at`. | #87 | ## Why this point release v0.8.9 (released ~7 hours ago) contained the Gemini schema fix but was blocked on real deploys by the latent migration bug introduced in v0.8.6. CI never caught the migration bug because every test run uses a fresh DB; the bug only manifests on upgrades from pre-v0.8.6 sqlite schemas. Surfaced during a real deploy attempt on 2026-05-13. ## Architecture notes - **Postgres is unaffected by the migration fix** — `0005_channel_visible_at.up.sql` already orders ALTER → CREATE INDEX correctly inside a single golang-migrate transaction. - **The fix is one-way safe**: `lvextend`/`resize2fs` operations on the operator's VM disk (relevant since the deploy includes sqlite schema changes) are zero-data-loss. The migration adds columns + an index; no existing data is rewritten beyond a `visible_at = published_at` backfill on legacy rows. ## Verification - `TestMigrate_UpgradeFromV084ChannelMessages` regression test in `internal/store/sqlite/sqlite_test.go` — hand-creates a v0.8.4 schema, then re-opens through `migrate()`. Asserts: both columns added, by_visible index present, legacy `visible_at` backfilled from `published_at`. Pre-fix fails with the exact production error; post-fix all assertions pass. - 12 Gemini sanitizer unit tests including the realistic-MCP regression fixture. - Race-detector clean on `internal/store/sqlite/...` and `internal/providers/gemini/...`. ## Operator action If your deployed `loomcycle.yaml` still references `gemini-2.0-flash`, bump to **`gemini-2.5-flash-lite`** (identical \$0.10/\$0.40 per MTok, 1M context, stable through ~Jul-Oct 2026). See v0.8.9 release notes for the recommended tier=low candidate list. ## SHA256 ``` ca42e83ce04c2d4591a58c4a2d0c1c088e8d236c6b6804aea2c5d815ef66a692 loomcycle-linux-amd64 ``` ## PRs in this release - #86 — fix(gemini): inline \$ref + merge oneOf/anyOf/allOf in tool schemas - #87 — fix(sqlite): move channel_messages_by_visible index past addColumns