mirror of
https://git.openapi.site/https://github.com/desirecore/market.git
synced 2026-09-05 17:43:49 +08:00
feat: 发布通用人效与资源优化能力
增加跨行业的人效与资源优化需求澄清、模型求解与独立验收能力,并固化公共市场的信息边界与发布前检查。
This commit is contained in:
@@ -48,5 +48,41 @@ class ModelInvocationPolicyTests(unittest.TestCase):
|
||||
self.assertEqual("model-invocation-policy", issues[0].rule)
|
||||
|
||||
|
||||
class BuiltinSkillManifestTests(unittest.TestCase):
|
||||
def validate(self, payload: dict[str, object], skills: list[str]) -> list[object]:
|
||||
report = VALIDATOR.Report()
|
||||
VALIDATOR.validate_builtin_manifest(report, payload, skills)
|
||||
return report.issues
|
||||
|
||||
def test_allows_disjoint_sorted_retired_ids(self) -> None:
|
||||
self.assertEqual([], self.validate(
|
||||
{"skills": ["new-skill"], "retired": ["old-skill"]},
|
||||
["new-skill"],
|
||||
))
|
||||
|
||||
def test_rejects_active_retired_overlap(self) -> None:
|
||||
issues = self.validate(
|
||||
{"skills": ["same-skill"], "retired": ["same-skill"]},
|
||||
["same-skill"],
|
||||
)
|
||||
self.assertTrue(any("overlap" in issue.message for issue in issues))
|
||||
|
||||
def test_rejects_unknown_fields_and_invalid_ids(self) -> None:
|
||||
issues = self.validate(
|
||||
{"skills": ["Invalid_ID"], "retired": [], "unknown": True},
|
||||
["Invalid_ID"],
|
||||
)
|
||||
self.assertTrue(any("unknown top-level" in issue.message for issue in issues))
|
||||
self.assertTrue(any("invalid Skill IDs" in issue.message for issue in issues))
|
||||
|
||||
def test_reports_unsorted_active_skills_once(self) -> None:
|
||||
issues = self.validate(
|
||||
{"skills": ["second-skill", "first-skill"], "retired": []},
|
||||
["first-skill", "second-skill"],
|
||||
)
|
||||
sort_issues = [issue for issue in issues if "not sorted" in issue.message]
|
||||
self.assertEqual(1, len(sort_issues))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -351,11 +351,61 @@ def count_publishable_skills() -> tuple[list[str], list[str]]:
|
||||
def validate_builtin_skills(report: Report, skill_md_names: list[str]) -> None:
|
||||
builtin_path = REPO_ROOT / "builtin-skills.json"
|
||||
builtin = load_json(builtin_path, report, "builtin-skills")
|
||||
validate_builtin_manifest(report, builtin, skill_md_names)
|
||||
|
||||
|
||||
def validate_builtin_manifest(
|
||||
report: Report,
|
||||
builtin: dict[str, Any],
|
||||
skill_md_names: list[str],
|
||||
) -> None:
|
||||
unknown = sorted(set(builtin) - {"skills", "retired"})
|
||||
if unknown:
|
||||
report.add(Issue(
|
||||
"builtin-skills.json",
|
||||
"builtin-skills",
|
||||
f"unknown top-level fields {unknown}",
|
||||
))
|
||||
|
||||
skills = builtin.get("skills")
|
||||
if not isinstance(skills, list) or not all(isinstance(x, str) for x in skills):
|
||||
report.add(Issue("builtin-skills.json", "builtin-skills", "skills must be a list of strings"))
|
||||
return
|
||||
|
||||
retired = builtin.get("retired", [])
|
||||
if not isinstance(retired, list) or not all(isinstance(x, str) for x in retired):
|
||||
report.add(Issue("builtin-skills.json", "builtin-skills", "retired must be a list of strings"))
|
||||
return
|
||||
|
||||
for field, values in (("skills", skills), ("retired", retired)):
|
||||
invalid = sorted({value for value in values if not NAME_PATTERN.fullmatch(value)})
|
||||
if invalid:
|
||||
report.add(Issue(
|
||||
"builtin-skills.json",
|
||||
"builtin-skills",
|
||||
f"{field} contains invalid Skill IDs {invalid}",
|
||||
))
|
||||
if len(values) != len(set(values)):
|
||||
report.add(Issue(
|
||||
"builtin-skills.json",
|
||||
"builtin-skills",
|
||||
f"{field} contains duplicate Skill IDs",
|
||||
))
|
||||
if field == "retired" and values != sorted(values):
|
||||
report.add(Issue(
|
||||
"builtin-skills.json",
|
||||
"builtin-skills",
|
||||
f"{field} list is not sorted",
|
||||
))
|
||||
|
||||
overlap = sorted(set(skills) & set(retired))
|
||||
if overlap:
|
||||
report.add(Issue(
|
||||
"builtin-skills.json",
|
||||
"builtin-skills",
|
||||
f"active and retired Skill IDs overlap {overlap}",
|
||||
))
|
||||
|
||||
expected = sorted(skill_md_names)
|
||||
actual = list(skills)
|
||||
if actual != expected:
|
||||
|
||||
Reference in New Issue
Block a user