摘要
本条目对应 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)= 上线前置非设计前置,本卡只定义检查点不做法务结论。
复式账本(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 命中——机制实体从零新建。
关键概念
方案设计
两层边界总览
| 层 | 归属 | 开工条件 | 内容 |
|---|---|---|---|
| 机制层 | 本卡 owns | 无外部依赖——A 波立即可开工 | ① tool_entitlement 实体 ② 试用计时/到期 job ③ customer group 解锁付费墙 ④ ledger entry_type 入账扩展(+ admin 管理面) |
| 工具适配器层 | references_only | X-tool-bodies(四类工具本体落地,绑定排期未定) | 各工具挂接 trial/entitlement 检查点的接入契约;首个绑定工具 = AI-3.6-03(B 波) |
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:
| 字段 | 类型 | 约束/默认 | 说明 |
|---|---|---|---|
id | text | PK,prefix tentl | — |
tool_code | enum(digital_store, digital_employee, product_selection, smart_quote) | not null | 四类工具注册枚举——与映射归属表四行一一对应;新工具经迁移扩展枚举 |
customer_id | text | not null | C 端主体关联(customer.id)——双关联设计:四类工具横跨 C 端工具与 seller 级商家工具,单一粒度会返工 |
seller_id | text | nullable | 商家主体关联(seller.id;seller 级工具填写;B2B 企业开通经 company↔customer-group link 批量落 customer 级) |
status | enum(trial, active, expired, cancelled) | not null, default trial | 生命周期:trial(试用中)→ active(付费开通)→ expired(试用到期未付费)/ cancelled(取消);active 可 → cancelled |
trial_started_at | timestamptz | nullable | 试用起点(开通试用时写入) |
trial_ends_at | timestamptz | nullable | 试用到期点(trial_started_at + 时长;时长 = 可配置参数,数值 DEC-4/DEC-5 占位——机制不写死,admin 配置项起步) |
entitled_at | timestamptz | nullable | 付费开通生效时点(写入 active 时) |
order_ref | text | nullable | 开通收款关联(payment_collection/payment id,对齐 capture-final-h2b.ts:88 范式) |
last_transition | jsonb | nullable | {from, to, reason, actor_id, at} 状态轨迹(供 NFR-3.9-03 审计查询) |
metadata | jsonb | nullable | 扩展(绑定工具侧业务上下文——适配器层填充,机制层不解释) |
created_at / updated_at / deleted_at | timestamptz | 标准三件套 | — |
索引与约束:UNIQUE(tool_code, customer_id)(同主体同工具一条 entitlement 行,生命周期行内演进);INDEX(status)、INDEX(trial_ends_at, status)(到期扫描热点)、INDEX(customer_id)、INDEX(seller_id)。
试用期计时与到期 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-entitlementWorkflow; - 幂等:job 可重入(状态机守卫保证重复触发不重复迁移——已 expired 行不再命中扫描条件);逐行 skipped/transitioned 计数日志(范式原文对齐);
- 到期联动:状态迁移 trial→expired + emit 通知事件(
tool-entitlement.expired)——通知渠道沿平台既有通知基建消费,事件负载仅含 entitlement id/tool_code/customer_id(最小化)。
customer group 解锁付费墙(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 条目内对应编号 | 映射/差距栏归属 | 适配器挂接状态 |
|---|---|---|---|---|
| 1 | AI 数字店铺 | 无对应编号 | 映射 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-entitlements | GET | admin | query:tool_code/status/customer_id/seller_id/q 分页;响应 { tool_entitlements, count } |
/admin/tool-entitlements | POST | admin | body:tool_code/customer_id/seller_id?/action=start_trial;入 start-tool-trial |
/admin/tool-entitlements/[id] | GET | admin | 单条 + last_transition 轨迹 |
/admin/tool-entitlements/[id]/transition | POST | admin | body:{ action: "grant"|"expire"|"cancel", order_ref?, reason? };入对应 Workflow |
/store/tool-entitlements/me | GET | store(customer auth) | C 端自查本人 entitlement 列表(工具前端付费引导消费;checkEntitlement 为服务端内部契约不设 store 路由,本路由仅自查展示用) |
错误码:404(不存在)/ 409(非法状态迁移)/ 400(validator)。store 端只读自查、无越权面(仅本人 customer_id)。
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 前置声明) |
风险
前置决策点
- 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 四件 | E1 | 1.5d |
| E3 到期 job | E2 | 0.5d |
| E4 group 解锁联动 | E2 | 1d |
| E5 ledger 枚举 + 入账 step | E2 | 1d |
| E6 admin API + 管理面 | E2 | 1.5d |
| E7 适配器契约冻结 + 单测 | E1 | 0.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 轨迹落值 | 状态机 |
| A7 | L0 门禁:本文档十要素齐备 + 关键锚点可 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 权限域守卫 |
| 既有回归 | A7 | finance 域既有单测(reconcile-money-flow 系列)复跑——entry_type 枚举追加不破坏既有断言 |
| 降级路径测试 | A8 | flag 关闭旁路;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/取消原语;本卡不新建收款回滚逻辑 |
新增 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.0 | Preserved |
| 图 1 两层边界 / 图 2 状态机 / 图 3 开通解锁时序 / 图 4 到期 job / 图 5 实体关系 | §4.0 / §4.1 / §4.3 / §4.2 / §4.1+§4.3 | Inferred(可视化转译,节点内容对齐源文字) |
| tool_entitlement 字段表与索引约束 | §4.1 | Preserved |
| 试用期计时与到期 job | §4.2 | Preserved |
| customer group 解锁付费墙 | §4.3 | Preserved |
| ledger 硬约束三连 | §4.4 | Preserved |
| checkEntitlement 接口契约 | §4.5 | Preserved |
| 四类工具映射归属表 | §3.1(修正⑦强制) | Preserved |
| Workflow 四件 step 链(代码块) | §4.6 | Preserved |
| API 契约表 + 错误码 | §4.7 | Preserved |
| AI 能力接入点 / 合规挂钩 | §5 / §6 | Preserved(条目化) |
| 前端触点 / i18n key 规划 | §4.8 / §4.9 | Preserved |
| 风险 | §7.1 二分表 + §6 合规 | Summarized |
| 前置决策点 | §7 + §4.4 联审项 | Preserved |
| 实施排期与验收(DAG/验收/测试/迁移回滚/flag 顺序) | §8 / §9 / §10 | Preserved(回滚压缩为表) |
| 代码现状底座(四块付费原语 file:line) | §2.1 / §2.2 | Summarized(关键锚点保留: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 为准。