One file in. Viewport, stills, glTF, CI out.
That model was built from a single text file, not modelled by hand. The fingerprint is the proof: compile the same file again and you get the same model, byte for byte. If anything upstream changed, the fingerprint changes with it.
job(input) check(job) run(job) still(job) exportScene(job, dir) // Agents author job.json, not bpy. // Unchecked Job does not run.
{
"schema": "job/1",
"id": "collar-01",
"version": 1,
"units": "m",
"stage": "export",
"block": {
"groups": ["BASE", "HOUSING"],
"axial_stack": [
"foot_ring", "body", "collar"
]
}
}
The glb reproduces anywhere. The blend and stills carry per-run state, so the manifest records what your export made.
$ npx @mrkt_frwd/job examples pull collar-01 --output-dir ./outpulled collar-01 → ./out/job.jsonsha256 3bbe5964edc0… $ npx @mrkt_frwd/job check ./out/job.jsonok collar-01 schema job/1 $ npx @mrkt_frwd/job export ./out/job.json --output-dir ./outexport → ./outblend 5a694c50e261e46fglb 5e507bc04838f890
Export writes beside the Job it read. It never rewrites it.
$ npx @mrkt_frwd/job # prints getting-started.md $ npx @mrkt_frwd/job docs ls catalogs.md check.md cli.md doctrine.md getting-started.md job-schema.md mcp.md $ npx @mrkt_frwd/job docs find schema job-schema.md $ npx @mrkt_frwd/job docs cat getting-started.md A Job is a versioned scene file. A prompt only writes a Job.
That is the whole instruction.
There is no chat on this page. Point your agent at the CLI. It prints its own guide. No clone, no install step. The skill lives at skills/job/.
npx @mrkt_frwd/job