feat(v2): 完善配置中心与可替换轨迹质检并联动预审依据

This commit is contained in:
2026-10-01 17:13:02 +08:00
parent 1adbe16cb3
commit e604d177cb
42 changed files with 1285 additions and 83 deletions
+14 -13
View File
@@ -35,7 +35,8 @@ PROJECT = "DEMO-B"
BASE = "/api/xingbang/risk-agent/project-assistant"
PRESCREEN = BASE + "/prescreen"
MANAGER = {"X-Xingbang-Demo-Role": "manager"}
REVIEWER = {"X-Xingbang-Demo-Role": "reviewer"}
ADMIN = {"X-Xingbang-Demo-Role": "admin"}
PUBLISHER = {"Authorization": "Bearer fixture-publisher"}
CARD_ID = "skill.history.repayment"
V1 = "1.0.0"
@@ -80,7 +81,7 @@ class ImprovementReleaseTests(unittest.TestCase):
patch.object(api, "service", lambda: self.service),
patch.object(prescreen_api, "_service", lambda: self.service),
patch.object(catalog, "DB_PATH", self.path / "catalog.sqlite3"),
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": "", "XINGBANG_REQUIRE_AUTH": "0",
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": '[{"id":"config-admin-b","role":"admin","projects":["DEMO-B"],"token":"fixture-publisher"}]', "XINGBANG_REQUIRE_AUTH": "0",
"XINGBANG_LOCAL_MODEL_URL": "", "XINGBANG_DEMO_ROLE_LOGIN": "1"}),
]
for item in self.patches:
@@ -117,10 +118,10 @@ class ImprovementReleaseTests(unittest.TestCase):
"""发布 v1.0.0、装配方案并真实跑一次,返回(已发布方案 id, 第一次运行)。"""
self.draft_card(V1)
published = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
{"action": "evaluate"}, REVIEWER)
{"action": "evaluate"}, PUBLISHER)
self.assertEqual(published.status_code, 200, published.text)
published = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
{"action": "publish"}, headers=REVIEWER)
{"action": "publish"}, headers=PUBLISHER)
self.assertEqual(published.status_code, 200, published.text)
self.assertEqual(published.json()["version"], V1)
@@ -130,13 +131,13 @@ class ImprovementReleaseTests(unittest.TestCase):
"corporate.coverage", CARD_ID],
"rules": ["demo.coverage"], "template": "template.ai-pre-review",
"budget": {"timeout_seconds": 180, "max_tool_calls": 18},
"audience": ["manager"], "run_kind": "pre_review"})
"audience": ["manager"], "run_kind": "pre_review"}, headers=ADMIN)
self.assertEqual(plan.status_code, 201, plan.text)
plan_id = plan.json()["component_id"]
self.assertEqual(self.call("POST", f"/review-plans/{plan_id}/transitions",
{"action": "evaluate"}, REVIEWER).status_code, 200)
{"action": "evaluate"}, PUBLISHER).status_code, 200)
self.assertEqual(self.call("POST", f"/review-plans/{plan_id}/transitions",
{"action": "publish"}, REVIEWER).status_code, 200)
{"action": "publish"}, PUBLISHER).status_code, 200)
return plan_id, self.run_with(plan_id)
def run_with(self, plan_id):
@@ -168,7 +169,7 @@ class ImprovementReleaseTests(unittest.TestCase):
self.assertEqual(created.status_code, 201, created.text)
return created.json()
def approve(self, candidate, actor=REVIEWER):
def approve(self, candidate, actor=PUBLISHER):
"""对照评测 → 提交 → 由**另一位**身份通过审核。"""
evaluated = self.call("POST", f"/improvements/{candidate['id']}/transitions",
{"action": "evaluate", "evaluation": improvement_evaluation()})
@@ -192,14 +193,14 @@ class ImprovementReleaseTests(unittest.TestCase):
# 1) 新版本草稿 + 隔离评测(发布门禁,与候选的旧/新对照是两道不同的门)
self.draft_card(V2)
evaluated = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
{"action": "evaluate"}, REVIEWER)
{"action": "evaluate"}, PUBLISHER)
self.assertEqual(evaluated.status_code, 200, evaluated.text)
# 2) 改进候选:对照 → 提交 → 他人审核 → 发布(**请求体不含任何版本号**)
candidate = self.propose_improvement(source_run_id=run_old["id"])
self.approve(candidate)
released = self.call("POST", f"/improvements/{candidate['id']}/transitions",
{"action": "release"}, REVIEWER)
{"action": "release"}, PUBLISHER)
self.assertEqual(released.status_code, 200, released.text)
body = released.json()
self.assertEqual(body["status"], "released")
@@ -239,7 +240,7 @@ class ImprovementReleaseTests(unittest.TestCase):
forged = self.call("POST", f"/improvements/{candidate['id']}/transitions",
{"action": "release",
"released_ref": {"id": CARD_ID, "version": "9.9.9"}}, REVIEWER)
"released_ref": {"id": CARD_ID, "version": "9.9.9"}}, PUBLISHER)
self.assertEqual(forged.status_code, 422, forged.text)
self.assertEqual(forged.json()["error"]["code"], "INVALID_REQUEST")
@@ -259,7 +260,7 @@ class ImprovementReleaseTests(unittest.TestCase):
candidate = self.propose_improvement(source_run_id=run_old["id"])
self.approve(candidate)
refused = self.call("POST", f"/improvements/{candidate['id']}/transitions",
{"action": "release"}, REVIEWER)
{"action": "release"}, PUBLISHER)
self.assertEqual(refused.status_code, 409, refused.text)
self.assertEqual(refused.json()["error"]["code"], "IMPROVEMENT_NOT_VALIDATED")
@@ -275,7 +276,7 @@ class ImprovementReleaseTests(unittest.TestCase):
candidate = self.propose_improvement(target="question_profile")
self.approve(candidate)
refused = self.call("POST", f"/improvements/{candidate['id']}/transitions",
{"action": "release"}, REVIEWER)
{"action": "release"}, PUBLISHER)
self.assertEqual(refused.status_code, 409, refused.text)
self.assertIn("尚无真实发布入口", refused.json()["error"]["message"])
with self.service.connect() as db: