Back to buildsBUILD RECORD

Media Job Compiler / Creative planning tooling / 2026

Compiling media jobs that keep their approval attached.

A Python compiler checks provider payloads and records the schema, adapter and media inputs reviewed with each job, so changed definitions can't silently reuse an earlier approval.

Confidential work. Names and identifying business details have been changed.

THE WORK

The project.

Media Job Compiler prepares a creative brief for a specific provider without losing the restrictions attached to it. It checks the creative records, selects a supported adapter and validates the resulting payload before building the approval gate. That gives the later executor a checked job with explicit media mappings, rather than a prompt whose meaning depends on whichever provider definition is current.

The provider's input description needs checking too. A connector-specific normalizer translates it into JSON Schema and retains fingerprints of both forms, the adapter and the normalizer version. Those identities follow the job into the final handoff. A changed translation therefore changes what needs approval, even when the payload still validates. This anonymized case study covers the V3.3.3 branch implementation; the package prepares jobs and filesystem reservations, but doesn't upload media or submit provider requests.

ATTEMPTS & CORRECTIONS

What changed along the way.

  1. Giving the connector its own schema normalizer
    At first
    The compiler expected a schema it could validate before checking provider capabilities and preparing a job. The discovery connector supplied a flat list of fields instead.
    What needed to change
    Required booleans and nullable type strings in that list didn't have the shape the validator expected. Passing the response through unchanged would leave one component trying to interpret two different formats.
    My direction
    I limited the change to one connector-bound normalizer and required the generic deterministic validator to remain strict and unchanged.
    The change
    A connector-specific normalizer now translates the response into the supported schema. It retains the raw response and records separate identities for the raw data, normalized schema and adapter before routing or approval. Unsupported shapes stay blocked; the generic validator remains unchanged.
    The result
    The committed change gives discovery, translation and validation separate jobs, while preserving enough identity to check the translation later. Regression definitions cover required fields, nullable values, array items and forbidden fields. They weren't rerun here, and no provider generation was performed.

IMPLEMENTATION

Design choices.

  1. Creative restrictions stay outside provider translation. An adapter can change how a job is expressed without silently changing the inputs and restrictions that were reviewed.
  2. A dedicated normalizer translates the connector's format before generic validation. It handles that one format, while the validator continues to reject payloads outside its supported schema.
  3. An optional array field is forbidden when its item rules are unknown. The field remains visible in the recorded descriptor, but incomplete provider metadata doesn't become permission to send arbitrary objects.
  4. Approval fingerprints include the raw descriptor and normalizer version. Two translations can accept the same payload yet represent different reviewed inputs; recording both makes that change visible and can require another approval.
  5. Execution checks compare the saved interpretation instead of fetching and translating a new schema after approval. That keeps preparation tied to the reviewed job without treating local validation as permission for a paid action.

HOW IT FITS TOGETHER

Architecture.

  • Creative records enter Python validators before provider translation. Their restrictions remain explicit while an adapter turns the supported work into prompts and payload fields, so the provider format doesn't replace the original review inputs.
  • The router checks capability, transport and price information when selecting an adapter. Finding an endpoint isn't enough: the discovered definition must agree with an adapter the package supports before compilation can continue.
  • The schema normalizer checks endpoint identity, translates required and nullable fields, and resolves array item rules. It produces the supported Draft 2020-12 schema used to validate the logical payload before approval.
  • Compilation carries fingerprints of the raw descriptor, normalized schema, adapter and normalizer version into the saved job. Later execution checks compare those bindings and exact media mappings; filesystem reservations prepare the handoff, while upload and submission belong to a separate executor.
Explore the architecture map9 components · 10 connections

Preparing a job before anything reaches the provider

The compiler prepares an inert job. Exact approval and fresh checks are still needed before another component can execute it.

Direct callAsync taskResponse / returnBlocked / denied
Evidence and creative authority
Local preparation
Human and external authority

Scroll or drag the background to move. Use the zoom buttons to resize.Arrow keys move between components. Enter selects.

Choose a component to explore

Select a numbered component on the map or use the component menu. Its details and connections will appear here.

No component selected.

All connections (10)
  1. 01 · Product behaviour record03 · Preparation pipelineproduct constraints · Direct call
  2. 02 · Research and creative records03 · Preparation pipelinecreative authority · Direct call
  3. 03 · Preparation pipeline04 · Capability and feasibility gateselected concept · Direct call
  4. 04 · Capability and feasibility gate01 · Product behaviour recordclarification required · Response / return
  5. 04 · Capability and feasibility gate05 · Provider-native jobsupported route · Direct call
  6. 05 · Provider-native job06 · Fingerprinted approval packagefreeze exact material · Direct call
  7. 06 · Fingerprinted approval package07 · Exact human decisionreview package · Async task
  8. 07 · Exact human decision08 · Fresh precall and reservationapproval-bound decision · Direct call
  9. 08 · Fresh precall and reservation09 · Executor outside this packageinert one-call contract · Response / return
  10. 05 · Provider-native job09 · Executor outside this packageno direct submission · Blocked / denied

MADE WITH

Python · JSON Schema · PyYAML · CLI · Filesystem manifests

CHECKS & RESULTS

What was checked.

A source review shows what the code does. It is not a fresh test of the running app.

  1. Code and development records reviewedReviewed

    The code, tests and available development records were checked. Reported test results keep their original scope. No fresh app or live deployment check was run for this write-up.

    Scope of this check
    Code review, not a fresh run of the app

NEXT

Still to work through.

The compiler makes a provider job precise enough to review and check again later. It still depends on fresh capability and price information, and its local checks say nothing about current provider availability or the quality of a generated image or video. The account is based on branch source and regression definitions, not a fresh test run, provider call or promotion into the active installation.