invarlock 0.3.5__tar.gz → 0.3.7__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. {invarlock-0.3.5/src/invarlock.egg-info → invarlock-0.3.7}/PKG-INFO +27 -13
  2. {invarlock-0.3.5 → invarlock-0.3.7}/README.md +25 -12
  3. {invarlock-0.3.5 → invarlock-0.3.7}/pyproject.toml +7 -4
  4. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/__init__.py +2 -2
  5. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/tiers.yaml +57 -30
  6. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/__init__.py +11 -15
  7. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/auto.py +35 -40
  8. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/capabilities.py +2 -2
  9. invarlock-0.3.7/src/invarlock/adapters/hf_causal.py +418 -0
  10. invarlock-0.3.5/src/invarlock/adapters/hf_onnx.py → invarlock-0.3.7/src/invarlock/adapters/hf_causal_onnx.py +3 -3
  11. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/hf_mixin.py +25 -4
  12. invarlock-0.3.5/src/invarlock/adapters/hf_bert.py → invarlock-0.3.7/src/invarlock/adapters/hf_mlm.py +4 -11
  13. invarlock-0.3.5/src/invarlock/adapters/hf_t5.py → invarlock-0.3.7/src/invarlock/adapters/hf_seq2seq.py +9 -9
  14. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/spectral_null.py +15 -10
  15. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/variance_ve.py +0 -2
  16. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/adapter_auto.py +31 -21
  17. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/app.py +73 -2
  18. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/calibrate.py +6 -2
  19. invarlock-0.3.7/src/invarlock/cli/commands/certify.py +963 -0
  20. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/doctor.py +11 -11
  21. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/explain_gates.py +57 -8
  22. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/plugins.py +13 -9
  23. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/report.py +233 -69
  24. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/run.py +1066 -244
  25. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/verify.py +154 -15
  26. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/config.py +22 -6
  27. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/doctor_helpers.py +4 -5
  28. invarlock-0.3.7/src/invarlock/cli/output.py +193 -0
  29. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/provenance.py +1 -1
  30. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/api.py +45 -5
  31. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/auto_tuning.py +65 -20
  32. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/bootstrap.py +1 -1
  33. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/contracts.py +7 -1
  34. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/registry.py +11 -13
  35. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/runner.py +425 -75
  36. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/quant_rtn.py +65 -37
  37. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bench.py +3 -16
  38. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/data.py +82 -51
  39. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/metrics.py +63 -2
  40. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/primary_metric.py +23 -0
  41. invarlock-0.3.7/src/invarlock/eval/tail_stats.py +230 -0
  42. invarlock-0.3.7/src/invarlock/eval/tasks/__init__.py +12 -0
  43. invarlock-0.3.7/src/invarlock/eval/tasks/classification.py +48 -0
  44. invarlock-0.3.7/src/invarlock/eval/tasks/qa.py +36 -0
  45. invarlock-0.3.7/src/invarlock/eval/tasks/text_generation.py +102 -0
  46. invarlock-0.3.7/src/invarlock/guards/_estimators.py +154 -0
  47. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/invariants.py +19 -10
  48. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/policies.py +16 -6
  49. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/rmt.py +627 -546
  50. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/spectral.py +348 -110
  51. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/tier_config.py +32 -30
  52. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/variance.py +7 -31
  53. invarlock-0.3.7/src/invarlock/guards_ref/rmt_ref.py +40 -0
  54. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/model_profile.py +90 -42
  55. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/health.py +6 -6
  56. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/metrics.py +108 -0
  57. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/certificate.py +384 -55
  58. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/certificate_schema.py +3 -2
  59. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/dataset_hashing.py +15 -2
  60. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/guards_analysis.py +350 -277
  61. invarlock-0.3.7/src/invarlock/reporting/html.py +82 -0
  62. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/normalizer.py +13 -0
  63. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/policy_utils.py +38 -36
  64. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/primary_metric_utils.py +71 -17
  65. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/render.py +852 -431
  66. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/report.py +40 -4
  67. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/report_types.py +11 -3
  68. invarlock-0.3.7/src/invarlock/reporting/telemetry.py +86 -0
  69. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/validate.py +1 -18
  70. {invarlock-0.3.5 → invarlock-0.3.7/src/invarlock.egg-info}/PKG-INFO +27 -13
  71. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/SOURCES.txt +12 -5
  72. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/entry_points.txt +5 -3
  73. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/requires.txt +1 -0
  74. invarlock-0.3.5/src/invarlock/adapters/hf_gpt2.py +0 -404
  75. invarlock-0.3.5/src/invarlock/adapters/hf_llama.py +0 -487
  76. invarlock-0.3.5/src/invarlock/cli/commands/certify.py +0 -403
  77. invarlock-0.3.5/src/invarlock/guards_ref/rmt_ref.py +0 -40
  78. invarlock-0.3.5/src/invarlock/reporting/html.py +0 -32
  79. {invarlock-0.3.5 → invarlock-0.3.7}/LICENSE +0 -0
  80. {invarlock-0.3.5 → invarlock-0.3.7}/MANIFEST.in +0 -0
  81. {invarlock-0.3.5 → invarlock-0.3.7}/setup.cfg +0 -0
  82. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/__main__.py +0 -0
  83. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/ci_cpu.yaml +0 -0
  84. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/release.yaml +0 -0
  85. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/_capabilities.py +0 -0
  86. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/base.py +0 -0
  87. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/base_types.py +0 -0
  88. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/hf_loading.py +0 -0
  89. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/py.typed +0 -0
  90. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/assurance/__init__.py +0 -0
  91. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/__init__.py +0 -0
  92. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/__init__.py +0 -0
  93. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/__main__.py +0 -0
  94. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/_evidence.py +0 -0
  95. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/_json.py +0 -0
  96. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/__init__.py +0 -0
  97. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/export_html.py +0 -0
  98. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/constants.py +0 -0
  99. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/determinism.py +0 -0
  100. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/device.py +0 -0
  101. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/errors.py +0 -0
  102. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/overhead_utils.py +0 -0
  103. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/utils.py +0 -0
  104. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/config.py +0 -0
  105. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/__init__.py +0 -0
  106. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/abi.py +0 -0
  107. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/checkpoint.py +0 -0
  108. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/error_utils.py +0 -0
  109. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/events.py +0 -0
  110. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/exceptions.py +0 -0
  111. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/retry.py +0 -0
  112. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/types.py +0 -0
  113. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/__init__.py +0 -0
  114. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/_edit_utils.py +0 -0
  115. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/_external_utils.py +0 -0
  116. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/noop.py +0 -0
  117. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/py.typed +0 -0
  118. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/registry.py +0 -0
  119. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/__init__.py +0 -0
  120. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bench_regression.py +0 -0
  121. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bootstrap.py +0 -0
  122. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/__init__.py +0 -0
  123. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/fft.py +0 -0
  124. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/mi.py +0 -0
  125. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/post_attention.py +0 -0
  126. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/base.py +0 -0
  127. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/seq2seq.py +0 -0
  128. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/text_lm.py +0 -0
  129. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/vision_text.py +0 -0
  130. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/py.typed +0 -0
  131. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/__init__.py +0 -0
  132. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/_contracts.py +0 -0
  133. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/py.typed +0 -0
  134. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/__init__.py +0 -0
  135. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/spectral_ref.py +0 -0
  136. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/variance_ref.py +0 -0
  137. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/model_utils.py +0 -0
  138. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/__init__.py +0 -0
  139. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/alerting.py +0 -0
  140. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/core.py +0 -0
  141. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/exporters.py +0 -0
  142. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/py.typed +0 -0
  143. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/utils.py +0 -0
  144. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/__init__.py +0 -0
  145. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hello_guard.py +0 -0
  146. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_awq_adapter.py +0 -0
  147. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_bnb_adapter.py +0 -0
  148. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_gptq_adapter.py +0 -0
  149. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/py.typed +0 -0
  150. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/py.typed +0 -0
  151. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/__init__.py +0 -0
  152. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/utils.py +0 -0
  153. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/security.py +0 -0
  154. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/sparsity_utils.py +0 -0
  155. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/utils/__init__.py +0 -0
  156. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/utils/digest.py +0 -0
  157. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/dependency_links.txt +0 -0
  158. {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invarlock
3
- Version: 0.3.5
3
+ Version: 0.3.7
4
4
  Summary: Edit‑agnostic robustness certificates for weight edits (InvarLock framework)
5
5
  Author-email: InvarLock Team <oss@invarlock.dev>
6
6
  Maintainer-email: InvarLock Maintainers <support@invarlock.dev>
@@ -31,6 +31,7 @@ Requires-Dist: scikit-learn>=1.4
31
31
  Requires-Dist: pydantic>=2.0
32
32
  Requires-Dist: rich>=13.0
33
33
  Requires-Dist: pyyaml>=6.0
34
+ Requires-Dist: markdown>=3.5
34
35
  Requires-Dist: psutil>=5.9
35
36
  Requires-Dist: hypothesis>=6.98
36
37
  Requires-Dist: typing_extensions>=4.7
@@ -110,9 +111,9 @@ In short: certify that weight edits (e.g., quantization) preserve quality. If
110
111
  they don’t, roll back safely.
111
112
 
112
113
  Technical: edit‑agnostic guard pipeline (invariants → spectral → RMT →
113
- variance) producing a machine‑readable Safety Certificate.
114
+ variance) producing a machine‑readable Evaluation Certificate.
114
115
 
