AI-3.2-04 智能工具试用期与付费开通

机制层先行——试用 / 到期 / 付费墙 / 账本入账 · 实现策略 TDD

文档类型: 技术设计文档(TDD) PRD 版本: V1.4(2026-10-22) 文档版本: v1.0(2026-10-26) 优先级: Should · P2(规划中,覆盖四类工具统一机制) 深度分级: architectural(架构级 + 首切片字段级) 波次: p2-a(A 波·机制层先行) 来源: tdd/AI-3.2-04-tool-trial-and-paywall.md

摘要

本条目对应 PRD FR-3.2-04「智能工具试用期与付费开通」。PRD 验收要点为:「四类工具“试用—到期—付费开通”全流程可配置;条款经法务复核;误导性缔约表示检查通过」。现状判定:机制从零建,但四块付费原语全部在位(最短路径成立)——复式账本、customer group 定价门控、Stripe 收款通路、定时 job 范式均已存在;subscription/entitlement/trial 实体零命中。

方案采用两层边界:机制层先行(tool_entitlement 实体 + 试用计时到期 job + customer group 解锁付费墙 + ledger entry_type 入账扩展——无外部依赖,A 波可开工);工具适配器随后(各工具本体挂接 entitlement 检查点,随 X-tool-bodies 绑定排期)。首切片商业形态 =「一次性开通收款 + 时间窗 entitlement」(用量计量/自动续费/发票流程不在首切片)。条款法务复核(D-dec5)= 上线前置非设计前置,本卡只定义检查点不做法务结论。

优先级 / 深度
Should · P2
深度分级 architectural——要素 4 架构级 + 首切片 tool_entitlement 字段级
机制层四件
4 项
tool_entitlement 实体 / 到期 reconcile job / customer group 解锁付费墙 / ledger 入账扩展(+ admin 管理面)
覆盖工具
4 类
AI 数字店铺 / 企业数字员工(首个绑定 AI-3.6-03)/ 智能选品 / 智能报价——tool_code 四值枚举一一对应
Blocker
3 项
D-dec4(定价档位/时长)/ D-dec5(条款法务)/ X-tool-bodies(工具本体排期)——均不阻塞机制层开工
现状基线(代码证据)

复式账本(ledger-entry.ts:9-28:amount_minor 整数 + idempotency_key + 冲正关联 + append-only);customer group 付费墙原语(validate-add-to-cart.ts:70-102 groups 注入 pricing context + price route :153 price_list 路由 + company↔customer-group link);Stripe 收款通路(capture-final-h2b.ts:88/107/277 payment_collection 三锚点);30min cron 扫描 job 范式(reconcile-h2b-deposit-timeout.ts)。负证据:rg -il "subscription|entitlement" 模块级 0 命中——机制实体从零新建。

关键概念

tool_entitlement
从零新建的机制层实体(backend/src/modules/tool-entitlement/):四类工具 × 客户主体的一条 entitlement 行,生命周期行内演进(trial → active → expired/cancelled);UNIQUE(tool_code, customer_id)。
机制层 vs 适配器层
机制层 = 本卡 owns(商业开关:试用/到期/付费墙/账本,A 波开工);适配器层 = references_only(各工具挂接 checkEntitlement 检查点,随 X-tool-bodies 绑定排期,首个绑定工具 = AI-3.6-03 数字员工)。
customer group 付费墙
Medusa pricing 原生链路:customer.groups 注入 pricing context → price_list 按客群路由。禁止自建第二套价格门控——价格呈现完全交给 pricing,entitlement 管「功能开关」。
复式账本(ledger)
余额/流水单一事实源(spec:arch/finance-ledger 硬约束):付费入账必须走 ledger 新增 entry_type(tool_subscription),append-only——冲正走 reversal_of_entry_id 关联,禁止绕过账本直改余额。
amount_minor
金额一律整数 minor unit(spec:arch/finance-amount-unit 硬约束)——定价档位数值(DEC-4)以 minor unit 配置,禁止浮点。
《特定商取引法》误导性缔约表示
试用期转付费流程的规制方向:禁止默认勾选续费、误导性「免费」表述——本卡落地为建设要求(检查用例框架),检查点随首个绑定工具界面执行。
《消費者契約法》中途解约
若付费工具面向以生活为目的的个人开通,持续性服务合同中途解约规则可能适用——cancel workflow 已承载任意时点取消能力;适用性判断与退款规则 = 法务确认(D-dec5),上线前置。
降级方向差异声明
entitlement 查询失败(DB 异常)时 checkEntitlement 返回 entitled=false + 显式 error 态——宁可拒绝服务不可误放行(商业门控与 AI 增强的降级方向相反,防止 NFR-3.8-01 范式误套)。

