Senmi Rai
03/10/2026, 5:21 PMkapa.ai
03/10/2026, 5:21 PMdbt_models, dbt_tests, or other dbt_artifacts tables), especially on BigQuery and in orchestrated environments like Airflow/dbt Cloud. [BQ concurrency; Concurrent DBT jobs]
Typical message (BigQuery example):
> Transaction is aborted due to concurrent update against table project`:elementary.dbt_models`
This happens when multiple dbt runs (or DAGs) execute Elementary’s on-run-end hooks or dbt_artifacts models concurrently, so two transactions try to mutate the same table and BigQuery (or another warehouse) aborts one. [BQ concurrency; Issue 1766]
Mitigations / workarounds from the knowledge sources
1. Avoid concurrent Elementary writes (recommended pattern)
◦ Disable automatic dbt artifacts upload in hooks:
vars:
disable_dbt_artifacts_autoupload: true
[BQ concurrent runs]
◦ Then run a single, dedicated job after your main pipelines:
dbt run -s elementary
or
dbt run --select elementary
This centralizes all Elementary artifact updates into one non-parallel step, preventing concurrent updates to tables like dbt_models / dbt_tests. [Airflow concurrency thread; BQ concurrent runs]
2. Serialize dbt jobs that run Elementary hooks
If you must keep hooks enabled, use your orchestrator to ensure only one job that runs Elementary hooks is active at a time (e.g., Airflow pool with 1 slot for dbt+Elementary tasks). This has been confirmed to stop the error in practice. [BQ concurrency thread; Airflow/BQ error]
3. dbt Cloud / general concurrent jobs
For dbt Cloud or any environment with many concurrent dbt jobs, this is acknowledged as a known limitation; the recommended direction is again to avoid parallel writes to Elementary tables (via the patterns above). [dbt Cloud concurrency]
If you share your warehouse (BigQuery, Databricks, Spark, etc.) and how you orchestrate dbt (Airflow, dbt Cloud, Cosmos), I can point you to the most relevant of these patterns. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/10/2026, 5:22 PMkapa.ai
03/10/2026, 5:22 PMvars:
disable_dbt_artifacts_autoupload: true
This stops the on-run-end hook from mutating the heavy dbt_artifacts tables (like dbt_models, dbt_sources, dbt_tests) on every dbt run, which is where most BigQuery transaction conflicts occur. [Disable autoupload]
Then, run artifacts in a single, non-parallel job (e.g. a dedicated Airflow task/DAG):
dbt run --select elementary.edr.dbt_artifacts
# or simply
dbt run -s elementary
Do this after your main dbt DAGs finish, or on deploy / on a schedule. This centralizes all artifact updates into one transaction stream and removes concurrent updates. [Disable autoupload workaround; Airflow hook discussion]
Note: this only disables artifacts upload; test results and invocation uploads are controlled by other vars and can remain enabled. [Artifacts vs invocations]
-------------------------
2. Serialize dbt+Elementary jobs via Airflow pools
If you keep hooks enabled, you can avoid conflicts by ensuring only one dbt run that executes Elementary hooks is active at a time:
• Put all dbt tasks that run with Elementary hooks into an Airflow pool with slots=1.
• Other non-Elementary tasks can use different pools.
Users have confirmed that serializing these jobs via an Airflow pool removes the BigQuery “transaction aborted due to concurrent update” errors. [BQ concurrency + Airflow pool]
-------------------------
3. Cosmos / per-model tasks (if applicable)
If you’re using Astronomer Cosmos to map each dbt model to an Airflow task, Elementary strongly recommends:
• Do not let every per-model task run the Elementary on-run-end hook.
• Instead:
◦ Disable artifact autoupload as above.
◦ Add a single downstream task/DAG that runs:
dbt run -s elementary
after all parallel model tasks complete. [Cosmos concurrency guidance; Airflow/Cosmos summary]
-------------------------
4. What this means in practice for your setup
For BigQuery + Airflow, the safest and most common pattern from the sources is:
1. Set in `dbt_project.yml`:
vars:
disable_dbt_artifacts_autoupload: true
2. In Airflow:
◦ Let your normal dbt DAGs (models/tests) run in parallel as needed.
◦ Add a separate DAG or final task that runs:
dbt run -s elementary
using a pool or configuration that ensures it runs alone (no other dbt+Elementary jobs at the same time).
This combination is what has resolved the BigQuery “transaction is aborted due to concurrent update” errors for other users in similar environments. [BQ concurrent runs; Airflow + BQ error]
If you share a bit about how your Airflow DAGs are structured (single big dbt run vs many small runs / Cosmos), I can suggest a concrete DAG pattern based on these recommendations. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/10/2026, 5:25 PMkapa.ai
03/10/2026, 5:25 PMdbt run per DAG, or many small runs?
◦ Are you using Cosmos (DbtTaskGroup / DbtLSOperator) so that each model is its own Airflow task? [Cosmos concurrency]
2. Where Elementary hooks are running
◦ Are Elementary’s on-run-end hooks enabled on every dbt command?
◦ Have you already set:
vars:
disable_dbt_artifacts_autoupload: true
in dbt_project.yml, or not yet? [Disable autoupload]
3. Concurrency pattern in Airflow
◦ How many dbt tasks can run in parallel (DAG-level concurrency, pools, queues)?
◦ Are multiple DAGs with dbt+Elementary running at the same time? [BQ concurrency + pools]
4. Which Elementary tables are failing
◦ Exact error text and table name: dbt_models, dbt_tests, dbt_sources, or dbt_run_results?
This matters because:
▪︎ dbt_artifacts tables (e.g. dbt_models) are the main source of conflicts and are controlled by disable_dbt_artifacts_autoupload. [Artifacts concurrency]
▪︎ Result tables like dbt_run_results / elementary_test_results are append-only and trickier to batch. [Cosmos batching discussion]
5. Whether you already run a separate Elementary job
◦ Do you currently have a dedicated task/DAG that runs:
dbt run -s elementary
after your main dbt runs, or is everything happening only via hooks? [Single artifacts job]
With those details, we could map you to one of the documented patterns (e.g., “disable autoupload + single dbt run -s elementary DAG” vs. “serialize dbt+Elementary tasks via an Airflow pool”) in a very concrete way. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/10/2026, 5:28 PMvars:
disable_dbt_artifacts_autoupload: true
I have only made it that "dbt run --select elementary" runs when ever a new docker image is madekapa.ai
03/10/2026, 5:28 PMdbt_artifacts tables (e.g. dbt_models, dbt_tests, dbt_sources) while multiple dbt runs are executing in parallel. [BQ concurrency; Artifacts concurrency workaround]
Running:
dbt run --select elementary
only on new Docker images (i.e., on deploy) is good, but it does not stop the hooks from still trying to update those same tables on every dbt run. To actually remove the conflicting writes, the docs and Slack threads say you should:
1. Disable artifact autoupload in hooks (this is the missing piece in your setup):
# dbt_project.yml
vars:
disable_dbt_artifacts_autoupload: true
This tells Elementary’s on‑run‑end hook to skip updating dbt_models, dbt_tests, dbt_sources, etc. [On‑run‑end docs; BQ concurrent runs]
2. Keep your separate dbt run --select elementary job
What you’re already doing (running dbt run --select elementary on new images) is exactly what Elementary recommends once autoupload is disabled:
> “After disabling the automatic upload, you can run your artifacts update process independently… remember to run dbt run --select elementary.edr.dbt_artifacts whenever you deploy changes to your project…” [BQ concurrent runs]
You can keep it as:
dbt run --select elementary
or narrow it to:
dbt run --select elementary.edr.dbt_artifacts
So, what you still need to do:
• Add:
vars:
disable_dbt_artifacts_autoupload: true
to dbt_project.yml.
• Keep your existing “on new Docker image” job that runs dbt run --select elementary (or elementary.edr.dbt_artifacts).
That combination matches the documented workaround for BigQuery + Airflow concurrency and should significantly reduce or eliminate the “transaction aborted due to concurrent update” errors on the dbt_artifacts tables. [BQ concurrency workaround; Airflow concurrency thread]
If you later still see errors, the next lever (from the sources) would be to serialize dbt+Elementary runs via an Airflow pool, but usually the disable_dbt_artifacts_autoupload change is enough for BigQuery. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/10/2026, 5:33 PMkapa.ai
03/10/2026, 5:33 PMdbt run --select elementary
only when you rebuild the image / deploy is exactly what Elementary suggests for loading artifacts in a single, controlled job. [BQ concurrent runs]
Your (commented) step:
- name: Run DBT Elementary Init
# id: run-dbt-elementary-init-command
# if: needs.find_environments_and_files_to_deploy.outputs.rebuild_image == 'true'
run: |
curl --fail-with-body -d '{"command": "run --select elementary"}' \
-H "Authorization: Bearer ${{ steps.auth-full.outputs.id_token }}" \
-H "Content-Type: application/json" \
-X POST "${{ env.cloudrun_http }}/"
is consistent with that idea: you’re triggering a dbt command that runs all elementary models once per deploy.
2. What’s still missing: disable artifact autoupload in hooks
To actually prevent the “transaction aborted due to concurrent update” errors, the sources say you must also disable automatic artifact uploads in the on‑run‑end hook:
# dbt_project.yml
vars:
disable_dbt_artifacts_autoupload: true
This stops every dbt run from updating dbt_models, dbt_tests, dbt_sources, etc., and leaves your dedicated run --select elementary job as the only process that updates those tables. [Disable autoupload; Airflow/concurrency guidance]
3. Putting it together
◦ In `dbt_project.yml`:
vars:
disable_dbt_artifacts_autoupload: true
◦ In CI/CD (your snippet), keep or re‑enable the “Run DBT Elementary Init” step so that on image rebuild / deploy you call:
dbt run --select elementary
That combination matches the documented workaround: artifacts are no longer written on every run (avoiding concurrent updates), and are instead refreshed in a single, explicit job. [BQ concurrent runs]
If you share how this Cloud Run endpoint executes dbt (e.g., which profile/target), we could double‑check that it’s hitting the same project/warehouse as your Airflow jobs, but the pattern itself is correct per the sources. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/10/2026, 5:34 PMkapa.ai
03/10/2026, 5:34 PMbuild-deploy-datalake.yml), but that you still need to disable Elementary’s artifact autoupload in dbt_project.yml so that this deploy-time run becomes the only place artifacts are written.
From the docs and Slack threads, the recommended pattern for avoiding BigQuery “transaction aborted due to concurrent update” is:
1. In dbt_project.yml, add:
vars:
disable_dbt_artifacts_autoupload: true
This stops the on‑run‑end hook from updating dbt_models, dbt_tests, dbt_sources, etc. on every dbt run. [On‑run‑end docs; BQ concurrency workaround]
2. Keep your deploy-time job in build-deploy-datalake.yml that triggers:
dbt run --select elementary
(or more narrowly dbt run --select elementary.edr.dbt_artifacts) whenever you build/deploy the image. This is exactly what Elementary recommends once autoupload is disabled: run the artifacts models in a single, controlled job on deploy. [BQ concurrency workaround; Airflow concurrency thread]
So your build-deploy-datalake.yml step is in the right place; the key change is to pair it with disable_dbt_artifacts_autoupload: true in dbt_project.yml so that Airflow runs no longer try to update the same Elementary tables concurrently. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 2:03 PMkapa.ai
03/11/2026, 2:03 PMdbt run --select elementary
• If you only want to refresh the artifacts (metadata) tables (like dbt_models, dbt_tests, dbt_sources), you can run just the artifacts sub‑selector:
dbt run --select elementary.edr.dbt_artifacts
This is what Elementary explicitly recommends when you disable autoupload with disable_dbt_artifacts_autoupload: true and want to update artifacts manually on deploys. [On‑run‑end hooks; Slack manual artifacts run]
So:
• If your goal is just to keep project metadata up to date and avoid concurrency issues, you can safely run only elementary.edr.dbt_artifacts.
• If you also want other Elementary models (e.g. metadata_store, result processing models) to run, then keep dbt run --select elementary. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 2:38 PMkapa.ai
03/11/2026, 2:38 PMvars:
disable_dbt_artifacts_autoupload: true
This stops on‑run‑end from updating dbt_models, dbt_tests, dbt_sources, etc. on every run. [On‑run‑end hooks; Control on‑run‑end time]
2. Refresh artifacts whenever your project structure changes (new/changed models, tests, sources, etc.), typically via:
dbt run --select elementary.edr.dbt_artifacts
or
dbt run --select elementary
[Control on‑run‑end time; Slack manual artifacts run]
Your current setup:
• dbt run --select elementary runs only when the Docker image is rebuilt.
• The image rebuild is triggered by changes to packages.yml, Dockerfile, dbt_project.yml, profiles.yml, or deploy scripts.
This is generally acceptable, because:
• Changes to dbt_project.yml or packages.yml usually coincide with project metadata changes, which is exactly when artifacts should be refreshed. [dbt artifacts]
• Elementary only needs the artifacts models run:
◦ On initial install.
◦ On minor package upgrades.
◦ When project structure/config changes. [dbt artifacts]
The only caveat (not explicitly covered but implied by the docs) is:
• If you change only SQL model files or test YAMLs in a way that affects project metadata, and that does not trigger a Docker rebuild in your process, then artifacts would not be refreshed until the next rebuild. The docs say artifacts “only need to be uploaded when your project structure changes,” but they don’t prescribe exactly how you detect that. [Control on‑run‑end time]
So, based on the sources:
• Your pattern (refreshing Elementary on image rebuild) is consistent with the guidance, as long as image rebuilds roughly coincide with schema/config changes.
• To be stricter, you could:
◦ Narrow the command to artifacts only:
dbt run --select elementary.edr.dbt_artifacts
[Slack manual artifacts run]
◦ Or ensure that any change that affects dbt project structure also triggers a rebuild (so artifacts are refreshed promptly).
Functionally, you don’t need to run --select elementary more often than that for concurrency reasons; the important part is pairing this deploy-time run with disable_dbt_artifacts_autoupload: true so regular Airflow runs don’t write to the artifacts tables. [Control on‑run‑end time] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 2:43 PMkapa.ai
03/11/2026, 2:43 PMdbt run --select elementary.edr.dbt_artifacts from an Airflow DAG.
The knowledge sources explicitly recommend disabling artifact autoupload and then running the artifacts models from a separate job (or DAG) at a time you control, including in Airflow:
• Set in `dbt_project.yml`:
vars:
disable_dbt_artifacts_autoupload: true
• Then, in a dedicated job (which can be an Airflow DAG/task), run:
dbt run --select elementary.edr.dbt_artifacts
This pattern is suggested specifically to avoid concurrency issues and to “run your artifacts update process independently whenever you determine is necessary,” which includes orchestrators like Airflow. [Disable autoupload workaround; Manual artifacts run]
So yes: it’s both supported and recommended to schedule that dbt run --select elementary.edr.dbt_artifacts command as an Airflow DAG/task, as your central place to refresh Elementary artifacts. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 2:53 PMkapa.ai
03/11/2026, 2:53 PMdbt_models, dbt_tests, dbt_sources, dbt_exposures, etc. describe what models/tests/sources exist and how they’re configured. If you don’t rerun the artifacts models after changes, these tables will no longer match your real project. [dbt artifacts]
2. Reports and alerts may miss or misrepresent tests/models
Elementary’s reports and alerts are built by joining runtime results (e.g. elementary_test_results) with metadata from artifacts tables (e.g. dbt_tests, dbt_models). If dbt_tests or related tables are empty or outdated, tests may not appear correctly in reports or invocation results. [dbt artifacts; dbt_tests empty discussion]
3. New or changed resources won’t be visible to Elementary
◦ New models/tests/sources won’t show up in dbt_models / dbt_tests / dbt_sources.
◦ Config changes (severity, tags, owners, etc.) won’t be reflected.
Elementary only replaces these metadata tables with the current graph when the artifacts models run. [dbt artifacts]
4. Some logic that depends on “latest project state” will be wrong
The docs emphasize that metadata models “only represent the project state on the latest run.” If you stop updating them, anything that assumes they reflect the latest state (e.g., coverage views, some incident context) will be based on an old snapshot. [on‑run‑end hooks]
5. In extreme cases, tables can be empty after schema refreshes
If your pipeline drops/cleans the schema containing Elementary tables and you don’t rerun dbt run --select elementary (or at least elementary.edr.dbt_artifacts), tables like dbt_tests can end up empty, and then tests won’t appear at all in results or reports. [dbt_tests empty discussion]
What does still work without artifacts updates:
• Runtime tables like dbt_run_results, elementary_test_results, dbt_invocations can still be populated by the on‑run‑end hooks, even if you disable artifact autoupload; you only lose the automatic project metadata refresh, not the run results themselves. [on‑run‑end hooks]
In practice, the guidance is:
• It’s fine not to update artifacts on every run, but you should update them whenever your project structure/config changes (e.g., on deploy) using something like:
dbt run --select elementary.edr.dbt_artifacts
especially if you’ve set disable_dbt_artifacts_autoupload: true. [on‑run‑end hooks; manual artifacts run]
👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 2:57 PMkapa.ai
03/11/2026, 2:57 PMdbt run --select elementary.edr.dbt_artifacts does not require the Elementary CLI to be installed.
That command is a dbt command that runs models from the Elementary dbt package inside your dbt project. It only requires:
• The Elementary dbt package to be installed in your project.
• A working dbt environment (dbt Core or dbt Cloud) with a valid profile.
The Elementary CLI (edr ...) is a separate Python package used for reports, monitoring, and alerts, and is not needed to run dbt run or the elementary.edr.dbt_artifacts models. [Generate report guide; Elementary in production] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 3:17 PMdbt run --select elementary.edr.dbt_artifacts prevent the concurrent transaction error?kapa.ai
03/11/2026, 3:18 PMdbt run --select elementary.edr.dbt_artifacts
Here’s how that combination helps, based on the sources:
1. What causes the error
The BigQuery error:
> Transaction is aborted due to concurrent update against table project`.elementary.dbt_models`
happens when multiple dbt runs finish at the same time and each run’s Elementary on-run-end hook tries to update the same artifacts tables (dbt_models, dbt_tests, dbt_sources, etc.) concurrently. [BQ concurrent runs]
2. Step 1 – Disable artifact autoupload in hooks
You configure:
vars:
disable_dbt_artifacts_autoupload: true
This tells Elementary’s on-run-end hook to skip the artifacts update step (the part that writes to dbt_models, dbt_tests, dbt_sources, etc.). The hooks still run, but they no longer perform that heavy, conflict‑prone metadata update. [On‑run‑end hooks; BQ concurrency workaround]
As a result, your normal dbt runs (including many in parallel) stop writing to those artifacts tables, which removes the main source of concurrent updates.
3. Step 2 – Centralize artifacts updates in one job
After disabling autoupload, Elementary recommends that you update artifacts manually when needed, for example:
dbt run --select elementary.edr.dbt_artifacts
run as a single job (e.g., a dedicated Airflow task or CI step) at a time you choose—typically on deploy or on a schedule. [On‑run‑end hooks; Reduce on‑run‑end time; BQ concurrency workaround]
Because this job is not run in parallel with other artifact‑writing jobs, there is no competing transaction trying to update dbt_models / dbt_tests at the same time—so the BigQuery “transaction aborted due to concurrent update” error no longer occurs for those tables.
So, to answer your question precisely:
• dbt run --select elementary.edr.dbt_artifacts does not inherently make updates “safe”.
• It prevents the concurrent transaction error when used as the only way artifacts are updated, after you’ve disabled automatic artifact uploads in the hooks. That design ensures there is just one controlled writer to the artifacts tables instead of many concurrent writers. [BQ concurrent runs; Airflow/concurrency guidance] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 3:37 PMkapa.ai
03/11/2026, 3:37 PMdbt_models, dbt_tests, dbt_sources, etc.:
vars:
disable_dbt_artifacts_autoupload: true
[BQ concurrent runs]
2. Have exactly one job that updates artifacts, e.g. a dedicated DAG/task that runs:
dbt run --select elementary.edr.dbt_artifacts
and make sure this job is not competing with any other job that also updates those tables. [Disable autoupload workaround; Airflow concurrency guidance]
So if your new DAG:
• Runs dbt run --select elementary.edr.dbt_artifacts, and
• Other dbt runs (with hooks still updating artifacts) can run at the same time,
then you still have multiple writers and can still hit the BigQuery “transaction is aborted due to concurrent update” error.
To align with the documented workaround:
• Set disable_dbt_artifacts_autoupload: true so normal runs don’t update artifacts.
• Use your separate DAG as the only place that runs dbt run --select elementary.edr.dbt_artifacts, and schedule/serialize it so it doesn’t overlap with any other artifacts-writing process. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/11/2026, 4:12 PMkapa.ai
03/11/2026, 4:13 PMdbt_models, dbt_tests, dbt_sources, dbt_exposures, dbt_metrics, dbt_snapshots, dbt_seeds, dbt_columns, dbt_groups) are dbt models in the Elementary package. They are populated either:
◦ by the on-run-end hook when artifact autoupload is enabled, or
◦ when you explicitly run the models, e.g. dbt run --select elementary.edr.dbt_artifacts. [dbt artifacts]
• These metadata tables are “regular tables” that Elementary updates via truncate and insert when those models run. [On‑run‑end hooks]
The knowledge sources do not mention any other writers (e.g., dbt core itself or other packages) updating these Elementary artifacts tables. All described writes come from:
1. Elementary’s on-run-end hooks (when not disabled), and
2. Manual runs of the Elementary artifacts models (dbt run --select elementary or --select elementary.edr.dbt_artifacts). [On‑run‑end hooks; dbt artifacts]
So, if you disable artifact autoupload and only run elementary.edr.dbt_artifacts in a single controlled job, that job should be the only thing writing to those artifacts tables. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:03 PMkapa.ai
03/30/2026, 8:03 PMdbt_models, dbt_tests, dbt_sources, dbt_exposures, dbt_metrics, dbt_snapshots, dbt_seeds, dbt_columns, dbt_groups
This is the narrower, recommended command when you've disabled autoupload and just want to keep project metadata current. [dbt artifacts; Slack manual artifacts run] dbt run --select elementary This runs all Elementary models, which includes:
• The artifacts/metadata models (same as above), plus
• Other Elementary models (e.g. result processing models, metadata store, etc.)
This is the broader command, typically used on first install or after a minor version upgrade of the Elementary package when schema changes may affect more than just the artifacts tables. [dbt artifacts; Slack when to run elementary] Which should you use? • If your goal is just to keep project metadata up to date and avoid concurrency issues → use elementary.edr.dbt_artifacts (narrower, faster).
• If you are installing Elementary for the first time or upgrading to a new minor version → use --select elementary to ensure all model/schema changes are applied. [dbt artifacts]
In your specific case (deploy-time refresh to avoid BigQuery concurrent update errors), dbt run --select elementary.edr.dbt_artifacts is sufficient. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:11 PMkapa.ai
03/30/2026, 8:11 PMdisable_dbt_artifacts_autoupload: true is already set, the key things to be aware of are: 1. Artifacts must be run manually to populate metadata tables Since autoupload is off, the artifacts tables (dbt_models, dbt_tests, dbt_sources, etc.) will only be populated when you explicitly run:
dbt run --select elementary.edr.dbt_artifacts
or
dbt run --select elementary
If this hasn't been run in your dev environment, those tables will be empty or stale, and Elementary reports/alerts won't reflect your current project structure. [dbt artifacts; BQ concurrency workaround] 2. Recommended approach for dev-only setup • Run dbt run --select elementary once on initial setup to initialize all Elementary models and tables.
• After that, run dbt run --select elementary.edr.dbt_artifacts whenever your project structure changes (new models, tests, sources, config changes). [dbt artifacts]
• Since you're only in dev (single environment, likely no parallel runs), concurrency is less of a concern — but keeping autoupload disabled and running artifacts manually is still the cleaner pattern. 3. When you move to production When you eventually deploy to production (with Airflow + BigQuery), the pattern you've already discussed applies:
• Keep disable_dbt_artifacts_autoupload: true.
• Run dbt run --select elementary.edr.dbt_artifacts in a single, controlled job (e.g., on deploy or via a dedicated Airflow DAG/task), not in parallel with other dbt jobs. [BQ concurrent runs]
The knowledge sources don't provide specific guidance for a dev-only scenario beyond this, so I'd recommend following the same pattern you've already established — it's consistent with Elementary's documented approach. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:17 PMkapa.ai
03/30/2026, 8:17 PMdbt_models – metadata about all models in your project
• dbt_tests – metadata about all tests
• dbt_sources – metadata about all sources
• dbt_exposures – metadata about exposures
• dbt_snapshots – metadata about snapshots
• dbt_seeds – metadata about seeds
If artifacts have been uploaded successfully, these tables should contain rows reflecting your current dbt project structure. If they are empty or show a stale generated_at timestamp, artifacts have not been uploaded (or not recently). [dbt artifacts; package models]
A quick check would be:
SELECT COUNT(*), MAX(generated_at) FROM <your_elementary_schema>.dbt_models;
SELECT COUNT(*), MAX(generated_at) FROM <your_elementary_schema>.dbt_tests;
• If COUNT(*) is 0 → artifacts have not been uploaded.
• If generated_at is old → artifacts are stale and need to be refreshed with dbt run --select elementary.edr.dbt_artifacts.
The generated_at column is present on all metadata tables and represents the last update time, so it's a reliable indicator of when artifacts were last uploaded. [dbt_models schema; dbt_seeds schema] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:44 PMkapa.ai
03/30/2026, 8:44 PMSELECT COUNT(*), MAX(generated_at) FROM <your_elementary_schema>.dbt_models;
Based on the output:
• f0_ = 2136 → There are 2,136 rows in the table, meaning artifacts have been uploaded and dbt_models is populated.
• f1_ = 2026-03-30 1942*24* → The last upload was on March 30, 2026 at 19:42 UTC.
This confirms that your artifacts have been uploaded and the metadata tables are populated. [dbt_models schema]
You can do the same check on dbt_tests and dbt_sources to confirm those are also up to date:
SELECT COUNT(*), MAX(generated_at) FROM <your_elementary_schema>.dbt_tests;
SELECT COUNT(*), MAX(generated_at) FROM <your_elementary_schema>.dbt_sources; 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:45 PMkapa.ai
03/30/2026, 8:46 PMgenerated_at of 2026-03-30, your artifacts are currently populated. However, whether you need to manually update them going forward depends on your setup:
Yes, you still need to manually update artifacts when your project structure changes, because you have disable_dbt_artifacts_autoupload: true set (or plan to set it). This means the on-run-end hook will no longer automatically refresh those tables.
From the docs, you should run:
dbt run --select elementary.edr.dbt_artifacts
whenever:
• You add or remove models, tests, or sources
• You change configurations (severity, tags, owners, etc.)
• You upgrade to a new minor version of the Elementary package
[Control on‑run‑end time; dbt artifacts]
You do not need to run it on every dbt run — only when your project structure actually changes. Since your current setup already triggers dbt run --select elementary on Docker image rebuilds (which are tied to changes in dbt_project.yml, packages.yml, etc.), that should cover most cases where a metadata refresh is needed. [Slack manual artifacts run]
The risk of not updating is that Elementary reports and alerts may show outdated or missing models/tests if your project changes but artifacts aren't refreshed. [dbt artifacts] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
03/30/2026, 8:47 PMkapa.ai
03/30/2026, 8:47 PMMAX(generated_at) value returned from your dbt_models table. 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.Senmi Rai
04/01/2026, 6:54 PMkapa.ai
04/01/2026, 6:54 PMdbt run --select elementary.edr.dbt_artifacts
in these situations:
• On initial install of the Elementary package
• After minor package upgrades
• When project structure/config changes, such as:
◦ Adding or removing models, tests, or sources
◦ Changing configurations (severity, tags, owners, etc.)
[dbt artifacts; Control on‑run‑end time]
For most teams, this means running it on deploy (e.g., when merging to main), which aligns with your current setup of triggering it on Docker image rebuilds. You do not need to run it on every dbt run or on a recurring hourly/daily schedule unless your project structure changes frequently. [Control on‑run‑end time] 👍 0 button 👎 0 button ℹ️ Tip: Mention @elementary.ai in the thread for follow-ups or DM the app for 1-to-1 help.