From f9a39e0292379ce8282a96c1f961665073949af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 28 Jun 2026 10:09:33 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20UNRESOLVED=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=8B=D1=85=20target=5Fhash/name=20+=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B8=D0=B7=D0=B2=D0=B5=D1=81=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/db/spec_events.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/deploy/db/spec_events.py b/deploy/db/spec_events.py index e99d052..ee2f794 100644 --- a/deploy/db/spec_events.py +++ b/deploy/db/spec_events.py @@ -45,6 +45,11 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r if action == "ADD": nr = op.get("new_row", {}) name = nr.get("name", "") + if not name: + # ADD without name → UNRESOLVED + _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "ADD with empty name") + seq += 1 + continue name_hash = _hash(name, nr.get("date_start")) execute( """INSERT INTO spec_events (contract_id, supplement_id, seq, action, target_hash, @@ -64,6 +69,10 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r elif action == "UPDATE": nv = op.get("new_values", {}) th = op.get("target_hash", "") + if not th: + _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "UPDATE with empty target_hash") + seq += 1 + continue execute( """INSERT INTO spec_events (contract_id, supplement_id, seq, action, target_hash, new_values, comment, status, prompt_version, source_document_id, raw_llm_response) @@ -81,6 +90,10 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r elif action == "DELETE": th = op.get("target_hash", "") + if not th: + _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, "DELETE with empty target_hash") + seq += 1 + continue execute( """INSERT INTO spec_events (contract_id, supplement_id, seq, action, target_hash, new_values, comment, status, prompt_version, source_document_id, raw_llm_response) @@ -113,9 +126,31 @@ def apply_ops(contract_id, supplement_id, document_id, ops, prompt_id, raw_llm_r ) seq += 1 + else: + # Unknown action — log as UNRESOLVED + _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, + f"unknown action: {action}") + return {"added": added, "updated": updated, "deleted": deleted} +def _log_unresolved(contract_id, supplement_id, seq, op, prompt_id, document_id, raw_llm_response, reason): + """Log an op as UNRESOLVED instead of silently ignoring it.""" + execute( + """INSERT INTO spec_events (contract_id, supplement_id, seq, action, target_hash, + new_values, comment, status, prompt_version, source_document_id, raw_llm_response) + VALUES (%s, %s, %s, 'UNRESOLVED', %s, %s, %s, 'unresolved', %s, %s, %s)""", + ( + contract_id, supplement_id, seq, + op.get("target_hash", ""), + json.dumps(op.get("new_values", op.get("new_row", {})) or {}, ensure_ascii=False), + reason, + prompt_id, document_id, + json.dumps(raw_llm_response, ensure_ascii=False), + ), + ) + + def _hash(name, date_start=None): """Нормализованный хеш услуги. Включает date_start чтобы различать периоды.""" import hashlib