方案设计

两层边界总览

层归属开工条件内容
机制层 本卡 owns 无外部依赖——A 波立即可开工 ① tool_entitlement 实体 ② 试用计时/到期 job ③ customer group 解锁付费墙 ④ ledger entry_type 入账扩展(+ admin 管理面)
工具适配器层 references_only X-tool-bodies(四类工具本体落地,绑定排期未定) 各工具挂接 trial/entitlement 检查点的接入契约;首个绑定工具 = AI-3.6-03(B 波)
flowchart TB subgraph mech["机制层(本卡 owns · A 波立即可开工)"] M1["tool_entitlement 实体 + migration"] M2["试用计时 / 到期 reconcile job(30min cron)"] M3["customer group 解锁付费墙(pricing 原生)"] M4["ledger entry_type 入账扩展"] M5["admin 管理 API + 界面"] end subgraph adapter["工具适配器层(references_only · 随 X-tool-bodies)"] A1["各工具挂接 checkEntitlement 检查点"] A2["首个绑定:AI-3.6-03 企业数字员工(B 波)"] end M1 --> M2 M1 --> M3 M1 --> M4 M1 --> M5 mech ==>|"唯一接入契约(签名冻结,仅限返回体追加字段)"| adapter
图 1. 两层边界:机制层四件先行无外部依赖;适配器层仅消费冻结的 checkEntitlement 契约
首切片边界声明

tool_entitlement 为字段级首切片;用量计量(quota/usage metering)、订阅周期自动续费(recurring billing)、发票/请款书流程不在首切片——首切片商业形态 =「一次性开通收款 + 时间窗 entitlement」(与 Stripe payment_collection 既有通路匹配,无需 Billing Schedule);计量计费随首个绑定工具的计费口径立项(DEC-4 关联)再入。

tool_entitlement 实体(字段级首切片)

新本地模块 backend/src/modules/tool-entitlement/(models/services/index),表 tool_entitlement:

字段类型约束/默认说明
idtextPK,prefix tentl—
tool_codeenum(digital_store, digital_employee, product_selection, smart_quote)not null四类工具注册枚举——与映射归属表四行一一对应;新工具经迁移扩展枚举
customer_idtextnot nullC 端主体关联(customer.id)——双关联设计:四类工具横跨 C 端工具与 seller 级商家工具,单一粒度会返工
seller_idtextnullable商家主体关联(seller.id;seller 级工具填写;B2B 企业开通经 company↔customer-group link 批量落 customer 级)
statusenum(trial, active, expired, cancelled)not null, default trial生命周期:trial(试用中)→ active(付费开通)→ expired(试用到期未付费)/ cancelled(取消);active 可 → cancelled
trial_started_attimestamptznullable试用起点(开通试用时写入)
trial_ends_attimestamptznullable试用到期点(trial_started_at + 时长;时长 = 可配置参数,数值 DEC-4/DEC-5 占位——机制不写死,admin 配置项起步)
entitled_attimestamptznullable付费开通生效时点(写入 active 时)
order_reftextnullable开通收款关联(payment_collection/payment id,对齐 capture-final-h2b.ts:88 范式)
last_transitionjsonbnullable{from, to, reason, actor_id, at} 状态轨迹(供 NFR-3.9-03 审计查询)
metadatajsonbnullable扩展(绑定工具侧业务上下文——适配器层填充,机制层不解释)
created_at / updated_at / deleted_attimestamptz标准三件套—

