invarlock 0.3.7__py3-none-any.whl → 0.3.9__py3-none-any.whl

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 (47) hide show
  1. invarlock/__init__.py +3 -3
  2. invarlock/adapters/auto.py +2 -10
  3. invarlock/adapters/hf_loading.py +7 -7
  4. invarlock/adapters/hf_mixin.py +28 -5
  5. invarlock/assurance/__init__.py +15 -23
  6. invarlock/calibration/spectral_null.py +1 -1
  7. invarlock/cli/adapter_auto.py +1 -5
  8. invarlock/cli/app.py +57 -27
  9. invarlock/cli/commands/__init__.py +2 -2
  10. invarlock/cli/commands/calibrate.py +48 -4
  11. invarlock/cli/commands/{certify.py → evaluate.py} +69 -46
  12. invarlock/cli/commands/explain_gates.py +94 -51
  13. invarlock/cli/commands/export_html.py +11 -9
  14. invarlock/cli/commands/report.py +121 -47
  15. invarlock/cli/commands/run.py +274 -66
  16. invarlock/cli/commands/verify.py +84 -89
  17. invarlock/cli/determinism.py +1 -1
  18. invarlock/cli/provenance.py +3 -3
  19. invarlock/core/bootstrap.py +1 -1
  20. invarlock/core/retry.py +14 -14
  21. invarlock/core/runner.py +1 -1
  22. invarlock/edits/noop.py +2 -2
  23. invarlock/edits/quant_rtn.py +2 -2
  24. invarlock/eval/__init__.py +1 -1
  25. invarlock/eval/bench.py +11 -7
  26. invarlock/eval/primary_metric.py +1 -1
  27. invarlock/guards/spectral.py +2 -2
  28. invarlock/guards_ref/spectral_ref.py +1 -1
  29. invarlock/model_profile.py +16 -35
  30. invarlock/observability/health.py +38 -20
  31. invarlock/plugins/hf_bnb_adapter.py +32 -21
  32. invarlock/reporting/__init__.py +18 -4
  33. invarlock/reporting/html.py +7 -7
  34. invarlock/reporting/normalizer.py +2 -2
  35. invarlock/reporting/policy_utils.py +1 -1
  36. invarlock/reporting/primary_metric_utils.py +11 -11
  37. invarlock/reporting/render.py +126 -120
  38. invarlock/reporting/report.py +43 -37
  39. invarlock/reporting/{certificate.py → report_builder.py} +103 -99
  40. invarlock/reporting/{certificate_schema.py → report_schema.py} +22 -22
  41. invarlock-0.3.9.dist-info/METADATA +303 -0
  42. {invarlock-0.3.7.dist-info → invarlock-0.3.9.dist-info}/RECORD +46 -46
  43. {invarlock-0.3.7.dist-info → invarlock-0.3.9.dist-info}/WHEEL +1 -1
  44. invarlock-0.3.7.dist-info/METADATA +0 -602
  45. {invarlock-0.3.7.dist-info → invarlock-0.3.9.dist-info}/entry_points.txt +0 -0
  46. {invarlock-0.3.7.dist-info → invarlock-0.3.9.dist-info}/licenses/LICENSE +0 -0
  47. {invarlock-0.3.7.dist-info → invarlock-0.3.9.dist-info}/top_level.txt +0 -0
@@ -11,16 +11,16 @@ except Exception: # pragma: no cover
11
11
  jsonschema = None
12
12
 
13
13
 
14
- # Certificate schema version (PM-first canonical)
15
- CERTIFICATE_SCHEMA_VERSION = "v1"
14
+ # Evaluation report schema version (PM-first canonical)
15
+ REPORT_SCHEMA_VERSION = "v1"
16
16
 
17
17
 
18
- # Minimal JSON Schema describing the canonical shape of a certificate.
18
+ # Minimal JSON Schema describing the canonical shape of an evaluation report.
19
19
  # This focuses on structural validity; numerical thresholds are validated
20
20
  # separately in metric-specific logic.
