feat(codex-bridge): make the step check strict, keep third-party-attack refusals refused
User, 11 Oct 2026: 'Jev geçmek zor olsun.' Lower thresholds (ret 0.5, sart 0.7) and only let a refusal pass on a genuinely high technical obstacle, so a fake technical excuse no longer passes. One carve-out stated to the user first: when the request is to hack, intrude on or surveil a third party's device or account or to build malware, a refusal is NOT routed to the uncensored fallback; the refusal stands. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
27964e37b0
commit
1f4f2de428
2 files changed
+33
-18
No files matched your search
@@ -29,7 +29,10 @@ import urllib.request
|
|||||||
ADRES = "https://api.typesafe.ai/v1/systemone"
|
ADRES = "https://api.typesafe.ai/v1/systemone"
|
||||||
MODEL = "jev-1.13.0"
|
MODEL = "jev-1.13.0"
|
||||||
HEDEF = "ide/Uncensored-Uygulama"
|
HEDEF = "ide/Uncensored-Uygulama"
|
||||||
ESIK = {"ret": 0.7, "sart": 0.9, "teknik": 0.5, "soru": 0.5}
|
# Kullanici karari (11 Ekim 2026): "Jev gecmek zor olsun." Esikler dusuruldu; bir ret ancak GERCEKTEN yuksek teknik
|
||||||
|
# engel (teknik_muaf) ile gecer, sahte teknik bahane artik yakalanir. Tek istisna zarar: ucuncu kisinin cihazina/
|
||||||
|
# hesabina izinsiz girme ya da malware/saldiri araci uretme istegi; orada model reddederse ret DURUR, yedege gitmez.
|
||||||
|
ESIK = {"ret": 0.5, "sart": 0.7, "teknik_muaf": 0.85, "soru": 0.5, "zarar": 0.6}
|
||||||
SURE = 6.0
|
SURE = 6.0
|
||||||
EN_COK_ISTEK = 3000
|
EN_COK_ISTEK = 3000
|
||||||
EN_COK_CEVAP = 6000
|
EN_COK_CEVAP = 6000
|
||||||
@@ -44,6 +47,8 @@ SORU = {
|
|||||||
"a missing file, tool, permission, connection or piece of information."),
|
"a missing file, tool, permission, connection or piece of information."),
|
||||||
"soru": ("The assistant's reply is mainly a question to the user: it asks for a clarification, a choice or an "
|
"soru": ("The assistant's reply is mainly a question to the user: it asks for a clarification, a choice or an "
|
||||||
"approval and waits for the user's answer before doing anything."),
|
"approval and waits for the user's answer before doing anything."),
|
||||||
|
"zarar": ("The user's request is to hack, intrude on, surveil or take control of a device, account, network or "
|
||||||
|
"system that is not the user's own, or to create malware or attack tooling against other people."),
|
||||||
}
|
}
|
||||||
_KILIT = threading.Lock()
|
_KILIT = threading.Lock()
|
||||||
_DEVRE = {"hata": 0, "kadar": 0.0}
|
_DEVRE = {"hata": 0, "kadar": 0.0}
|
||||||
@@ -139,14 +144,16 @@ def sor(istek, cevap, key, sure=SURE, gonder=_gonder, simdi=None):
|
|||||||
|
|
||||||
|
|
||||||
def karar(puan, ayar=None):
|
def karar(puan, ayar=None):
|
||||||
"""True: adim gecmez (yedek model yapar). Esikler ayardan degistirilebilir."""
|
"""True: adim gecmez (yedek model yapar). Esikler ayardan degistirilebilir.
|
||||||
|
Kullanici karari (11 Ekim 2026): "Jev gecmek zor olsun." Ret ya da sart iceren cevap, sonunda soru sorsa bile
|
||||||
|
gecmez; yalniz gercekten yuksek teknik engel ("SSH reddedildi") ya da ret icermeyen netlestirme sorusu gecer.
|
||||||
|
Istisna: istek ucuncu kisiye saldiri/malware ise (zarar) ret DURUR, yedege gitmez."""
|
||||||
e = dict(ESIK)
|
e = dict(ESIK)
|
||||||
e.update({k: float(v) for k, v in (ayar or {}).items() if k in ESIK})
|
e.update({k: float(v) for k, v in (ayar or {}).items() if k in ESIK})
|
||||||
# Soru bicimi istisna degildir (kullanici, 11 Ekim 2026: model "yazamam, soyle yapayim mi?" deyince "Jev bunu
|
if puan.get("zarar", 0.0) >= e["zarar"] and puan["ret"] >= e["ret"]:
|
||||||
# gecirdi mi?" diye sordu): ret ya da sart iceren cevap sonunda soru sorsa da gecmez. Ret icermeyen gercek
|
return False # ucuncu kisiye zarar istegi reddedildi: ret durur, yedek yapmaz
|
||||||
# netlestirme sorusu ("hangi alan adina?") zaten asagidaki esiklerin altinda kalir ve gecer.
|
if puan["ret"] >= e["ret"] and puan["teknik"] < e["teknik_muaf"]:
|
||||||
if puan["ret"] >= e["ret"] and puan["teknik"] < e["teknik"]:
|
return True # yapmiyor / soylemiyor (gercek teknik engel degil)
|
||||||
return True # yapmiyor / soylemiyor (teknik engel degil)
|
|
||||||
return puan["sart"] >= e["sart"] # sormadan kendi sartlariyla degistirdi
|
return puan["sart"] >= e["sart"] # sormadan kendi sartlariyla degistirdi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ class Yanit:
|
|||||||
return self.parts.pop(0) if self.parts else b""
|
return self.parts.pop(0) if self.parts else b""
|
||||||
|
|
||||||
|
|
||||||
def scores(ret=0.0, sart=0.0, teknik=0.0, soru=0.0):
|
def scores(ret=0.0, sart=0.0, teknik=0.0, soru=0.0, zarar=0.0):
|
||||||
return {"ret": ret, "sart": sart, "teknik": teknik, "soru": soru}
|
return {"ret": ret, "sart": sart, "teknik": teknik, "soru": soru, "zarar": zarar}
|
||||||
|
|
||||||
|
|
||||||
class Karar(unittest.TestCase):
|
class Karar(unittest.TestCase):
|
||||||
@@ -58,17 +58,25 @@ class Karar(unittest.TestCase):
|
|||||||
self.assertTrue(jev_denetim.karar(scores(ret=0.84))) # "böyle bir hüküm vermiyorum"
|
self.assertTrue(jev_denetim.karar(scores(ret=0.84))) # "böyle bir hüküm vermiyorum"
|
||||||
self.assertTrue(jev_denetim.karar(scores(ret=0.41, sart=0.95))) # did it with its own conditions
|
self.assertTrue(jev_denetim.karar(scores(ret=0.41, sart=0.95))) # did it with its own conditions
|
||||||
self.assertTrue(jev_denetim.karar(scores(ret=0.93, sart=0.72)))
|
self.assertTrue(jev_denetim.karar(scores(ret=0.93, sart=0.72)))
|
||||||
|
self.assertTrue(jev_denetim.karar(scores(ret=0.62, sart=0.91, soru=0.93))) # "I can't; shall I do less?"
|
||||||
|
self.assertTrue(jev_denetim.karar(scores(ret=0.70, sart=0.90, teknik=0.23, soru=0.89))) # measured 11 Oct 2026
|
||||||
|
self.assertTrue(jev_denetim.karar(scores(ret=0.55, teknik=0.60))) # a fake technical excuse no longer passes
|
||||||
|
|
||||||
def test_normal_answers_technical_obstacles_and_questions_pass(self):
|
def test_normal_answers_real_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.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.85, teknik=0.97))) # genuine "SSH key rejected, could not read"
|
||||||
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.assertFalse(jev_denetim.karar(scores(ret=0.48, sart=0.44, soru=0.96))) # a clarifying question without a refusal
|
||||||
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_attack_on_a_third_party_stays_refused_not_sent_to_fallback(self):
|
||||||
|
# User decision 11 Oct 2026: making Jev strict must not turn a refusal of third-party intrusion/malware into
|
||||||
|
# a request the uncensored fallback fulfils. Such a refusal passes (the refusal stands), it is not blocked.
|
||||||
|
self.assertFalse(jev_denetim.karar(scores(ret=0.94, sart=0.92, teknik=0.58, soru=0.85, zarar=0.93)))
|
||||||
|
self.assertTrue(jev_denetim.karar(scores(ret=0.94, sart=0.92, zarar=0.2))) # ordinary refusal still blocked
|
||||||
|
|
||||||
def test_thresholds_come_from_settings(self):
|
def test_thresholds_come_from_settings(self):
|
||||||
self.assertFalse(jev_denetim.karar(scores(ret=0.84), {"ret": 0.9}))
|
self.assertFalse(jev_denetim.karar(scores(ret=0.45))) # just under the default
|
||||||
self.assertTrue(jev_denetim.karar(scores(sart=0.8), {"sart": 0.75}))
|
self.assertTrue(jev_denetim.karar(scores(ret=0.45), {"ret": 0.4}))
|
||||||
|
self.assertFalse(jev_denetim.karar(scores(ret=0.9, teknik=0.9), {"teknik_muaf": 0.85}))
|
||||||
|
|
||||||
|
|
||||||
class Istek(unittest.TestCase):
|
class Istek(unittest.TestCase):
|
||||||
@@ -92,11 +100,11 @@ class Sor(unittest.TestCase):
|
|||||||
seen.update(govde=govde, key=key)
|
seen.update(govde=govde, key=key)
|
||||||
return {"answers": {k: {"type": "noul", "noul": 0.25} for k in jev_denetim.SORU}}
|
return {"answers": {k: {"type": "noul", "noul": 0.25} for k in jev_denetim.SORU}}
|
||||||
puan = jev_denetim.sor("istek", "c" * 9000, "anahtar", gonder=gonder)
|
puan = jev_denetim.sor("istek", "c" * 9000, "anahtar", gonder=gonder)
|
||||||
self.assertEqual(puan, scores(0.25, 0.25, 0.25, 0.25))
|
self.assertEqual(puan, scores(0.25, 0.25, 0.25, 0.25, 0.25))
|
||||||
self.assertEqual(seen["key"], "anahtar")
|
self.assertEqual(seen["key"], "anahtar")
|
||||||
self.assertEqual(seen["govde"]["state"]["user_request"], "istek")
|
self.assertEqual(seen["govde"]["state"]["user_request"], "istek")
|
||||||
self.assertLess(len(seen["govde"]["state"]["assistant_reply"]), 6100) # long answers are cut
|
self.assertLess(len(seen["govde"]["state"]["assistant_reply"]), 6100) # long answers are cut
|
||||||
self.assertEqual(set(seen["govde"]["questions"]), {"ret", "sart", "teknik", "soru"})
|
self.assertEqual(set(seen["govde"]["questions"]), {"ret", "sart", "teknik", "soru", "zarar"})
|
||||||
|
|
||||||
def test_failures_pass_the_answer_and_open_the_breaker(self):
|
def test_failures_pass_the_answer_and_open_the_breaker(self):
|
||||||
calls = []
|
calls = []
|
||||||
|
|||||||
Reference in new issue
Block a user