索引与约束:UNIQUE(tool_code, customer_id)(同主体同工具一条 entitlement 行,生命周期行内演进);INDEX(status)、INDEX(trial_ends_at, status)(到期扫描热点)、INDEX(customer_id)、INDEX(seller_id)。

stateDiagram-v2 [*] --> trial: start-tool-trial(admin 授予 / 自助入口) trial --> active: grant-tool-entitlement(付费激活 · entitled_at 落值) trial --> expired: expire-tool-entitlement(到期 job 自动迁移) trial --> cancelled: cancel-tool-entitlement(任意时点取消) active --> cancelled: cancel-tool-entitlement expired --> active: grant-tool-entitlement(到期后补付费激活) cancelled --> trial: 重新试用(仅 admin 显式操作) expired --> [*] cancelled --> [*]
图 2. tool_entitlement 状态机白名单(forward-only):非法迁移(如 active→trial、expired→expired)在 Workflow step 内拒绝(409)

试用期计时与到期 job

新 job backend/src/jobs/reconcile-tool-entitlement-expiry.ts(复用 30min cron 扫描范式,为 jobs 目录第 16 个定时 job,范式零学习成本):

  • config = { name: "reconcile-tool-entitlement-expiry", schedule: "*/30 * * * *" }(对齐 reconcile-h2b-deposit-timeout 范式:30 分钟扫描粒度——试用期以天为单位,30min 足够);
  • 扫描:status='trial' AND trial_ends_at <= now() 批量(BATCH_LIMIT 50 同范式)→ 逐行触发 expire-tool-entitlement Workflow;
  • 幂等:job 可重入(状态机守卫保证重复触发不重复迁移——已 expired 行不再命中扫描条件);逐行 skipped/transitioned 计数日志(范式原文对齐);
  • 到期联动:状态迁移 trial→expired + emit 通知事件(tool-entitlement.expired)——通知渠道沿平台既有通知基建消费,事件负载仅含 entitlement id/tool_code/customer_id(最小化)。
flowchart TB J["reconcile-tool-entitlement-expiry job(*/30 cron · BATCH_LIMIT 50)"] S["扫描 status=trial 且 trial_ends_at 超时的行"] W["expire-tool-entitlement Workflow(逐行触发)"] G{"状态机白名单守卫"} T["mark-expired + remove-customer-group(价格即时回落默认价)"] N["emit tool-entitlement.expired(通知负载最小化)"] LOG["逐行 skipped / transitioned 计数日志"] J --> S --> W --> G G -->|"trial → expired"| T --> N --> LOG G -->|"已迁移(幂等重入零重复)"| LOG LOG -->|"下一批 / 30min 后再扫"| J
图 4. 试用到期 reconcile job:30 分钟扫描 → 逐行 Workflow 迁移 → 幂等重入 → 计数日志(对齐既有对账 job 范式)

customer group 解锁付费墙(pricing 原生,禁止自建第二套)

开通链路(付费成功 → 解锁):

sequenceDiagram participant P as Stripe payment_collection(既有通路) participant W as grant-tool-entitlement Workflow participant G as customer group(解锁组 tool_tool_code_active) participant L as ledger 复式账本 participant PR as Medusa pricing P->>W: 付费收款成功(order_ref 关联) W->>W: assert-transition(trial/expired → active 白名单守卫) W->>W: mark-entitled(status → active · entitled_at 落值) W->>G: assign-customer-group(经 company↔customer-group 既有 link 形态) W->>L: record-ledger-entry(tool_subscription · amount_minor 整数 · idempotency_key=收款 id 派生) W-->>P: emit tool-entitlement.granted Note over PR: 解锁生效:customer.groups 已注入 pricing context(validate-add-to-cart 既有链路)→ 工具相关商品/服务以 price_list 配置解锁组专属价格
图 3. 付费开通解锁链路:Stripe 收款 → Workflow 三 step(状态迁移/组挂载/账本入账)→ pricing 原生生效
  • 禁止自建第二套价格门控(任务卡强制):工具访问权判定 =「entitlement 状态 + customer group 成员资格」两事实源的组合,价格呈现完全交给 Medusa pricing;
  • 取消/到期联动:expired/cancelled 时 Workflow step remove-customer-group(移出解锁组,pricing 即时回落默认价);
  • 分层声明:工具本体(如数字员工会话)的业务级访问检查走适配器契约(checkEntitlement),与 pricing 解锁分层——pricing 管「价格呈现」,entitlement 管「功能开关」。

