Releases: norrietaylor/distillery
v0.5.0 — Knowledge graph
Highlights
Knowledge graph (epic #147) — Distillery learned to walk the graph.
find_similarexclude_linked + source_entry_id (#422)distillery_liststructural=["orphans"] (#423)distillery_relationstraverse + metrics actions; `[graph]` extra (NetworkX) (#424, #426)distillery_searchexpand_graph + expand_hops (#425)/investigatemulti-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)/radarissues 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
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.1Coming 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
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
ToolErrorCodeacrossmcp/tools/andfeeds.py distillery_storededup_actiontightened:"stored"now means stored (was sometimes"merged"/"linked"for informational similarity);"merged"/"linked"reserved for true folds (#332)distillery_listdefaults tooutput_mode="summary"— no more 300 KB context floods from 50-entry gh-sync listings (#311)distillery_storeomitsconflict_promptfrom responses by defaultresolve_reviewis idempotent for no-op transitions (#333)source=<url>aliases tofeed_urlindistillery_list(#335)- Canonical
entry_typesuggested onINVALID_PARAMS - Tighter feed-source validation;
sync_statuslookup 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_bytesscoped 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 throughembed_batch()for consistent error shape- Retry-After: HTTP-date parsed; non-finite values pinned; 5xx retries labeled
exc.endpointincluded in provider warning logs
Feeds
gh-syncreturns async via server-side background jobs (#348)- Liveness fields populated across poll and sync paths (#334)
user_loginmetadata persisted;merged_atmetadata 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
/setupand/watchnow 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/maintenanceretained for orchestrated ops
MCP & auth
- Omit
conflict_promptfromdistillery_storeby 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
/setuptool 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.0PRs 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
v0.3.1 — MCP Registry + CI fixes
Fixes
- MCP Registry publishing — migrate
server.jsonfrom deprecated schema2025-11-25to2025-12-11, add requiredurlfield for streamable-http transport (#204) - Changelog workflow — create PR instead of pushing directly to protected main (#205)
- Plugin hooks — remove non-functional
UserPromptSubmitfrom plugin.json, add scope-aware hook configuration to/setupskill (#202) - Release checklist — add
server.jsonto version bump table
Changes since v0.3.0
v0.3.0 — Team Skills + Session Hooks
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) — routesUserPromptSubmit,SessionStart, andPreCompactevents - Memory nudge — periodic reminder to
/distillevery 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 appropriatesettings.json
Corrections Chain
distillery_correcttool for structured corrections withentry_relationsbackend- Migration 8:
entry_relationstable with backfill distillery_relationstool for managing entry links
New Entry Fields
expires_at— time-limited entries with UTC normalizationverification— orthogonal quality tracking fieldsession_id— first-class field for session-scoped entriesEntrySourceextended withinference,documentation,externalprovenance values
Infrastructure
- Plugin version pinned to release tag with server version compatibility
RELEASING.mdwith release process and tag format rules- 11 new promptfoo eval scenarios
- Hook integration test harness (22 tests)
Breaking Changes
None.
PRs Included
- #187 —
verificationfield - #186 —
expires_atcolumn - #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 —
/briefingskill + SessionStart hook - #201 — version bump to 0.3.0
- #202 — scope-aware hook config via
/setup
v0.2.1
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
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 retagCLI to backfill existing untagged entries
Skill Upgrades
/radaruses interest-driven semantic search instead of newest-first listing/pourexpands 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-mcprecommended 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 retagFull Changelog
v0.1.1
Fixes
- Fixed
pypa/gh-action-pypi-publishaction reference in PyPI publish workflow - Renamed PyPI package to
distillery-mcp(the namedistillerywas taken) - Updated all install references across docs, README, and tests
Added
- Blog post: Building a Second Brain for Claude Code
Install: pip install distillery-mcp
Container: docker pull ghcr.io/norrietaylor/distillery:v0.1.1
v0.1.0 — First Public Release
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/...