DEV Community

Cadence by NoxyTree
Cadence by NoxyTree

Posted on

Why approval in an automated pipeline should expire

A file can be approved and still become unsafe five seconds later.

The failure mode is simple:

  1. A human reviews a file.
  2. The workflow stores approved = true.
  3. Someone edits one sentence.
  4. The filename is unchanged.
  5. 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()
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)