21
- CERTIFICATE_JSON_SCHEMA: dict[str, Any] = {
21
+ REPORT_JSON_SCHEMA: dict[str, Any] = {
22
22
  "$schema": "https://json-schema.org/draft/2020-12/schema",
23
- "title": "InvarLock Evaluation Certificate",
23
+ "title": "InvarLock Evaluation Report",
24
24
  "type": "object",
25
25
  "required": [
26
26
  "schema_version",
@@ -32,7 +32,7 @@ CERTIFICATE_JSON_SCHEMA: dict[str, Any] = {
32
32
  "primary_metric",
33
33
  ],
34
34
  "properties": {
35
- "schema_version": {"const": CERTIFICATE_SCHEMA_VERSION},
35
+ "schema_version": {"const": REPORT_SCHEMA_VERSION},
36
36
  "run_id": {"type": "string", "minLength": 4},
37
37
  "edit_name": {"type": "string"},
38
38
  "policy_digest": {
@@ -179,21 +179,21 @@ def _load_validation_allowlist() -> set[str]:
179
179
  return set(_VALIDATION_ALLOWLIST_DEFAULT)
180
180
 
181
181
 
182
- def _validate_with_jsonschema(certificate: dict[str, Any]) -> bool:
183
- """Validate certificate with JSON Schema when available."""
182
+ def _validate_with_jsonschema(report: dict[str, Any]) -> bool:
183
+ """Validate evaluation report with JSON Schema when available."""
184
184
  if jsonschema is None:
185
185
  return True # Schema library unavailable; fall back to minimal checks
186
186
  try:
187
- jsonschema.validate(instance=certificate, schema=CERTIFICATE_JSON_SCHEMA)
187
+ jsonschema.validate(instance=report, schema=REPORT_JSON_SCHEMA)
188
188
  return True
189
189
  except Exception:
190
190
  return False
191
191
 
192
192
 
193
- def validate_certificate(certificate: dict[str, Any]) -> bool:
194
- """Validate certificate structure and essential flags."""
193
+ def validate_report(report: dict[str, Any]) -> bool:
194
+ """Validate evaluation report structure and essential flags."""
195
195
  try:
196
- if certificate.get("schema_version") != CERTIFICATE_SCHEMA_VERSION:
196
+ if report.get("schema_version") != REPORT_SCHEMA_VERSION:
197
197
  return False
198
198
 
199
199
  # Prefer JSON Schema structural validation; if unavailable or too strict,
@@ -202,20 +202,20 @@ def validate_certificate(certificate: dict[str, Any]) -> bool:
202
202
  # disallow unknown validation keys at schema level.
203
203
  try:
204
204
  vkeys = _load_validation_allowlist()
205
- if isinstance(CERTIFICATE_JSON_SCHEMA.get("properties"), dict):
206
- vspec = CERTIFICATE_JSON_SCHEMA["properties"].get("validation")
205
+ if isinstance(REPORT_JSON_SCHEMA.get("properties"), dict):
206
+ vspec = REPORT_JSON_SCHEMA["properties"].get("validation")
207
207
  if isinstance(vspec, dict):
208
208
  vspec["properties"] = {k: {"type": "boolean"} for k in vkeys}
209
209
  vspec["additionalProperties"] = False
210
210
  except Exception:
211
211
  pass
212
212
 
213
- if not _validate_with_jsonschema(certificate):
213
+ if not _validate_with_jsonschema(report):
214
214
  # Minimal fallback: require schema version + run_id + primary_metric
215
- run_id_ok = isinstance(certificate.get("run_id"), str) and bool(
216
- certificate.get("run_id")
215
+ run_id_ok = isinstance(report.get("run_id"), str) and bool(
216
+ report.get("run_id")
217
217
  )
218
- pm = certificate.get("primary_metric")
218
+ pm = report.get("primary_metric")
219
219
  pm_ok = isinstance(pm, dict) and (
220
220
  isinstance(pm.get("final"), int | float)
221
221
  or (isinstance(pm.get("kind"), str) and bool(pm.get("kind")))
@@ -223,7 +223,7 @@ def validate_certificate(certificate: dict[str, Any]) -> bool:
223
223
  if not (run_id_ok and pm_ok):
224
224
  return False
225
225
 
226
- validation = certificate.get("validation", {})
226
+ validation = report.get("validation", {})
227
227
  for flag in [
228
228
  "preview_final_drift_acceptable",
229
229
  "primary_metric_acceptable",
@@ -242,7 +242,7 @@ def validate_certificate(certificate: dict[str, Any]) -> bool:
242
242
 
243
243
 
244
244
  __all__ = [
245
- "CERTIFICATE_SCHEMA_VERSION",
246
- "CERTIFICATE_JSON_SCHEMA",
247
- "validate_certificate",
245
+ "REPORT_SCHEMA_VERSION",
246
+ "REPORT_JSON_SCHEMA",
247
+ "validate_report",
248
248
  ]
@@ -0,0 +1,303 @@
1
+ Metadata-Version: 2.4
2
+ Name: invarlock
3
+ Version: 0.3.9
4
+ Summary: Edit‑agnostic robustness evaluation reports for weight edits (InvarLock framework)
5
+ Author-email: InvarLock Team <oss@invarlock.dev>
6
+ Maintainer-email: InvarLock Maintainers <support@invarlock.dev>
7
+ License-Expression: Apache-2.0
8
+ Project-URL: Homepage, https://github.com/invarlock/invarlock
9
+ Project-URL: Repository, https://github.com/invarlock/invarlock
10
+ Project-URL: Documentation, https://github.com/invarlock/invarlock/tree/main/docs
11
+ Project-URL: Issues, https://github.com/invarlock/invarlock/issues
12
+ Project-URL: Changelog, https://github.com/invarlock/invarlock/blob/main/CHANGELOG.md
13
+ Keywords: machine-learning,deep-learning,transformers,pytorch,llm,quantization,safety,evaluation,certification
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Operating System :: OS Independent
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.12
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: typer>=0.15
27
+ Requires-Dist: click>=8.1
28
+ Requires-Dist: shellingham>=1.5.0
29
+ Requires-Dist: pandas>=2.2
30
+ Requires-Dist: scikit-learn>=1.4
31
+ Requires-Dist: pydantic>=2.0
32
+ Requires-Dist: rich>=13.0
33
+ Requires-Dist: pyyaml>=6.0
34
+ Requires-Dist: markdown>=3.5
35
+ Requires-Dist: psutil>=5.9
36
+ Requires-Dist: hypothesis>=6.98
37
+ Requires-Dist: typing_extensions>=4.7
38
+ Requires-Dist: jsonschema>=4.0
39
+ Provides-Extra: adapters
40
+ Requires-Dist: torch>=2.1.0; extra == "adapters"
41
+ Requires-Dist: transformers>=5.0.0; extra == "adapters"
42
+ Provides-Extra: hf
43
+ Requires-Dist: torch>=2.1.0; extra == "hf"
44
+ Requires-Dist: transformers>=5.0.0; extra == "hf"
45
+ Requires-Dist: datasets>=3.0; extra == "hf"
46
+ Requires-Dist: numpy>=1.24; extra == "hf"
47
+ Requires-Dist: huggingface_hub>=1.0.0; extra == "hf"
48
+ Requires-Dist: aiohttp>=3.12.14; extra == "hf"
49
+ Requires-Dist: h2>=4.3.0; extra == "hf"
50
+ Requires-Dist: pillow>=11.3.0; extra == "hf"
51
+ Provides-Extra: guards
52
+ Requires-Dist: torch>=2.1.0; extra == "guards"
53
+ Requires-Dist: numpy>=1.24; extra == "guards"
54
+ Provides-Extra: edits
55
+ Requires-Dist: torch>=2.1.0; extra == "edits"
56
+ Provides-Extra: eval
57
+ Requires-Dist: torch>=2.1.0; extra == "eval"
58
+ Requires-Dist: datasets>=3.0; extra == "eval"
59
+ Provides-Extra: gptq
60
+ Requires-Dist: torch>=2.1.0; extra == "gptq"
61
+ Requires-Dist: auto-gptq>=0.7.0; platform_system == "Linux" and extra == "gptq"
62
+ Requires-Dist: triton>=2.3.0; platform_system == "Linux" and extra == "gptq"
63
+ Requires-Dist: transformers>=5.0.0; extra == "gptq"
64
+ Provides-Extra: awq
65
+ Requires-Dist: torch>=2.1.0; extra == "awq"
66
+ Requires-Dist: autoawq>=0.2.0; platform_system == "Linux" and extra == "awq"
67
+ Requires-Dist: transformers>=5.0.0; extra == "awq"
68
+ Requires-Dist: triton>=2.3.0; platform_system == "Linux" and extra == "awq"
69
+ Provides-Extra: gpu
70
+ Requires-Dist: torch>=2.1.0; extra == "gpu"
71
+ Requires-Dist: accelerate>=0.27; extra == "gpu"
72
+ Requires-Dist: bitsandbytes>=0.41; platform_system == "Linux" and extra == "gpu"
73
+ Provides-Extra: all
74
+ Requires-Dist: torch>=2.1.0; extra == "all"
75
+ Requires-Dist: transformers>=5.0.0; extra == "all"
76
+ Requires-Dist: datasets>=3.0; extra == "all"
77
+ Requires-Dist: numpy>=1.24; extra == "all"
78
+ Requires-Dist: huggingface_hub>=1.0.0; extra == "all"
79
+ Requires-Dist: accelerate>=0.27; extra == "all"
80
+ Requires-Dist: bitsandbytes>=0.41; platform_system == "Linux" and extra == "all"
81
+ Requires-Dist: auto-gptq>=0.7.0; platform_system == "Linux" and extra == "all"
82
+ Requires-Dist: autoawq>=0.2.0; platform_system == "Linux" and extra == "all"
83
+ Requires-Dist: triton>=2.3.0; platform_system == "Linux" and extra == "all"
84
+ Requires-Dist: aiohttp>=3.12.14; extra == "all"
85
+ Requires-Dist: h2>=4.3.0; extra == "all"
86
+ Requires-Dist: pillow>=11.3.0; extra == "all"
87
+ Provides-Extra: onnx
88
+ Requires-Dist: optimum>=1.17.0; extra == "onnx"
89
+ Requires-Dist: onnxruntime>=1.17.0; extra == "onnx"
90
+ Provides-Extra: dev
91
+ Requires-Dist: pytest>=7.0; extra == "dev"
92
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
93
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
94
+ Requires-Dist: black>=23.0; extra == "dev"
95
+ Requires-Dist: mypy>=1.0; extra == "dev"
96
+ Requires-Dist: hypothesis>=6.98; extra == "dev"
97
+ Requires-Dist: pre-commit>=3.0; extra == "dev"
98
+ Requires-Dist: mkdocs>=1.5; extra == "dev"
99
+ Requires-Dist: mkdocs-material>=9.5; extra == "dev"
100
+ Requires-Dist: mkdocs-mermaid2-plugin>=1.1; extra == "dev"
101
+ Requires-Dist: sphinx>=7.0; extra == "dev"
102
+ Requires-Dist: matplotlib>=3.7; extra == "dev"
103
+ Requires-Dist: bitsandbytes>=0.41; extra == "dev"
104
+ Requires-Dist: build>=0.10.0; extra == "dev"
105
+ Requires-Dist: twine>=4.0.0; extra == "dev"
106
+ Dynamic: license-file
107
+
108
+ <p align="center">
109
+ <picture>
110
+ <source
111
+ media="(prefers-color-scheme: dark)"
112
+ srcset="docs/assets/invarlock-logo-dark.svg"
113
+ />
114
+ <img src="docs/assets/invarlock-logo.svg" alt="InvarLock" />
115
+ </picture>
116
+ </p>
117
+
118
+ <p align="center"><em>Edit‑agnostic robustness reports for weight edits</em></p>
119
+
120
+ <p align="center">
121
+ <a href="https://github.com/invarlock/invarlock/actions/workflows/ci.yml">
122
+ <img alt="CI" src="https://img.shields.io/github/actions/workflow/status/invarlock/invarlock/ci.yml?branch=main&logo=github&label=CI" />
123
+ </a>
124
+ <a href="https://pypi.org/project/invarlock/">
125
+ <img alt="PyPI" src="https://badge.fury.io/py/invarlock.svg" />
126
+ </a>
127
+ <a href="https://github.com/invarlock/invarlock/blob/main/docs/user-guide/quickstart.md">
128
+ <img alt="Docs" src="https://img.shields.io/badge/docs-quickstart-blue.svg" />
129
+ </a>
130
+ <a href="LICENSE">
131
+ <img alt="License: Apache-2.0" src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" />
132
+ </a>
133
+ <a href="https://www.python.org/downloads/release/python-3120/">
134
+ <img alt="Python 3.12+" src="https://img.shields.io/badge/python-3.12+-blue.svg" />
135
+ </a>
136
+ </p>
137
+
138
+ <p align="center">
139
+ <strong>Catch silent quality regressions from quantization, pruning, and weight edits before they ship.</strong>
140
+ </p>
141
+
142
+ Quantizing, pruning, or otherwise editing a model’s weights can silently degrade quality.
143
+ InvarLock compares an edited **subject** checkpoint against a fixed **baseline** with paired
144
+ evaluation windows, enforces a guard pipeline (invariants → spectral → RMT → variance), and
145
+ produces a machine‑readable Evaluation Report you can gate in CI.
146
+
147
+ ## Why InvarLock?
148
+
149
+ - **Quality gates for weight edits**: catch regressions before deployment.
150
+ - **Statistical guarantees**: paired primary metrics with confidence intervals.
151
+ - **Auditable evidence**: deterministic pairing metadata + policy digests in `evaluation.report.json`.
152
+ - **CI/CD-friendly**: stable exit codes, `--json` outputs, and portable “proof packs”.
153
+ - **Offline-first**: network is disabled by default; enable downloads per command.
154
+
155
+ ## Who is this for?
156
+
157
+ - ML engineers shipping quantized/pruned checkpoints.
158
+ - MLOps teams building CI quality gates and reviewable artifacts.
159
+ - Researchers validating compression/edit methods with reproducible, paired eval.
160
+
161
+ ## How it works
162
+
163
+ ```text
164
+ ┌───────────────────────┐ ┌────────────────────────────────────────────┐
165
+ │ Baseline (checkpoint) │────►│ │
166
+ └───────────────────────┘ │ invarlock evaluate │
167
+ │ ├─► Paired windows (deterministic) │
168
+ ┌───────────────────────┐ │ ├─► GuardChain pipeline │
169
+ │ Subject (checkpoint) │────►│ │ └─► invariants → spectral → RMT → VE │
170
+ └───────────────────────┘ │ └─► Emit: evaluation.report.json │
171
+ │ │
172
+ └────────────────────────────────────────────┘
173
+
174
+ ┌───────────────┴───────────────┐
175
+ ▼ ▼
176
+ ✅ PASS ❌ FAIL
177
+ (ship) (rollback)
178
+
179
+ ```
180
+
181
+ ## Quick start
182
+
183
+ Colab (CPU-friendly):
184
+ [![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)
185
+
186
+ ```bash
187
+ # HF adapter stack (torch/transformers)
188
+ pip install "invarlock[hf]"
189
+
190
+ # Version + report schema (when available)
191
+ invarlock --version
192
+
193
+ # Compare baseline vs subject (downloads require explicit network enable)
194
+ INVARLOCK_ALLOW_NETWORK=1 invarlock evaluate \
195
+ --baseline gpt2 \
196
+ --subject gpt2 \
197
+ --adapter auto \
198
+ --profile dev \
199
+ --quiet
200
+
201
+ # Validate the evaluation report
202
+ invarlock verify reports/eval/evaluation.report.json
203
+
204
+ # Render HTML for sharing
205
+ invarlock report html -i reports/eval/evaluation.report.json -o reports/eval/evaluation.html
206
+ ```
207
+
208
+ Example output (abridged; counts vary by profile/config):
209
+
210
+ ```text
211
+ INVARLOCK v<version> · EVALUATE
212
+ Baseline: gpt2 -> Subject: gpt2 · Profile: dev
213
+ Status: PASS · Gates: <passed>/<total> passed
214
+ Primary metric ratio: <ratio>
215
+ Output: reports/eval/evaluation.report.json
216
+ ```
217
+
218
+ ## Proof packs (portable evidence bundles)
219
+
220
+ Proof packs bundle reports + verification metadata into a distributable artifact.
221
+
222
+ - Guide: <https://github.com/invarlock/invarlock/blob/main/docs/user-guide/proof-packs.md>
223
+ - Verify: `scripts/proof_packs/verify_pack.sh --pack <dir> --strict` (or `PACK_STRICT_MODE=1 ...`)
224
+
225
+ Note: `configs/` and `scripts/` are repo resources and are not shipped in wheels; clone the repo to use
226
+ presets and proof-pack helpers.
227
+
228
+ ## Installation
229
+
230
+ ```bash
231
+ # Minimal CLI (no torch/transformers)
232
+ pip install invarlock
233
+
234
+ # HF workflows (torch/transformers)
235
+ pip install "invarlock[hf]"
236
+ ```
237
+
238
+ Optional extras: `invarlock[gpu]`, `invarlock[awq,gptq]`. Full setup: <https://github.com/invarlock/invarlock/blob/main/docs/user-guide/getting-started.md>.
239
+
240
+ ## Documentation
241
+
242
+ - Quickstart: <https://github.com/invarlock/invarlock/blob/main/docs/user-guide/quickstart.md>
243
+ - Compare & evaluate (BYOE): <https://github.com/invarlock/invarlock/blob/main/docs/user-guide/compare-and-evaluate.md>
244
+ - Reading a report: <https://github.com/invarlock/invarlock/blob/main/docs/user-guide/reading-report.md>
245
+ - CLI reference: <https://github.com/invarlock/invarlock/blob/main/docs/reference/cli.md>
246
+ - Assurance case: <https://github.com/invarlock/invarlock/blob/main/docs/assurance/00-safety-case.md>
247
+ - Threat model: <https://github.com/invarlock/invarlock/blob/main/docs/security/threat-model.md>
248
+
249
+ ## Community
250
+
251
+ - Questions/ideas: <https://github.com/invarlock/invarlock/discussions>
252
+ - Bug reports: <https://github.com/invarlock/invarlock/issues>
253
+ - Contact: <mailto:support@invarlock.dev>
254
+
255
+ ## Citation
256
+
257
+ If you use InvarLock in scientific work, please cite it (canonical metadata is in `CITATION.cff`):
258
+
259
+ ```bibtex
260
+ @software{invarlock,
261
+ title = {InvarLock: Edit-agnostic robustness evaluation reports for weight edits},
262
+ author = {{InvarLock Maintainers}},
263
+ url = {https://github.com/invarlock/invarlock},
264
+ }
265
+ ```
266
+
267
+ ## Limitations
268
+
269
+ - InvarLock evaluates an edited model relative to a baseline under a specific configuration; results are not “global” guarantees.
270
+ - Not a content-safety/alignment tool.
271
+ - Native Windows is not supported (use WSL2 or Linux).
272
+
273
+ ## Support matrix
274
+
275
+ <!-- markdownlint-disable MD060 -->
276
+ | Platform | Status | Notes |
277
+ | ---------------------- | --------------- | ----------------------------------------- |
278
+ | Python 3.12+ | ✅ Required | |
279
+ | Linux | ✅ Full | Primary dev target |
280
+ | macOS (Intel/M-series) | ✅ Full | MPS supported (default on Apple Silicon) |
281
+ | Windows | ❌ Not supported | Use WSL2 or a Linux container if required |
282
+ | CUDA | ✅ Recommended | For larger models |
283
+ | CPU | ✅ Fallback | Slower but functional |
284
+ <!-- markdownlint-enable MD060 -->
285
+
286
+ ## Project status
287
+
288
+ InvarLock is pre‑1.0. Until 1.0, minor releases may include breaking changes. See [`CHANGELOG.md`](CHANGELOG.md).
289
+
290
+ For guidance on where to ask questions, how to report bugs, and what to expect in terms of response times, see
291
+ [`SUPPORT.md`](SUPPORT.md).
292
+
293
+ ## Contributing
294
+
295
+ - Contributing guide: <https://github.com/invarlock/invarlock/blob/main/CONTRIBUTING.md>
296
+ - Fast local checks (repo clone):
297
+ - `make dev-install`
298
+ - `make test`
299
+ - `make lint`
300
+
301
+ ## License
302
+
303
+ Apache-2.0 — see `LICENSE`.
@@ -1,7 +1,7 @@
1
- invarlock/__init__.py,sha256=ADHnj4D3i4MA8nqx2Hydu5EG4ZB-OiNsv-lO2aEzVDM,1271
1
+ invarlock/__init__.py,sha256=fP52-66oQH_Zck6U8qJFLOoUVY7G_nxXXI04n4b0g0g,1273
2
2
  invarlock/__main__.py,sha256=ffhoKctw89j-henmQXThbHDIdlvK9fBfsy8LpjhOEXc,146
3
3
  invarlock/config.py,sha256=7BUOl7EW258YnsgRipjOx6lmWou5jNDzimREd35ewsQ,1725
4
- invarlock/model_profile.py,sha256=LlrBmSNXXFau0UGkYPkR9NVjatMRqTvgoNXlwD5GlaA,14557
4
+ invarlock/model_profile.py,sha256=OooTlTpsSfAOzJlMw2TsjExXShdAVyitvaKbLebzGsw,13689
5
5
  invarlock/model_utils.py,sha256=mEl9KOF2yOJgx-6r38PbD9SNFeAScamy9K-csxtl40Q,6395
6
6
  invarlock/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
7
7
  invarlock/security.py,sha256=xUjbHu-bHKUfFqDyN_21Hj00NBmAcGgnAg4JCjb0JOE,4861
@@ -11,75 +11,75 @@ invarlock/_data/runtime/profiles/ci_cpu.yaml,sha256=FE5vxeemAFWW7oRxPvp_8hIcCO8q
11
11
  invarlock/_data/runtime/profiles/release.yaml,sha256=xF0Qb0OTm904U6L3wK674JMTcDPegYvpKgwUB9pfq_w,482
12
12
  invarlock/adapters/__init__.py,sha256=wZBhjYAnD7a0ZV36EDwje6D0FGG45CIfJ41WYqUPGg0,3296
13
13
  invarlock/adapters/_capabilities.py,sha256=FmzUR5BHsxWe92Z9W1As-G5_5wG1PvqF2sUpjZ2_CdY,1483
14
- invarlock/adapters/auto.py,sha256=L4fnAi3Ahx_sznVFY9zqBSXqPKa1aAK055KwVBnh_Wc,7589
14
+ invarlock/adapters/auto.py,sha256=7PUDCnWhW6Pi7nppIbpMTzUkaczhkBFJ7xb17eDZThs,7411
15
15
  invarlock/adapters/base.py,sha256=szSh1bECeDSDGQSr5oIWhs5RlI587gE4gzdt5cnOJ1s,16100
16
16
  invarlock/adapters/base_types.py,sha256=3IuHt63_RjGZqoTOdkMpfGPiZTGqcvXXDq1KU-8QemQ,1612
17
17
  invarlock/adapters/capabilities.py,sha256=wcSUkWm0_bVMHo3CEhGxplldG8M5nrB3Uhij8cwutzY,15373
18
18
  invarlock/adapters/hf_causal.py,sha256=N9-L-Px4dzjAP4EsnJI_od1GMBqDVJ5JReyV4MyNtjs,15139
19
19
  invarlock/adapters/hf_causal_onnx.py,sha256=eMqLPs0aIb7v4KjY0krdgfImVRTPht1D_k9LCulXw6w,4451
20
- invarlock/adapters/hf_loading.py,sha256=6hdSFRz_JMtBzQfHcwvyDlIVP2y-KwLwhDorg73DZ6c,2742
21
- invarlock/adapters/hf_mixin.py,sha256=95LbHHXUbkH22P3Iqf7nQxd1vmd0sumEZ9CEyKWZsiI,23101
20
+ invarlock/adapters/hf_loading.py,sha256=iiztMDIVKi60AdlHRp9TaCOi-IRsni0p1dCeryzARsA,2694
21
+ invarlock/adapters/hf_mixin.py,sha256=uDRM5tPR6GhVh-fLql8sIUaBVFWl4Y4vvB0d6ms_3SY,24014
22
22
  invarlock/adapters/hf_mlm.py,sha256=iCyiy-0aYO43d2eTM8brKeJGBhZsMkjhzGhj580oh4s,35221
23
23
  invarlock/adapters/hf_seq2seq.py,sha256=_5jmTB0sMpXs5N1_rNJ7vpntkpj4k68Ca7tM-Iy8HPw,4796
24
24
  invarlock/adapters/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
25
- invarlock/assurance/__init__.py,sha256=SFDT2klaUaKZejulL5cfBTW29ehJxyW5srE-LuqP7z0,1388
25
+ invarlock/assurance/__init__.py,sha256=TTvJGsysPfonfJGIW2qdl3D0_yjslpzyFR0nb70ot_Q,1192
26
26
  invarlock/calibration/__init__.py,sha256=M5lbkNQtLBuQjQJGeRzHovkpYI87fEWIm7a0b23jSp4,110
27
- invarlock/calibration/spectral_null.py,sha256=2WQU7YgnnJ2i3OF60Zj4miaWBvWBXQmztukQtIWhvro,9601
27
+ invarlock/calibration/spectral_null.py,sha256=h8kmV75FICkpQPtlSmFjCsdrSPAx1Nr4i_0m9N283jU,9599
28
28
  invarlock/calibration/variance_ve.py,sha256=QkHO2vxht-n56LNqWbHYYY106Ge5PbxzHfGV1QktnN8,4487
29
29
  invarlock/cli/__init__.py,sha256=mRjYDVmNykhxJxfQBxJMzhFfmNhmvP6OWI-vJL-ehUA,196
30
30
  invarlock/cli/__main__.py,sha256=spgMrx0eJQSEf4rcd0_mB2B8rHOc3iWlTFO3P_qEvoM,175
31
31
  invarlock/cli/_evidence.py,sha256=38QMfFlPUT_qIRAZmpDROkwSIpHGiNKRWDyXfZ9xI_U,769
32
32
  invarlock/cli/_json.py,sha256=AKrRNFza76tH3GBVHO8gSA3klUVQ9XpDo_aYh8l-7j8,2367
33
- invarlock/cli/adapter_auto.py,sha256=macGPMlQkc9TftMzYzK33VvlIevSXrrF_gC5nUAVbjU,5634
34
- invarlock/cli/app.py,sha256=HTzF1YrXJm6_E8GmHxAA5KyBQ4bCmEi8BPIM7hZyO48,11786
33
+ invarlock/cli/adapter_auto.py,sha256=uazFcSck4f_S2fSlV-utJsuCdoCQpBPBl8KRPXkC3_k,5448
34
+ invarlock/cli/app.py,sha256=nWn3Ptgwa27LrwLqkbqxmoc9F2TuGIP_XyGouoalx3U,12453
35
35
  invarlock/cli/config.py,sha256=DNCsepPCY_l0JTPUqI9QRa-cLIl8n4H2xzolXjtL7q8,14205
36
36
  invarlock/cli/constants.py,sha256=RuXxG82pukfBnEuJB2CVF5dyu4lEi-l8eAxkR314yuk,2107
37
- invarlock/cli/determinism.py,sha256=ux3AODjZbSdYE29uSrHXvY2qrEPxeAJd04QLT52lnec,8346
37
+ invarlock/cli/determinism.py,sha256=kf7WD8bB11WWzpzdGu3j55JfPSfCK3gYYCSNVVf8jyU,8352
38
38
  invarlock/cli/device.py,sha256=5X0j2yiZbSKX9-SlDaAbSeHCoWhfEQ74YWPTb8WRk8k,3165
39
39
  invarlock/cli/doctor_helpers.py,sha256=3QkE4P6lrb2YQA-OC5m6K6CQEoe7PSRiSuQDYEvmRsY,2503
40
40
  invarlock/cli/errors.py,sha256=IzFikxe5gthlZ27wrRYUiM_SJsd2Sa5onUUhjm8e2kA,189
41
41
  invarlock/cli/output.py,sha256=lNEQ189iyV-EEsdTY4rmFcKKjq0lJuIP-gzsEIFL7BA,4883
42
42
  invarlock/cli/overhead_utils.py,sha256=Ygvl192UDTroAbVAd7v35jgigmmfVxNkCIGYlWfh6Co,2124
43
- invarlock/cli/provenance.py,sha256=P3Rg_IEFYqNcECiPd-aO0rgp8ZDfqAy5n5N_bPGg1C4,1946
43
+ invarlock/cli/provenance.py,sha256=ksoAVOhMnSrPYCh0osLDEbgxKOCS1DjoXuBuZmV6m5k,1948
44
44
  invarlock/cli/utils.py,sha256=R6IN21lGfko2lGUgspmkZyjA6Nl_dVRaP8F8nRtN5yw,1393
45
- invarlock/cli/commands/__init__.py,sha256=afpKpU8hJI41Ol46oXxVwQgPwFBy4OmLaa_v4AAOdts,712
46
- invarlock/cli/commands/calibrate.py,sha256=TnoYKjvmz2pSj3Wak8HluSV27hN2D8O1dGAQWCcHeeE,20830
47
- invarlock/cli/commands/certify.py,sha256=ET56hmCkn61XpZ3hrHIrS4CG6dmjDvlkSEzgSxm8YdA,35625
45
+ invarlock/cli/commands/__init__.py,sha256=Nvjvw9Jo0Wq3BHBpEGZBTUnj25920hw9jZ0qm1jm6yw,715
46
+ invarlock/cli/commands/calibrate.py,sha256=IFWIvkwMFmXl8c0V6mY0AQ4gS9Jkl7MP96W2DFMEbMU,22663
48
47
  invarlock/cli/commands/doctor.py,sha256=F-q5CJ2qRgCDqbaZYBRApPUy7V6E_jkgSCqZgkxlOqA,56879
49
- invarlock/cli/commands/explain_gates.py,sha256=7cnc_FBxvSkjmM12JOA2yfhY4JH1puDDaIHo3r6IC9M,9444
50
- invarlock/cli/commands/export_html.py,sha256=oUGtt6EpKhjlywdtz_0FqYqcmA219H4eSjPuSMDShgY,3095
48
+ invarlock/cli/commands/evaluate.py,sha256=eCnT9m4LzYCf5lmZd8hCvn-8CgdtXwx7CJvyMRaYRbg,36799
49
+ invarlock/cli/commands/explain_gates.py,sha256=wbIgCStvdu6EXy5us8QeI-6Nq6nMQRbbF3eynFDAnXc,10977
50
+ invarlock/cli/commands/export_html.py,sha256=v5UCbFcRrJvRFC5ek-LhZbaBTZtkmaQikg2QHZR73RA,3142
51
51
  invarlock/cli/commands/plugins.py,sha256=VTJKTMjFO4Dh4dqcY4qlkwhsWJixyHSNk8tWBcYGyfA,53620
52
- invarlock/cli/commands/report.py,sha256=91hfdk3Vr4ckMyl0ZgV_b9opE_5_G_dYg2F5BLIh_Mo,18292
53
- invarlock/cli/commands/run.py,sha256=rk7DfXcVp7AncGpkPvkYjT7t1whHknRzEnVpIe6jesc,228633
54
- invarlock/cli/commands/verify.py,sha256=Gm4dgATdyo5HRsuAwH-7hZpPt1a0wxXnAJkGpZ8w6xE,51801
52
+ invarlock/cli/commands/report.py,sha256=eL1AaV0sK8rUNlstlew_UQhDv_J6sunEblsDuk3qItA,21404
53
+ invarlock/cli/commands/run.py,sha256=7D2s8WM5o02n9oVsNpaVpdeBKXY812jXkNS4MZwColQ,236332
54
+ invarlock/cli/commands/verify.py,sha256=o8WtTaw2JZFNXb3fREhlC0eLutujDaGzqDSIXwIrtl8,51481
55
55
  invarlock/core/__init__.py,sha256=4wb83Xv7NE5M1FgvaFUviiNtVSTVATiPH3gqavNmp2w,1490
56
56
  invarlock/core/abi.py,sha256=gmU1F7LDd2HTcF4kcznn8vgG4zj9UCHSqhBk9jyu05k,484
57
57
  invarlock/core/api.py,sha256=RTFswFBuUH38gary5X7qmccOD7vAYLtSN0ie8Y6p1ck,8480
58
58
  invarlock/core/auto_tuning.py,sha256=Gj0AhpThoDYnzr9DyuXM9iCuieMKR4xv43tC7ZcjHzs,18543
59
- invarlock/core/bootstrap.py,sha256=buamO9CNkfmPaK8zFy_GtQD9VnFiBiwxaTGQvEo3neA,10659
59
+ invarlock/core/bootstrap.py,sha256=c4bd8GFUiL53oI7t2QVM46Ah7Tl1LbtbyQGb5VzXuWQ,10647
60
60
  invarlock/core/checkpoint.py,sha256=a78L-mZd3j2kC1az2eTScRxTHjrULuYs-UPfWUcDgqM,6933
61
61
  invarlock/core/contracts.py,sha256=ESK3-ErieGEf8e84wiphlCjahdr87zoKyTSskq6o23E,2468
62
62
  invarlock/core/error_utils.py,sha256=T23-p5ONQ-SeVuMR4Ts0cWyupsSa-0DAgsejRTfxeCg,1782
63
63
  invarlock/core/events.py,sha256=8XBAi-9A7ys7QJQwqlz8PVlfxF0TM_TvLqjcPtDwZm4,9428
64
64
  invarlock/core/exceptions.py,sha256=b4OszJ0Fd0Ezy8s99AzprS7lAkqdZYGXaSj9fYaln4E,2077
65
65
  invarlock/core/registry.py,sha256=hQrAqVEyDOCF88KHn80a5oMMS73_i4KTjL3Wwo08YkI,18910
66
- invarlock/core/retry.py,sha256=KTVkrTnWs60jwATOZDHinERH56GnOGjsKR0lmohagEo,4503
67
- invarlock/core/runner.py,sha256=lftQst05FASXuRIIkqrmOX4Sn9DezY3Aws6Cnh3A8OY,107570
66
+ invarlock/core/retry.py,sha256=gdMZRouhyjwgbSGEpwGBIqrrtRO8-jPcN50ebIwOPR0,4441
67
+ invarlock/core/runner.py,sha256=y0FLefuosmEFwpAmEy_Wa2mkcPUJRxPDr9J1MdPzmbM,107587
68
68
  invarlock/core/types.py,sha256=nVLMP4yqlxwhE1moQU7FWVeGJqTuud-cvTZiutdBGKk,3585
69
69
  invarlock/edits/__init__.py,sha256=5CJTX6oJTLj79Vmks2_8mXRGFQH0oyKaZOrBLTlRtV0,277
70
70
  invarlock/edits/_edit_utils.py,sha256=VGl32JAt7XsovxJbX1YvW9DJvtG-K2EKu-TjBFTQmDY,6329
71
71
  invarlock/edits/_external_utils.py,sha256=Ltaua-eNooDagPSb20wxK-QXXpHjFJaymbDIjI3ZoWY,7625
72
- invarlock/edits/noop.py,sha256=I9ICb9m4RLK7BllERlydujQciHQm9Hj8gbqKz5_rCTg,1304
72
+ invarlock/edits/noop.py,sha256=RpqiZy5jZaxZ_O-aSz3FlOzo_isszZ2NDiHNNDpGBDk,1302
73
73
  invarlock/edits/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
74
- invarlock/edits/quant_rtn.py,sha256=b6GQe-KDe_Tpr4904naLYn4_dmG9lR5LwwjTaqbX7Dc,31651
74
+ invarlock/edits/quant_rtn.py,sha256=-ENk7VnJi3uSptlBmVg4jVDwwfMtWhhp0ginpc9ShQw,31663
75
75
  invarlock/edits/registry.py,sha256=MmUfJhhvc3WxB03wQkPxFMS6nkT7YcXFPQqhbksfOUc,4523
76
- invarlock/eval/__init__.py,sha256=GsKoszCysh3TT_UHiuJcqeoiXT7AUNZoqMuBmefnWtY,755
77
- invarlock/eval/bench.py,sha256=jVBQcbEV7tEiyaYv6nJnvL5KCuHD3LOb5qXYbfvyWgs,55931
76
+ invarlock/eval/__init__.py,sha256=SDz0f1t00ZBgT5xMXblRxbW0j0ai75EimJ78ZOwgegs,756
77
+ invarlock/eval/bench.py,sha256=dt7-UEv5Znk_mg1JSMxIo2vLOsdPPr6EW_Sg8_OdZUk,56032
78
78
  invarlock/eval/bench_regression.py,sha256=GDphmdcH7NI8P_afSkQAPMChEgW15J0gqTZ4Kj3kxgw,456
79
79
  invarlock/eval/bootstrap.py,sha256=CNn7W_MY716Wa_wn6cYRmbTYB9lT2X0yLOAIHCRw29k,1766
80
80
  invarlock/eval/data.py,sha256=WcnH9nMaEpWqsGLnVfSFIps1a_16aVw0qtpQtm0-G2c,68326
81
81
  invarlock/eval/metrics.py,sha256=PHfsIZQpCDesj7oL_vAIDdB3nH-10qVRl6kvfRU8-u4,80789
82
- invarlock/eval/primary_metric.py,sha256=lGDWiXM1cyXqGH6XprLrxBl1hTwjrlSYbQCzF687zsA,29545
82
+ invarlock/eval/primary_metric.py,sha256=DxD2tTahPEInMolynMkJR2PsM915-prncmr3c08en2w,29563
83
83
  invarlock/eval/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
84
84
  invarlock/eval/tail_stats.py,sha256=ueScFzPvBnBC4jVW5EElnB0c3LPK3cAITcOUdyPCsEk,7114
85
85
  invarlock/eval/probes/__init__.py,sha256=KocOJmEWrD90c2HbDW3wDsdsibRyidskpI4rNNfLbZ0,593
@@ -101,47 +101,47 @@ invarlock/guards/invariants.py,sha256=pnzjB1_2e0yD7jjySLIm_McDail_HTWpbAsGuYD2I4
101
101
  invarlock/guards/policies.py,sha256=ggY0zZ3i39OAeFZJSG1FjwnR3-wjWntKLLvumBvG8pc,25933
102
102
  invarlock/guards/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
103
103
  invarlock/guards/rmt.py,sha256=aRMtRR7LfrjR-ZkeL_AsGb61bbBadYHhQx424WIRFVs,99878
104
- invarlock/guards/spectral.py,sha256=TP_xmzL0iP3CSQjnkulNbuJegxCrp68MuMPWdLeE0Gg,69597
104
+ invarlock/guards/spectral.py,sha256=lJbj4X_rSB6gcZ89yohdr2795Hlw5E5LXiRRFXjRKUw,69601
105
105
  invarlock/guards/tier_config.py,sha256=6JzS1TOlhUVX2NdUodWhb4VOA_AnAFVOXvwY9aiopbA,10796
106
106
  invarlock/guards/variance.py,sha256=iNursnzCHbc2fd3icZ3cYG-dk4WFYqn6CKxKcKn2MJI,136385
107
107
  invarlock/guards_ref/__init__.py,sha256=jLnyFqdqQaheG1qQMlU4Gx7R118rkkQHPqFVF3_1ih0,366
108
108
  invarlock/guards_ref/rmt_ref.py,sha256=IfwN-l9cLExUQJhZmr-1uJv7qRSoYrGg2w2caCG53hs,1399
109
- invarlock/guards_ref/spectral_ref.py,sha256=FdwFfrs5hxEEUIfBV3CvAJvTX78gAM00mKLEXyZ0zJo,4386
109
+ invarlock/guards_ref/spectral_ref.py,sha256=UE-jHz77jmj9Qw0ScYrsLxGme5yvUh5BVDw4uy9a_l4,4384
110
110
  invarlock/guards_ref/variance_ref.py,sha256=BmTQL5nfxReJK5SqnuUi1SOcQftK7IUNwlcxqdtGPEU,2264
111
111
  invarlock/observability/__init__.py,sha256=_fCH1H51M0PYOvpuNq9sVQLTiDAtdQMvtnhVt-z-VPk,345
112
112
  invarlock/observability/alerting.py,sha256=y_mReOy5KHbHhglQIoChzTl-4BZz9aaGDreLGFzhl8M,17887
113
113
  invarlock/observability/core.py,sha256=lMsXCp5HZj3YIdfrkxRYQWpu1ib6pm8TkPab_1aKjHM,19050
114
114
  invarlock/observability/exporters.py,sha256=bNpuN7ulQ3KQSySozJZvNHythMw2ciF54aQzZ9t2hKE,18712
115
- invarlock/observability/health.py,sha256=jKVfThhe985oY1koS8EhWm08VQaVhHgRcspkuNrvO9E,21573
115
+ invarlock/observability/health.py,sha256=xP60MMz-uX8UDPd7l0CE5hBymKdVhnazUYMWqpxOPWc,22253
116
116
  invarlock/observability/metrics.py,sha256=RhEz4B5zvRHAgFHukyZHGhDJDSxR3szYwk7TTFzIZTQ,19016
117
117
  invarlock/observability/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
118
118
  invarlock/observability/utils.py,sha256=1AC3ZEzbrDzTOvSIFxAtWlITy1BHEPZ032HKKzqK_10,16492
119
119
  invarlock/plugins/__init__.py,sha256=aZqkpuTT0K3y0SX4702k3YpHnM3kng9fz0qO3XE43hY,260
120
120
  invarlock/plugins/hello_guard.py,sha256=-peYJaZd52bbdw6y8cBxEd3CbtFWualDs8nX60CeXhI,896
121
121
  invarlock/plugins/hf_awq_adapter.py,sha256=UGwzcqJyuqrYHWZ4F-vn-9LNfEDyolOgVDBi0jN35xc,3770
122
- invarlock/plugins/hf_bnb_adapter.py,sha256=g0ysWEi8dQzLtJy8iCszfTsYCOACuZMFYnTLMAEVxs0,6011
122
+ invarlock/plugins/hf_bnb_adapter.py,sha256=sJXOIX-gIZwgIW7fYqohY7DqsZMI2fnU0ALkhm0T5nM,6715
123
123
  invarlock/plugins/hf_gptq_adapter.py,sha256=ysugAcnjLqF5sqpijSNiim1xUpRmoIgBrG053X3S2hE,3743
124
124
  invarlock/plugins/py.typed,sha256=LCPmZeE_vANVVJDNvuq9A07i7jg9Nxrq6f10UeuNfZc,37
125
- invarlock/reporting/__init__.py,sha256=A0541EqxcdTpslNbZEWIO4q-LCqzCQcadev2IBKEBbM,232
126
- invarlock/reporting/certificate.py,sha256=bE7uCWJ5foZeblq_DgMoQ9wjW_tjEC7XXBvUOAy2fLA,159511
127
- invarlock/reporting/certificate_schema.py,sha256=wCBjLsWu-y1hqedQYgAmdNeSh7FkcpuGCFHGK46Wlgk,8982
125
+ invarlock/reporting/__init__.py,sha256=gLawo1x41oHX3jNQVC0XwnZ4iFcwez6MwdYN9SLoxnQ,534
128
126
  invarlock/reporting/dataset_hashing.py,sha256=igDq9iMB8sqed5CEWT2fXtx9z5QAxIZ9bbs5RndDDC4,9228
129
127
  invarlock/reporting/guards_analysis.py,sha256=Q3DhV806McbV4NVxbD-Lcw334epcQ1-zTEUF3aT8JGc,44356
130
- invarlock/reporting/html.py,sha256=-vpkk3nE9GEaEtitMVFu5EWNKTQgjPfrnadzgKiSjvc,3297
131
- invarlock/reporting/normalizer.py,sha256=RIKGtTzMBOLiDvI4-ijssnyAnQN6-c5zpbs41KeBdKI,8468
132
- invarlock/reporting/policy_utils.py,sha256=540fw6cFvyvYL7avlvId9GUvY9-g6MkeDlcPt18uuE0,22934
133
- invarlock/reporting/primary_metric_utils.py,sha256=7h6CzMQzu0A8xN10vbRgSNcQ0YTMxsT2JiNEgCVaXyM,14849
134
- invarlock/reporting/render.py,sha256=PkyzUIJQNI-1X7wghlO_KzrYwYal17qFRA0mcdJsUb4,75137
135
- invarlock/reporting/report.py,sha256=hVjyqPHJOeM6TWVAttExrhYxeAPTfY3HPFAMlrlkVZE,33780
128
+ invarlock/reporting/html.py,sha256=UrDIXsiKEFQpxACY3637OiVyL01CkPV2bAwJ_c0cEl4,3286
129
+ invarlock/reporting/normalizer.py,sha256=_t7ugqmIfBqz0HSH_NgKtwByHkQI-7CyL7-CMN9ya44,8482
130
+ invarlock/reporting/policy_utils.py,sha256=yjUOtClY0iMreVo_r1srHFvPgb1QyQ9X6x2cQStVWEM,22937
131
+ invarlock/reporting/primary_metric_utils.py,sha256=Ing2LKIvgpqQQLAuB0x80J3qMd1rBJV2UrePWHZeHCo,14912
132
+ invarlock/reporting/render.py,sha256=zliYsn79a0s-DkaKsAdcjKBLyPTdPfS-DHGb2b3fYOs,75618
133
+ invarlock/reporting/report.py,sha256=2w-REyyvbeuOm6l4BIEqVf0lT1ldPWZD7N378_DDR5I,33871
134
+ invarlock/reporting/report_builder.py,sha256=7USKoyPTGOSObdFc24Z2iPVu6r7k6nm9hBw7rZe54Io,159978
135
+ invarlock/reporting/report_schema.py,sha256=yvxSbbppdhQchQCBmMcVQTszUBERQg7rrZ-4obnzafc,8902
136
136
  invarlock/reporting/report_types.py,sha256=NcA6PkI8JJA-FbPAGT-q_QcDkRcz57ayEKHyFbqe-Rk,9211
137
137
  invarlock/reporting/telemetry.py,sha256=1A4ZgsmT7BzaEMiG56OzCwc0dX6MKVh8TPOwyXNGSb8,2705
138
138
  invarlock/reporting/utils.py,sha256=1aLYgSUR4XvgmhDvU9YK9ICd7W5sjft1qdsZC9JJSRY,5540
139
139
  invarlock/reporting/validate.py,sha256=aFcac5iaaNOLMYEf6g5xoF4-a-J5E430utFLnfu6fKc,21782
140
140
  invarlock/utils/__init__.py,sha256=DR2pBrgddLH2PW-6ninOE8CM7DNvlvgyYsCkckozbPU,4276
141
141
  invarlock/utils/digest.py,sha256=sfnqGFRiRf7l950MjSIrWO1XbUfXlcEfNLeWFbBUr8I,1290
142
- invarlock-0.3.7.dist-info/licenses/LICENSE,sha256=uFddaXYY02nEFdPpS7bam_bnm0st41BibzD0jHULPXw,10413
143
- invarlock-0.3.7.dist-info/METADATA,sha256=Nl947X_buWTqiOvNfWlEQq_bbkdcUF7vceVgG6lz_9o,23388
144
- invarlock-0.3.7.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
145
- invarlock-0.3.7.dist-info/entry_points.txt,sha256=7zdvDjsIPqOGEhfQFn596IrodvkhYrkybFgQ2ywPHYQ,780
146
- invarlock-0.3.7.dist-info/top_level.txt,sha256=GXfftc_YDHHcQC2vQgYbZ5cTO82YuWY3HusHMT3DuKs,10
147
- invarlock-0.3.7.dist-info/RECORD,,
142
+ invarlock-0.3.9.dist-info/licenses/LICENSE,sha256=uFddaXYY02nEFdPpS7bam_bnm0st41BibzD0jHULPXw,10413
143
+ invarlock-0.3.9.dist-info/METADATA,sha256=8dJtXFFBg3tIKnIcVkIc0wsLqR-uhXAfH82MnJLoxDI,13901
144
+ invarlock-0.3.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
145
+ invarlock-0.3.9.dist-info/entry_points.txt,sha256=7zdvDjsIPqOGEhfQFn596IrodvkhYrkybFgQ2ywPHYQ,780
146
+ invarlock-0.3.9.dist-info/top_level.txt,sha256=GXfftc_YDHHcQC2vQgYbZ5cTO82YuWY3HusHMT3DuKs,10
147
+ invarlock-0.3.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5