feat: add official Codex skill and harden task execution

Install and update artemis-use with task diagnostics and plugin guidance. Preserve cross-device file receipts, review canonical reports, guard stage transitions and reduce small history summaries. Improve exploration lifecycle, request recovery and browser live connections.
This commit is contained in:
chenmingxuan committed 2026-10-18 14:18:37 +08:00
1 parent 2328a4df0c
commit e1ea099592
128 files changed
+4944 -700

No files matched your search

+44
View File
@@ -82,6 +82,50 @@ async def test_generation_is_idempotent_and_preserves_rerun_independence(synthes
model.with_structured_output.return_value.ainvoke.assert_awaited_once()
@pytest.mark.asyncio
async def test_synthesis_repairs_unbound_parameters_once_with_original_evidence(synthesis):
repository, session, run, model = synthesis
invoke = model.with_structured_output.return_value.ainvoke
invoke.side_effect = [
CaseDraft(name="错误草稿", goal="访问 ${首页URL}", preconditions="已指定 ${报告位置}"),
CaseDraft(name="修订", goal="核对设置,报告保存在本次任务 trace。", evidence=["步骤3"]),
]
result = await generate_case(
repository, session["id"], "generate", run["id"], 0, ctx=SimpleNamespace(task_control=None)
)
assert result["version"] == 1 and "${" not in result["goal"]
assert invoke.await_count == 2
messages = invoke.await_args.args[0]
assert "不生成 ${名称}" in messages[0].content
assert "用户明确指定的位置必须保留" in messages[0].content
assert "不要让一次复跑递归地产生下一份复跑用例" in messages[0].content
assert "保留该业务验收" in messages[0].content
assert "设置开启" in messages[1].content
assert "不得猜测未知业务输入或降低验收标准" in messages[-1].content
@pytest.mark.asyncio
async def test_failed_parameter_repair_never_saves_unexecutable_generated_case(synthesis):
repository, session, run, model = synthesis
repository.save_case(session["id"], CaseDraft(name="原用例", goal="核对设置"), 0, "save")
invoke = model.with_structured_output.return_value.ainvoke
invoke.return_value = CaseDraft(name="错误", goal="保存到 ${报告位置}")
with pytest.raises(ValueError, match="未填写参数"):
await generate_case(
repository,
session["id"],
"generate",
run["id"],
1,
ctx=SimpleNamespace(task_control=None),
)
assert invoke.await_count == 2
assert repository.case(session["id"])["version"] == 1
assert repository.case(session["id"])["name"] == "原用例"
assert repository.database.records("exploration_generation")[0]["status"] == "failed"
assert repository.run(run["id"])["outcome"]["test_result"]["status"] == "passed"
@pytest.mark.asyncio
async def test_model_generation_cannot_overwrite_a_concurrent_manual_revision(synthesis):
repository, session, run, model = synthesis