Audit batch 5: I-9, I-12, I-14, N-1..N-12, single-task wire single-transaction
This commit is contained in:
1 parent
cdac8039b3
commit
2adc605373
7 files changed
+1349
-440
No files matched your search
+39
-38
@@ -224,6 +224,28 @@ def _validate_gate_results(gate_results):
|
||||
raise ValueError("gate_results must map gate name to bool")
|
||||
|
||||
|
||||
def _escalate(task_id, prev_round, passed_gates, criteria, reason,
|
||||
regression=(), missing_gates=(), weakened=()):
|
||||
"""升级决策 dict(审计批 5,N-8:纯结构整理,行为不变)。
|
||||
|
||||
evaluate() 内四处 escalate 返回原来各写一遍同样的 dict
|
||||
骨架(new_state + decision/round/packet/reason + 三个清单),
|
||||
只有 passed_gates / criteria / reason / 清单内容不同;抽成
|
||||
助手后各处只传不同项。new_state 的 round 恒为 prev_round
|
||||
(升级不推进轮次)、last_decision 恒为 escalate。
|
||||
"""
|
||||
new_state = LoopState(
|
||||
task_id, round=prev_round, passed_gates=sorted(passed_gates),
|
||||
criteria=criteria, last_decision="escalate")
|
||||
return {
|
||||
"decision": "escalate", "round": prev_round, "packet": None,
|
||||
"new_state": new_state, "reason": reason,
|
||||
"regression": list(regression),
|
||||
"missing_gates": list(missing_gates),
|
||||
"weakened": list(weakened),
|
||||
}
|
||||
|
||||
|
||||
def evaluate(state, task_id, gate_results, findings=None, fixed=None):
|
||||
"""纯函数:一轮审计的决策。
|
||||
|
||||
@@ -269,17 +291,10 @@ def evaluate(state, task_id, gate_results, findings=None, fixed=None):
|
||||
# 全量回归:上一轮通过的门本轮必须重跑,缺跑即升级。
|
||||
missing_gates = sorted(g for g in prev_passed if g not in gate_results)
|
||||
if missing_gates:
|
||||
new_state = LoopState(
|
||||
task_id, round=prev_round,
|
||||
passed_gates=sorted(
|
||||
g for g, v in gate_results.items() if v),
|
||||
criteria=prev_criteria, last_decision="escalate")
|
||||
return {
|
||||
"decision": "escalate", "round": prev_round, "packet": None,
|
||||
"new_state": new_state, "reason": "gate_missing",
|
||||
"regression": [], "missing_gates": missing_gates,
|
||||
"weakened": [],
|
||||
}
|
||||
return _escalate(
|
||||
task_id, prev_round,
|
||||
(g for g, v in gate_results.items() if v),
|
||||
prev_criteria, "gate_missing", missing_gates=missing_gates)
|
||||
|
||||
passed_now = {g for g, v in gate_results.items() if v}
|
||||
failed_now = {g for g, v in gate_results.items() if not v}
|
||||
@@ -310,15 +325,11 @@ def evaluate(state, task_id, gate_results, findings=None, fixed=None):
|
||||
else:
|
||||
weakened.append(fid)
|
||||
if weakened:
|
||||
new_state = LoopState(
|
||||
task_id, round=prev_round, passed_gates=sorted(passed_now),
|
||||
criteria=prev_criteria, last_decision="escalate")
|
||||
return {
|
||||
"decision": "escalate", "round": prev_round, "packet": None,
|
||||
"new_state": new_state, "reason": "standards_weakened",
|
||||
"regression": [f.to_dict() for f in regression],
|
||||
"missing_gates": [], "weakened": sorted(weakened),
|
||||
}
|
||||
return _escalate(
|
||||
task_id, prev_round, passed_now, prev_criteria,
|
||||
"standards_weakened",
|
||||
regression=[f.to_dict() for f in regression],
|
||||
weakened=sorted(weakened))
|
||||
|
||||
# 新标准 = 未解决的旧标准 + 本轮新 finding(含回归)。
|
||||
for finding in all_findings:
|
||||
@@ -348,26 +359,16 @@ def evaluate(state, task_id, gate_results, findings=None, fixed=None):
|
||||
# 转 escalate),新行为后看到的是 gate_failed_without_
|
||||
# finding 升级——原因更精确,不是行为倒退。
|
||||
if failed_now and not all_findings:
|
||||
new_state = LoopState(
|
||||
task_id, round=prev_round, passed_gates=sorted(passed_now),
|
||||
criteria=new_criteria, last_decision="escalate")
|
||||
return {
|
||||
"decision": "escalate", "round": prev_round, "packet": None,
|
||||
"new_state": new_state, "reason": "gate_failed_without_finding",
|
||||
"regression": [f.to_dict() for f in regression],
|
||||
"missing_gates": [], "weakened": [],
|
||||
}
|
||||
return _escalate(
|
||||
task_id, prev_round, passed_now, new_criteria,
|
||||
"gate_failed_without_finding",
|
||||
regression=[f.to_dict() for f in regression])
|
||||
|
||||
if prev_round >= MAX_PUSHBACKS:
|
||||
new_state = LoopState(
|
||||
task_id, round=prev_round, passed_gates=sorted(passed_now),
|
||||
criteria=new_criteria, last_decision="escalate")
|
||||
return {
|
||||
"decision": "escalate", "round": prev_round, "packet": None,
|
||||
"new_state": new_state, "reason": "max_rounds_exceeded",
|
||||
"regression": [f.to_dict() for f in regression],
|
||||
"missing_gates": [], "weakened": [],
|
||||
}
|
||||
return _escalate(
|
||||
task_id, prev_round, passed_now, new_criteria,
|
||||
"max_rounds_exceeded",
|
||||
regression=[f.to_dict() for f in regression])
|
||||
|
||||
new_round = prev_round + 1
|
||||
packet = PushbackPacket(task_id, new_round, all_findings, new_criteria)
|
||||
|
||||
Reference in new issue
Block a user