架构审查:类交易系统的严谨性
历史证据:保留下文编写当时的范围、发现和检查计数,不作为现行政策或未决台账。当前业务机制见确认政策,剩余事项见DECISIONS,来源分工见事实源索引。后续确认已部分收敛拆单、取消、计价与时间规则,不回写旧结果伪造当时已验证。
2026-09-29;主会话自审与修订,不是独立评审、S5/S7 clean round 或生产验收。 Runtime 检查为 inactive、bound_req=null。本轮仅修改架构文档及文档模型检查器,不绑定 REQ,不动产品代码、原型、部署、真实资金或 Runtime。
1. 结论与要求
原架构已经有事实 Owner、快照、退款额度和跨域协调意识,但没有把“一周无忧”落实到足以阻止错误履约的身份、状态与原子裁决上。最大风险不是漏了一个后台页面,而是两个局部合法动作组合起来变成重复花钱、重复履约或终态复活。
本轮按领域驱动设计梳理对象与责任,按状态机方法将终态、合法迁移和恢复写入单一候选定义。完成的是设计修订与有限模型检查;数据库原子性、支付适配、跨域握手和设备防重仍无产品证据,不能声称已达到交易系统的运行可靠性。
2. 有限审查库存与范围
| 范围 | 本轮检查内容 | 处理 / 边界 |
|---|---|---|
| architecture 总入口、05 DOMAIN/WEEKLY-CARE-PLAN/FLOW | 业务主链、入口出口、每日确认、旧单与新单 | 修正归属和历史机制歧义,重写流程图 |
| 06 十个子域目录及占位材料 | 候选问题、交易责任是否有承接位置、占位成熟度 | 目录逐域映射,SD-02/03/04/06 补主链;不是完整十子域设计评审 |
| 07 十张 BC 卡片 | 谁可修改什么、失败恢复、生命周期混淆 | 核对全部候选边界;修改 BC-02/05/06/07 |
| 07 OWNERSHIP / CONTEXT-MAP / BOUNDARY-DECISIONS / REVIEW | 事实、流程协调、取舍、既有未决问题 | 补每日授权、购买批次、原款分配、执行 gate;消除“失败恢复旧义务”的歧义 |
| 08 十张模型卡、MODELING-RULES / CONSISTENCY / REVIEW | 对象身份、金额/数量、终态、去重、跨对象约束、下游核算 | 十域回填约束;新增交易专项主讲,保留非交易范围未决项 |
| state / data-model / dataflow 及总架构模板 | 活动产品契约存在性与接缝 | 原先只有模板;新增六类候选机器。共享字段 Schema、正式 API/事件和完整数据流仍未建立,不伪称已交付 |
| 小程序 weekly-plan-experience / confirmation-window | 用户意图、授权、免费边界、付款后的行动 | 作为业务证据;预填价格、时间及历史“恢复”不当批准政策 |
| 小程序 stories / flows / scenario-model | 旧快照中的自动配送、20:00、直接退款 | 检出与新方向的差异;保留原型,不以旧场景通过证明新架构 |
| 后台 MODULE-DESIGN / CROSS-FLOWS | 已有退款守卫、停止协调、岗位动作及证据限制 | 只读核对当前工作稿;未执行全部浏览器场景,不覆盖并行原型变更 |
| 历史 docs_bak、全量业务实现/外部系统 | 不是本轮活动架构审查基线 | 未重新逐页/逐代码审计;无完整实现结论 |
根目录其他原型/后台/REQ 草稿变更为已有并行工作,本轮未改写或提交。架构中没有足够资料的场景记录为未完成,不填 N/A。
3. 发现、修改与剩余风险
| ID | 原设计风险 / 证据位置 | 本轮处理 | 未完成部分 |
|---|---|---|---|
| AT-01 | BC-05/DM-05 主要写订阅周期,05 最新机制要求逐日主动确认 | Customer 餐次、Commerce 批次/订单、Demand 授权分开 | 最终分组基数与共享字段 |
| AT-02 | CONTEXT-MAP §5.3“保留或恢复既有义务”;FLOW“新的尝试”易被读成旧单恢复 | 旧终态永久结束,明确后继新单/新安排;冻结后不静默解冻 | 正式替换政策及产品接口 |
| AT-03 | DM-06“待确认/已确认”未区分商业接受和用户配送授权 | 六条独立生命周期;已付仍等待每日授权 | UI/后台组合查询契约 |
| AT-04 | 同源幂等与周期唯一订单不足以表达合法换菜/多餐 | 来源意图、餐次、前驱/后继与分配范围分别标识 | 数据库唯一键、索引和迁移 |
| AT-05 | 确认/到期仅有原则,没有权威裁决边界 | Demand 单安排 revision、时间谓词、不可变确认与 Outbox | 截止/边界政策、真实竞争测试 |
| AT-06 | 冻结和开工跨域,单订单版本挡不住旧任务 | Fulfillment gate、fence、数量谱系守卫、停止墓碑 | 物理工位/设备执行证据、质量撤销协议 |
| AT-07 | RefundBudget 保护退款但未统一替换抵扣与退款竞争 | 原实收切片守恒、额度与分配原子提交、未知占用不释放 | 分摊/舍入、真实存储隔离及压力测试 |
| AT-08 | “留在计划”无确定退出/批次结束关系 | 推荐范围内暂留,结束自动核算原交易退差额 | 时点、计价、部分结算政策仍待业务确认 |
| AT-09 | 订单终点和退款/售后/账务容易互相回写 | 终态仍可有独立退款、售后、补发和 Adjustment | 售后/调整完整状态机尚未展开 |
| AT-10 | 外部失败、未知、重试易混为一体 | 独立目标/尝试/实收;UNKNOWN 核验原目标,晚到相反证据另立差异 | Provider 确定失败及查询协议 |
| AT-11 | 后台有动作不证明可以安全修复 | 六类工作台输入、允许命令、禁止捷径、自动正常路径 | 真实权限、恢复动作目录及端到端场景 |
| AT-12 | Finance 期间“授权重开”可能误泛化到订单 | 明确行政期间政策与不可逆订单不同;分录仍追加更正 | 期间/收入/核算政策专项评审 |
| AT-13 | 取消和重算可能误作用于物料或经济源 | 取消不凭空回库,替换不双计履约,重算不触发交易 | 现场回收、部分执行、指标口径验证 |
| AT-14 | 通用恢复/回滚可能丢失外部已发生事实 | 唯一写入方、切换水位、终态/fence 保留、备份恢复后先对账 | 实际迁移和灾难恢复演练 |
这些是文档设计风险的修订,不是已经复现并修复的产品 BUG。取舍理由及推翻条件记入 B-13–B-17;原 Q-01–Q-10 不因本轮增加文档自动关闭。
4. 反证矩阵:不仅检查正常路径
以下为实现/正式合同的验证要求。除明确标为“模型检查”的部分,均未执行产品测试。
| 编号 | 场景 | 应观察到的结果 / 会推翻方案的现象 | 责任域与证据状态 |
|---|---|---|---|
| TV-01 | 一次付款覆盖三天,正常逐日确认 | 三次独立执行;不是周付款即全放行 | Commerce/Demand/Fulfillment;待端到端 |
| TV-02 | 某日不登录、提醒失败、调度重启 | 只对应范围到期停送,其他天和餐次保留 | Demand;待服务端补扫测试 |
| TV-03 | 仅选时间未提交;旧提醒含旧地址/内容 | 无有效授权,无开工;需核对新范围 | Demand;待契约/UI测试 |
| TV-04 | 确认/到期同 revision,两种先后 | 至多一个提交;败方不能逆转终态 | 候选 CAS 顺序模型已检;真实数据库未检 |
| TV-05 | 恰好截止、跨时区、客户端改时钟 | 服务权威政策决定,不使用客户端时钟 | Demand;政策未冻结,未验证 |
| TV-06 | 120分钟整、119分钟、跨档报价、商家延误 | 免费边界明确,新增收费必须同意 | Commerce/Demand;政策细则及实现待验 |
| TV-07 | 付款成功但每日接受失败/过期 | 原目标可查,补偿费用;不能复活安排 | Commerce/Demand;待故障注入 |
| TV-08 | 后天30换38,原30仍可用 | 旧单终止,新单关联,只收合法差额8 | Commerce;待金额/谱系测试 |
| TV-09 | 相同换菜,原30已退款预留 UNKNOWN | 不当可用额抵扣,不双花 | Commerce;待真实额度竞争 |
| TV-10 | 两个不同幂等键替换同一前驱 | 只有一个合法替换取得权利 | Commerce;待来源唯一键测试 |
| TV-11 | 冻结 vs 开工、旧 token/子任务、迟到事件 | 冻结赢则阻断;开工赢则拒绝普通替换 | 候选 CAS 顺序模型已检;设备/跨域未检 |
| TV-12 | 旧单关完、新单补款失败/进程宕机 | 旧单不恢复,查询原补款并补偿/明确新购 | Commerce;待每步宕机测试 |
| TV-13 | 终态订单重放支付/确认/手动后台改状态 | 拒绝迁移,无第二份作业;保留新证据 | 候选终态出边拒绝已检;产品未检 |
| TV-14 | 同键异载荷、换用户重放键、去重缓存过期 | 冲突/越权拒绝,持久业务来源仍防重复 | 各 Owner;待权限与幂等实现 |
| TV-15 | 两退款、退款与换菜/消费争用最后额度 | 所有非负且守恒,只合法分配一次 | Commerce;未做账本实现/测试 |
| TV-16 | 外部已成功响应丢失、反向迟到证据 | UNKNOWN 保留占用;查原目标,矛盾入差异核验 | Commerce/Channel;待 Provider 测试 |
| TV-17 | 零额、优惠、称重超/欠、最小金额舍入 | 无假实收、无浮点漂移、无未授权补扣 | Commerce;精确算法未定 |
| TV-18 | 批次结束与新增后继竞争;退款已成功通知失败 | 范围稳定,不重退;通知不改变资金事实 | Commerce;待结算并发/通知故障测试 |
| TV-19 | 一天两餐/两地址;一安排只覆盖部分数量 | 不以用户+日期误拒,不因一项取消全单/全周 | Customer/Commerce/Demand;分组政策待定 |
| TV-20 | 切配已发生回执丢失;交付尝试失败 | 隔离查实物,不再切一份;新尝试关联旧终点 | Fulfillment;现场协议未验 |
| TV-21 | 质量隔离与分配/开工竞态,多批次转换部分失败 | 禁用物料不使用;数量/损耗可核对 | Supply/Fulfillment;待跨域安全证明 |
| TV-22 | 批次结清后售后、部分交付、召回 | 原单/批次终态不变,新裁决/调整按实际量 | Commerce/Supply;完整 Case 机器未定 |
| TV-23 | 员工撤权、只读账号、跨客户、批量部分失败 | 不越权;已有义务受限恢复,逐项结果可查 | Identity/各 Owner;真实职责/权限待验 |
| TV-24 | 期间关闭同时过账、规则升级重放 | 不无源重复过账;更正关联原经济事实 | Finance;待合同/存储验证 |
| TV-25 | 两渠道同外部号、退出时在途目标 | 按 Provider/账号作用域隔离,义务不遗弃 | Channel;待真实协议 |
| TV-26 | 替换链统计、旧事件晚到、重算 | 原单/后继不重复计实际履约,重算只更新投影 | Analytics;口径/产品待验 |
| TV-27 | 恢复旧备份后渠道已有退款、设备已有执行 | 先对账及 fence/来源恢复,不重复对外动作 | 全链;迁移/恢复演练未做 |
| TV-28 | 持续 UNKNOWN、死信、负责人离职 | 有有限期限和真实接手者,不无限等待 | 各流程 Owner;时限/人员仍未知 |
反证重点:仅有每个对象自己的乐观锁不能证明 TV-10/15;仅有 Outbox 不能证明物理动作一次;仅有终态枚举不能证明后台命令无法绕过;仅有“退款失败”文字不能证明资金可释放。
二次自审还发现并修正三处候选 guard 范围:首次购买不能被要求提供不存在的前驱停止证明;未确认旧安排撤销不能被强制先经过接受;后继尚未创建时补偿也必须有合法出口。这些反例导致定义修订,说明结构检查通过不等于 guard 语义完整。
5. 后台对核心卖点的支撑结论
已读当前后台稿的 CF-01/02 能解释未确认不送、费用与资金分离;CF-03/04 有停止协调和退款额度;CF-05–10 有质量、财务、渠道、撤权和分析支撑。这些是合成原型,不是生产保障。
尚需显式贯通的五条故事:
- 沿餐次查询购买批次与原/后继订单,区分草稿、已付、已授权和实际交付。
- 两种竞态结果在客服、履约和顾客端一致呈现,失败方不隐藏、不覆盖。
- 换菜失败能定位停止回执、原款占用和补偿目标,禁止“恢复旧订单”。
- 三天范围结束正常自动核算/退差额,后台只处理未知和差异,不要求常规人工审核每笔。
- 结清后售后/更正关联原单且不重开,原始实收、已退和新调整可对账。
“后台支撑有效”仍需这些跨域故事与真实门禁证据,不能只按模块页面数量判定。本轮没有覆盖正在迭代的后台文件;后续原型和正式合同应消费本次设计评审后的版本。
6. 已执行检查与证据限度
运行:node docs/architecture/state/verify-fresh-delivery.mjs。
- 六类机器、38个状态、41条声明迁移完成结构/可达性/终态路径检查。
- 41条迁移的正向布尔门禁模型检查;共280项拒绝探针(门禁失败、旧 revision、重复旧提交、终态及未知事件)。
- 54组有序竞争探针:枚举同状态不同事件两种先后,用同一个抽象 CAS 验证第二个旧 revision 拒绝。
- 故意加入终态出边、同事件歧义、孤立状态,3个损坏定义均被检查器拒绝。
node --check通过;git diff --check -- docs/architecture无空白错误。
对本轮36份修改/新增 Markdown 检查了221个本地链接目标,均存在;未验证 URL 网络可达性、章节锚点或 Mermaid 浏览器渲染。复查旧歧义语句,已移除未限定的“恢复既有义务”“改期失败保留原承诺”和“创建新的尝试”等旧表述。
这是本地文档模型检查,不是数据库并发测试,不执行业务 guard,也不验证金额账本、真实设备或跨域恢复。脚本自身不是生产状态引擎,不可用本节统计替代 TV 矩阵的缺失证据。
7. 未决、实际责任与下一步
| 待决事实 | 当前建议 / 影响 | 决策与实际维护责任 | 恢复/后续路线 |
|---|---|---|---|
| 每日确认时间政策、边界相等、临近收费 | 时间谓词需互斥完备;两小时规则保持不变 | 用户定政策;运营/技术长期人待指定 | 补具体参数与边界样例后冻结 guard |
| 商业订单/配送范围、部分履约与变更阶段 | 独立义务细分;不随意整周同单 | 业务/履约负责人待指定 | 核对多餐、多地址、缺货与部分执行再定粒度 |
| 留存、称重、优惠、补差与自动退费 | 推荐批次内暂留、结束自动核算原路退 | 用户定政策;交易/资金/财务实际人待指定 | 逐笔金额样例、舍入/分摊及退出规则评审 |
| 外部确定性与现场 fence | UNKNOWN 不盲重发,现场未知不重做 | 支付/设备/质量/工程实际人待指定 | 核对 Provider 协议,演练停止和现场证据丢失 |
| 异常时限、值班和最小权限 | 正常自动、异常受限恢复 | 运营/安全实际人待指定 | 定年龄阈值、交接与升级路径,未定不可发布 |
| 正式共享模型、契约及其他实体状态机 | 六机只是核心候选,不是全部生命周期 | 架构长期人待指定,主会话维护当前稿 | 单一共享定义收敛后派生接口/任务,不复制每REQ模型 |
下一步优先评审对象粒度、确认时间门禁、旧单到新单协议和资金分摊四件事;其后形成正式共享数据模型/状态合同及验证任务。这里没有申请自动锁定、绑定、提交或发布,也没有把尚未知的政策默认为已批准。