fix: lock all-INFRA contract, idempotency tests, tuple units (algo #6)

This commit is contained in:
2026-07-17 00:00:56 -04:00
parent 21c360bc87
commit 1e92928d4e
2 changed files with 53 additions and 4 deletions
+43 -1
View File
@@ -33,7 +33,7 @@ def _mk_run(n_units: int) -> _GateRun:
target_file="action-reasoning.md",
candidate_content="cand",
base_skill_content="base",
units=[_mk_unit(f"q{i}") for i in range(n_units)],
units=tuple(_mk_unit(f"q{i}") for i in range(n_units)),
gate_run_prefix="r_e1_s0_gate_action-reasoning",
)
return _GateRun.from_spec(spec)
@@ -119,6 +119,48 @@ def test_infra_unit_skipped_not_counted() -> None:
assert run.verdict is not None and run.verdict.decision == "accept_provisional"
def test_all_infra_leaves_verdict_none() -> None:
"""全部单元被剔除:verdict 保持 None、frozen 保持 False——终态由调度编排层
(Task 3 的 validate_skills_concurrent)检测 verdict None 并 raise,本函数不管。"""
run = _mk_run(3)
for i in range(3):
run.slots[i].base_infra = True
run.slots[i].cand_per_q = {f"q{i}": True}
_advance_prefix(run, _PARAMS)
assert run.verdict is None and not run.frozen and run.n_excluded == 3 and run.prefix_ptr == 3
def test_repeated_calls_are_idempotent() -> None:
"""部分前缀消费后重复调用不改变状态;补齐剩余单元后再调用正常推进。"""
run = _mk_run(4)
for i in (0, 1):
run.slots[i].base = False
run.slots[i].cand_per_q = {f"q{i}": True}
_advance_prefix(run, _PARAMS)
snapshot = (run.n_used, run.w, run.l, run.prefix_ptr, len(run.evidence_rows))
_advance_prefix(run, _PARAMS)
_advance_prefix(run, _PARAMS)
assert (run.n_used, run.w, run.l, run.prefix_ptr, len(run.evidence_rows)) == snapshot
for i in (2, 3):
run.slots[i].base = False
run.slots[i].cand_per_q = {f"q{i}": True}
_advance_prefix(run, _PARAMS)
assert run.n_used > snapshot[0] and run.prefix_ptr > snapshot[3]
def test_frozen_run_call_is_noop() -> None:
"""frozen 后再调用是 no-op:不再消费已配齐单元、证据不再追加。"""
run = _mk_run(12)
for i in range(12):
run.slots[i].base = False
run.slots[i].cand_per_q = {f"q{i}": True}
_advance_prefix(run, _PARAMS)
assert run.frozen and run.n_used == 7
n_evidence = len(run.evidence_rows)
_advance_prefix(run, _PARAMS)
assert run.n_used == 7 and len(run.evidence_rows) == n_evidence
def test_ties_hit_futility_early_and_freeze() -> None:
"""全打平(无翻转对)时 futility 出口尽早触发并冻结——早停语义(数值:W=L=0
时乐观 E = E(n_remaining, 0),n 小易 <e_provisional=3)。"""