Automation (Airlift CLI)
Automate governed migration work from scripts and CI with the fa CLI — the Automation surface alongside the human Databricks App journey.
Automation with the Airlift CLI
Humans run the guided migration journey in the Databricks App. This section is the
Automation surface: @fabricorg/airlift-cli installs one executable, fa, for
scripts and CI. The name follows the Fabric family convention:
Harness uses fh, Runway uses fr, and Airlift uses fa.
Use fa to operate a migration or modernization engagement: assess scope, plan waves,
convert code, transfer data, evaluate readiness, and inspect evidence. It is not a general
Databricks deployment CLI. Fabric Runway's fr command owns release deployment,
promotion, rollback, and reconciliation.
Authenticated remote commands use the same governed Airlift actions as the Databricks App; local catalog and verification commands never mutate engagement state. Every mutation below names the governed action it invokes — there is no second mutation path.
Common automation recipes
Each recipe names its governed action and permission. All remote mutations take a stable,
non-secret --idempotency-key prefix: the CLI appends a canonical digest of the action
and parameters, so an exact retry collapses to the original invocation and changed content
cannot reuse the old content-bound key. Persist the prefix with your pipeline job — never
mint a fresh timestamp or random value per retry — and use a fresh key after a policy
denial, because a denied key stays denied. See authenticated
automation for identity, tenant derivation, and the full
retry contract.
Create an engagement
fa engagement create --file engagement.json --idempotency-key project-42-engagementInvokes airlift.engagement_create (airlift:engagement:create). Admitted for the
service-principal automation role, so CI can onboard engagements unattended.
Register a connection binding
fa connection register --file source-binding.json --idempotency-key project-42-bindingInvokes airlift.connection_binding_register (airlift:connection:register);
automation-admitted. The file carries an opaque secret reference, never credentials. A
binding becomes verified only against a recorded connectivity diagnostic — follow the
digest recipe in authenticated automation.
Accept an assessment
fa assessment accept --file assessment-accept.json --idempotency-key project-42-assess-accept-1Invokes airlift.assessment_accept (airlift:assessment:accept). Acceptance is a human
decision: it requires the operator role on an authenticated person. The automation
service-principal role is denied — it may start, record, and export assessments but never
accept scope.
Freeze a plan
fa plan freeze pln_01ARZ3NDEKTSV4RRFFQ69G5FAV --idempotency-key project-42-plan-freeze-1Invokes airlift.plan_freeze (airlift:plan:freeze); human operator role, denied to
automation. Freeze requires a selected scenario, frozen engagement scope, and no
blocking issues.
Export evidence
fa evidence export --file evidence-export.json --idempotency-key project-42-wave-2-evidenceInvokes airlift.evidence_export (airlift:evidence:export; human operator,
approver, or validator role). The export is a content-digested governed pack of
references and policy evidence — never artifact bodies or credentials.
Install
npm install --global @fabricorg/airlift-cli
fa helpFor an ephemeral or CI-pinned invocation, use npx:
npx --yes --package @fabricorg/airlift-cli@0.18.4 fa sources --format jsonWhat can I do with it?
| Task | Command |
|---|---|
| list migration engagements in your authenticated organization | fa engagement list |
| create an engagement from a versioned JSON input | fa engagement create --file engagement.json --idempotency-key onboarding-42 |
| activate or freeze its scope | fa engagement activate <id> --idempotency-key activate-42 |
| register an opaque source connection reference | fa connection register --file source-binding.json --idempotency-key binding-42 |
| verify or retire a connection binding | fa connection verify <id> --digest <sha256> --idempotency-key verify-42 |
| create and reconcile a scoped conversion batch | fa conversion batch create --file batch.json --idempotency-key batch-42 |
| inspect attempts for an object | fa conversion diff <object-id> --json |
| register an immutable converted artifact | fa artifact register --file artifact.json --idempotency-key artifact-42 |
| estimate, assign, resolve, and review engineering residue | fa residue list --engagement-id <id> |
| plan, run, pause, resume, and reconcile data movement | fa transfer status <id> --json |
| declare and inspect a required Runway outcome | fa deployment status <id> --json |
| run object-specific Experiments validation | fa validation run --file validation.json --idempotency-key validation-42 |
| triage and resolve required-check failures | fa discrepancy list --object-id <id> |
| inspect governed readiness and certificates | fa certificate list --object-id <id> |
| list supported source profiles | fa sources |
| import a native ADF or Synapse Pipelines export | fa migration-ir import --source adf-synapse --file adf-export/ ... |
| generate and byte-validate Databricks implementation files | fa migration-ir generate --file migration-ir.json --out-dir generated |
| materialize an artifact set received from CI | fa migration-ir materialize --file artifact-set.json --out-dir generated |
| inspect one source's tools, surfaces, transfer, and residue | fa source inspect sql_server |
| generate its complete migration plan | fa source plan sql_server |
| check a live source-pack manifest | fa source certification-check source-certification.json |
| check local or production configuration | fa doctor --profile production |
| inspect governed actions and permissions | fa actions |
| inspect object validation profiles and digests | fa profiles |
| inspect a certificate without trusting it | fa certificate inspect certificate.json |
| cryptographically verify a certificate | fa certificate verify certificate.json --keys keys.json |
| print a documentation URL | fa docs sources/sql-server |
Use --format text|table|json|yaml|jsonl on data-producing commands. --json is the
concise JSON form. JSON is canonical and deterministic; JSONL emits one array item per
line. Both are safe to diff in CI or feed into project scaffolding:
fa source plan snowflake --json > .airlift/snowflake-plan.json
fa actions --json > .airlift/action-contract.jsonRead JSON from stdin with --file -. Use --correlation-id <id> to connect a governed
mutation to your pipeline trace, and --timeout <seconds> to bound remote calls. These
options never change identity, organization, policy, or approval authority.
The help system is resource-first:
fa help inventory
fa inventory graph list --assessment-id asm_<id>
fa conversion batch create --file batch.json --idempotency-key batch-42
fa application-kit module list
fa commands --json
fa completion zshThe CLI has no deprecated command aliases. Use the exact resource hierarchy printed by
fa commands; obsolete flat or verb-first spellings fail with exit status 2.
See the generated command index for the exact surface shipped by the current CLI.
Continue with the complete command reference, or use source planning commands to start a migration integration.
Airlift versus Runway
Use fa deployment require only when a migration engagement needs a particular Runway
release outcome. Airlift stores the requirement and verified foreign references; it does
not execute the release.
If a customer is already using Databricks and is not running a migration or modernization engagement, use Runway directly:
fr catalog
fr deploy
fr promoteRunway's console and API own detailed deployment status and reconciliation. Do not create an Airlift estate solely to obtain deployment commands.
Exit status
| Status | Meaning |
|---|---|
0 | command completed or verification passed |
1 | diagnostic, verification, or internal response failed |
2 | usage or remote request validation failed |
3 | authentication, organization binding, or authorization failed |
4 | remote resource not found |
5 | replay conflict or governed action blocked |
6 | remote dependency or transport unavailable |
7 | asynchronous workflow conflict or request conflict |
Security boundary
Set AIRLIFT_API_URL to the deployed Airlift Databricks App URL and supply a short-lived
DATABRICKS_TOKEN through your shell or CI secret provider. The CLI never prints the
token. It sends no actor or organization field: Harness authenticates the principal and
the API resolves exactly one admitted organization membership.
The CLI accepts no actor, tenant, approval, waiver, --force, or unsafe override. It
never creates a production Airlift runtime or writes the durable store directly.
The CLI exposes the same action contract to authorized automation, but it cannot grant
itself approval, waiver, certificate, policy, or cutover authority. Platform Host still
enforces the caller's admitted role and agent/system bounds.