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 output | After the operator commits a stable file set, table snapshot, or manifest, append a transformation statement. |
|---|---|
| Dataset event | Use the dataset URI and event as scheduler context; resolve exact artifact bytes separately. |
| XCom | Pass statement digests and artifact references, not large evidence bundles or signing keys. |
| DAG boundary | Create 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 --helpRetries 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.