tensorfs 0.3.62__tar.gz → 0.3.63__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. {tensorfs-0.3.62 → tensorfs-0.3.63}/Cargo.lock +2 -2
  2. {tensorfs-0.3.62 → tensorfs-0.3.63}/Cargo.toml +1 -1
  3. {tensorfs-0.3.62 → tensorfs-0.3.63}/PKG-INFO +1 -1
  4. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/part_rows_tests.rs +24 -6
  5. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/roots.rs +17 -5
  6. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived.rs +29 -5
  7. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/meta.rs +5 -3
  8. tensorfs-0.3.63/crates/tensorfs-core/tests/anima_hf_profile.rs +166 -0
  9. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/qwen_image21_profile.rs +5 -4
  10. {tensorfs-0.3.62 → tensorfs-0.3.63}/pyproject.toml +1 -1
  11. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/Cargo.toml +0 -0
  12. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/build.rs +0 -0
  13. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  14. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  15. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  16. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  17. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/asset_update.rs +0 -0
  18. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/b64.rs +0 -0
  19. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  20. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  21. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  22. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  23. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  24. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  25. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  26. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  27. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  28. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  29. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/canon.rs +0 -0
  30. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/capability.rs +0 -0
  31. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/catalog.rs +0 -0
  32. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/cbor.rs +0 -0
  33. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  34. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  35. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/corpus.rs +0 -0
  36. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  37. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  38. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  39. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  40. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  41. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  42. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  43. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/dtype.rs +0 -0
  44. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/durability.rs +0 -0
  45. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/err.rs +0 -0
  46. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fetch.rs +0 -0
  47. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fill.rs +0 -0
  48. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fit.rs +0 -0
  49. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/gc.rs +0 -0
  50. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/header.rs +0 -0
  51. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/home.rs +0 -0
  52. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ids.rs +0 -0
  53. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  54. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  55. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  56. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  57. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  58. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  59. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  60. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  61. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  62. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  63. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  64. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  65. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/jcs.rs +0 -0
  66. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/lib.rs +0 -0
  67. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/limits.rs +0 -0
  68. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/machine.rs +0 -0
  69. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/manifest.rs +0 -0
  70. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/project.rs +0 -0
  71. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/providers.rs +0 -0
  72. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/read.rs +0 -0
  73. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/receipt.rs +0 -0
  74. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/reclaim.rs +0 -0
  75. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/registry.rs +0 -0
  76. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/relation.rs +0 -0
  77. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
  78. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  79. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repository.rs +0 -0
  80. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/sha256.rs +0 -0
  81. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  82. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/spec.rs +0 -0
  83. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/staging.rs +0 -0
  84. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/stats.rs +0 -0
  85. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/storage.rs +0 -0
  86. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/store.rs +0 -0
  87. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/api.rs +0 -0
  88. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/http.rs +0 -0
  89. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  90. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  91. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  92. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  93. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  94. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  95. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  96. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  97. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  98. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/push.rs +0 -0
  99. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  100. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
  101. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  102. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/vectors.rs +0 -0
  103. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  104. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  105. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  106. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  107. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fit.rs +0 -0
  108. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  109. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  110. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  111. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  112. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  113. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  114. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  115. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  116. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  117. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  118. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/home.rs +0 -0
  119. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  120. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  121. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/liveness.rs +0 -0
  122. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  123. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  124. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  125. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  126. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  127. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  128. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  129. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  130. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  131. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_download.rs +0 -0
  132. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  133. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  134. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  135. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/staging.rs +0 -0
  136. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  137. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  138. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  139. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  140. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/version.rs +0 -0
  141. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/write_through.rs +0 -0
  142. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/Cargo.toml +0 -0
  143. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/docs.rs +0 -0
  144. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/errors.rs +0 -0
  145. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/ingest.rs +0 -0
  146. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/lib.rs +0 -0
  147. {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/store.rs +0 -0
  148. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/__init__.py +0 -0
  149. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_derived_channel.py +0 -0
  150. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_ext.pyi +0 -0
  151. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_source_channel.py +0 -0
  152. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_tensors.py +0 -0
  153. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/derived.py +0 -0
  154. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/errors.py +0 -0
  155. {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/py.typed +0 -0
@@ -439,7 +439,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
439
439
 
440
440
  [[package]]
441
441
  name = "tensorfs-core"
442
- version = "0.3.62"
442
+ version = "0.3.63"
443
443
  dependencies = [
444
444
  "fs2",
445
445
  "libc",
@@ -454,7 +454,7 @@ dependencies = [
454
454
 
455
455
  [[package]]
456
456
  name = "tensorfs-py"
457
- version = "0.3.62"
457
+ version = "0.3.63"
458
458
  dependencies = [
459
459
  "pyo3",
460
460
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.62"
6
+ version = "0.3.63"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.62
3
+ Version: 0.3.63
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -25,7 +25,12 @@ fn fixture(label: &str) -> (Store, Meta, String, Declaration) {
25
25
  .map(|index| ("model".into(), format!("weight_{index}")))
26
26
  .collect();
27
27
  declaration.max_new_bytes = 3 * 512;
28
- (store, meta, format!("sha256:{}", "7a".repeat(32)), declaration)
28
+ (
29
+ store,
30
+ meta,
31
+ format!("sha256:{}", "7a".repeat(32)),
32
+ declaration,
33
+ )
29
34
  }
30
35
 
31
36
  fn catalog(store: &Store) -> rusqlite::Connection {
@@ -55,9 +60,16 @@ fn stored_rows(store: &Store, id: &str) -> (usize, Option<i64>, i64) {
55
60
  )
56
61
  .unwrap();
57
62
  let value = crate::canon::parse_canonical(&bytes, limits::DOC_MAX_BYTES).unwrap();
58
- let inline = TransactionRow::from_value(&value).unwrap().added_parts.len();
63
+ let inline = TransactionRow::from_value(&value)
64
+ .unwrap()
65
+ .added_parts
66
+ .len();
59
67
  let parts = connection
60
- .query_row("SELECT count(*) FROM tensorfs_derived_parts WHERE id=?1", [id], |row| row.get(0))
68
+ .query_row(
69
+ "SELECT count(*) FROM tensorfs_derived_parts WHERE id=?1",
70
+ [id],
71
+ |row| row.get(0),
72
+ )
61
73
  .unwrap();
62
74
  (inline, open, parts)
63
75
  }
@@ -74,14 +86,18 @@ fn parts_are_rows_that_resume_refuse_conflicts_and_stay_retained() {
74
86
  add(&store, &meta, &id, &writer, "weight_0", 1).unwrap();
75
87
  assert_eq!(stored_rows(&store, &id).2, 2);
76
88
  assert_eq!(
77
- add(&store, &meta, &id, &writer, "weight_0", 9).unwrap_err().code,
89
+ add(&store, &meta, &id, &writer, "weight_0", 9)
90
+ .unwrap_err()
91
+ .code,
78
92
  Code::TRANSACTION_CONFLICT
79
93
  );
80
94
  // A fenced writer cannot add. Once it is gone, GC keeps its accepted bytes through
81
95
  // the append-only journal alone, and its successor resumes with both parts.
82
96
  fence(&meta, &id, 1).unwrap();
83
97
  assert_eq!(
84
- add(&store, &meta, &id, &writer, "weight_2", 3).unwrap_err().code,
98
+ add(&store, &meta, &id, &writer, "weight_2", 3)
99
+ .unwrap_err()
100
+ .code,
85
101
  Code::WRITER_FENCED
86
102
  );
87
103
  release_guards(&meta, Some(writer.writer_hold), writer.source_leases);
@@ -135,7 +151,9 @@ fn an_older_builds_inline_row_and_a_torn_journal_line_are_read() {
135
151
  std::fs::write(&journal, torn).unwrap();
136
152
 
137
153
  assert_eq!(
138
- add(&store, &meta, &id, &writer, "weight_0", 9).unwrap_err().code,
154
+ add(&store, &meta, &id, &writer, "weight_0", 9)
155
+ .unwrap_err()
156
+ .code,
139
157
  Code::TRANSACTION_CONFLICT
140
158
  );
141
159
  add(&store, &meta, &id, &writer, "weight_1", 2).unwrap();
@@ -2,8 +2,8 @@
2
2
  //! metadata journals lifecycle; GC never needs that database to discover retained bytes.
3
3
 
4
4
  use std::fs::{self, File, OpenOptions};
5
- use std::os::unix::fs::FileExt;
6
5
  use std::io::{Read, Write};
6
+ use std::os::unix::fs::FileExt;
7
7
  use std::path::PathBuf;
8
8
 
9
9
  use crate::canon::{Fields, Value};
@@ -164,7 +164,11 @@ pub(super) fn append_parts(store: &Store, transaction: &str, objects: &[ObjectRe
164
164
  file.read_exact_at(&mut last, length - 1).map_err(io)?;
165
165
  }
166
166
  // Terminate a line torn by a dead writer so this one parses on its own.
167
- let mut bytes = if last[0] == b'\n' { Vec::new() } else { vec![b'\n'] };
167
+ let mut bytes = if last[0] == b'\n' {
168
+ Vec::new()
169
+ } else {
170
+ vec![b'\n']
171
+ };
168
172
  bytes.extend(parts_line(objects));
169
173
  file.write_all(&bytes)
170
174
  .and_then(|()| file.sync_data())
@@ -185,7 +189,11 @@ pub(super) fn rewrite_parts(store: &Store, transaction: &str, objects: &[ObjectR
185
189
  .create_new(true)
186
190
  .open(&temporary)
187
191
  .map_err(io)?;
188
- let bytes = if objects.is_empty() { Vec::new() } else { parts_line(objects) };
192
+ let bytes = if objects.is_empty() {
193
+ Vec::new()
194
+ } else {
195
+ parts_line(objects)
196
+ };
189
197
  file.write_all(&bytes)
190
198
  .and_then(|()| file.sync_all())
191
199
  .map_err(io)?;
@@ -211,8 +219,12 @@ pub(super) fn journaled(store: &Store) -> Result<Vec<ObjectRef>> {
211
219
  Err(error) if error.kind() == std::io::ErrorKind::NotFound => continue,
212
220
  Err(error) => return Err(io(error)),
213
221
  };
214
- for line in bytes.split(|byte| *byte == b'\n').filter(|line| !line.is_empty()) {
215
- let Ok(value) = crate::canon::parse_canonical(line, crate::limits::DOC_MAX_BYTES) else {
222
+ for line in bytes
223
+ .split(|byte| *byte == b'\n')
224
+ .filter(|line| !line.is_empty())
225
+ {
226
+ let Ok(value) = crate::canon::parse_canonical(line, crate::limits::DOC_MAX_BYTES)
227
+ else {
216
228
  continue;
217
229
  };
218
230
  for value in crate::canon::as_arr("PrivateDerivedParts", "objects", &value)? {
@@ -1168,11 +1168,19 @@ pub(crate) fn part_bytes(part: &Part) -> Vec<u8> {
1168
1168
  }
1169
1169
 
1170
1170
  impl AddedPart {
1171
- pub(crate) fn stored(component: String, key: String, role: String, bytes: &[u8]) -> Result<Self> {
1171
+ pub(crate) fn stored(
1172
+ component: String,
1173
+ key: String,
1174
+ role: String,
1175
+ bytes: &[u8],
1176
+ ) -> Result<Self> {
1172
1177
  name("added part component", &component)?;
1173
1178
  self::key("added part tensor", &key)?;
1174
1179
  name("added part role", &role)?;
1175
- let part = part_from_value(&crate::canon::parse_canonical(bytes, limits::DOC_MAX_BYTES)?)?;
1180
+ let part = part_from_value(&crate::canon::parse_canonical(
1181
+ bytes,
1182
+ limits::DOC_MAX_BYTES,
1183
+ )?)?;
1176
1184
  Ok(Self {
1177
1185
  component,
1178
1186
  key,
@@ -3005,7 +3013,11 @@ impl Additions {
3005
3013
  for tensor in &component.add {
3006
3014
  for part in &tensor.parts {
3007
3015
  parts.insert(
3008
- (component.target.clone(), tensor.key.clone(), part.role.clone()),
3016
+ (
3017
+ component.target.clone(),
3018
+ tensor.key.clone(),
3019
+ part.role.clone(),
3020
+ ),
3009
3021
  part.clone(),
3010
3022
  );
3011
3023
  }
@@ -3025,7 +3037,11 @@ impl Additions {
3025
3037
  fn get(&self, (component, tensor_key, role): (&str, &str, &str)) -> Result<&PartDeclaration> {
3026
3038
  let part = self
3027
3039
  .parts
3028
- .get(&(component.to_string(), tensor_key.to_string(), role.to_string()))
3040
+ .get(&(
3041
+ component.to_string(),
3042
+ tensor_key.to_string(),
3043
+ role.to_string(),
3044
+ ))
3029
3045
  .ok_or_else(|| Refusal {
3030
3046
  code: Code::MISSING_FIELD,
3031
3047
  detail: format!("{component}/{tensor_key}#{role} is not a declared addition"),
@@ -3093,7 +3109,15 @@ pub fn add_part<R: Read>(
3093
3109
  reader: &mut R,
3094
3110
  ) -> Result<crate::checkpoint::Written> {
3095
3111
  let additions = Additions::load(meta, transaction, writer_session)?;
3096
- add_indexed_part(store, meta, transaction, writer_session, &additions, value, reader)
3112
+ add_indexed_part(
3113
+ store,
3114
+ meta,
3115
+ transaction,
3116
+ writer_session,
3117
+ &additions,
3118
+ value,
3119
+ reader,
3120
+ )
3097
3121
  }
3098
3122
 
3099
3123
  /// Accept one part. The cost is this part's bytes plus one indexed SQL row: the
@@ -172,9 +172,11 @@ impl Meta {
172
172
  .optional()
173
173
  .map_err(|error| sql("read accepted part", error))?
174
174
  .or_else(|| {
175
- legacy.iter().flatten().find(|old| old.same_value(added)).map(|old| {
176
- crate::derived::part_bytes(&old.part)
177
- })
175
+ legacy
176
+ .iter()
177
+ .flatten()
178
+ .find(|old| old.same_value(added))
179
+ .map(|old| crate::derived::part_bytes(&old.part))
178
180
  });
179
181
  match existing {
180
182
  Some(existing) if existing == bytes => {
@@ -0,0 +1,166 @@
1
+ //! Real header-only evidence for the Hugging Face Diffusers release of Anima Base v1.0: its four
2
+ //! components classify against the entries already banked from Civitai 2945208, so the source
3
+ //! profile is the only new data. No tensor payload is downloaded or read.
4
+ use std::{fs, path::PathBuf};
5
+ use tensorfs_core::{
6
+ canon::{self, Value},
7
+ dtype::Dtype,
8
+ err::Code,
9
+ ids::ObjectRef,
10
+ ingest::{
11
+ fingerprint, preflight,
12
+ source::{self, BUILTIN_REGISTRY, BUILTIN_REGISTRY_BYTES},
13
+ },
14
+ limits,
15
+ providers::MemberHead,
16
+ };
17
+
18
+ const PROFILE: &str = "hf/circlestone-labs/anima-base-v1.0-diffusers/bf16/1";
19
+
20
+ fn root() -> PathBuf {
21
+ PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../vectors/anima-hf-headers")
22
+ }
23
+
24
+ fn field<'a>(value: &'a Value, name: &str) -> &'a Value {
25
+ let Value::Obj(rows) = value else {
26
+ panic!("object")
27
+ };
28
+ &rows.iter().find(|(key, _)| key == name).unwrap().1
29
+ }
30
+
31
+ fn text(value: &Value) -> &str {
32
+ let Value::Str(value) = value else {
33
+ panic!("string")
34
+ };
35
+ value
36
+ }
37
+
38
+ fn number(value: &Value) -> u64 {
39
+ let Value::Int(value) = value else {
40
+ panic!("integer")
41
+ };
42
+ (*value).try_into().unwrap()
43
+ }
44
+
45
+ fn heads() -> Vec<MemberHead> {
46
+ let manifest = canon::parse(
47
+ &fs::read(root().join("MANIFEST.json")).unwrap(),
48
+ limits::DOC_MAX_BYTES,
49
+ )
50
+ .unwrap();
51
+ let Value::Arr(rows) = field(&manifest, "members") else {
52
+ panic!("members")
53
+ };
54
+ rows.iter()
55
+ .map(|row| {
56
+ let head = fs::read(root().join(text(field(row, "header_file")))).unwrap();
57
+ assert_eq!(
58
+ ObjectRef::of(&head).sha256,
59
+ text(field(row, "header_sha256"))
60
+ );
61
+ MemberHead {
62
+ member: text(field(row, "member")).into(),
63
+ length: number(field(row, "full_length")),
64
+ head,
65
+ }
66
+ })
67
+ .collect()
68
+ }
69
+
70
+ fn scratch(name: &str) -> PathBuf {
71
+ std::env::temp_dir().join(format!(
72
+ "anima-hf-{name}-{}-{}",
73
+ std::process::id(),
74
+ tensorfs_core::meta::now_nanos_unique()
75
+ ))
76
+ }
77
+
78
+ #[test]
79
+ fn anima_hf_diffusers_plans_against_the_banked_keysets_without_payloads() {
80
+ let heads = heads();
81
+ let path = scratch("plan");
82
+ let decision = preflight::plan(
83
+ BUILTIN_REGISTRY,
84
+ BUILTIN_REGISTRY_BYTES,
85
+ &heads,
86
+ &[PROFILE.into()],
87
+ &path,
88
+ )
89
+ .unwrap();
90
+ assert!(!path.exists());
91
+ assert_eq!(decision.plans.len(), 1);
92
+ assert_eq!(decision.plans[0].constructs, 1189);
93
+ assert_eq!(decision.plans[0].components.len(), 4);
94
+ assert_eq!(decision.plans[0].converter, "diffusers.identity/1");
95
+
96
+ let staged = preflight::stage(&path, &heads).unwrap();
97
+ let native = source::plan_source(
98
+ BUILTIN_REGISTRY,
99
+ BUILTIN_REGISTRY_BYTES,
100
+ staged.carriers(),
101
+ Some(PROFILE),
102
+ None,
103
+ )
104
+ .unwrap();
105
+ assert_eq!(native.session, decision.plans[0].session);
106
+ let recorded = canon::parse(
107
+ &fs::read(root().join("construction_order.json")).unwrap(),
108
+ limits::DOC_MAX_BYTES,
109
+ )
110
+ .unwrap();
111
+ let actual = Value::arr(
112
+ native
113
+ .construction_order
114
+ .iter()
115
+ .map(|(component, key)| Value::arr(vec![Value::str(component), Value::str(key)]))
116
+ .collect(),
117
+ );
118
+ assert_eq!(actual, recorded);
119
+
120
+ let registry = fingerprint::FingerprintRegistry::parse(BUILTIN_REGISTRY_BYTES).unwrap();
121
+ let carriers = source::CarrierSet::of(staged.carriers());
122
+ for (component, member, count) in [
123
+ (
124
+ "transformer",
125
+ "transformer/diffusion_pytorch_model.safetensors",
126
+ 567,
127
+ ),
128
+ ("text_encoder", "text_encoder/model.safetensors", 310),
129
+ (
130
+ "text_conditioner",
131
+ "text_conditioner/diffusion_pytorch_model.safetensors",
132
+ 118,
133
+ ),
134
+ ("vae", "vae/diffusion_pytorch_model.safetensors", 194),
135
+ ] {
136
+ let carrier = staged
137
+ .carriers()
138
+ .iter()
139
+ .find(|row| row.member.as_deref() == Some(member))
140
+ .unwrap();
141
+ let (header, _) = source::read_carrier(carrier, &carriers).unwrap();
142
+ let observed = fingerprint::fingerprint(component, &header).unwrap();
143
+ assert_eq!(observed.dtypes, vec![(Dtype::Bf16, count)]);
144
+ let banked = registry.authorize(component, &observed).unwrap();
145
+ assert!(banked.provenance.source.contains("2945208"), "{component}");
146
+ }
147
+ drop(staged);
148
+ assert!(!path.exists());
149
+ }
150
+
151
+ #[test]
152
+ fn anima_hf_refuses_a_missing_component_before_payload_transfer() {
153
+ let mut heads = heads();
154
+ heads.retain(|row| row.member != "vae/diffusion_pytorch_model.safetensors");
155
+ let path = scratch("missing");
156
+ let error = preflight::plan(
157
+ BUILTIN_REGISTRY,
158
+ BUILTIN_REGISTRY_BYTES,
159
+ &heads,
160
+ &[PROFILE.into()],
161
+ &path,
162
+ )
163
+ .unwrap_err();
164
+ assert_ne!(error.code, Code::IO_FAILED, "{error:?}");
165
+ assert!(!path.exists());
166
+ }
@@ -160,7 +160,7 @@ fn qwen_image21_refuses_missing_shard_before_payload_transfer() {
160
160
  }
161
161
 
162
162
  #[test]
163
- fn qwen_image21_refuses_same_keys_with_changed_precision() {
163
+ fn qwen_image21_same_keys_at_another_precision_classify_by_key_set() {
164
164
  let mut heads = heads();
165
165
  for row in &mut heads {
166
166
  if row.member.starts_with("transformer/") && row.member.ends_with(".safetensors") {
@@ -181,15 +181,16 @@ fn qwen_image21_refuses_same_keys_with_changed_precision() {
181
181
  row.head[8..].copy_from_slice(&encoded);
182
182
  }
183
183
  }
184
+ // Owner ruling: the reviewed key set and component classify; conversion validates dtypes.
184
185
  let path = scratch("precision");
185
- let error = preflight::plan(
186
+ let decision = preflight::plan(
186
187
  BUILTIN_REGISTRY,
187
188
  BUILTIN_REGISTRY_BYTES,
188
189
  &heads,
189
190
  &[PROFILE.into()],
190
191
  &path,
191
192
  )
192
- .unwrap_err();
193
- assert_eq!(error.code, Code::UNREGISTERED_FINGERPRINT);
193
+ .unwrap();
194
+ assert_eq!(decision.plans[0].constructs, 1285);
194
195
  assert!(!path.exists());
195
196
  }
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.62"
7
+ version = "0.3.63"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [