# Mtaa 产品原型缺口与验证规格

> 审计日期：2026-08-24  
> 审计对象：`prototypes/02-product-prototypes/` 与 `prototypes/03-business-model/`。  
> 审计目标：判断原型是否足以验证“无库存卖家 + 平台供货直发 + 熟人销售”模式，而不是按页面数量评价视觉完成度。

## 结论

当前原型并非“没有内容”：卖家、买家、运营页面地图完整，买家路径已经是手机壳，商业模式有 Hub/CLD/SFD/BoT 叙事。但它目前仍主要是概念、视觉和讲解原型，不能验证完整经营闭环。

最大缺口不是再增加一个页面，而是：

- 已新增 `demo-state.js`，发布、店铺读取、订单、履约、送达和佣金释放已经可以在同源页面间共享演示状态。
- 供货侧仍没有库存预占、缺货、采购和供货 SLA。
- 支付已有“失败可见、不生成订单、重试成功才进履约”的最小演示；待确认、超时、重复扣款、取消、退款和对账仍缺。
- 履约已能推进主链，但仍缺少跨买家、运营、卖家和钱包的异常责任处理。
- 分享中心仍只生成文案，触达/打开/成交是硬编码。
- 钱包已能读取送达后释放的演示佣金，但提现、对账和真实结算仍未接后端。

因此当前原型适合演示方向，不足以证明订单经济、履约可靠性和卖家持续经营。

## 已覆盖

### 卖家

`dashboard.html`、`catalog.html`、`store.html`、`share.html`、`orders.html`、`wallet.html` 已覆盖收益、选品、店铺模板/组件、分享文案、订单时间线和提现反馈表面。

### 买家

`storefront.html → product.html → cart.html → track.html` 已覆盖手机店铺、商品详情、移动货币支付反馈和跟踪页面。

### 运营

`ops-overview.html`、`ops-supply.html`、`ops-fulfillment.html`、`ops-resellers.html`、`ops-trust.html`、`ops-levers.html` 已覆盖供给、履约、卖家漏斗、信任质量和策略杠杆表面。

### 商业模式

`prototypes/03-business-model/` 已覆盖 Hub、CLD、SFD、BoT；可讲解回路和延迟，但不是带参数输入的运行模型。

## P0：必须先补才能验证商业模式

| 缺口 | 最小 UI slice | 要验证的假设 |
|---|---|---|
| 跨页共享状态 | **已完成 Round 4：**发布店铺 → 买家读取同一布局 → 下单 → 运营读取订单 → 送达 → 钱包释放佣金 | 主链状态能在同源页面产生同一个可观察结果 |
| 支付异常/退款 | **部分完成（账本 R15/R17）：**失败/超时（pending→timeout）/取消均反馈可见且不生成订单，可重试；已送达可退款——钱包佣金回退冻结、track/wallet 可解释。重复扣款冲正、拒收、部分退款与对账仍缺 | 失败不会悄悄变成坏账或静默丢单 |
| 库存/供货 | **部分完成（账本 Round 16）：**平台仓共享 `inventory`，下单自动扣减；三页读同一库存数字；清零后结账拦截且不生成订单；ops-supply 可补货 +N。替代品、供应商 SLA、失败配送回流仍缺 | 平台直发承诺可以兑现 |
| 履约例外 | 拣货、发出、配送、拒收、重派、送达和责任人 | 履约成本和信任损耗可以被控制 |
| 地址/取货点 | 地址、地标、取货点、配送费和 ETA | 目标城市的最后一公里可执行 |

## P1：影响留存和真实使用

- 卖家 onboarding、地区/语言和钱包绑定。
- 卖家首单、送达、可提现、提现失败和对账。
- 分享链接、会话上下文、订单归因和消息失败。
- 售后工单、争议升级、责任归属和通知。
- 买家取消、退款、退货、替代品和客服回流。
- 运营动作真正改变库存、产能、SLA、质量或卖家指标，而不是只显示“已处理”。

## P2：核心订单经济成立后再做

- 多国多钱包和跨境采购。
- BNPL、贷款、复杂金融服务。
- 推荐、完整 CRM、自动化营销和高级仿真。
- 大规模本地化、离线能力和多渠道消息编排。

## Round 4 已实现的原型切片

```text
店铺发布
  → 手机店铺读取同一已发布布局
  → 买家下单
  → 运营推进供货/履约状态
  → 买家看到送达
  → 钱包读取并释放佣金
```

