Recluse Studio
Field note / Authored record
← Field notes

Cassette Build Report 016 — A Green Suite Did Not Close S04

Cassette's first S04 suite passed, but an external review showed that model identity and provenance were still incomplete.

A black-and-white pixel operator compares two source records while a spider joins their shared canonical locator to one verified identity.
Post-specific field image / landscape

Scope note: This report covers the S04 identity and provenance review, its repair, and the difference between a green test suite and a complete acceptance claim. It does not claim that every future model source or revision type is implemented.

The first S04 closeout looked convincing. Fifteen tests passed. The ledger was clean. GPT-5.6 Ultra marked the step done, and I was ready to let it move on.

Then Opus 5 Extra read the code instead of the report and found that two of the three important identity rules were missing. I sent the finding back with a sentence that had become familiar in this project: “Unfortunately, you also are not executing the full build.” The green number was true. The conclusion was not.

Cassette needs one answer before it can safely load a model: which exact revision is this? A person may reach the same revision through a URL, a branch name, or a tag. Those request names belong in the record of how the model was found. They should not create different identities for the same immutable bytes.

The first test called itself an alias-convergence test, but it changed only the order of artifacts, format versions, and operators. It never changed the alias. Another test supplied an empty revision and checked that the error message mentioned a mutable locator. The implementation still accepted main, latest, HEAD, v1.0, and refs/heads/main as identity evidence. The test was green because its message was plausible. It was not testing the thing its name promised.

Opus made the gap visible with direct probes. The implementation could distinguish changed artifact and tokenizer digests, but it could not make two names for one resolved revision converge. It also had a second hashing path, accepted malformed digest text, and threw away the provenance needed to explain where an identity came from. The review had not discovered one small typo. It had found that the identity record was not yet an authority.

I asked GPT-5.6 Ultra to reopen S04 and repair the actual clauses. The useful distinction was simple: the request and the resolved object are different facts. The alias and requested revision stay in provenance. The canonical locator and immutable revision enter the identity. A mutable name can help Cassette find a model, but it cannot become the model’s identity until resolution supplies an immutable digest.

The acceptance fixture now makes that distinction visible:

assert repo_alias.source_alias != url_alias.source_alias
assert repo_alias.requested_revision != url_alias.requested_revision
assert model_identity(repo_alias) == model_identity(url_alias)

Those lines are in tests/test_s04_identity.py. The first two assertions protect the history of the requests. The third says that history must not distort the resolved model identity.

The repair also removed the custom SHA-256 and JSON path, used the existing BLAKE3 and RFC 8785 authorities, typed every digest, and retained parent and transform records for derived revisions. The ledger gained a check so later code could not quietly invent a third identity authority. The first version of that check had its own multi-import bug. We fixed that before claiming the guard worked.

S04 closed only after the code was committed, the clean-checkout fixture actually saw the repair, the full suite passed, and the ledger was clean again. I had to learn the same lesson twice in one step: a passing test is evidence about a test case. It is not permission to call the contract complete. The agents gave me the implementation and the adversarial pressure. I had to keep the word “done” attached to the whole claim.