feat(principles): retroactive cull (Phase C) + source-derived terminology (Phase D, #152)
Phase C — scripts/cull_principles.py: re-adjudicates every existing 'original' principle with the SAME panel regime (panel_keep_score → classify → apply_cap), reversible (CSV backup + rejected canonical recoverable), usage-throttled. panel_extraction.panel_keep_score + apply_cap (shared, G2). Dry-run on 3 decisions: 37→15 survive. Phase D — services/principles.py: source-derived label הלכה (binding court) / כלל פרשני (committee) / עיקרון (persuasive); umbrella עקרונות משפטיים. Wired into canonical_halacha_get/list (principle_class+principle_label). UI string changes deferred to the Claude Design gate. spec INV-LRN7; SCRIPTS.md; 7 new tests; 428 green. Phase E needs no new code — synthesis already targets pending_synthesis, which the cull leaves only on survivors (rejected canonicals → 'rejected'). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,25 @@ def test_cluster_same_model_twice_counts_one_vote_keeps_best_score():
|
||||
assert cl["rule_statement"] == "X"
|
||||
|
||||
|
||||
def test_apply_cap_downgrades_over_cap_survivors_by_score():
|
||||
judged = [
|
||||
{"verdict": "approved", "score": 0.9},
|
||||
{"verdict": "approved", "score": 0.7},
|
||||
{"verdict": "pending_review", "score": 0.8},
|
||||
{"verdict": "rejected", "score": 0.95}, # already rejected stays
|
||||
]
|
||||
out = pe.apply_cap(judged, max_new=2)
|
||||
fv = [j["final_verdict"] for j in out]
|
||||
# top-2 survivors by score = 0.9(approved) + 0.8(pending); 0.7 → over cap → rejected
|
||||
assert fv == ["approved", "rejected", "pending_review", "rejected"]
|
||||
|
||||
|
||||
def test_apply_cap_keeps_all_when_under_cap():
|
||||
judged = [{"verdict": "approved", "score": 0.9}, {"verdict": "pending_review", "score": 0.5}]
|
||||
out = pe.apply_cap(judged, max_new=5)
|
||||
assert [j["final_verdict"] for j in out] == ["approved", "pending_review"]
|
||||
|
||||
|
||||
def test_cluster_sorted_strongest_first():
|
||||
a = _c("X", 0.9) # 1 vote
|
||||
b, c = _c("Y", 0.9), _c("Y", 0.9) # 2 votes
|
||||
|
||||
Reference in New Issue
Block a user