Use plain, complete English. Lead with the measured result and what it means for the analyst's capability. Preserve required behavior and checks.
BackIntel is an experimental data-analyst agent, versioned from v0.0.1 by owner decision
on 2026-11-11. It currently answers individual questions and runs historical standing-report
replays. An opt-in specialist now builds local report/chart/workbook bundles; its live-model
acceptance remains open. Durable background scheduling and hosted delivery are roadmap work.
The historical branch name (codex/backintel-v2) identifies this rebuild, not product stability;
the earlier implementation remains in Git history and is not imported.
The build order is deliberate (owner decision, 2026-11-09): benchmark first, agent second, infrastructure last. The agent's value is measured, not asserted.
src/backintel/agent.py: one Deep Agents lead (create_deep_agent), no sub-agents. Add a sub-agent only when a LangSmith trace shows a specific failure and a before/after experiment improves the score; keep it only if the score stays better. Number checking is code, never another model.- Tools (
tools.py):list_tables,describe_table,run_sqlorrun_query(read-only, 200-row cap),run_python(SmolVM sandbox, no network, read-only data mount). Skills inagent_files/skillsare loaded on demand through the Deep Agents skills middleware;agent_files/lead.mdis the system prompt. analysis.py: an opt-in, single specialist graph with a structured business brief, persistent SmolVM shell/Python workspace and bounded artifact output.analysis_sandbox.pyenforces runtime limits;artifacts.pyrenders tables, charts and sheets. A clean second VM renders the retained specification for delivery. Readdocs/specialist-default.mdanddocs/sandbox-environment.md. Owner-selected specialist default:chatgpt-plan/gpt-6.1-sol, medium reasoning. TheanalyzeCLI resolves--model, thenBACKINTEL_ANALYSIS_MODEL, then that built-in default. Scripted integration proves wiring, not live model quality; automatic delegation stays off.presentation/review.py: optional rendered dashboard review after verified export, also available throughdashboard review. Native Anthropic reviewer, existing Sol writer, at most two presentation-only revisions. Host-owned Playwright capture and strict DesignPlan validation preserve numerical tables and chart bindings. Review acceptance is separate from analytical completion. Install dashboard/dashboard-review extras and Chromium; no browser capability is added to the offline analytical VM.- Contract (
contracts.py): the analyst returns anAnalystAnswerwithevidence(the exact SQL or Python that produced the number),methodandcaveats. Code re-executes the evidence; an answer that cannot be reproduced from its evidence is scored as unsupported. - Stores (
stores/):sqlite,postgres,ferretdb(native aggregation JSON),lake-iceberg(DuckDB over Iceberg metadata and Parquet on Garage S3),clickhouse,files(CSV) andfiles-mixed(CSV/JSON).lake-parquetis a separate local Parquet baseline;multiconnects several stores. Docker services use profiles incompose.yaml. Never load FerretDB during an experiment: loading temporarily thaws its PostgreSQL backend, then freezes it before returning. FerretDB 2.7's declared MongoDB read role does not enforce read-only access; the frozen backend does. Seedocs/benchmark.md. - Benchmark (
bench/): datasets are downloaded by script with pinned checksums and never committed;oracle/computes reference answers with polars over canonical Parquet, independently of any store, intobenchmarks/answers/*.json;scoring.pyandjudge.pyscore;run.pyruns scenarios locally or as LangSmith experiments;scorecard.pyaggregates intoresults/scorecard.md. - Models (
models.py):openrouter/<vendor>/<model>(OpenAI, Anthropic, Google only, per the technology-selection policy),chatgpt-plan/<model>(operator's ChatGPT plan afterbackintel chatgpt login),openai/<model>. The judge is a different model family from the analyst.
- Python with
uv; configuration from Doppler projectbackintel(doppler run -p backintel -c dev -- uv run backintel ...). No.envfiles. Never print or commit credentials. - Lint:
uv run ruff check src tests scripts; format:uv run ruff format src tests scripts; tests:uv run pytest -q. Tests never call a model provider. - Datasets, SQLite files, Parquet and raw results stay out of Git (
.gitignore). Commit download scripts, checksums, reference answers and scorecards. - Scenario references and tolerances are evaluator-owned: existing cases live in
benchmarks/answers, controlled development/reserved cases inbenchmarks/acceptance, and frozen comparison selections inbenchmarks/improvement. The analyst sees only its question and bound store through its tools. Keep dataset-specific hints and reference answers out of runtime skills and coding-worker inputs: the benchmark measures discovery. - Record every experiment's model, source/reference hashes, method version (prompt and skills), sandbox backend and git SHA; they are in each record and in the scorecard.
- A low score is a finding. A broken runner, a skipped store, or a fabricated result is unfinished work. Mark local verification, measured results and planned behavior separately in any summary.
- Linear project BackIntel (team
INT) owns status and priority; GitHub owns code, PRs and CI; this repository's Markdown owns specs and evidence, never status. - Ask the owner before any commit or push, and before any deployment or cloud resource.
- Single table. 2. Joins and multi-step. 3. Messy data and unanswerable questions.
- Cross-store: Olist split into
postgres:olist_ordersandsqlite:olist_catalog(backintel split build), run with--store multi:postgres:olist_orders+sqlite:olist_catalog. - Standing problems:
reportanswers with one metric per row; facts are scored by metric and value, the story by the judge. - Ambient replay:
backintel replay buildwrites Olist snapshots for monthly delivery, quarterly repeat-purchasing and weekly category/seller reviews. Future observations are hidden; planting is declared inbench/replay.py. Each scenario binds its immutable snapshot store. - Scale: TPC-H generated with DuckDB (
backintel tpch generate --sf 1) and queried as a lake. Scale factors above 1 belong on the Windows desktop.
Production hosting, web UI, live scheduling, customer integrations, Infrastructure Engine enrollment and scale factors above 1. The public-benchmark comparison in INT-399 is separate from this execution goal; these results do not establish external leaderboard performance.