Frontier Runner
Customer-side CLI for dbt + Snowflake + GitHub impact assessments.
The runner executes next to the dbt project. It sends metadata and aggregate evidence to Frontier SaaS. Warehouse rows and warehouse credentials stay here.
Supported stack: dbt Core or dbt Fusion, Snowflake, GitHub, and hosted Frontier SaaS. Other warehouses and Git providers are not available in this installer.
Install
pipx install "frontier-runner[snowflake]"
# or
python3 -m pip install "frontier-runner[snowflake]"
frontier --version
Until the package is on PyPI, install the GitHub Release wheel for a version tag. You do not need a commit SHA:
pipx install \ "frontier-runner[snowflake] @ https://github.com/jadsamara/frontier-runner/releases/download/v0.1.1/frontier_runner-0.1.1-py3-none-any.whl"
pipx inject frontier-runner "snowflake-connector-python>=3.12,<4"
First assessment (under 15 minutes)
From the root of an existing dbt project:
frontier signup
frontier login --api-key
frontier init
frontier discover
# review and activate the draft in Frontier
frontier doctor
frontier setup github
Commit .github/workflows/frontier.yml, open a test pull request, and Frontier
posts one PR comment. Then open the hosted assessment and confirm it links to
the pinned semantic manifest.
API keys are stored in the OS keychain (or ~/.config/frontier/credentials
mode 0600). They are never written to frontier.yml, dbt_project.yml,
profiles.yml, Git, or generated workflows.
Developer setup
From this repository:
python3 -m pip install -e ".[dev,snowflake]"
Assessment commands
python3 -m frontier always works after an editable install.
frontier run reads ~/.dbt/profiles.yml (and warehouse env vars such as
SNOWFLAKE_*). This installer supports Snowflake. Use --dry-run to exercise
the CLI without a warehouse.
Entity IDs in frontier-run.json are HMAC-SHA-256 hashed with
FRONTIER_ENTITY_HASH_KEY unless --include-entity-ids is set. The key is
required for hashed output; there is no plain SHA-256 fallback. Rotating the
key changes entity fingerprints across assessments. The hash key is never sent
to SaaS.
frontier prove measures a SQL-change or mutation-repair experiment.
When --base-manifest shows modified, added, or removed SQL, the default
seeds/change_events.csv is ignored: the assessment is the compiled SQL
diff, not a hand-edited event list. Isolated affected keys are written to
DBT_CI.FRONTIER_<run_id>_AFFECTED_KEYS with separate event and
SQL-change origins. The M14 impact query runs in Snowflake and is unioned
for execution. Targeted SQL pushes the key join into source CTEs before
aggregates. Hand-written frontier_affected_customers / repaired models
are not required for a SQL-change proof. Impact compilation skips models
tagged frontier_demo / frontier_mutation and *_after overlays unless
they are the configured target. Candidate discovery never joins
frontier_affected_customers or the isolated keys table; equivalent
predicates from multiple consumers collapse to one query. When candidates
exceed sql_change.rebuild_recommended_pct of the full entity set
(default 75, or FRONTIER_SQL_CHANGE_REBUILD_PCT), the assessment is
FULL_REBUILD_RECOMMENDED instead of an inefficient targeted proof.
When base and PR SQL differ, a
missing or failed impact query is FULL_REBUILD_REQUIRED rather than an
event-only frontier. Customer CI must call prove, not run.
frontier record-failure writes a failed assessment without reading
target/manifest.json or run_results.json. Use it when dbt build fails so CI
cannot upload stale artifacts.
frontier cdc inspect|status|consume|prove|upload reads frontier-cdc.yml in
the dbt project. Inspect prints stream mappings. Status calls
SYSTEM$STREAM_HAS_DATA without consuming. Consume copies pending Snowflake
stream rows into DATA_AGENT_DEV.FRONTIER_CDC control tables inside a
transaction, then normalizes a DELETE/INSERT METADATA$ISUPDATE=TRUE pair
into one UPDATE. A plain SELECT is never treated as consumption. cdc prove
claims the oldest CAPTURED or FAILED batch, routes events to target keys from
the YAML mapping, materializes DBT_DEV.FRONTIER_<batch_id>_AFFECTED_KEYS,
and runs targeted compiled customer_summary SQL against current source
state. The existing mart is the pre-change baseline. Completion requires
routing and validation, not merely stream consumption. A candidate no-op is a
successful conservative assessment. Default prove is assessment-only;
--apply is required to mutate the mart. cdc upload sends aggregate CDC
evidence to SaaS without recapturing or reproving. If a previous COMPLETED
batch was not applied, a later prove fails with BASELINE_STALE. Logs include
stream name, batch id, counts, status, and duration — never entity IDs, row
contents, or credentials. Do not upload raw CDC keys to SaaS. Scheduled CDC
processing is not part of this installer.
frontier compare reads compiled SQL from the base-branch and PR manifests
(and target/compiled / target-base/compiled when compiled_code is
missing), classifies semantic changes with a restricted Snowflake parser
(sqlglot), and compiles supported diffs into a candidate-key impact query.
Alias and formatting changes are ignored. Grain changes, unknown UDFs, empty
compiled SQL, and other unsupported SQL return FULL_REBUILD_REQUIRED
instead of an empty candidate set. frontier prove confirms and repairs using
the production model whose compiled SQL actually changed, not a downstream
mart that only ref()s it. The comparison does not send warehouse rows to
SaaS. inspect, run, and prove accept --base-manifest so artifact
fingerprints, change kinds, and impact status are stored on the uploaded
assessment.
frontier upload posts target/frontier-run.json to POST /api/v1/runs. It
retries HTTP 429/5xx and network errors, and honors Retry-After. SaaS
commands resolve credentials in this order: FRONTIER_API_KEY, the OS
keychain, the 0600 fallback file, then FRONTIER_DEMO_API_KEY only when
FRONTIER_ALLOW_LOCAL_MANIFEST is set outside GitHub Actions. If none are
present, the CLI exits with AUTH_REQUIRED: Run \frontier login --api-key`. Hashed uploads set entityIdsHashed: true`.
In GitHub Actions, assessments use {project}-{GITHUB_SHA} as externalRunId
and record repository, branch, commit, and PR number. After a successful
upload the runner upserts one pull-request comment (aggregates only, plus a
dashboard /runs/<id> link). GITHUB_TOKEN stays in the customer job.
FRONTIER_DRY_RUN=true is only for the SaaS fixture self-test and is rejected
by frontier prove in GitHub Actions. Customer CI must execute against the
live warehouse. Uploaded assessments set runMode to live or fixture.
frontier upload --blocking (or FRONTIER_BLOCKING=true) uploads and comments
first, then exits 1 if the assessment failed. The generated first-verification
workflow uses FRONTIER_BLOCKING=false unless you pass --blocking.
Releases
Pin an immutable released version:
pip install "frontier-runner[snowflake]==0.1.1"
Until PyPI trusted publishing is reviewed and live, install the GitHub Release wheel for the same version tag. Do not look up a runner Git SHA.
Do not pip install ./runner from a dbt repository. That path exists only in
the SaaS monorepo.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file frontier_runner-0.1.1.tar.gz.
File metadata
- Download URL: frontier_runner-0.1.1.tar.gz
- Upload date:
- Size: 121.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96de0780963584288d7aa079ac73a371d4ccbd3c8146e1c5e7149179c8837cd5
|
|
| MD5 |
fd39d33b0dc12e127bdd4b00ca9eeafb
|
|
| BLAKE2b-256 |
e89f43ced341de40e0846bb24f0f91b2b8a1c79037df7598d2adfad2f3d43576
|
Provenance
The following attestation bundles were made for frontier_runner-0.1.1.tar.gz:
Publisher:
publish.yml on jadsamara/frontier-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
frontier_runner-0.1.1.tar.gz -
Subject digest:
96de0780963584288d7aa079ac73a371d4ccbd3c8146e1c5e7149179c8837cd5 - Sigstore transparency entry: 2734237042
- Sigstore integration time:
-
Permalink:
jadsamara/frontier-runner@7a6c39d2dd2c6477b774c945ec6c2a7a47179b7b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jadsamara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7a6c39d2dd2c6477b774c945ec6c2a7a47179b7b -
Trigger Event:
push
-
Statement type:
File details
Details for the file frontier_runner-0.1.1-py3-none-any.whl.
File metadata
- Download URL: frontier_runner-0.1.1-py3-none-any.whl
- Upload date:
- Size: 141.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c09f3941a449817b8ebed6d8d10d6bdb360477978a3bc2915424290d864ca8f
|
|
| MD5 |
9dca6917cbe8f8ba3e751eb921f70c14
|
|
| BLAKE2b-256 |
c8069106ffb65f55ba972f9b2ee805e5a5a4bffd51c39d07753504b2ffb35e63
|
Provenance
The following attestation bundles were made for frontier_runner-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on jadsamara/frontier-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
frontier_runner-0.1.1-py3-none-any.whl -
Subject digest:
2c09f3941a449817b8ebed6d8d10d6bdb360477978a3bc2915424290d864ca8f - Sigstore transparency entry: 2734237102
- Sigstore integration time:
-
Permalink:
jadsamara/frontier-runner@7a6c39d2dd2c6477b774c945ec6c2a7a47179b7b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jadsamara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7a6c39d2dd2c6477b774c945ec6c2a7a47179b7b -
Trigger Event:
push
-
Statement type: