# Reactor camera command plan: offline authoring check

This is an original Goblin3D planning aid for `reactor/lingbot-world-2`. It checks a small, documented command subset without credentials, model downloads, an SDK, or network access. Python 3.10+ is sufficient.

**It is not a native ComfyUI workflow, an API request, a server emulator, or an inference benchmark.** The plan and `at_chunk` labels are our authored format. Nothing here sends commands. Successful linting says only that the plan meets this limited validator's rules.

## Run

Download this directory, then:

```
python lint_plan.py fixtures/01-valid-release.json
python -m unittest -v test_lint_plan.py
python build_report.py
```

The CLI prints JSON and exits 1 for errors, 0 otherwise. Recommendations do not change the exit code. The checked-in report was generated with `build_report.py`; rerunning it records the current interpreter version and source hashes. Seven fixtures cover a clean release, missing image, incorrect direction, malformed pose, unreleased controls, reset without restaging, and pause/resume. The expected outcomes are hand-authored in `fixtures/expected.json`.

## Authored format

A document has exactly `format` (`goblin-camera-plan-v1`), `model` (`reactor/lingbot-world-2`), and nonempty `steps`. Each step has exactly `at_chunk`, `command`, and `args`.

- `at_chunk` is a nonnegative, nondecreasing planning label. Equal labels are allowed. It supplies ordering only; it does not schedule, acknowledge, or predict a real server chunk. Trace entries are authored-state bookkeeping immediately after each step, not observed model state.
- `set_image` deliberately accepts `{ "image_ref": "seed.png" }`, an unchecked local label. The real API uses an uploaded `FileRef` under `image`. Do not send the fixture directly to Reactor.
- Every other supported command uses the documented command name and parameter field, with intentionally stricter authoring validation: explicit fields, no extras, nonempty prompt, finite numbers, explicit seed, and explicit pose list.
- API-default omission and model commands outside the subset may be valid on Reactor but are rejected by this authoring format.

Subset: `set_prompt`, `set_image`, `set_seed`, `set_move_longitudinal`, `set_move_lateral`, `set_look_horizontal`, `set_look_vertical`, `set_rotation_speed_deg`, `set_camera_pose`, `start`, `pause`, `resume`, `reset`.

## Errors versus recommendations

Errors cover malformed input, unsupported subset commands, invalid enums, missing start prerequisites, and invalid pause/resume order. A reset clears staged image/prompt. A real image must also be uploaded and accepted; this offline check does not verify files or simulate asynchronous decoding.

Recommendations ask authors to explicitly idle controls and clear the pose before reset/end, then finish the plan with reset. These are our auditability conventions, not additional protocol requirements: reset itself clears session state. Changes to image or seed during a run receive restaging guidance, not a fabricated API rejection. A still-open run gets a reset recommendation because the documented server can auto-restart runs.

The linter does not validate service availability, credentials, file content, prompt quality, billing, model licenses, timing, camera geometry, output determinism, or all advanced commands. A fixed seed does not make this artifact evidence of repeatable generated video.

## Synthetic diagram

`chunk-boundary-diagram.png` is a conceptual illustration. A forward setter followed by idle before a hypothetical boundary may leave idle as the only state sampled there. The lower row holds forward across one illustrative boundary. No seconds, measured latency, model run or actual frame count is represented. It is not a performance chart.

`make_diagram.py` regenerates the PNG using Pillow (optional authoring dependency; not needed to run the linter or tests). Alt text: Two synthetic timelines contrast a short forward-to-idle change before a boundary with a forward state held across a boundary. The former boundary samples idle; the latter samples forward before a later idle release.

## Sources and date

Primary pages read 2026-10-11, approximately 00:09 UTC. See `sources.json`. The Oct 9 X announcement establishes the fresh integration news peg; the model schema provides the command rules. No source HTML was vendored, so no source-page hash is claimed. `validation-report.json` hashes our authored code and fixtures instead.

ComfyUI's JSON workflow format is separate from this plan. For a real ComfyUI workflow, start with the official integration's example templates and save the actual graph. Reactor's custom nodes require a Reactor API key. This artifact does not configure access or make paid requests.
