mini-antemortem-cli 0.1.0__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.
@@ -0,0 +1,48 @@
1
+ """mini-antemortem-cli - analytical preflight for omegaprompt calibration.
2
+
3
+ Reads the run configuration and classifies seven calibration-specific
4
+ trap patterns against deterministic rules. No API calls, no network;
5
+ reasoning is deterministic given the inputs. Emits
6
+ :class:`omegaprompt.preflight.AnalyticalFinding` records that feed
7
+ :func:`omegaprompt.preflight.derive_adaptation_plan`.
8
+
9
+ Covered traps::
10
+
11
+ self_agreement_bias
12
+ small_sample_kc4_power
13
+ variants_homogeneous
14
+ rubric_weight_concentration
15
+ judge_budget_too_small
16
+ empty_reference_with_strict_rubric
17
+ no_held_out_slice
18
+
19
+ Public API::
20
+
21
+ from mini_antemortem_cli import analytical_preflight, analytical_traps
22
+
23
+ Separate package; not part of the main ``omegaprompt`` install. Install
24
+ alongside omegaprompt when you want analytical preflight before
25
+ calibration::
26
+
27
+ pip install omegaprompt mini-antemortem-cli
28
+
29
+ Companion to ``mini-omega-lock`` (empirical preflight). Either can be
30
+ used alone; both compose into the same ``PreflightReport``.
31
+ """
32
+
33
+ from mini_antemortem_cli.traps import (
34
+ CALIBRATION_TRAPS,
35
+ TrapPattern,
36
+ analytical_preflight,
37
+ analytical_traps,
38
+ )
39
+
40
+ __version__ = "0.1.0"
41
+
42
+ __all__ = [
43
+ "CALIBRATION_TRAPS",
44
+ "TrapPattern",
45
+ "analytical_preflight",
46
+ "analytical_traps",
47
+ "__version__",
48
+ ]
@@ -0,0 +1,356 @@
1
+ """Analytical preflight (mini-antemortem adapter).
2
+
3
+ Reads the run configuration and emits classifications over a fixed set
4
+ of calibration-specific trap patterns. No API calls; all reasoning is
5
+ deterministic given the config.
6
+
7
+ The full antemortem-cli ``--domain calibration`` integration is a separate
8
+ project that uses an LLM to reason over the trap list against richer
9
+ evidence (vendor docs, prior-run artifacts, model cards). The in-process
10
+ version below covers the highest-signal traps with deterministic rules so
11
+ the core pipeline can stand alone.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass
17
+
18
+ from omegaprompt.domain.dataset import Dataset
19
+ from omegaprompt.domain.judge import JudgeRubric
20
+ from omegaprompt.domain.params import PromptVariants
21
+ from omegaprompt.preflight.contracts import (
22
+ AnalyticalFinding,
23
+ PreflightSeverity,
24
+ )
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class TrapPattern:
29
+ """One reusable calibration trap pattern."""
30
+
31
+ id: str
32
+ hypothesis: str
33
+
34
+
35
+ CALIBRATION_TRAPS: tuple[TrapPattern, ...] = (
36
+ TrapPattern(
37
+ id="self_agreement_bias",
38
+ hypothesis=(
39
+ "Target and judge share a vendor; judge's biases overlap with the "
40
+ "target, flattering same-vendor responses."
41
+ ),
42
+ ),
43
+ TrapPattern(
44
+ id="small_sample_kc4_power",
45
+ hypothesis=(
46
+ "Dataset is small enough that Pearson KC-4 has no statistical power; "
47
+ "correlation threshold becomes a random pass/fail."
48
+ ),
49
+ ),
50
+ TrapPattern(
51
+ id="variants_homogeneous",
52
+ hypothesis=(
53
+ "System prompt variants are too similar; sensitivity on the "
54
+ "system_prompt_variant axis will be artificially low."
55
+ ),
56
+ ),
57
+ TrapPattern(
58
+ id="rubric_weight_concentration",
59
+ hypothesis=(
60
+ "A single rubric dimension carries the majority of the weight; "
61
+ "judge noise on that one dimension dominates the fitness."
62
+ ),
63
+ ),
64
+ TrapPattern(
65
+ id="judge_budget_too_small",
66
+ hypothesis=(
67
+ "Judge output budget is SMALL but rubric has many dimensions + "
68
+ "gates; judge response may be truncated before scoring all axes."
69
+ ),
70
+ ),
71
+ TrapPattern(
72
+ id="empty_reference_with_strict_rubric",
73
+ hypothesis=(
74
+ "Dataset items have no reference text while the rubric's "
75
+ "dimension descriptions imply comparison to a ground truth."
76
+ ),
77
+ ),
78
+ TrapPattern(
79
+ id="no_held_out_slice",
80
+ hypothesis=(
81
+ "User did not pass --test; walk-forward cannot run; ship "
82
+ "decision has no generalisation evidence."
83
+ ),
84
+ ),
85
+ )
86
+
87
+
88
+ def analytical_traps() -> tuple[TrapPattern, ...]:
89
+ """Return the built-in calibration trap patterns."""
90
+ return CALIBRATION_TRAPS
91
+
92
+
93
+ def _finding(
94
+ trap: TrapPattern,
95
+ *,
96
+ label: str,
97
+ severity: PreflightSeverity = PreflightSeverity.MEDIUM,
98
+ note: str = "",
99
+ remediation: str = "",
100
+ cite: str | None = None,
101
+ ) -> AnalyticalFinding:
102
+ return AnalyticalFinding(
103
+ trap_id=trap.id,
104
+ label=label,
105
+ hypothesis=trap.hypothesis,
106
+ severity=severity,
107
+ note=note,
108
+ remediation=remediation,
109
+ cite=cite,
110
+ )
111
+
112
+
113
+ def _check_self_agreement(
114
+ target_provider: str,
115
+ target_model: str | None,
116
+ judge_provider: str,
117
+ judge_model: str | None,
118
+ ) -> AnalyticalFinding:
119
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "self_agreement_bias")
120
+ if target_provider == judge_provider and target_model == judge_model:
121
+ return _finding(
122
+ trap,
123
+ label="REAL",
124
+ severity=PreflightSeverity.HIGH,
125
+ note=(
126
+ f"Target and judge are identical: {target_provider}/{target_model or 'default'}. "
127
+ "Judge will share the target's distributional biases."
128
+ ),
129
+ remediation="Use a different vendor or stronger model for --judge-*.",
130
+ )
131
+ if target_provider == judge_provider:
132
+ return _finding(
133
+ trap,
134
+ label="REAL",
135
+ severity=PreflightSeverity.MEDIUM,
136
+ note=f"Target and judge share vendor ({target_provider}); some bias overlap.",
137
+ remediation="Consider a cross-vendor judge to break self-agreement bias.",
138
+ )
139
+ return _finding(
140
+ trap,
141
+ label="GHOST",
142
+ severity=PreflightSeverity.LOW,
143
+ note=f"Target on {target_provider}, judge on {judge_provider} - different vendors.",
144
+ )
145
+
146
+
147
+ def _check_sample_power(train_size: int, test_size: int | None) -> AnalyticalFinding:
148
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "small_sample_kc4_power")
149
+ total = train_size + (test_size or 0)
150
+ if test_size is None:
151
+ # KC-4 won't run; separate trap handles that.
152
+ return _finding(
153
+ trap,
154
+ label="GHOST",
155
+ severity=PreflightSeverity.LOW,
156
+ note="No --test slice provided; Pearson check will not execute.",
157
+ )
158
+ if test_size < 10:
159
+ return _finding(
160
+ trap,
161
+ label="REAL",
162
+ severity=PreflightSeverity.HIGH,
163
+ note=(
164
+ f"Test slice has {test_size} items. Pearson correlation at n={test_size} "
165
+ "has weak statistical power; KC-4 pass/fail may be random."
166
+ ),
167
+ remediation=(
168
+ "Expand test set to at least 20 items, or raise --min-kc4 adaptively "
169
+ "(handled by AdaptationPlan)."
170
+ ),
171
+ )
172
+ if total < 20:
173
+ return _finding(
174
+ trap,
175
+ label="REAL",
176
+ severity=PreflightSeverity.MEDIUM,
177
+ note=f"Total dataset is {total} items; noise absorption limited.",
178
+ remediation="Larger datasets yield more reliable calibration gradients.",
179
+ )
180
+ return _finding(
181
+ trap,
182
+ label="GHOST",
183
+ severity=PreflightSeverity.LOW,
184
+ note=f"Dataset size {total} adequate for Pearson power.",
185
+ )
186
+
187
+
188
+ def _check_variants_homogeneity(variants: PromptVariants) -> AnalyticalFinding:
189
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "variants_homogeneous")
190
+ prompts = variants.system_prompts
191
+ if len(prompts) < 2:
192
+ return _finding(
193
+ trap,
194
+ label="REAL",
195
+ severity=PreflightSeverity.MEDIUM,
196
+ note="Only one system-prompt variant; axis contributes zero search signal.",
197
+ remediation="Provide at least 3 genuinely distinct system prompts.",
198
+ )
199
+ lengths = [len(p) for p in prompts]
200
+ if max(lengths) - min(lengths) < 20 and len(prompts) <= 3:
201
+ return _finding(
202
+ trap,
203
+ label="NEW",
204
+ severity=PreflightSeverity.MEDIUM,
205
+ note=(
206
+ f"All {len(prompts)} system prompts have near-identical length "
207
+ f"({min(lengths)}-{max(lengths)} chars); they may be too similar to "
208
+ "produce meaningful sensitivity."
209
+ ),
210
+ remediation=(
211
+ "Author variants that differ in role framing, not just wording; "
212
+ "vary length by at least 2x where possible."
213
+ ),
214
+ )
215
+ return _finding(
216
+ trap,
217
+ label="GHOST",
218
+ severity=PreflightSeverity.LOW,
219
+ note=(
220
+ f"System-prompt variants span {min(lengths)}-{max(lengths)} chars; "
221
+ "sufficient diversity expected."
222
+ ),
223
+ )
224
+
225
+
226
+ def _check_rubric_concentration(rubric: JudgeRubric) -> AnalyticalFinding:
227
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "rubric_weight_concentration")
228
+ weights = rubric.normalized_weights()
229
+ if not weights:
230
+ return _finding(trap, label="UNRESOLVED")
231
+ max_w = max(weights.values())
232
+ max_name = max(weights, key=weights.get) # type: ignore[arg-type]
233
+ if max_w > 0.7:
234
+ return _finding(
235
+ trap,
236
+ label="REAL",
237
+ severity=PreflightSeverity.MEDIUM,
238
+ note=(
239
+ f"Dimension '{max_name}' carries {max_w:.0%} of the rubric weight; "
240
+ "judge noise on that single dimension will dominate fitness."
241
+ ),
242
+ remediation=(
243
+ "Rebalance rubric so no single dimension exceeds ~50% weight, "
244
+ "or explicitly declare this concentration is intentional."
245
+ ),
246
+ )
247
+ return _finding(
248
+ trap,
249
+ label="GHOST",
250
+ severity=PreflightSeverity.LOW,
251
+ note=f"Max dimension weight is {max_w:.0%}; no single-dim dominance.",
252
+ )
253
+
254
+
255
+ def _check_judge_budget(rubric: JudgeRubric, judge_output_budget: str) -> AnalyticalFinding:
256
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "judge_budget_too_small")
257
+ n_dims = len(rubric.dimensions)
258
+ n_gates = len([g for g in rubric.hard_gates if g.evaluator == "judge"])
259
+ total_axes = n_dims + n_gates
260
+ if judge_output_budget == "small" and total_axes > 5:
261
+ return _finding(
262
+ trap,
263
+ label="REAL",
264
+ severity=PreflightSeverity.MEDIUM,
265
+ note=(
266
+ f"Judge budget SMALL (1024 tokens) vs {total_axes} rubric axes "
267
+ f"({n_dims} dims + {n_gates} gates). JudgeResult response may be truncated."
268
+ ),
269
+ remediation="Raise LLMJudge output_budget to MEDIUM or reduce rubric surface.",
270
+ )
271
+ return _finding(
272
+ trap,
273
+ label="GHOST",
274
+ severity=PreflightSeverity.LOW,
275
+ note=f"Judge budget {judge_output_budget} adequate for {total_axes} axes.",
276
+ )
277
+
278
+
279
+ def _check_empty_reference(dataset: Dataset) -> AnalyticalFinding:
280
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "empty_reference_with_strict_rubric")
281
+ has_ref = sum(1 for it in dataset.items if it.reference)
282
+ total = len(dataset.items)
283
+ if has_ref == 0 and total > 0:
284
+ return _finding(
285
+ trap,
286
+ label="NEW",
287
+ severity=PreflightSeverity.LOW,
288
+ note=(
289
+ "No dataset item has a reference field; judge scores purely by rubric "
290
+ "without ground-truth anchor."
291
+ ),
292
+ remediation=(
293
+ "If your rubric's descriptions imply comparison to a reference, add "
294
+ "reference fields or reword the rubric to be self-contained."
295
+ ),
296
+ )
297
+ return _finding(
298
+ trap,
299
+ label="GHOST",
300
+ severity=PreflightSeverity.LOW,
301
+ note=f"{has_ref}/{total} items carry reference text.",
302
+ )
303
+
304
+
305
+ def _check_no_held_out(has_test_slice: bool) -> AnalyticalFinding:
306
+ trap = next(t for t in CALIBRATION_TRAPS if t.id == "no_held_out_slice")
307
+ if not has_test_slice:
308
+ return _finding(
309
+ trap,
310
+ label="REAL",
311
+ severity=PreflightSeverity.HIGH,
312
+ note=(
313
+ "No --test slice was provided. Walk-forward validation will not run "
314
+ "and the artifact's ship recommendation will be HOLD regardless of "
315
+ "training fitness."
316
+ ),
317
+ remediation="Provide --test <held_out.jsonl> for walk-forward validation.",
318
+ )
319
+ return _finding(
320
+ trap,
321
+ label="GHOST",
322
+ severity=PreflightSeverity.LOW,
323
+ note="Held-out slice provided; walk-forward will run.",
324
+ )
325
+
326
+
327
+ def analytical_preflight(
328
+ *,
329
+ target_provider: str,
330
+ target_model: str | None,
331
+ judge_provider: str,
332
+ judge_model: str | None,
333
+ train_dataset: Dataset,
334
+ test_dataset: Dataset | None,
335
+ rubric: JudgeRubric,
336
+ variants: PromptVariants,
337
+ judge_output_budget: str = "small",
338
+ ) -> list[AnalyticalFinding]:
339
+ """Run analytical preflight checks and return one finding per trap.
340
+
341
+ All checks are deterministic given the inputs. The ordering of the
342
+ returned list is stable (same order as :data:`CALIBRATION_TRAPS`).
343
+ """
344
+ findings: list[AnalyticalFinding] = [
345
+ _check_self_agreement(target_provider, target_model, judge_provider, judge_model),
346
+ _check_sample_power(
347
+ train_size=len(train_dataset),
348
+ test_size=len(test_dataset) if test_dataset is not None else None,
349
+ ),
350
+ _check_variants_homogeneity(variants),
351
+ _check_rubric_concentration(rubric),
352
+ _check_judge_budget(rubric, judge_output_budget),
353
+ _check_empty_reference(train_dataset),
354
+ _check_no_held_out(has_test_slice=test_dataset is not None),
355
+ ]
356
+ return findings
@@ -0,0 +1,140 @@
1
+ Metadata-Version: 2.4
2
+ Name: mini-antemortem-cli
3
+ Version: 0.1.0
4
+ Summary: Analytical preflight for omegaprompt calibration: deterministic classifier over seven calibration trap patterns (self-agreement bias, small-sample KC-4 power, variant homogeneity, rubric concentration, judge budget, empty reference, missing held-out slice). Emits AnalyticalFinding records the omegaprompt pipeline consumes via derive_adaptation_plan.
5
+ Project-URL: Homepage, https://github.com/hibou04-ops/mini-antemortem-cli
6
+ Project-URL: Repository, https://github.com/hibou04-ops/mini-antemortem-cli
7
+ Project-URL: Parent package, https://github.com/hibou04-ops/omegaprompt
8
+ Project-URL: Issues, https://github.com/hibou04-ops/mini-antemortem-cli/issues
9
+ Author: hibou04-ops
10
+ License: MIT License
11
+
12
+ Copyright (c) 2026 hibou04-ops
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+ License-File: LICENSE
32
+ Keywords: analytical-audit,antemortem,omega-lock,omegaprompt,preflight,prompt-calibration
33
+ Classifier: Development Status :: 3 - Alpha
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Operating System :: OS Independent
37
+ Classifier: Programming Language :: Python :: 3
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
41
+ Requires-Python: >=3.11
42
+ Requires-Dist: omegaprompt>=1.1.0
43
+ Requires-Dist: pydantic>=2.6.0
44
+ Provides-Extra: dev
45
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
46
+ Description-Content-Type: text/markdown
47
+
48
+ # mini-antemortem-cli
49
+
50
+ [![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)
51
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org)
52
+ [![Parent](https://img.shields.io/badge/parent-omegaprompt%E2%89%A51.1.0-blueviolet.svg)](https://pypi.org/project/omegaprompt/)
53
+
54
+ > **Analytical preflight for [omegaprompt](https://pypi.org/project/omegaprompt/) calibration.** Reads the run configuration and classifies seven calibration-specific trap patterns against deterministic rules. No API calls, no network; reasoning is deterministic given the inputs. Emits `AnalyticalFinding` records that feed `omegaprompt`'s `derive_adaptation_plan`.
55
+
56
+ ```bash
57
+ pip install mini-antemortem-cli
58
+ ```
59
+
60
+ ## Why this is separate from omegaprompt
61
+
62
+ `omegaprompt` ships a **plugin interface** (`omegaprompt.preflight.contracts` + `omegaprompt.preflight.adaptation`) but no classifier code. Standalone users do not need analytical preflight — the main pipeline runs with declared defaults. Users who want analytical risk assessment over their configuration install this package alongside:
63
+
64
+ ```bash
65
+ pip install omegaprompt mini-antemortem-cli
66
+ ```
67
+
68
+ ## Trap patterns
69
+
70
+ Seven deterministic classifications run against the run config:
71
+
72
+ | Trap id | Hypothesis |
73
+ |---|---|
74
+ | `self_agreement_bias` | Target and judge share a vendor; judge's biases overlap with target. |
75
+ | `small_sample_kc4_power` | Dataset too small for Pearson correlation to carry statistical power. |
76
+ | `variants_homogeneous` | System-prompt variants are too similar for sensitivity to have signal. |
77
+ | `rubric_weight_concentration` | A single rubric dimension carries most of the weight. |
78
+ | `judge_budget_too_small` | Judge output budget is SMALL but rubric has many dimensions + gates. |
79
+ | `empty_reference_with_strict_rubric` | No dataset item has a reference; rubric implies ground-truth comparison. |
80
+ | `no_held_out_slice` | No `--test` slice; walk-forward cannot run. |
81
+
82
+ Each pattern returns one of `REAL` / `GHOST` / `NEW` / `UNRESOLVED` with a severity (`blocker` / `high` / `medium` / `low`) and a remediation hint.
83
+
84
+ ## Usage
85
+
86
+ ```python
87
+ from omegaprompt.domain.dataset import Dataset, DatasetItem
88
+ from omegaprompt.domain.judge import Dimension, HardGate, JudgeRubric
89
+ from omegaprompt.domain.params import PromptVariants
90
+ from omegaprompt.preflight import PreflightReport, derive_adaptation_plan
91
+ from mini_antemortem_cli import analytical_preflight
92
+
93
+ rubric = JudgeRubric(
94
+ dimensions=[
95
+ Dimension(name="accuracy", description="correct", weight=0.85),
96
+ Dimension(name="clarity", description="readable", weight=0.15),
97
+ ],
98
+ hard_gates=[HardGate(name="no_refusal", description="x", evaluator="judge")],
99
+ )
100
+ variants = PromptVariants(system_prompts=["You are an assistant."], few_shot_examples=[])
101
+ train = Dataset(items=[DatasetItem(id=f"t{i}", input=f"task {i}") for i in range(5)])
102
+ test = Dataset(items=[DatasetItem(id=f"v{i}", input=f"val {i}") for i in range(3)])
103
+
104
+ findings = analytical_preflight(
105
+ target_provider="openai",
106
+ target_model="gpt-4o-mini",
107
+ judge_provider="openai",
108
+ judge_model="gpt-4o-mini",
109
+ train_dataset=train,
110
+ test_dataset=test,
111
+ rubric=rubric,
112
+ variants=variants,
113
+ judge_output_budget="small",
114
+ )
115
+
116
+ report = PreflightReport(analytical_findings=findings)
117
+ plan = derive_adaptation_plan(report=report)
118
+ # plan.skip_axes, plan.max_gap_override, etc.
119
+ ```
120
+
121
+ ## Design principles
122
+
123
+ - **Deterministic.** Same config in, same findings out. No LLM calls; no sampling noise.
124
+ - **Source-level citations.** Each finding carries a `note` describing the rule that fired and a `remediation` hint. No hand-wave.
125
+ - **Severity discipline.** `high` severity findings drive `AdaptationPlan` overrides that *only strengthen* the discipline (per `apply_adaptation_plan` invariants).
126
+ - **Extensible.** Add your own `TrapPattern` and classifier function; compose with the built-in seven.
127
+
128
+ ## Validation
129
+
130
+ Every trap pattern has positive + negative test cases. No API calls, fully offline. Run with `pytest -q`.
131
+
132
+ ## Relation to the family
133
+
134
+ - **[Antemortem](https://github.com/hibou04-ops/Antemortem)** / **[antemortem-cli](https://pypi.org/project/antemortem/)** — pre-implementation reconnaissance discipline for code changes. The naming "mini-antemortem-cli" echoes this family; the *enumerate-then-classify* pattern comes from there.
135
+ - **[omegaprompt](https://pypi.org/project/omegaprompt/)** — prompt calibration engine. This package feeds its preflight plugin interface.
136
+ - **[mini-omega-lock](https://pypi.org/project/mini-omega-lock/)** — empirical sibling. Runs live probes to measure judge consistency and endpoint reliability.
137
+
138
+ ## License
139
+
140
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,6 @@
1
+ mini_antemortem_cli/__init__.py,sha256=rb80WhiKzoLSdo94Imgv1f2LumK0LR7L2TyyyilkW-Q,1310
2
+ mini_antemortem_cli/traps.py,sha256=SMZhbdP5lNI6QkiTCuA6mTemWdaddc4bShSwiLvO_ro,12475
3
+ mini_antemortem_cli-0.1.0.dist-info/METADATA,sha256=HxDXMrysWwd2dTMDZElgI6Zt3Ehi5UNrF4V7iTiKccI,7417
4
+ mini_antemortem_cli-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
5
+ mini_antemortem_cli-0.1.0.dist-info/licenses/LICENSE,sha256=tYicXmtOSTAvpfU-9AsDAfEKd1DO5IWEi09mdyil_vE,1068
6
+ mini_antemortem_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 hibou04-ops
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.