feat: export core Hermes skills
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>流程图模板</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
body { font-family:"Microsoft YaHei","PingFang SC","WenQuanYi Zen Hei","Droid Sans Fallback",sans-serif;
|
||||
background:#f4f6f8; color:#1a1a1a; padding:16px; line-height:1.5; }
|
||||
h1 { font-size:20px; text-align:center; margin-bottom:4px; color:#1a2b3c; }
|
||||
.sub { text-align:center; font-size:12px; color:#667; margin-bottom:20px; }
|
||||
.legend { display:flex; flex-wrap:wrap; justify-content:center; gap:8px; margin-bottom:18px; font-size:12px; }
|
||||
.lg { display:inline-flex; align-items:center; gap:5px; padding:3px 9px; border-radius:6px; border:1.5px solid; }
|
||||
.fig { background:#fff; border-radius:12px; padding:20px 14px; margin-bottom:26px; box-shadow:0 2px 10px rgba(0,0,0,.06); }
|
||||
.fig h2 { font-size:16px; color:#1a2b3c; margin-bottom:4px; padding-left:6px; border-left:4px solid #2E6DA4; }
|
||||
.fig .desc { font-size:12px; color:#778; margin:6px 0 16px 10px; }
|
||||
.row { display:flex; justify-content:center; align-items:stretch; gap:14px; flex-wrap:wrap; }
|
||||
.node { border-radius:10px; padding:10px 12px; border:2px solid; font-size:13px; text-align:center;
|
||||
min-width:130px; display:flex; flex-direction:column; justify-content:center; }
|
||||
.node b { display:block; font-size:13.5px; margin-bottom:3px; }
|
||||
.node small { font-size:11.5px; color:#3a3a3a; line-height:1.45; }
|
||||
/* 语义配色:蓝=主审/人 绿=自动/subagent 灰=系统 金=交付 橙=决策 红=回流/铁律 */
|
||||
.me{background:#BBD9F0;border-color:#2E6DA4;} .agent{background:#C6E5C6;border-color:#3C8C3C;}
|
||||
.gray{background:#ECEFF1;border-color:#90A4AE;} .dec{background:#FCE4B0;border-color:#E0922F;}
|
||||
.rework{background:#F5C6C6;border-color:#C0392B;} .gold{background:#F5E6A8;border-color:#C9A227;}
|
||||
.lgold{background:#FBF3D5;border-color:#C9A227;}
|
||||
.arrow { text-align:center; color:#37474F; font-size:18px; margin:7px 0; font-weight:bold; }
|
||||
.arrow small { font-size:11px; display:block; color:#555; }
|
||||
.full { width:100%; } .dashed { border-style:dashed; }
|
||||
.note { font-size:11.5px; color:#555; font-style:italic; text-align:center; margin-top:10px; }
|
||||
.col { display:flex; flex-direction:column; gap:7px; align-items:center; flex:1; min-width:170px; }
|
||||
.col .arrow { margin:2px 0; font-size:15px; }
|
||||
.branches { display:flex; gap:12px; align-items:flex-start; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 用法:div+border 画节点、↓/→ 字符画箭头。中文走系统字体,零豆腐块风险。
|
||||
节点 class 选语义色:me/agent/gray/dec/rework/gold。
|
||||
单列流程用 .row + .arrow 交替;并行分支用 .branches>.col。 -->
|
||||
<h1>标题</h1>
|
||||
<div class="sub">副标题 / 制作人 / 日期</div>
|
||||
<div class="legend">
|
||||
<span class="lg me">🔵 人/主审</span>
|
||||
<span class="lg agent">🟢 自动/subagent</span>
|
||||
<span class="lg gray">⬜ 系统/流转</span>
|
||||
<span class="lg dec">🔶 决策</span>
|
||||
<span class="lg gold">🟡 交付</span>
|
||||
</div>
|
||||
|
||||
<div class="fig">
|
||||
<h2>图1 · 单列流程示例</h2>
|
||||
<div class="desc">说明文字</div>
|
||||
<div class="row"><div class="node gray full"><b>起点</b></div></div>
|
||||
<div class="arrow">↓</div>
|
||||
<div class="row">
|
||||
<div class="node me"><b>节点A</b><small>子说明</small></div>
|
||||
<div class="node agent"><b>节点B</b><small>子说明</small></div>
|
||||
</div>
|
||||
<div class="arrow">↓<small>条件标签</small></div>
|
||||
<div class="row"><div class="node gold full"><b>终点/交付</b></div></div>
|
||||
<div class="note">脚注</div>
|
||||
</div>
|
||||
|
||||
<div class="fig">
|
||||
<h2>图2 · 并行分支示例</h2>
|
||||
<div class="branches">
|
||||
<div class="col">
|
||||
<div class="node agent full"><b>分支1</b></div>
|
||||
<div class="arrow">↓</div><div class="node gray full">步骤</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="node dec full"><b>分支2</b></div>
|
||||
<div class="arrow">↓</div><div class="node gray full">步骤</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,175 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
单校区梳理表生成器模板 / Single-Campus Review Table Builder
|
||||
==========================================================
|
||||
照抄改值即可,别每个校区从头裸写 openpyxl(Pitfall 18:禁止裸做)。
|
||||
2026-06-26 八个校区验证通过。
|
||||
|
||||
改这些就够了(搜 TODO):
|
||||
· ws.title / 大标题 / 项目信息行(r2)
|
||||
· r5 租赁数据行的 D5..L5、r8 物业数据行的 D8..L8(如无物业合同则跳过r6-r8)
|
||||
· 整体段(如无物业则整体段在r6-r7)
|
||||
· 输出路径 out
|
||||
|
||||
🔴 地基四铁律(开工前必默念):
|
||||
1.逐字逐句 2.整体理解 3.上下文联系 4.逻辑分析
|
||||
OCR乱码→vision核实,不准猜值;地址不一致→搜注册地址;租金跳变→做算术。
|
||||
|
||||
铁律内化点(已固化进结构,别违反):
|
||||
① 12列:K=法律风险 / L=模版差异。建表后必跑 kl-separation-check.py。
|
||||
② 列宽以人民中路定稿为唯一基准。
|
||||
③ H列四检(交付前必过):条款号/月租换算/付款推算/❗标注。
|
||||
④ K列必含「提前退租法律后果分析」段(每校区必做)。
|
||||
④b K列禁用"模版"一词(含"制式模版"等复合形式)→改用"制式合同""制式文本"。
|
||||
kl-separation-check.py 的 regex 无法区分语境,一律触发。龙信0703已验证。
|
||||
⑤ 纯文本❗做标记,不用富文本红字。
|
||||
⑥ 末尾必有「整体风险分析与建议」段。
|
||||
⑦ 列归类规则(详见 references/column-allocation-rules.md):
|
||||
· H列只放纯费用,违约金归I列(核心内容)
|
||||
· K列聚焦风险,"对乙方有利条款"放整体段续签建议="建议保留"
|
||||
· K列退租分析:有约定写约定,无约定写法律规定,禁无锚点推测
|
||||
⑧ 多租赁物时按租赁物分板块(非按合同类型),每板块内租赁前物业后。
|
||||
详见 references/column-rules-0701.md「多租赁物表结构」。
|
||||
模板脚本需手动调整板块结构(段标题=租赁物描述,非合同类型)。
|
||||
"""
|
||||
import os, sys
|
||||
# ---- 事前拦截:物理依赖链检查 ----
|
||||
# 建表前必须确认OCR已补全 + 模版比对已完成,否则脚本直接中止
|
||||
WORKDIR = os.environ.get('CAMPUS_WORKDIR', '')
|
||||
if WORKDIR:
|
||||
_checkpoints = {
|
||||
'step1.verified': 'OCR完整性未通过(先运行 ocr-integrity-check.py)',
|
||||
'step2b.verified': '模版比对未完成(先 delegate subagent 做动作B,再运行 template-diff-verify.py)',
|
||||
}
|
||||
for ckpt, msg in _checkpoints.items():
|
||||
path = os.path.join(WORKDIR, ckpt)
|
||||
if not os.path.exists(path):
|
||||
print(f"⛔ 建表中止:{msg}")
|
||||
print(f" 缺少checkpoint: {path}")
|
||||
sys.exit(1)
|
||||
print(f"✅ 事前拦截通过:{WORKDIR} 的OCR和模版比对checkpoint均存在")
|
||||
# 如果未设CAMPUS_WORKDIR则跳过检查(向后兼容),但delivery-gate事后仍会拦
|
||||
|
||||
import openpyxl
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
|
||||
# ---- 样式常量(人民中路定稿基准:酒红主色 + 微软雅黑10)----
|
||||
F = Font(name='微软雅黑', size=10)
|
||||
FB = Font(name='微软雅黑', size=10, bold=True)
|
||||
TITLE = Font(name='微软雅黑', size=14, bold=True, color='FFFFFFFF')
|
||||
SUB = Font(name='微软雅黑', size=10, bold=True, color='FF404040')
|
||||
SEC = Font(name='微软雅黑', size=11, bold=True, color='FFFFFFFF')
|
||||
fill_title = PatternFill(start_color='FF8B1A2B', fill_type='solid')
|
||||
fill_sec = PatternFill(start_color='FFC0504D', fill_type='solid')
|
||||
fill_hdr = PatternFill(start_color='FFE2EFDA', fill_type='solid')
|
||||
fill_sub = PatternFill(start_color='FFF2F2F2', fill_type='solid')
|
||||
thin = Side(style='thin')
|
||||
border = Border(left=thin, right=thin, top=thin, bottom=thin)
|
||||
AL = Alignment(horizontal='left', vertical='top', wrap_text=True)
|
||||
AC = Alignment(horizontal='center', vertical='center', wrap_text=True)
|
||||
|
||||
wb = openpyxl.Workbook()
|
||||
ws = wb.active
|
||||
ws.title = '校区名' # TODO
|
||||
|
||||
widths = dict(A=5, B=20, C=17, D=27, E=23, F=9, G=21, H=36.33, I=34, J=8, K=50, L=35)
|
||||
for c, w in widths.items():
|
||||
ws.column_dimensions[c].width = w
|
||||
|
||||
|
||||
def merge_row(r, text, font, fill, h=None, al=AC):
|
||||
ws.merge_cells(f'A{r}:L{r}')
|
||||
cell = ws.cell(r, 1, text)
|
||||
cell.font = font
|
||||
cell.fill = fill
|
||||
cell.alignment = al
|
||||
for col in range(1, 13):
|
||||
ws.cell(r, col).fill = fill
|
||||
ws.cell(r, col).border = border
|
||||
if h:
|
||||
ws.row_dimensions[r].height = h
|
||||
|
||||
|
||||
# ---- r1 大标题 ----
|
||||
merge_row(1, '校区名 — 租赁合同梳理', TITLE, fill_title, 30) # TODO
|
||||
|
||||
# ---- r2 项目信息 ----
|
||||
proj = ('物业项目:……\n'
|
||||
'出租方(租赁甲方):…… | 物业方(物业乙方):……\n'
|
||||
'承租方(乙方):……') # TODO
|
||||
merge_row(2, proj, SUB, fill_sub, 76, AL)
|
||||
|
||||
# ---- r3 板块一 ----
|
||||
merge_row(3, '一、房屋租赁合同', SEC, fill_sec, 22,
|
||||
Alignment(horizontal='left', vertical='center', wrap_text=True))
|
||||
|
||||
HDR = ['序号', '文件名称', '合同类型', '合同当事人', '租赁标的/服务范围', '面积(㎡)',
|
||||
'合同期限', '金额/费用', '核心内容', '当前状态',
|
||||
'法律风险(站乙方立场)', '与07标准模版差异']
|
||||
for ci, h in enumerate(HDR, 1):
|
||||
c = ws.cell(4, ci, h)
|
||||
c.font = FB
|
||||
c.fill = fill_hdr
|
||||
c.alignment = AC
|
||||
c.border = border
|
||||
ws.row_dimensions[4].height = 30
|
||||
|
||||
# ---- r5 租赁数据行 ----
|
||||
# TODO 填 D5..L5。
|
||||
# H列四检:①条款号 ②月租换算(≈X个月) ③付款推算(各期具体日期) ④❗标注(未付期次)
|
||||
# H5 只放纯费用(租金/物业费/保证金/水电费标准),违约金归I列
|
||||
# 🔴 I5 租赁合同必检21类目(有就写没有不写,直接摘原文,格式=· [类目] 原文(条款号)):
|
||||
# 用途/转租/装修改造/广告标识/非竞争/维修责任/保险要求/物业服务联动/配套设施/
|
||||
# 出租方变更/解除权机制/违约金机制/不可抗力/征收拆迁/房屋抵押查封/政策变化/
|
||||
# 到期处理/恢复原状/优先权/管辖/备案
|
||||
# 🔴 I列物业合同必检15类目:
|
||||
# 物业服务内容/服务标准/公共能耗费/特约服务/共用设施管理/装修管理/安保措施/
|
||||
# 消防安全/保险要求/联动终止/违约责任/退出交接/免责条款/不可抗力/管辖
|
||||
# K5 独立审查:从"本合同第X条这样约定→对乙方什么后果"起笔
|
||||
# K5 必含:需注意风险点 + 提前退租法律后果(有约定写约定,无约定写法律规定,禁推测)
|
||||
# K5 禁放"对乙方有利条款" → 移到整体段续签建议="建议保留"
|
||||
# L5 纯客观:只摆文本差异事实,禁止"风险/建议/不利/详见"
|
||||
row5 = ['1', '租赁合同.pdf', '房屋租赁合同', 'D5…', 'E5…', '面积', 'G5…', 'H5…', 'I5…', '履行中', 'K5…', 'L5…']
|
||||
for ci, v in enumerate(row5, 1):
|
||||
c = ws.cell(5, ci, v)
|
||||
c.font = F
|
||||
c.alignment = (AC if ci in (1, 3, 6, 10) else AL)
|
||||
c.border = border
|
||||
ws.row_dimensions[5].height = 409.5
|
||||
|
||||
# ---- r6-r8 物业板块(如无物业合同则跳过,整体段改为r6-r7)----
|
||||
merge_row(6, '二、物业管理服务合同', SEC, fill_sec, 22,
|
||||
Alignment(horizontal='left', vertical='center', wrap_text=True))
|
||||
for ci, h in enumerate(HDR, 1):
|
||||
c = ws.cell(7, ci, h)
|
||||
c.font = FB
|
||||
c.fill = fill_hdr
|
||||
c.alignment = AC
|
||||
c.border = border
|
||||
ws.row_dimensions[7].height = 30
|
||||
# TODO 填 D8..L8。物业合同新东方常为甲方,与租赁当事人方向相反,D8加注。
|
||||
row8 = ['2', '物业合同.pdf', '物业管理服务合同', 'D8…', 'E8…', '面积', 'G8…', 'H8…', 'I8…', '履行中', 'K8…',
|
||||
'物业服务协议,无对应07标准模版。']
|
||||
for ci, v in enumerate(row8, 1):
|
||||
c = ws.cell(8, ci, v)
|
||||
c.font = F
|
||||
c.alignment = (AC if ci in (1, 3, 6, 10) else AL)
|
||||
c.border = border
|
||||
ws.row_dimensions[8].height = 200
|
||||
|
||||
# ---- r9-r10 整体风险分析与建议(必含板块)----
|
||||
merge_row(9, '三、校区整体风险分析与建议', SEC, fill_sec, 22,
|
||||
Alignment(horizontal='left', vertical='center', wrap_text=True))
|
||||
# TODO 结构:【整体评价】→【需客户核实】→【提前退租法律后果】→【其他关注点】→【有利条款】→【续签建议】
|
||||
overall = '【整体评价】\n……' # TODO
|
||||
merge_row(10, overall, F, PatternFill(start_color='FFFFFFFF', fill_type='solid'), 350, AL)
|
||||
ws.cell(10, 1).font = F
|
||||
|
||||
ws.freeze_panes = 'A5'
|
||||
out = '/tmp/<校区>/校区名-梳理-MJ-YYYYMMDD.xlsx' # TODO
|
||||
wb.save(out)
|
||||
print('saved', out)
|
||||
# 建表后必做:1) python3 scripts/kl-separation-check.py <out> 验K/L分工
|
||||
# 2) python3 scripts/i-column-coverage-check.py <out> 验I列类目覆盖(详见 references/i-column-standard-0703.md)
|
||||
# 3) H列四检逐项过
|
||||
# 4) x2t渲染PDF + pdftotext拍平grep验文字 + vision验视觉
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
# 模版比对报告——{校区名}租赁合同
|
||||
|
||||
**合同名称:** {合同标题}
|
||||
**甲方:** {出租方名称}
|
||||
**乙方:** {承租方名称}
|
||||
**房屋坐落:** {地址}
|
||||
**建筑面积:** {面积}
|
||||
**租赁期限:** {起止日期}
|
||||
**比对模版:** 07-房屋租赁合同.docx(南通新东方参考模版)
|
||||
|
||||
---
|
||||
|
||||
## 一、关键要素提取
|
||||
|
||||
| 要素 | 本合同内容 |
|
||||
|------|-----------|
|
||||
| 合同标题 | {标题} |
|
||||
| 甲方 | {名称} |
|
||||
| 乙方 | {名称} |
|
||||
| 甲方住所 | {地址} |
|
||||
| 联系电话 | {电话} |
|
||||
| 房屋地址 | {地址} |
|
||||
| 房屋结构 | {结构} |
|
||||
| 建筑面积 | {面积} |
|
||||
| 用途 | {用途} |
|
||||
| 租赁期限 | {期限} |
|
||||
| 免租期 | {免租期及起止日期} |
|
||||
| 各期租金 | {逐期列示金额及期间} |
|
||||
| 发票类型 | {发票类型} |
|
||||
| 付款条件 | {付款触发条件及期限} |
|
||||
| 租金支付周期 | {支付频率及截止日} |
|
||||
| 履约保证金 | {金额} |
|
||||
| 保证金退还 | {退还条件及期限} |
|
||||
| 违约金标准 | {比例/金额} |
|
||||
| 逾期利息 | {利率/费率} |
|
||||
| 管辖法院 | {法院} |
|
||||
| 合同份数 | {份数} |
|
||||
|
||||
---
|
||||
|
||||
## 二、逐条差异比对(≥20条)
|
||||
|
||||
### 第1条:{差异主题}
|
||||
|
||||
- **模版表述为**【{模版原文摘录}】
|
||||
- **本合同表述为**【{本合同原文摘录}】
|
||||
|
||||
### 第2条:{差异主题}
|
||||
|
||||
- **模版表述为**【{模版原文摘录}】
|
||||
- **本合同表述为**【{本合同原文摘录}】
|
||||
|
||||
...(逐条列示,每条差异写明主题、模版原文、本合同原文)
|
||||
|
||||
---
|
||||
|
||||
## 三、补充差异(模版有、本合同无的条款)
|
||||
|
||||
| 序号 | 模版条款 | 说明 |
|
||||
|------|---------|------|
|
||||
| 1 | {条款号+标题} | {简要说明该条款内容} |
|
||||
| 2 | ... | ... |
|
||||
|
||||
---
|
||||
|
||||
## 四、退租敞口测算
|
||||
|
||||
### 1. 乙方主动提前退租
|
||||
|
||||
**适用条款:第X条**
|
||||
> "{原文摘录}"
|
||||
|
||||
| 退租时点 | 违约金金额 | 计算方式 |
|
||||
|---------|-----------|---------|
|
||||
| 第1-N期 | ¥{金额} | {计算过程} |
|
||||
|
||||
### 2. 甲方违约导致乙方退租
|
||||
|
||||
**适用条款:第X条**
|
||||
> "{原文摘录}"
|
||||
|
||||
| 退租时点 | 甲方应付违约金 | 另需退还 |
|
||||
|---------|-------------|---------|
|
||||
| 第1-N期 | ¥{金额} | {退还项目} |
|
||||
|
||||
### 3. 因不可抗力/政策原因退租
|
||||
|
||||
**适用条款:第X条**
|
||||
> "{原文摘录}"
|
||||
|
||||
敞口 = {金额或说明}
|
||||
|
||||
### 4. 因拆迁/房屋毁损
|
||||
|
||||
**适用条款:第X条**
|
||||
> "{原文摘录}"
|
||||
|
||||
敞口 = {金额或说明}
|
||||
|
||||
### 5. 退租敞口汇总
|
||||
|
||||
| 退租情形 | 乙方最大损失 | 乙方最大获赔 |
|
||||
|---------|-----------|-----------|
|
||||
| 乙方主动退租 | ¥{金额} | — |
|
||||
| 甲方违约 | — | ¥{金额}+{退还项目} |
|
||||
| 不可抗力/政策 | ¥{金额} | ¥{金额} |
|
||||
| 拆迁/房屋毁损 | ¥{金额} | {补偿说明} |
|
||||
|
||||
---
|
||||
|
||||
*报告生成日期:{日期}*
|
||||
*比对方法:逐条打开07模版原件与OCR文本逐项比对*
|
||||
*OCR质量验证:所有金额/费率已做数学交叉验证;乱码段落已vision核实*
|
||||
*本报告中性客观,仅列出差异,不含风险判断*
|
||||
Reference in New Issue
Block a user