115
- > **Status:** 0.3.5 (pre‑1.0). Until 1.0, **minor** releases may be
116
+ > **Status:** 0.3.7 (pre‑1.0). Until 1.0, **minor** releases may be
116
117
  > breaking. See CLI help and the CHANGELOG for updates.
117
118
 
118
119
  [![CI](https://img.shields.io/github/actions/workflow/status/invarlock/invarlock/ci.yml?branch=main&logo=github&label=CI)](https://github.com/invarlock/invarlock/actions/workflows/ci.yml)
@@ -127,7 +128,20 @@ For guidance on where to ask questions, how to report bugs, and what to expect i
127
128
 
128
129
  ## 🚀 Quick start (no repo clone)
129
130
 
130
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
131
+ Notebooks (Colab):
132
+
133
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
134
+ `invarlock_quickstart_cpu.ipynb` — install + certify + verify + HTML export (CPU-friendly)
135
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_compare_certify.ipynb)
136
+ `invarlock_compare_certify.ipynb` — Compare & Certify (BYOE) end-to-end
137
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_certificate_deep_dive.ipynb)
138
+ `invarlock_certificate_deep_dive.ipynb` — reading and interpreting certificates
139
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_custom_datasets.ipynb)
140
+ `invarlock_custom_datasets.ipynb` — Bring Your Own Data (BYOD) with `local_jsonl`
141
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_python_api.ipynb)
142
+ `invarlock_python_api.ipynb` — programmatic Python API usage
143
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_policy_tiers.ipynb)
144
+ `invarlock_policy_tiers.ipynb` — Conservative vs Balanced vs Aggressive tier comparison
131
145
 
