fix(codex-bridge): a refusal phrased as a question is still blocked

User, 11 Oct 2026: the model answered "I can't write that; shall I do a reduced
version?" and the step check let it through because it was a question. A reply
that refuses or sets its own conditions is blocked even when it ends with a
question; a clarifying question without a refusal stays below the thresholds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yilsemandClaude Opus 5.5 committed 2026-10-11 08:07:50 +03:00
1 parent 5556ad11af
commit 27964e37b0
2 files changed
+7 -5

No files matched your search

@@ -10,8 +10,8 @@ Jev (TypeSafe System One) metin uretmez; bir duruma sorulan evet/hayir sorularin
2026: cagri basina ~0,4 sn, 13 gercek ornegin 13'u dogru ayrildi). Kural kodda durur:
- yakalanir: cevap istegi yapmiyor/soylemiyor (ret, kacamak, konuyu degistirme) ya da istegi sormadan kendi
sartlariyla degistiriyor;
- yakalanmaz: somut bir teknik engel bildiren cevap (hata, eksik dosya/arac/yetki) ve kullaniciya soru ya da onay
soran cevap; metni olmayan (yalniz arac cagiran) adim.
- yakalanmaz: somut bir teknik engel bildiren cevap (hata, eksik dosya/arac/yetki), ret icermeyen netlestirme
sorusu ve metni olmayan (yalniz arac cagiran) adim. "Yapamam, soyle yapayim mi?" diye soran cevap yakalanir.
Jev'e ulasilamazsa cevap oldugu gibi gecer (is durmaz); art arda hatada bir sure hic sorulmaz.
Codex'in kendi modelleri kopruye ugramadigi icin bu denetimin disindadir.
@@ -142,8 +142,9 @@ def karar(puan, ayar=None):
"""True: adim gecmez (yedek model yapar). Esikler ayardan degistirilebilir."""
e = dict(ESIK)
e.update({k: float(v) for k, v in (ayar or {}).items() if k in ESIK})
if puan["soru"] >= e["soru"]:
return False # kullaniciya soru/onay soruyor: kullanici cevaplar
# Soru bicimi istisna degildir (kullanici, 11 Ekim 2026: model "yazamam, soyle yapayim mi?" deyince "Jev bunu
# gecirdi mi?" diye sordu): ret ya da sart iceren cevap sonunda soru sorsa da gecmez. Ret icermeyen gercek
# netlestirme sorusu ("hangi alan adina?") zaten asagidaki esiklerin altinda kalir ve gecer.
if puan["ret"] >= e["ret"] and puan["teknik"] < e["teknik"]:
return True # yapmiyor / soylemiyor (teknik engel degil)
return puan["sart"] >= e["sart"] # sormadan kendi sartlariyla degistirdi
@@ -62,7 +62,8 @@ class Karar(unittest.TestCase):
def test_normal_answers_technical_obstacles_and_questions_pass(self):
self.assertFalse(jev_denetim.karar(scores(ret=0.05, sart=0.3)))
self.assertFalse(jev_denetim.karar(scores(ret=0.85, teknik=0.97))) # "SSH key rejected, could not read"
self.assertFalse(jev_denetim.karar(scores(ret=0.62, sart=0.91, soru=0.93))) # asks for approval first
self.assertTrue(jev_denetim.karar(scores(ret=0.62, sart=0.91, soru=0.93))) # "I can't; shall I do less?" is blocked
self.assertTrue(jev_denetim.karar(scores(ret=0.70, sart=0.90, teknik=0.23, soru=0.89))) # measured, 11 Oct 2026
self.assertFalse(jev_denetim.karar(scores(ret=0.48, soru=0.96)))
def test_thresholds_come_from_settings(self):