A by-hand checklist to answer one question: can a typical user — a data engineer who is NOT a sqlanvil contributor — install, configure, author, and run a sqlanvil project on Postgres/Supabase, with clear errors and docs?
This is deliberately not the automated test suite. Run it yourself, as a new user would, on real infrastructure. For each item: do the action, confirm the pass criteria, record the result.
2026-06-04 — Linux (Docker node:20) + published @sqlanvil/cli@1.0.0 + real Supabase: PASS.
Validated as a real user, no repo checkout:
- Install
npm i -g @sqlanvil/cli;sqlanvil --version→sqlanvil 1.0.0 (Dataform core 3.0.59)(globalbinworks, nonpxneeded). sqlanvil init my_proj --warehouse supabase→ correct scaffold (warehouse, creds template, gitignore, definitions tree).compileon a fresh project fetched@sqlanvil/core@1.0.0from npm and compiled — the pre-publishsqlanvilCoreVersiondead-end is gone.runagainst a real Supabase project (session pooler, IPv4) created table, incremental (+PK), view, materialized view, operation/function, and an assertion — all succeeded.- Idempotency: identical second
run— no duplicate-PK error, matview refreshed in place — confirms thedataformVersioncapability gate works in the shipped build. - Error clarity: wrong password →
password authentication failed for user "postgres"(clear). - Finding (folded into
getting-started-supabase.md): the Supabase pooler host must be copied verbatim — theaws-0-/aws-1-prefix + region slug aren't guessable; a constructed host fails withtenant ... not found.
2026-06-04 — Windows 11 (PowerShell) + published @sqlanvil/cli@1.0.1 + real Supabase: PASS.
Clean Win11 box, no repo:
npm i -g @sqlanvil/cli;sqlanvil --version→sqlanvil 1.0.1 (Dataform core 3.0.59)(globalsqlanvil.cmdshim works in PowerShell).init --warehouse supabase, edited.df-credentials.json, authored a model (PowerShell here-string,ascii— no BOM issue),compile→ 1 action,run→Table created: sqlanvil.helloagainst real Supabase (IPv4 pooler). Paths / args /--credentialsrelative resolution all fine.- 1.0.1 fixes verified on Windows: arg-order (
init --warehouse X DIRno longer crashes); and fail-fast — a wrong password yields one cleanCould not connect to Supabase Postgres at <host>:<port> as "<user>": password authentication failed(with host/user context) instead ofECIRCUITBREAKER, and a correct-password retry works immediately (no pooler lockout).
Still to validate: plain postgres (non-Supabase) path, BigQuery path.
- A clean machine (or container) with no sqlanvil checkout — for the install test.
- A local Postgres you control (e.g.
./tools/postgres/run-postgres-db.sh, or any local PG). - A real cloud Postgres (managed PG) — optional but recommended.
- A real Supabase project (free tier is fine) — to test the Supabase path for real.
- Node.js installed.
If any of these fail, a typical user is blocked before they start. Stop and fix before release.
- CLI installs without building from source.
@sqlanvil/cli@1.0.0+@sqlanvil/core@1.0.0published to npm 2026-06-04;npm i -g @sqlanvil/cliworks on a clean machine. - The
init→compile→rungolden path works on a freshly-init'd project with zero manualnode_modulessurgery. Validated 2026-06-04 (see Results log):compilefetches@sqlanvil/core@1.0.0from npm and runs end-to-end against real Supabase. - A quickstart doc exists matching the published reality —
getting-started-supabase.md(install → init → connect → first table).
- Install per the published quickstart;
sqlanvil --versionandsqlanvil helpwork. -
sqlanvil help init/help run/help compileare accurate and readable. - First command run prints something sensible (not a stack trace) when given no/early args.
-
sqlanvil init my_proj --warehouse postgrescreates:workflow_settings.yaml(warehouse: postgres,defaultDataset,defaultAssertionDataset), a.df-credentials.jsontemplate, a.gitignorethat excludes the credentials file, and adefinitions/structure. - Generated files are readable and obviously editable — a user understands what to fill in.
-
sqlanvil init my_proj --warehouse supabase→ credentials template usessslMode: requireand adb.<project-ref>.supabase.cohost placeholder. - BigQuery (default) still requires a project + location; omitting them gives a clear error.
- Arg order: confirm whether
sqlanvil init my_proj --warehouse postgresworks andsqlanvil init --warehouse postgres my_projworks. (Known rough edge — option-before-positional currently errors. A typical user will try both.)
- Fill
.df-credentials.jsonfor your real Postgres; the connection test succeeds. - Supabase: point at a real project —
db.<ref>.supabase.co, port5432(also try6543pooler), userpostgres,sslMode: require. It connects. - Wrong password / unreachable host / bad sslMode → a clear, actionable error, not a raw stack trace.
- Editing
.df-credentials.jsonwith a stray comment or trailing comma fails with a readable message (the parser is strict — no comment keys).
- Declaration for an existing source table;
${ref("source")}resolves and shows in the DAG. - Table (from a source or
VALUES);run; verify the rows land inpsql/ the Supabase table editor. - View, and a materialized view (
type:"view", materialized:true) — confirm it's a real matview (\dm/pg_matviews), and that re-run refreshes it. - Incremental with
uniqueKey;runtwice — the second run appends/upserts without error; a PK added viawhen(!incremental())does not re-run. -
postgres: { fillfactor, indexes: [...] }— verify the index and storage option exist (\d+). -
description+columns: {}— verifyCOMMENTs show in\d+/ the dashboard. - Assertions (
uniqueKey/nonNull/rowConditions): a clean dataset passes; a deliberately-bad one fails clearly, naming the offending assertion. - Operation creating a function/procedure with a
$$ ... $$body and---separators — runs intact;CALL/SELECT fn()works. -
compileoutput (and--json) is readable and reflects the dependency graph.
- Subsetting:
--actions <name>,--include-deps,--tags <tag>run the expected subset. -
--full-refreshrebuilds an incremental from scratch. -
--schema-suffix devwrites to a suffixed schema; declarations are not suffixed (sources still read from their real location) — confirm a dev run reads prod sources, writes dev output. - A SQL syntax error surfaces clearly at run time (reminder: there is no Postgres
--dry-run/validate yet — errors only appear onrun). Is the message good enough? - Editing a model and re-running picks up the change.
- A mid-run failure (e.g. one model errors) leaves a sane, understandable state.
- A new user can follow the quickstart start-to-finish without insider knowledge.
- Docs/README match actual CLI flags and output.
- Error messages point to a next step (fix creds, run
help, etc.).
-
rlsPolicyaction — create a policy and confirm it enforces (rows filtered for theauthenticatedrole). -
realtimePublication,vectorIndex,wrapperas your use case needs. - Results are visible/queryable from the Supabase client SDK as expected.
These are the things most likely to trip a real user — confirm each is acceptable or fix before release:
Publishing not done— resolved 2026-06-04:@sqlanvil/{cli,core}@1.0.0published; thenpm install → init → compile → rungolden path is validated (see Results log).— resolved 2026-06-04 (ships in 1.0.1): the globalinitarg ordercommon/flagsparser threwArg neither flag name nor flag valueon a positional after a flag, crashing the CLI; it now ignores non-flag args. Bothinit <dir> --warehouse Xandinit --warehouse X <dir>work. Regression-tested incommon/flags/index_test.ts..df-credentials.jsonis strict JSON — comment keys / trailing commas are rejected. Templates and docs must be comment-free, and the error should be readable.- No Postgres
--dry-run/validate— SQL errors only surface atruntime. Make sure runtime error messages are good (this is the nice-to-havesqlanvil validateitem). .df-credentials.jsonkeeps the legacydfname — cosmetic, but a user may find it odd in a tool called sqlanvil.Connection failures fan out and trip Supabase's circuit breaker.— resolved 2026-06-04. Adaptercreate()now probes a single connection (pool.connect+select 1) and fails fast before any parallel fan-out, so a bad credential yields one clean error and can't trip Supavisor'sECIRCUITBREAKER. Implemented for both Postgres and Supabase adapters; integration- tested inpostgres.spec+supabase.spec. (Found during the wrong-password error-clarity test.)
MVP is real-user-ready when Section 0 passes and Sections 1–6 pass on at least one real Postgres and one real Supabase project, with no step requiring insider/contributor knowledge.