132
146
  ```bash
133
147
  # Install with HF adapters
@@ -146,8 +160,8 @@ This produces `reports/.../evaluation.cert.json` with paired metrics
146
160
  (ppl/accuracy), structural deltas, spectral/RMT stats, variance‑estimator
147
161
  provenance, seeds/hashes, pairing metrics, and a policy digest.
148
162
 
149
- > **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small,
150
- > BERT base, and TinyLLaMA (see `docs/assurance/09-tier-v1-calibration.md`). For
163
+ > **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
164
+ > and BERT base (see `docs/assurance/09-tier-v1-calibration.md`). For
151
165
  > calibrated Balanced/Conservative certs, use the preset‑based CI/Release examples
152
166
  > below. `INVARLOCK_TINY_RELAX` dev runs relax sample‑size floors and are intended
153
167
  > only for small smoke tests (not release evidence).
@@ -170,7 +184,7 @@ Quick examples (repo presets, CPU; repo clone required for preset paths):
170
184
  pip install "invarlock[hf]"
171
185
 
172
186
  # Preflight a config (JSON diagnostics)
173
- invarlock doctor --config configs/tasks/causal_lm/ci_cpu.yaml --json
187
+ invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
174
188
 
175
189
  # Calibrated GPT‑2 small (recommended starting point; repo preset)
176
190
  INVARLOCK_ALLOW_NETWORK=1 INVARLOCK_DEDUP_TEXTS=1 \
@@ -179,7 +193,7 @@ invarlock certify \
179
193
  --subject gpt2 \
180
194
  --adapter auto \
181
195
  --profile release \
182
- --preset configs/tasks/causal_lm/release_auto.yaml
196
+ --preset configs/presets/causal_lm/wikitext2_512.yaml
183
197
 
184
198
  # Tiny causal LM smoke (out‑of‑calibration, dev‑only)
185
199
  INVARLOCK_ALLOW_NETWORK=1 \
@@ -249,7 +263,7 @@ INVARLOCK_ALLOW_NETWORK=1 invarlock certify \
249
263
  --subject gpt2 \
250
264
  --adapter auto \
251
265
  --profile ci \
252
- --preset configs/tasks/causal_lm/ci_cpu.yaml
266
+ --preset configs/presets/causal_lm/wikitext2_512.yaml
253
267
  ```
254
268
 
255
269
  - Offline/air‑gapped usage: pre‑download to a cache, then run with network
@@ -319,7 +333,7 @@ needed (e.g., `CUDA_VISIBLE_DEVICES`).
319
333
  3. **RMT** (ε-band on outliers; monitor or gate per tier)
320
334
  4. **Variance (VE)** (predictive paired ΔlogNLL gate; tiered sidedness)
321
335
 
322
- - **Safety Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
336
+ - **Evaluation Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
323
337
  accuracy) with paired statistics, structural deltas, spectral/RMT stats, VE
324
338
  provenance, seeds/hashes, pairing metrics, and **policy digest**. Canonical
325
339
  artifact: `reports/.../evaluation.cert.json`.
@@ -440,7 +454,7 @@ Key checks enforced by balanced policy (summary):
440
454
  ```yaml
441
455
  model:
442
456
  id: "<set-your-model-id>" # e.g., gpt2
443
- adapter: "hf_gpt2"
457
+ adapter: "hf_causal"
444
458
  device: "cpu"
445
459
  dataset:
446
460
  provider: "wikitext2"
@@ -488,7 +502,7 @@ output:
488
502
  Run preflight checks before a run to catch misconfigurations early:
489
503
 
490
504
  ```bash
