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.
- ROLE
- Software engineering
- STATE OF THE BUILD
- In progress
- RECORD UPDATED
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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
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)
- 01 · Product behaviour record → 03 · Preparation pipelineproduct constraints · Direct call
- 02 · Research and creative records → 03 · Preparation pipelinecreative authority · Direct call
- 03 · Preparation pipeline → 04 · Capability and feasibility gateselected concept · Direct call
- 04 · Capability and feasibility gate → 01 · Product behaviour recordclarification required · Response / return
- 04 · Capability and feasibility gate → 05 · Provider-native jobsupported route · Direct call
- 05 · Provider-native job → 06 · Fingerprinted approval packagefreeze exact material · Direct call
- 06 · Fingerprinted approval package → 07 · Exact human decisionreview package · Async task
- 07 · Exact human decision → 08 · Fresh precall and reservationapproval-bound decision · Direct call
- 08 · Fresh precall and reservation → 09 · Executor outside this packageinert one-call contract · Response / return
- 05 · Provider-native job → 09 · 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.
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.