FabricFabricAirlift
Getting started

Quickstart

Run the Airlift walking skeleton locally — the seeded console, the governed pipeline tests, and the mock cutover worker — with no Databricks workspace required.

Phase 0 is vendor-free by design: the whole governed pipeline (actions, policies, state machines, projections, the durable cutover workflow on the mock Temporal binding, and the console) runs locally with an in-memory event log. Databricks arrives in Phase 1 behind env-selected seams.

Prerequisites

  • Node.js 22+
  • pnpm (the repo pins its version via packageManager)

Install and test

git clone https://github.com/Fabric-Pro/fabric-airlift
cd fabric-airlift
pnpm install
pnpm test

pnpm test runs every package suite plus the repository contract test (scripts/airlift-family-contract.test.ts) — the ADR-001 guardrails that reject direct temporalio imports, local mutation pipelines, hand-rolled Databricks HTTP, and secret material in governed sources.

Run the console

pnpm console:dev
# → http://localhost:3106

The console boots a process-level runtime seeded with a believable migration: a Synapse estate under assessment, objects across every funnel stage, an approved wave, and — on purpose — blocked attempts (an agent reaching for a wave approval, a shallow parity certificate). Policy denials are part of the demo: check the Audit page for the ComplianceBlocked events.

Every seed write goes through runtime.invokeAction, exactly like the UI's own mutations. The store is never touched directly.

Run the worker

pnpm worker:dev

The worker composes the module, the Lakebridge stub adapter, the stub cutover effector, and the mock Temporal binding. The cutover workflow is real workflow code — durable approval gate, fail-closed expiry, governed completion — executed in-process; the real Temporal server binding is a mechanical swap once @fabric-harness/temporal exposes its custom-workflow factory.

Drive the loop from code

import {
  AIRLIFT_ACTION_IDS,
  AIRLIFT_PLATFORM_TENANT,
  createAirliftRuntime,
} from '@fabricorg/airlift';

const runtime = createAirliftRuntime();
const installer = { actorId: 'svc-installer', actorType: 'system' as const };
const operator = { actorId: 'you@example.com', actorType: 'natural_person' as const };

// Orgs are governed registry state in the platform tenant.
await runtime.invokeAction(AIRLIFT_ACTION_IDS.orgProvision, {
  tenantId: AIRLIFT_PLATFORM_TENANT,
  ...installer,
  params: { orgId: 'acme', name: 'Acme' },
});

// Register an estate and record a (referenced, version-pinned) assessment.
const estate = await runtime.invokeAction(AIRLIFT_ACTION_IDS.estateRegister, {
  tenantId: 'acme',
  ...operator,
  params: {
    name: 'Legacy Synapse DW',
    sourceSystem: 'synapse',
    owner: 'data-platform',
    environment: 'prod',
  },
});

From there the funnel is the API: object_register, wave_plan, wave_assign, conversion_start/conversion_record, parity_certify, wave_approve, cutover_execute, cutover_record, evidence_export. Illegal transitions are rejected structurally; policy denials come back with the blocking policy's reason.

On this page