实现文件：`prototypes/02-product-prototypes/demo-state.js`，并接入 `store.html`、`storefront.html`、`cart.html`、`track.html`、`orders.html`、`ops-fulfillment.html`、`wallet.html`。状态写入 `localStorage` 仅用于同源原型演示；不代表后端持久化、真实支付、真实物流或 WhatsApp API。下一轮仍应补退款、库存预占、争议和多订单并发。

## 第 6 轮补充：支付异常最小切片（账本 Round 15）

- `cart.html` 新增“异常演示 · 模拟支付失败”入口和 `PaymentAttempt` 状态展示。
- 失败时共享状态只记录 `paymentAttempt.status = failed`，不创建订单；页面给出可理解反馈和“重试支付”按钮。
- 重试成功后才创建 `MT1003`，进入既有 `track → wallet` 履约链；重置演示状态会同时清空支付尝试与订单。
- 非目标不变：不接真实支付网关、退款 API、webhook 对账或生产后端。

## 第 7 轮补充：库存预占与缺货反馈切片（账本 Round 16）

- `demo-state.js` 新增 `inventory`（p1–p4 各一个数字，初始 p1=1 / p2=4 / p3=2 / p4=6），进入 `fresh()` 默认值，旧 localStorage 数据自动兼容；新增接口 `MtaaDemo.inventory()` 与 `MtaaDemo.restock(sku, n)`。
- `product.html` 库存标签、`catalog.html` 四个 SKU 行、`ops-supply.html` 供给目录表格读取同一份共享数字（新增 id 挂点 + 同步脚本）。
- 下单成功自动扣减对应 SKU；库存为 0 时 `cart.html` 结账拦截：按钮显示「缺货 · 补货后可下单」，只记 `PaymentAttempt=failed('out_of_stock')`，不生成订单。
- `ops-supply.html` 新增「库存预占演示」卡片：四个「补货 +5」按钮与「演示：Solar 售罄」一键清零动作，写回共享状态全站可见。
- 重置演示状态后库存还原默认值。
- 验证：入库 `tests/smoke.test.js` 28 passed / 0 failed（主链 11 + 支付异常 9 + 库存 8），`check-scripts.js` 30 HTML / 24 段内嵌脚本 + demo-state.js 全过，`check-links.js` 309 个本地引用缺失 0。
- 非目标不变：不做并发锁、预占超时释放、真实仓储 API。

## 第 8 轮补充：支付异常补全与退款联动切片（账本 Round 17）

- `PaymentAttempt.status` 扩展为 idle / pending / failed / timeout / cancelled / succeeded / refunded；`cart.html` 异常演示面板新增「模拟支付超时 / 取消」按钮。
- 超时路径：点击后先进入 pending「处理中 · 等待确认」，约 1.2s 未确认自动转 timeout，期间点击支付被忽略；超时态可重试且始终不生成订单。
- `demo-state.js` 新增 `MtaaDemo.refundOrder()`：仅 delivered 订单可退；退款后订单终态 `refunded`、`commissionRefunded=true`，`wallet.available` 回退佣金。
- `track.html` 已送达终态新增「模拟退款」入口；退款后渲染「当前状态 · 已退款」终态并解释佣金去向。
- `wallet.html` 新增「佣金变动解释」行：说明每笔佣金释放、冻结或退款回退的原因。
- 验证：smoke 39 passed / 0 failed（主链 11 + 支付异常 9 + 库存 8 + 本轮 11）；静态基线保持全绿。
- 非目标不变：不接真实退款 API、webhook 对账、部分退款或重复扣款冲正。

## 第 9 轮补充：多订单并发改造切片（账本 Round 18）

- `demo-state.js` 状态结构升级：单 `DemoOrder` → `orders[]`；单号自增（首单保持 MT1003，其后 MT1004…）；`read()` 内置迁移——旧 localStorage 单 `order` 数据自动包装为数组并清理旧键。
- 新增接口 `MtaaDemo.orders()` / `getOrder(id)`；`setOrderStatus(id, status)` 支持按 id 定位（无 id 兼容 = 最新单）；`refundOrder(id)` 按单退款。
- `wallet.pending` 改为未释放佣金合计；送达释放时按单扣减，不再整体清零。
- 页面接线：cart 支持「再下一单」连续购买；orders.html 与 ops-fulfillment.html 新增实时共享订单列表区；track.html 支持 `?id=` 定位任意单并按单推进/退款；wallet.html 解释行给出「共 N 单 + 已释放/待结算分布」。
- 验证：smoke 51 passed / 0 failed（新增 Slice C 用例 12 个，含旧数据迁移）；静态基线全绿（内嵌脚本口径更新为 26 段）。
- 非目标不变：不做真实并发锁/幂等键/服务端分页；静态历史示例行（MT1001 等）保留为固定布景。

