tensorfs 0.3.66__tar.gz → 0.3.67__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 (158) hide show
  1. {tensorfs-0.3.66 → tensorfs-0.3.67}/Cargo.lock +2 -2
  2. {tensorfs-0.3.66 → tensorfs-0.3.67}/Cargo.toml +1 -1
  3. {tensorfs-0.3.66 → tensorfs-0.3.67}/PKG-INFO +1 -1
  4. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/rd.rs +9 -5
  5. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/read.rs +58 -57
  6. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/anima_hf_profile.rs +92 -0
  7. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/read_plan.rs +1 -1
  8. {tensorfs-0.3.66 → tensorfs-0.3.67}/pyproject.toml +1 -1
  9. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/Cargo.toml +0 -0
  10. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/build.rs +0 -0
  11. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  12. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  13. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  14. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  15. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/asset_update.rs +0 -0
  16. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/b64.rs +0 -0
  17. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  18. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  19. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  20. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  21. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  22. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  23. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  24. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  25. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  26. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/canon.rs +0 -0
  27. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/capability.rs +0 -0
  28. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/catalog.rs +0 -0
  29. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/cbor.rs +0 -0
  30. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  31. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  32. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/corpus.rs +0 -0
  33. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  34. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  35. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  36. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  37. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  38. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  39. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  40. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  41. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  42. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/derived.rs +0 -0
  43. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/descriptors.rs +0 -0
  44. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/dtype.rs +0 -0
  45. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/durability.rs +0 -0
  46. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/err.rs +0 -0
  47. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/fetch.rs +0 -0
  48. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/fill.rs +0 -0
  49. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/fit.rs +0 -0
  50. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/gc.rs +0 -0
  51. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/header.rs +0 -0
  52. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/home.rs +0 -0
  53. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ids.rs +0 -0
  54. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  55. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  56. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  57. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  58. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  59. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  60. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  61. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  62. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  63. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  64. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  65. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  66. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/jcs.rs +0 -0
  67. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/lib.rs +0 -0
  68. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/limits.rs +0 -0
  69. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/machine.rs +0 -0
  70. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/manifest.rs +0 -0
  71. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/meta.rs +0 -0
  72. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/project.rs +0 -0
  73. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/providers.rs +0 -0
  74. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/receipt.rs +0 -0
  75. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/reclaim.rs +0 -0
  76. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/registry.rs +0 -0
  77. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/relation.rs +0 -0
  78. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
  79. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  80. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/repository.rs +0 -0
  81. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/sha256.rs +0 -0
  82. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  83. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/spec.rs +0 -0
  84. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/staging.rs +0 -0
  85. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/stats.rs +0 -0
  86. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/storage.rs +0 -0
  87. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/store.rs +0 -0
  88. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/api.rs +0 -0
  89. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/http.rs +0 -0
  90. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  91. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  92. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  93. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  94. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  95. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  96. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  97. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  98. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  99. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/push.rs +0 -0
  100. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  101. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
  102. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  103. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/src/vectors.rs +0 -0
  104. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  105. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  106. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  107. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  108. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  109. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  110. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fit.rs +0 -0
  111. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  112. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  113. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  114. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  115. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  116. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  117. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  118. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  119. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  120. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  121. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/home.rs +0 -0
  122. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  123. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  124. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/liveness.rs +0 -0
  125. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  126. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  127. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  128. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  129. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  130. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  131. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  132. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  133. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  134. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/source_download.rs +0 -0
  135. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  136. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  137. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  138. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/staging.rs +0 -0
  139. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  140. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  141. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  142. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  143. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/version.rs +0 -0
  144. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-core/tests/write_through.rs +0 -0
  145. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/Cargo.toml +0 -0
  146. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/src/docs.rs +0 -0
  147. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/src/errors.rs +0 -0
  148. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/src/ingest.rs +0 -0
  149. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/src/lib.rs +0 -0
  150. {tensorfs-0.3.66 → tensorfs-0.3.67}/crates/tensorfs-py/src/store.rs +0 -0
  151. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/__init__.py +0 -0
  152. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/_derived_channel.py +0 -0
  153. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/_ext.pyi +0 -0
  154. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/_source_channel.py +0 -0
  155. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/_tensors.py +0 -0
  156. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/derived.py +0 -0
  157. {tensorfs-0.3.66 → tensorfs-0.3.67}/python/tensorfs/errors.py +0 -0
  158. {tensorfs-0.3.66 → tensorfs-0.3.67}/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.66"
