feat: 发布通用人效与资源优化能力

增加跨行业的人效与资源优化需求澄清、模型求解与独立验收能力,并固化公共市场的信息边界与发布前检查。
This commit is contained in:
2026-08-07 23:55:01 +08:00
parent 2e15720442
commit 20b29df7a4
11 changed files with 935 additions and 6 deletions

View File

@@ -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()

View File

@@ -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: