Makoto
Menu
Integration field note

Airflow: attest after the task commits its output.

Airflow knows task and DAG execution. Makoto needs the exact artifact that task produced, exact predecessor evidence, and a signer authorized for that transformation or handoff.

Implementation boundary. This is a TaskFlow/operator pattern, not a shipped Airflow provider or custom operator.

The attachment point

Task outputAfter the operator commits a stable file set, table snapshot, or manifest, append a transformation statement.
Dataset eventUse the dataset URI and event as scheduler context; resolve exact artifact bytes separately.
XComPass statement digests and artifact references, not large evidence bundles or signing keys.
DAG boundaryCreate a handoff only when the exact final artifacts, heads, recipients, and profiles are known.

Control flow

@task
def transform(input_ref):
    output_ref = write_and_commit(input_ref)
    return output_ref

@task
def attest(output_ref, predecessor_ref):
    # Resolve exact bytes and invoke the checked-out reference CLI.
    # Keep key material in the task's secret boundary, never XCom.
    ...

uv run makoto attest transform --help

Retries must be deterministic: the integration should recover an existing statement for the same event and artifacts or fail, not emit conflicting signed histories. A successful Airflow task alone does not establish artifact integrity.

What the evidence can say

It can bind one committed task output to exact inputs, predecessor statements, and selected Airflow run context. It cannot prove task code executed honestly or infer recipient authorization from DAG ownership.

Contribute one DAG with a verifiable handoff.

The fixture should include stable artifacts, retry behavior, key isolation, and the denial produced when the output changes.