491
- invarlock doctor --config configs/tasks/causal_lm/ci_cpu.yaml --json
505
+ invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
492
506
  ```
493
507
 
494
508
  Text mode emits lines prefixed with `ERROR:`, `WARNING:`, or `NOTE:` and stable
@@ -505,7 +519,7 @@ invarlock/
505
519
  │ ├─ invarlock/ # core + unified namespace
506
520
  │ │ ├─ core/ # runner, registry, contracts, events, ABI
507
521
  │ │ ├─ cli/ # console app + command wrappers (unified import path)
508
- │ │ ├─ adapters/ # adapter wrappers (HF GPT‑2/BERT/LLaMA)
522
+ │ │ ├─ adapters/ # model adapters (HF causal/MLM/seq2seq/onnx)
509
523
  │ │ ├─ edits/ # quant_rtn
510
524
  │ │ ├─ guards/ # invariants, spectral, rmt, variance
511
525
  │ │ ├─ eval/ # evaluation metrics and helpers
@@ -4,9 +4,9 @@ In short: certify that weight edits (e.g., quantization) preserve quality. If
4
4
  they don’t, roll back safely.
5
5
 
6
6
  Technical: edit‑agnostic guard pipeline (invariants → spectral → RMT →
7
- variance) producing a machine‑readable Safety Certificate.
7
+ variance) producing a machine‑readable Evaluation Certificate.
8
8
 
9
- > **Status:** 0.3.5 (pre‑1.0). Until 1.0, **minor** releases may be
9
+ > **Status:** 0.3.7 (pre‑1.0). Until 1.0, **minor** releases may be
10
10
  > breaking. See CLI help and the CHANGELOG for updates.
11
11
 
12
12
  [![CI](https://img.shields.io/github/actions/workflow/status/invarlock/invarlock/ci.yml?branch=main&logo=github&label=CI)](https://github.com/invarlock/invarlock/actions/workflows/ci.yml)
@@ -21,7 +21,20 @@ For guidance on where to ask questions, how to report bugs, and what to expect i
21
21
 
22
22
  ## 🚀 Quick start (no repo clone)
23
23
 
24
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
24
+ Notebooks (Colab):
25
+
26
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
27
+ `invarlock_quickstart_cpu.ipynb` — install + certify + verify + HTML export (CPU-friendly)
28
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_compare_certify.ipynb)
29
+ `invarlock_compare_certify.ipynb` — Compare & Certify (BYOE) end-to-end
30
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_certificate_deep_dive.ipynb)
31
+ `invarlock_certificate_deep_dive.ipynb` — reading and interpreting certificates
32
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_custom_datasets.ipynb)
33
+ `invarlock_custom_datasets.ipynb` — Bring Your Own Data (BYOD) with `local_jsonl`
34
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_python_api.ipynb)
35
+ `invarlock_python_api.ipynb` — programmatic Python API usage
36
+ - [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_policy_tiers.ipynb)
37
+ `invarlock_policy_tiers.ipynb` — Conservative vs Balanced vs Aggressive tier comparison
25
38
 
26
39
  ```bash
27
40
  # Install with HF adapters
@@ -40,8 +53,8 @@ This produces `reports/.../evaluation.cert.json` with paired metrics
40
53
  (ppl/accuracy), structural deltas, spectral/RMT stats, variance‑estimator
41
54
  provenance, seeds/hashes, pairing metrics, and a policy digest.
42
55
 
43
- > **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small,
44
- > BERT base, and TinyLLaMA (see `docs/assurance/09-tier-v1-calibration.md`). For
56
+ > **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
57
+ > and BERT base (see `docs/assurance/09-tier-v1-calibration.md`). For
45
58
  > calibrated Balanced/Conservative certs, use the preset‑based CI/Release examples
46
59
  > below. `INVARLOCK_TINY_RELAX` dev runs relax sample‑size floors and are intended
47
60
  > only for small smoke tests (not release evidence).
@@ -64,7 +77,7 @@ Quick examples (repo presets, CPU; repo clone required for preset paths):
64
77
  pip install "invarlock[hf]"
65
78
 
66
79
  # Preflight a config (JSON diagnostics)
67
- invarlock doctor --config configs/tasks/causal_lm/ci_cpu.yaml --json
80
+ invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
68
81
 
69
82
  # Calibrated GPT‑2 small (recommended starting point; repo preset)
70
83
  INVARLOCK_ALLOW_NETWORK=1 INVARLOCK_DEDUP_TEXTS=1 \
@@ -73,7 +86,7 @@ invarlock certify \
73
86
  --subject gpt2 \
74
87
  --adapter auto \
75
88
  --profile release \
76
- --preset configs/tasks/causal_lm/release_auto.yaml
89
+ --preset configs/presets/causal_lm/wikitext2_512.yaml
77
90
 
78
91
  # Tiny causal LM smoke (out‑of‑calibration, dev‑only)
79
92
  INVARLOCK_ALLOW_NETWORK=1 \
@@ -143,7 +156,7 @@ INVARLOCK_ALLOW_NETWORK=1 invarlock certify \
143
156
  --subject gpt2 \
144
157
  --adapter auto \
145
158
  --profile ci \
146
- --preset configs/tasks/causal_lm/ci_cpu.yaml
159
+ --preset configs/presets/causal_lm/wikitext2_512.yaml
147
160
  ```
148
161
 
149
162
  - Offline/air‑gapped usage: pre‑download to a cache, then run with network
@@ -213,7 +226,7 @@ needed (e.g., `CUDA_VISIBLE_DEVICES`).
213
226
  3. **RMT** (ε-band on outliers; monitor or gate per tier)
214
227
  4. **Variance (VE)** (predictive paired ΔlogNLL gate; tiered sidedness)
215
228
 
216
- - **Safety Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
229
+ - **Evaluation Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
217
230
  accuracy) with paired statistics, structural deltas, spectral/RMT stats, VE
218
231
  provenance, seeds/hashes, pairing metrics, and **policy digest**. Canonical
219
232
  artifact: `reports/.../evaluation.cert.json`.
@@ -334,7 +347,7 @@ Key checks enforced by balanced policy (summary):
334
347
  ```yaml