## 第 10 轮补充：售后争议责任链切片（账本 Round 19）

- `demo-state.js` 新增 `Dispute` 实体与状态机 open → in_review → resolved：争议单号自增（DP2001 起），字段含 orderId/reason/responsible/openedAt/resolvedAt；`wallet` 增加 `frozen` 口径（旧数据自动补 0）。
- 新接口：`openDispute(orderId, reason)`（仅 delivered 且无进行中争议；成功即把该单已释放佣金从 available 移入 frozen）、`acceptDispute(id)`、`resolveDispute(id, responsible)`、`disputes()`。
- 三种责任三种可解释结果：判物流=物流赔付，订单保持 delivered、佣金解冻发还；判卖家=卖家担责，订单转 refunded、冻结佣金扣除不发放；判平台=平台兜底，买家获赔但佣金照常发还卖家（`platformSubsidized` 标记）。
- 页面接线：track 已送达终态新增「申请售后」，开争议后展示争议状态并阻止重复申请；ops-trust 首次接入共享状态，新增实时争议处理队列（受理 + 判物流/判卖家/判平台）；wallet 解释行出现「另有争议冻结 $X」。
- 验证：smoke 65 passed / 0 failed（Slice D 新增 14 用例，既有用例零改动通过——纯增量接口）；静态基线全绿（27 段内嵌脚本、312 引用）。
- 非目标不变：不做部分退款、举证上传、仲裁升级与真实赔付打款。

## 第 11 轮补充：地址 / 取货点 / 配送费 ETA 切片（账本 Round 20）

- `demo-state.js` 新增 Lagos 三档送货预设 `ADDRESSES`：Yaba 公寓（$1.50 · 2–4 天）、Ikeja 办公室（$2.00 · 3–5 天）、Surulere Mtaa 取货点（免运费 · 次日自提）；`state.checkout.addressId` 默认 home，旧数据自动补齐。
- 新接口：`setAddress(id)` / `currentAddress()` / `getAddress(id)`（导出 `ADDRESSES` 常量）；`createOrder` 将所选地址连同费用/时效写入订单 `addressSnapshot` 与 `deliveryFee`——佣金仍按商品金额计，不受运费影响。
- 页面接线：cart 支付区上方出现地址选择卡，三档按钮切换即写共享状态，「送货摘要 + 动态合计」随档位更新；orders 共享卡显示 📍 目的地与预计时效。
- 验证：smoke 73 passed / 0 failed（Slice E 新增 8 用例：预设/默认值、切换写入、自提免运费快照、办公室运费入单合计 $14.90、佣金不受运费影响 pending=$3.88、orders 快照展示、无 runtime errors）；既有用例零改动通过。
- 非目标不变：不做地址编辑表单、邮编校验、物流商 API 与实时轨迹。

## 第 12 轮补充：分享归因切片（账本 Round 21）与六片收官

- `demo-state.js` 新增归因状态域：`state.attribution.ref`（会话级来源，缺省 null → 订单记 organic）；接口 `setReferrer(ref)` / `referrer()`；派生视图 `shareStats()` 按来源聚合订单数与累计佣金——纯函数实时推导，无独立计数器冗余。
- 页面接线：storefront 支持 `?ref=` 进入即写共享状态并显示来源横幅（「来自 xx 的分享 · 下单后佣金将归属 TA」）；orders 卡显示 🔗 来源行；ops-resellers 首次接入共享状态，新增「分享归因统计」表。
- 验证：smoke 81 passed / 0 failed（Slice F 新增 8 用例：organic 缺省、?ref 写入与横幅、归因入单、aisha/bode 双来源切换、shareStats 两来源各 1 单 $1.94、ops-resellers 渲染、orders 来源行）；既有用例零改动通过；29 段内嵌脚本基线。
- **六片收官（R16–R21）**：库存预占 / 支付异常补全与退款 / 多订单并发 / 售后争议责任链 / 地址配送费 ETA / 分享归因全部落地，原型级「分享 → 下单 → 履约 → 售后 → 佣金」闭环可完整演示。剩余缺口为真实服务接入层（支付回调、物流商 API、WhatsApp Business API、后端账号）、对账资金层（重复扣款冲正/部分退款/提现对账）、履约深化（地址编辑/失败配送回流）与市场适配实测；BNPL 与跨国复杂金融维持不做。