付费入账走 ledger(spec 硬约束三连)

约束落地
spec:arch/finance-ledger(账本 = 单一事实源) 新增 entry_type 枚举候选值:tool_subscription(付费开通入账)/ tool_trial(0 额试用开通 marker,可选——若试用不产生分录则仅用 subscription 值,随联审定);禁止绕过账本直改余额——一切余额影响必须经 ledger entry(append-only),枚举追加沿 h2b 值历史追加先例(constants.ts:57-63)
spec:arch/finance-amount-unit(金额单位) 入账金额一律 amount_minor 整数(既有字段),币种带 currency_code/currency_exponent——定价档位数值(DEC-4)以 minor unit 配置,禁止浮点
spec:arch/stripe-integration(收款通路) 收款走 Stripe payment_collection 既有通路;审计轨迹/幂等铁律适用——开通 Workflow 以 idempotency_key(payment collection id 派生)写 ledger entry,重放不重复入账

owner 维度:工具订阅为平台收入——FINANCE_OWNER_TYPES.platform + platform_revenue 账户,不新增 owner 类型。

工具适配器段接口契约(references_only)

机制层对外暴露的唯一接入契约(首个消费方 AI-3.6-03 立项时以此为准,本卡不设计各工具内部计费细节):

// 内部 service(backend/src/modules/tool-entitlement/service.ts)
checkEntitlement({ tool_code, customer_id }) →
  { entitled: boolean, status: "trial"|"active"|"expired"|"cancelled"|null,
    trial_ends_at: string|null }
  • 工具本体在每个功能入口(会话发起/选品生成/报价生成)调用一次;entitled=false 时工具前端呈现付费引导(引导页 UI 归各工具 TDD);
  • 契约稳定性承诺:机制层交付后该签名冻结;扩展仅限返回体追加字段(向后兼容);
  • 定价档位/试用期默认时长/续费形态 = DEC-4/DEC-5 占位,机制层全部参数化承载,不内联数值。

四类工具映射归属表

#工具(总纲口径)TDD 条目内对应编号映射/差距栏归属适配器挂接状态
1AI 数字店铺无对应编号映射 PRD FR-3.6-02 差距栏「店铺运营智能化增强」(PRD §5.5 映射说明:属 P2 规划)工具本体零实现——挂接随其立项(X-tool-bodies)
2企业数字员工AI-3.6-03(P2·B 波)条目内直接对应首个预期绑定工具——字段级完整度以其立项为准;消费本卡 entitlement 接口契约
3智能选品AI-3.4-03(P2·A 波)条目内直接对应本卡同波(p2-a);选品为 conceptual 架构级,适配器挂接随其字段级落地
4智能报价无对应编号映射 PRD §5.5 映射说明/总纲 3.6.1(「依赖智能选品与数字员工底座,随 P2 规划落地,当前均无 AI 实现」)工具本体零实现——挂接随其立项(X-tool-bodies)

Workflow · API · 合规

Workflow 设计(数据变更必须走 Workflow)

新 Workflow 目录 backend/src/workflows/tool-entitlement/:

start-tool-trial(开通试用:admin 授予或自助入口)
  steps: validate-tool-code(枚举校验) → upsert-tool-entitlement(trial 态,trial_ends_at=now+时长)
       → assign-customer-group(试用组,如需试用级定价) → emit "tool-entitlement.trial-started"
  补偿:删除 entitlement 行/移出组(事务内)

