commercial-renewal-tracker · git:20260529.efece30 · 2026-05-29 · sha256 5736008500a82465

commercial-renewal-tracker git:20260529.efece30A

Immutable. This exact content is served forever at /api/v1/blob/5736008500a82465.

---
name: commercial-renewal-tracker
description: >
  展示具有即将到来的取消截止日期的合同,在通知窗口关闭前发出预警,
  基于维护的续约登记册运行。当用户询问"什么即将续约""哪些续约即将到期"
  "我们是否错过了取消窗口""将此添加到续约追踪器"时使用,或按计划运行。
  接收来自 saas-msa-review 的交接数据。
argument-hint: "[--days N 变更窗口 | --missed 查看已过期的窗口]"
---

# /renewal-tracker

呈现哪些合同即将续约以及必须在何时之前取消。

## 指令

1. **读取 `$LEGAL_AGENT_PROFILE_HOME/commercial-legal/renewal-register.yaml`**(配置目录——插件更新后仍保留)。

2. **默认模式:** 模式2——未来90天内即将到来的事项,按紧急程度分组。

3. **`--days N`:** 变更窗口。

4. **`--missed`:** 模式4——已过期的取消截止日期。

5. **如果登记册为空且合同管理系统已连接:** 提供模式3——扫描合同管理系统获取当前协议并批量加载。

6. **输出包含建议操作:** 联系谁(每条登记记录中的业务负责人)、哪些具有无上限定价。

## 示例

```
commercial-renewal-tracker
commercial-renewal-tracker --days 180
commercial-renewal-tracker --missed
```

---

## 目的

没有人读合同第二遍。续约日期在审查时提取一次,然后存于某处——最好是在取消截止日期前45天大声提醒,而不是45天后。

本技能基于一个核心区分运行:**`cancel_by_effective`**(通知必须送达的最后一天)与 **`send_by_effective`**(为确保通知在截止日期前送达,你必须*发出*通知的日期)。仅以 `send_by_effective` 触发预警——发送截止日期而非到达截止日期。这两个日期不同,差别可能让你在截止日期错过。

## 登记册

位于 `$LEGAL_AGENT_PROFILE_HOME/commercial-legal/renewal-register.yaml`。

```yaml
- counterparty: "Acme SaaS Inc."
  agreement: "Acme平台订阅协议"
  signed_date: 2025-06-15
  initial_term_end: 2026-06-15
  current_term_end: 2026-06-15
  renewal_mechanism: "自动续约年度"
  notice_period_days: 60
  notice_method: "书面通知/邮件"
  transit_buffer_days: 3
  cancel_by_calendar: 2026-04-16
  cancel_by_effective: 2026-04-16
  send_by_effective: 2026-04-13
  cancel_by_roll_note: ""
  cancel_by_provenance: "[模型计算 — 对照通知条款核实]"
  price_on_renewal: "当时价目表(无上限)"
  annual_value: 48000
  business_owner: "jane@company.com"
  clm_id: "IC-12345"
  status: "active"
  notes: "定价无上限——续约前重审。替代供应商:X, Y。"
```

### transit_buffer_days 字段说明

`transit_buffer_days` 是发出通知与通知实际送达之间所需的额外天数。计算方式:

```
send_by_effective = cancel_by_effective - transit_buffer_days
```

以 `send_by_effective` 触发预警,而非 `cancel_by_effective`。

**常见缓冲天数:**

| 通知方式 | 建议缓冲 |
|---|---|
| 电子邮件(合同约定) | 0–1天 |
| 挂号信/EMS | 3–5天 |
| 公证送达 | 5–7天 |
| 合同约定"书面通知"但未指定方式 | 3天(保守) |
| 合同约定"提前[N]日送达" | 3天 |

如果合同通知条款对送达时间有明确规定(如"送达后次日起算"),缓冲按该规定计算,而非按上表。送达时间存疑时,向上取整。

### 滚动续约字段说明

存储 `initial_term_end` 供历史记录。从 `current_term_end` 计算 `cancel_by_*`。

**当续约自动触发后,须更新 `current_term_end`。** 如果登记册条目的 `current_term_end` 已过期且状态为 `active`,提示用户:

> [对方当事人] 的 `current_term_end`([日期])已过去。是否已发生续约?如果是,请提供新的到期日以更新登记册。如果否,这可能是一个错过的取消窗口——运行 `--missed` 查看详情。

## 工作日回退——五步流程

每个 `cancel_by_calendar` 日期必须回退至最近的工作日,才能得出 `cancel_by_effective`。中国法下,以合同约定的管辖法域确定节假日范围。

**五步流程:**

1. **读取合同约定的管辖法律。** 大多数中国境内合同适用中国法,工作日以中国法定节假日为准。如适用境外法律,相应调整节假日范围。

2. **识别法定节假日。** 中国法定节假日共11天(元旦1天、春节7天、清明1天、劳动节1天、端午1天、中秋1天、国庆7天),但每年具体日期由国务院提前公布,可能因调休制度前移或后移。使用 `web_search` 搜索"[YYYY]年国务院节假日安排"确认当年调休日期,标注 `[联网检索 — 需复核]`。

3. **识别调休工作日。** 为凑足连休,部分周六/周日被调整为工作日(调休)。调休日视为工作日,即使是周末。

4. **计算回退日期。** 调用 `mcp_date_add` 工具:以 `current_term_end` 为基准日,减去 `notice_period_days` 天,得到 `cancel_by_calendar`。再判断该日期是否为工作日;如落在节假日或非调休周末,向前回退至最近的工作日(即更早的日期)。向前回退而非顺延,因为截止日期是不可让步的。

5. **记录两个字段并写明依据。** `cancel_by_calendar`(协议文字计算出的日期)+ `cancel_by_effective`(回退后的有效工作日)。在 `cancel_by_roll_note` 中记录回退原因(例如:"2026年4月16日(周四)—— 无需回退,为工作日"或"2026年10月2日(节假日)—— 回退至2026年9月30日(周三)")。

**`cancel_by_provenance` 字段** 记录计算来源:`[模型计算 — 对照通知条款核实]`(初始录入)或 `[律师核实 — YYYY-MM-DD]`(经人工确认后更新)。

**节假日数据时效性。** 国务院通常于每年11-12月公布次年节假日安排。如果审查时次年调休日期尚未公布,在 `cancel_by_provenance` 中标注:`[模型计算 — [YYYY]年调休安排尚未公布,回退日期待次年公告后核实]`。

## 模式

### 模式1:录入续约(来自审查的交接)

当SaaS审查或供应商协议审查发现续约条款时,自动准备登记记录。

接收来自 `saas-msa-review` 的交接数据,格式:

```yaml
counterparty: "[名称]"
agreement: "[协议标题]"
signed_date: "[ISO日期]"
current_term_end: "[ISO日期]"
renewal_mechanism: "[按合同原文]"
notice_period_days: [天数]
notice_method: "[按合同原文]"
transit_buffer_days: [建议缓冲天数]
price_on_renewal: "[按合同原文]"
annual_value: [年度金额]
business_owner: "[联系人]"
```

追加至登记册前,运行工作日回退流程计算 `cancel_by_effective` 和 `send_by_effective`。展示计算结果请用户确认,再写入登记册。

### 模式2:即将到来的事项

**默认回顾窗口:** 未来90天。调用 `mcp_get_datetime` 获取当前日期作为计算基准,调用 `mcp_days_between` 计算各条目的 `send_by_effective` 距今天数,按以下半开区间分组:
- 🔴 **0-13天**
- 🟠 **14-44天**
- 🟡 **45-89天**

```markdown
## 续约——未来90天
*以发送截止日(send_by_effective)计,非到达截止日*

### 🔴 取消通知须在0-13天内发出

| 对方当事人 | 发送截止日 | 到达截止日 | 续约日 | 年度金额 | 负责人 | 备注 |
|---|---|---|---|---|---|---|

### 🟠 取消通知须在14-44天内发出

[同上表格]

### 🟡 取消通知须在45-89天内发出

[同上表格]

---

**建议操作:**
- [ ] [对方当事人] — 联系 [业务负责人]:我们还要这个吗?
- [ ] [对方当事人] — 定价无上限;在失去谈判优势前获取替代报价
```

### 模式3:扫描合同管理系统/电子签章工具填充登记册

如果MCP已连接且登记册为空或过期:

1. **查询合同管理系统**(e签宝、法大大等)——搜索状态为"已生效"且包含续约/自动续约条款的协议。
2. **提取以下字段**:对方当事人名称、协议类型、签署日期、期限结束日期、通知窗口(如元数据中有)。
3. **如元数据中无通知窗口**:标注该条目需人工补全——技能不从正文推断(推断可能错误)。列出合同名称,提示用户提供缺失信息。
4. **对每条提取记录运行工作日回退流程**,计算 `cancel_by_effective` 和 `send_by_effective`。
5. **批量展示**供用户确认后写入登记册。不要在未经确认的情况下覆盖现有条目。

如果MCP未连接,提示:
> 合同管理系统未连接。你可以手动提供协议,或从SaaS/供应商协议审查交接数据录入。逐份录入:将协议拖入此对话,技能将提取续约条款并计算截止日期。

### 模式4:错过的窗口(坏消息报告)

```markdown
## 错过的取消窗口

| 对方当事人 | 取消截止日为 | 已过去天数 | 续约日 | 状态 |
|---|---|---|---|---|

**选项:**
- 与对方协商逾期取消(很少成功,但值得一问,尤其是长期关系中)
- 接受续约,现在标记下一轮取消截止日(`current_term_end` 已更新为新到期日)
- 检查协议中是否存在其他终止权利(如重大违约终止、不满意条款)
```

## 关卡:非律师用户

续约追踪是研究。*行动*——发送不续约通知、让自动续约生效或签署续约——是产生法律后果的步骤。

阅读 `$LEGAL_AGENT_PROFILE_HOME/commercial-legal/profile.md` → `## 使用者`。如果角色为非律师:

> 发送不续约通知是具有法律效力的行为,可能对公司的合同权利和义务产生重大影响。你是否已与律师审阅?如需寻找律师:请联系中华全国律师协会或所在地地方律师协会获取推荐服务。

未经明确同意,不得越过此关卡。

## 仪表盘选项

当登记册条目超过10条时,在输出末尾提供:

> 📊 **想以仪表盘形式查看?** 我将构建一个交互视图,包含:摘要统计(按紧急程度计数、年度总价值)、彩色可排序表格、取消截止日时间线图,以及标注无上限定价风险的高亮行。如已连接图表工具,调用 `mcp_generate_bar_chart` 生成按紧急程度分组的续约分布图,调用 `mcp_generate_line_chart` 生成时间线视图,直接在对话中渲染;否则写入HTML文件可在浏览器中打开。

## 集成:续约提醒代理

续约提醒代理按计划运行本技能(默认每周),将"即将到来的事项"报告发布到审查指引中配置的频道(飞书/企业微信/钉钉/邮件)。如需按日触发🔴紧急项,代理每日运行检查并仅在存在🔴项时推送。

## 本技能不做的事

- 不取消合同。告知你何时应做决定。
- 不决定是否续约。呈现截止日期和业务负责人。
- 不阅读合同以查找续约日期——这在审查时完成。
- 不在未经用户确认的情况下覆盖登记册现有条目。