## Interface / Domain Check

- **Existing**：当前 HTML 路由、seller/buyer/ops 导航、店铺发布、支付反馈、订单推进、提现反馈动作。
- **Modify**：订单、支付尝试、库存预占、履约、退款和佣金结算的展示状态。
- **Add**：异常动作、状态反馈、跨角色运营入口和演示重置。
- **Preserve**：离线 HTML 可打开、买家手机体验、三角色路径和研究/产品/商业模式分层。
- **Domain modified**：需要把 `Seller`、`Buyer`、`SKU`、`Inventory reservation`、`Order`、`Payment attempt`、`Fulfillment node`、`Refund/Dispute`、`Commission/Payout`、`Conversation/Share attribution` 从隐含假设提升为可验证概念。

## 审计证据

- 全目录本地 href 扫描：309 个本地引用，0 缺失（`tests/check-links.js` 可复跑）。
- HTML 标签配平检查：通过。
- 内嵌脚本基线：30 个 HTML / 27 段内嵌脚本 + `demo-state.js` 全部通过 `node --check`（`tests/check-scripts.js` 口径；历史口径"34 段"含 src 引入标签，现以入库脚本精确口径为准）。
- jsdom 回归套件已入库 `tests/smoke.test.js`：81 passed / 0 failed / 0 runtime errors——主链 11 用例（发布→买家读取→支付建单 MT1003→packed/shipped/delivered→钱包 $1.94→提现 processing）、支付异常 9 用例（失败可见/无订单/可重试/重试成功/既有链不受影响）、库存 8 用例（三页一致/售罄联动/缺货拦截/补货恢复/重置还原）、异常补全与退款 11 用例（取消/pending→timeout 时序/超时重试/退款回退 $1.94→$0.00/track 与 wallet 终态解释）、多订单并发 12 用例（旧单迁移/续号 MT1004–MT1005/列表渲染/缺省最新/?id 定位/推进隔离/wallet 汇总 $3.88/$1.94/按 id 退款隔离/paid 单退款守卫）、争议责任链 14 用例（开争议冻结 $1.94→可用 $0.00、重复开拒、track 争议态、ops-trust 受理、三责判定钱包结果差异：物流发还 $1.94 / 卖家没收转 refunded / 平台兜底至 $3.88、paid 单守卫）、地址配送 8 用例（三档预设含自提点/默认 home/切换写入共享状态/自提免运费快照 pickup=true/办公室单 deliveryFee=$2 合计 $14.90/两单佣金均 $1.94 不受运费影响/orders 卡 📍 快照）、分享归因 8 用例（organic 缺省/?ref 写入与横幅/归因入单/aisha-bode 双来源/shareStats 推导各 1 单 $1.94/ops-resellers 渲染/orders 🔗 来源行）。
- `store.html` 宽泛点击探针仍出现 5 个 TypeError，原因是 re-render 后继续使用旧 DOM 节点/索引；不能直接等同真实用户路径，但说明该页需要更稳健的 DOM 回归。
- 当前已发现 `localStorage` 接线仅存在于原型 demo-state 层；它是同源演示状态，不是后端持久化。

## 依据

- 共享状态适配层：[`prototypes/02-product-prototypes/demo-state.js`](../../../../prototypes/02-product-prototypes/demo-state.js)。
- 当前原型账本：[`prototypes/02-product-prototypes/PROTOTYPE-LEDGER.md`](../../../../prototypes/02-product-prototypes/PROTOTYPE-LEDGER.md)。
- 当前产品入口：[`prototypes/02-product-prototypes/index.html`](../../../../prototypes/02-product-prototypes/index.html)。
- 商业模式入口：[`prototypes/03-business-model/mtaa-index.html`](../../../../prototypes/03-business-model/mtaa-index.html)。
- 市场失败和竞争证据：[`04-失败案例与竞争空间.md`](./04-失败案例与竞争空间.md)。
- HTML 审计页：[`prototypes/02-product-prototypes/gap-audit.html`](../../../../prototypes/02-product-prototypes/gap-audit.html)。
