tenseleyflow/sway / 0f66b70

Browse files

probes: route every happy-path return through safe_finalize

Authored by espadonne
SHA
0f66b7036b3f8c26b867fed0c534e9e00291ce30
Parents
074a7d2
Tree
04a7d75

10 changed files

StatusFile+-
M src/dlm_sway/probes/adapter_ablation.py 2 2
M src/dlm_sway/probes/adapter_revert.py 2 2
M src/dlm_sway/probes/calibration_drift.py 2 2
M src/dlm_sway/probes/delta_kl.py 2 2
M src/dlm_sway/probes/leakage.py 2 2
M src/dlm_sway/probes/paraphrase_invariance.py 2 2
M src/dlm_sway/probes/preference_flip.py 3 3
M src/dlm_sway/probes/prompt_collapse.py 2 2
M src/dlm_sway/probes/section_internalization.py 2 2
M src/dlm_sway/probes/style_fingerprint.py 2 2
src/dlm_sway/probes/adapter_ablation.pymodified
@@ -30,7 +30,7 @@ from typing import Literal
3030
 import numpy as np
3131
 from pydantic import Field
3232
 
33
-from dlm_sway.core.result import ProbeResult, Verdict
33
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
3434
 from dlm_sway.core.scoring import ScalableDifferentialBackend
3535
 from dlm_sway.probes._divergence import Divergence, divergence
3636
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
@@ -111,7 +111,7 @@ class AdapterAblationProbe(Probe):
111111
         sat_score = 1.0 if ok_sat else 0.3
112112
         score = 0.4 * lin_score + 0.3 * sat_score + 0.3 * over_score
113113
 
114
-        return ProbeResult(
114
+        return safe_finalize(
115115
             name=spec.name,
116116
             kind=spec.kind,
117117
             verdict=verdict,
src/dlm_sway/probes/adapter_revert.pymodified
@@ -22,7 +22,7 @@ from typing import Any, Literal
2222
 from pydantic import BaseModel, ConfigDict, Field
2323
 
2424
 from dlm_sway.core.errors import BackendNotAvailableError
25
-from dlm_sway.core.result import ProbeResult, Verdict
25
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2626
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2727
 
2828
 
@@ -130,7 +130,7 @@ class AdapterRevertProbe(Probe):
130130
         score = max(0.0, 1.0 - rate / max(spec.assert_revert_rate_lt, 1e-6))
131131
         score = float(np.clip(score, 0.0, 1.0))
132132
 
133
-        return ProbeResult(
133
+        return safe_finalize(
134134
             name=spec.name,
135135
             kind=spec.kind,
136136
             verdict=verdict,
src/dlm_sway/probes/calibration_drift.pymodified
@@ -23,7 +23,7 @@ from typing import Literal
2323
 
2424
 from pydantic import Field
2525
 
26
-from dlm_sway.core.result import ProbeResult, Verdict
26
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2727
 from dlm_sway.probes._calibration_pack import BUILT_IN_PACK
2828
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2929
 
@@ -107,7 +107,7 @@ class CalibrationDriftProbe(Probe):
107107
         drift_component = max(0.0, min(1.0, (mean_delta + 1.0) / 1.5))
108108
         score = 0.6 * regress_component + 0.4 * drift_component
109109
 
110
-        return ProbeResult(
110
+        return safe_finalize(
111111
             name=spec.name,
112112
             kind=spec.kind,
113113
             verdict=verdict,
src/dlm_sway/probes/delta_kl.pymodified
@@ -20,7 +20,7 @@ from typing import Literal
2020
 
2121
 from pydantic import Field
2222
 
23
-from dlm_sway.core.result import ProbeResult, Verdict
23
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2424
 from dlm_sway.probes._divergence import Divergence, divergence, js_ln2
2525
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2626
 from dlm_sway.probes.null_adapter import get_null_stats
@@ -97,7 +97,7 @@ class DeltaKLProbe(Probe):
9797
             bound = js_ln2() if spec.divergence == "js" else 1.0
9898
             score = min(1.0, raw_mean / bound) if bound > 0.0 else 0.0
9999
 
100
-        return ProbeResult(
100
+        return safe_finalize(
101101
             name=spec.name,
102102
             kind=spec.kind,
103103
             verdict=verdict,
src/dlm_sway/probes/leakage.pymodified
@@ -21,7 +21,7 @@ from typing import Literal
2121
 
2222
 from pydantic import Field
2323
 
24
-from dlm_sway.core.result import ProbeResult, Verdict
24
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2525
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2626
 
2727
 PerturbationKind = Literal["typo", "case_flip", "drop_punct"]
@@ -130,7 +130,7 @@ class LeakageSusceptibilityProbe(Probe):
130130
         fragility_bonus = min(1.0, max(0.0, mean_fragility / max(spec.min_fragility, 1e-6)))
131131
         score = 0.7 * recall_score + 0.3 * fragility_bonus
132132
 
133
-        return ProbeResult(
133
+        return safe_finalize(
134134
             name=spec.name,
135135
             kind=spec.kind,
136136
             verdict=verdict,
src/dlm_sway/probes/paraphrase_invariance.pymodified
@@ -28,7 +28,7 @@ from typing import Literal
2828
 
2929
 from pydantic import BaseModel, ConfigDict, Field
3030
 
31
-from dlm_sway.core.result import ProbeResult, Verdict
31
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
3232
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
3333
 
3434
 Intent = Literal["generalize", "memorize", "both"]
@@ -102,7 +102,7 @@ class ParaphraseInvarianceProbe(Probe):
102102
 
103103
         verdict, score, msg = _decide(spec, mean_verb, mean_par, ratio)
104104
 
105
-        return ProbeResult(
105
+        return safe_finalize(
106106
             name=spec.name,
107107
             kind=spec.kind,
108108
             verdict=verdict,
src/dlm_sway/probes/preference_flip.pymodified
@@ -22,7 +22,7 @@ from typing import Literal
2222
 
2323
 from pydantic import BaseModel, ConfigDict, Field
2424
 
25
-from dlm_sway.core.result import ProbeResult, Verdict
25
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2626
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2727
 
2828
 
@@ -83,7 +83,7 @@ class PreferenceFlipProbe(Probe):
8383
                 (ft - base) for base, ft in zip(base_margins, ft_margins, strict=True)
8484
             )
8585
             verdict = Verdict.WARN
86
-            return ProbeResult(
86
+            return safe_finalize(
8787
                 name=spec.name,
8888
                 kind=spec.kind,
8989
                 verdict=verdict,
@@ -106,7 +106,7 @@ class PreferenceFlipProbe(Probe):
106106
         flip_rate = len(flipped_idx) / len(base_wrong_idx)
107107
         verdict = Verdict.PASS if flip_rate >= spec.assert_flip_rate_gte else Verdict.FAIL
108108
         score = min(1.0, flip_rate / max(spec.assert_flip_rate_gte, 1e-6))
109
-        return ProbeResult(
109
+        return safe_finalize(
110110
             name=spec.name,
111111
             kind=spec.kind,
112112
             verdict=verdict,
src/dlm_sway/probes/prompt_collapse.pymodified
@@ -20,7 +20,7 @@ from typing import Literal
2020
 import numpy as np
2121
 from pydantic import Field
2222
 
23
-from dlm_sway.core.result import ProbeResult, Verdict
23
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
2424
 from dlm_sway.probes._divergence import Divergence, divergence
2525
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
2626
 
@@ -98,7 +98,7 @@ class PromptCollapseProbe(Probe):
9898
             if half_life is not None
9999
             else "could not fit exponential decay (too flat or non-monotonic)"
100100
         )
101
-        return ProbeResult(
101
+        return safe_finalize(
102102
             name=spec.name,
103103
             kind=spec.kind,
104104
             verdict=verdict,
src/dlm_sway/probes/section_internalization.pymodified
@@ -30,7 +30,7 @@ from typing import Literal
3030
 
3131
 from pydantic import Field
3232
 
33
-from dlm_sway.core.result import ProbeResult, Verdict
33
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
3434
 from dlm_sway.core.scoring import ScoringBackend
3535
 from dlm_sway.core.sections import Section, SectionKind
3636
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
@@ -124,7 +124,7 @@ class SectionInternalizationProbe(Probe):
124124
         passing_frac = passing / len(eligible)
125125
         verdict = Verdict.PASS if passing_frac >= spec.assert_passing_section_frac else Verdict.FAIL
126126
         score = passing_frac
127
-        return ProbeResult(
127
+        return safe_finalize(
128128
             name=spec.name,
129129
             kind=spec.kind,
130130
             verdict=verdict,
src/dlm_sway/probes/style_fingerprint.pymodified
@@ -27,7 +27,7 @@ import numpy as np
2727
 from numpy.typing import NDArray
2828
 from pydantic import Field
2929
 
30
-from dlm_sway.core.result import ProbeResult, Verdict
30
+from dlm_sway.core.result import ProbeResult, Verdict, safe_finalize
3131
 from dlm_sway.probes.base import Probe, ProbeSpec, RunContext
3232
 
3333
 _SENTENCE_SPLIT = re.compile(r"(?<=[.!?])\s+")
@@ -145,7 +145,7 @@ class StyleFingerprintProbe(Probe):
145145
         verdict = Verdict.PASS if shift >= spec.assert_shift_gte else Verdict.FAIL
146146
         score = float(np.clip((shift + 1.0) / 2.0, 0.0, 1.0))
147147
 
148
-        return ProbeResult(
148
+        return safe_finalize(
149149
             name=spec.name,
150150
             kind=spec.kind,
151151
             verdict=verdict,