tensorfs 0.3.89__tar.gz → 0.3.90__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 (204) hide show
  1. {tensorfs-0.3.89 → tensorfs-0.3.90}/Cargo.lock +3 -3
  2. {tensorfs-0.3.89 → tensorfs-0.3.90}/Cargo.toml +1 -1
  3. {tensorfs-0.3.89 → tensorfs-0.3.90}/PKG-INFO +1 -1
  4. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ingest.rs +8 -8
  5. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/err.rs +3 -0
  6. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/fit.rs +53 -21
  7. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/fingerprint.rs +36 -1
  8. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/h3_lora.rs +25 -1
  9. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/source.rs +131 -32
  10. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/machine.rs +11 -4
  11. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/providers.rs +97 -10
  12. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/civitai_anima.rs +2 -2
  13. tensorfs-0.3.90/crates/tensorfs-core/tests/fit.rs +192 -0
  14. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/h3_lora.rs +380 -63
  15. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/host_tier.rs +49 -0
  16. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/store.rs +16 -10
  17. {tensorfs-0.3.89 → tensorfs-0.3.90}/pyproject.toml +1 -1
  18. tensorfs-0.3.89/crates/tensorfs-core/tests/fit.rs +0 -83
  19. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/Cargo.toml +0 -0
  20. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/build.rs +0 -0
  21. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  22. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  23. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  24. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  25. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/asset_update.rs +0 -0
  26. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/b64.rs +0 -0
  27. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  28. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  29. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
  30. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  31. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  32. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  33. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  34. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  35. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  36. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  37. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/canon.rs +0 -0
  38. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/capability.rs +0 -0
  39. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  40. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/catalog.rs +0 -0
  41. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/cbor.rs +0 -0
  42. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  43. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  44. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/corpus.rs +0 -0
  45. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  46. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  47. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  48. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  49. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  50. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  51. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  52. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  53. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  54. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  55. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  56. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived.rs +0 -0
  57. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/descriptors.rs +0 -0
  58. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/disk.rs +0 -0
  59. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/dtype.rs +0 -0
  60. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/durability.rs +0 -0
  61. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
  62. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  63. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure.rs +0 -0
  64. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/fetch.rs +0 -0
  65. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
  66. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/fill.rs +0 -0
  67. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/gc.rs +0 -0
  68. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/header.rs +0 -0
  69. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/home.rs +0 -0
  70. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ids.rs +0 -0
  71. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  72. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  73. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  74. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  75. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  76. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  77. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  78. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  79. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  80. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  81. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  82. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  83. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  84. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  85. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  86. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/jcs.rs +0 -0
  87. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
  88. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/lib.rs +0 -0
  89. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/limits.rs +0 -0
  90. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/manifest.rs +0 -0
  91. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/meta.rs +0 -0
  92. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/project.rs +0 -0
  93. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/read.rs +0 -0
  94. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/receipt.rs +0 -0
  95. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/reclaim.rs +0 -0
  96. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/registry.rs +0 -0
  97. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/relation.rs +0 -0
  98. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  99. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/repository.rs +0 -0
  100. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/sha256.rs +0 -0
  101. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  102. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/spec.rs +0 -0
  103. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/staging.rs +0 -0
  104. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/stats.rs +0 -0
  105. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/storage.rs +0 -0
  106. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/store.rs +0 -0
  107. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/api.rs +0 -0
  108. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
  109. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/download.rs +0 -0
  110. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/http.rs +0 -0
  111. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  112. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  113. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  114. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  115. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  116. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  117. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  118. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/push.rs +0 -0
  119. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/sources.rs +0 -0
  120. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
  121. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  122. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/unsynced.rs +0 -0
  123. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/src/vectors.rs +0 -0
  124. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  125. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  126. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/as_is.rs +0 -0
  127. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  128. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  129. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  130. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/ensure.rs +0 -0
  131. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  132. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  133. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
  134. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  135. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  136. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  137. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  138. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  139. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  140. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  141. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  142. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  143. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  144. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/home.rs +0 -0
  145. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  146. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  147. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  148. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
  149. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/liveness.rs +0 -0
  150. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  151. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  152. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  153. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  154. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  155. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  156. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  157. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  158. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  159. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  160. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  161. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_download.rs +0 -0
  162. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  163. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  164. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  165. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/staging.rs +0 -0
  166. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  167. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  168. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  169. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  170. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/version.rs +0 -0
  171. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-core/tests/write_through.rs +0 -0
  172. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/API.md +0 -0
  173. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/Cargo.toml +0 -0
  174. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
  175. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
  176. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
  177. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/cuda.rs +0 -0
  178. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/cursor.rs +0 -0
  179. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/device.rs +0 -0
  180. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/faults.rs +0 -0
  181. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/host.rs +0 -0
  182. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/io.rs +0 -0
  183. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/layout.rs +0 -0
  184. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/lib.rs +0 -0
  185. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/src/plane.rs +0 -0
  186. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/common/mod.rs +0 -0
  187. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/gpu.rs +0 -0
  188. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/Cargo.toml +0 -0
  189. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/docs.rs +0 -0
  190. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/ensure.rs +0 -0
  191. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/errors.rs +0 -0
  192. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/ingest.rs +0 -0
  193. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/lib.rs +0 -0
  194. {tensorfs-0.3.89 → tensorfs-0.3.90}/crates/tensorfs-py/src/plane.rs +0 -0
  195. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/__init__.py +0 -0
  196. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/_derived_channel.py +0 -0
  197. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/_ext.pyi +0 -0
  198. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/_source_channel.py +0 -0
  199. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/_tensors.py +0 -0
  200. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/derived.py +0 -0
  201. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/errors.py +0 -0
  202. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/plane.py +0 -0
  203. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/plane.pyi +0 -0
  204. {tensorfs-0.3.89 → tensorfs-0.3.90}/python/tensorfs/py.typed +0 -0
