A file can be approved and still become unsafe five seconds later.
The failure mode is simple:
- A human reviews a file.
- The workflow stores approved = true.
- Someone edits one sentence.
- The filename is unchanged.
- Downstream automation continues from content nobody approved.
The approval belongs to a version of the content, not to the filename.
A tiny dependency-free approach
Use a SHA-256 fingerprint of the reviewed bytes:
from hashlib import sha256
from pathlib import Path
def fingerprint(path: str) -> str:
return sha256(Path(path).read_bytes()).hexdigest()
When the reviewer approves the file, store that fingerprint. Before dependent work runs, compare the current fingerprint with the approved one:
def approval_state(path: str, approved_hash: str | None) -> str:
if approved_hash is None:
return "waiting_for_approval"
if fingerprint(path) != approved_hash:
return "stale"
return "approved"
That gives the pipeline an honest rule:
- no recorded fingerprint → waiting for approval
- fingerprint matches → approved
- fingerprint changed → stale, block downstream work
Why modification time is not enough
Modification times help find potentially stale outputs, but they are not proof of reviewed content. Files can be copied, restored, or touched without a meaningful content change. A content fingerprint binds the approval to the exact bytes a human reviewed.
The wider workflow rule
The same principle applies to source notes, claims, scene plans, asset manifests, and release checklists. Each approval should name:
- the file or manifest
- the content fingerprint
- who or what recorded the approval
- the timestamp
- the downstream stages that depend on it
When content changes, reopen the gate. Do not silently carry approval forward.
Try it in 3 KB
I extracted the core idea into a dependency-free Python sample:
https://noxytree.github.io/cadence-starter/downloads/cadence-approval-sample.zip
Try:
python cadence_sample.py approve script.md
# edit script.md
python cadence_sample.py status script.md
The second command reports the approval as stale.
A larger local implementation
I expanded this idea into two complete local Python source tools: Cadence Starter for dependency state, next-safe-action resolution, exact-content approvals, and dry-run-first execution; and Approval Guard Kit for dropping named fingerprint gates into an existing pipeline.
The bundle includes 31 passing tests, docs, schemas, examples, templates, and automatic digital delivery. Launch-day checkout is $1.05 with code FIRSTSALE until 23:59 UK time on 18 July 2026; the base price returns to $7 after the deadline:
https://noxytree.github.io/cadence-starter/
The free sample above remains enough to inspect and reuse the core fingerprinting pattern under its MIT license. The paid bundle is the complete source implementation, not a hosted service or managed setup.
Neither tool requires Claude, an OpenAI account, telemetry, a hosted service, or a subscription.
How do you bind human approval to changing local files: hashes, signed manifests, commit SHAs, or something else?
Top comments (0)