Releases: harshilmathur/RBI-Source-MCP
Release list
v0.9.0
What's Changed
- fix(correctness): close four HIGH-severity silent-data-quality bugs by @harshilmathur in #17
- refactor(indexer,crawler): collapse duplicated upsert + bulk-runner + USER_AGENT by @harshilmathur in #23
- test: backfill coverage on safety-boundary modules by @harshilmathur in #24
- fix(security,perf): MEDIUM hardening — input caps, proxy CIDR gate, content-hash skip by @harshilmathur in #20
- refactor: LOW + NIT + doc-drift cleanup by @harshilmathur in #21
- fix(db): v3 detector ignores operator-added manual UNIQUE INDEX by @harshilmathur in #22
Full Changelog: v0.8.4...v0.9.0
Corpus 2026-07-06 (`latest-corpus`, refreshed daily)
Always-current corpus for rbi-source-mcp — the indexed RBI regulatory document database (hybrid FTS5 + sqlite-vec retrieval).
This release is a moving alias. Assets are clobber-replaced on every successful build. Consumers polling here never see a 404 window.
Latest build
| field | value |
|---|---|
| build_date | 2026-07-06 |
| build_mode | diff |
| build_commit | 4085a0eea0e47adbb5e022ecb17f402fc99794fb |
| build_run | #28765315197 |
| schema_version | 1 |
| embedding_model | @cf/baai/bge-base-en-v1.5 |
| embedding_dim | 768 |
Cadence
- Daily at 02:00 UTC: incremental
diffbuild; ~5 min, ~50 CF Neurons. - Monthly on the 1st at 03:00 UTC:
fullrebuild; ~30 min, ~3000 CF Neurons. Catches silent RBI re-uploads (PDFs replaced without bumping the list-page date) that diff-mode can't see by definition.
Install
pip install rbi-source-mcp
rbi-source-fetch-corpus # pulls THIS alias
rbi-source-fetch-corpus --verify-sigstore # cryptographic verifyVerify
- SHA256:
shasum -a 256 -c corpus.sqlite.xz.sha256 - Sigstore: the
.sigstore.jsonbundles are signed bycorpus-release.yml@refs/heads/mainvia GitHub Actions OIDC.cosign verify-blob \ --bundle corpus.sqlite.xz.sigstore.json \ --certificate-identity 'https://github.com/harshilmathur/RBI-Source-MCP/.github/workflows/corpus-release.yml@refs/heads/main' \ --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \ corpus.sqlite.xz
Smoke gate
Each build passes a paired eval gate before publish:
- absolute: ≥80% hit-rate on the eval suite
- regression: <5pp drop vs the prior
latest-corpusbuild
Eval JSON attached as eval.json (used by the next run's regression check) plus eval-current.json (this run's snapshot for forensics).
Forensics on prior corpora
Per-build provenance for this corpus is stamped inside the SQLite at corpus_meta (key/value rows: build_commit, build_run_id, build_mode, embedding_*, schema_version). For older builds: see this workflow's run history — each run carries a 30-day artifact with the corpus + eval.
v0.8.4
What's Changed
- v0.8.4 fix: security hardening + corpus-release housekeeping by @harshilmathur in #1
New Contributors
- @harshilmathur made their first contribution in #1
Full Changelog: v0.8.3...v0.8.4
v0.8.3
v0.8.2
v0.8.1
v0.6.0 — Cloudflare Workers AI embeddings
What changed
Production embedding moved from local sentence-transformers (bge-small @ 384-dim, in-process) to Cloudflare Workers AI (@cf/baai/bge-base-en-v1.5, 768-dim, over HTTPS).
Why
The local model carried a real cost on every cold-boot — 75-200s to download + load — which forced auto_stop_machines=off and a 2 GB Fly machine just to keep the embedder's hot pages resident. CF Workers AI is free at our usage tier and lets the runtime image drop everything torch-shaped.
Numbers
| before | after | |
|---|---|---|
| Runtime image | ~4 GB | 89 MB |
| Cold boot embedder prewarm | 75-200s | 1.07s |
| Source-only deploy time | 12-14 min | 2-3 min |
| Fly machine memory | 2 GB | 1 GB |
| Eval gate (24 cases) | 24/24 | 24/24 |
| Warm query latency p50 / p95 | — | 588ms / 2.3s |
Bake-off
Locally evaluated three options before shipping:
- A bge-small @ 384 (local, baseline)
- B bge-base @ 768 (CF) ← shipped
- C bge-m3 @ 1024 (CF)
C looked appealing on paper but regressed the headline PPI loading-limit case (top-1 became 15.3.n audit text instead of 8.2.c loading-limit clause). B matched A on hit rate and on retrieval quality, with the bonus that we get the whole runtime-slimming win.
How embeddings get configured
Three env vars (no secrets) drive provider selection:
RBI_EMBEDDING_PROVIDER local | cloudflare (default: local)
RBI_EMBEDDING_MODEL <model id>
RBI_EMBEDDING_DIM <int>
Self-hosters who don't have CF creds can stay on the local path with uv sync --extra local-embeddings. The Fly image bakes the cloudflare defaults; CF auth (CF_ACCOUNT_ID, CF_API_TOKEN) lives in Fly secrets.
Weekly refresh
.github/workflows/refresh.yml runs Sundays 02:00 UTC: crawl → 5 indexers → eval gate (>=80%) → sftp + atomic-rename onto the Fly volume. App-scoped FLY_API_TOKEN limits blast radius to this app only.
Migration notes
Schema is forward-compatible — chunks_vec is now DIM-aware (vec0(embedding float[N]) where N comes from embedding_config.DIM). Forks running on the old 384-dim local path keep working without env changes.