@@ -449,7 +449,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
449
449
 
450
450
  [[package]]
451
451
  name = "tensorfs-core"
452
- version = "0.3.89"
452
+ version = "0.3.90"
453
453
  dependencies = [
454
454
  "fs2",
455
455
  "libc",
@@ -464,7 +464,7 @@ dependencies = [
464
464
 
465
465
  [[package]]
466
466
  name = "tensorfs-plane"
467
- version = "0.3.89"
467
+ version = "0.3.90"
468
468
  dependencies = [
469
469
  "libc",
470
470
  "libloading",
@@ -474,7 +474,7 @@ dependencies = [
474
474
 
475
475
  [[package]]
476
476
  name = "tensorfs-py"
477
- version = "0.3.89"
477
+ version = "0.3.90"
478
478
  dependencies = [
479
479
  "pyo3",
480
480
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-plane", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.89"
6
+ version = "0.3.90"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.89
3
+ Version: 0.3.90
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -575,6 +575,7 @@ pub fn cmd_bank(dialect: &str, converter: &str, f: &Flags) -> ExitCode {
575
575
  }
576
576
  let profile = SourceProfile {
577
577
  auto_select: true,
578
+ grammar: None,
578
579
  name: name.to_string(),
579
580
  components,
580
581
  };
@@ -589,7 +590,7 @@ pub fn cmd_bank(dialect: &str, converter: &str, f: &Flags) -> ExitCode {
589
590
  &target,
590
591
  &unnamed(&srcs),
591
592
  &CarrierSet::default(),
592
- Some(&reg),
593
+ source_core::Classify::Banked(&reg),
593
594
  variant,
594
595
  ) {
595
596
  Ok(prepared) => prepared,
@@ -659,6 +660,7 @@ pub fn cmd_source_plan(f: &Flags) -> ExitCode {
659
660
 
660
661
  struct ClosedSourcePlan {
661
662
  converter: String,
663
+ profile: String,
662
664
  order: Vec<(String, String)>,
663
665
  registry: String,
664
666
  session: String,
@@ -828,6 +830,7 @@ fn read_closed_source_plan(path: &Path) -> Result<ClosedSourcePlan, ExitCode> {
828
830
  }
829
831
  Ok(ClosedSourcePlan {
830
832
  converter,
833
+ profile,
831
834
  order,
832
835
  registry,
833
836
  session,
@@ -850,10 +853,7 @@ fn prepare_closed_source_plan(
850
853
  if closed.registry != BUILTIN_REGISTRY {
851
854
  flags.push(("registry".to_string(), closed.registry.clone()));
852
855
  }
853
- let as_is = closed.converter == convert::IDENTITY;
854
- if as_is {
855
- flags.push(("source-profile".to_string(), source_core::AS_IS.to_string()));
856
- }
856
+ flags.push(("source-profile".to_string(), closed.profile.clone()));
857
857
  for (component, source) in &closed.sources {
858
858
  flags.push((
859
859
  "source".to_string(),
@@ -865,7 +865,7 @@ fn prepare_closed_source_plan(
865
865
  &closed.target,
866
866
  &closed.sources,
867
867
  &closed.set,
868
- (!as_is).then_some(&registry),
868
+ source_core::classify(&registry, &closed.profile).map_err(bail)?,
869
869
  None,
870
870
  )
871
871
  .map_err(bail)?;
@@ -1000,12 +1000,12 @@ fn prepare(f: &Flags, target: &str) -> Result<Prepared, ExitCode> {
1000
1000
  let sources = sources(f)?;
1001
1001
  let registry = load_registry(f)?;
1002
1002
  let variant = flag(f, "spec-variant").and_then(|value| value.parse().ok());
1003
- let as_is = flag(f, "source-profile") == Some(source_core::AS_IS);
1004
1003
  source_core::prepare(
1005
1004
  target,
1006
1005
  &unnamed(&sources),
1007
1006
  &CarrierSet::default(),
1008
- (!as_is).then_some(&registry),
1007
+ source_core::classify(&registry, flag(f, "source-profile").unwrap_or_default())
1008
+ .map_err(bail)?,
1009
1009
  variant,
1010
1010
  )
1011
1011
  .map_err(bail)
@@ -134,6 +134,9 @@ codes![
134
134
  PLACEMENT_UNFIT,
135
135
  CONVERT_SIZE_CAP,
136
136
  SEAM_UNBANKED,
137
+ // An adapter factor targets a module the reviewed converter cannot map; dropping it
138
+ // would change the adapter.
139
+ ADAPTER_TARGET_UNSUPPORTED,
137
140
  // ingest border: the temporary candidate transaction
138
141
  QUOTA_EXHAUSTED,
139
142
  ROOT_EXPIRED,
@@ -8,10 +8,13 @@
8
8
  use crate::capability::CapabilityRecords;
9
9
  use crate::dtype::Dtype;
10
10
  use crate::err::{refuse, Code, Result};
11
- use crate::header::{Closure, Header};
11
+ use crate::header::{Body, Closure, Header};
12
12
  use crate::ids::ascii_name;
13
13
  use crate::limits;
14
14
 
15
+ /// How many skipped keys the warning names.
16
+ const WARNED_KEYS: usize = 5;
17
+
15
18
  #[derive(Debug, Clone, PartialEq, Eq)]
16
19
  pub struct TensorRequirement {
17
20
  pub shape: Vec<u64>,
@@ -102,6 +105,7 @@ impl TensorRequirements {
102
105
  }
103
106
  }
104
107
 
108
+ /// Where the checkpoint came from. Accepted and echoed; it no longer changes the verdict.
105
109
  #[derive(Debug, Clone, Copy, PartialEq, Eq)]
106
110
  pub enum Custody {
107
111
  Canonical,
@@ -139,7 +143,11 @@ pub struct Routes {
139
143
  pub enum Fit {
140
144
  Ok {
141
145
  routes: Routes,
146
+ /// Stored tensors of a constructed component the code does not build, as
147
+ /// `component/key`: skipped, never loaded.
142
148
  ignored: Vec<String>,
149
+ /// What those tensors store, in bytes.
150
+ ignored_bytes: u64,
143
151
  device: Option<String>,
144
152
  },
145
153
  ComponentMissing {
@@ -162,6 +170,7 @@ pub enum Fit {
162
170
  required: Dtype,
163
171
  stored: Dtype,
164
172
  },
173
+ /// No longer answered: a stored key the code does not build is skipped (`Ok.ignored`).
165
174
  ExtraTensor {
166
175
  component: String,
167
176
  key: String,
@@ -207,13 +216,35 @@ impl Fit {
207
216
  matches!(self, Self::Ok { .. })
208
217
  }
209
218
 
219
+ /// The one line a caller shows when stored tensors were skipped: how many, how many
220
+ /// bytes, and the first few. A truncated model reads "420 stored tensor(s), 9.8 GB".
221
+ pub fn warning(&self) -> Option<String> {
222
+ let Self::Ok {
223
+ ignored,
224
+ ignored_bytes,
225
+ ..
226
+ } = self
227
+ else {
228
+ return None;
229
+ };
230
+ if ignored.is_empty() {
231
+ return None;
232
+ }
233
+ let more = match ignored.len().saturating_sub(WARNED_KEYS) {
234
+ 0 => String::new(),
235
+ more => format!(", and {more} more"),
236
+ };
237
+ Some(format!(
238
+ "{} stored tensor(s) the code does not build were skipped, not loaded: {} B ({}{more})",
239
+ ignored.len(),
240
+ ignored_bytes,
241
+ ignored[..ignored.len().min(WARNED_KEYS)].join(", "),
242
+ ))
243
+ }
244
+
210
245
  pub fn text(&self) -> String {
211
246
  match self {
212
- Self::Ok {
213
- routes,
214
- ignored,
215
- device,
216
- } => {
247
+ Self::Ok { routes, device, .. } => {
217
248
  let mut text = format!(
218
249
  "fits (routes: verbatim x{}, decoded_float x{}, encoded_gemm x{}",
219
250
  routes.verbatim, routes.decoded_float, routes.encoded_gemm
@@ -221,13 +252,10 @@ impl Fit {
221
252
  if let Some(device) = device {
222
253
  text.push_str(&format!("; encoded leaves qualified on {device}"));
223
254
  }
224
- if !ignored.is_empty() {
225
- text.push_str(&format!(
226
- "; {} stored key(s) ignored on local custody",
227
- ignored.len()
228
- ));
229
- }
230
255
  text.push(')');
256
+ if let Some(warning) = self.warning() {
257
+ text.push_str(&format!("; {warning}"));
258
+ }
231
259
  text
232
260
  }
233
261
  Self::ComponentMissing { component, present } => format!(
@@ -258,7 +286,7 @@ impl Fit {
258
286
  stored.name()
259
287
  ),
260
288
  Self::ExtraTensor { component, key } => {
261
- format!("{component}.{key}: stored but not constructed on a canonical checkpoint")
289
+ format!("{component}.{key}: stored but not constructed")
262
290
  }
263
291
  Self::EncodingUnsupported {
264
292
  component,
@@ -325,8 +353,9 @@ pub fn fit(
325
353
  ) -> Result<Fit> {
326
354
  header.validate(&Closure::default())?;
327
355
  let plain = plain_digest();
356
+ let _ = custody;
328
357
  let mut routes = Routes::default();
329
- let mut ignored = Vec::new();
358
+ let (mut ignored, mut ignored_bytes) = (Vec::new(), 0u64);
330
359
  let mut encoded = Vec::new();
331
360
 
332
361
  for (component, required_tensors) in requirements.components() {
@@ -389,20 +418,22 @@ pub fn fit(
389
418
  }
390
419
  }
391
420
 
392
- for (key, _) in stored_tensors {
421
+ // A stored key the code does not build is skipped, on every custody: the code may
422
+ // build less than an older checkpoint stores (Qwen's text encoder dropped `lm_head`).
423
+ for (key, stored) in stored_tensors {
393
424
  if required_tensors
394
425
  .iter()
395
426
  .any(|(required_key, _)| required_key == key)
396
427
  {
397
428
  continue;
398
429
  }
399
- if custody == Custody::Canonical {
400
- return Ok(Fit::ExtraTensor {
401
- component: component.clone(),
402
- key: key.clone(),
403
- });
404
- }
405
430
  ignored.push(format!("{component}/{key}"));
431
+ for (_, part) in &stored.parts {
432
+ ignored_bytes += match &part.body {
433
+ Body::Segments(objects) => objects.iter().map(|object| object.length).sum(),
434
+ Body::Inline(bytes) => bytes.len() as u64,
435
+ };
436
+ }
406
437
  }
407
438
  }
408
439
 
@@ -436,6 +467,7 @@ pub fn fit(
436
467
  Ok(Fit::Ok {
437
468
  routes,
438
469
  ignored,
470
+ ignored_bytes,
439
471
  device: device.map(str::to_string),
440
472
  })
441
473
  }
@@ -204,9 +204,20 @@ pub struct SourceProfile {
204
204
  /// Whether headers alone may choose this format. False requires the caller
205
205
  /// to declare the reviewed format; shapes cannot prove semantic row layout.
206
206
  pub auto_select: bool,
207
+ /// Set when a converter's planner, not banked key sets, recognizes the source.
208
+ pub grammar: Option<Grammar>,
207
209
  pub components: Vec<SourceProfileComponent>,
208
210
  }
209
211
 
212
+ /// A carrier matches when every key starts with `key_prefix` and the reviewed `converter`
213
+ /// plans it: the planner is the key grammar, so any valid subset of its reviewed modules
214
+ /// matches without a banked key list. Its keys construct in sorted order.
215
+ #[derive(Debug, Clone, PartialEq, Eq)]
216
+ pub struct Grammar {
217
+ pub converter: String,
218
+ pub key_prefix: String,
219
+ }
220
+
210
221
  #[derive(Debug, Clone, PartialEq, Eq)]
211
222
  pub struct SourceProfileComponent {
212
223
  pub component: String,
@@ -684,6 +695,13 @@ impl FingerprintRegistry {
684
695
  if !profile.auto_select {
685
696
  fields.push(("auto_select", Value::Bool(false)));
686
697
  }
698
+ if let Some(grammar) = &profile.grammar {
699
+ let converter = Value::str(grammar.converter.clone());
700
+ let key_prefix = Value::str(grammar.key_prefix.clone());
701
+ let grammar =
702
+ vec![("converter", converter), ("key_prefix", key_prefix)];
703
+ fields.push(("grammar", Value::obj(grammar)));
704
+ }
687
705
  Value::obj(fields)
688
706
  })
689
707
  .collect(),
@@ -705,6 +723,19 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
705
723
  Some(_) => return refuse(Code::WRONG_TYPE, "SourceProfile.auto_select must be bool"),
706
724
  };
707
725
  ascii_name("source profile", &name, limits::MAX_NAME_BYTES)?;
726
+ let grammar = match fields.opt("grammar") {
727
+ None => None,
728
+ Some(value) => {
729
+ let mut grammar = Fields::new("Grammar", value)?;
730
+ let converter = grammar.req_str("converter")?.to_string();
731
+ let key_prefix = grammar.req_str("key_prefix")?.to_string();
732
+ grammar.done()?;
733
+ Some(Grammar {
734
+ converter,
735
+ key_prefix,
736
+ })
737
+ }
738
+ };
708
739
  let mut components = Vec::new();
709
740
  for value in as_arr("SourceProfile", "components", fields.req("components")?)? {
710
741
  let mut component_fields = Fields::new("SourceProfileComponent", value)?;
@@ -795,7 +826,7 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
795
826
  ),
796
827
  );
797
828
  }
798
- if variants.is_empty() {
829
+ if variants.is_empty() && grammar.is_none() {
799
830
  return refuse(
800
831
  Code::MISSING_FIELD,
801
832
  format!("source profile {name:?} component {component:?} has no variants"),
@@ -853,6 +884,7 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
853
884
  profiles.push(SourceProfile {
854
885
  name,
855
886
  auto_select,
887
+ grammar,
856
888
  components,
857
889
  });
858
890
  }
@@ -1061,11 +1093,13 @@ mod tests {
1061
1093
  registry.source_profiles = vec![
1062
1094
  SourceProfile {
1063
1095
  auto_select: true,
1096
+ grammar: None,
1064
1097
  name: "profile/a".into(),
1065
1098
  components: vec![source_component(Some("a/model.index.json"), None)],
1066
1099
  },
1067
1100
  SourceProfile {
1068
1101
  auto_select: true,
1102
+ grammar: None,
1069
1103
  name: "profile/b".into(),
1070
1104
  components: vec![
1071
1105
  source_component(Some("b/model.safetensors"), None),
@@ -1089,6 +1123,7 @@ mod tests {
1089
1123
  let mut registry = registry();
1090
1124
  registry.source_profiles = vec![SourceProfile {
1091
1125
  auto_select: true,
1126
+ grammar: None,
1092
1127
  name: "profile/prefix".into(),
1093
1128
  components: vec![source_component(None, Some("weights/"))],
1094
1129
  }];
@@ -6,7 +6,8 @@
6
6
  //! checkpoint's head interleave is reordered before training, not exported again
7
7
  //! in adapter state dictionaries. This is structural conversion, not permission
8
8
  //! to apply a FL2VA-trained adapter to REF2VA. Runtime owns that binding and never
9
- //! parses foreign keys.
9
+ //! parses foreign keys. This planner is also the key grammar of the
10
+ //! `h3/native-lora-*/2` profiles: any complete pairs on the reviewed projections.
10
11
 
11
12
  use std::collections::BTreeMap;
12
13
 
@@ -160,6 +161,29 @@ pub(super) fn plan(
160
161
  plain: &EncodingSpec,
161
162
  p: &mut Plan,
162
163
  ) -> Result<()> {
164
+ let adaln: Vec<&str> = header
165
+ .tensors
166
+ .iter()
167
+ .map(|tensor| tensor.key.as_str())
168
+ .filter(|key| key.contains("adaln_proj"))
169
+ .collect();
170
+ if !adaln.is_empty() {
171
+ // Named in full: these are the factors a conversion would have to drop.
172
+ let more = match adaln.len().saturating_sub(4) {
173
+ 0 => String::new(),
174
+ more => format!(", and {more} more"),
175
+ };
176
+ return refuse(
177
+ Code::ADAPTER_TARGET_UNSUPPORTED,
178
+ format!(
179
+ "{} AdaLN modulation factor(s) ({}{more}). h3.lora/2 maps attention and MLP \
180
+ projections only, and dropping AdaLN pairs changes the adapter. Use a repack \
181
+ with the AdaLN pairs removed, or store the file as-is.",
182
+ adaln.len(),
183
+ adaln[..adaln.len().min(4)].join(", "),
184
+ ),
185
+ );
186
+ }
163
187
  let mut pairs: BTreeMap<String, Pair<'_>> = BTreeMap::new();
164
188
  for tensor in &header.tensors {
165
189
  if !matches!(tensor.dtype, Dtype::F16 | Dtype::Bf16 | Dtype::F32) {