本文是架构权威:定位、对象、权限、受众端、自动化、集成、里程碑。改设计先改这里,再改代码。 派发循环(
AGENTS.md→ PM dispatch)把它当作 ADR 目录使用:一个卡片与本文冲突时,本文胜出,或者先在这里落一条修订。思路来源:Ironclad 的四件套 —— Workflow Designer(合同类型即流程)、Launch Form(业务自助发起)、 Playbook(条款立场与偏离)、Repository(合同是结构化数据)—— 落到 ObjectStack 元数据。 签后管理参照 Sirion,可配置性参照 Agiloft。
| 项 | 值 |
|---|---|
| 仓库 | objectstack-ai/hotclm |
| 产品名 | HotCLM —— 与 HotCRM 同一命名法:Hot + 品类缩写,一眼可知是合同全生命周期管理 |
| manifest id | app.objectstack.hotclm |
| namespace / 对象前缀 | clm / clm_(领域前缀,与 hotcrm → crm_ 同例) |
| 显示名 | HotCLM · 合同管理 |
| 协议范围 | engines.protocol '^17',与 @objectstack/spec 同步升级 |
命名核查(2026-09-07):hotclm 在 npm 未被占用,搜索无同名产品。放弃 Open* 前缀:OpenCLM(openclm.ai,AGPL)、OpenContracts、OpenClause、OpenSign 全部已被占用。
曾考虑的 whereas(鉴于条款首词)被否决:看不出是合同管理,且显得随意。备选 contractstack(npm 未占用,无同名产品)。
单企业内部的合同全生命周期管理,法务、财务、合规视角,买卖双边加非交易类合同。 它不是 HotCRM 的模块:合同管理的买家是法务部门,法务不会为了管合同买一套 CRM。
- 业务自助发起,法务是控制点不是瓶颈。 发起人按合同类型填一张表单,系统决定谁审、谁签、归哪;法务只处理需要判断的地方。
- 合同类型即流程。 NDA、采购、销售、劳务各自一条流程定义:发起字段、审批矩阵、签署方式、归档属性。新增一种合同 = 加一条配置,不是加一段代码。
- 合同是数据,不是文件。 关键属性结构化存储,文件只是附件;到期、义务、收付款都是可查询、可提醒、可看板的记录。
产品面向全球客户,区域需求以配置和区域包承载,绝不进 schema 的硬路径:
- 语言:英文为默认与源语言,
zh-CN为完整第二语言包;对象、字段、选项的 label 先写英文。 - 主体与币种:签约主体多个(集团多法人),币种在合同上(
currency_code,组织级默认是设置不是 schema,出厂USD)。 - 法域:每份合同带
governing_law、jurisdiction、contract_language;相对方带country_code。 - 执行:电子签是默认执行方式(DocuSign 首发,Adobe Acrobat Sign、Dropbox Sign 随后,ESIGN / eIDAS 框架下的法律效力由提供商承担);公司印章、公证、见证、回签副本是类型上可配置的执行形式(
execution_formalities),不是模块。 - 相对方筛查:制裁名单与公司登记核验走连接器(OFAC / EU / UK 名单,OpenCorporates、Dun & Bradstreet),区域包接本地登记库。
- 数据保护:类型级保留年限与处置,满足 GDPR 的存储限制;导出与删除按平台数据主体流程。
- 区域包:中国(契约锁 / 法大大 / e签宝、本地登记库、印章形式的种子)等区域差异以扩展包装配(§13 Q7),标准品零区域词汇。
范围内:发起与受理 · 法务审查 · 条款库与偏离 · 审批矩阵 · 谈判轮次与版本 · 签署与执行形式 · 履约义务 · 收付款计划核对 · 变更补充与续签 · 到期与归档 · 台账与看板 · 存量合同导入。
范围外:在线起草与红线编辑器(v2)· 电子签引擎(只集成,不自建)· 供应商准入与评价(SRM)· 应收应付账(财务系统)· 商机与报价(HotCRM)· 法律案件与诉讼。
crm_contract |
clm_contract |
|
|---|---|---|
| 回答的问题 | 客户关系是否有效、何时续约、交给计费什么 | 在哪个环节、谁审的、盖没盖章、履约到哪、收付款是否按计划 |
| 方向 | 只有销售 | 销售、采购、其他 |
| 相对方 | crm_account 必填 |
clm_party,可链到 crm_account |
方向规则:商务信息以 crm_contract 为准,法律状态以 clm_contract 为准。clm_contract.crm_contract 是跨包 lookup;两者并装时 HotCRM 的 in_approval 由 CLM 推进(§06 F15)。
对象名、字段名、选项值一律通用,零行业词汇。合同类型、审批阈值、执行形式、币种、付款条件、签约主体全部是种子数据或配置 —— 换一套种子就是另一个行业的版本。
平台保留词(role · position · permission_set · business_unit)不得作字段名(ADR-0090 D3)。
| Ironclad | 含义 | CLM 落法 |
|---|---|---|
| Workflow Designer | 每种合同一条可配置流程 | clm_contract_type 承载发起字段、审查与签署方式;clm_approval_rule 承载审批矩阵。流程元数据只有一套,读矩阵结果 |
| Launch Form | 业务自助发起,条件字段 | screen flow contract_intake(F1);可选字段按类型的 intake_fields 显隐与必填 |
| Conditional Approvers | 金额、部门、偏离决定审批人 | hook 解析矩阵,把结果盖成 route_* 标志;审批流是固定五级台阶,decision 节点按标志跳过台阶;法务加财务会签用 per_group |
| Turn tracking | 球在谁手里 | current_turn + turn_since;停滞提醒(F4) |
| Editor / Redlining | 在线红线 | v1 版本文件加 kind 标记(clm_contract_version);v2 再做编辑器 |
| Playbook | 条款的标准立场与备选立场 | clm_clause 标准文本 / 备选文本 / 风险级别;clm_deviation 记录偏离,高风险偏离触发法务负责人台阶 |
| Repository / Properties | 结构化属性与检索 | clm_contract 字段 + 导入映射 + AI 抽取(S1) |
| Signature | 电子签与执行 | 连接器集成(F8):DocuSign、Adobe Acrobat Sign、Dropbox Sign 首发,区域提供商作区域包;每一轮签署是一条 clm_signature 记录,类型要求的执行形式(回签副本、公司印章、公证、见证)在记录上勾齐才能生效 |
| Insights | 周转分析 | 阶段时间戳 → dataset → 看板:交付各阶段到达数与审批吞吐,各段时长等平台日期能力(§09) |
| Jurist | AI 法务助手 | 四个 skill(§07),无 AI 运行时时显式降级 |
前缀 clm_。11 个对象,三个域。[MD] = master-detail 子对象,sharingModel: 'controlled_by_parent'。
配置域 合同域 签后域
clm_contract_type [public_read] clm_contract [private] clm_obligation [MD]
clm_clause [public_read] clm_contract_version [MD] clm_payment_plan [MD]
clm_approval_rule [public_read] clm_review [MD]
clm_party [public_read] clm_deviation [MD]
clm_signature [MD]
* = required;斜体 = 受字段级安全约束;枚举值即机器值。数字字段四件套(小数位 / 最小值 / 最大值 / 单位)必须显式声明。
| 对象 | 字段 |
|---|---|
clm_contract_type public_read |
name* · code*(编号前缀,如 NDA/MSA/SOW)· direction* sales/purchase/other · category* nda/sales/purchase/service/lease/employment/framework/dpa/amendment/other · description · template_file file · template_placeholders json({key,label,type,required}[],对应 spec 的 DocumentTemplate.placeholders)· intake_fields multiselect(本类型在发起表单上出现的可选字段)· requires_legal_review boolean · execution_formalities multiselect countersigned_copy/company_seal/notarized/witnessed · sign_method esign/wet_ink/either(默认 esign) · default_term_months · review_sla_days · retention_years · is_active |
clm_clause public_read |
title* · category liability/payment/termination/confidentiality/ip/warranty/dispute/other · standard_text* richtext · fallback_text richtext · position_note(不可接受的底线,文字)· risk_level low/medium/high · applies_to multiselect(合同 category)· requires_legal_head boolean(偏离即需法务负责人)· is_active |
clm_approval_rule public_read |
name* · applies_to multiselect(合同 category)· direction sales/purchase/other/any · amount_min currency · amount_max currency · only_with_deviation boolean · route_legal_head boolean · route_finance boolean · route_executive boolean · route_gm boolean · priority number · is_active |
clm_party public_read |
name* · party_kind company/individual/government/other · registration_no(统一登记号)· legal_representative · contact_name · contact_phone · contact_email · address · bank_name · bank_account · crm_account lookup(跨包,可选)· risk_flag none/watch/blocked · risk_note · verified_at · is_active。唯一索引 (registration_no) scope organization |
clm_contract private |
contract_number text(hook 生成 <type.code>-<YYYY>-<0000>,按类型按年流水,提交时盖戳后只读,唯一索引 scope organization;§13 Q5)· is_backfilled boolean(补录的已签合同,§13 Q8)· title* · contract_type* lookup · category(自类型盖戳,只读)· direction(同上)· party* lookup · our_entity select(签约主体,种子)· department select(种子)· owner_id(业务承办)· legal_owner lookup user · amount currency · currency_code(种子:USD 默认、EUR、GBP、CNY、JPY)· is_amount_estimated boolean · start_date · end_date · term_months · auto_renew boolean · renewal_notice_days · renewed_from lookup clm_contract · parent_contract lookup clm_contract(框架合同 / 补充协议的主合同)· status(§状态机)· risk_level low/medium/high · summary richtext · governing_law · jurisdiction · contract_language select(种子,默认 en)· payment_terms select · confidentiality_term_months · liability_cap currency · current_turn internal/counterparty/none · turn_since datetime · route_legal_head / route_finance / route_executive / route_gm boolean(hook 盖戳,只读)· approval_status(审批节点镜像)· submitted_at · review_started_at · approved_at · signed_at · activated_at · closed_at · termination_reason textarea(requiredWhen 状态为 terminated;不出现在发起表单,只在终止那一刻问一次)· execution_formalities multiselect(自类型盖戳,只读)· executed_at datetime · ai_summary richtext · ai_risk_score number(0–100)· ai_risk_rationale textarea · ai_reviewed_at datetime(四个 AI 字段只由「采纳建议」动作写入,§07)· is_expiring boolean(日任务盖戳)· archive_no · archived_at · crm_contract lookup(跨包,可选)· 汇总:version_count · open_deviation_count · overdue_obligation_count · planned_amount · actual_amount |
clm_contract_version by parent |
display_name(存储镜像 "v · ",nameField)· contract* MD cascade · version_no* · kind* draft/internal_redline/counterparty_redline/clean/final_signed · file* · submitted_by user · turn internal/counterparty · notes · is_current boolean |
clm_review by parent |
display_name(镜像 " · ")· contract* MD cascade · reviewer* user · stage* legal/finance/compliance/business · decision pending/approved/changes_requested/rejected · risk_level_assessed · comments richtext(对发起人可见)· internal_note richtext(仅法务)· started_at · decided_at |
clm_deviation by parent |
display_name(镜像 " · ")· contract* MD cascade · clause* lookup · deviation_text* · requested_position standard/fallback/custom · justification · status open/accepted/rejected/withdrawn · decided_by user · decided_at |
clm_signature by parent |
display_name(镜像 " · ")· contract* MD cascade · method* esign/wet_ink · provider select(DocuSign / Adobe Acrobat Sign / Dropbox Sign;区域包追加)· envelope_id · signers json(`[{side: our |
clm_obligation by parent |
display_name(镜像 title)· contract* MD cascade · title* · kind deliverable/payment/report/renewal/compliance/other · due_date* · owner lookup user · status pending/in_progress/done/overdue/waived · completed_at · evidence file · notes |
clm_payment_plan by parent |
display_name(镜像 "第期 · <planned_date>")· contract* MD cascade · seq* · planned_date* · planned_amount* currency · condition · actual_date · actual_amount currency · status planned/due/partial/paid/overdue · invoice_no · notes |
clm_contract.status:
| 从 | 到 | 守卫 |
|---|---|---|
| draft | submitted | 类型必选字段齐全;party 已设;至少一个版本文件或类型带模板 |
| submitted | in_review | 类型 requires_legal_review;法务受理(legal_owner 已分配) |
| submitted | in_approval | 类型不需法务审查时直达 |
| submitted | draft | 法务退回 |
| in_review | in_approval | 无 open 偏离;至少一条 legal 审查 approved |
| in_review | draft | 审查 changes_requested |
| in_approval | approved / rejected / draft | 审批流决定;send-back 回 draft |
| approved | signing | 存在 kind: clean 的当前版本 |
| signing | active | 存在 completed 的签署记录且其 formalities_done 覆盖类型的 execution_formalities;存在 final_signed 版本;signed_at 非空 |
| signing | approved | 签署失败回退 |
| active | expired | 仅日任务(F13) |
| active | terminated | closed_at 与终止原因必填 |
| rejected | draft | 修改重提 |
| draft / submitted / in_review / in_approval / approved / signing | cancelled | 发起人撤回或法务作废 |
expired · terminated · cancelled 为终态。续签不是转换:动作「发起续签」创建一份新的 draft 并写 renewed_from。补充协议同理:新合同,category: amendment,parent_contract 指向主合同。
其余子对象的状态机:
clm_deviation.status:open→accepted/rejected/withdrawn;终态不可回clm_signature.status:draft→sent/completed/voided(湿签直接 completed);sent→completed/declined/voided;declined→draftclm_obligation.status:pending→in_progress/done/waived/overdue;overdue→done/waived;in_progress→done/waived/overdueclm_payment_plan.status:planned→due→partial/paid/overdue;overdue→partial/paid;partial→paid/overdue
- 没有
clm_template对象。 模板文件和占位符挂在合同类型上;换模板就是换文件。一个类型一份现行模板,历史模板不管。 - 没有
clm_amendment对象。 补充协议是一份合同,靠parent_contract和category表达;两个对象只会制造两份真相。 - 没有
clm_signatory对象。 签署方是clm_signature.signers里的 JSON 行;一轮签署一条记录,信封、状态与执行形式都在记录上,合同只保留executed_at。 - 审批台阶固定五级。 直接主管 → 法务负责人 → 财务负责人 → 分管领导 → 总经理。矩阵决定走哪几级,不决定台阶本身。Ironclad 的任意条件审批人在本平台对应「客户覆盖层加台阶」,不进标准品(§13 Q3)。
- 没有相对方门户。 平台外部门户能力仍是缺口(PLATFORM_GAPS #27);相对方红线走邮件往来,法务上传为
counterparty_redline版本。 - 没有印章模块。 公司印章是
execution_formalities的一个值,与公证、见证、回签副本同级;印章流转(申请、执行、快递)属于中国区域包,标准品不建模。
企业 SaaS 形状:租户 = 组织,全部对象进租户墙(与 ats 的市场型划分不同,这里无需豁免)。
clm_contract private;五个子对象 controlled_by_parent;四个配置对象 public_read,写权限仅管理岗。
Position 扁平,七个:clm_legal_counsel(法务经办)· clm_legal_head(法务负责人)· clm_finance_controller(财务负责人)· clm_executive(分管领导)· clm_general_manager(总经理)· clm_records_manager(档案与记录管理员:执行登记、归档、台账)· clm_admin。
Permission set 五个:clm_requester(所有员工默认)· clm_legal · clm_finance · clm_records · clm_admin。
导航分区的门控能力由权限集 systemPermissions 授予:clm_requester.access · clm_legal.access · clm_finance.access · clm_records.access · clm_admin.access。
动作门控同时在 UI 与服务端生效(ADR-0066 D4):approve_contract · execute_contract · archive_contract · terminate_contract · manage_clauses · manage_approval_rules。
R 读 · C 建 · U 改 · D 删;括号内为行级作用域。
| 对象 | clm_requester | clm_legal | clm_finance | clm_records | clm_admin |
|---|---|---|---|---|---|
| clm_contract | RCU(本人发起,draft/submitted 可改) |
RCU(全部) | RU(approved 及之后,FLS 锁法律字段) |
RU(signing 及之后;执行与归档字段) |
RCUD |
| clm_contract_version | RC(本人合同) | RCU | R | RC(执行副本) | RCUD |
| clm_review | R(comments,不含 internal_note) |
RCU | RCU(stage=finance) | R | RCUD |
| clm_deviation | RC(本人合同) | RCU | R | R | RCUD |
| clm_signature | R(本人合同) | RCU | R | RU(执行形式、执行副本) | RCUD |
| clm_obligation | RU(本人负责) | RCU | R | R | RCUD |
| clm_payment_plan | R(本人合同) | RC | RCU | R | RCUD |
| clm_party | R(不含银行与电话) | RCU | RU(银行信息) | R | RCUD |
| clm_contract_type · clm_clause · clm_approval_rule | R | R(clause RCU) | R | R | RCUD |
| 规则 | 对象 | 条件 | 授予 |
|---|---|---|---|
contract_legal_all |
clm_contract | 全部 | position clm_legal_counsel · clm_legal_head — edit |
contract_finance_post_approval |
clm_contract | status in [approved, signing, active, expired, terminated] |
position clm_finance_controller — edit(FLS 锁法律字段,§13 Q1) |
contract_records_execution |
clm_contract | status in [signing, active, expired, terminated] |
position clm_records_manager — edit(FLS 限执行与归档字段) |
contract_executive_routed |
clm_contract | route_executive == true |
position clm_executive — read |
contract_gm_routed |
clm_contract | route_gm == true |
position clm_general_manager — read |
contract_manager_reports |
clm_contract | — | writeScope: 'own_and_reports'(企业版 hierarchy-security,开源版退化为 owner-only) |
RLS 谓词不能跨对象(ADR-0055),所以「同部门可见」无法用 current_user 的部门表达 —— department 是合同上的冗余标量,部门内共享按客户以 team 规则覆盖(§13 Q2)。
| 字段 | 对谁遮蔽 | 理由 |
|---|---|---|
clm_party.bank_account · contact_phone |
clm_requester · clm_records | 付款与联系信息最易外泄;读取落审计 |
clm_review.internal_note |
clm_requester · clm_finance | 法务内部意见;对发起人的结论走 comments |
clm_contract.risk_level · liability_cap |
clm_requester 只读 | 由法务评定 |
clm_contract.route_* · approval_status · 阶段时间戳 |
所有岗位只读 | 只由 hook 与审批流写 |
clm_contract.ai_* |
所有岗位只读 | 只由「采纳建议」动作写入,写入前 AI 输出不落字段 |
一个 App clm(ADR-0019 D3:一个 app 包一个 App),导航按受众分五组,每组 requiredPermissions 门控,空组自动折叠。
| 分区 | 门控 | 导航 | 主视图 |
|---|---|---|---|
| 我的合同(所有人) | clm_requester.access |
发起合同 · 我发起的 · 待我处理 · 我负责的履约 | 发起 = screen flow 动作;我发起的 grid(按 status 分组);待我处理 = 平台审批收件箱;履约 grid(due_date 升序) |
| 法务工作台 | clm_legal.access |
待受理 · 审查中 · 谈判中 · 全部合同 · 到期日历 · 条款库 · 合同类型 | 待受理 grid(submitted 且未分配)· 审查中 grid(legal_owner == me)· 谈判中 grid(current_turn == counterparty,按 turn_since 升序)· 状态看板 kanban(groupBy status)· 到期 calendar(end_date) |
| 财务 | clm_finance.access |
收付款计划 · 生效合同 · 收付款看板 | 计划 grid ×3 listView(本月到期 / 逾期 / 已付)· 生效合同 grid |
| 执行与档案 | clm_records.access |
待执行 · 待归档 · 合同台账 | 待执行 grid(signing 且签署记录未 completed 或执行形式未齐)· 待归档 grid(终态且 archive_no 空)· 台账 grid(全字段,可导出) |
| 管理 | clm_admin.access |
审批矩阵 · 相对方 · 签约主体与部门 · 报表 | 配置对象 grid |
合同详情页(slotted):header 挂「提交 / 受理 / 送审 / 发起签署 / 生效 / 终止 / 发起续签」动作,按 status 与门控显隐;highlights:编号 · 相对方 · 金额 · 到期日 · 当前轮次;path 组件显示 draft→submitted→in_review→in_approval→approved→signing→active;tab:概要 / 版本(timeline)/ 审查与偏离 / 审批记录(平台 sys_approval_request)/ 履约与收付款 / 签署与归档 / 讨论(平台 discussion slot,评论与 @)。
无匿名公开表单:合同发起必须登录。
| # | 名称 | 类型 | 行为 |
|---|---|---|---|
| F1 | contract_intake |
screen flow(发起表单) | 选类型 → 按类型 intake_fields 显示条件字段 → 相对方查找或新建 → 上传首版或标记「按模板」→ 建合同(draft)与版本 v1 → 可选一键提交。ai.exposed,输入变量齐全时可由 MCP 调用 |
| F2 | contract_route |
hook beforeUpdate(进入 submitted) |
自类型盖戳 category/direction/execution_formalities;按 clm_approval_rule 命中项盖 route_*;写 submitted_at;requires_legal_review 时在 clm_legal_counsel 中按未结合同数最少轮询分配 legal_owner 并进 in_review,否则直进 in_approval |
| F3 | legal_review_sla |
定时(日) | in_review 超过类型 review_sla_days:提醒 legal_owner,超一倍抄送 clm_legal_head |
| F4 | turn_stalled |
定时(日) | current_turn == counterparty 且 turn_since 超 7 天:提醒业务承办催对方 |
| F5 | contract_approval |
record_change(进入 in_approval),runAs: 'system' |
台阶 1 直接主管(type: 'manager')→ decision 按 route_legal_head / route_finance 决定台阶 2 是否为法务加财务会签(per_group)或单方 → decision route_executive → 台阶 4 分管领导(position)→ decision route_gm → 台阶 5 总经理。lockRecord: true,approvalStatusField: approval_status;approve → approved + approved_at;reject → rejected;send-back → draft |
| F6 | deviation_gate |
hook beforeUpdate | 存在 open 偏离时拒绝进入 in_approval;接受了 requires_legal_head 条款的偏离即置 route_legal_head = true |
| F7 | signature_record |
record_change(clm_signature 进入 completed) |
hook 比对 formalities_done 与类型 execution_formalities:齐备则盖合同 executed_at 并由 executed_file 建 final_signed 版本;缺项则通知法务经办并点名缺哪一项。湿签路径:法务或档案岗在签署记录上传执行副本并勾选形式 |
| F8 | esign_dispatch / esign_callback |
动作 + api 触发流 | 「发起电子签」经 durable HTTP 把 clean 版本与签署方送给连接器指定的提供商;回调 api 流按信封状态写 esign_status,完成时建 final_signed 版本并写 signed_at |
| F9 | contract_activate |
hook afterUpdate(进入 active) |
写 activated_at;按类型默认建续签提醒义务;并装 HotCRM 时回写 crm_contract(status activated、signed_date、文件) |
| F10 | obligation_due |
定时(日) | T-7 与 T-0 提醒义务 owner;过期未完成置 overdue,父合同汇总 overdue_obligation_count 随之变化 |
| F11 | payment_overdue |
定时(日) | planned_date 已过且未 paid:置 overdue,提醒财务负责人与业务承办 |
| F12 | renewal_notice |
定时(日) | active 且 end_date - renewal_notice_days <= today:置 is_expiring,提醒业务承办与法务;动作「发起续签」预填新 draft |
| F13 | expiration_sweep |
定时(日) | active 且 end_date < today:非自动续签置 expired;自动续签则建续签 draft 并提醒 |
| F14 | contract_archive |
hook beforeUpdate | 终态合同由档案岗填 archive_no 后置 archived_at,此后除 summary 外只读 |
| F16 | executed_upload |
动作(补录已签合同,§13 Q8) | 档案或法务岗「补录已签合同」:一步填核心字段、相对方、执行副本与签署日期,合同直接进入 active 并置 is_backfilled,跳过审查与审批但全部留审计;仅 clm_records.access 与 clm_legal.access 可用 |
| F15 | crm_handoff |
record_change(crm_contract 进入 in_approval) |
仅 CLM_COMPOSITION=with-hotcrm 装配时注册:建 clm_contract(direction sales,party 自 crm_account 查找或新建,金额期限预填,crm_contract 回链) |
定时流与对审批结果做出反应的 record_change 流一律 runAs: 'system' 并注明理由(审批服务的镜像写不带用户,默认身份会被拒绝)。
AI 是流程里的参与者,不是旁边的聊天窗。三条治理原则先于任何能力:与人同权限同审计(AI 只能看调用者能看的合同,每次调用落审计:谁、哪份合同、哪个 skill、哪个模型、结论);只建议不直接写(每条建议经人「采纳」才落字段或改状态,AI 永远不能推动状态机);没有 AI 运行时就隐藏(开源版无 ai 能力时按钮与字段不出现,绝不用占位输出冒充结果)。
| 层 | 机制 | 本应用的用法 |
|---|---|---|
| 技能 | skills-only 挂平台 ask 助手(ADR-0063,surface 绑定),无应用自有 agent |
S1–S6 |
| 工具 | 每个 ai.exposed 动作即 AI 工具,并经平台 MCP 暴露给外部 agent(Claude、Copilot、客户自己的 agent) |
发起合同、查状态、查到期义务、检索合同、登记偏离,权限按调用用户 |
| 数据 | 合同上四个 ai_* 字段只由「采纳建议」动作写入;审计里 AI 建议与人工采纳各一条 |
摘要、风险分与理由、审查时间 |
| # | 阶段 | skill / 能力 | 输入 | 输出 | 写入方式 | 版本 |
|---|---|---|---|---|---|---|
| S1 | 导入 / 发起 | extract_terms 条款抽取 |
上传的 PDF / DOCX | 相对方、金额、币种、起止、适用法律、付款条款、关键条款摘要 | 人确认后写字段 | M4 |
| S5 | 导入 / 生效 | extract_obligations 义务抽取 |
终版文本 | 义务草案(标题、类型、到期、负责人建议) | 人确认后建 clm_obligation |
M4 |
| S2 | 审查 | review_summary 版本变动摘要 |
新版本 vs 上一版 | 按条款类别列出变动,偏离草案 | 人确认后建 clm_deviation |
M4 |
| S3 | 审查 | deviation_check 偏离风险 |
偏离文本 vs 条款标准 / 备选 | 风险级别建议、是否需法务负责人 | 人确认后写偏离字段 | M4 |
| S6 | 审批 | approver_memo 审批备忘录 |
合同、偏离、同类合同 | 一页备忘录:金额与阈值、偏离与风险、同类对比、关注点;ai_risk_score 与理由 |
备忘录附在审批请求上,标「AI 生成,未经法务复核」;分数经法务采纳才写 | M4 |
| S4 | 检索 | contract_qa 合同库问答 |
自然语言 | 答案附合同编号 | 不写 | M4 |
| — | 发起 | 对话式发起 | 助手对话或 MCP 调用 F1 | 同 F1 | 同 F1 校验 | M2(随 F1 的 ai.exposed) |
| — | 谈判 | playbook 建议回复 | 对方红线条款 | 备选立场文本 | 不写 | 二期 |
| — | 检索 | 相似合同与条款召回(向量检索,平台 knowledge 服务) | 条款文本 | 相似条款与所在合同 | 不写 | 二期 |
| — | 定制 | 用 AI 改应用:客户经 Claude Code 等改合同类型、矩阵、视图 | 自然语言 | 元数据变更,走同一条 verify 链 | 覆盖层 | 随平台 |
| 规则 | 内容 |
|---|---|
| 模型无关 | 走平台模型注册表(Anthropic、OpenAI、Bedrock、本地),应用不写任何提供商代码 |
| 数据边界 | 合同文本只送给组织配置的模型端点;自托管可全内网 |
| 提示词版本化 | 提示词在 skill 元数据里,随包版本,可 diff |
| 置信度 | 抽取字段带置信度,低于阈值不展示建议只展示原文 |
| 一键关闭 | 组织级设置关闭全部 AI;关闭后 ai_* 字段保留但只读 |
| 审计 | 每次调用一条审计,采纳一条审计,两条互链 |
| 对象 | 方式 | 现状 |
|---|---|---|
| 电子签 | REST 连接器(DocuSign 首发;Adobe Acrobat Sign、Dropbox Sign 随后;区域提供商如 契约锁 / 法大大 / e签宝 作区域包),提供商与凭证在 sys_setting;回调走 api 触发流 |
平台无电子签引擎(spec 17 已明示移除),只集成不自建 |
| HotCRM | F15 交接 + F9 回写;跨包 lookup | 组合开关装配,单装 CLM 不含 |
| 相对方筛查 | 制裁名单(OFAC / EU / UK)与公司登记核验(OpenCorporates、Dun & Bradstreet)连接器,区域包接本地登记库;写 screening_status 与 screened_at |
可选 |
| 通知 | 站内 inbox · email · sms · Slack(平台 connector-slack) |
Microsoft Teams 与区域即时通讯通道平台未实现(PLATFORM_GAPS #1),只能声明不能承诺 |
| 台账导出 | 平台导出 CSV / XLSX | PDF 打印仍是缺口(#9) |
Dataset(语义层):
contract_metrics— 数量与金额,按类型 / 方向 / 状态 / 部门 / 月contract_cycle_time— 各阶段到达数(submitted_at/review_started_at/approved_at/signed_at/activated_at各自的盖戳覆盖数),按类型与法务经办;不含任何时长度量obligation_metrics— 到期 / 逾期,按 owner 与合同payment_metrics— 计划与实际,按月;逾期金额
看板三个:
- 法务工作台 — 待受理数 · 审查中 · 审查超 30 天(固定阈值,写进砖的标题)· 谈判停滞 · 审批吞吐(本月 vs 上月,用平台
compareTo)· 各阶段合同数(横向条形图,按合同数从多到少排;只画在办的六个阶段) - 管理层 — 生效合同额 · 90 天内到期 · 高风险合同 · 各台阶路由量(四级台阶各一块砖,读 F2 盖的
route_*标志;是流量,不是停留)· 按方向的合同额趋势 - 财务 — 本月应收 / 应付 · 逾期金额 · 按相对方的未付 top 10
已知限制:分析过滤器不支持公式字段(#10),所以所有看板筛选字段都是持久化字段;周期对比用平台 period-over-period。
各段时长与按类型的「超 SLA」不在 V1.0 交付面内(维护者裁定,2026-09-09)。语义层不收 SQL 也不收表达式(ADR-0021),没有地方做时间戳减法;且 Field.datetime 在 SQLite 上存 ISO 文本,AVG() 打在其上会静默返回平均年份而不是平均日期。两项都等平台的日期能力,跟踪于 objectstack-ai/objectstack#16737。在那之前 §09 交付的是:周转以各阶段到达数与审批吞吐如实呈现,SLA 以固定 30 天阈值呈现且阈值写进砖的标题(九种类型的真实 SLA 是 2/3/5/10 天,30 天高于全部,标题自陈阈值就不会被误读成按类型的违约)。§09 原列的「审批瓶颈(各台阶平均停留)」同样不交付,且另有一条独立于平台的原因:审批台阶的起止无处可读——sys_approval_request 在标准演示数据下零行,审批阶梯(F5)从未运行——所以即使平台补上日期运算,停留时长仍要先有审批请求记录才算得出来。看板在那个位置交付的是各台阶的路由量。⛔ 不得用应用侧日任务盖戳字段把各段时长与「超 SLA」补出来 —— 那是在应用里复刻平台规则。
「各阶段合同数」是横向条形图,不是漏斗,且只画在办阶段(#48 / PR #57 换掉图形,#59 / PR #62 收窄口径,均已合并)。漏斗断言逐级单调递减,而这本合同簿不递减(§10 的分布:draft 10 · submitted 6 · in_review 12 · in_approval 8 · approved 4 · signing 6 · active 60),画成漏斗是在断言数据没说的事。收录判据是法务在这个阶段是否还有事要做:draft / submitted / in_review / in_approval / approved / signing 六个在办阶段入图;active 与 rejected / expired / terminated / cancelled 四种终态都不入图 —— 生效合同簿的规模归管理层看板(生效合同额 · 90 天内到期),不是法务工作台的队列。排序按合同数从多到少(sortBy: 'contract_count' / sortOrder: 'desc'),⛔ 不承诺可编排的阶段顺序:console 17.4.0 只有漏斗分支读 stageOrder,条形图上静默丢弃,非 en 语言下连漏斗分支也因标签不匹配而丢,跟踪于 objectstack-ai/objectstack#17344。
一家虚构的跨国集团(美国母公司,欧洲与亚太子公司;合同以 USD / EUR / GBP 计价,适用法律分布在 US-NY、England and Wales、Germany),六个月历史,让每个看板第一屏就有内容。demo-en 默认,demo-zh 同构。
| 对象 | 条数 | 要点 |
|---|---|---|
| clm_contract_type | 9 | NDA · MSA · SOW · 订单 · 供应商协议 · DPA · 租赁 · 独立承包人 · 补充协议 |
| clm_clause | 30 | 覆盖全部 category,每类至少一条 high |
| clm_approval_rule | 6 | 三档金额 × 有无偏离 |
| clm_party | 40 | 客户 / 供应商 / 个人 / 政府各有;2 条 blocked |
| clm_contract | 120 | draft 10 · submitted 6 · in_review 12 · in_approval 8 · approved 4 · signing 6 · active 60 · expired 8 · terminated 4 · cancelled 2;其中 10 条 30 天内到期 |
| clm_contract_version | 300 | 谈判中的合同有 3 到 5 版,含对方红线 |
| clm_review · clm_deviation | 60 · 25 | 8 条偏离 open,让门槛可演示 |
| clm_signature | 30 | 6 条 sent,2 条执行形式未齐 |
| clm_obligation | 200 | 未来 30 天内到期 40 条,逾期 10 条 |
| clm_payment_plan | 300 | 本月到期 30 条,逾期 12 条 |
用户不可种子;各岗位账号在 Setup 建用户后分配 position(法务经办 ×2、法务负责人、财务负责人、分管领导、总经理、档案与记录管理员、CLM 管理员);业务承办 ×3 不是 position,clm_requester 是全员默认集,在 Setup 直接授予。
从 hotcrm 仓库 fork 骨架,保留 verify 链、token ratchet、docs 站、截图 meta.yaml、feature-inventory、requirements log、e2e、changesets、publish-marketplace,删除 crm_ 对象。
objectstack.config.ts defineStack;requires: automation · triggers · analytics · auth · ui · approvals · sharing(可选 hierarchy-security)
src/objects/ 11 个 *.object.ts + *.hook.ts(状态机守卫、盖戳、display_name 镜像)
src/views/ src/pages/ 五个分区的视图;合同详情 slotted 页
src/apps/ 1 个 App,五组受众分区
src/flows/ F1–F15(F15 受组合开关控制)
src/skills/ S1–S6(§07)
src/datasets/ src/dashboards/ 4 dataset · 3 dashboard
src/profiles/ src/sharing/ 5 permission set · 7 position · 6 sharing rule · FLS
src/mappings/ 存量合同 / 相对方导入映射
src/translations/ en(默认)· zh-CN
src/data/ demo-en/ · demo-zh/
content/docs/ 产品文档(法务 / 财务 / 管理员 / 发布)
docs/requirements/ 客户需求分诊记录(A/B/C/D)
docs/backlog/ 派发卡片
| 里程碑 | 内容 | 验收 |
|---|---|---|
| M1 数据与权限骨架 | 11 对象 · 状态机守卫 · 7 position / 5 set · 共享与 FLS · 配置域种子 | validate/lint/typecheck 绿;业务承办经 REST 看不到他人合同;财务看不到 in_review 合同 |
| M2 发起与审批 | F1 · F2 · F5 · F6 · F7 · 法务工作台 · 详情页 · 全量种子 | 走通 发起→受理→偏离→会签→签署与执行形式→生效,审批记录与审计齐全 |
| M3 签后与分析 | F9–F14 · 履约与收付款 · 4 dataset · 3 看板 · zh/en | 演示数据下无空图;到期、逾期提醒在收件箱可见 |
| M4 集成与可发布 | F8 电子签 · F15 CRM 交接 · S1–S6 与审批备忘录 · MCP 工具面 · 导入映射 · 文档 · 截图 · marketplace 发布 | 陌生人 clone 一条命令跑起;marketplace 一键安装;需求书逐条对应 feature-inventory 与测试 |
一次只做一个里程碑;token ratchet 上限:业务语义 ≤ 60k,交互层 ≤ 30k,M1 起就卡。
| 缺口 | 编号 | v1 降级 | 解除后 |
|---|---|---|---|
| 在线红线编辑器 | — | 版本文件 + kind 标记;对方红线上传 |
编辑器内比对 |
| 模板填充生成文档 | — | DocumentTemplate.placeholders 有 schema 无渲染引擎:下载模板 + 变量清单,法务填后上传 |
一键生成 v1 |
| PDF / 打印 | #9 | 浏览器打印 | 台账与执行单模板打印 |
| 电子签引擎 | — | 连接器集成 | 不自建 |
| 入站邮件 | #39 | 手动上传对方版本 | 邮件附件自动成版本 |
| 外部相对方门户 | #27 | 邮件往来 | 相对方在线红线 |
| IM 通知通道 | #1 | inbox / email / sms / Slack | Teams;区域 IM 由区域包承担 |
| CEL 日期算术 | #7 | 到期、逾期由日任务盖戳字段 | 公式字段 |
| 跨对象公式 | #36 | hook 冗余 category / direction / execution_formalities |
直接引用类型 |
规则:平台能力受限只上报 objectstack,不在本仓库修平台;应用侧只允许带环境闸门的临时夹具并注明平台 issue;新发现追加到 objectstack 的 docs/PLATFORM_GAPS_FROM_TEMPLATES.md。
设计方案 V1.0 第 13 章 16 项与本节 Q1–Q7 于同日一次裁定,全部采用默认口径。逐条记录,此后改动走新的 Q 编号,不改已裁决项。
| # | 事项 | 裁定 | 落实 |
|---|---|---|---|
| Q1 | 财务对生效合同的写权限 | edit + FLS 锁法律字段与 status |
卡 04;M1 验证 FLS 能锁 status |
| Q2 | 部门内可见性 | 不进标准品,靠 own_and_reports;team 规则留客户覆盖层 |
卡 04 |
| Q3 | 审批台阶 | 固定五级,矩阵选台阶 | 卡 06 |
| Q4 | 相对方与 crm_account |
永远独立 clm_party,可选 lookup |
已落地 |
| Q5 | 合同编号 | hook 生成 <type.code>-<YYYY>-<0000>,放弃 autonumber |
卡 02,§03 已改 |
| Q6 | 类别与 HotCRM 类型 | 不对齐,F15 映射 | 卡 12 |
| Q7 | 区域包装配 | marketplace 扩展包,依赖 HotCLM;开关只作过渡 | 2.x |
| Q8 | 补录已签合同(方案第 12 项) | 允许:F16 executed_upload,直接 active,is_backfilled 标记并留审计 |
卡 09 追加 F16 |
| 方案 1–16 | 财务写权限、部门可见性、台阶、相对方、编号、类别、对方红线由法务上传、执行形式按类型、DocuSign 首发、IM 通道本期不承诺、出厂 USD 与英文、补录通道、保留期默认 10 年、补充协议走自己的矩阵、AI 四字段进合同、区域包用扩展包 | 全部默认 | 已分别体现在 §01–§12 |