Files
hermes-skills/skills/legal/contract-portfolio-analysis/scripts/output-style-check.py
T

121 lines
4.2 KiB
Python

#!/usr/bin/env python3
"""
output-style-check.py — 检查data-extractor输出的H/K/L列是否符合统一风格规范。
用法:python3 output-style-check.py <campus>-row-data.json
返回:exit 0 = 通过,exit 1 = 风格不符(列出具体问题)
This is Layer 3 of the output consistency defense (see references/output-consistency.md).
Run AFTER data extraction, BEFORE xlsx generation. If it fails, fix the specific
issues in the JSON before proceeding.
"""
import json
import sys
import re
def check_h_column(text):
"""检查H列(金额/费用)格式"""
issues = []
# 禁止bullet符号
if re.search(r'[•\-\*]\s', text):
issues.append("H列含bullet符号(•/-/*),应使用段落式叙述")
# 禁止"大类·条款号"合并标题
if re.search(r'【[^】]*·第[一二三四五六七八九十\d]+条', text):
issues.append("H列含'【大类·条款号】'合并标题,应分开写")
# 必须有【】大类标注
if '' not in text:
issues.append("H列缺少【】大类标注(如【租金】【付款推算】等)")
return issues
def check_k_column(text):
"""检查K列(法律风险)格式"""
issues = []
# 禁止统计式开头
if re.search(r'\d+项风险(\d+高', text):
issues.append("K列用统计式开头(如'10项风险(3高/5中/2低)'),应以【整体评价】开头")
# 禁止"序号·等级·条款号"标签
if re.search(r'\d+\.\s*【[高中低][中高]?·', text):
issues.append("K列用'序号·等级·条款号'标签格式(如'1.【高·第十条】'),应用叙述式")
# 禁止markdown表格
if '| #' in text or '|---|' in text:
issues.append("K列含markdown表格,应用叙述式段落")
# 必须有【整体评价】
if '【整体评价' not in text:
issues.append("K列缺少【整体评价】段落")
return issues
def check_l_column(text):
"""检查L列(模版差异)格式"""
issues = []
# 禁止统计式开头
if re.search(r'\d+处差异(\d+缺失', text):
issues.append("L列用统计式开头(如'34处差异(16缺失/15修改/3新增)'),应叙述式说明")
# 禁止分类小标题
if '【核心缺失' in text or '【核心修改' in text:
issues.append("L列用'【核心缺失/修改】'分类小标题,应使用编号列表")
# 禁止"vs"分隔
if ' vs ' in text:
issues.append("L列用'vs'分隔模版和合同,应用中文叙述(如'模版为XX;本合同为XX'")
return issues
def main():
if len(sys.argv) < 2:
print("用法: python3 output-style-check.py <campus>-row-data.json")
sys.exit(2)
filepath = sys.argv[1]
try:
with open(filepath, 'r', encoding='utf-8') as f:
data = json.load(f)
except Exception as e:
print(f"❌ 无法读取文件: {e}")
sys.exit(2)
all_issues = []
# Check H column (fees)
if 'fees' in data and data['fees']:
h_issues = check_h_column(data['fees'])
all_issues.extend(h_issues)
# Check K column (risk_detail)
if 'risk_detail' in data and data['risk_detail']:
k_issues = check_k_column(data['risk_detail'])
all_issues.extend(k_issues)
# Check L column (diff_detail)
if 'diff_detail' in data and data['diff_detail']:
l_issues = check_l_column(data['diff_detail'])
all_issues.extend(l_issues)
# Check J column (status) - should be just "履行中", no extra text
if 'status' in data and data['status']:
status = data['status'].strip()
if status not in ['履行中', '已到期', '已解除']:
all_issues.append(f"J列状态值不规范: '{status}',应为'履行中'/'已到期'/'已解除'(不加括号说明)")
if all_issues:
print(f"❌ 风格检查未通过({len(all_issues)}个问题):")
for i, issue in enumerate(all_issues, 1):
print(f" {i}. {issue}")
sys.exit(1)
else:
print("✅ 风格检查通过:H/K/L/J列格式符合统一规范")
sys.exit(0)
if __name__ == '__main__':
main()