442
+ version = "0.3.67"
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.66"
457
+ version = "0.3.67"
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.66"
6
+ version = "0.3.67"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.66
3
+ Version: 0.3.67
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -133,9 +133,13 @@ pub fn cmd_plan(root: &Path, hex: &str, f: &Flags) -> ExitCode {
133
133
  let mut rev = construction_order(&h);
134
134
  rev.reverse();
135
135
  println!(
136
- "contract: reversed caller traversal refuses: {}",
136
+ "contract: reversed caller traversal plans in its own order: {}",
137
137
  match read::plan_for_traversal(&h, &rev, &all_components(&h), window) {
138
- Err(e) if e.code == Code::TRAVERSAL_ORDER_MISMATCH => "YES",
138
+ Ok(p)
139
+ if p.items.first().is_some_and(|it| it
140
+ .what
141
+ .starts_with(&format!("{}/{}#", rev[0].0, rev[0].1))) =>
142
+ "YES",
139
143
  _ => "NO — DEFECT",
140
144
  }
141
145
  );
@@ -991,7 +995,7 @@ pub fn cmd_arms(root: &Path, hex: &str) -> ExitCode {
991
995
  short.pop();
992
996
  a.arm(
993
997
  "traversal missing a tensor",
994
- Code::TRAVERSAL_ORDER_MISMATCH,
998
+ Code::TRAVERSAL_INCOMPLETE,
995
999
  read::plan_for_traversal(&h, &short, &all_components(&h), 1 << 20),
996
1000
  );
997
1001
 
@@ -1026,7 +1030,7 @@ pub fn cmd_arms(root: &Path, hex: &str) -> ExitCode {
1026
1030
  holed.pop();
1027
1031
  a.arm(
1028
1032
  "a tensor missing WITHIN a requested component",
1029
- Code::TRAVERSAL_ORDER_MISMATCH,
1033
+ Code::TRAVERSAL_INCOMPLETE,
1030
1034
  read::plan_for_traversal(&h, &holed, only_one, 1 << 20),
1031
1035
  );
1032
1036
  }
@@ -1042,7 +1046,7 @@ pub fn cmd_arms(root: &Path, hex: &str) -> ExitCode {
1042
1046
  }
1043
1047
  a.arm(
1044
1048
  "a tensor from a component the plan did not request",
1045
- Code::TRAVERSAL_ORDER_MISMATCH,
1049
+ Code::TRAVERSAL_INCOMPLETE,
1046
1050
  read::plan_for_traversal(&h, &smuggled, only_one, 1 << 20),
1047
1051
  );
1048
1052
 
@@ -24,7 +24,7 @@ use std::time::Instant;
24
24
 
25
25
  use crate::checkpoint;
26
26
  use crate::err::{refuse, Code, Refusal, Result};
27
- use crate::header::{Asset, Body, Header, Located, Part};
27
+ use crate::header::{Asset, Body, Header, Located, Part, Tensor};
28
28
  use crate::ids::ObjectRef;
29
29
  use crate::manifest::Manifest;
30
30
  use crate::meta::{Hold, Meta};
@@ -594,48 +594,43 @@ impl ReadPlan {
594
594
  }
595
595
  }
596
596
 
597
- fn build(header: &Header, scope: &[&str], window: u64) -> Result<ReadPlan> {
597
+ fn build(ordered: &[(&str, &str, &Tensor)], window: u64) -> Result<ReadPlan> {
598
598
  let mut items = Vec::new();
599
599
  let mut dest: u64 = 0;
600
- for (comp, tensors) in &header.components {
601
- if !scope.contains(&comp.as_str()) {
602
- continue;
603
- }
604
- for (key, tensor) in tensors {
605
- for (role, part) in &tensor.parts {
606
- let what = format!("{comp}/{key}#{role}");
607
- if let Body::Inline(b) = &part.body {
608
- let n = part.nbytes(&what)?;
600
+ for (comp, key, tensor) in ordered {
601
+ for (role, part) in &tensor.parts {
602
+ let what = format!("{comp}/{key}#{role}");
603
+ if let Body::Inline(b) = &part.body {
604
+ let n = part.nbytes(&what)?;
605
+ items.push(PlanItem {
606
+ what: what.clone(),
607
+ dest_off: dest,
608
+ len: n,
609
+ source: Source::Inline(b.clone()),
610
+ });
611
+ dest += n;
612
+ continue;
613
+ }
614
+ for segment in part.segments() {
615
+ let mut off = 0u64;
616
+ while off < segment.length {
617
+ let n = if window == 0 {
618
+ segment.length - off
619
+ } else {
620
+ window.min(segment.length - off)
621
+ };
609
622
  items.push(PlanItem {
610
623
  what: what.clone(),
611
624
  dest_off: dest,
612
625
  len: n,
613
- source: Source::Inline(b.clone()),
626
+ source: Source::Object(ObjectRange {
627
+ obj: segment.clone(),
628
+ off,
629
+ len: n,
630
+ }),
614
631
  });
615
632
  dest += n;
616
- continue;
617
- }
618
- for segment in part.segments() {
619
- let mut off = 0u64;
620
- while off < segment.length {
621
- let n = if window == 0 {
622
- segment.length - off
623
- } else {
624
- window.min(segment.length - off)
625
- };
626
- items.push(PlanItem {
627
- what: what.clone(),
628
- dest_off: dest,
629
- len: n,
630
- source: Source::Object(ObjectRange {
631
- obj: segment.clone(),
632
- off,
633
- len: n,
634
- }),
635
- });
636
- dest += n;
637
- off += n;
638
- }
633
+ off += n;
639
634
  }
640
635
  }
641
636
  }
@@ -658,8 +653,10 @@ fn tally(items: &[PlanItem]) -> (u64, u64, usize) {
658
653
  (bytes, io_bytes, inline)
659
654
  }
660
655
 
661
- /// The read planner. Runtime's traversal must exactly equal the stored construction order;
662
- /// after that equality gate, planning walks the header once and never performs key lookup.
656
+ /// The read planner. The destination follows the CALLER's traversal, which is the order it
657
+ /// constructs in; the header's tensor order is a storage choice of whoever wrote it. The two
658
+ /// are written by independently versioned peers, so a permutation is planned, never refused:
659
+ /// only a traversal that names a different set of tensors is.
663
660
  ///
664
661
  /// COMPLETENESS SCOPES TO THE REQUESTED COMPONENT SET (#570b). `requested` is the caller's
665
662
  /// explicit declaration of which components this plan is for; the traversal must name every
@@ -716,34 +713,38 @@ pub fn plan_for_traversal(
716
713
  }
717
714
  }
718
715
 
719
- let named: Vec<(&str, &str)> = traversal
720
- .iter()
721
- .map(|(c, k)| (c.as_str(), k.as_str()))
722
- .collect();
723
- let have: Vec<(&str, &str)> = header
716
+ let mut carried: HashMap<(&str, &str), &Tensor> = header
724
717
  .tensors()
725
718
  .filter(|(c, _, _)| scope.contains(&c.as_str()))
726
- .map(|(c, k, _)| (c.as_str(), k.as_str()))
719
+ .map(|(c, k, t)| ((c.as_str(), k.as_str()), t))
727
720
  .collect();
728
- if named != have {
729
- let at = named
730
- .iter()
731
- .zip(have.iter())
732
- .position(|(got, want)| got != want)
733
- .unwrap_or(named.len().min(have.len()));
734
- let got = named.get(at).map(|(c, k)| format!("{c}/{k}"));
735
- let want = have.get(at).map(|(c, k)| format!("{c}/{k}"));
721
+ let mut ordered = Vec::with_capacity(traversal.len());
722
+ for (c, k) in traversal {
723
+ let Some(tensor) = carried.remove(&(c.as_str(), k.as_str())) else {
724
+ return refuse(
725
+ Code::TRAVERSAL_INCOMPLETE,
726
+ format!(
727
+ "the traversal names {c}/{k}, which requested components {scope:?} do \
728
+ not carry, or names it twice"
729
+ ),
730
+ );
731
+ };
732
+ ordered.push((c.as_str(), k.as_str(), tensor));
733
+ }
734
+ if !carried.is_empty() {
735
+ let mut missing: Vec<String> = carried.keys().map(|(c, k)| format!("{c}/{k}")).collect();
736
+ missing.sort();
737
+ missing.truncate(4);
736
738
  return refuse(
737
- Code::TRAVERSAL_ORDER_MISMATCH,
739
+ Code::TRAVERSAL_INCOMPLETE,
738
740
  format!(
739
- "construction order differs at row {at}: caller {got:?}, header {want:?}; \
740
- caller has {} rows and requested components {scope:?} carry {}",
741
- named.len(),
742
- have.len()
741
+ "the traversal omits {} tensor(s) requested components {scope:?} carry: \
742
+ {missing:?}",
743
+ carried.len()
743
744
  ),
744
745
  );
745
746
  }
746
- build(header, &scope, window)
747
+ build(&ordered, window)
747
748
  }
748
749
 
749
750
  // ---------------------------------------------------------------- the reader pool
@@ -6,6 +6,7 @@ use tensorfs_core::{
6
6
  canon::{self, Value},
7
7
  dtype::Dtype,
8
8
  err::Code,
9
+ header::{Header, Part, Tensor},
9
10
  ids::ObjectRef,
10
11
  ingest::{
11
12
  fingerprint, preflight,
@@ -13,6 +14,7 @@ use tensorfs_core::{
13
14
  },
14
15
  limits,
15
16
  providers::MemberHead,
17
+ read, registry,
16
18
  };
17
19
 
18
20
  const PROFILE: &str = "hf/circlestone-labs/anima-base-v1.0-diffusers/bf16/1";
@@ -175,3 +177,93 @@ fn anima_hf_selects_its_profile_without_being_named() {
175
177
  );
176
178
  assert!(!path.exists());
177
179
  }
180
+
181
+ /// The checkpoint stores the transformer in its files' order; Runtime constructs it in module
182
+ /// order and run 1404 asked for `patch_embed.proj.weight` first. Over the real 567 keys the
183
+ /// planner fills the caller's order and refuses only a traversal naming different tensors.
184
+ #[test]
185
+ fn anima_transformer_reads_in_the_callers_construction_order() {
186
+ let recorded = canon::parse(
187
+ &fs::read(root().join("construction_order.json")).unwrap(),
188
+ limits::DOC_MAX_BYTES,
189
+ )
190
+ .unwrap();
191
+ let Value::Arr(rows) = recorded else {
192
+ panic!("rows")
193
+ };
194
+ let stored: Vec<String> = rows
195
+ .iter()
196
+ .filter_map(|row| match row {
197
+ Value::Arr(pair) if text(&pair[0]) == "transformer" => Some(text(&pair[1]).into()),
198
+ _ => None,
199
+ })
200
+ .collect();
201
+ assert_eq!(stored.len(), 567);
202
+ let plain = registry::seeds()
203
+ .into_iter()
204
+ .find(|seed| seed.alias == "plain/1")
205
+ .unwrap()
206
+ .spec;
207
+ let tensors = stored
208
+ .iter()
209
+ .map(|key| {
210
+ let tensor = Tensor {
211
+ dtype: Dtype::Bf16,
212
+ shape: vec![1],
213
+ encoding: plain.object_id(),
214
+ parts: vec![("value".into(), Part::plan(Dtype::Bf16, vec![1], &[0, 0]))],
215
+ };
216
+ (key.clone(), tensor)
217
+ })
218
+ .collect();
219
+ let header = Header {
220
+ configs: Vec::new(),
221
+ assets: Vec::new(),
222
+ encodings: vec![plain],
223
+ components: vec![("transformer".into(), tensors)],
224
+ };
225
+ let header = Header::parse(&header.canonical_bytes().unwrap()).unwrap();
226
+ let modules = [
227
+ "patch_embed",
228
+ "time_embed",
229
+ "transformer_blocks",
230
+ "norm_out",
231
+ "proj_out",
232
+ ];
233
+ let rank = |key: &String| {
234
+ let mut parts = key.split('.');
235
+ let first = parts.next().unwrap();
236
+ let module = modules.iter().position(|m| *m == first).unwrap();
237
+ let block = parts
238
+ .next()
239
+ .and_then(|n| n.parse::<u32>().ok())
240
+ .unwrap_or(0);
241
+ (module, block, key.clone())
242
+ };
243
+ let mut constructed = stored.clone();
244
+ constructed.sort_by_key(rank);
245
+ assert_ne!(constructed, stored, "a real permutation");
246
+ let traversal: Vec<(String, String)> = constructed
247
+ .iter()
248
+ .map(|key| ("transformer".into(), key.clone()))
249
+ .collect();
250
+ let scope = ["transformer".to_string()];
251
+ let plan = read::plan_for_traversal(&header, &traversal, &scope, 1 << 20).unwrap();
252
+ let order: Vec<&str> = plan.items.iter().map(|item| item.what.as_str()).collect();
253
+ let expected: Vec<String> = constructed
254
+ .iter()
255
+ .map(|key| format!("transformer/{key}#value"))
256
+ .collect();
257
+ assert_eq!(order, expected);
258
+ assert_eq!(order[0], "transformer/patch_embed.proj.weight#value");
259
+ assert_eq!(plan.bytes, 2 * 567);
260
+
261
+ let mut holed = traversal.clone();
262
+ holed.remove(100);
263
+ let error = read::plan_for_traversal(&header, &holed, &scope, 1 << 20).unwrap_err();
264
+ assert_eq!(error.code, Code::TRAVERSAL_INCOMPLETE);
265
+ let mut repeated = traversal.clone();
266
+ repeated[100] = repeated[0].clone();
267
+ let error = read::plan_for_traversal(&header, &repeated, &scope, 1 << 20).unwrap_err();
268
+ assert_eq!(error.code, Code::TRAVERSAL_INCOMPLETE);
269
+ }
@@ -80,7 +80,7 @@ fn selection_does_not_weaken_the_complete_plan_gate() {
80
80
  plan_for_traversal(&header, &traversal[1..], &["model".into()], 128)
81
81
  .unwrap_err()
82
82
  .code,
83
- Code::TRAVERSAL_ORDER_MISMATCH
83
+ Code::TRAVERSAL_INCOMPLETE
84
84
  );
85
85
  let full = plan_for_traversal(&header, &traversal, &["model".into()], 128).unwrap();
86
86
  assert_eq!(
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.66"
7
+ version = "0.3.67"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [