Four fingerprints
Same meaning. Different looks. Provably both.
One hash over a whole package answers only one question: are these the same bytes? MLF carries four, so it can answer the question anyone actually has — what changed?
The four
- structural
Matrices, coordinates, roles, regions, dependencies and routes.
- content
Values and source formulas.
- semantic
Normalized structure plus content meaning.
- presentation
Styles, layout and human-view metadata.
They are independent by construction. Restyling a package moves the presentation hash and leaves the other three alone. Editing a value moves content and semantic and leaves structural alone. A single package hash cannot express either of those statements.
Semantic equality
The useful consequence is a claim you can actually check: two packages can be semantically equal while differing in presentation. That is not a hedge — it is a testable relation between two files.
Migration from MLF 0.1 to 1.0 must preserve semantic and presentation fingerprints. The v1.0 release verification records semantic_equal: true and presentation_equal: true for that migration, with validation status valid.
So the 0.1 → 1.0 migration is not merely believed to be safe. The claim has a shape, and the release run checked it.
Where each one comes from
Each fingerprint is computed over a declared subset of the package. The anatomy on the overview marks which members feed which hash.
| Fingerprint | Computed over |
|---|---|
| Structural | matrices, coordinates, roles, regions, dependencies, routes |
| Content | values and source formulas |
| Semantic | normalized structure plus content meaning |
| Presentation | styles, layout and human-view metadata |
Checksums are a different thing
checksums.json binds every path to its bytes with SHA-256. That is integrity — did this file arrive intact. The four fingerprints are identity — is this the same document in some specific sense. Conflating them gives you a system that can tell you a file is undamaged and nothing else.
Diffing
mlfc diff compares two packages using this vocabulary, so a difference is reported in terms of which layer moved rather than as a byte offset.
mlfc diff a.mlf b.mlf