grant-tool-entitlement(付费开通)
  steps: load-tool-entitlement → assert-transition(trial/expired→active 白名单守卫)
       → mark-entitled(entitled_at) → assign-customer-group(解锁组)
       → record-ledger-entry(tool_subscription,amount_minor,idempotency_key=收款 id 派生)
       → emit "tool-entitlement.granted"
  补偿:ledger 冲正(reversal_of_entry_id 关联冲正分录,非删除——append-only)+移出组

expire-tool-entitlement(到期,由 reconcile job 触发)
  steps: load → assert-transition(trial→expired) → mark-expired → remove-customer-group
       → emit "tool-entitlement.expired"
  补偿:快照回写

cancel-tool-entitlement(取消)
  steps: load → assert-transition(trial/active→cancelled) → mark-cancelled → remove-customer-group
       → emit(补偿:快照回写)

API 契约(机制层管理面)

路由方法权限域契约要点
/admin/tool-entitlementsGETadminquery:tool_code/status/customer_id/seller_id/q 分页;响应 { tool_entitlements, count }
/admin/tool-entitlementsPOSTadminbody:tool_code/customer_id/seller_id?/action=start_trial;入 start-tool-trial
/admin/tool-entitlements/[id]GETadmin单条 + last_transition 轨迹
/admin/tool-entitlements/[id]/transitionPOSTadminbody:{ action: "grant"|"expire"|"cancel", order_ref?, reason? };入对应 Workflow
/store/tool-entitlements/meGETstore(customer auth)C 端自查本人 entitlement 列表(工具前端付费引导消费;checkEntitlement 为服务端内部契约不设 store 路由,本路由仅自查展示用)

错误码:404(不存在)/ 409(非法状态迁移)/ 400(validator)。store 端只读自查、无越权面(仅本人 customer_id)。

