Reconcile the shot plan, take log, and files on disk before you call it a wrap.
CallItWrap is a private-by-default command-line release gate for small film crews. It joins a strict shot plan, a take-log CSV, and the actual media directory, then answers one question: is every declared shot ready to hand to editorial?
It catches missing planned coverage, incomplete multicamera takes, absent picture or sound files, reused references, unlogged media, unknown shots, and take gaps. It never uploads, opens, copies, renames, or deletes footage.
中文说明 · input contract · failure repairs · generated broken report
$ callitwrap check examples/complete/plan.toml examples/complete/take-log.csv examples/complete/media
CallItWrap: Night Window — complete wrap
Verdict: READY
Shots: 2/2 ready | Blocks: 0 | Warnings: 0
$ callitwrap check examples/broken/plan.toml examples/broken/take-log.csv examples/broken/media
CallItWrap: Night Window — broken wrap
Verdict: HOLD
Shots: 0/3 ready | Blocks: 9 | Warnings: 0
[BLOCK COVER001] (shot=12C) Planned shot 12C has no take-log rows.
repair: Record a take or remove the shot from the reviewed plan with production approval.
...The second command returns exit code 1, so it can stop a handoff script without hiding the
actionable report.
Requirements: Python 3.11–3.14 and uv.
git clone https://github.com/KanadeK/callitwrap.git
cd callitwrap
uv sync --locked
uv run callitwrap demo build/my-first-wrap
uv run callitwrap check build/my-first-wrap/complete/plan.toml build/my-first-wrap/complete/take-log.csv build/my-first-wrap/complete/mediaTo install the published standalone command from the GitHub Release wheel:
uv tool install https://github.com/KanadeK/callitwrap/releases/download/v0.1.0/callitwrap-0.1.0-py3-none-any.whl
callitwrap --versionCreate a versioned plan:
schema_version = 1
project_name = "Night Window"
[[shots]]
id = "12A"
scene = "12"
description = "Two-camera master"
required_cameras = ["A", "B"]
min_usable_takes = 1
sound = "sync"Export or write a take log with this header:
shot_id,take,camera,camera_file,sound_file,status,preferred,notes
12A,1,A,camera/A001.mov,sound/T001.wav,usable,true,clean master
12A,1,B,camera/B001.mov,sound/T001.wav,usable,true,clean masterThe paths are relative to the media root. Then compile portable evidence:
callitwrap compile plan.toml take-log.csv /path/to/media --out wrap-reportwrap-report contains:
report.html— escaped, script-free coverage board for humans;report.json— stable schema for automation;editor-handoff.csv— sorted recording rows with coverage status.
All output is deterministic and contains relative paths only. The input contract is documented in docs/input-format.md.
| Code | Meaning | Next action |
|---|---|---|
0 |
Ready; warnings may still be present | Review warnings, then hand off |
1 |
Hold; one or more blocking findings | Follow each finding's repair text and rerun |
2 |
Invalid input, I/O failure, or command usage | Correct the named boundary error; no compile output is written |
The full finding-code table and a symptom-first recovery path are in docs/repair.md.
A take counts only when every required camera is logged as usable, every referenced camera file is present, and a sync-sound take references a present sound file. A shot is ready only when it reaches its planned minimum number of complete usable takes.
CallItWrap proves declared coverage and filename presence, not codec playability, file-byte
integrity, synchronization quality, or creative adequacy. The committed .mov and .wav demo
files are deliberately tiny non-playable placeholders used to exercise filename reconciliation.
One command runs the locked release gate:
uv run --frozen python scripts/check.pyIt verifies formatting, lint, strict typing, tests with branch coverage, dependency audit, generated example drift, package build, and a clean installed-wheel run. See CONTRIBUTING.md for focused commands and SECURITY.md for the trust boundary.
Production-management suites author and coordinate a whole shoot; media managers ingest and search assets; visual tools analyze continuity. CallItWrap performs a smaller, auditable final join across records teams already have. The researched distinction and rejected overlaps are recorded in docs/research.md; the architecture decision is in ADR-0001.