335
348
  model:
336
349
  id: "<set-your-model-id>" # e.g., gpt2
337
- adapter: "hf_gpt2"
350
+ adapter: "hf_causal"
338
351
  device: "cpu"
339
352
  dataset:
340
353
  provider: "wikitext2"
@@ -382,7 +395,7 @@ output:
382
395
  Run preflight checks before a run to catch misconfigurations early:
383
396
 
384
397
  ```bash
385
- invarlock doctor --config configs/tasks/causal_lm/ci_cpu.yaml --json
398
+ invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
386
399
  ```
387
400
 
388
401
  Text mode emits lines prefixed with `ERROR:`, `WARNING:`, or `NOTE:` and stable
@@ -399,7 +412,7 @@ invarlock/
399
412
  │ ├─ invarlock/ # core + unified namespace
400
413
  │ │ ├─ core/ # runner, registry, contracts, events, ABI
401
414
  │ │ ├─ cli/ # console app + command wrappers (unified import path)
402
- │ │ ├─ adapters/ # adapter wrappers (HF GPT‑2/BERT/LLaMA)
415
+ │ │ ├─ adapters/ # model adapters (HF causal/MLM/seq2seq/onnx)
403
416
  │ │ ├─ edits/ # quant_rtn
404
417
  │ │ ├─ guards/ # invariants, spectral, rmt, variance
405
418
  │ │ ├─ eval/ # evaluation metrics and helpers
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "invarlock"
7
- version = "0.3.5"
7
+ version = "0.3.7"
8
8
  description = "Edit‑agnostic robustness certificates for weight edits (InvarLock framework)"
9
9
  authors = [{ name = "InvarLock Team", email = "oss@invarlock.dev" }]
10
10
  maintainers = [{ name = "InvarLock Maintainers", email = "support@invarlock.dev" }]