erDiagram customer ||--o{ tool_entitlement : "customer_id(C 端主体,not null)" seller ||--o{ tool_entitlement : "seller_id(商家级工具,nullable)" tool_entitlement }o--|| tool_code_enum : "四类工具枚举(digital_store 等)" tool_entitlement ||--o| ledger_entry : "order_ref 收款关联 → tool_subscription 分录" company }o--o{ customer_group : "company↔customer-group link(B2B 批量开通通道)" customer_group ||--o{ customer : "解锁组成员资格 → pricing context"
图 5. 实体关系:tool_entitlement 双关联(customer/seller)+ ledger 入账关联;解锁经 customer group 汇入 pricing 原生链路

AI 能力接入点

本条为商业机制:无 LLM 调用声明——试用期计时/开通订单/付费墙/账本入账全程零 AI/LLM 调用,与 translation client 通路无调用关系。能力边界防越界声明:四类工具各自的 AI 接入点(对话引擎 LLM 通路、选品推荐模型等)归各工具本体 TDD——本卡只管「工具的商业开关」,不管「工具的智能本体」。降级方向差异:entitlement 查询失败(DB 异常)时 checkEntitlement 返回 entitled=false + 显式 error 态(宁可拒绝服务不可误放行——AI 故障跳过增强、付费门控故障不放行)。

合规挂钩

NFR / 法规影响判定本卡动作
《特定商取引法》误导性缔约表示 试用期转付费流程的 UI/话术为规制方向(默认勾选续费、误导性「免费」表述禁止) 建设要求落地:①付费/试用开通界面禁止预勾选续费;②「免费」表述必须带试用期时限与到期后果明示;③检查用例框架见验收 A5——检查点随首个绑定工具界面落地执行;条款文本经法务复核后写入产品规则
《消費者契約法》中途解约 若付费工具面向以生活为目的的个人开通,持续性服务合同中途解约规则可能适用 cancel-tool-entitlement Workflow 已承载任意时点取消能力(机制层就绪);适用性判断与退款规则 = 法务确认(D-dec5 关联),上线前置;机制层不预设退款数值
条款法务复核(D-dec5) PRD 验收要点「条款经法务复核」 上线前置非设计前置——feature flag tool_commercialization 的生产开启与条款确认单挂钩;本卡只定义检查点不做法务结论
NFR-3.9-03(审计与可追溯) 付费/试用全链路留痕 账本 append-only(冲正不删除)+ entitlement last_transition 轨迹 + Workflow 事件,三重留痕;管理端可查(GET API)
NFR-3.9-01(APPI) entitlement 关联 customer_id 属既有客户数据利用目的范围内(订单/服务提供) 无新增个人信息处理目的声明;到期通知负载最小化
NFR-3.9-04 / C6 不适用(本卡无 AI 产出物/画像/对话处理;工具本体的成交确认钩子归各工具 TDD) —

前端改动面与 i18n

前端触点(逐端)

端改动说明
admin-panel新增 src/routes/tool-entitlements/page.tsx(列表 + 筛选 + 状态动作 Drawer,骨架复用既有审核动作范式)机制层管理面
vendor-panel暂无改动商家侧自查/付费入口随首个绑定工具 UI 立项(X-tool-bodies,适配器层范围)
storefront / b2b / h2b storefront暂无改动付费引导页归工具本体 TDD(适配器层范围)
influencer-panel / referrer-panel无改动无触点(rg 复核)

i18n 三语言 key 规划(en / zh-Hans / ja)

文件路径新增 key(示意)
admin-panel/src/i18n/translations/{en, zh-Hans, ja}.json toolEntitlement.title / toolEntitlement.tool.*(四工具名)/ toolEntitlement.status.trial|active|expired|cancelled / toolEntitlement.action.grant|expire|cancel / toolEntitlement.compliance.termsNotice(特商法提示位,文案经法务复核后随上线回填——D-dec5 前置声明)

风险

Blocker D-dec4:试用期时长 / 付费档位 / 试点工具选择 / 商业化定价未定
阻塞:定价档位数值配置、绑定工具正式选择、试用期默认时长的生产定值。不阻塞机制层四件(机制全部参数化承载,flag 默认关)。可并行:机制层全量可开工(实体/Workflow/job/解锁链路/账本扩展/admin 管理面);适配器契约可先行冻结签名。
Blocker D-dec5:验收指标基线与条款法务适配未定
阻塞:条款生效(生产 flag 开启)、消契法适用性结论、验收数值定值。不阻塞验收框架(以「基线立项定」占位)与全部设计/开发/测试。可并行:验收框架可先行定稿待数值回填;特商法检查用例(A5)可先行编写;账本/job 单测不依赖数值。
Blocker X-tool-bodies:四类工具本体零实现、绑定排期未定
阻塞:工具适配器段实施(各工具挂接 checkEntitlement 检查点)与首个绑定工具(AI-3.6-03)的字段级完整度定稿。不阻塞机制层四件。可并行:机制层按本卡 DAG 全量推进;适配器契约冻结后 B 波工具 TDD(AI-3.6-03)可直接消费。
合规 特商法误导性缔约表示检查未通过
试用期转付费流程若存在默认勾选续费、误导性「免费」表述即触法规制方向。缓解:建设要求落地为检查用例框架(禁止预勾选续费断言/「免费」必带时限与到期后果断言/开通确认页必含条款链接断言),随首个绑定工具界面执行;条款法务复核通过为生产 flag 开启的硬前置。
Medium 消契法中途解约规则适用性未决
面向以生活为目的的个人开通的持续性服务合同可能适用中途解约规则。缓解:cancel Workflow 已承载任意时点取消能力(机制层就绪);适用性判断与退款规则归法务确认(D-dec5 关联),上线前置;机制层不预设退款数值。
Low 门控故障误放行
checkEntitlement 遇 DB 异常若默认放行将造成商业损失。缓解:降级方向显式声明为 entitled=false + error 态(宁可拒绝服务不可误放行——与 AI 增强的降级方向相反),并纳入降级路径测试。

前置决策点

  • D-dec4 试用期时长 / 付费档位金额(minor unit)/ 试点工具选择——决策归属 DEC-4;机制层参数化承载,不内联数值。
  • D-dec5 条款生效(法务复核)/ 消契法适用性结论 / 验收数值(试用→付费转化率目标等)——上线前置非设计前置;转化率指标名 tool_trial_conversion_rate(数据源:entitlement 状态迁移事件聚合)随实现纳入。
  • X-tool-bodies 四类工具本体绑定排期未定——适配器层挂接随其立项;首个绑定工具 = AI-3.6-03(B 波)。
  • tool_trial 枚举值 ledger entry_type 的 tool_trial(0 额试用 marker)是否产生分录——随联审定,若试用不产生分录则仅用 tool_subscription 值。
依赖与下游消费

上游:TDD-TEMPLATE.md(十要素结构与深度基准)。同波:AI-3.4-03(映射归属表第 3 行——同波并行无设计耦合,选品 conceptual 架构级不含计费)。下游:AI-3.6-03(B 波,首个预期绑定工具——消费 entitlement 接口契约;字段级完整度以其立项为准;其商业化绑定不在此设计计费细节);AI 数字店铺/智能报价(无编号映射项——映射归属见映射归属表,防止验收口径漏项)。

实施排期与验收

子任务 DAG 与估时(机制层)

子任务依赖估时
E1 实体 + migration无0.5d
E2 Workflow 四件E11.5d
E3 到期 jobE20.5d
E4 group 解锁联动E21d
E5 ledger 枚举 + 入账 stepE21d
E6 admin API + 管理面E21.5d
E7 适配器契约冻结 + 单测E10.5d

验收标准

#验收标准映射
A1试用—到期—付费全流程可配置:start_trial →(时间窗)→ expire(job 自动)→ grant(付费激活)→ cancel 全链路可执行;试用期时长/定价档位参数化配置生效(数值 DEC-4/DEC-5 占位)PRD 要点①
A2付费墙解锁生效:grant 后 customer 落解锁组,pricing context(validate-add-to-cart 既有链路)命中解锁组 price_list;expire/cancel 后组移除、价格回落付费墙
A3入账合规:grant 产生 tool_subscription 分录,amount_minor 整数、idempotency_key 幂等(重放不重复入账)、冲正走 reversal_of_entry_id——零绕过账本的余额变更ledger / spec 三连
A4到期 job 幂等:reconcile job 重复执行/重入,已迁移行零重复迁移、扫描-迁移计数日志完整(30min 范式对齐)到期 job
A5误导性缔约表示检查框架:用例清单落文(默认勾选续费 = 禁止断言;「免费」表述必带时限与到期后果断言;开通确认页必含条款链接断言)——随首个绑定工具界面执行,条款文本 D-dec5 回填PRD 要点③
A6状态机守卫:非法迁移(如 active→trial、expired→expired)409;每次迁移 last_transition 轨迹落值状态机
A7L0 门禁:本文档十要素齐备 + 关键锚点可 rg(ledger-entry.ts / validate-add-to-cart.ts / reconcile-h2b-deposit-timeout.ts / tool_entitlement / 映射归属 / amount_minor);finance 域既有单测回归(reconcile-money-flow.unit.spec 等复跑)模板
A8机制层独立开关:flag 关闭时机制 API/路由整体不可见,工具侧 checkEntitlement 恒 entitled=true(免费态)——机制旁路零影响工具主流程feature flag

测试策略(分层)与 L0 门禁

层范围明细
新增单测(service/状态机)实体 / 契约状态机白名单(合法/非法迁移矩阵);checkEntitlement 四态 + 异常 error 态;tool_code 枚举校验
新增单测(job)到期 job到期扫描窗口断言(时钟注入,对齐 resolveDepositTimeoutHours 导出注入范式);幂等重入;BATCH_LIMIT 分批
新增 integration(Workflow+API)全链路start_trial → expire → grant → cancel 全链路;grant 的组挂载 + 账本分录 + 幂等重放断言;cancel 的组移除断言;admin 权限域守卫
既有回归A7finance 域既有单测(reconcile-money-flow 系列)复跑——entry_type 枚举追加不破坏既有断言
降级路径测试A8flag 关闭旁路;checkEntitlement DB 异常 → entitled=false + error 态(不放行方向)

迁移与回滚

变更迁移 / 回滚路径
tool_entitlement 新表经 medusa db:generate tool-entitlement 生成(新模块独立 migration 序列)
LEDGER_ENTRY_TYPES 枚举追加append-only 账本不可改历史:纯追加新值(tool_subscription 等),不重命名/不删除既有任何枚举值;migration 仅更新 enum 约束定义,既有分录零改写;枚举值一旦发布不回收,仅停用
seed 兼容不改 pnpm db:reset / db:reset:demo——种子不注入 entitlement 数据(空表下 checkEntitlement 恒 entitled=true 免费态,A8);demo 链路零依赖
机制层整体feature flag 关闭即旁路——API 不可见、checkEntitlement 恒免费态;已产生的 entitlement 行/分录保留(append-only,不物理删)
解锁组联动Workflow 补偿 + 组移除即价格回落;无价格数据残留(price_list 配置为 admin 侧运营数据,独立于代码回滚)
收款关联Stripe payment_collection 既有通路自带 refund/取消原语;本卡不新建收款回滚逻辑
feature flag 与上线顺序(含条款门禁)

新增 featureFlags.tool_commercialization(featureFlags 区,默认 false——机制层独立开关)。上线顺序:①机制层开发+测试(flag 关)→ ②DEC-4 数值配置 → ③条款法务复核通过(D-dec5)+ 特商法检查用例(A5)执行通过 → ④生产 flag 开启 → ⑤首个绑定工具(AI-3.6-03)适配器挂接。条款未复核前 flag 生产不可开启——「上线前置非设计前置」的结构化落位。

附录 · 溯源

本文档生成自 docs/reports/ai-module-prd/tdd/AI-3.2-04-tool-trial-and-paywall.md(TDD 深度分级 architectural;PRD V1.4)。章节映射与处理方式如下:

本文档章节源章节处理
摘要元数据表 + 两层边界总口径 + §1.3 判定Summarized
关键概念§4 / §6 术语Summarized
两层边界总览 / 首切片边界声明§4.0Preserved
图 1 两层边界 / 图 2 状态机 / 图 3 开通解锁时序 / 图 4 到期 job / 图 5 实体关系§4.0 / §4.1 / §4.3 / §4.2 / §4.1+§4.3Inferred(可视化转译,节点内容对齐源文字)
tool_entitlement 字段表与索引约束§4.1Preserved
试用期计时与到期 job§4.2Preserved
customer group 解锁付费墙§4.3Preserved
ledger 硬约束三连§4.4Preserved
checkEntitlement 接口契约§4.5Preserved
四类工具映射归属表§3.1(修正⑦强制)Preserved
Workflow 四件 step 链(代码块)§4.6Preserved
API 契约表 + 错误码§4.7Preserved
AI 能力接入点 / 合规挂钩§5 / §6Preserved(条目化)
前端触点 / i18n key 规划§4.8 / §4.9Preserved
风险§7.1 二分表 + §6 合规Summarized
前置决策点§7 + §4.4 联审项Preserved
实施排期与验收(DAG/验收/测试/迁移回滚/flag 顺序)§8 / §9 / §10Preserved(回滚压缩为表)
代码现状底座(四块付费原语 file:line)§2.1 / §2.2Summarized(关键锚点保留:ledger-entry.ts:9-28、validate-add-to-cart.ts:70-102、price route :153、capture-final-h2b.ts:88/107/277、reconcile-h2b-deposit-timeout 范式)
锚点复核约定

源 TDD 全部锚点在其 run(run-d7006c21fca3)以 rg/sed 逐条复核,漂移双写共 3 处(ledger-entry.ts、constants.ts owner 区、company-customer-group.ts),validate-add-to-cart.ts:70-102、variants price route :153、capture-final-h2b.ts 三锚点、constants.ts:40-64 复核精确无漂移。本文档保留关键锚点;规范性要求以源 TDD 为准。