Open-source AI layer for governing, validating, and safely shipping data-orchestration jobs (Databricks, Airflow, dbt, Snowflake Tasks) with Claude Code
Project description
jobwright
An open-source AI layer for governing, validating, and safely shipping data-orchestration jobs with Claude Code.
jobwright treats your jobs — Databricks Jobs, Airflow DAGs, dbt jobs, Snowflake Tasks — as deployable artifacts that deserve a governed lifecycle: a catalog you can recall before you rebuild, architecture-compliance scanning, a per-job validation gate, and a deploy-safety guard that prompts for confirmation before known destructive commands (so a stale-definition overwrite can't happen unattended).
It is the third in a family of Claude Code "AI layer" kits:
| Kit | Domain |
|---|---|
| ticketwright | ticket-driven data work (plan → implement → validate) |
| streamsnow | Streamlit-in-Snowflake apps (build → govern → ship) |
| jobwright | data-orchestration jobs (govern → validate → safely ship) |
Complementary, not overlapping with ticketwright. ticketwright's Databricks adapter is about querying a warehouse while doing a ticket. jobwright is about the jobs themselves — their definitions, architecture compliance, and safe deploy. ticketwright's "pause before any prod job deploy" gotcha is exactly the hand-off point to jobwright's
diff-job+ deploy-safety guard.
Why
- A deploy-safety guard. A
PreToolUsehook asks for confirmation before destructive orchestration commands (databricks jobs reset/delete,airflow dags delete,DROP TASK, …) and before destructive warehouse SQL — including SQL hidden in a-ffile. Onapi-resetplatforms it specifically blocks a reset from a possibly-stale repo definition until you've run a live-vs-repo diff. This turns a prose rule into a runtime gate. - A jobs index. A deterministic
JOBS.md+OBJECTS.mdover every job in the repo — ticket, purpose, schedule, owner, status, and architecture-compliance flags — so you (and the agent) recall prior work before rebuilding, and see migration debt at a glance. - Architecture compliance. A static scan of job code for deprecated-schema references and layer-referencing violations, driven by config — no database connection.
- Per-job validation. A local PASS/FAIL gate that runs the same checks your CI does, scoped to one job.
Two seams
jobwright has two orthogonal abstraction axes, expressed as two config blocks:
- platform — the orchestrator a job runs on (
databricks/airflow/dbt/snowflake_tasks/ …). Owns the lifecycle verbs. Itsdeploy_model(api-reset|git-sync|sql-ddl) decides whether live-vs-repo drift even applies. - warehouse / architecture — the store a job reads/writes and the static schema-reference rules. Policy only; jobwright never opens a database connection.
The platform seam is pluggable via thin adapters (a Python class implementing the verb contract + a markdown playbook). Shipped adapters span all three deploy models:
| Platform | deploy_model |
Drift detection |
|---|---|---|
| Databricks Jobs (reference) | api-reset |
yes — live can drift from repo |
| Snowflake Tasks | sql-ddl |
yes — live DDL vs repo DDL |
| Apache Airflow | git-sync |
n/a — git is the source of truth |
| dbt | git-sync |
n/a — project is the source of truth |
The generic checks (syntax, deps, architecture, docs) and the deploy-safety guard are platform-agnostic — see examples/ for a Databricks repo and an Airflow + BigQuery repo. Adding a platform is two files (a JobPlatformAdapter subclass + a markdown playbook); see CONTRIBUTING.md.
Install
pip install jobwright # or: uvx jobwright
# Claude Code plugin (skills + hooks):
# /plugin marketplace add kyle-chalmers/jobwright
# /plugin install jobwright@jobwright
Quickstart
cp jobwright.config.example.yaml jobwright.config.yaml # edit for your repo
jobwright doctor # check config + environment
jobwright jobs-index # render jobs/JOBS.md + OBJECTS.md
jobwright diff-job BI-813 # live-vs-repo drift for one job
See jobwright.config.example.yaml for the full, documented config (including an Airflow + BigQuery variant) and examples/ for a runnable sample repo.
Status
Alpha. Shipped: the deploy-safety guard, the jobs index, four platform adapters (Databricks, Snowflake Tasks, Airflow, dbt) across all three deploy models, the generic checks (syntax / job-defs / deps / architecture / docs) + composite validate-job, the job scaffolder + generated AGENTS.md, the SessionStart + index-regen hooks, and 10 lifecycle skills. Publishing is gated on a security/leak review — see docs/PUBLISHING.md.
CLI
jobwright doctor | init | jobs-index [--check] | validate-job <folder> [--offline]
check {syntax|job-defs|deps|architecture|docs} <paths>
new-job <ticket> "<name>" | gen-agents | diff-job <job>
MIT licensed.
Project details
Release history Release notifications | RSS feed
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 jobwright-0.0.1.tar.gz.
File metadata
- Download URL: jobwright-0.0.1.tar.gz
- Upload date:
- Size: 64.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
309d3ac452957b6200bb80560cc3c4e0b41f7edfb567b25ccd372651c91b9a96
|
|
| MD5 |
8accb2ffd5082940d7fb376fa8313de9
|
|
| BLAKE2b-256 |
bc397b51ce15ff258b63ce450ba48ec4cf7cde98cdbe2539400603c30d238543
|
Provenance
The following attestation bundles were made for jobwright-0.0.1.tar.gz:
Publisher:
publish.yml on kyle-chalmers/jobwright
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jobwright-0.0.1.tar.gz -
Subject digest:
309d3ac452957b6200bb80560cc3c4e0b41f7edfb567b25ccd372651c91b9a96 - Sigstore transparency entry: 2002184336
- Sigstore integration time:
-
Permalink:
kyle-chalmers/jobwright@f1574ce9970f6d069445347d97145fd846652ad2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/kyle-chalmers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f1574ce9970f6d069445347d97145fd846652ad2 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file jobwright-0.0.1-py3-none-any.whl.
File metadata
- Download URL: jobwright-0.0.1-py3-none-any.whl
- Upload date:
- Size: 51.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67e5f48f5d245a3db3164e54ce89103809f4ee452cbd16b22e44050b14969c66
|
|
| MD5 |
aa4de5af40fcffe9c5a98b18cd4c08d4
|
|
| BLAKE2b-256 |
e25f0da9184513eb66b06ff76709482889a9eaa832619e1aec30683a2a432653
|
Provenance
The following attestation bundles were made for jobwright-0.0.1-py3-none-any.whl:
Publisher:
publish.yml on kyle-chalmers/jobwright
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jobwright-0.0.1-py3-none-any.whl -
Subject digest:
67e5f48f5d245a3db3164e54ce89103809f4ee452cbd16b22e44050b14969c66 - Sigstore transparency entry: 2002184399
- Sigstore integration time:
-
Permalink:
kyle-chalmers/jobwright@f1574ce9970f6d069445347d97145fd846652ad2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/kyle-chalmers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f1574ce9970f6d069445347d97145fd846652ad2 -
Trigger Event:
workflow_dispatch
-
Statement type: