test(contract): 0007 确认后关掉那三条 xfail
解释器不许抛异常是接缝自己的行为,改成正面断言(等实现接进来才跑)。另两条的答案 落在库这一侧不在接缝上:动作状态的触发条件是执行器自己的判断,套件面对任意实现逼 不出后两档,硬探会把 dissect 那种状态恒为 EXECUTED 的合法实现判成不合格;观察由谁 合成同理。两条留成不断言的说明,指向 tests/unit/test_session.py 里真正验它们的地方。 273 passed / 15 skipped / 4 xfailed。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,13 +3,15 @@
|
||||
两个已知形态:一个从代码围栏里抽 Python 源码,一个从 JSON 里抽工具名与参数。库不带任何
|
||||
默认实现——带了就等于替某一家定了动作语言。
|
||||
|
||||
## 写这份文件时撞出来的、`design/0006` 还答不上的问题
|
||||
## 写这份文件时撞出来的那个问题,`design/0007` 决策三答了
|
||||
|
||||
模型输出完全无法解释时,解释器是返回「无效决策」还是抛异常。
|
||||
模型输出完全无法解释时,解释器返回「无效决策」,不抛异常。下面最后一条断言它。
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from polyloop.ports import InvalidDecision
|
||||
|
||||
pytestmark = pytest.mark.contract
|
||||
|
||||
|
||||
@@ -67,15 +69,16 @@ def test_action_carries_its_trace_form(decision_parser, samples):
|
||||
assert isinstance(parsed.decision.text, str)
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="design/0006 答不上,见 docstring", strict=True)
|
||||
def test_unparseable_output_returns_invalid_decision_rather_than_raising():
|
||||
"""模型输出完全无法解释时,解释器返回「无效决策」还是抛异常。
|
||||
def test_unparseable_output_returns_invalid_decision_rather_than_raising(decision_parser, samples):
|
||||
"""模型输出完全无法解释时返回「无效决策」,不抛异常(`design/0007` 决策三)。
|
||||
|
||||
`design/0006` 定了三个分支——动作、最终回答、无效决策——但没说「解释器可以抛异常吗」。
|
||||
两条路后果完全不同:返回无效决策,那一步照常留痕、说明文本回喂给模型、循环继续;抛
|
||||
异常,库要么把它翻译成某个停止原因终止整次运行,要么让它穿出去炸掉调用方。
|
||||
|
||||
dissect 的解析器不抛异常,所以它撞不到这个分歧。但契约测试是**任何新适配器的准入
|
||||
标准**,一个会抛异常的实现照现在的契约既不算违规也不算合规。
|
||||
标准**,所以这条要正面断言,不能靠「反正没人这么写」。
|
||||
"""
|
||||
pytest.fail("解释器能不能抛异常、抛了怎么办,没有定义")
|
||||
parsed = decision_parser.parse(samples.yields_invalid)
|
||||
|
||||
assert isinstance(parsed.decision, InvalidDecision)
|
||||
assert parsed.decision.explanation != ""
|
||||
|
||||
Reference in New Issue
Block a user