@@ -35,6 +35,7 @@ dependencies = [
35
35
  "pydantic>=2.0",
36
36
  "rich>=13.0",
37
37
  "pyyaml>=6.0",
38
+ "markdown>=3.5",
38
39
  "psutil>=5.9",
39
40
  "hypothesis>=6.98",
40
41
  "typing_extensions>=4.7",
@@ -161,9 +162,11 @@ invariants = "invarlock.guards:InvariantsGuard"
161
162
  hello_guard = "invarlock.plugins:HelloGuard"
162
163
 
163
164
  [project.entry-points."invarlock.adapters"]
164
- hf_gpt2 = "invarlock.adapters:HF_GPT2_Adapter"
165
- hf_bert = "invarlock.adapters:HF_BERT_Adapter"
166
- hf_llama = "invarlock.adapters:HF_LLaMA_Adapter"
165
+ hf_causal = "invarlock.adapters:HF_Causal_Adapter"
166
+ hf_mlm = "invarlock.adapters:HF_MLM_Adapter"
167
+ hf_seq2seq = "invarlock.adapters:HF_Seq2Seq_Adapter"
168
+ hf_causal_onnx = "invarlock.adapters:HF_Causal_ONNX_Adapter"
169
+ hf_auto = "invarlock.adapters:HF_Auto_Adapter"
167
170
  hf_gptq = "invarlock.plugins.hf_gptq_adapter:HF_GPTQ_Adapter"
168
171
  hf_awq = "invarlock.plugins.hf_awq_adapter:HF_AWQ_Adapter"
169
172
  hf_bnb = "invarlock.plugins.hf_bnb_adapter:HF_BNB_Adapter"
@@ -6,13 +6,13 @@ Core runtime package — torch-independent utilities, configuration, and interfa
6
6
 
7
7
  This package provides the foundation for the InvarLock GuardChain without heavy dependencies.
8
8
  For torch-dependent functionality, see subpackages under `invarlock.*`:
9
- - `invarlock.adapters`: Model adapters (HF GPT-2/BERT/LLaMA, auto)
9
+ - `invarlock.adapters`: Model adapters (HF causal/MLM/seq2seq + auto)
10
10
  - `invarlock.guards`: Safety mechanisms (invariants, spectral, RMT, variance)
11
11
  - `invarlock.edits`: Built-in quantization and edit interfaces
12
12
  - `invarlock.eval`: Metrics, guard-overhead checks, and certification
13
13
  """
14
14
 
15
- __version__ = "0.3.5"
15
+ __version__ = "0.3.7"
16
16
 
17
17
  # Core exports - torch-independent
18
18
  from .config import CFG, Defaults, get_default_config
@@ -1,8 +1,12 @@
1
- # Tier guard policy knobs for variance correction (balanced vs conservative)
1
+ # Tier policy defaults (metrics gates + guard knobs) used at runtime.
2
2
  #
3
- # These values mirror the settings validated during the December 2025
4
- # calibration runs. They should be kept in sync with the policy digest
5
- # embedded in certificates and referenced by automation documentation.
3
+ # Balanced and Conservative values are calibrated/validated against pilot/null
4
+ # runs (Nov/Dec 2025) where applicable; Aggressive is research-oriented (not in
5
+ # the safety case).
6
+ #
7
+ # Rationale by key: docs/reference/tier-policy-catalog.md
8
+ # Calibration method: docs/assurance/09-tier-v1-calibration.md
9
+ # Provenance/digest: docs/assurance/11-policy-provenance.md
6
10
 
7
11
  balanced:
8
12
  metrics:
@@ -11,6 +15,13 @@ balanced:
11
15
  min_tokens: 50000
12
16
  hysteresis_ratio: 0.002
13
17
  min_token_fraction: 0.01
18
+ pm_tail:
19
+ mode: warn
20
+ min_windows: 50
21
+ quantile: 0.95
22
+ quantile_max: 0.20
23
+ epsilon: 0.0001
24
+ mass_max: 1.0
14
25
  accuracy:
15
26
  delta_min_pp: -1.0
16
27
  min_examples: 200
@@ -20,7 +31,7 @@ balanced:
20
31
  deadband: 0.02
21
32
  min_abs_adjust: 0.012
22
33
  max_scale_step: 0.03
23
- min_effect_lognll: 0.0009
34
+ min_effect_lognll: 0.0
24
35
  predictive_one_sided: true
25
36
  topk_backstop: 1
26
37
  max_adjusted_modules: 1
@@ -33,10 +44,10 @@ balanced:
33
44
  max_caps: 5
34
45
  max_spectral_norm: null
35
46
  family_caps:
36
- ffn: 3.834
37
- attn: 3.423
38
- embed: 3.1
39
- other: 3.1
47
+ ffn: 3.849
48
+ attn: 3.018
49
+ embed: 1.05
50
+ other: 0.0
40
51
  multiple_testing:
41
52
  method: bh
42
53
  alpha: 0.05
@@ -44,12 +55,12 @@ balanced:
44
55
  rmt_guard:
45
56
  deadband: 0.10
46
57
  margin: 1.5
47
- epsilon_default: 0.10
58
+ epsilon_default: 0.01
48
59
  epsilon_by_family:
49
- ffn: 0.10
50
- attn: 0.08
51
- embed: 0.12
52
- other: 0.12
60
+ ffn: 0.01
61
+ attn: 0.01
62
+ embed: 0.01
63
+ other: 0.01
53
64
 
54
65
  conservative:
55
66
  metrics:
@@ -58,6 +69,13 @@ conservative:
58
69
  min_tokens: 20000
59
70
  hysteresis_ratio: 0.002
60
71
  min_token_fraction: 0.01
72
+ pm_tail:
73
+ mode: warn
74
+ min_windows: 50
75
+ quantile: 0.95
76
+ quantile_max: 0.12
77
+ epsilon: 0.0001
78
+ mass_max: 1.0
61
79
  accuracy:
62
80
  delta_min_pp: -0.5
63
81
  min_examples: 200
@@ -67,7 +85,7 @@ conservative:
67
85
  deadband: 0.03
68
86
  min_abs_adjust: 0.02
69
87
  max_scale_step: 0.015
70
- min_effect_lognll: 0.0018
88
+ min_effect_lognll: 0.016
71
89
  predictive_one_sided: false
72
90
  topk_backstop: 0
73
91
  max_adjusted_modules: 0
@@ -78,24 +96,25 @@ conservative:
78
96
  deadband: 0.05
79
97
  scope: ffn
80
98
  max_caps: 3
99
+ max_spectral_norm: null
81
100
  family_caps:
82
- ffn: 2.3
101
+ ffn: 3.849
83
102
  attn: 2.6
84
103
  embed: 2.8
85
104
  other: 2.8
86
105
  multiple_testing:
87
106
  method: bonferroni
88
- alpha: 0.02
107
+ alpha: 0.000625
89
108
  m: 4
90
109
  rmt_guard:
91
110
  deadband: 0.05
92
111
  margin: 1.3
93
- epsilon_default: 0.06
112
+ epsilon_default: 0.01
94
113
  epsilon_by_family:
95
- ffn: 0.06
96
- attn: 0.05
97
- embed: 0.07
98
- other: 0.07
114
+ ffn: 0.01
115
+ attn: 0.01
116
+ embed: 0.01
117
+ other: 0.01
99
118
 
100
119
  aggressive:
101
120
  metrics:
@@ -104,6 +123,13 @@ aggressive:
104
123
  min_tokens: 50000
105
124
  hysteresis_ratio: 0.002
106
125
  min_token_fraction: 0.01
126
+ pm_tail:
127
+ mode: warn
128
+ min_windows: 50
129
+ quantile: 0.95
130
+ quantile_max: 0.30
131
+ epsilon: 0.0001
132
+ mass_max: 1.0
107
133
  accuracy:
108
134
  delta_min_pp: -2.0
109
135
  min_examples: 200
@@ -111,27 +137,28 @@ aggressive:
111
137
  min_examples_fraction: 0.01
112
138
  variance_guard:
113
139
  deadband: 0.12
114
- min_effect_lognll: 0.0005
140
+ min_effect_lognll: 0.033
115
141
  spectral_guard:
116
142
  sigma_quantile: 0.98
117
143
  deadband: 0.15
118
144
  scope: ffn
119
145
  max_caps: 8
146
+ max_spectral_norm: null
120
147
  family_caps:
121
- ffn: 3.0
148
+ ffn: 3.849
122
149
  attn: 3.5
123
150
  embed: 2.5
124
151
  other: 3.5
125
152
  multiple_testing:
126
153
  method: bh
127
- alpha: 0.1
154
+ alpha: 0.00078125
128
155
  m: 4
129
156
  rmt_guard:
130
157
  deadband: 0.15
131
158
  margin: 1.8
132
- epsilon_default: 0.15
159
+ epsilon_default: 0.01
133
160
  epsilon_by_family:
134
- ffn: 0.15
135
- attn: 0.15
136
- embed: 0.15
137
- other: 0.15
161
+ ffn: 0.01
162
+ attn: 0.01
163
+ embed: 0.01
164
+ other: 0.01
@@ -29,13 +29,11 @@ from .capabilities import (
29
29
  )
30
30
 
31
31
  _LAZY_MAP = {
32
- "HF_BERT_Adapter": ".hf_bert",
33
- "HF_GPT2_Adapter": ".hf_gpt2",
34
- "HF_LLaMA_Adapter": ".hf_llama",
35
- "HF_T5_Adapter": ".hf_t5",
36
- "HF_ORT_CausalLM_Adapter": ".hf_onnx",
37
- "HF_Causal_Auto_Adapter": ".auto",
38
- "HF_MLM_Auto_Adapter": ".auto",
32
+ "HF_Causal_Adapter": ".hf_causal",
33
+ "HF_MLM_Adapter": ".hf_mlm",
34
+ "HF_Seq2Seq_Adapter": ".hf_seq2seq",
35
+ "HF_Causal_ONNX_Adapter": ".hf_causal_onnx",
36
+ "HF_Auto_Adapter": ".auto",
39
37
  }
40
38
 
41
39
 
@@ -76,7 +74,7 @@ class _RemovedComponent:
76
74
  return _RemovedComponent(self._name, self._replacement)
77
75
 
78
76
 
79
- # Placeholders for removed/legacy utilities referenced in tests
77
+ # Placeholders for removed utilities referenced in tests
80
78
  HF_Pythia_Adapter = _RemovedComponent("HF_Pythia_Adapter")
81
79
  auto_tune_pruning_budget = _RemovedComponent("auto_tune_pruning_budget")
82
80
  run_auto_invarlock = _RemovedComponent("run_auto_invarlock")
@@ -91,13 +89,11 @@ run_invarlock = _RemovedComponent("run_invarlock", "invarlock.cli.run")
91
89
  quick_prune_gpt2 = _RemovedComponent("quick_prune_gpt2")
92
90
 
93
91
  __all__ = [
94
- "HF_GPT2_Adapter",
95
- "HF_BERT_Adapter",
96
- "HF_LLaMA_Adapter",
97
- "HF_T5_Adapter",
98
- "HF_ORT_CausalLM_Adapter",
99
- "HF_Causal_Auto_Adapter",
100
- "HF_MLM_Auto_Adapter",
92
+ "HF_Causal_Adapter",
93
+ "HF_MLM_Adapter",
94
+ "HF_Seq2Seq_Adapter",
95
+ "HF_Causal_ONNX_Adapter",
96
+ "HF_Auto_Adapter",
101
97
  "BaseAdapter",
102
98
  "AdapterConfig",
103
99
  "AdapterInterface",
@@ -110,21 +110,26 @@ class _DelegatingAdapter(ModelAdapter):
110
110
 
111
111
  def _load_adapter(self, adapter_name: str) -> ModelAdapter:
112
112
  """Load an adapter by name."""
113
- if adapter_name == "hf_llama":
114
- HF_LLaMA_Adapter = _importlib.import_module(
115
- ".hf_llama", __package__
116
- ).HF_LLaMA_Adapter
117
- return HF_LLaMA_Adapter()
118
- elif adapter_name == "hf_bert":
119
- HF_BERT_Adapter = _importlib.import_module(
120
- ".hf_bert", __package__
121
- ).HF_BERT_Adapter
122
- return HF_BERT_Adapter()
123
- elif adapter_name == "hf_gpt2":
124
- HF_GPT2_Adapter = _importlib.import_module(
125
- ".hf_gpt2", __package__
126
- ).HF_GPT2_Adapter
127
- return HF_GPT2_Adapter()
113
+ if adapter_name == "hf_causal":
114
+ HF_Causal_Adapter = _importlib.import_module(
115
+ ".hf_causal", __package__
116
+ ).HF_Causal_Adapter
117
+ return HF_Causal_Adapter()
118
+ if adapter_name == "hf_mlm":
119
+ HF_MLM_Adapter = _importlib.import_module(
120
+ ".hf_mlm", __package__
121
+ ).HF_MLM_Adapter
122
+ return HF_MLM_Adapter()
123
+ if adapter_name == "hf_seq2seq":
124
+ HF_Seq2Seq_Adapter = _importlib.import_module(
125
+ ".hf_seq2seq", __package__
126
+ ).HF_Seq2Seq_Adapter
127
+ return HF_Seq2Seq_Adapter()
128
+ if adapter_name == "hf_causal_onnx":
129
+ HF_Causal_ONNX_Adapter = _importlib.import_module(
130
+ ".hf_causal_onnx", __package__
131
+ ).HF_Causal_ONNX_Adapter
132
+ return HF_Causal_ONNX_Adapter()
128
133
  elif adapter_name == "hf_bnb":
129
134
  HF_BNB_Adapter = _importlib.import_module(
130
135
  "invarlock.plugins.hf_bnb_adapter"
@@ -141,11 +146,11 @@ class _DelegatingAdapter(ModelAdapter):
141
146
  ).HF_GPTQ_Adapter
142
147
  return HF_GPTQ_Adapter()
143
148
  else:
144
- # Default to GPT2 adapter
145
- HF_GPT2_Adapter = _importlib.import_module(
146
- ".hf_gpt2", __package__
147
- ).HF_GPT2_Adapter
148
- return HF_GPT2_Adapter()
149
+ # Default to causal adapter
150
+ HF_Causal_Adapter = _importlib.import_module(
151
+ ".hf_causal", __package__
152
+ ).HF_Causal_Adapter
153
+ return HF_Causal_Adapter()
149
154
 
150
155
  def _ensure_delegate_from_id(self, model_id: str) -> ModelAdapter:
151
156
  if self._delegate is not None:
@@ -172,14 +177,16 @@ class _DelegatingAdapter(ModelAdapter):
172
177
  self._delegate = self._load_adapter(quant_adapter)
173
178
  return self._delegate
174
179
 
175
- # Fall back to class name inspection
180
+ # Fall back to lightweight class-name inspection (no transformers import).
176
181
  cls_name = getattr(model, "__class__", type(model)).__name__.lower()
177
- if any(k in cls_name for k in ["llama", "mistral", "qwen", "yi"]):
178
- self._delegate = self._load_adapter("hf_llama")
179
- elif any(k in cls_name for k in ["bert", "roberta", "albert", "deberta"]):
180
- self._delegate = self._load_adapter("hf_bert")
182
+ if any(k in cls_name for k in ["bert", "roberta", "albert", "deberta"]):
183
+ self._delegate = self._load_adapter("hf_mlm")
181
184
  else:
182
- self._delegate = self._load_adapter("hf_gpt2")
185
+ cfg = getattr(model, "config", None)
186
+ if getattr(cfg, "is_encoder_decoder", False):
187
+ self._delegate = self._load_adapter("hf_seq2seq")
188
+ else:
189
+ self._delegate = self._load_adapter("hf_causal")
183
190
  return self._delegate
184
191
 
185
192
  def can_handle(self, model: Any) -> bool: # pragma: no cover - trivial
@@ -206,21 +213,9 @@ class _DelegatingAdapter(ModelAdapter):
206
213
  raise AttributeError(item)
207
214
 
208
215
 
209
- class HF_Causal_Auto_Adapter(_DelegatingAdapter):
210
- name = "hf_causal_auto"
216
+ class HF_Auto_Adapter(_DelegatingAdapter):
217
+ name = "hf_auto"
211
218
 
212
219
  def load_model(self, model_id: str, device: str = "auto", **kwargs: Any) -> Any:
213
220
  delegate = self._ensure_delegate_from_id(model_id)
214
221
  return delegate.load_model(model_id, device=device, **kwargs)
215
-
216
-
217
- class HF_MLM_Auto_Adapter(_DelegatingAdapter):
218
- name = "hf_mlm_auto"
219
-
220
- def load_model(self, model_id: str, device: str = "auto", **kwargs: Any) -> Any:
221
- # Force BERT-like adapter for MLM families
222
- HF_BERT_Adapter = _importlib.import_module(
223
- ".hf_bert", __package__
224
- ).HF_BERT_Adapter
225
- self._delegate = HF_BERT_Adapter()
226
- return self._delegate.load_model(model_id, device=device, **kwargs)
@@ -359,7 +359,7 @@ def _detect_weight_tying(model: Any) -> dict[str, str]:
359
359
  tying: dict[str, str] = {}
360
360
 
361
361
  # Common weight tying patterns
362
- # LLaMA/Mistral: lm_head.weight ↔ model.embed_tokens.weight
362
+ # Decoder embed_tokens style: lm_head.weight ↔ model.embed_tokens.weight
363
363
  if hasattr(model, "lm_head") and hasattr(model, "model"):
364
364
  inner = model.model
365
365
  if hasattr(inner, "embed_tokens"):
@@ -408,7 +408,7 @@ def _detect_primary_metric(model: Any) -> str:
408
408
  return "rouge"
409
409
  return "ppl_seq2seq"
410
410
 
411
- # Decoder-only models (GPT-like, LLaMA-like)
411
+ # Decoder-only models (GPT-like, RoPE-style)
412
412
  return "ppl_causal"
413
413
 
414
414