Post-production breaks when teams can’t find, trust, or reproduce the work. The fix isn’t another storage array; it’s a rigorously designed pipeline where naming, versioning, and archiving make every file traceable from ingest to delivery. This playbook is a production-ready standard SpectrumMediaLabs can adopt today.
What “good” looks like
- Deterministic: Any deliverable can be rebuilt from logged sources and settings.
- Discoverable: A newcomer can locate the right file in under 60 seconds.
- Portable: Projects move across apps, OSes, and facilities without path surgery.
- Auditable: Rights, approvals, and provenance are embedded and queryable.
- Cost-aware: Hot, warm, and cold tiers keep budgets predictable.
1) Project scaffolding (folders that scale)
Use the same folder skeleton for every job. Create it from a template script—never by hand.
/SML/{show}/{season}/{episode}/{project_code}
/00_admin
/01_ingest
/02_sources
/camera_ORIG
/audio_ORIG
/gfx_ORIG
/03_proxies
/04_edit
/a_projects
/b_sequences
/c_assets
/05_vfx
/shots/S010/S020/...
/06_color
/07_audio
/08_outputs
/mezzanine
/deliveries
/thumbnails
/09_archive
/_logs
/_manifests
Tokens
showe.g.,ad_spectrum,doc_seriesproject_codee.g.,SML-2025Q4-042(year-quarter-ordinal)S###scene,E###episode,S010sequence,SH030shot
Lock the skeleton in your MAM/DAM as a “starter kit.”
2) Naming: human first, machine perfect
A name should answer what, where, which, when, and who—without opening the file.
File name contract
{show}_{ep?}_{seq?}_{shot?}_{task}_{desc}_{tech}_{ver}_{status}_{date}_{owner}.{ext}
Field glossary
- task = edit|vfx|grade|mix|titles|qc
- desc = short slug (“cold_open”, “lowerthird”, “gfx_pack”)
- tech = 1920x1080p23.98_REC709_P3D65_24b_48k
- ver = v001..v999 (zero-padded for lexicographic sort)
- status = wip|revA|appr|final|locked
- date = YYYYMMDD (UTC)
- owner = initials or team code
Examples
ad_spectrum_E01_S010_SH030_vfx_dustCleanup_3840x2160p23.98_ACEScct_v014_revB_20251006_js.mov
ad_spectrum_titles_opener_edit_sequence_1920x1080p29.97_REC709_v007_appr_20250912_km.prproj
Regex (lint rule)
^[a-z0-9]+(_[A-Z]\d{2})?(_S\d{3})?(_SH\d{3})?_[a-z]+_[a-z0-9\-]+_[0-9x\.p_]+_v\d{3}_(wip|rev[A-Z]|appr|final|locked)_\d{8}_[a-z]{2,4}\.[a-z0-9]{2,4}$
Automate a pre-commit check that blocks non-conforming names entering /04_edit and beyond.
3) Versioning: how many, how often, and by whom
Workfiles vs exports
- Workfiles (NLE, AE, Resolve):
v###increments on save milestones. - Exports (mov/wav/exr):
v###increments only when content changes, not when metadata-only changes (e.g., timecode burn-in).
Status gates
wip→revA/B/...(internal review) →appr(stakeholder approved) →final(delivered) →locked(freeze; only archival moves allowed).
Change log (sidecar)
For any appr, create a JSON sidecar with provenance:
{
"asset": "ad_spectrum_E01_S010_SH030_vfx_dustCleanup_..._v014_appr_20251006_js.mov",
"sources": [
"SML/02_sources/camera_ORIG/A001_C001_0923XY.r3d",
"SML/05_vfx/shots/S010/SH030/matte/mattepaint_v005.tif"
],
"app": "Nuke 15.2",
"luts": ["show_luts/aces/ODT_Rec709.icc"],
"notes": "Client approved dust removal; hold frames 140-150.",
"approver": "cdavis",
"checksum": {"xxh64":"19f8..."}
}
4) Metadata: sidecars and embedded tags
- Embedded: Use QuickTime
com.apple.quicktime.description, XMP for stills, iXML/BWAV for audio. - Sidecar: Mirror core fields in
*.jsonto avoid application lock-in. - Minimum fields:
project_code,concept_id(if applicable),rights_license_id,camera,color_space,fps,audio_layout,creator,approval_state,checksum.
5) Proxies, mezzanine, deliverables (and how to name them)
Originals (ORIG)
- Camera cards cloned bit-for-bit with checksums to
/02_sources. - Folder name preserved exactly as media recorded.
Proxies (PROXY)
- DNxHR LB or ProRes Proxy, 1/2 or 1/4 res, timecode + reel/name preserved.
- Naming mirrors source with
_PROXYtoken:
A001_C001_0923XY_PROXY_1920x1080p23.98_REC709_v001.mov
Mezzanine (MEZ)
- High-quality master for downstream (e.g., ProRes 422 HQ, 10-bit).
- Include show, seq/shot (if applicable), and mix version:
ad_spectrum_E01_master_MEZ_3840x2160p23.98_REC709_MIXv03_v021_final_20251006.mov
Deliverables (DELIV)
- Platform-specific. Lock a canonical matrix in
/00_admin/specs.
ad_spectrum_E01_30s_DELIV_YT_1920x1080p29.97_REC709_MIXv03_v004_final_20251006.mov
ad_spectrum_E01_30s_CAPTIONS_DELIV_YT_enUS_v002_final_20251006.srt
6) Color, audio, and timecode hygiene
- Color pipeline: Declare ACEScct or Rec.709 per project; never mix per sequence. Version LUTs:
show_look_v003.cube. - Audio layout: Prefix with channel map:
MIXv03_2.0(stereo),MIXv02_5.1(orderL R C LFE Ls Rs). Embed iXML with track labels; export stems:DIA,MUS,SFX. - Timecode & rate: Freeze at ingest; ban frame-rate reinterpretation on timeline. Retain source
Start TCin sidecars.
7) Review & approval workflow
- Export review screener to
/08_outputs/reviewwith slate, watermark, and burnt-in file name + timecode. - Collect notes in frame-accurate tools; export CSV/EDL/AAF to
/04_edit/c_assets/notes. - On approval, flip status to
appr, write sidecar, and publish to/08_outputs/mezzanine. - Only approved mezzanine becomes the parent for platform deliverables.
8) Conform and relink (online)
- Maintain a conform manifest (CSV) mapping proxy → original; include checksums and duration.
- Verify frame accuracy after relink with automated
ffprobechecks: resolution, fps, duration, audio channels. - Lock
onlineprojects in/06_colorwithlockedstatus when QC passes.
9) QC gates (automated + human)
Automated (pre-flight and post-export)
- Naming regex pass
- Checksums verified
- Bitrate/codec/level match spec
- LUFS/LRA for audio within bounds
- Caption presence and sync (spot check 10% lines)
- Color space flag consistent with spec
Human
- Slates, titles, legal lines
- Spelling, lower-thirds, safe-area
- Artifact scan at fades/FX cuts
- Sync drift under ±1 frame
Capture outcomes in _logs/qc_reports.
10) Archival strategy (3-2-1-1-0 done right)
- 3 copies of all irreplaceable data
- 2 different media types (e.g., NAS + LTO)
- 1 off-site/offline (cloud cold storage or vaulted LTO)
- 1 copy immutable (WORM or object lock)
- 0 errors after verification (hash match)
Tiers & retention
| Tier | What | Where | RTO | Retention |
|---|---|---|---|---|
| Hot | active projects, proxies, workfiles | NAS/SSD | minutes | project lifetime |
| Warm | mezzanine, approved gfx/audio | object storage Standard-IA | hours | 24 months |
| Cold | originals, project manifests, final deliverables | LTO-9 + Glacier Deep Archive | days | 7–10 years (per contract) |
Manifests
Every archive set includes manifest.json:
{
"project_code":"SML-2025Q4-042",
"copies":[
{"type":"LTO9","barcode":"SML042A","checksum":"sha256:..."},
{"type":"CloudGlacier","vault":"sml-archive","checksum":"sha256:..."}
],
"file_count": 18472,
"total_bytes": 1847392049923,
"created_utc": "2025-10-06T11:32:00Z",
"software":"SML-Archiver v1.4",
"index":"manifest_index.csv"
}
Restore drills
Quarterly, randomly restore one project; time the RTO; record errors. If a tape or object fails verification, re-hydrate from the second copy and rebalance.
11) Rights, provenance, and compliance
- Attach
rights_license_idto every asset; store contracts in/00_admin/rights. - For generated/edited content, embed C2PA/Content Credentials where supported; log tool versions in sidecars.
- Use “hold-until” and “expire-on” fields; nightly jobs move expired assets out of
publishbuckets. - Keep a do-not-use list (logos, faces, music) enforced by the exporter.
12) Automation you should actually build
- Scaffold script (
sml_new_project): creates the folder tree and seeds README/specs. - Name linter (
sml_lint): validates filenames and moves misfits to/quarantine. - Version bumper (
sml_bump): reads lastv###and increments consistently across workfile & render. - Checksum daemon: writes
xxh64andsha256at ingest; verifies on move/backup. - Spec-aware exporter: NLE/AE/Resolve presets that force codec, frame size, audio layout, color tags, and inject slates.
- Archive packer: builds tar with parity files (PAR2) for long-term integrity.
13) Access and governance
- Role-based ACLs: Editors access
/04_edit; Colorists/06_color; only Ops can write/09_archive. - Locking:
lockedfiles are immutable; any change must create a newv###. - Audit trail: All moves/renames go to
_logs/audit.csv(who, what, when, from → to, checksum).
14) KPIs to prove it’s working
- Time-to-locate (median seconds to retrieve “latest approved” per asset class)
- Rebuild fidelity (pass/fail of deterministic rebuild from manifests)
- QC first-pass rate (automated + human)
- Archive verification rate (hash matches on quarterly spot checks)
- Storage mix (% hot/warm/cold against budget)
Targets after two months: ≤60s locate time, ≥95% QC first-pass, 100% archive verification on sampled sets.
Copy-paste standards (appendix)
1) Slate template
{show} • {runtime} • {fps} • {color_space}
SEQ/SHOT: {seq}/{shot} • MIX {mix_ver} • v{###} {status}
DATE: {YYYY-MM-DD} UTC • OWNER: {initials}
2) Caption file naming
{show}_{asset}_CAPTIONS_{platform}_{locale}_v###_{status}_{date}.srt
3) Audio stems
{show}_{asset}_STEM_DIA_v###.wav
{show}_{asset}_STEM_MUS_v###.wav
{show}_{asset}_STEM_SFX_v###.wav
4) Path tokens (README.md in each project)
{show} = ad_spectrum
{project_code} = SML-2025Q4-042
{color_space} = REC709
{fps} = 23.98
Bottom line
If you standardize names, versions, and archives, you buy back days of hunting, prevent expensive re-edits, and make compliance effortless. Lock the contracts above, automate the checks, and your post-production will become boring—in the best possible way.
Add comment