Releases: Rishabhmannu/financebench-rag-agent
Release list
v0.3.3 — demo recordings + repo hygiene
Demo refresh and repo hygiene. No API or behavior change for typical CLI/Docker users.
Highlights
- Refreshed demos. All three terminal demos re-recorded against the current stack. The human-in-the-loop demo is now a genuine two-pane recording: finance is blocked at the approval gate while an admin approves in a second session, and the released answer streams back into the finance pane.
- Hardened the HITL gate. Dollar-amount detection now ignores implausibly large values (> $10T), so a malformed generated draft can never surface a nonsensical figure in an approval prompt. Covered by new unit tests.
- Cleaner CI. The reference AWS deploy workflow is now manual-trigger only (it was failing on every push and is not wired to live infrastructure).
- Doc accuracy. Corrected the documented CORS default and removed a stale legacy-frontend reference.
Quality
342 unit tests pass.
Install
pip install financebench-rag-agent==0.3.3
Docker image: ghcr.io/rishabhmannu/financebench-rag-agent-api:0.3.3 (linux/amd64 + linux/arm64).
v0.3.2 — package hygiene + Trusted Publisher
Package hygiene and distribution-pipeline polish. No runtime behavior change for typical CLI or Docker users.
Highlights
- Trusted Publisher (OIDC). Releases now publish to PyPI via a tokenless GitHub OIDC handshake (PEP 740), gated on the CI health-probe job. Wheel + sdist ship with digital attestations.
- Cleaner package surfaces. Internal development, evaluation, and training scripts no longer ship in the source distribution or the Docker image. The sdist dropped from 251 to 153 entries, and the image now carries only the two scripts used at runtime.
- Removed the legacy Gradio frontend. The CLI is the canonical client; this also removes the unused module from the wheel.
- One-time upgrade notice surfaces the 0.3.1 spaCy and docling default changes on first
financebench upgrade. - Architecture diagram renders on PyPI (PNG instead of a Mermaid block).
- Portable demo recordings. The VHS tape files are no longer tied to a specific machine.
- Full-stack compose fixes for self-hosters running the optional Langfuse stack: result-cache Redis wiring, the canonical
/v1/healthhealthcheck, and a current default image tag.
Quality
All 337 unit tests pass. Five long-standing test failures were root-caused as stale tests (not product regressions) and fixed.
Install
pip install financebench-rag-agent==0.3.2
Docker image: ghcr.io/rishabhmannu/financebench-rag-agent-api:0.3.2 (linux/amd64 + linux/arm64).
0.3.1 — image size reduction (1.1 GB → 572 MB, -48%)
Headline
M1 first-pull compressed download: 1,102 MB → 571 MB (-48.1%)
Image on disk: 4.30 GB → 2.82 GB (-34.4%)
Estimated pull time on Indian residential bandwidth: ~13 min → ~6 min.
What changed
Phase 1 — .dockerignore safety
Excluded Docker-backup-*.raw (a 65 GB sparse-file restore point from the 2026-06-02 Docker Desktop disk-full event), dist/hf-snapshot-*/, logs/, cost_logs/, publish-assets/. Without the Docker-backup exclusion, any docker build from project root would have sent 65 GB to the daemon as build context.
Phase 2 — spaCy en_core_web_lg → en_core_web_md
- Saved ~760 MB uncompressed (spaCy lg bundles word vectors that md doesn't).
- Code fix required: Presidio's
AnalyzerEngine(supported_languages=[\"en\"])default hardcodesen_core_web_lg. Without explicitNlpEngineProviderconfig, it auto-downloads lg (400 MB) at first chat query and times out offline. Fixed insrc/services/guardrails_service.py:142-187. - PII recall caveat: extended PERSON-detection test caught ~20pp recall drop on single-name references ("Buffett's letter", "Dimon warned") vs full-name references where both models match.
- Resolution: hybrid env-var opt-in. Set
USE_LARGE_SPACY_MODEL=1and install lg in the running container for compliance / HR / legal workloads that need maximum recall:
docker exec <api-container> python -m spacy download en_core_web_lg
# restart containerPhase 3 — docling moved to optional [docling] extra
- Removed docling + opencv_python.libs + cv2 + docling_parse + rapidocr + docling_core + docling_ibm_models from default install.
- Dropped
libxcb1+libgl1from both Dockerfile stages (199 MB layer gone entirely). - pypdf is the canonical parser anyway — docling underperforms pypdf by ~29pp on RAGAS faith + ctx_prec per the credibility-rule eval evidence.
src/ingestion/docling_loader.py:64-68already handled missing-docling gracefully (returns None, chunker falls back to per-page pypdf chunking).
Users who want docling: `pip install ".[docling]"` plus host-level apt install libxcb1 libgl1.
What we explicitly did NOT do
- Base image swap (slim → distroless/alpine) — ~30 MB compressed gain at the cost of recompiling native deps + 20-40 min build time. Bad ROI when Phases 2 + 3 already exceeded the 26% compressed target.
- Strip dev artifacts from vendored packages — skipped to keep risk surface minimal.
- Layer split for incremental pulls — flagged for 0.4.x if pyproject.toml continues to churn.
Verification
| Check | Result |
|---|---|
docker history layer audit |
Site-packages layer: 2.78 GB → 2.10 GB. Runtime apt layer (libxcb1+libgl1) gone entirely. |
| docling family removal | import docling/cv2/docling_parse/rapidocr/docling_core → ImportError as expected |
| pytest unit tests | 307 passed, 5 pre-existing flakes (test_entity_extractor + 4 test_threads_routes — same as 0.2.x/0.3.0 baseline) |
| Ingestion smoke | load_pdf on 2 sample PDFs → pypdf-fallback mode, content extracted (5391 + 855 chars) |
| Graph build | 19 nodes, no ImportError |
| Multi-arch GHCR image | Built + verified on amd64 + arm64. Verify job /v1/health passed in 1m15s. |
| Compressed download (arm64) | 571.9 MB confirmed via docker buildx imagetools inspect --raw |
Try it
pip install --upgrade financebench-rag-agent
financebench upgrade
# Watch first-pull complete in ~half the time it used to takeEngineering log
Two new credibility-rule case studies (6th + 7th in the series) documented at docs/engineering-log.md:
- My 375 MB Phase 2 estimate vs measured 760 MB — missed that lg bundles word vectors md doesn't. Should have read spaCy's docs not just the on-disk model size.
- My initial "lg=md recall=1.000" report missed the single-name PERSON gap. User trusted the "go" recommendation; extended test caught it before shipping. Lesson: when comparing models for a recall-critical use case, test BOTH phrasing patterns common in the production input distribution before declaring equivalence.
Both caught BEFORE shipping. The protocol works when followed.
Multi-arch image
ghcr.io/rishabhmannu/financebench-rag-agent-api:0.3.1 (linux/amd64 + linux/arm64). Pulled automatically by `financebench upgrade`.
0.3.0 — pre-vectorized FinanceBench snapshot on HuggingFace Hub
TL;DR
New-user time-to-first-query drops from ~30 min + ~$5-15 (re-embed 360 PDFs through Voyage's API) to ~3 min + $0 (download pre-computed embeddings, bulk-upsert into Qdrant).
pip install --upgrade financebench-rag-agent
financebench setup
financebench seed --from-hf cmpunkmannu/financebench-voyage-finance-2-embeddingsThe dataset
Live at https://huggingface.co/datasets/cmpunkmannu/financebench-voyage-finance-2-embeddings (public, CC BY-NC 4.0).
| Chunks | 68,059 |
| Documents | 84 distinct SEC filings (10-K / 10-Q / 8-K / earnings) |
| Dense vectors | voyage/voyage-finance-2 (1024-dim, cosine) |
| Sparse vectors | BM25 tokens (Qdrant fastembed) |
| Files | chunks.parquet (460 MB) + manifest.json + README.md |
| License | CC BY-NC 4.0 (inherited from FinanceBench) |
Also usable from any RAG stack without the CLI:
from huggingface_hub import hf_hub_download
import pandas as pd
path = hf_hub_download(
repo_id=\"cmpunkmannu/financebench-voyage-finance-2-embeddings\",
filename=\"chunks.parquet\",
repo_type=\"dataset\",
)
df = pd.read_parquet(path)What shipped
scripts/export_to_hf.py— producer side: Qdrant scroll → parquet + manifest + frozen README. `--upload` mode handles HF Hub publish.- `scripts/seed_from_hf.py` — consumer side (runs in container): downloads via huggingface_hub, drops + recreates collection, bulk upserts. Verifies manifest dense_dim matches consumer pipeline; hard-fails on mismatch.
- `financebench seed --from-hf ` — CLI flag wiring, mutexes with --sample/--dir, threads --collection + --revision.
- `pyproject.toml [backend]` — explicit pyarrow + huggingface_hub pins (pyarrow was not in the backend tree; leaving it transitive would have silently broken the restore path).
Verification
Round-trip verified end-to-end before release: downloaded the published parquet → restored to a fresh test Qdrant collection → queried a known chunk's vector against both source and restored → top-3 results match exactly. Vectors round-trip without precision loss.
Why parquet, not a native Qdrant snapshot
Parquet is framework-agnostic and has a stable, documented schema. The README's "Direct parquet (any RAG stack)" path wouldn't work with a native snapshot. Trade: ~70s extra to re-index on restore vs the portability gain. See docs/engineering-log.md for the full reasoning.
Multi-arch image
`ghcr.io/rishabhmannu/financebench-rag-agent-api:0.3.0` (linux/amd64 + linux/arm64). Pulled automatically by `financebench upgrade`.
Full notes
See docs/engineering-log.md for the 0.3.0 narrative — frozen-README design, judgment-call moments, round-trip verification details.
0.2.3 — Dockerfile half of named-volume fix + API key Layer 2
Why 0.2.3 (and why no 0.2.2 on PyPI)
0.2.2 was tagged but CI verify caught a second-order bug: the named-volume switch in compose.minimal.yml needed a matching mkdir + chown in the Dockerfile, otherwise docker creates the mount point as root:root and appuser PermissionErrors on first JSONL write. The v0.2.2 tag was deleted before any PyPI upload. 0.2.3 includes everything 0.2.2 was meant to ship plus the second-order fix and the API key Layer 2 work.
What's in 0.2.3
Linux bind-mount UID fix — completed
compose.minimal.yml./logsand./cost_logsare now named volumes (api_logs,api_cost_logs) — no host UID collision on Linux installsDockerfilepre-creates/app/logsand/app/cost_logswithappuserownership beforeUSER appuserso named volumes inherit correct perms (mirrors the existing hf_cache pattern)- New
financebench logs+financebench logs --event-logCLI commands replace host-sidetail logs/run_*.jsonl - CI verify job's
chmod 777workaround removed (the bug is gone at the compose+Dockerfile layer)
API key Layer 2 validation — new
cli/key_probe.py— one probe per provider:- OpenAI / Anthropic / Groq: free
GET /v1/models - Voyage: 1-token embedding (~$0.00002)
- OpenAI / Anthropic / Groq: free
- Wired into
financebench setup— per-key after Layer 1 prefix check, gated by--skip-key-probeor--skip-doctor-network - Wired into
financebench doctor— four new checks under "API keys" group, gated by--skip-network - Network errors fall through to "saved as-is" — offline installs still work
Upstream warning suppression (carried from 0.2.2)
src/_quiet.py+src/__init__.pyinstall filters for langgraph + protobuf + websockets pending-deprecation warningspyproject.tomlpytestaddopts -Wfor protobuf via langsmith pluginDockerfileENV PYTHONWARNINGSfor entry-point-level warnings uvicorn imports before anysrc.*code runs- JWT test fixture secret padded 23 → 32 bytes (real fix at source)
Try it
pip install --upgrade financebench-rag-agent
financebench upgrade
# verify the new API key live probe:
financebench doctor
# new logs command (replaces host-side tail logs/):
financebench logs
financebench logs --event-log --followMulti-arch image
ghcr.io/rishabhmannu/financebench-rag-agent-api:0.2.3 (linux/amd64 + linux/arm64). Pulled automatically by financebench upgrade via the FB_IMAGE_TAG env var threaded from the wizard.
Engineering log
Full narrative including the 0.2.2 failure → 0.2.3 fix, the fifth documented instance of "fixed one call site, missed the other", and the API key Layer 2 design at docs/engineering-log.md.
v0.2.1 — financebench seed CLI subcommand
Closes the partial item from 0.1.8 / 0.2.0 — top-level CLI command for ingesting PDFs, no more remembering the docker exec invocation.
New
financebench seed --sample
financebench seed --dir data/raw/my-corpus
financebench seed --dir ~/.financebench/repo/data/acme --collection acme_q3_2026Thin wrapper around `scripts/seed_qdrant.py` (whose `--dir` + `--collection` flags shipped in 0.1.8). Translates host paths to container paths under the `./data:/app/data` bind mount and `docker compose exec api python scripts/seed_qdrant.py` with the right args. Errors clearly if `--dir` is outside the mounted tree.
Caveat (documented in `--help`)
The reranker + prompts are FinanceBench-tuned. Accuracy on unrelated finance docs may differ from the 72.67% headline — use `--collection` to keep your custom corpora separate from the demo / eval collections.
Upgrade
pip install --upgrade financebench-rag-agent
financebench upgradeCI verification
Both workflows ran on this tag:
- smoke-install (cheap PR/push smoke) — wheel install + CLI + doctor checks all passed
- release-image (build → merge → verify) — multi-arch image built, pushed to GHCR as `:0.2.1` and `:0.2`, verify job pulled the fresh image, brought up the stack, hit `/v1/health` 200, confirmed `/version` semver matches the tag
This is the first 0.2.x release where the CI smoke verifies the install path end-to-end on tag push. Catches the runtime regressions the 0.1.x cycle was famous for.
Verification
- 213 KB whl / 1.0 MB sdist · `twine check` PASSED
- Fresh-venv smoke test PASSED (36 MB site-packages, no change)
- `financebench seed` shows in `financebench --help`
- `financebench seed --help` renders the examples + caveat
- Multi-arch manifest at `ghcr.io/rishabhmannu/financebench-rag-agent-api:0.2.1` with both `linux/amd64` and `linux/arm64` digests
v0.2.0 — pre-built GHCR image + 4 bug fixes
The 0.x install-path arc closes here. API image is now built once per release in CI and pushed multi-arch (linux/amd64 + linux/arm64) to GHCR. `financebench upgrade` defaults to `docker compose pull` — ~90 seconds instead of the ~10-minute source build that every 0.1.x release paid.
What changes for users
pip install --upgrade financebench-rag-agent
financebench upgradeSame two commands as before. Underneath, the second one is now:
- `git pull` (still useful for docs / scripts / .env.example updates)
- `docker compose pull` — fetches `ghcr.io/rishabhmannu/financebench-rag-agent-api:0.2.0` from GHCR
- `docker compose up -d --force-recreate`
Total wall time on M1: ~90 seconds for first pull, ~10s thereafter. Previously: ~10 min per release (Apple Silicon torch + sentence-transformers + spaCy rebuilds).
Building from source
For dev work, pre-release verification, or if GHCR is unreachable:
financebench upgrade --build
# or
BUILD_FROM_SOURCE=1 financebench upgradeRestores the pre-0.2.0 behavior.
Image registry
- Path: `ghcr.io/rishabhmannu/financebench-rag-agent-api`
- Tags: `:0.2.0` (pinned) and `:0.2` (floating major.minor — useful for users who want to stay on the 0.2.x line via manual pulls)
- Architectures: `linux/amd64` (Intel/AMD servers, dev machines) + `linux/arm64` (Apple Silicon, Graviton)
- Built by: GitHub Actions on every `v*` tag — see `.github/workflows/release-image.yml`
Bug fixes folded in
-
GIT_SHA threading in `financebench upgrade` — the same fix the 0.1.5 release applied to `setup.py` was missed in `upgrade.py` for three releases. Banner reported `sha unknown` on every container started via upgrade. Now threaded the same way as setup. (cli/commands/upgrade.py)
-
Qdrant port-range detection in doctor — `docker ps` returns range notation (`6333-6334`) for services exposing adjacent ports. Pre-0.2.0 substring matcher `:6333->` silently missed it. Replaced with a proper parser that expands ranges and handles IPv4+IPv6 dual entries. Doctor now correctly identifies the qdrant container as "your running stack" instead of flagging Docker Desktop's backend PID for killing. (cli/doctor/checks.py)
Cosmetic noise reduction
-
`ORT_LOGGING_LEVEL=3` in Dockerfile — silences the "Unknown CPU vendor" onnxruntime warning that fires on every script invocation inside arm64 Linux containers on M1. Pure log noise; test6 A/B falsified the perf hypothesis.
-
`AnalyzerEngine(supported_languages=["en"])` in guardrails — restricts presidio to English recognizers. Pre-0.2.0 presidio emitted 11 warnings per container start about Spanish/Italian/Polish recognizers that the registry doesn't support.
Upgrade
pip install --upgrade financebench-rag-agent
financebench upgradeAfter upgrade, run `docker image prune -a -f --filter "until=24h"` to evict the stale local `repo-api` images built by 0.1.x (each ~2.5 GB). The new GHCR image takes their place.
Verification
- 27 doctor unit tests pass (was 23 — +4 for the port-range parser)
- `twine check` PASSED on wheel + sdist (211 KB / 1.0 MB)
- Fresh-venv smoke test PASSED (36 MB site-packages, no change)
- GitHub Actions workflow ran successfully on first push
- Multi-arch manifest list verified via `docker buildx imagetools inspect` — both `linux/amd64` and `linux/arm64` digests present
What's next
0.1.5 / 0.1.6 / 0.1.7 / 0.1.8 are candidates for yanking once 0.2.0 holds for a few days of real use. Pinned installs continue to work either way.
v0.1.8 — UX polish: /status slash, next-step hints, --dir seed, qdrant pin
UX polish release between 0.1.7 (install-path stable) and 0.2.0 (GHCR image work). No behavior changes to the agent or pipeline.
New
-
`/status` REPL slash command — on-demand snapshot of backend URL + semver + sha + API version, current login (user, role, profile, FB_PROFILE env), and session totals (thread id, turn count, cumulative cost + tokens). Closes the M1 test7 gap where typing `/status` returned "Unknown slash command". Also added to the `/help` listing. (cli/slash.py)
-
Next-step hints across CLI commands — each terminal command now prints a one-line dim "Next: ..." hint after its success message:
- `financebench login` → Next: `financebench chat`
- `financebench logout` → Run `financebench login -u ` when ready
- `financebench doctor` (clean) → Next: `financebench setup`
- `financebench down` → Next: `financebench setup` (or `financebench upgrade`)
- `financebench upgrade` → Next: `financebench chat`
- `financebench setup` now ends with an explicit numbered "Next steps:" block listing the login + chat sequence with available roles inline.
-
`scripts/seed_qdrant.py --dir [--collection ]` — ingest your own PDFs into a custom Qdrant collection without editing the script:
python scripts/seed_qdrant.py --sample python scripts/seed_qdrant.py --dir ~/my-finance-pdfs/ python scripts/seed_qdrant.py --dir ~/acme-q3/ --collection acme_q3_2026
Performance caveat: the LoRA-FT reranker + tuned prompts are FinanceBench-specific, so accuracy on unrelated finance docs may differ from the 72.7% headline. Suitable for personal use / private docs, not benchmark replication.
Fixed
-
Doctor BuildKit nudge — `financebench doctor` no longer recommends `export DOCKER_BUILDKIT=1`. Modern Docker Desktop (23+) enables Buildkit by default; the nudge was confusing. Only flags now when buildx itself is missing.
-
Qdrant client version pin — `qdrant-client` pinned to `>=1.13,<1.15` to match the qdrant 1.13.2 server image. Pre-pin, pip resolved to 1.18.x and emitted a UserWarning on every call ("client 1.18.0 is incompatible with server 1.13.2 — minor version difference must not exceed 1"). Cosmetic but log-noisy. Bumping the server image is a 0.2.0-scoped decision (volume-reflow risk); pinning the client is the cheap fix.
Upgrade
pip install --upgrade financebench-rag-agent
financebench upgrade`financebench upgrade` runs `git pull` + `docker compose build` + restart + health-check, all preserving volumes. That's the recommended path for every release post-0.1.0.
Verification
- 211 KB whl / 1.0 MB sdist · `twine check` PASSED
- Fresh-venv smoke test PASSED (36 MB site-packages, no size change)
- 23 doctor unit tests pass
- `/status` slash + next-step hints visible in dev install
Next
0.2.0 — pre-built GHCR image with multi-arch CI. Cuts the ~10 minute build per release to a ~90 second pull. Sprint design already in docs/engineering-log.md §"0.2.x roadmap".
v0.1.7 — doctor refinement: own-stack port detection + drop RAM check
Tightens `financebench doctor` to be less noisy when your stack is already running, and drops the RAM check that was generating false positives on macOS.
Fixes
-
Port check: detect our own running stack instead of flagging it. Pre-0.1.7, when your financebench stack was up, lsof saw ports 8000/6333/5432/6380 held by Docker Desktop's backend PID. Doctor flagged them as conflicts and recommended `kill ` — which would kill Docker Desktop itself. Now we `docker ps` first, match container names ending in `-api-1` / `-qdrant-1` / `-postgres-1` / `-redis-1`, and report PASS with "in use by (your running stack)" when the port belongs to us. The wizard's `up -d --build` is idempotent, so this is correctly not a blocking condition. (cli/doctor/checks.py)
-
RAM check removed. The previous `psutil.virtual_memory().available` reading was too pessimistic on macOS — the OS aggressively caches in RAM, reports `available` low even when memory pressure is fine, and pages to SSD-backed swap under pressure. On 16 GB Apple Silicon, "3.2 GB available" triggered a WARN that was almost always false. Removed cleanly. If real OOMs ever surface, a cross-platform RAM probe via `vm_stat` (Darwin) and `/proc/meminfo` (Linux) can come back as a proper signal.
-
psutil dropped from main dependencies (was added in 0.1.6 only for the now-removed RAM check). CLI bundle: 37 MB → 36 MB.
What the doctor output looks like now when your stack is up
Ports
[✓] Port 8000 (api) in use by repo-api-1 (your running stack)
[✓] Port 6333 (qdrant) in use by repo-qdrant-1 (your running stack)
[✓] Port 5432 (postgres) in use by repo-postgres-1 (your running stack)
[✓] Port 6380 (redis) in use by repo-redis-1 (your running stack)
Pre-0.1.7, those four lines were a blocking failure plus three warnings with bogus "kill 8360" fix recipes pointing at Docker Desktop's PID.
Upgrade
pip install --upgrade financebench-rag-agent
cd ~/.financebench/repo
git pull
docker compose -f compose.minimal.yml up -d --buildVerification
- 23 doctor tests pass (was 19; +4 new for own-stack scenarios)
- `twine check` PASSED on wheel + sdist
- Fresh-venv smoke test PASSED (36 MB site-packages)
- Live `financebench doctor` on dev machine correctly reports running postgres container as PASS, not WARN
Next
0.2.0 — pre-built GHCR image with multi-arch CI. Cuts M1 install from ~10 min build to ~90s pull, eliminates the per-version dep redownload entirely.
v0.1.6 — financebench doctor preflight + two M1-cycle bug fixes
The 0.1.x install-path cycle stabilized at 0.1.5. This release adds the financebench doctor preflight tool — flutter-doctor-style environment checks that catch host-side issues at wizard time instead of mid-install. Plus two small bug fixes from M1 verification.
New: financebench doctor
Read-only environment diagnostic, runs automatically as step 0 of financebench setup.
financebench doctor # full report
financebench doctor --skip-network # offline mode
financebench setup --skip-doctor # bypass for advanced users14 checks across 4 groups:
| Group | Checks |
|---|---|
| System | Platform · Docker · Docker daemon · Docker Compose v2 · Git · Buildkit |
| Resources | Disk space (≥ 6 GB) · RAM (≥ 4 GB) |
| Ports | 8000 (api, blocking) · 6333 (qdrant) · 5432 (postgres) · 6380 (redis) |
| Network | PyPI · GitHub · Docker Hub · CLI version |
Three tiers — BLOCKING failures exit the wizard; WARNINGS print but proceed; INFO sets expectations (e.g. M1 → "BGE on CPU, ~30s first warm"). Each failure ships with an actionable fix recipe.
Example output:
financebench doctor — environment check
(0.9s)
System
[·] Platform arm64 · Darwin 25.5.0 — BGE on CPU
[✓] Docker Docker version 28.1.1
[✓] Docker daemon Running
[✓] Docker Compose Docker Compose version v2.34.0
[✓] Git git version 2.48.1
[·] Docker Buildkit Available but DOCKER_BUILDKIT not set
→ Add \`export DOCKER_BUILDKIT=1\` to ~/.zshrc for faster builds
Resources
[✗] Disk space 5.7 GB free in \$HOME (need ≥ 6 GB)
→ Free up disk space; image build needs ~3-4 GB plus volumes ~1 GB
[✓] RAM 7.1 GB free / 24 GB total
Ports
[✓] Port 8000 (api) free
[✓] Port 6333 (qdrant) free
[✓] Port 5432 (postgres) free
[✓] Port 6380 (redis) free
Network
[✓] PyPI Reachable
[✓] GitHub Reachable
[✓] Docker Hub Reachable
[·] CLI version 0.1.6 (latest)
10 passed · 1 blocking failure · 3 info
Setup blocked. Fix the failure(s) above and re-run.
Setup integration UX
- Clean pass (no warnings, no failures): single-line success
[✓] Doctor checks passed (0.9s). Wizard moves on. - Any warning or failure: full grouped report shown. Wizard exits if blocking, proceeds with warnings.
This stays terse for the happy path while making issues visible when they matter.
Bug fixes
-
set FB_PROFILE=admin→export FB_PROFILE=adminin banner tips.setis tcsh syntax; zsh and bash users (every modern macOS install) needexport. Caught on M1 test7. Now consistent with cli/credentials.py:14 which already usedexport. (cli/commands/chat.py, cli/commands/setup.py) -
GIT_SHAenv fallback insrc/services/event_log.pyboot banner. The 0.1.5 `git_sha()` fix in `src/api/main.py` handled the FastAPI `/version` endpoint, but this second call site (the boot-banner audit log) was missed. Every `runtime_components` event in `logs/run*.jsonl` carried `git={'error': 'FileNotFoundError...'}`. Now reads `GIT_SHA` env first; subprocess fallback preserved for dev-from-source. (src/services/event_log.py)
Dependencies
- psutil added to main deps (~600 KB) for the RAM check. Doctor falls back gracefully if the import ever fails. CLI bundle: 36 MB → 37 MB.
Upgrade
pip install --upgrade financebench-rag-agent
cd ~/.financebench/repo
git pull
docker compose -f compose.minimal.yml up -d --buildVerification
- 19 new doctor unit tests pass
- 307 pre-existing unit tests pass
- `twine check` PASSED on both wheel + sdist
- Fresh-venv smoke test PASSED (37 MB site-packages)
- `financebench doctor --skip-network` runs in ~0.9s on dev machine