# IMF

> How OWG governs an IMF package as one asset, with its track files related by edges and its validation as a gate before delivery.

**Status:** buildable on v0.92 with no schema change. Identifier scopes are a convention set by this page.

## What IMF is

The Interoperable Master Format is the SMPTE [ST 2067 suite](https://www.smpte.org/standards/st2067). An IMF package holds:

- **Track files**: MXF files carrying the picture, audio and timed text essence.
- A **Composition Playlist (CPL)**, defined in ST 2067-3, that says which parts of which track files play, in what order.
- A **Packing List (PKL)** and an **AssetMap** that list and locate everything in the package.

The core constraints are in ST 2067-2, and an *application* such as App 2E (ST 2067-21) narrows them for a delivery profile. IMF is built for versions: a supplemental package can reuse essence from an earlier one instead of shipping it again. Delivery specifications from streamers name the application and profile they require.

## The hook

The package is one asset. Its identity is the triple of UUIDs IMF already issues, carried as identifiers.

```json
{
  "id": "imf_package",
  "type": "video.package",
  "predecessor": "locked_cut",
  "version_relation": "representation",
  "identifiers": [
    { "scope": "imf.cpl",      "id": "urn:uuid:5b1d7c0e-2f43-4d8a-8a55-0c6e91a7d301" },
    { "scope": "imf.pkl",      "id": "urn:uuid:c4e2a9f7-6b18-47d3-9e0a-71d5b3f8a112" },
    { "scope": "imf.assetmap", "id": "urn:uuid:0a93f5d2-1c7b-4e64-b8d9-3e2f6a4c7b90" }
  ]
}
```

Each track file is a separate asset related to the package with a `part_of` edge:

```json
{
  "id": "rel_video_in_pkg",
  "relation": "part_of",
  "from": { "kind": "asset", "id": "track_video" },
  "to":   { "kind": "asset", "id": "imf_package" },
  "assurance": "asserted"
}
```

## How it maps

| IMF | OWG |
|---|---|
| Package | an `asset` with `imf.cpl`, `imf.pkl` and `imf.assetmap` identifiers |
| Track file | an `asset`, `part_of` the package, with its own storage locator |
| The cut the package was made from | `predecessor`, with `version_relation: "representation"` |
| A territory or language version | a new package asset with `version_relation: "alternative"` and the earlier package as `predecessor` |
| Packaging | a task with an executor and an attributed participant |
| Validation | a `qc` task with named `checks`, producing a report asset |
| Sign-off before delivery | a `review` task, then a `delivery` task that depends on it |

Delivery is gated by structure: the delivery task `depends_on` the approval, which `depends_on` the validation. A package that fails validation cannot reach the delivery task without someone overriding the graph, and the override is on the record.

## Reference workflow

[`imf-master-package.owg.json`](/corpus/imf-master-package.owg.json) — a locked cut is packaged, validated, approved and delivered, with video and audio track files related to the package.

```bash
curl -O https://openworkflowgraph.org/corpus/imf-master-package.owg.json
owg-validate imf-master-package.owg.json --json
```

**What to take from it:**

- The package has an identity in IMF's own terms, so any system that reads the CPL can find the asset.
- Nothing is parsed. OWG holds the UUIDs and the edges; opening the CPL is the packager's and validator's job.
- The `checks` on the QC task are names of what was checked. They are free strings today.

## What stays in IMF

OWG does not open MXF files, parse the CPL, or compute conformance. Composition, timing and essence rules stay in the ST 2067 tooling. Open-source validators exist for the structural checks, such as [Netflix Photon](https://github.com/Netflix/photon), and can sit behind the validation task as its executor.

## Known gaps

- `imf.cpl`, `imf.pkl` and `imf.assetmap` are a convention documented here, not yet in the schema's list of example scopes.
- There is no shared vocabulary for IMF QC `checks`. Two implementations may name the same check differently.
- Supplemental packages, where one package depends on essence in another, would want a typed edge between the two packages. Today the `predecessor` field carries it.

See also: [EIDR](/eidr), [MDDF Avails](/mddf-avails), [Standards bindings](/standards-bindings).
