invarlock 0.3.6__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 (157) hide show
  1. {invarlock-0.3.6/src/invarlock.egg-info → invarlock-0.3.7}/PKG-INFO +23 -9
  2. {invarlock-0.3.6 → invarlock-0.3.7}/README.md +21 -8
  3. {invarlock-0.3.6 → invarlock-0.3.7}/pyproject.toml +7 -4
  4. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/__init__.py +2 -2
  5. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/__init__.py +10 -14
  6. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/auto.py +35 -40
  7. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/capabilities.py +2 -2
  8. invarlock-0.3.7/src/invarlock/adapters/hf_causal.py +418 -0
  9. invarlock-0.3.6/src/invarlock/adapters/hf_onnx.py → invarlock-0.3.7/src/invarlock/adapters/hf_causal_onnx.py +3 -3
  10. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/hf_mixin.py +25 -4
  11. invarlock-0.3.6/src/invarlock/adapters/hf_bert.py → invarlock-0.3.7/src/invarlock/adapters/hf_mlm.py +4 -11
  12. invarlock-0.3.6/src/invarlock/adapters/hf_t5.py → invarlock-0.3.7/src/invarlock/adapters/hf_seq2seq.py +9 -9
  13. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/adapter_auto.py +31 -21
  14. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/app.py +73 -2
  15. invarlock-0.3.7/src/invarlock/cli/commands/certify.py +963 -0
  16. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/doctor.py +8 -10
  17. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/plugins.py +13 -9
  18. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/report.py +233 -69
  19. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/run.py +907 -183
  20. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/verify.py +76 -11
  21. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/config.py +1 -1
  22. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/doctor_helpers.py +4 -5
  23. invarlock-0.3.7/src/invarlock/cli/output.py +193 -0
  24. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/provenance.py +1 -1
  25. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/bootstrap.py +1 -1
  26. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/registry.py +9 -11
  27. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/runner.py +111 -25
  28. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/quant_rtn.py +65 -37
  29. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bench.py +3 -3
  30. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/data.py +68 -23
  31. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/metrics.py +59 -1
  32. invarlock-0.3.7/src/invarlock/eval/tasks/__init__.py +12 -0
  33. invarlock-0.3.7/src/invarlock/eval/tasks/classification.py +48 -0
  34. invarlock-0.3.7/src/invarlock/eval/tasks/qa.py +36 -0
  35. invarlock-0.3.7/src/invarlock/eval/tasks/text_generation.py +102 -0
  36. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/invariants.py +19 -10
  37. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/rmt.py +2 -2
  38. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/variance.py +2 -2
  39. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/model_profile.py +48 -27
  40. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/health.py +6 -6
  41. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/metrics.py +108 -0
  42. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/certificate.py +159 -9
  43. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/certificate_schema.py +1 -1
  44. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/guards_analysis.py +154 -4
  45. invarlock-0.3.7/src/invarlock/reporting/html.py +82 -0
  46. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/normalizer.py +7 -0
  47. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/render.py +791 -431
  48. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/report.py +39 -3
  49. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/report_types.py +6 -1
  50. invarlock-0.3.7/src/invarlock/reporting/telemetry.py +86 -0
  51. {invarlock-0.3.6 → invarlock-0.3.7/src/invarlock.egg-info}/PKG-INFO +23 -9
  52. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/SOURCES.txt +10 -5
  53. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/entry_points.txt +5 -3
  54. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/requires.txt +1 -0
  55. invarlock-0.3.6/src/invarlock/adapters/hf_gpt2.py +0 -404
  56. invarlock-0.3.6/src/invarlock/adapters/hf_llama.py +0 -487
  57. invarlock-0.3.6/src/invarlock/cli/commands/certify.py +0 -422
  58. invarlock-0.3.6/src/invarlock/reporting/html.py +0 -32
  59. {invarlock-0.3.6 → invarlock-0.3.7}/LICENSE +0 -0
  60. {invarlock-0.3.6 → invarlock-0.3.7}/MANIFEST.in +0 -0
  61. {invarlock-0.3.6 → invarlock-0.3.7}/setup.cfg +0 -0
  62. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/__main__.py +0 -0
  63. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/ci_cpu.yaml +0 -0
  64. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/release.yaml +0 -0
  65. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/tiers.yaml +0 -0
  66. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/_capabilities.py +0 -0
  67. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/base.py +0 -0
  68. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/base_types.py +0 -0
  69. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/hf_loading.py +0 -0
  70. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/py.typed +0 -0
  71. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/assurance/__init__.py +0 -0
  72. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/__init__.py +0 -0
  73. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/spectral_null.py +0 -0
  74. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/variance_ve.py +0 -0
  75. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/__init__.py +0 -0
  76. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/__main__.py +0 -0
  77. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/_evidence.py +0 -0
  78. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/_json.py +0 -0
  79. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/__init__.py +0 -0
  80. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/calibrate.py +0 -0
  81. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/explain_gates.py +0 -0
  82. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/export_html.py +0 -0
  83. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/constants.py +0 -0
  84. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/determinism.py +0 -0
  85. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/device.py +0 -0
  86. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/errors.py +0 -0
  87. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/overhead_utils.py +0 -0
  88. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/utils.py +0 -0
  89. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/config.py +0 -0
  90. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/__init__.py +0 -0
  91. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/abi.py +0 -0
  92. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/api.py +0 -0
  93. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/auto_tuning.py +0 -0
  94. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/checkpoint.py +0 -0
  95. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/contracts.py +0 -0
  96. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/error_utils.py +0 -0
  97. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/events.py +0 -0
  98. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/exceptions.py +0 -0
  99. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/retry.py +0 -0
  100. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/types.py +0 -0
  101. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/__init__.py +0 -0
  102. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/_edit_utils.py +0 -0
  103. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/_external_utils.py +0 -0
  104. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/noop.py +0 -0
  105. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/py.typed +0 -0
  106. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/registry.py +0 -0
  107. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/__init__.py +0 -0
  108. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bench_regression.py +0 -0
  109. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bootstrap.py +0 -0
  110. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/primary_metric.py +0 -0
  111. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/__init__.py +0 -0
  112. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/fft.py +0 -0
  113. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/mi.py +0 -0
  114. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/post_attention.py +0 -0
  115. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/base.py +0 -0
  116. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/seq2seq.py +0 -0
  117. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/text_lm.py +0 -0
  118. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/vision_text.py +0 -0
  119. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/py.typed +0 -0
  120. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/tail_stats.py +0 -0
  121. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/__init__.py +0 -0
  122. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/_contracts.py +0 -0
  123. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/_estimators.py +0 -0
  124. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/policies.py +0 -0
  125. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/py.typed +0 -0
  126. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/spectral.py +0 -0
  127. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/tier_config.py +0 -0
  128. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/__init__.py +0 -0
  129. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/rmt_ref.py +0 -0
  130. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/spectral_ref.py +0 -0
  131. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/variance_ref.py +0 -0
  132. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/model_utils.py +0 -0
  133. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/__init__.py +0 -0
  134. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/alerting.py +0 -0
  135. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/core.py +0 -0
  136. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/exporters.py +0 -0
  137. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/py.typed +0 -0
  138. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/utils.py +0 -0
  139. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/__init__.py +0 -0
  140. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hello_guard.py +0 -0
  141. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_awq_adapter.py +0 -0
  142. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_bnb_adapter.py +0 -0
  143. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_gptq_adapter.py +0 -0
  144. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/py.typed +0 -0
  145. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/py.typed +0 -0
  146. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/__init__.py +0 -0
  147. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/dataset_hashing.py +0 -0
  148. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/policy_utils.py +0 -0
  149. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/primary_metric_utils.py +0 -0
  150. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/utils.py +0 -0
  151. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/validate.py +0 -0
  152. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/security.py +0 -0
  153. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/sparsity_utils.py +0 -0
  154. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/utils/__init__.py +0 -0
  155. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/utils/digest.py +0 -0
  156. {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/dependency_links.txt +0 -0
  157. {invarlock-0.3.6 → 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.6
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.6 (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).
@@ -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"
@@ -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.6 (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).
@@ -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"
@@ -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.6"
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.6"
15
+ __version__ = "0.3.7"
16
16
 
17
17
  # Core exports - torch-independent
18
18
  from .config import CFG, Defaults, get_default_config
@@ -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
 
@@ -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