---
title: "A Filename Is a Pointer. A Hash Is an Identity."
description: "A row-level viewer for tampering: change one field in a record of twenty-three, and the one row that no longer matches lights up. What it shows, what it deliberately does not, and why an agent should care."
pubDate: 2026-10-12
author: "Anaiya"
series: "Moonglade Lab Dispatches"
readTime: "4 min read"
heroImage: "/images/staging/2026-10-15-batch1/hero-1-hash-identity.jpg"
image: "/images/staging/2026-10-15-batch1/hero-1-hash-identity.jpg"
tags:
  - provenance
  - demo
  - merkle
  - agents
  - barbados
audio: "/audio/2026-10-12-a-filename-is-a-pointer-a-hash-is-an-identity.6dc7178ecdb4.mp3"
---

![A Filename Is a Pointer. A Hash Is an Identity.](/images/staging/2026-10-15-batch1/hero-1-hash-identity.jpg)

For an AI, a filename is a useful pointer. It does not identify a file.

A filename can be reused, renamed, copied into another folder, or attached to different bytes by someone in a hurry. A folder says where a file was put. An email attachment says what someone called it. All of these sit outside the content itself. They point at a file, yet they cannot tell you whether it is the right one.

A cryptographic hash gives us a practical fingerprint of the bytes. Renaming a file does not change that fingerprint. What follows is a look at a small tool we built in St. Andrew to make that distinction plain on screen.

## The viewer

We built a row-level viewer for our own demonstrations: a single page with three views.

**The sealed document.** Every word is covered by a hash taken when the document was sealed. Change one character and the status indicator in the bottom bar shifts from green to red. Nobody has to hunt through the text for the edit. The check isolates it immediately.

**The record, line by line.** The same material is shown as a plain list of twenty-three entries, one per line rather than a form. Each entry carries its own hash, and all twenty-three roll up into one root. Change a single field and only that row raises a warning mark. The other twenty-two still verify, and the status bar reports that directly.

**The bytes.** Each hash opens into the exact byte sequence it covers. Press `T` and the altered bytes highlight in red inside the inspector, which scrolls straight to the first mismatch so nothing hides below the fold. Press `R` and the state resets.

## What it is, and what it is not

The viewer is display-only. The data lives in page memory. Pressing `T` mutates that in-memory state rather than a file on disk, and the viewer itself does not sign or timestamp anything. In the full provenance stack the hash is signed and timestamped; in the viewer you are looking purely at the hash mechanics.

What is real is the arithmetic. The viewer runs the library's own Merkle tree logic: a leaf is the SHA-256 of a `0x00` byte followed by `<sha256 of the value>  <path>`; an inner node is the SHA-256 of a `0x01` byte followed by its two children; an odd node is promoted; leaves sort deterministically by path. This follows the tree construction in RFC 6962 and RFC 9162. A parity test compares the viewer's implementation against the core package, and all 21 checks pass.

Because each leaf includes its path, renaming a file changes the directory registry root while leaving the file's own content hash untouched. That separation is the whole point: where a file lives is a fact about the folder, while what a file is remains a fact about its bytes.

## One loan memo, two folders

![Archival document matching still-life: identical records in different containers, with a single altered copy discovered under magnification](/images/staging/2026-10-15-batch1/figure-1-hash-identity-still-life.jpg)

The demonstration tracks a file called `loan_memo.txt` across two locations, `./production/` and `./inbox/`, alongside a `final_final` copy arriving in an email directory. The filenames look ordinary enough. The hashes do not all agree. The copy sitting in `./inbox/` is the one that fails verification, and it is the hash that catches it, not the filename and not the folder path.

The memo belongs to CariBank, a fictional demonstration institution with illustrative figures. The record quotes a monthly payment of BDS$3,900.46. In the altered copy, someone lowers that figure to BDS$3,200. Different number, different byte digest, rejected record.

## Where the number comes from

That monthly payment is not typed into a static template. It comes from a deterministic calculation engine using exact decimal arithmetic, banker's rounding (half to even), and an immutable, epoch-versioned policy whose specification has its own digest. Every calculation emits an input digest, an output digest, and a composite proof digest.

During testing we caught a useful mistake of our own: our banking simulation originally rendered a hard-coded payment figure that had drifted from the policy logic. The engine calculated `3,900.46` while the interface template still read `3,896.79`. Having two numbers for one loan is the exact drift a hash check is meant to catch, and we had introduced it ourselves by hand. The simulation now reads both its policy limits and its payment figures straight from the engine.

All financial constants in the demonstration are illustrative and were generated within a representative range. None reflects any real institution's lending policy.

## Why an agent should care

Verifying state takes real work for an autonomous agent. Before acting on a document, an agent needs to know which key signed it, whether its bytes changed in transit, and what independent evidence exists for its timestamp. Those checks depend on the signatures, timestamps, and key registries actually present. After those checks pass, the agent still has to evaluate the substance of the document.

Cryptographic provenance does not make a false statement true. A valid signature binds specific bytes to a specific key; deciding whose key it is and what authority that key holds requires separate trust policy. A verified timestamp establishes a time bound. A signed falsehood remains a falsehood. What provenance does is let an agent verify the integrity and lineage of a record before spending reasoning cycles on its contents.

## Inspecting the code

The viewer is an internal development demonstration and its source is not yet part of our public release package. We will publish the repository link once that package ships. Passing our own internal test suite is not a substitute for independent review. When the code is public, the invitation is straightforward: run it, try to break it, and show us what we missed.
