# Building a Review Manifest for AI-Assisted Short-Video Exports

> Source: <https://dev.to/physicsai/building-a-review-manifest-for-ai-assisted-short-video-exports-1825>
> Published: 2026-09-19 15:11:13+00:00

A video editor can look correct while the exported file is wrong. A font may be substituted, captions can drift after a frame-rate conversion, a final scene can be missing, or an audio normalization step can change the balance between narration and music. When an AI-assisted workflow also involves generated scripts, visuals, and voices, it becomes even more important to identify exactly what was reviewed.

This article describes a small, tool-neutral **review manifest** that binds a human approval to one exact export. The goal is not to prove that a video is accurate. The goal is to make the review reproducible and prevent a later file from silently inheriting an earlier approval.

Suppose an editor stores this state:

```
{
  "project": "launch-video",
  "approved": true
}
```

The record does not answer several practical questions:

A useful manifest should connect those decisions without storing credentials or sensitive browser data.

Start with a deliberately small structure:

```
{
  "manifest_version": "1.0",
  "project_id": "faceless-demo-042",
  "export": {
    "filename": "faceless-demo-042-v7.mp4",
    "sha256": "...",
    "bytes": 18429302,
    "duration_ms": 42880,
    "width": 1080,
    "height": 1920,
    "frame_rate": 30,
    "audio_channels": 2
  },
  "inputs": {
    "script_version": "script-12",
    "scene_map_version": "scenes-18",
    "captions_version": "captions-09",
    "asset_log_version": "assets-22"
  },
  "checks": [],
  "approval": null
}
```

The export hash is the critical field. If one byte changes, the approval no longer applies. The input versions explain which source records led to that file.

Python's standard library is enough for streaming SHA-256 calculation:

``` python
from hashlib import sha256
from pathlib import Path

def file_sha256(path: Path, chunk_size: int = 1024 * 1024) -> str:
    digest = sha256()
    with path.open("rb") as handle:
        while chunk := handle.read(chunk_size):
            digest.update(chunk)
    return digest.hexdigest()
```

Hash the file **after** the final encoder, metadata writer, and optimization step. Hashing an intermediate render gives a false sense of integrity if the publishing pipeline later rewrites it.

Do not treat the hash as a statement about quality. It only identifies bytes. A harmful or incorrect video can have a perfectly valid hash.

A boolean does not explain what was observed. Use a structured result:

```
{
  "check_id": "captions-safe-area",
  "status": "pass",
  "method": "mobile-preview",
  "reviewer": "editor-17",
  "observed_at": "2026-09-19T14:20:00Z",
  "evidence": {
    "device_profile": "360x800",
    "scenes_reviewed": ["S001", "S002", "S003", "S004"]
  }
}
```

Useful statuses are `pass`, `fail`, `needs_review`, and `not_applicable`. Avoid silently converting `needs_review` into a pass.

Some checks can be automated:

Other checks need accountable human judgment:

The validator should reject incomplete evidence rather than guessing:

```
REQUIRED_CHECKS = {
    "claims-reviewed",
    "captions-compared",
    "media-rights-reviewed",
    "mobile-safe-area",
    "audio-reviewed",
    "disclosures-reviewed",
}

def validate_checks(checks: list[dict]) -> list[str]:
    errors = []
    indexed = {item.get("check_id"): item for item in checks}

    missing = REQUIRED_CHECKS - indexed.keys()
    if missing:
        errors.append(f"missing checks: {sorted(missing)}")

    for check_id, item in indexed.items():
        if item.get("status") not in {
            "pass", "fail", "needs_review", "not_applicable"
        }:
            errors.append(f"{check_id}: invalid status")
        if item.get("status") == "pass" and not item.get("evidence"):
            errors.append(f"{check_id}: pass has no evidence")

    return errors
```

A release gate should require all mandatory checks to be either `pass` or a justified `not_applicable`. Any `fail` or `needs_review` blocks approval.

A production workspace may coordinate scripts, scenes, visuals, voiceover, captions, editing, and review. For example, [Faceless Reels AI](https://facelessreels-ai.com/) is a browser-based workflow for those stages. Regardless of the tool, the service or model that generated content should not automatically approve its own result.

Keep separate identities for:

This separation makes failures easier to diagnose and reduces the risk that “generation completed” is mistaken for “publication approved.”

Only after validation should the manifest receive an approval block:

```
{
  "status": "approved",
  "approved_export_sha256": "...",
  "approved_at": "2026-09-19T14:32:00Z",
  "reviewer": "publisher-04",
  "policy_version": "short-video-policy-6",
  "notes": "Normal-speed mobile review completed"
}
```

Before upload, calculate the hash again and compare it with `approved_export_sha256`:

``` php
def is_approved_file(path: Path, manifest: dict) -> bool:
    approval = manifest.get("approval") or {}
    expected = approval.get("approved_export_sha256")
    return bool(expected) and file_sha256(path) == expected
```

If it differs, return the file to review. Do not update the hash automatically, because that would transfer approval to unreviewed bytes.

Publication is a separate event:

```
{
  "destination": "example-platform",
  "published_at": "2026-09-19T14:40:00Z",
  "public_url": "https://example.invalid/video/123",
  "export_sha256": "...",
  "disclosure_rendered": true
}
```

The destination may transcode the upload. Preserve the submitted-file hash and, when possible, record observable properties of the public version. Do not claim the platform's transcoded bytes equal the local file unless they were actually compared.

The manifest should avoid passwords, session tokens, private prompts, browser storage, and unnecessary personal data. Reviewer identifiers can be internal pseudonymous IDs if the organization does not need names. Evidence should be proportional: a safe-area check may need scene IDs and dimensions, not a full copy of every source asset.

Define retention periods for manifests, media-rights records, correction history, and removed publications. A manifest is useful only if people can still understand its field definitions later, so version the schema and review policy.

Before release, verify that:

A review manifest does not replace careful editorial judgment. It gives that judgment a precise object, a repeatable checklist, and a durable audit trail. That small amount of structure can prevent many avoidable errors in fast AI-assisted video pipelines.
