Files
yao-meta-skill/scripts/skill_report_sections.py
T
YAO 31ce04c655 Split meta skill CLI and review gates
Merge the beta-ready Yao Meta Skill architecture, report, evidence gate, and release-boundary updates.\n\nRelease boundary: beta/public testing is allowed; formal world-class, fully reviewed, or superiority claims remain blocked until the pending evidence gates are accepted.
2026-06-17 18:43:02 +08:00

115 lines
4.6 KiB
Python

SCRIPT_INTERFACE = "internal-module"
SCRIPT_INTERFACE_REASON = "Imported by skill_report_model.py to assemble overview report quality, risk, and asset sections."
def artifact_design_highlights(profile: dict) -> list[str]:
primary = profile.get("primary_artifact", {})
highlights = []
if primary.get("direction"):
highlights.append(primary["direction"])
highlights.extend(profile.get("quality_gates", [])[:3])
return highlights[:4]
def prompt_quality_highlights(profile: dict) -> list[str]:
highlights = []
primary = profile.get("primary_task_family", {})
complexity = profile.get("complexity", {})
if primary.get("label"):
highlights.append(f"Primary prompt task family: {primary['label']}.")
if complexity.get("band"):
highlights.append(f"Complexity: {complexity['band']}{complexity.get('reason', '')}")
for item in profile.get("quality_matrix", [])[:2]:
highlights.append(f"{item.get('label', 'Quality')}: {item.get('score', 'n/a')}/100.")
return highlights[:4]
def system_model_highlights(model: dict) -> list[str]:
highlights = []
stability = model.get("stability", {})
if stability:
highlights.append(f"Stability: {stability.get('band', 'unknown')} ({stability.get('score', 'n/a')}/100).")
boundary = model.get("boundary_map", {})
if boundary.get("owned_job"):
highlights.append(f"Owned job: {boundary['owned_job']}")
for point in model.get("leverage_points", [])[:2]:
if point.get("point"):
highlights.append(f"Leverage: {point['point']}{point.get('move', '')}")
return highlights[:4]
def risk_governance(output_risk: dict, system_model: dict, scorecard: dict) -> dict:
risk_names = [
("误触发风险", "trigger_score"),
("输出漂移风险", "evidence_score"),
("证据不足风险", "evidence_score"),
("包体膨胀风险", "maintainability_score"),
("跨平台迁移风险", "portability_score"),
]
risks = []
for index, (name, metric_key) in enumerate(risk_names):
score = scorecard.get(metric_key, {}).get("score", 50)
probability = max(1, min(3, 4 - round(score / 34)))
impact = 3 if index in {0, 2, 4} else 2
risks.append(
{
"name": name,
"impact": impact,
"probability": probability,
"signal": scorecard.get(metric_key, {}).get("reasons", ["证据不足"])[0],
"response": "先补证据和边界,再增加包体复杂度。",
}
)
human_boundary = system_model.get("boundary_map", {}).get("human_judgment_boundary", [])
return {
"risks": risks,
"risk_families": output_risk.get("risk_families", []),
"human_judgment_boundary": human_boundary,
}
def quality_review(
strengths: list[str],
scorecard: dict,
artifact_design: dict,
prompt_quality: dict,
system_model: dict,
) -> dict:
gaps = []
for key, payload in scorecard.items():
if payload.get("score", 0) < 70:
gaps.append(f"{payload.get('label', key)}需要补强:{payload.get('reasons', ['证据不足'])[0]}")
return {
"strengths": strengths,
"gaps": gaps or ["当前关键证据较完整,优先保持轻量。"],
"recommendations": [
"先改触发边界,再扩展工作流。",
"只把重复且稳定的步骤沉淀为脚本。",
"每次升级后重新生成报告并检查分数原因。",
],
"artifact_design": {
"design_system": artifact_design.get("design_system", "content-led editorial"),
"highlights": artifact_design_highlights(artifact_design),
},
"prompt_quality": {
"overall_quality_score": prompt_quality.get("overall_quality_score", "n/a"),
"highlights": prompt_quality_highlights(prompt_quality),
},
"system_model": {
"stability": system_model.get("stability", {}),
"highlights": system_model_highlights(system_model),
},
}
def package_assets(package_map: list[dict]) -> dict:
files = sum(item.get("file_count", 0) for item in package_map if item.get("kind") == "file")
folders = [item for item in package_map if item.get("kind") == "folder"]
distribution = [{"label": item["path"], "value": max(1, item.get("file_count", 1))} for item in package_map]
return {
"entries": package_map,
"file_count": files + sum(item.get("file_count", 0) for item in folders),
"folder_count": len(folders),
"distribution": distribution,
}