Delete .trae
Browse files- .trae/specs/build-peer-reg-crawler/checklist.md +0 -10
- .trae/specs/build-peer-reg-crawler/spec.md +0 -57
- .trae/specs/build-peer-reg-crawler/tasks.md +0 -48
- .trae/specs/go-live-production-checklist/checklist.md +0 -8
- .trae/specs/go-live-production-checklist/spec.md +0 -34
- .trae/specs/go-live-production-checklist/tasks.md +0 -33
- .trae/specs/implement-privacy-compliance-agents/checklist.md +0 -8
- .trae/specs/implement-privacy-compliance-agents/spec.md +0 -39
- .trae/specs/implement-privacy-compliance-agents/tasks.md +0 -34
- .trae/specs/optimize-compliance-agents-p0/checklist.md +0 -8
- .trae/specs/optimize-compliance-agents-p0/spec.md +0 -36
- .trae/specs/optimize-compliance-agents-p0/tasks.md +0 -34
- .trae/specs/optimize-compliance-agents-p0/搜索资料.md +0 -1070
.trae/specs/build-peer-reg-crawler/checklist.md
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
- [x] source_registry 数据模型与 API 契约完整(含枚举、字段、错误码)
|
| 2 |
-
- [x] sources 管理 API 可用(新增/列表/更新/启停)
|
| 3 |
-
- [x] jobs 触发与查询可用(manual trigger + 状态查询)
|
| 4 |
-
- [x] raw_snapshot 可追溯(包含 http_status/final_url/raw_hash/原始内容)
|
| 5 |
-
- [x] normalized_document 生成稳定,且 normalized_hash 去重生效
|
| 6 |
-
- [x] clause_chunk 可生成(章节/条款级切片 + topic_tags)
|
| 7 |
-
- [x] diff_event 可生成(added/removed/modified + 片段对比)
|
| 8 |
-
- [x] updates 供数接口可用(topics/since/limit 过滤,输出结构符合 AGENT-01 输入契约)
|
| 9 |
-
- [x] 定时调度与失败重试策略生效(含 degraded 标记)
|
| 10 |
-
- [x] 至少 6 个白名单来源完成一次端到端抓取验证并能产出变化包
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/build-peer-reg-crawler/spec.md
DELETED
|
@@ -1,57 +0,0 @@
|
|
| 1 |
-
# 同业/监管抓取子系统(AGENT-00)Spec
|
| 2 |
-
|
| 3 |
-
## Why
|
| 4 |
-
当前 AGENT-01 仅能消费上游提供的 `peer_updates` / `regulatory_updates`,缺少一个稳定的“找、抽、比、存”能力层,导致同业与监管依据来源、版本与条款回链不可控,难以进入客户内测与审计要求。需要构建一个独立于 AGENT-01~04 之外的抓取与检索子系统(AGENT-00),输出可追溯、可版本化、条款级的结构化变化包。
|
| 5 |
-
|
| 6 |
-
## What Changes
|
| 7 |
-
- 新增 AGENT-00 抓取与检索子系统:来源白名单管理、定时/手动抓取、正文抽取、文本标准化、版本去重、条款切片、主题标注、版本比对、结构化入库、对外查询 API。
|
| 8 |
-
- 向 AGENT-01 提供稳定输入接口:`GET /api/crawler/updates` 输出 `peer_updates` / `regulatory_updates` / `sdk_updates`。
|
| 9 |
-
- 定义抓取子系统的最小可落地数据模型:`source_registry`、`crawl_job`、`raw_snapshot`、`normalized_document`、`clause_chunk`、`diff_event`。
|
| 10 |
-
|
| 11 |
-
## Impact
|
| 12 |
-
- Affected specs: 上游数据供给与审计链路(为 AGENT-01 提供可追溯输入)
|
| 13 |
-
- Affected code: 将新增 crawler 子系统模块(服务端 API、存储层、抓取与解析流程、定时调度)
|
| 14 |
-
|
| 15 |
-
## ADDED Requirements
|
| 16 |
-
### Requirement: 白名单来源管理
|
| 17 |
-
The system SHALL 提供来源注册表(source_registry)用于管理白名单来源,禁止在代码中硬编码 URL。
|
| 18 |
-
The system SHALL 支持来源启停、抓取频率、解析器类型、主题标签等配置。
|
| 19 |
-
|
| 20 |
-
#### Scenario: 新增来源
|
| 21 |
-
- **WHEN** 管理员调用 `POST /api/crawler/sources` 提交来源配置
|
| 22 |
-
- **THEN** 返回 `source_id`,并在后续抓取调度中可被读取
|
| 23 |
-
|
| 24 |
-
### Requirement: 抓取与正文抽取
|
| 25 |
-
The system SHALL 支持 HTML 页面抓取与正文抽取,输出标题、更新时间/生效时间(若可识别)、章节结构与正文。
|
| 26 |
-
The system SHALL 保留原始快照(raw_snapshot),确保可回溯审计。
|
| 27 |
-
|
| 28 |
-
#### Scenario: 手动触发抓取
|
| 29 |
-
- **WHEN** 调用 `POST /api/crawler/jobs` 并指定 source_ids
|
| 30 |
-
- **THEN** 生成 `crawl_job` 记录并进入 queued/running/success/failed 生命周期
|
| 31 |
-
|
| 32 |
-
### Requirement: 版本去重与条款级切片
|
| 33 |
-
The system SHALL 对抓取结果做标准化后计算 `raw_hash` / `normalized_hash`。
|
| 34 |
-
The system SHALL 在 `normalized_hash` 不变时不生成新版本。
|
| 35 |
-
The system SHALL 将标准化文档拆分为条款切片(clause_chunk),至少包含 section_path/section_title/clause_text/topic_tags。
|
| 36 |
-
|
| 37 |
-
#### Scenario: 去重
|
| 38 |
-
- **WHEN** 同一来源再次抓取且 normalized_hash 未变化
|
| 39 |
-
- **THEN** 不创建新的 normalized_document 版本
|
| 40 |
-
|
| 41 |
-
### Requirement: 版本比对与变更事件
|
| 42 |
-
The system SHALL 对同一来源新旧版本输出 diff_event(added/removed/modified),并提供变化章节片段(old_excerpt/new_excerpt)与 topic_tags。
|
| 43 |
-
|
| 44 |
-
### Requirement: 对 AGENT-01 的供数接口
|
| 45 |
-
The system SHALL 提供 `GET /api/crawler/updates` 返回结构化变化包,支持 topics/since/limit 过滤。
|
| 46 |
-
The system SHALL 在每条变化中包含来源、版本与条款片段(excerpt)以支撑 AGENT-01 的审计回链。
|
| 47 |
-
|
| 48 |
-
#### Scenario: 获取变化包
|
| 49 |
-
- **WHEN** 调用 `GET /api/crawler/updates?topics=sdk_disclosure,permission_usage&since=2026-04-01`
|
| 50 |
-
- **THEN** 返回 peer_updates/regulatory_updates/sdk_updates,并且每条包含 source_name/source_type/version_date/topic_tags/changed_sections[]
|
| 51 |
-
|
| 52 |
-
## MODIFIED Requirements
|
| 53 |
-
无
|
| 54 |
-
|
| 55 |
-
## REMOVED Requirements
|
| 56 |
-
无
|
| 57 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/build-peer-reg-crawler/tasks.md
DELETED
|
@@ -1,48 +0,0 @@
|
|
| 1 |
-
# Tasks
|
| 2 |
-
|
| 3 |
-
- [x] Task 1: 定义抓取子系统数据模型与对外 API 契约
|
| 4 |
-
- [x] SubTask 1.1: 明确 `source_registry` / `crawl_job` / `raw_snapshot` / `normalized_document` / `clause_chunk` / `diff_event` 的字段与枚举
|
| 5 |
-
- [x] SubTask 1.2: 定义抓取子系统错误码(4001-4004, 5001-5004)与返回结构
|
| 6 |
-
- [x] SubTask 1.3: 定义对外 API(sources/jobs/documents/diff-events/updates)的 request/response JSON 结构
|
| 7 |
-
|
| 8 |
-
- [x] Task 2: 实现来源白名单管理 API
|
| 9 |
-
- [x] SubTask 2.1: 实现 `POST /api/crawler/sources` 新增来源
|
| 10 |
-
- [x] SubTask 2.2: 实现 `GET /api/crawler/sources` 来源列表与过滤
|
| 11 |
-
- [x] SubTask 2.3: 实现来源启停/更新(如 `PATCH /api/crawler/sources/{source_id}`)
|
| 12 |
-
|
| 13 |
-
- [x] Task 3: 实现抓取任务与快照存储
|
| 14 |
-
- [x] SubTask 3.1: 实现 `POST /api/crawler/jobs`(manual trigger),创建 crawl_job 并执行抓取
|
| 15 |
-
- [x] SubTask 3.2: 实现 `GET /api/crawler/jobs/{jobId}` 查询任务状态
|
| 16 |
-
- [x] SubTask 3.3: 落地 raw_snapshot(存原始响应体、状态码、final_url、raw_hash)
|
| 17 |
-
|
| 18 |
-
- [x] Task 4: 实现正文抽取与标准化
|
| 19 |
-
- [x] SubTask 4.1: 实现 HTML 正文抽取策略(过滤导航/页脚等噪音)
|
| 20 |
-
- [x] SubTask 4.2: 实现文本标准化(空白折叠、全角半角、章节编号识别、日期标准化)
|
| 21 |
-
- [x] SubTask 4.3: 生成 normalized_document 并做版本去重(normalized_hash)
|
| 22 |
-
|
| 23 |
-
- [x] Task 5: 实现条款切片、主题标注与版本比对
|
| 24 |
-
- [x] SubTask 5.1: 将 normalized_text 切分为 clause_chunk(章节路径/标题/正文/顺序)
|
| 25 |
-
- [x] SubTask 5.2: 实现最小主题标注(可先基于关键词规则,后续可升级)
|
| 26 |
-
- [x] SubTask 5.3: 实现 diff_event 生成(added/removed/modified)与 impact_level 初版规则
|
| 27 |
-
|
| 28 |
-
- [x] Task 6: 实现供 AGENT-01 使用的更新查询 API
|
| 29 |
-
- [x] SubTask 6.1: 实现 `GET /api/crawler/updates`(topics/since/limit 过滤)
|
| 30 |
-
- [x] SubTask 6.2: 实现 `GET /api/crawler/documents` 与 `GET /api/crawler/diff-events`(用于排障与验证)
|
| 31 |
-
- [x] SubTask 6.3: 为 updates 输出结构对齐 AGENT-01 的输入契约(peer_updates/regulatory_updates/sdk_updates)
|
| 32 |
-
|
| 33 |
-
- [x] Task 7: 定时调度与失败重试
|
| 34 |
-
- [x] SubTask 7.1: 实现 schedule trigger(按 source_registry.crawl_frequency)
|
| 35 |
-
- [x] SubTask 7.2: 实现失败重试策略(10分钟后重试1次;连续失败降级标记)
|
| 36 |
-
|
| 37 |
-
- [x] Task 8: 验证与回归
|
| 38 |
-
- [x] SubTask 8.1: 为 10~20 个白名单种子来源做至少一次抓取验证(可先选 3 个银行 + 2 个监管 + 1 个 SDK)
|
| 39 |
-
- [x] SubTask 8.2: 验证去重、版本比对与 updates 输出完整性
|
| 40 |
-
|
| 41 |
-
# Task Dependencies
|
| 42 |
-
- Task 3 depends on Task 1, Task 2
|
| 43 |
-
- Task 4 depends on Task 3
|
| 44 |
-
- Task 5 depends on Task 4
|
| 45 |
-
- Task 6 depends on Task 5
|
| 46 |
-
- Task 7 depends on Task 2
|
| 47 |
-
- Task 8 depends on Task 6
|
| 48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/go-live-production-checklist/checklist.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
| 1 |
-
- [x] 智能体服务硬化:固定测试集连续回放 100 次无结构化失败,高风险全带出处
|
| 2 |
-
- [x] 性能口径清晰:`api_latency`, `llm_latency`, `e2e_latency`, `retry_count` 分开记录无冲突
|
| 3 |
-
- [x] Dify 主链通畅:Document/Knowledge 前置节点正常,4 个 HTTP 节点顺利执行(120s+ 超时)
|
| 4 |
-
- [x] 分支联调闭环:通过、退回、补材料三大人工分支全部在 Dify 走通
|
| 5 |
-
- [x] 角色验收通过:法务与业务人员实际完成至少 1 轮全流程操作
|
| 6 |
-
- [x] 安全审计达标:全链路留痕、敏感信息不落日志、无绕过人工直发风险
|
| 7 |
-
- [x] 压测与告警就绪:单次及多并发压测完成,节点超时、重试及解析失败监控可用
|
| 8 |
-
- [x] 灰度上线验证:在 1-2 家客户/部门稳定运行至少 2 周,退回率、误报率等指标健康
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/go-live-production-checklist/spec.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 1 |
-
# 智能体全量生产级别上线 (Go-Live) Spec
|
| 2 |
-
|
| 3 |
-
## Why
|
| 4 |
-
目前隐私合规协同场景的 4 个智能体(含爬虫抓取系统)已完成服务层的 P0 级别优化及 12 个分层回归测试验证。为了从“接口能用”正式迈向“真实业务可生产”,必须建立横跨智能体服务、Dify 编排联调、法务业务验收、安全审计以及性能运维的“最后一公里”完整上线标准,确保交付质量。
|
| 5 |
-
|
| 6 |
-
## What Changes
|
| 7 |
-
- [服务层硬化] 全面固化 4 个 API 的结构、统一 4 项性能指标(api_latency, llm_latency, e2e_latency, retry_count)的审计口径,并确保自动化回放框架的稳定。
|
| 8 |
-
- [Dify联调] 推进 Dify 主工作流端到端联调,覆盖材料读取、提取、知识检索、4 次智能体调用及 Jinja2 渲染,必须跑通“通过、退回、补材料”三大分支,并配置 120s 以上节点超时。
|
| 9 |
-
- [业务闭环] 实施法务与业务人员验收(至少 2 轮),确认权限、退回意见可用性及底稿真实价值。
|
| 10 |
-
- [安全运维] 增加脱敏输入校验、日志防泄漏审查,建立单 case 及并发压测基线,配置失败与超时告警。
|
| 11 |
-
- [阶段推进] 明确划定“可试点”、“可灰度”、“可正式生产”三大阶段及 8 项最小放行门槛。
|
| 12 |
-
|
| 13 |
-
## Impact
|
| 14 |
-
- Affected specs: 交付流程、Dify 工作流配置规范、生产运维与安全审计标准。
|
| 15 |
-
- Affected code: 后续联调可能涉及到的 `src/middlewares.ts` 日志清洗规则或 Dify YML 配置文件的微调。
|
| 16 |
-
|
| 17 |
-
## ADDED Requirements
|
| 18 |
-
### Requirement: Dify 端到端联调规范
|
| 19 |
-
The system SHALL 在 Dify 平台完成主链路联调,连续 30 次执行成功率 ≥ 95%。
|
| 20 |
-
The system SHALL 确保 Human Input 节点能够正确接收审核包,且后续的三大分支(写入待发布、回退重构、生成补材料清单)逻辑均能跑通。
|
| 21 |
-
|
| 22 |
-
#### Scenario: 缺材料分支回退测试
|
| 23 |
-
- **WHEN** 业务发起的输入材料中缺少权限清单,且智能体 API 返回 `4001 need_more_material`
|
| 24 |
-
- **THEN** Dify 工作流能正确捕获错误,生成标准化的补材料清单,并将流程流转至“补材料阶段”等待用户补充。
|
| 25 |
-
|
| 26 |
-
### Requirement: 安全与审计管控
|
| 27 |
-
The system SHALL 确保写入日志的信息不包含完整的敏感原始材料全文,仅保留结构化脱敏标签及 `case_id`。
|
| 28 |
-
The system SHALL 确保没有任何自动化节点能够绕过 Human Input 节点直接输出“已完全合规”的最终结论。
|
| 29 |
-
|
| 30 |
-
## MODIFIED Requirements
|
| 31 |
-
无
|
| 32 |
-
|
| 33 |
-
## REMOVED Requirements
|
| 34 |
-
无
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/go-live-production-checklist/tasks.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
| 1 |
-
# Tasks
|
| 2 |
-
|
| 3 |
-
- [x] Task 1: 智能体服务层最后硬化 (A 关卡)
|
| 4 |
-
- [x] SubTask 1.1: 确认 4 个接口全量固化 schema_version 和三级 version 标识
|
| 5 |
-
- [x] SubTask 1.2: 确认所有高/中风险项带齐 EvidenceChain 和 basis_id
|
| 6 |
-
- [x] SubTask 1.3: 确认 4 个性能口径 (api, llm, e2e, retry) 记录准确且互不冲突
|
| 7 |
-
- [x] SubTask 1.4: 确认 12 个回放测试用例能连续 100 次无结构化失败,并且输出结论稳定不漂移
|
| 8 |
-
|
| 9 |
-
- [x] Task 2: Dify 端到端主工作流联调 (B 关卡)
|
| 10 |
-
- [x] SubTask 2.1: 在 Dify 配置并确认 User Input、Document Extractor、Knowledge Retrieval 等前置节点工作正常
|
| 11 |
-
- [x] SubTask 2.2: 在 Dify 配置 4 个 HTTP Request,设定 120s+ 超时,确认顺序调用成功
|
| 12 |
-
- [x] SubTask 2.3: 在 Dify 配置 Template 节点并渲染审核包,确认 Human Input 表单接收正常
|
| 13 |
-
- [x] SubTask 2.4: 联调通过分支(成功写入待发布中心)
|
| 14 |
-
- [x] SubTask 2.5: 联调退回分支(回到 AGENT-02 重构链)
|
| 15 |
-
- [x] SubTask 2.6: 联调补材料分支(生成补材料清单并回退)
|
| 16 |
-
- [x] SubTask 2.7: 确认主链路连续 30 次执行成功率 ≥ 95%
|
| 17 |
-
|
| 18 |
-
- [x] Task 3: 法务与业务流程验收 (C 关卡)
|
| 19 |
-
- [x] SubTask 3.1: 至少 1 位法务完成审核包与 focus_items 的价值评估(愿意审且建议不过界)
|
| 20 |
-
- [x] SubTask 3.2: 至少 1 位业务/产品人员完成从发起、看缺材料提示、到回改重提的闭环
|
| 21 |
-
- [x] SubTask 3.3: 确认各环节角色权限分明,退回修改路径畅通
|
| 22 |
-
|
| 23 |
-
- [x] Task 4: 安全与审计检查 (D 关卡)
|
| 24 |
-
- [x] SubTask 4.1: 检查日志系统,确认不泄露脱敏前的敏感原文与系统错误细节
|
| 25 |
-
- [x] SubTask 4.2: 确认发起人、处理版本、处理模型、法务操作动作等全链路留痕
|
| 26 |
-
- [x] SubTask 4.3: 确认无法绕过 Human Input 节点直接发布,结论不出现“已完全合规”
|
| 27 |
-
|
| 28 |
-
- [x] Task 5: 性能、运维与灰度上线 (E/F 关卡)
|
| 29 |
-
- [x] SubTask 5.1: 确定并文档化 4 个智能体及端到端的单 case 耗时 SLA 上限
|
| 30 |
-
- [x] SubTask 5.2: 完成 5 并发、10 并发及大文本长协议压测
|
| 31 |
-
- [x] SubTask 5.3: 配置节点失败、超时及 JSON 解析失败的监控告警
|
| 32 |
-
- [x] SubTask 5.4: 配置模型服务失败时的重试及降级回滚策略
|
| 33 |
-
- [x] SubTask 5.5: 在 1-2 家客户/部门进行至少 2 周真实材料脱敏灰度试运行,并统计采纳率与误报率
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/implement-privacy-compliance-agents/checklist.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
| 1 |
-
- [x] 成功初始化服务端项目结构
|
| 2 |
-
- [x] 成功定义了五个核心数据模型/JSON Schema (`CaseContext`, `PeerRegSummary`, `GapAnalysis`, `ComplianceCheck`, `LegalReviewPack`)
|
| 3 |
-
- [x] AGENT-01 接口 `/api/agents/peer-reg-summary` 可正常调用并返回合规的 JSON 结构
|
| 4 |
-
- [x] AGENT-02 接口 `/api/agents/policy-rewrite` 可正常调用并返回合规的 JSON 结构
|
| 5 |
-
- [x] AGENT-03 接口 `/api/agents/compliance-check` 可正常调用并返回合规的 JSON 结构
|
| 6 |
-
- [x] AGENT-04 接口 `/api/agents/legal-pack` 可正常调用并返回合规的 JSON 结构
|
| 7 |
-
- [x] 错误处理机制已就绪(如返回 4001, 5001 等错误码)
|
| 8 |
-
- [x] 接口调用日志机制已实现
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/implement-privacy-compliance-agents/spec.md
DELETED
|
@@ -1,39 +0,0 @@
|
|
| 1 |
-
# 隐私合规协同场景四智能体全量开发 Spec
|
| 2 |
-
|
| 3 |
-
## Why
|
| 4 |
-
在银行智能体操作台系统中,目前桌面端已具备文件脱敏等基础能力,并连接了云端部署的 Dify。为了实现“同业隐私协议跟踪与客户协议重构协同场景”的自动化处理,需要开发四个角色智能体服务。这些服务将作为本地/服务端能力,供后续的 Dify 工作流调用,从而完成从材料解析到法务审核包生成的完整 AI 处理链。
|
| 5 |
-
|
| 6 |
-
## What Changes
|
| 7 |
-
- 实现 AGENT-01:同业/监管变化摘要智能体,负责汇总同业与监管变化并输出结构化摘要。
|
| 8 |
-
- 实现 AGENT-02:协议重构智能体,负责基于输入材料生成差异分析和修订建议。
|
| 9 |
-
- 实现 AGENT-03:合规校验智能体,负责校验修订建议的合规性并输出风险等级及待确认项。
|
| 10 |
-
- 实现 AGENT-04:法务审核包生成智能体,负责整理前三个智能体的结果,生成法务审核包。
|
| 11 |
-
- 建立统一的输入输出数据模型(CaseContext, PeerRegSummary, GapAnalysis, ComplianceCheck, LegalReviewPack)。
|
| 12 |
-
- 实现四个智能体的 HTTP POST 接口,支持 JSON 请求和响应。
|
| 13 |
-
|
| 14 |
-
## Impact
|
| 15 |
-
- Affected specs: 隐私合规协同场景的 AI 处理链能力
|
| 16 |
-
- Affected code: 后端/服务端接口及智能体逻辑实现代码(将新建四个智能体 API)
|
| 17 |
-
|
| 18 |
-
## ADDED Requirements
|
| 19 |
-
### Requirement: 统一数据模型
|
| 20 |
-
- The system SHALL 提供 `CaseContext` 作为统一输入对象。
|
| 21 |
-
- The system SHALL 为四个智能体定义对应的 JSON Schema 输出模型(`PeerRegSummary`, `GapAnalysis`, `ComplianceCheck`, `LegalReviewPack`)。
|
| 22 |
-
|
| 23 |
-
### Requirement: 智能体接口服务
|
| 24 |
-
- The system SHALL 提供 `POST /api/agents/peer-reg-summary` 接口。
|
| 25 |
-
- The system SHALL 提供 `POST /api/agents/policy-rewrite` 接口。
|
| 26 |
-
- The system SHALL 提供 `POST /api/agents/compliance-check` 接口。
|
| 27 |
-
- The system SHALL 提供 `POST /api/agents/legal-pack` 接口。
|
| 28 |
-
- The system SHALL 在所有接口中返回严格符合 JSON Schema 的结果。
|
| 29 |
-
- The system SHALL 处理错误情况,如输入材料缺失返回特定错误码(如 4001, 4002, 5001, 5002, 5003)。
|
| 30 |
-
|
| 31 |
-
#### Scenario: 成功调用同业/监管变化摘要接口
|
| 32 |
-
- **WHEN** 传入包含 `peer_updates` 和 `regulatory_updates` 的请求到 `/api/agents/peer-reg-summary`
|
| 33 |
-
- **THEN** 返回包含 `peer_summary`, `reg_summary`, `reference_clauses` 和 `risk_alerts` 的 JSON 对象。
|
| 34 |
-
|
| 35 |
-
## MODIFIED Requirements
|
| 36 |
-
无
|
| 37 |
-
|
| 38 |
-
## REMOVED Requirements
|
| 39 |
-
无
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/implement-privacy-compliance-agents/tasks.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 1 |
-
# Tasks
|
| 2 |
-
|
| 3 |
-
- [x] Task 1: 初始化项目与数据模型定义
|
| 4 |
-
- [x] SubTask 1.1: 初始化服务端项目结构(如 Node.js/Python 框架等)
|
| 5 |
-
- [x] SubTask 1.2: 定义通用输入对象 `CaseContext` 数据模型
|
| 6 |
-
- [x] SubTask 1.3: 定义并实现 `PeerRegSummary` JSON Schema
|
| 7 |
-
- [x] SubTask 1.4: 定义并实现 `GapAnalysis` JSON Schema
|
| 8 |
-
- [x] SubTask 1.5: 定义并实现 `ComplianceCheck` JSON Schema
|
| 9 |
-
- [x] SubTask 1.6: 定义并实现 `LegalReviewPack` JSON Schema
|
| 10 |
-
|
| 11 |
-
- [x] Task 2: 实现 AGENT-01 同业/监管变化摘要智能体
|
| 12 |
-
- [x] SubTask 2.1: 编写 AGENT-01 的 System Prompt 与大模型调用逻辑
|
| 13 |
-
- [x] SubTask 2.2: 实现 `POST /api/agents/peer-reg-summary` 接口,支持接收对应参数并返回 `PeerRegSummary`
|
| 14 |
-
- [x] SubTask 2.3: 添加接口层面的错误处理(如缺少上下文等)
|
| 15 |
-
|
| 16 |
-
- [x] Task 3: 实现 AGENT-02 协议重构智能体
|
| 17 |
-
- [x] SubTask 3.1: 编写 AGENT-02 的 System Prompt 与大模型调用逻辑
|
| 18 |
-
- [x] SubTask 3.2: 实现 `POST /api/agents/policy-rewrite` 接口,支持接收对应参数并返回 `GapAnalysis`
|
| 19 |
-
- [x] SubTask 3.3: 添加接口层面的错误处理
|
| 20 |
-
|
| 21 |
-
- [x] Task 4: 实现 AGENT-03 合规校验智能体
|
| 22 |
-
- [x] SubTask 4.1: 编写 AGENT-03 的 System Prompt 与大模型调用逻辑
|
| 23 |
-
- [x] SubTask 4.2: 实现 `POST /api/agents/compliance-check` 接口,支持接收对应参数并返回 `ComplianceCheck`
|
| 24 |
-
- [x] SubTask 4.3: 添加接口层面的错误处理
|
| 25 |
-
|
| 26 |
-
- [x] Task 5: 实现 AGENT-04 法务审核包生成智能体
|
| 27 |
-
- [x] SubTask 5.1: 编写 AGENT-04 的 System Prompt 与大模型调用逻辑
|
| 28 |
-
- [x] SubTask 5.2: 实现 `POST /api/agents/legal-pack` 接口,支持接收对应参数并返回 `LegalReviewPack`
|
| 29 |
-
- [x] SubTask 5.3: 添加接口层面的错误处理
|
| 30 |
-
|
| 31 |
-
- [x] Task 6: 完善通用非功能需求(NFR)
|
| 32 |
-
- [x] SubTask 6.1: 增加全局错误码与异常处理中间件(4001, 5001 等)
|
| 33 |
-
- [x] SubTask 6.2: 增加调用日志记录(case_id, agent_name, 耗时, 状态等)
|
| 34 |
-
- [x] SubTask 6.3: 编写简单的集成测试或验证脚本,确保四个 API 能够按顺序正常返回 JSON
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/optimize-compliance-agents-p0/checklist.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
| 1 |
-
- [x] 全局 P0 优化完成 (性能口径统一、版本标识新增、缺材料标准化结构)
|
| 2 |
-
- [x] 统一的 `EvidenceChain` 证据链结构已在模型与输出逻辑中生效
|
| 3 |
-
- [x] AGENT-01 P0 优化完成 (来源元数据、监管强制等级分类、适用性分析判断)
|
| 4 |
-
- [x] AGENT-02 P0 优化完成 (片段级证据定位、规则引用依据、全稿交付级输出、覆盖率检查表)
|
| 5 |
-
- [x] AGENT-03 P0 优化完成 (输出明确的法规链ID、显式定义风险规则、严格固化总结论模板)
|
| 6 |
-
- [x] AGENT-04 P0 优化完成 (三层视图输出、带优先级标签的重点关注项、结构化固化的审核包)
|
| 7 |
-
- [x] 回放测试框架搭建完毕,且支持精细化耗时和模型版本等核心记录维度
|
| 8 |
-
- [x] 12个核心测试用例 (TC-01 至 TC-12) 全部录入回归测试矩阵,并能够稳定执行验证
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/optimize-compliance-agents-p0/spec.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
| 1 |
-
# 隐私合规智能体全量优化与测试矩阵扩展 Spec
|
| 2 |
-
|
| 3 |
-
## Why
|
| 4 |
-
目前 4 个隐私合规智能体已完成工程链路打通并验证了初步的 AI 认知能力。但为了进入真实业务联调与客户内测,必须将智能体从“聪明”升级为“可交付、可审计、稳定输出”。这需要通过引入细粒度的证据链(Evidence/Basis)、显式化规则、版本控制,并建立包含 12 个分层维度的全面回放测试框架(Regression Testing)来保障稳定性。
|
| 5 |
-
|
| 6 |
-
## What Changes
|
| 7 |
-
- [全局] 统一性能统计口径、统一证据链结构、缺材料清单标准化、增加结果版本标识、建立回放测试框架。
|
| 8 |
-
- [AGENT-01] 增加变化来源元数据、分类、监管强制等级及适用性判断。
|
| 9 |
-
- [AGENT-02] 升级证据为片段级、增加 basis_refs、分类 uncertain_items、升级 redline_seed 为完整交付前稿及 coverage checklist。
|
| 10 |
-
- [AGENT-03] 前置规则引擎检查、输出 basis_id、风险等级规则显式化、控制待法务确认数量及结论模板固定。
|
| 11 |
-
- [AGENT-04] 审核建议规则化、输出三层视图(legal_review_pack, executive_summary, delivery_summary)、增加优先级标签、细化 references、固定审核包结构。
|
| 12 |
-
- [测试层] 构建包含 12 个维度的分层测试矩阵(TC-01 至 TC-12),并统一定义测试用例记录字段。
|
| 13 |
-
|
| 14 |
-
## Impact
|
| 15 |
-
- Affected specs: 智能体接口输出结构(JSON Schemas)、Prompt 定义、测试脚本链路。
|
| 16 |
-
- Affected code: `src/models/index.ts`, `src/schemas/*.json`, `src/llm.ts`, `test.ts` 或新建回归测试文件。
|
| 17 |
-
|
| 18 |
-
## ADDED Requirements
|
| 19 |
-
### Requirement: P0 全局优化与证据链
|
| 20 |
-
The system SHALL 为所有高/中风险项输出统一证据链:`source_type`、`doc_name`、`section`、`excerpt`、`basis_ref`。
|
| 21 |
-
The system SHALL 在所有响应中包含版本信息:`schema_version`、`agent_version`、`prompt_version`、`model_version`。
|
| 22 |
-
|
| 23 |
-
### Requirement: 智能体角色精细化
|
| 24 |
-
The system SHALL 提升 AGENT-02 的证据粒度至文档片段级。
|
| 25 |
-
The system SHALL 使 AGENT-04 根据明确的规则阈值输出审核建议(suggest_approve / reject / more_material),并按 P0/P1/P2 进行优先级排序。
|
| 26 |
-
|
| 27 |
-
### Requirement: 分层回归测试矩阵
|
| 28 |
-
The system SHALL 提供 12 个标准测试用例集(明显漏洞、轻微漏洞、缺材料等),并能够自动记录端到端耗时及准确率指标。
|
| 29 |
-
|
| 30 |
-
#### Scenario: 缺材料拦截测试 (TC-05)
|
| 31 |
-
- **WHEN** 测试用例缺失 PRD 传入系统
|
| 32 |
-
- **THEN** AGENT-02 触发 `need_more_material`,返回标准化缺材料清单。
|
| 33 |
-
|
| 34 |
-
## MODIFIED Requirements
|
| 35 |
-
### Requirement: 输出结论管控
|
| 36 |
-
修改 AGENT-03 和 AGENT-04 的输出逻辑,严禁自由发挥结论,必须使用固定的结论模板和显式的风险判定规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/optimize-compliance-agents-p0/tasks.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 1 |
-
# Tasks
|
| 2 |
-
|
| 3 |
-
- [x] Task 1: P0 全局模型优化与基础架构升级
|
| 4 |
-
- [x] SubTask 1.1: 更新 `CaseContext` 和通用响应模型,增加 `schema_version`, `model_version` 等版本字段
|
| 5 |
-
- [x] SubTask 1.2: 统一定义并实现高/中风险项的 `EvidenceChain` 证据链结构
|
| 6 |
-
- [x] SubTask 1.3: 统一 `need_more_material` 错误返回的标准化结构(区分必填/可选/条件必填)
|
| 7 |
-
- [x] SubTask 1.4: 升级 `requestLogger` 中间件,精确拆分和记录 API耗时、LLM耗时及重试耗时
|
| 8 |
-
|
| 9 |
-
- [x] Task 2: AGENT-01 P0 优化 (同业/监管变化摘要)
|
| 10 |
-
- [x] SubTask 2.1: 修改 Schema 和 Prompt,增加变化来源元数据 (机构/日期/链接等)
|
| 11 |
-
- [x] SubTask 2.2: 增加变化类型分类和 `requirement_level` (强制/推荐/参考)
|
| 12 |
-
- [x] SubTask 2.3: 增加 `applicability_reason` (适用性判断)
|
| 13 |
-
|
| 14 |
-
- [x] Task 3: AGENT-02 P0 优化 (协议重构)
|
| 15 |
-
- [x] SubTask 3.1: 修改 Schema 和 Prompt,将 `evidence` 升级为片段级定位
|
| 16 |
-
- [x] SubTask 3.2: `rewrite_suggestions` 增加 `basis_refs`,分类 `uncertain_items`
|
| 17 |
-
- [x] SubTask 3.3: 升级 `redline_seed` 为 `full_revised_draft`、`change_summary` 及 `redline_changes`
|
| 18 |
-
- [x] SubTask 3.4: 增加 `coverage_checklist` 输出
|
| 19 |
-
|
| 20 |
-
- [x] Task 4: AGENT-03 P0 优化 (合规校验)
|
| 21 |
-
- [x] SubTask 4.1: 修改 Schema 和 Prompt,每个 gap 输出具体的 `basis_id`
|
| 22 |
-
- [x] SubTask 4.2: 风险等级判定和 `conclusion` 输出显式化与模板化
|
| 23 |
-
- [x] SubTask 4.3: 引入前置轻量级规则引擎校验机制(代码层面或明确Prompt规则约束待确认数量)
|
| 24 |
-
|
| 25 |
-
- [x] Task 5: AGENT-04 P0 优化 (法务审核包生成)
|
| 26 |
-
- [x] SubTask 5.1: 修改 Schema 和 Prompt,输出三层视图 (legal_review_pack, executive_summary, delivery_summary)
|
| 27 |
-
- [x] SubTask 5.2: 为 `focus_items` 增加 P0/P1/P2 优先级标签,细化 `references`
|
| 28 |
-
- [x] SubTask 5.3: `review_recommendation` 判定规则化并固定审核包最终结构
|
| 29 |
-
|
| 30 |
-
- [x] Task 6: 建立分层回归测试矩阵 (12个核心用例)
|
| 31 |
-
- [x] SubTask 6.1: 搭建回放测试脚本框架 (`regression.ts`),定义日志输出字段结构
|
| 32 |
-
- [x] SubTask 6.2: 编写 TC-01 至 TC-04 (漏洞与合规测试) 的 Mock 数据
|
| 33 |
-
- [x] SubTask 6.3: 编写 TC-05 至 TC-07 (缺失/冲突/不全测试) 的 Mock 数据
|
| 34 |
-
- [x] SubTask 6.4: 编写 TC-08 至 TC-12 (敏感数据/未成年人/跨境/长文本/历史版本测试) 的 Mock 数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.trae/specs/optimize-compliance-agents-p0/搜索资料.md
DELETED
|
@@ -1,1070 +0,0 @@
|
|
| 1 |
-
同业/监管抓取子系统 SPEC(V1.0)
|
| 2 |
-
1. 目标
|
| 3 |
-
|
| 4 |
-
构建一个独立于 4 个角色智能体之外的 抓取与检索子系统,负责:
|
| 5 |
-
|
| 6 |
-
从白名单来源定时抓取同业隐私协议、监管通报、SDK 隐私规则
|
| 7 |
-
对页面做正文抽取、版本去重、条款切片、变更比对
|
| 8 |
-
将结果入库为结构化对象
|
| 9 |
-
向 AGENT-01 提供稳定的 peer_updates / regulatory_updates / sdk_updates 输入
|
| 10 |
-
2. 范围
|
| 11 |
-
In Scope
|
| 12 |
-
白名单来源管理
|
| 13 |
-
定时抓取
|
| 14 |
-
页面正文抽取
|
| 15 |
-
版本比对
|
| 16 |
-
条款切片与主题标注
|
| 17 |
-
结构化入库
|
| 18 |
-
向 AGENT-01 提供检索结果接口
|
| 19 |
-
Out of Scope
|
| 20 |
-
全网自动发现
|
| 21 |
-
自动发布线上协议
|
| 22 |
-
法务审批逻辑
|
| 23 |
-
客户材料解析
|
| 24 |
-
协议重构/合规校验/审核包生成
|
| 25 |
-
3. 设计原则
|
| 26 |
-
原则 1:先白名单,后扩站
|
| 27 |
-
|
| 28 |
-
第一阶段仅抓指定官方来源。
|
| 29 |
-
|
| 30 |
-
原则 2:先版本化,再摘要
|
| 31 |
-
|
| 32 |
-
先保留快照和版本 diff,再让 AGENT-01 归纳。
|
| 33 |
-
|
| 34 |
-
原则 3:条款级入库,不只存全文
|
| 35 |
-
|
| 36 |
-
后续重构、校验、审核都需要精确回链到条款。
|
| 37 |
-
|
| 38 |
-
原则 4:抓取层不做法律结论
|
| 39 |
-
|
| 40 |
-
抓取层只负责“找、抽、比”,不做合规判断。
|
| 41 |
-
|
| 42 |
-
4. 来源白名单(首批种子列表)
|
| 43 |
-
|
| 44 |
-
下面这批来源都可作为首批白名单种子。银行侧优先选择手机银行/电子银行/零售 App 隐私政策页;监管侧优先选择网信、金监总局、人民银行相关规则/通报页;SDK 侧优先选择客户实际接入 SDK 的官方隐私/合规页。这些页面当前可公开访问,并且正文中明确涉及个人信息、手机银行、电子银行、SDK 披露或 App 个人信息收集使用要求。
|
| 45 |
-
|
| 46 |
-
4.1 头部银行官网 / App 隐私协议页(首批白名单)
|
| 47 |
-
中国工商银行(工银融e行个人信息保护政策)
|
| 48 |
-
https://m.icbc.com.cn/ICBC/disclaimer/2.htm
|
| 49 |
-
|
| 50 |
-
中国银行(手机银行隐私政策)
|
| 51 |
-
https://ebsnew.boc.cn/bocphone/VuePhone/tools/privacyPolicy/privacyPolicyA.html
|
| 52 |
-
|
| 53 |
-
中国建设银行(隐私协议)
|
| 54 |
-
https://ccb.com/chn/mycom/register_xy_secret.shtml
|
| 55 |
-
|
| 56 |
-
中国农业银行(隐私政策(个人版))
|
| 57 |
-
https://www.abchina.com/cn/personalservices/grzsc/201905/t20190521_1835654.htm
|
| 58 |
-
|
| 59 |
-
交通银行(个人手机银行和个人网上银行隐私政策)
|
| 60 |
-
https://cftweb.3g.qq.com/privacy/privacyPolicy?content_id=2aa4ef302078fdf9fd868e776415a5ee
|
| 61 |
-
|
| 62 |
-
中国邮政储蓄银行(电子银行隐私政策)
|
| 63 |
-
https://www.psbc.com/cn/grfw/fwgg/202302/t20230216_194017.html
|
| 64 |
-
|
| 65 |
-
招商银行(零售业务与App用户隐私政策)
|
| 66 |
-
https://market.cmbchina.com/MPage/online/190717190011375/privacy.htm
|
| 67 |
-
4.2 监管官网 / 通报页(首批白名单)
|
| 68 |
-
国家互联网信息办公室:互联网应用程序个人信息收集使用规定(征求意见稿)
|
| 69 |
-
https://www.cac.gov.cn/2026-01/10/c_1769603446094128.htm
|
| 70 |
-
|
| 71 |
-
国家互联网信息办公室:关于15款App和16款SDK个人信息收集使用问题的通报
|
| 72 |
-
https://www.cac.gov.cn/2025-05/06/c_1748239411359045.htm
|
| 73 |
-
|
| 74 |
-
国家互联网信息办公室:网络数据安全管理条例
|
| 75 |
-
https://www.cac.gov.cn/2024-09/30/c_1729384452307680.htm
|
| 76 |
-
|
| 77 |
-
国家金融监督管理总局:银行保险机构数据安全管理办法
|
| 78 |
-
https://www.nfra.gov.cn/cn/view/pages/ItemDetail.html?docId=1192308&generaltype=0&itemId=926
|
| 79 |
-
|
| 80 |
-
国家金融监督管理总局:银行保险机构消费者权益保护管理办法
|
| 81 |
-
https://www.nfra.gov.cn/cn/view/pages/rulesDetail.html?docId=1087524
|
| 82 |
-
|
| 83 |
-
中国人民银行金融标准全文公开系统:个人金融信息保护技术规范(JR/T 0171—2020)
|
| 84 |
-
https://cfstc.pbc.gov.cn/bzgk/detail/?bzId=1856&id=0
|
| 85 |
-
4.3 第三方 SDK 官方隐私政策 / 合规页(首批白名单)
|
| 86 |
-
|
| 87 |
-
这些 SDK 页面都来自官方文档或官方政策页,可作为 SDK 披露和合规比对的种子来源;但真正上线时应以客户实际接入的 SDK 清单为准,不要一开始抓太多无关 SDK。
|
| 88 |
-
|
| 89 |
-
极光 SDK 产品合规指引说明
|
| 90 |
-
https://docs.jiguang.cn/compliance_guide/sdk_compliance_guide/sdk_compliance_guide
|
| 91 |
-
|
| 92 |
-
友盟+ 隐私政策
|
| 93 |
-
https://www.umeng.com/policy
|
| 94 |
-
|
| 95 |
-
腾讯 Bugly 开发者合规指南
|
| 96 |
-
https://bugly.qq.com/docs/user-guide/instruction-manual-privacy/
|
| 97 |
-
|
| 98 |
-
腾讯云 号码认证 SDK 个人信息保护规则
|
| 99 |
-
https://cloud.tencent.com/document/product/1415/65372
|
| 100 |
-
5. 来源注册表结构
|
| 101 |
-
|
| 102 |
-
抓取不要硬编码 URL,必须有一个 source_registry。
|
| 103 |
-
|
| 104 |
-
source_registry 字段建议
|
| 105 |
-
{
|
| 106 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 107 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 108 |
-
"source_type": "peer_bank",
|
| 109 |
-
"domain": "ebsnew.boc.cn",
|
| 110 |
-
"entry_url": "https://ebsnew.boc.cn/bocphone/VuePhone/tools/privacyPolicy/privacyPolicyA.html",
|
| 111 |
-
"url_pattern": "privacyPolicy",
|
| 112 |
-
"parser_type": "html_main_content",
|
| 113 |
-
"crawl_frequency": "daily",
|
| 114 |
-
"priority": "high",
|
| 115 |
-
"enabled": true,
|
| 116 |
-
"topic_tags": ["mobile_banking", "privacy_policy", "sdk_disclosure"],
|
| 117 |
-
"owner": "crawler_system"
|
| 118 |
-
}
|
| 119 |
-
source_type 枚举
|
| 120 |
-
peer_bank
|
| 121 |
-
regulator
|
| 122 |
-
sdk_vendor
|
| 123 |
-
6. 抓取频率
|
| 124 |
-
6.1 推荐频率
|
| 125 |
-
A. 头部银行隐私协议页
|
| 126 |
-
频率:每日 1 次
|
| 127 |
-
原因:变更不高频,但一旦更新影响大
|
| 128 |
-
B. 监管通报 / 新规栏目
|
| 129 |
-
频率:每 4 小时 1 次
|
| 130 |
-
原因:监管通报有时效性,尤其是 App / SDK 问题通报
|
| 131 |
-
C. SDK 官方隐私 / 合规页
|
| 132 |
-
频率:每日 1 次
|
| 133 |
-
原因:变更频率通常低于监管通报,但需要跟踪版本更新
|
| 134 |
-
6.2 失败重试
|
| 135 |
-
单次抓取失败:10 分钟后重试 1 次
|
| 136 |
-
连续失败 3 次:标记 source_status = degraded
|
| 137 |
-
连续失败 7 天:进入人工检查队列
|
| 138 |
-
7. 抓取流程
|
| 139 |
-
Schedule Trigger / 外部触发
|
| 140 |
-
→ 读取 source_registry
|
| 141 |
-
→ 下载页面 / 文档
|
| 142 |
-
→ 正文抽取
|
| 143 |
-
→ 文本标准化
|
| 144 |
-
→ 版本去重
|
| 145 |
-
→ 条款切片
|
| 146 |
-
→ 主题标注
|
| 147 |
-
→ 版本比对
|
| 148 |
-
→ 写入 structured store
|
| 149 |
-
→ 供 AGENT-01 检索调用
|
| 150 |
-
8. 页面正文抽取规则
|
| 151 |
-
8.1 HTML 页面
|
| 152 |
-
|
| 153 |
-
优先抽取:
|
| 154 |
-
|
| 155 |
-
标题
|
| 156 |
-
更新时间 / 生效时间
|
| 157 |
-
正文正文区
|
| 158 |
-
章节标题
|
| 159 |
-
表格内容
|
| 160 |
-
附件链接
|
| 161 |
-
|
| 162 |
-
过滤掉:
|
| 163 |
-
|
| 164 |
-
导航
|
| 165 |
-
页脚
|
| 166 |
-
分享按钮
|
| 167 |
-
推荐阅读
|
| 168 |
-
评论区
|
| 169 |
-
JS 渲染无关内容
|
| 170 |
-
8.2 PDF / DOC / 附件
|
| 171 |
-
保留原文件快照
|
| 172 |
-
OCR 仅作为兜底
|
| 173 |
-
优先抽取目录、章节标题、条款编号、正文段落
|
| 174 |
-
8.3 标准化规则
|
| 175 |
-
|
| 176 |
-
统一做:
|
| 177 |
-
|
| 178 |
-
全角半角清洗
|
| 179 |
-
空白折叠
|
| 180 |
-
HTML 标签移除
|
| 181 |
-
章节编号识别
|
| 182 |
-
日期标准化
|
| 183 |
-
9. 版本比对策略
|
| 184 |
-
9.1 去重层
|
| 185 |
-
|
| 186 |
-
使用:
|
| 187 |
-
|
| 188 |
-
content_hash
|
| 189 |
-
normalized_hash
|
| 190 |
-
|
| 191 |
-
如果 hash 不变,则不入新版本。
|
| 192 |
-
|
| 193 |
-
9.2 比对层
|
| 194 |
-
|
| 195 |
-
按两级做 diff:
|
| 196 |
-
|
| 197 |
-
文档级 diff
|
| 198 |
-
|
| 199 |
-
判断是否新版本、是否正文发生变化。
|
| 200 |
-
|
| 201 |
-
条款级 diff
|
| 202 |
-
|
| 203 |
-
对章节 / 条款切片做:
|
| 204 |
-
|
| 205 |
-
新增
|
| 206 |
-
删除
|
| 207 |
-
修改
|
| 208 |
-
9.3 变更事件输出
|
| 209 |
-
{
|
| 210 |
-
"event_id": "evt_001",
|
| 211 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 212 |
-
"doc_version_from": "2026-03-01",
|
| 213 |
-
"doc_version_to": "2026-03-29",
|
| 214 |
-
"changed_sections": [
|
| 215 |
-
{
|
| 216 |
-
"section_title": "第三方SDK信息",
|
| 217 |
-
"change_type": "modified",
|
| 218 |
-
"old_excerpt": "...",
|
| 219 |
-
"new_excerpt": "..."
|
| 220 |
-
}
|
| 221 |
-
],
|
| 222 |
-
"topic_tags": ["sdk_disclosure"],
|
| 223 |
-
"impact_level": "high",
|
| 224 |
-
"detected_at": "2026-04-23T06:00:00Z"
|
| 225 |
-
}
|
| 226 |
-
9.4 主题标签建议
|
| 227 |
-
permission_usage
|
| 228 |
-
sdk_disclosure
|
| 229 |
-
sensitive_personal_info
|
| 230 |
-
minor_protection
|
| 231 |
-
data_retention
|
| 232 |
-
third_party_sharing
|
| 233 |
-
cross_border_transfer
|
| 234 |
-
user_rights
|
| 235 |
-
biometric_info
|
| 236 |
-
10. 入库结构
|
| 237 |
-
|
| 238 |
-
建议至少拆 5 张表 / 5 类对象。
|
| 239 |
-
|
| 240 |
-
10.1 raw_snapshot
|
| 241 |
-
|
| 242 |
-
存原始抓取快照
|
| 243 |
-
|
| 244 |
-
{
|
| 245 |
-
"snapshot_id": "snap_001",
|
| 246 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 247 |
-
"fetched_at": "2026-04-23T06:00:00Z",
|
| 248 |
-
"content_type": "text/html",
|
| 249 |
-
"raw_body": "...",
|
| 250 |
-
"raw_hash": "..."
|
| 251 |
-
}
|
| 252 |
-
10.2 normalized_document
|
| 253 |
-
|
| 254 |
-
存标准化后的整文
|
| 255 |
-
|
| 256 |
-
{
|
| 257 |
-
"doc_id": "doc_001",
|
| 258 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 259 |
-
"version_date": "2026-03-29",
|
| 260 |
-
"title": "中国银行股份有限公司手机银行隐私政策",
|
| 261 |
-
"normalized_text": "...",
|
| 262 |
-
"normalized_hash": "...",
|
| 263 |
-
"effective_date": "2026-03-29"
|
| 264 |
-
}
|
| 265 |
-
10.3 clause_chunk
|
| 266 |
-
|
| 267 |
-
按条款切片入库
|
| 268 |
-
|
| 269 |
-
{
|
| 270 |
-
"chunk_id": "chunk_001",
|
| 271 |
-
"doc_id": "doc_001",
|
| 272 |
-
"section_title": "一、我行如何收集和使用您的个人信息",
|
| 273 |
-
"clause_text": "...",
|
| 274 |
-
"topic_tags": ["sdk_disclosure", "permission_usage"],
|
| 275 |
-
"embedding_status": "ready"
|
| 276 |
-
}
|
| 277 |
-
10.4 diff_event
|
| 278 |
-
|
| 279 |
-
存版本变化事件
|
| 280 |
-
见上文 schema。
|
| 281 |
-
|
| 282 |
-
10.5 source_registry
|
| 283 |
-
|
| 284 |
-
存来源注册表
|
| 285 |
-
见上文 schema。
|
| 286 |
-
|
| 287 |
-
11. 与 AGENT-01 的接口
|
| 288 |
-
|
| 289 |
-
你现有 SPEC 里,AGENT-01 输入是:
|
| 290 |
-
|
| 291 |
-
peer_updates
|
| 292 |
-
regulatory_updates
|
| 293 |
-
它负责输出摘要、参考条款、风险提醒。
|
| 294 |
-
|
| 295 |
-
所以抓取子系统对 AGENT-01 的最优接口不是给“全文”,而是给结构化变化包。
|
| 296 |
-
|
| 297 |
-
API-01 获取变化包
|
| 298 |
-
|
| 299 |
-
GET /api/crawler/updates?app_name=xxx&business_line=retail&topics=sdk_disclosure,permission_usage
|
| 300 |
-
|
| 301 |
-
response
|
| 302 |
-
{
|
| 303 |
-
"peer_updates": [
|
| 304 |
-
{
|
| 305 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 306 |
-
"source_type": "peer_bank",
|
| 307 |
-
"version_date": "2026-03-29",
|
| 308 |
-
"topic_tags": ["sdk_disclosure"],
|
| 309 |
-
"changed_sections": [
|
| 310 |
-
{
|
| 311 |
-
"section_title": "第三方SDK信息",
|
| 312 |
-
"change_type": "modified",
|
| 313 |
-
"excerpt": "..."
|
| 314 |
-
}
|
| 315 |
-
]
|
| 316 |
-
}
|
| 317 |
-
],
|
| 318 |
-
"regulatory_updates": [
|
| 319 |
-
{
|
| 320 |
-
"source_name": "关于15款App和16款SDK个人信息收集使用问题的通报",
|
| 321 |
-
"source_type": "regulator",
|
| 322 |
-
"version_date": "2025-05-06",
|
| 323 |
-
"topic_tags": ["sdk_disclosure"],
|
| 324 |
-
"changed_sections": [
|
| 325 |
-
{
|
| 326 |
-
"section_title": "SDK收集使用个人信息问题",
|
| 327 |
-
"change_type": "new",
|
| 328 |
-
"excerpt": "未逐一列出收集使用个人信息的SDK..."
|
| 329 |
-
}
|
| 330 |
-
]
|
| 331 |
-
}
|
| 332 |
-
],
|
| 333 |
-
"sdk_updates": [
|
| 334 |
-
{
|
| 335 |
-
"source_name": "极光 SDK 产品合规指引说明",
|
| 336 |
-
"source_type": "sdk_vendor",
|
| 337 |
-
"version_date": "2023-11-23",
|
| 338 |
-
"topic_tags": ["sdk_disclosure", "init_after_consent"],
|
| 339 |
-
"changed_sections": [
|
| 340 |
-
{
|
| 341 |
-
"section_title": "合规使用三步走",
|
| 342 |
-
"change_type": "current_reference",
|
| 343 |
-
"excerpt": "请务必在用户同意《隐私政策》之后,再初始化SDK。"
|
| 344 |
-
}
|
| 345 |
-
]
|
| 346 |
-
}
|
| 347 |
-
]
|
| 348 |
-
}
|
| 349 |
-
AGENT-01 升级后的职责
|
| 350 |
-
|
| 351 |
-
从“摘要器”升级成:
|
| 352 |
-
|
| 353 |
-
检索增强型同业/监管条款摘要智能体
|
| 354 |
-
|
| 355 |
-
它仍然不负责抓取,只负责:
|
| 356 |
-
|
| 357 |
-
消费结构化变化包
|
| 358 |
-
输出 peer_summary / reg_summary
|
| 359 |
-
输出 reference_clauses
|
| 360 |
-
输出 risk_alerts
|
| 361 |
-
12. 推荐的 Dify 接入方式
|
| 362 |
-
Workflow A:抓取更新流
|
| 363 |
-
Schedule Trigger
|
| 364 |
-
HTTP Request 调抓取子系统
|
| 365 |
-
HTTP Request 调 AGENT-01
|
| 366 |
-
Template 生成变化摘要
|
| 367 |
-
写入样本库 / 消息中心
|
| 368 |
-
Workflow B:客户重构主流程
|
| 369 |
-
在主流程里先调 GET /api/crawler/updates
|
| 370 |
-
再把结果喂给 AGENT-01 / AGENT-02 / AGENT-03 / AGENT-04
|
| 371 |
-
13. 阶段策略
|
| 372 |
-
Phase 1:白名单抓取
|
| 373 |
-
只抓指定官方来源
|
| 374 |
-
目标 10~20 个来源
|
| 375 |
-
先保证稳定和可审计
|
| 376 |
-
Phase 2:候选来源池
|
| 377 |
-
人工录入新来源
|
| 378 |
-
系统可推荐候选来源
|
| 379 |
-
但必须人工审核入白名单
|
| 380 |
-
Phase 3:有限自动发现
|
| 381 |
-
仅在指定域名集合、指定页面类型、指定关键词下扩展
|
| 382 |
-
不做开放式全网自由抓取
|
| 383 |
-
14. 验收标准
|
| 384 |
-
AC-01 来源抓取
|
| 385 |
-
|
| 386 |
-
给定白名单来源
|
| 387 |
-
当定时任务触发
|
| 388 |
-
则系统能抓取正文并生成快照
|
| 389 |
-
|
| 390 |
-
AC-02 版本去重
|
| 391 |
-
|
| 392 |
-
给定正文无变化
|
| 393 |
-
当再次抓取
|
| 394 |
-
则不生成新版本
|
| 395 |
-
|
| 396 |
-
AC-03 条款切片
|
| 397 |
-
|
| 398 |
-
给定一份隐私政策正文
|
| 399 |
-
当解析完成
|
| 400 |
-
则可生成章节/条款级 chunk
|
| 401 |
-
|
| 402 |
-
AC-04 版本比对
|
| 403 |
-
|
| 404 |
-
给定新旧两个版本
|
| 405 |
-
当执行 diff
|
| 406 |
-
则输出 changed_sections 与 topic_tags
|
| 407 |
-
|
| 408 |
-
AC-05 AGENT-01 接口
|
| 409 |
-
|
| 410 |
-
给定变化包
|
| 411 |
-
当 AGENT-01 调用
|
| 412 |
-
则返回摘要、参考条款和风险提醒
|
| 413 |
-
|
| 414 |
-
AC-06 审计可追溯
|
| 415 |
-
|
| 416 |
-
任一风险提醒项
|
| 417 |
-
必须能回链到:
|
| 418 |
-
|
| 419 |
-
来源站点
|
| 420 |
-
版本日期
|
| 421 |
-
原文条款片段
|
| 422 |
-
最后建议
|
| 423 |
-
|
| 424 |
-
你现在最该做的不是“让 AGENT-01 自己去搜”,而是:
|
| 425 |
-
|
| 426 |
-
新增一个抓取子系统,把“找”和“抽”做稳定;AGENT-01 继续专注于“筛、归类、摘要”。
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
《AGENT-00 / 抓取子系统:接口定义 + 数据表结构 + 与 AGENT-01 的输入契约》
|
| 430 |
-
|
| 431 |
-
版本:V1.0
|
| 432 |
-
状态:研发开工版
|
| 433 |
-
适用范围:同业/监管/SDK 条款抓取、版本比对、结构化入库、向 AGENT-01 供数
|
| 434 |
-
|
| 435 |
-
1. 目标
|
| 436 |
-
|
| 437 |
-
构建一个独立于 4 个角色智能体之外的抓取子系统,负责:
|
| 438 |
-
|
| 439 |
-
从白名单来源抓取同业隐私协议、监管规则/通报、SDK 官方隐私政策
|
| 440 |
-
抽取正文并保留原始快照
|
| 441 |
-
做版本去重与条款级 diff
|
| 442 |
-
产出结构化的 peer_updates / regulatory_updates / sdk_updates
|
| 443 |
-
为 AGENT-01 提供稳定、可审计、可追溯的输入
|
| 444 |
-
2. 非目标
|
| 445 |
-
不做客户协议重构
|
| 446 |
-
不做合规结论判断
|
| 447 |
-
不做法务审核建议
|
| 448 |
-
不做桌面端文件处理
|
| 449 |
-
不做开放式全网自由爬取
|
| 450 |
-
不直接把抓取结果给终端用户展示为最终结论
|
| 451 |
-
3. 系统定位
|
| 452 |
-
3.1 定位
|
| 453 |
-
|
| 454 |
-
AGENT-00 是 抓取与检索服务,不是与 AGENT-01~04 同级的业务判断智能体。
|
| 455 |
-
|
| 456 |
-
3.2 角色关系
|
| 457 |
-
AGENT-00:抓取、抽取、比对、供数
|
| 458 |
-
AGENT-01:变化归纳与风险摘要
|
| 459 |
-
AGENT-02:协议重构
|
| 460 |
-
AGENT-03:合规校验
|
| 461 |
-
AGENT-04:法务审核包生成
|
| 462 |
-
3.3 核心边界
|
| 463 |
-
|
| 464 |
-
AGENT-00 不负责输出:
|
| 465 |
-
|
| 466 |
-
“已合规”
|
| 467 |
-
“建议通过”
|
| 468 |
-
“建议退回”
|
| 469 |
-
“建议补材料”
|
| 470 |
-
|
| 471 |
-
它只负责提供 来源可信、结构化、带版本、带原文片段 的变化数据。
|
| 472 |
-
|
| 473 |
-
4. 总体流程
|
| 474 |
-
source_registry
|
| 475 |
-
→ scheduler
|
| 476 |
-
→ fetcher
|
| 477 |
-
→ content_extractor
|
| 478 |
-
→ normalizer
|
| 479 |
-
→ deduplicator
|
| 480 |
-
→ clause_splitter
|
| 481 |
-
→ topic_tagger
|
| 482 |
-
→ diff_engine
|
| 483 |
-
→ structured_store
|
| 484 |
-
→ update_api
|
| 485 |
-
→ AGENT-01
|
| 486 |
-
5. 模块拆分
|
| 487 |
-
5.1 来源注册表模块
|
| 488 |
-
|
| 489 |
-
负责维护白名单来源。
|
| 490 |
-
|
| 491 |
-
核心字段
|
| 492 |
-
source_id
|
| 493 |
-
source_name
|
| 494 |
-
source_type
|
| 495 |
-
domain
|
| 496 |
-
entry_url
|
| 497 |
-
url_pattern
|
| 498 |
-
parser_type
|
| 499 |
-
crawl_frequency
|
| 500 |
-
priority
|
| 501 |
-
enabled
|
| 502 |
-
topic_tags
|
| 503 |
-
5.2 抓取调度模块
|
| 504 |
-
|
| 505 |
-
负责定时触发抓取任务。
|
| 506 |
-
|
| 507 |
-
触发方式
|
| 508 |
-
cron 定时
|
| 509 |
-
手动触发
|
| 510 |
-
webhook 触发
|
| 511 |
-
5.3 内容抓取模块
|
| 512 |
-
|
| 513 |
-
负责下载页面/文档原文。
|
| 514 |
-
|
| 515 |
-
支持类型
|
| 516 |
-
HTML 页面
|
| 517 |
-
PDF
|
| 518 |
-
DOC / DOCX(可选)
|
| 519 |
-
外链附件
|
| 520 |
-
5.4 正文抽取模块
|
| 521 |
-
|
| 522 |
-
负责把原始页面转成正文。
|
| 523 |
-
|
| 524 |
-
输出
|
| 525 |
-
标题
|
| 526 |
-
正文
|
| 527 |
-
更新时间
|
| 528 |
-
生效时间
|
| 529 |
-
章节结构
|
| 530 |
-
附件链接
|
| 531 |
-
5.5 版本去重模块
|
| 532 |
-
|
| 533 |
-
负责判断是否是新版本。
|
| 534 |
-
|
| 535 |
-
策略
|
| 536 |
-
raw_hash
|
| 537 |
-
normalized_hash
|
| 538 |
-
版本日期
|
| 539 |
-
标题+正文 hash
|
| 540 |
-
5.6 条款切片模块
|
| 541 |
-
|
| 542 |
-
负责把整文拆成可检索的条款片段。
|
| 543 |
-
|
| 544 |
-
切片粒度
|
| 545 |
-
一级章节
|
| 546 |
-
二级章节
|
| 547 |
-
条款段落
|
| 548 |
-
5.7 主题标注模块
|
| 549 |
-
|
| 550 |
-
负责给条款打标签。
|
| 551 |
-
|
| 552 |
-
建议主题标签
|
| 553 |
-
permission_usage
|
| 554 |
-
sdk_disclosure
|
| 555 |
-
sensitive_personal_info
|
| 556 |
-
minor_protection
|
| 557 |
-
data_retention
|
| 558 |
-
third_party_sharing
|
| 559 |
-
cross_border_transfer
|
| 560 |
-
user_rights
|
| 561 |
-
biometric_info
|
| 562 |
-
5.8 版本比对模块
|
| 563 |
-
|
| 564 |
-
负责新旧版本 diff。
|
| 565 |
-
|
| 566 |
-
输出变化类型
|
| 567 |
-
added
|
| 568 |
-
removed
|
| 569 |
-
modified
|
| 570 |
-
unchanged
|
| 571 |
-
5.9 对外供数模块
|
| 572 |
-
|
| 573 |
-
负责向 AGENT-01 / Dify 输出结构化变化包。
|
| 574 |
-
|
| 575 |
-
6. 数据表结构
|
| 576 |
-
|
| 577 |
-
下面按最小可落地版本设计。
|
| 578 |
-
|
| 579 |
-
6.1 source_registry
|
| 580 |
-
|
| 581 |
-
来源注册表
|
| 582 |
-
|
| 583 |
-
字段 类型 说明
|
| 584 |
-
source_id varchar(64) PK 来源唯一 ID
|
| 585 |
-
source_name varchar(255) 来源名称
|
| 586 |
-
source_type varchar(32) peer_bank/regulator/sdk_vendor
|
| 587 |
-
domain varchar(255) 主域名
|
| 588 |
-
entry_url text 入口 URL
|
| 589 |
-
url_pattern text 匹配规则
|
| 590 |
-
parser_type varchar(64) 解析器类型
|
| 591 |
-
crawl_frequency varchar(32) 4h/daily/weekly
|
| 592 |
-
priority varchar(16) high/medium/low
|
| 593 |
-
enabled boolean 是否启用
|
| 594 |
-
topic_tags json 默认主题标签
|
| 595 |
-
created_at timestamp 创建时间
|
| 596 |
-
updated_at timestamp 更新时间
|
| 597 |
-
示例
|
| 598 |
-
{
|
| 599 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 600 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 601 |
-
"source_type": "peer_bank",
|
| 602 |
-
"domain": "ebsnew.boc.cn",
|
| 603 |
-
"entry_url": "https://ebsnew.boc.cn/bocphone/VuePhone/tools/privacyPolicy/privacyPolicyA.html",
|
| 604 |
-
"url_pattern": "privacyPolicy",
|
| 605 |
-
"parser_type": "html_main_content",
|
| 606 |
-
"crawl_frequency": "daily",
|
| 607 |
-
"priority": "high",
|
| 608 |
-
"enabled": true,
|
| 609 |
-
"topic_tags": ["mobile_banking", "privacy_policy", "sdk_disclosure"]
|
| 610 |
-
}
|
| 611 |
-
6.2 crawl_job
|
| 612 |
-
|
| 613 |
-
抓取任务表
|
| 614 |
-
|
| 615 |
-
字段 类型 说明
|
| 616 |
-
job_id varchar(64) PK 抓取任务 ID
|
| 617 |
-
source_id varchar(64) FK 来源 ID
|
| 618 |
-
trigger_type varchar(32) schedule/manual/webhook
|
| 619 |
-
status varchar(32) queued/running/success/failed
|
| 620 |
-
started_at timestamp 开始时间
|
| 621 |
-
ended_at timestamp 结束时间
|
| 622 |
-
error_code varchar(32) 错误码
|
| 623 |
-
error_message text 错误信息
|
| 624 |
-
retry_count int 重试次数
|
| 625 |
-
6.3 raw_snapshot
|
| 626 |
-
|
| 627 |
-
原始快照表
|
| 628 |
-
|
| 629 |
-
字段 类型 说明
|
| 630 |
-
snapshot_id varchar(64) PK 快照 ID
|
| 631 |
-
source_id varchar(64) FK 来源 ID
|
| 632 |
-
job_id varchar(64) FK 抓取任务 ID
|
| 633 |
-
fetched_at timestamp 抓取时间
|
| 634 |
-
content_type varchar(64) text/html/application/pdf
|
| 635 |
-
raw_body longtext 原始内容
|
| 636 |
-
raw_hash varchar(128) 原始 hash
|
| 637 |
-
http_status int HTTP 状态码
|
| 638 |
-
final_url text 最终 URL
|
| 639 |
-
6.4 normalized_document
|
| 640 |
-
|
| 641 |
-
标准化文档表
|
| 642 |
-
|
| 643 |
-
字段 类型 说明
|
| 644 |
-
doc_id varchar(64) PK 文档 ID
|
| 645 |
-
source_id varchar(64) FK 来源 ID
|
| 646 |
-
snapshot_id varchar(64) FK 快照 ID
|
| 647 |
-
title varchar(500) 文档标题
|
| 648 |
-
version_date date 版本日期
|
| 649 |
-
effective_date date 生效日期
|
| 650 |
-
normalized_text longtext 标准化正文
|
| 651 |
-
normalized_hash varchar(128) 标准化 hash
|
| 652 |
-
doc_status varchar(32) active/archived
|
| 653 |
-
created_at timestamp 创建时间
|
| 654 |
-
6.5 clause_chunk
|
| 655 |
-
|
| 656 |
-
条款切片表
|
| 657 |
-
|
| 658 |
-
字段 类型 说明
|
| 659 |
-
chunk_id varchar(64) PK 切片 ID
|
| 660 |
-
doc_id varchar(64) FK 文档 ID
|
| 661 |
-
section_path varchar(500) 章节路径
|
| 662 |
-
section_title varchar(255) 章节标题
|
| 663 |
-
clause_text longtext 条款正文
|
| 664 |
-
topic_tags json 主题标签
|
| 665 |
-
embedding_status varchar(32) pending/ready/failed
|
| 666 |
-
chunk_order int 顺序
|
| 667 |
-
created_at timestamp 创建时间
|
| 668 |
-
6.6 diff_event
|
| 669 |
-
|
| 670 |
-
版本变化事件表
|
| 671 |
-
|
| 672 |
-
字段 类型 说明
|
| 673 |
-
event_id varchar(64) PK 变化事件 ID
|
| 674 |
-
source_id varchar(64) FK 来源 ID
|
| 675 |
-
from_doc_id varchar(64) 旧版本文档 ID
|
| 676 |
-
to_doc_id varchar(64) 新版本文档 ID
|
| 677 |
-
change_type varchar(32) added/removed/modified
|
| 678 |
-
section_title varchar(255) 变化章节
|
| 679 |
-
old_excerpt text 旧片段
|
| 680 |
-
new_excerpt text 新片段
|
| 681 |
-
topic_tags json 标签
|
| 682 |
-
impact_level varchar(16) high/medium/low
|
| 683 |
-
detected_at timestamp 检测时间
|
| 684 |
-
示例
|
| 685 |
-
{
|
| 686 |
-
"event_id": "evt_001",
|
| 687 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 688 |
-
"from_doc_id": "doc_20260301",
|
| 689 |
-
"to_doc_id": "doc_20260329",
|
| 690 |
-
"change_type": "modified",
|
| 691 |
-
"section_title": "第三方SDK信息",
|
| 692 |
-
"old_excerpt": "......",
|
| 693 |
-
"new_excerpt": "......",
|
| 694 |
-
"topic_tags": ["sdk_disclosure"],
|
| 695 |
-
"impact_level": "high",
|
| 696 |
-
"detected_at": "2026-04-23T06:00:00Z"
|
| 697 |
-
}
|
| 698 |
-
7. 接口定义
|
| 699 |
-
API-00-01 新增来源
|
| 700 |
-
|
| 701 |
-
POST /api/crawler/sources
|
| 702 |
-
|
| 703 |
-
request
|
| 704 |
-
{
|
| 705 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 706 |
-
"source_type": "peer_bank",
|
| 707 |
-
"domain": "ebsnew.boc.cn",
|
| 708 |
-
"entry_url": "https://ebsnew.boc.cn/bocphone/VuePhone/tools/privacyPolicy/privacyPolicyA.html",
|
| 709 |
-
"url_pattern": "privacyPolicy",
|
| 710 |
-
"parser_type": "html_main_content",
|
| 711 |
-
"crawl_frequency": "daily",
|
| 712 |
-
"priority": "high",
|
| 713 |
-
"enabled": true,
|
| 714 |
-
"topic_tags": ["privacy_policy", "mobile_banking", "sdk_disclosure"]
|
| 715 |
-
}
|
| 716 |
-
response
|
| 717 |
-
{
|
| 718 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 719 |
-
"success": true
|
| 720 |
-
}
|
| 721 |
-
API-00-02 来源列表
|
| 722 |
-
|
| 723 |
-
GET /api/crawler/sources
|
| 724 |
-
|
| 725 |
-
query
|
| 726 |
-
source_type
|
| 727 |
-
enabled
|
| 728 |
-
priority
|
| 729 |
-
response
|
| 730 |
-
{
|
| 731 |
-
"items": [],
|
| 732 |
-
"total": 10
|
| 733 |
-
}
|
| 734 |
-
API-00-03 手动触发抓取
|
| 735 |
-
|
| 736 |
-
POST /api/crawler/jobs
|
| 737 |
-
|
| 738 |
-
request
|
| 739 |
-
{
|
| 740 |
-
"source_ids": [
|
| 741 |
-
"bank_boc_mobile_privacy",
|
| 742 |
-
"reg_cac_app_notice"
|
| 743 |
-
],
|
| 744 |
-
"trigger_type": "manual"
|
| 745 |
-
}
|
| 746 |
-
response
|
| 747 |
-
{
|
| 748 |
-
"job_ids": ["job_001", "job_002"],
|
| 749 |
-
"status": "queued"
|
| 750 |
-
}
|
| 751 |
-
API-00-04 查询抓取任务
|
| 752 |
-
|
| 753 |
-
GET /api/crawler/jobs/{jobId}
|
| 754 |
-
|
| 755 |
-
response
|
| 756 |
-
{
|
| 757 |
-
"job_id": "job_001",
|
| 758 |
-
"source_id": "bank_boc_mobile_privacy",
|
| 759 |
-
"status": "success",
|
| 760 |
-
"started_at": "2026-04-23T06:00:00Z",
|
| 761 |
-
"ended_at": "2026-04-23T06:00:05Z",
|
| 762 |
-
"error_code": null,
|
| 763 |
-
"retry_count": 0
|
| 764 |
-
}
|
| 765 |
-
API-00-05 查询版本列表
|
| 766 |
-
|
| 767 |
-
GET /api/crawler/documents?source_id=bank_boc_mobile_privacy
|
| 768 |
-
|
| 769 |
-
response
|
| 770 |
-
{
|
| 771 |
-
"items": [
|
| 772 |
-
{
|
| 773 |
-
"doc_id": "doc_20260329",
|
| 774 |
-
"version_date": "2026-03-29",
|
| 775 |
-
"effective_date": "2026-03-29",
|
| 776 |
-
"normalized_hash": "hash_xxx"
|
| 777 |
-
}
|
| 778 |
-
]
|
| 779 |
-
}
|
| 780 |
-
API-00-06 查询变化事件
|
| 781 |
-
|
| 782 |
-
GET /api/crawler/diff-events?source_id=bank_boc_mobile_privacy
|
| 783 |
-
|
| 784 |
-
response
|
| 785 |
-
{
|
| 786 |
-
"items": [
|
| 787 |
-
{
|
| 788 |
-
"event_id": "evt_001",
|
| 789 |
-
"section_title": "第三方SDK信息",
|
| 790 |
-
"change_type": "modified",
|
| 791 |
-
"impact_level": "high",
|
| 792 |
-
"topic_tags": ["sdk_disclosure"]
|
| 793 |
-
}
|
| 794 |
-
]
|
| 795 |
-
}
|
| 796 |
-
API-00-07 获取供 AGENT-01 使用的变化包
|
| 797 |
-
|
| 798 |
-
这是最关键接口。
|
| 799 |
-
|
| 800 |
-
GET /api/crawler/updates
|
| 801 |
-
|
| 802 |
-
query 参数
|
| 803 |
-
app_name
|
| 804 |
-
business_line
|
| 805 |
-
topics(逗号分隔,可选)
|
| 806 |
-
since(可选)
|
| 807 |
-
limit(可选,默认 50)
|
| 808 |
-
response
|
| 809 |
-
{
|
| 810 |
-
"peer_updates": [
|
| 811 |
-
{
|
| 812 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 813 |
-
"source_type": "peer_bank",
|
| 814 |
-
"version_date": "2026-03-29",
|
| 815 |
-
"topic_tags": ["sdk_disclosure"],
|
| 816 |
-
"changed_sections": [
|
| 817 |
-
{
|
| 818 |
-
"section_title": "第三方SDK信息",
|
| 819 |
-
"change_type": "modified",
|
| 820 |
-
"excerpt": "......"
|
| 821 |
-
}
|
| 822 |
-
]
|
| 823 |
-
}
|
| 824 |
-
],
|
| 825 |
-
"regulatory_updates": [
|
| 826 |
-
{
|
| 827 |
-
"source_name": "APP个人信息收集使用问题通报",
|
| 828 |
-
"source_type": "regulator",
|
| 829 |
-
"version_date": "2025-05-06",
|
| 830 |
-
"topic_tags": ["sdk_disclosure", "permission_usage"],
|
| 831 |
-
"changed_sections": [
|
| 832 |
-
{
|
| 833 |
-
"section_title": "SDK问题",
|
| 834 |
-
"change_type": "new",
|
| 835 |
-
"excerpt": "未逐一列出SDK收集使用个人信息情况......"
|
| 836 |
-
}
|
| 837 |
-
]
|
| 838 |
-
}
|
| 839 |
-
],
|
| 840 |
-
"sdk_updates": [
|
| 841 |
-
{
|
| 842 |
-
"source_name": "极光 SDK 合规指引",
|
| 843 |
-
"source_type": "sdk_vendor",
|
| 844 |
-
"version_date": "2023-11-23",
|
| 845 |
-
"topic_tags": ["sdk_disclosure", "init_after_consent"],
|
| 846 |
-
"changed_sections": [
|
| 847 |
-
{
|
| 848 |
-
"section_title": "合规使用三步走",
|
| 849 |
-
"change_type": "current_reference",
|
| 850 |
-
"excerpt": "请务必在用户同意《隐私政策》之后,再初始化SDK。"
|
| 851 |
-
}
|
| 852 |
-
]
|
| 853 |
-
}
|
| 854 |
-
]
|
| 855 |
-
}
|
| 856 |
-
8. 与 AGENT-01 的输入契约
|
| 857 |
-
|
| 858 |
-
你现在的主链路里,AGENT-01 吃的是:
|
| 859 |
-
|
| 860 |
-
peer_updates
|
| 861 |
-
regulatory_updates
|
| 862 |
-
|
| 863 |
-
然后输出:
|
| 864 |
-
|
| 865 |
-
peer_summary
|
| 866 |
-
reg_summary
|
| 867 |
-
reference_clauses
|
| 868 |
-
risk_alerts
|
| 869 |
-
|
| 870 |
-
所以 AGENT-00 对 AGENT-01 的最优输入契约如下。
|
| 871 |
-
|
| 872 |
-
8.1 输入字段定义
|
| 873 |
-
peer_updates[].source_name
|
| 874 |
-
|
| 875 |
-
来源名称
|
| 876 |
-
|
| 877 |
-
peer_updates[].source_type
|
| 878 |
-
|
| 879 |
-
固定值:peer_bank
|
| 880 |
-
|
| 881 |
-
peer_updates[].version_date
|
| 882 |
-
|
| 883 |
-
版本日期
|
| 884 |
-
|
| 885 |
-
peer_updates[].topic_tags
|
| 886 |
-
|
| 887 |
-
变化标签
|
| 888 |
-
|
| 889 |
-
peer_updates[].changed_sections[]
|
| 890 |
-
|
| 891 |
-
变化章节数组
|
| 892 |
-
|
| 893 |
-
变化章节字段
|
| 894 |
-
section_title
|
| 895 |
-
change_type
|
| 896 |
-
excerpt
|
| 897 |
-
|
| 898 |
-
监管和 SDK 更新结构完全相同,只是 source_type 不同。
|
| 899 |
-
|
| 900 |
-
8.2 AGENT-01 输入契约对象
|
| 901 |
-
{
|
| 902 |
-
"peer_updates": [],
|
| 903 |
-
"regulatory_updates": [],
|
| 904 |
-
"sdk_updates": [],
|
| 905 |
-
"app_name": "手机银行APP",
|
| 906 |
-
"business_line": "retail"
|
| 907 |
-
}
|
| 908 |
-
8.3 AGENT-01 输出建议升级
|
| 909 |
-
|
| 910 |
-
建议把你现有 PeerRegSummary 升级成下面结构:
|
| 911 |
-
|
| 912 |
-
{
|
| 913 |
-
"insufficient_context": false,
|
| 914 |
-
"peer_summary": "......",
|
| 915 |
-
"reg_summary": "......",
|
| 916 |
-
"mandatory_requirements": [
|
| 917 |
-
"第三方SDK应逐一披露用途与处理信息类型"
|
| 918 |
-
],
|
| 919 |
-
"peer_best_practices": [
|
| 920 |
-
"头部银行普遍将权限用途绑定到具体业务场景"
|
| 921 |
-
],
|
| 922 |
-
"reference_clauses": [
|
| 923 |
-
{
|
| 924 |
-
"source_name": "中国银行手机银行隐私政策",
|
| 925 |
-
"source_type": "peer_bank",
|
| 926 |
-
"version_date": "2026-03-29",
|
| 927 |
-
"section_title": "第三方SDK信息",
|
| 928 |
-
"topic": "sdk_disclosure",
|
| 929 |
-
"clause": "......",
|
| 930 |
-
"applicability": "reference"
|
| 931 |
-
}
|
| 932 |
-
],
|
| 933 |
-
"risk_alerts": [
|
| 934 |
-
"第三方SDK用途披露不足"
|
| 935 |
-
],
|
| 936 |
-
"missing_topics": [
|
| 937 |
-
"data_retention"
|
| 938 |
-
]
|
| 939 |
-
}
|
| 940 |
-
为什么要升级
|
| 941 |
-
|
| 942 |
-
因为后面的 AGENT-02 / AGENT-03 不只需要“摘要”,还需要:
|
| 943 |
-
|
| 944 |
-
哪条是监管强制
|
| 945 |
-
哪条是同业参考
|
| 946 |
-
哪条缺失了
|
| 947 |
-
原文在哪
|
| 948 |
-
9. 抓取频率
|
| 949 |
-
9.1 推荐频率
|
| 950 |
-
头部银行隐私协议页
|
| 951 |
-
daily
|
| 952 |
-
监管通报/规则页
|
| 953 |
-
4h
|
| 954 |
-
SDK 官方隐私/合规页
|
| 955 |
-
daily
|
| 956 |
-
9.2 重试规则
|
| 957 |
-
抓取失败:10 分钟后重试 1 次
|
| 958 |
-
连续失败 3 次:标记 degraded
|
| 959 |
-
连续失败 7 天:进入人工检查队列
|
| 960 |
-
10. 版本比对规则
|
| 961 |
-
10.1 去重
|
| 962 |
-
|
| 963 |
-
使用:
|
| 964 |
-
|
| 965 |
-
raw_hash
|
| 966 |
-
normalized_hash
|
| 967 |
-
|
| 968 |
-
二者均未变化则不生成新版本。
|
| 969 |
-
|
| 970 |
-
10.2 diff 粒度
|
| 971 |
-
文档级
|
| 972 |
-
条款级
|
| 973 |
-
10.3 变化分类
|
| 974 |
-
added
|
| 975 |
-
removed
|
| 976 |
-
modified
|
| 977 |
-
10.4 影响等级规则(初版)
|
| 978 |
-
high
|
| 979 |
-
|
| 980 |
-
涉及:
|
| 981 |
-
|
| 982 |
-
SDK 披露
|
| 983 |
-
敏感个人信息
|
| 984 |
-
权限用途
|
| 985 |
-
跨境传输
|
| 986 |
-
未成年人条款
|
| 987 |
-
medium
|
| 988 |
-
|
| 989 |
-
涉及:
|
| 990 |
-
|
| 991 |
-
数据共享表述细化
|
| 992 |
-
用户��利行使方式
|
| 993 |
-
数据保留期限
|
| 994 |
-
low
|
| 995 |
-
|
| 996 |
-
涉及:
|
| 997 |
-
|
| 998 |
-
表述润色
|
| 999 |
-
结构调整
|
| 1000 |
-
非实质性排序变化
|
| 1001 |
-
11. 错误码
|
| 1002 |
-
错误码 含义
|
| 1003 |
-
4001 来源配置缺失
|
| 1004 |
-
4002 URL 非法
|
| 1005 |
-
4003 解析失败
|
| 1006 |
-
4004 无正文内容
|
| 1007 |
-
5001 抓取失败
|
| 1008 |
-
5002 版本比对失败
|
| 1009 |
-
5003 入库失败
|
| 1010 |
-
5004 输出结构化失败
|
| 1011 |
-
12. 验收标准
|
| 1012 |
-
AC-00-01 来源管理
|
| 1013 |
-
|
| 1014 |
-
新增来源后可被定时任务读取。
|
| 1015 |
-
|
| 1016 |
-
AC-00-02 抓取成功
|
| 1017 |
-
|
| 1018 |
-
对启用来源能成功抓取正文并生成原始快照。
|
| 1019 |
-
|
| 1020 |
-
AC-00-03 去重成功
|
| 1021 |
-
|
| 1022 |
-
正文无变化时,不生成新版本。
|
| 1023 |
-
|
| 1024 |
-
AC-00-04 版本变化识别
|
| 1025 |
-
|
| 1026 |
-
正文有变化时,能生成 diff_event。
|
| 1027 |
-
|
| 1028 |
-
AC-00-05 条款切片
|
| 1029 |
-
|
| 1030 |
-
标准化文档可拆成条款级 clause_chunk。
|
| 1031 |
-
|
| 1032 |
-
AC-00-06 AGENT-01 供数
|
| 1033 |
-
|
| 1034 |
-
GET /api/crawler/updates 能返回 peer_updates / regulatory_updates / sdk_updates。
|
| 1035 |
-
|
| 1036 |
-
AC-00-07 可追溯
|
| 1037 |
-
|
| 1038 |
-
任一 risk_alert 最终都能回链到:
|
| 1039 |
-
|
| 1040 |
-
source_name
|
| 1041 |
-
version_date
|
| 1042 |
-
section_title
|
| 1043 |
-
原文 excerpt
|
| 1044 |
-
13. 第一阶段研发建议
|
| 1045 |
-
Sprint 1
|
| 1046 |
-
source_registry
|
| 1047 |
-
crawl_job
|
| 1048 |
-
raw_snapshot
|
| 1049 |
-
手动抓取接口
|
| 1050 |
-
单页面正文抽取
|
| 1051 |
-
Sprint 2
|
| 1052 |
-
normalized_document
|
| 1053 |
-
clause_chunk
|
| 1054 |
-
diff_event
|
| 1055 |
-
GET /api/crawler/updates
|
| 1056 |
-
Sprint 3
|
| 1057 |
-
定时调度
|
| 1058 |
-
重试机制
|
| 1059 |
-
topic tagging
|
| 1060 |
-
与 AGENT-01 联调
|
| 1061 |
-
14. 最终建议
|
| 1062 |
-
|
| 1063 |
-
你现在不要改 AGENT-01 的主职责。
|
| 1064 |
-
最优做法是:
|
| 1065 |
-
|
| 1066 |
-
新增 AGENT-00 / 抓取子系统,让它产出结构化变化包;AGENT-01 继续做“变化归纳与条款摘要”。
|
| 1067 |
-
|
| 1068 |
-
一句话压缩:
|
| 1069 |
-
|
| 1070 |
-
AGENT-00 负责“找、抽、比、存”,AGENT-01 负责“筛、归类、摘要”。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|