Skip to content

Releases: norrietaylor/distillery

v0.5.0 — Knowledge graph

07 May 23:29
a12cedf

Choose a tag to compare

Highlights

Knowledge graph (epic #147) — Distillery learned to walk the graph.

  • find_similar exclude_linked + source_entry_id (#422)
  • distillery_list structural=["orphans"] (#423)
  • distillery_relations traverse + metrics actions; `[graph]` extra (NetworkX) (#424, #426)
  • distillery_search expand_graph + expand_hops (#425)
  • /investigate multi-hop + hidden-connections gap fill (#427)
  • /pour --graph (#428)
  • /radar --structure (orphans + bridges + communities) (#429)

Skill ergonomics

  • /radar --topic <q> override + namespace-aware tag selection (#463 / #460)
  • /radar issues all top-5 queries; default candidate limit 20→35; `feeds.digest.candidate_limit` knob (#462 / #461)

Bench discipline

  • Cell A `+graph` regression gate (#464 / #458): same config as HEADLINE (hybrid/session/recency-on/bge-small, 500q × 5 seeds), with `expand_graph=True`.
  • Result on launch: mean R@5 = 0.972 vs HEADLINE 0.972, delta = 0.0pp, gate_pass=true (sample-size matched at 500q). No regression with graph enabled.
  • Cell B (value-add) deferred to a fit-for-purpose eval — LongMemEval is single-session/single-user and does not exercise the graph hypothesis.

Install / upgrade

```
pip install -U distillery-mcp

or with NetworkX-backed graph metrics:

pip install -U "distillery-mcp[graph]"
```

See full notes in CHANGELOG.md and the v0.5.0 blog post.

v0.4.1 — patch: /radar published_at, poller UA

06 May 05:21
76a3c22

Choose a tag to compare

Patch release. Ships user-visible fixes that have been on main for ~2 weeks but were stranded behind the v0.4.0 plugin marketplace tag (closes #452).

What changed for users

/radar no longer surfaces stale backfill items. Candidates are bounded by metadata.published_at instead of created_at. First-poll backfill batches are excluded by default; pass include_evergreen=true to opt back in. (#444, #446)

Async feed poller sends a descriptive default User-Agent. Reddit and other UA-enforcing sources no longer return 403. (#443, #445)

Plugin install defaults to local stdio MCP. claude plugin install distillery now configures uvx distillery-mcp instead of the hosted demo at distillery-mcp.fly.dev. The hosted demo becomes explicit opt-in. Existing users wanting the hosted demo: claude mcp add distillery --scope user --transport http --url https://distillery-mcp.fly.dev/mcp. (#381, #408)

Stability and infra

  • Poller dedup is fail-closed; FTS rebuild failures roll back instead of poisoning the index (#414)
  • DuckDB connection serialized with asyncio.Lock (#416)
  • Container image migrated to Chainguard distroless Python (#419)
  • Container image now publishes multi-arch — linux/amd64 + linux/arm64 (#447, #450)
  • SessionStart banner is now versionless (eliminates one of the drift sources behind #452)

Internal (no runtime impact)

LongMemEval bench scaffolding: dataset loader (#436), runner (#439), aggregator (#441), CLI (#440), nightly workflow (#438), MkDocs benchmarks page (#437), variance-gate workflow + --seed-offset (#455), nightly cadence/timeout fixes (#453, #451). Variance baseline: R@5 = 0.972 mean, σ=0.0 across 5 seeds × 500 questions on the pre-registered headline cell.

Stability pledge

Same as v0.4.0 — MCP tool surface remains a public contract. No breaking changes in this release.

Install

uvx distillery-mcp@0.4.1       # or
pip install distillery-mcp==0.4.1

Coming next (0.5.0, not in this release)

Graph features behind [graph] extra: distillery_relations traverse + metrics, expand_graph in search, /pour --graph, /investigate multi-hop, /radar --structure. Tracking under epic #147; PRs #422#429 awaiting merge.

v0.4.0 — Full-Proof

19 Apr 17:05
f48446e

Choose a tag to compare

Full-Proof (and near enough to fool-proof)

A quality and API hardening release. Two halves in one phrase: full-proof (undiluted, full-strength — whiskey's name for what comes straight out of the cask) and fool-proof (harder to get wrong, more stable to depend on).

The stability pledge

From v0.4.0 onward, the MCP tool surface is treated as a public contract. That includes tool names, parameter shapes, error codes, and response envelopes. Breaking changes require a major bump; evolution happens through new optional parameters and additive tools. External contributors and plugin authors can now depend on this surface without tracking every release.

Highlights

API surface hardening

  • Consolidated error codes on ToolErrorCode across mcp/tools/ and feeds.py
  • distillery_store dedup_action tightened: "stored" now means stored (was sometimes "merged"/"linked" for informational similarity); "merged"/"linked" reserved for true folds (#332)
  • distillery_list defaults to output_mode="summary" — no more 300 KB context floods from 50-entry gh-sync listings (#311)
  • distillery_store omits conflict_prompt from responses by default
  • resolve_review is idempotent for no-op transitions (#333)
  • source=<url> aliases to feed_url in distillery_list (#335)
  • Canonical entry_type suggested on INVALID_PARAMS
  • Tighter feed-source validation; sync_status lookup parameters exposed
  • Hardened inputs against negative retention and malformed YAML

Storage quality

  • Roll back aborted transactions; surface query failures in distillery_status (#363)
  • WAL flush after writes + preservation on recovery; signature-matched WAL recovery (#346)
  • FTS WAL replay no longer fails on cold start (#349)
  • storage_bytes scoped to filtered entries when filters are active
  • UNC hosts and Windows drive letters handled in file:// URIs

Embedding & providers

  • Embedding budget default raised to unlimited (#351)
  • Structured provider errors propagated through dedup precheck and store_batch
  • OpenAI.embed() routes through embed_batch() for consistent error shape
  • Retry-After: HTTP-date parsed; non-finite values pinned; 5xx retries labeled
  • exc.endpoint included in provider warning logs

Feeds

  • gh-sync returns async via server-side background jobs (#348)
  • Liveness fields populated across poll and sync paths (#334)
  • user_login metadata persisted; merged_at metadata backfill on batch update (#312)
  • HEAD → GET fallback on 405/501; explicit bool parse; generic probe errors (#308)
  • Feed entries excluded from interest profile (radar no longer drifts from feed volume)

Scheduling

  • /setup and /watch now configure Claude Code routines instead of CronCreate jobs / GitHub Actions webhook scheduling (#272)
  • Three routines: hourly feed poll, daily stale check, weekly maintenance
  • Webhook endpoints (/hooks/poll, /hooks/rescore, /hooks/classify-batch) deprecated — log warnings on use. /api/maintenance retained for orchestrated ops

MCP & auth

  • Omit conflict_prompt from distillery_store by default
  • Rate limit respects loopback (#236)
  • Dynamic transport selection (#303)
  • Batch classify (#301)
  • Real author from MCP context (#302)

Docs

  • Reconciled docs site with the shipped staging/api-hardening surface
  • Setup rules, investigate phase 3, and /setup tool list reconciled
  • API-consolidation feature files aligned with shipped behavior

Breaking Changes

None. This release sets the baseline for the stability pledge; subsequent minor releases will respect it.

Install

uvx distillery-mcp@0.4.0       # or
pip install distillery-mcp==0.4.0

PRs in this release

#208, #209, #222, #224, #225, #227, #242, #243, #246, #247, #249, #250, #251, #252, #264, #265, #267, #270, #273, #277, #279, #280, #281, #282, #288, #289, #290, #291, #293, #294, #295, #296, #297, #298, #299, #300, #304, #305, #306, #318, #319, #320, #321, #322, #323, #324, #325, #326, #327, #328, #331, #336, #338, #339, #340, #341, #352, #353, #354, #358, #359, #360, #361, #365

Thanks to everyone who filed issues, reviewed PRs, and hammered on the staging server.

v0.3.2 — MCP Registry fix

09 Apr 06:57
6e83fd1

Choose a tag to compare

Fixes

  • MCP Registry — shorten server.json description to fit 100-char limit
  • Changelog workflow — use peter-evans/create-pull-request to avoid GitHub Actions PR permission issue

PRs

  • #206 — fix(ci): use peter-evans/create-pull-request for changelog
  • #207 — release: v0.3.2

v0.3.1 — MCP Registry + CI fixes

09 Apr 06:52
0a2c428

Choose a tag to compare

Fixes

  • MCP Registry publishing — migrate server.json from deprecated schema 2025-11-25 to 2025-12-11, add required url field for streamable-http transport (#204)
  • Changelog workflow — create PR instead of pushing directly to protected main (#205)
  • Plugin hooks — remove non-functional UserPromptSubmit from plugin.json, add scope-aware hook configuration to /setup skill (#202)
  • Release checklist — add server.json to version bump table

Changes since v0.3.0

  • #202 — fix(hooks): scope-aware hook config via /setup
  • #204 — fix(ci): update server.json to MCP Registry schema 2025-12-11
  • #205 — release: v0.3.1 (version bump + changelog workflow fix)

v0.3.0 — Team Skills + Session Hooks

09 Apr 06:37
a06951e

Choose a tag to compare

Highlights

Team Skills

  • /digest — team activity summaries over configurable time windows
  • /gh-sync — sync GitHub issues and PRs into the knowledge base as searchable entries
  • /investigate — deep context builder combining semantic search with relationship traversal
  • /briefing — solo-first knowledge dashboard (recent entries, corrections, expiring, stale, unresolved) with optional team mode

Session Hooks

  • Hook dispatcher (scripts/hooks/distillery-hooks.sh) — routes UserPromptSubmit, SessionStart, and PreCompact events
  • Memory nudge — periodic reminder to /distill every 30 prompts
  • SessionStart briefing — automatic context injection at session start via HTTP MCP
  • Scope-aware /setup — detects plugin installation scope (user/project) and configures hooks in the appropriate settings.json

Corrections Chain

  • distillery_correct tool for structured corrections with entry_relations backend
  • Migration 8: entry_relations table with backfill
  • distillery_relations tool for managing entry links

New Entry Fields

  • expires_at — time-limited entries with UTC normalization
  • verification — orthogonal quality tracking field
  • session_id — first-class field for session-scoped entries
  • EntrySource extended with inference, documentation, external provenance values

Infrastructure

  • Plugin version pinned to release tag with server version compatibility
  • RELEASING.md with release process and tag format rules
  • 11 new promptfoo eval scenarios
  • Hook integration test harness (22 tests)

Breaking Changes

None.

PRs Included

  • #187verification field
  • #186expires_at column
  • #189 — team skills (/digest, /gh-sync, /investigate, /briefing)
  • #190 — plugin version pinning
  • #192 — bump cryptography
  • #193 — bump langchain-core
  • #194 — corrections chain
  • #195 — OAuth browser timeout fix
  • #197 — session hooks dispatcher
  • #198/briefing skill + SessionStart hook
  • #201 — version bump to 0.3.0
  • #202 — scope-aware hook config via /setup

v0.2.1

08 Apr 14:31
602a525

Choose a tag to compare

Fixes

  • exclude feed entries from interest profile, add curated-first pass to /pour
  • use min-max normalization for hybrid search RRF scores
  • filter low-value GitHub event types at adapter level
  • add total_count to distillery_list responses

v0.2.0 — Feed Intelligence + Improved Retrieval

07 Apr 04:54
3da05e2

Choose a tag to compare

What's New

Hybrid BM25 + Vector Search

  • Combines keyword matching (BM25) with semantic similarity (cosine) using Reciprocal Rank Fusion
  • Recency decay: newer entries win tiebreakers at similar relevance
  • Graceful degradation to vector-only if FTS extension unavailable
  • Configurable: hybrid_search, rrf_k, recency_window_days, recency_min_weight

Feed Auto-Tagging

  • Source tags derived at ingestion: source/github/owner/repo, source/reddit/sub, source/domain
  • Topic tags matched from your knowledge base's own tag vocabulary — no LLM cost
  • distillery retag CLI to backfill existing untagged entries

Skill Upgrades

  • /radar uses interest-driven semantic search instead of newest-first listing
  • /pour expands queries using the tag vocabulary for broader topic coverage

Sprint 1 Foundation

  • GitHub token passthrough for private repo monitoring (#74)
  • distillery_metrics(scope="audit") for login history and user activity (#148)

Documentation

  • uvx distillery-mcp recommended as primary setup path
  • Architecture docs updated with Search Architecture section
  • Roadmap reflects completed hybrid search and auto-tagging

Upgrade

# PyPI
pip install --upgrade distillery-mcp

# uvx (always latest)
uvx distillery-mcp

# Plugin
claude plugin marketplace update norrietaylor/distillery
claude plugin update distillery

# Backfill tags on existing feed entries
distillery retag

Full Changelog

v0.1.1...v0.2.0

v0.1.1

04 Apr 04:55

Choose a tag to compare

Fixes

  • Fixed pypa/gh-action-pypi-publish action reference in PyPI publish workflow
  • Renamed PyPI package to distillery-mcp (the name distillery was taken)
  • Updated all install references across docs, README, and tests

Added

Install: pip install distillery-mcp
Container: docker pull ghcr.io/norrietaylor/distillery:v0.1.1

v0.1.0 — First Public Release

04 Apr 02:41

Choose a tag to compare

What's Changed

  • Add claude GitHub actions 1774227285788 by @norrietaylor in #1
  • fix(deps): add types-PyYAML for mypy strict CI by @norrietaylor in #2
  • fix(slides): mobile responsive presentation by @norrietaylor in #3
  • docs: add slides link to README by @norrietaylor in #4
  • fix(slides): replace ASCII architecture with CSS box diagram by @norrietaylor in #5
  • feat: developer experience improvements (CLI, CI, tests, E2E) by @norrietaylor in #6
  • feat: developer experience, MVP maturity, and FastMCP migration by @norrietaylor in #7
  • feat: add hierarchical tag namespace and entry type schemas by @norrietaylor in #8
  • fix(mcp): add compat shim for lifespan context across FastMCP versions by @norrietaylor in #10
  • fix(store): retry on DuckDB write-write conflicts during initialization by @norrietaylor in #11
  • Feat/infrastructure improvements by @norrietaylor in #12
  • fix(readme): replace em dash with hyphen in Mermaid subgraph label by @norrietaylor in #13
  • docs: replace Mermaid diagram with SVG architecture diagram by @norrietaylor in #14
  • feat(docs): add interactive JS demo slide for hosted MCP by @norrietaylor in #20
  • feat(store): add S3-backed DuckDB and MotherDuck persistent storage by @norrietaylor in #21
  • feat(skills): package Distillery skills as Claude Code plugin by @norrietaylor in #18
  • feat(eval): skill evaluation framework with Claude Code CLI runner by @norrietaylor in #22
  • Addressing PR comments by @norrietaylor in #32
  • feat(mcp): remote team access via HTTP transport and GitHub OAuth by @norrietaylor in #35
  • feat(feeds): Phase 3 ambient intelligence — feed polling, /watch, /radar, /tune by @norrietaylor in #36
  • Normalize cosine similarity scores to [0.0, 1.0] range by @norrietaylor in #37
  • fix(eval): eliminate duplicate mock embedding provider to prevent model name drift by @norrietaylor in #38
  • docs: add plugin install section to README by @norrietaylor in #40
  • feat: add distillery-dev.yaml for Prefect Horizon dev/test environment by @norrietaylor in #48
  • fix(feeds): exclude same-batch entries from poll dedup check by @norrietaylor in #49
  • feat(feeds): improve poll pipeline with defusedxml, interest scoring, and auto-poll by @norrietaylor in #50
  • docs: rewrite demo-deck.md for conference talk by @norrietaylor in #53
  • docs: add investment pitch focus to presentation.html by @norrietaylor in #54
  • chore(deployment): add Prefect Horizon deployment configuration by @norrietaylor in #56
  • fix: plugin manifest schema compliance by @norrietaylor in #57
  • feat(deploy): add Fly.io deployment and reorganize deploy/ directory by @norrietaylor in #59
  • fix(deploy): Fly.io runtime fixes — OAuth, permissions, non-root by @norrietaylor in #60
  • feat(store): persist feed sources in DuckDB by @norrietaylor in #58
  • fix(store): use persistent sentinel to prevent feed re-seeding by @norrietaylor in #63
  • refactor(store): replace in-memory recent_searches with search_log queries by @norrietaylor in #52
  • refactor(skills): slim SKILL.md files by 51% by @norrietaylor in #61
  • Optimize VSS extension loading and remove unnecessary async wrapper by @norrietaylor in #55
  • feat(store): rate limiting, embedding budget, and DB size monitoring by @norrietaylor in #64
  • feat(mcp): add version and build SHA to status response by @norrietaylor in #68
  • fix(deploy): pre-install DuckDB VSS extension in Docker image by @norrietaylor in #66
  • docs(auth): document GitHub OAuth as identity-only gate by @norrietaylor in #69
  • feat(security): harden MCP server against medium-severity findings by @norrietaylor in #70
  • fix(mcp): handle SIGTERM to flush DuckDB WAL before Fly.io shutdown by @norrietaylor in #72
  • fix(deploy): persist OAuth tokens across Fly.io restarts by @norrietaylor in #75
  • fix(mcp): handle SIGTERM to flush DuckDB WAL before Fly.io shutdown by @norrietaylor in #73
  • feat(ci): add supply chain scanning, SBOM generation, and signed container attestation by @norrietaylor in #71
  • Move skills into plugin directory and refresh all docs by @norrietaylor in #77
  • feat(skills): add daily rescore and weekly maintenance to /setup by @norrietaylor in #82
  • feat(auth): restrict MCP server access to GitHub org members by @norrietaylor in #80
  • docs: replace Jekyll with MkDocs Material documentation site by @norrietaylor in #83
  • docs: add demo server warnings for hosted Fly.io instance by @norrietaylor in #84
  • docs: plugin install points to /setup instead of distillery_status by @norrietaylor in #85
  • docs: add demo server warning to home page by @norrietaylor in #86
  • docs: add demo server warning to README quick start by @norrietaylor in #87
  • docs: sync presentation slides with current docs by @norrietaylor in #90
  • fix(skills): correct allowed_tools tool name for scheduled poll trigger by @norrietaylor in #89
  • feat(mcp): add output_mode and content_max_length to distillery_list; add distillery_aggregate by @norrietaylor in #88
  • feat: webhook endpoints for scheduled operations by @norrietaylor in #94
  • fix(mcp): ASGI dispatcher for webhook routing (lifespan fix) by @norrietaylor in #95
  • docs: update architecture, skills, and deployment for webhook endpoints by @norrietaylor in #96
  • docs: webhook endpoint spec and Gherkin scenarios by @norrietaylor in #97
  • docs: promotion readiness — README badges, SECURITY.md, .env.example by @norrietaylor in #103
  • feat(eval): supplement eval framework with CI gate, retrieval metrics, adversarial scenarios, and cost tracking by @norrietaylor in #102
  • docs: add terminal demo recording to README by @norrietaylor in #107
  • chore(skills): plugin audit and skill hardening by @norrietaylor in #105
  • refactor(mcp): split server.py into domain modules, standardize errors, add configurable defaults, 95% test coverage by @norrietaylor in #106
  • Update README.md by @norrietaylor in #111
  • docs: replace demo GIF with /distill → /pour recording by @norrietaylor in #113
  • fix(readme): use static license badge instead of GitHub API badge by @norrietaylor in #114
  • chore(deps): bump fastmcp from 3.1.1 to 3.2.0 by @dependabot[bot] in #116
  • chore(deps): bump pygments from 2.19.2 to 2.20.0 by @dependabot[bot] in #117
  • feat(skills): skill UX improvements (issue #98, items 1-8) by @norrietaylor in #115
  • refactor(mcp): consolidate 6 tools into existing tools (spec-07) by @norrietaylor in #118
  • fix: CodeRabbit auto-fixes for PR #120 by @coderabbitai[bot] in #122
  • chore(plugin): remaining audit improvements from #119 by @norrietaylor in https://github.com/norrietaylor/...
Read more