框架: 升格再修2处(越合同key裁剪留审计/前缀正则收编模型自造变体)

This commit is contained in:
zizi 2026-07-15 13:53:15 +08:00
parent b5b269f97b
commit d615af31c6

View File

@ -245,11 +245,12 @@ WIN_PREFIX_RE = None # 延迟编译(模块顶部 import re 已有)
def _strip_prefix(s):
"""剥条目行首的 [窗N]/[本窗] 前缀(可能多重堆叠),返回纯内容。"""
"""剥条目行首的窗号类前缀(可能多重堆叠;含模型自造的 [窗本窗] 等变体),返回纯内容。"""
import re as _re
global WIN_PREFIX_RE
if WIN_PREFIX_RE is None:
WIN_PREFIX_RE = _re.compile(r"^(?:\[窗\d+\]\s*|\[本窗\]\s*)+")
# [窗…]/[本窗…] 任意变体全剥窗29实测模型自造 "[窗本窗]",仅数字版剥不掉)
WIN_PREFIX_RE = _re.compile(r"^(?:\[[窗本][^\]]{0,6}\]\s*)+")
return WIN_PREFIX_RE.sub("", str(s)).strip()
@ -263,9 +264,11 @@ def _clean_alias(al):
return al
def merge_card(conn, draft_id, win_no, changes, alias_new):
def merge_card(conn, draft_id, win_no, changes, alias_new, valid_keys=None):
"""按 5.1 三类规则合并变更字段:数组/白名单=追加(剥模型自带前缀+同文去重后带窗号),
标量=覆写留审计增量式假全量拦截转追加抽检#4 信息回退病)。"""
标量=覆写留审计增量式假全量拦截转追加抽检#4 信息回退病)。
valid_keys该型合同的合法字段 key 越合同 key 裁剪留审计窗29实测模型把
整段条目文本误当字段 key 写入无校验会把卡体字段区打烂"""
payload = conn.execute("SELECT draft_payload FROM muse_knowledge_draft WHERE id=%s",
(draft_id,)).fetchone()[0]
fields = payload.setdefault("字段", {})
@ -274,6 +277,15 @@ def merge_card(conn, draft_id, win_no, changes, alias_new):
alias_new = list(alias_new or []) + \
[a for a in (changes.pop("别名新增", None) or []) if isinstance(a, str)]
for k, v in changes.items():
if valid_keys is not None and k not in valid_keys:
# 越合同字段:裁剪留审计(方案守卫条款),畸形长 key条目误当 key一并挡下
conn.execute(
"""INSERT INTO example_upgrade_audit
(draft_id, window_no, field_name, old_value, new_value, tenant_id)
VALUES (%s,%s,%s,NULL,%s,%s)""",
(draft_id, win_no, ("越合同:" + str(k))[:100],
json.dumps(v, ensure_ascii=False)[:2000], TENANT))
continue
is_append = k in APPEND_FIELDS or isinstance(v, list) or isinstance(fields.get(k), list)
# 覆写值以增量口吻开头=模型把增量当全量(抽检#4新值会抹掉旧基线转追加不覆写
if not is_append and isinstance(v, str) and \
@ -542,10 +554,14 @@ def run(work_id, max_windows, max_calls, model, redo_window):
cards.append((did, p, obs_pts))
upd, _ = call(update_prompt(contracts, title, a, b, text, cards), ("更新",))
valid = {d for d, _, _ in cards}
# 每卡按其型的合同 key 集校验(+一句话摘要),越合同 key 裁剪留审计
did2keys = {d: {f["key"] for f in contracts.get(p.get("type"), {}).get("字段", [])}
| {"一句话摘要"} for d, p, _ in cards}
for u in [x for x in (upd.get("更新") or []) if isinstance(x, dict)]:
if u.get("draft_id") in valid and (u.get("变更字段") or u.get("别名新增")):
merge_card(conn, u["draft_id"], win_no,
u.get("变更字段"), u.get("别名新增"))
u.get("变更字段"), u.get("别名新增"),
valid_keys=did2keys.get(u["draft_id"]))
# ⑤ 关系增量(核心角色=本窗有更新的 character + 在场 character≤8
char_cards = []
seen = set()