Blacksite/docs/editor/evaluations/deterministic-asset-fingerprints/README.md

103 lines
6.1 KiB
Markdown

# Deterministic Imported-Asset Fingerprints Evaluation
> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture.
**Date:** 2026-07-13
**Issue:** [Gitea #56](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/56)
**Content-addressed implementation:** `e1b2f86a495496da83947777d332d00a15a1779d`
**Stable publication ordering:** `cbd380a9413411667a83f74b66c5a2feda5e1af7`
**Release-candidate commit:** Not nominated
**Source validation:** **Pass**
**Fresh-checkout acceptance:** **Pass**
**Native acceptance:** **Pass**
This record covers imported model, texture, and audio source identity plus the animation, static-mesh,
and registry documents derived from those sources. The permanent contract is owned by
[ADR 0043](../../../adr/0043-content-addressed-import-fingerprints.md).
## Automated Verification
| Command or suite | Result | Evidence |
|------------------|--------|----------|
| `cargo fmt --all -- --check` | Pass | Formatting completed without changes. |
| `git diff --check` | Pass | No whitespace errors. |
| `cargo clippy --workspace --all-targets -- -D warnings` | Pass | Workspace and all targets completed with warnings denied. |
| `cargo test --workspace --all-targets --no-fail-fast` | Pass | All workspace targets passed; editor reported 300 passing tests, scene reported 100 passing and one ignored manual-migration test, and shared reported 99 passing tests. |
| Fingerprint regressions | Pass | Exact-byte BLAKE3 identity, same-size byte changes, mtime-only drift, legacy timestamp tolerance, stable move recovery, imported-source coverage, semantic RON equality, and read-only validation are covered. |
| `cargo validate-levels --project .` | Pass | 81 dependencies, five known nonblocking import/platform findings, zero blocking errors. |
| `cargo validate-samples --project .` | Pass | Five samples, 86 dependencies, the same five nonblocking findings, zero blocking errors. |
| Packaged acceptance | Deferred | Explicitly deferred by project-owner direction; no packaged result is claimed. |
## Fresh Checkout
The first exact-commit run at `e1b2f86` exposed one remaining nondeterministic path: native startup
discovered catalog entries in filesystem order and rewrote `assets/.index/registry.ron`. That run
failed the clean-checkout gate. Commit `cbd380a` sorts records by normalized project path before
semantic comparison and adds a discovery-order regression test.
A new detached, LFS-hydrated worktree at `cbd380a` then completed native startup, asset scan,
`validate-levels`, and `validate-samples` with an empty `git status --short`. Touching
`assets/models/RobotExpressive.glb` while the editor was live also left the worktree clean. Its
original nanosecond timestamp was restored after the test.
The following SHA-256 values were identical before startup, after startup, after the mtime-only
change, and after both validators:
| Artifact | SHA-256 |
|----------|---------|
| `assets/.index/registry.ron` | `5beb11fb708729fb024e2e671596876bcf31b3c3fd2cea51da777db1d343644e` |
| `113f74df...static_mesh.ron` | `8d93e4d49c4f1d00ea8c482e8e1981f18d7a71224847c2b9f05f153982c5e80e` |
| `3f63f359...static_mesh.ron` | `e47099d59ec4ce9dc977ba6a08ddee36f1d99c0f13d9278998f21cba72571585` |
| `b98ef565...static_mesh.ron` | `edc77d61284c1010c8811d40bd7cedebfcbd6a3d88145e54d5c1ef7dc3a0a864` |
| `113f74df...animation.ron` | `0e678584aca470b36afd14b75a950d84a87d445438ba9b0a1e3416e863dda92a` |
| `3f63f359...animation.ron` | `45d3f9e9dcc64137f40a339c84512b6aba47102f7593aa6a9344891de68c0c07` |
| `b98ef565...animation.ron` | `691eb70ff05b2a4d03f51766f4c682a4171f7c76721f453c434f8de6fd936408` |
## Native Acceptance
| Workflow | Result | Evidence |
|----------|--------|----------|
| Main checkout startup | Pass | The exact debug editor at `e1b2f86` loaded the committed scene with populated hierarchy, viewport, Inspector, and Asset Browser, then exited with code 0. |
| Imported model browser | Pass | Opening `assets/models` rendered all three model rows and thumbnails; selecting the FBX exposed its registry-backed details without destabilizing the editor. |
| Fixed fresh checkout | Pass | The exact `cbd380a` editor launched from the detached worktree, rendered the complete editor frame, preserved every artifact byte, and exited with code 0. |
| Metadata-only drift | Pass | A live source `touch` produced no registry or manifest change and no Git diff. |
## Native Evidence
![Fresh LFS checkout running the complete editor without rewriting imported artifacts](https://git.spacetrainclubhouse.com/attachments/df761c85-0b82-4a25-9d33-9cf8189539f0)
- Gitea attachment asset 39: `blacksite-issue56-fresh-fixed-cbd380a.png`, 3426x1384 sRGB PNG,
1,787,700 bytes.
- SHA-256: `2748ae3de31ff97933c9793b90475ffd38d54d7e9dd5d65937b699f81c73c9bc`.
![Imported model thumbnails and registry-backed FBX details in the live editor](https://git.spacetrainclubhouse.com/attachments/93da7803-de47-43fb-bb8c-f759970a2b5f)
- Gitea attachment asset 40: `blacksite-issue56-models-e1b2f86.png`, 3426x1384 sRGB PNG,
1,940,210 bytes.
- SHA-256: `064c0634ebac47b52516412b022247ba8aa6f155014db8f8d3cca86850509da7`.
Both images are ordinary Gitea issue attachments. This record does not use repository raw or Git LFS
pointer URLs.
## Separate Finding
Selecting the painted-chair FBX exposed missing external texture dependencies in the committed
fixture: `painted_wooden_chair_02_diff_2k.jpg`, `painted_wooden_chair_02_nor_gl_2k.exr`, and
`painted_wooden_chair_02_rough_2k.exr`. The asset server reported six load errors because the paths
were requested more than once. This is an FBX dependency/import-fixture defect, not a deterministic
fingerprint failure, and is tracked separately in
[Gitea #58](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/58).
## Release Use
The #56 source, fresh-checkout, and native feature-level acceptance record is complete. A future
production candidate must rerun the clean-checkout protocol from the exact nominated commit. This
record does not nominate a candidate or establish production readiness.