An editor puts a line about a library opening over a clip of shelves under construction. The narration is grammatically correct, the captions match the spoken words, and the file plays. The factual problem is still there. One way to make that review easier is to log the source stages the story needs and check that the handoff includes all of them before spending time on another export.

This article was developed with AI assistance. The CSV is an illustrative editing exercise. It contains no footage or customer data.

Define what the data can verify

The sample is a 45-minute documentary about a former rail station becoming a community library. The output is a four-minute narrated recap. Five source marks need to survive in the review notes: the old ticket gate at 04:30, the proposal at 09:42, renovation at 19:36, public entry at 33:17, and checkout at 34:08. The notes use elapsed time from the start of the source, independent of the order on the final timeline. A cold open can show checkout first and then return to the ticket gate without changing this CSV.

The verifier can inspect the presence, format, and order of those declared marks. Confirming that the 33:17 shot actually depicts public entry requires watching the footage. A script that sees only numbers cannot tell who walked into the building. Make that responsibility explicit in the handoff so a green check doesn't become a claim that the edit is factually correct.

Create a complete input

Save this as complete.csv in UTF-8. Keep the first row as written. Extra columns can be useful in a production worksheet, but this narrow example treats its two-column input as a fixed format.

stage,source ticket gate,04:30 proposal,09:42 renovation,19:36 public entry,33:17 checkout,34:08 

The script below uses Python 3.10 or later and the standard library. It converts each timecode into elapsed seconds before comparison, so switching between MM:SS and HH:MM:SS keeps the order meaningful. A strict regex rejects invalid minute or second components when they are subordinate to hours. In the two-component form the leading minute count can exceed 59.

import csv import re import sys REQUIRED = ('ticket gate', 'proposal', 'renovation', 'public entry', 'checkout') TIMESTAMP = re.compile(r'(?:[0-9]+:[0-5][0-9]|[0-9]+:[0-5][0-9]:[0-5][0-9])') def to_seconds(timecode): if not TIMESTAMP.fullmatch(timecode): raise ValueError(timecode) return sum(int(part) * 60 ** index for index, part in enumerate(reversed(timecode.split(':')))) def check(path): notes = {} issues = [] with open(path, newline='', encoding='utf-8-sig') as file: reader = csv.DictReader(file) if reader.fieldnames != ['stage', 'source']: return ['Expected CSV header: stage,source'] for number, row in enumerate(reader, start=2): stage = (row['stage'] or '').strip().lower() if stage not in REQUIRED or stage in notes: issues.append(f'Row {number}: unexpected or repeated stage {stage!r}') continue try: notes[stage] = to_seconds((row['source'] or '').strip()) except ValueError: issues.append(f'Row {number}: invalid timecode for {stage}') issues.extend(f'Missing required stage: {stage}' for stage in REQUIRED if stage not in notes) present = [(stage, notes[stage]) for stage in REQUIRED if stage in notes] for (earlier, start), (later, end) in zip(present, present[1:]): if end <= start: issues.append(f'Source order: {later!r} must follow {earlier!r}') return issues if __name__ == '__main__': issues = check(sys.argv[1]) print('\n'.join(issues) if issues else 'All five source stages present and in order.') raise SystemExit(bool(issues)) 

Run the review before opening the export

Save the snippet as check.py. Run python check.py complete.csv. The expected result is All five source stages present and in order. with exit status 0. Make a copy called missing.csv and remove public entry,33:17. Running the same command with that file should print Missing required stage: public entry and return 1. Add the public entry back with 08:00 to see a source-order warning. Enter 33:76 to test invalid seconds. These cases check three distinct mistakes with a single input format.

For an editing team, exit status 1 means the handoff needs attention. It may be fine for someone to edit an early assembly while a source mark is missing. Hold the final review until somebody identifies what the original source can support. If production uses multiple source files, extend the CSV to include a source identifier and define the chronology rule across the sources before comparing timecodes. Two numbers from different cameras can represent different clocks even when both look plausible.

Put the manual check next to the automated result

Once the notes pass, open the source at each mark and verify who or what appears on screen. Then watch the edited sequence and listen for the exact verbs used in the narration. A proposal should retain that meaning. A sentence about public opening should land over public access, and a borrowing claim should have a checkout action visible. After revising the narration, check the nearby caption cue and listen for original sound that adds evidence. The CSV saves time finding gaps in the handoff. The footage and narration still tell you whether the exported story holds together.