商品中心
类目、SPU/SKU 与属性校验;skuCode 唯一、价格与币种合法才建档。
商品中心、内容、上架、订单与售后构成一条最小闭环。可插拔 ChannelAdapter 离线回放沙箱通道,live 通道在凭据到位前一律 fail-closed;所有金额与外部动作——上架、退款——都经 HTTP 交给 zeus 决策内核并等待人工审批。订单幂等,关键动作全程留痕,没做的功能绝不假装成功。
D3 publish HELD 423 → APPROVED → channel.upsertD2 refund HELD 423 → APPROVED → channel.refundkernel down 503 DECISION_UNAVAILABLE · fail-closedsandbox-douyin ONLINE · offline replaydouyin live FAIL-CLOSED · 422 CREDENTIAL_MISSINGlisting.published decision=D3 sku=SKU-DEMO-001order.imported ext=DY-SB-20261022-0001 1299 CNY idempotent=hitrefund.succeeded decision=D2 ref=DY-SB-REFUND-5001从商品建档到退款落账共五个工位。内容与通道都藏在端口后面;上架与退款这两个金额/外部动作,会在 zeus 决策门前挂起,直到人工审批放行。没有任何一步能绕过决策门。
类目与 SPU/SKU 商品中心先校验标题、价格、币种与 skuCode 唯一性,合格后才往下游走。
M3 用确定性离线内容桩——禁词拦截、单次审核、永不自动确认;M4 在同一 ContentClient 端口后换成 loom 内容底座,调用方不变。
内容提交 zeus 做 D3 外部动作决策,先返回 423 DECISION_HELD 挂起;只有人工审批通过后,才调用通道 upsert/publish。
通道回传订单、订单中心落库,以 (channel, external_order_id) 幂等,回填 SKU 编码,order.imported 写入台账。
退款金额只按订单行计算;D2 决策挂起,状态机按 requested → awaiting_approval → succeeded/rejected 流转,审批通过后才真正调用通道退款。
每个模块只负责闭环上的一段,通过显式端口与其他模块通信。通道、决策与内容三条缝都是契约,接入 live 通道、loom 内容底座或另一家店铺都不用重写领域。
类目、SPU/SKU 与属性校验;skuCode 唯一、价格与币种合法才建档。
ContentClient 端口在 M3 提供确定性离线桩——禁词拦截、单次审核、永不自动确认;M4 换成 loom 内容底座,调用方不变。
ChannelAdapter 五方法契约 + 注册表,新增平台就是加一个适配器。离线沙箱回放录制,live 通道在凭据到位前一律 fail-closed。
通道拉单、本地落库;(channel, external_order_id) 幂等,重复回放不会产生重复订单。
DecisionPort 经 zeus-client 走 HTTP,把金额与外部动作交给 zeus;本仓不做本地分级,zeus 不可达即返回 503。
内容 → D3 决策 → 人工审批 → 通道 upsert/publish,外部动作的每一步都按顺序显式发生。
requested → awaiting_approval → succeeded/rejected;驳回留痕,审批通过后才调用通道退款。
库存手工维护;发货与支付在 M3 显式返回 501 NOT_IMPLEMENTED_PLACEHOLDER,不伪造成功。
commerce_events 记录全部关键动作——决策请求、上架、订单导入、退款流转,可回放、可追溯。
电商要动钱、要触发真实外部动作。Commerce OS 宁可拒绝并返回精确错误,也不执行任何无法授权的事。下面四条承诺由代码和测试强制保证。
未注册通道拒绝调用;live 通道缺 credentialRef 直接 422 CREDENTIAL_MISSING;zeus 不可达返回 503 DECISION_UNAVAILABLE。任何无法授权的金额或外部动作都不会发生。
本仓不做本地分级。上架(D3)、退款(D2)等所有金额与外部动作都经 HTTP 交给决策内核;D3/D2 先返回 423 DECISION_HELD,等待人工审批。
支付与履约在 M3 显式占位,返回 501 NOT_IMPLEMENTED_PLACEHOLDER;内容是离线桩而不是模型。占位是明确的产品口径,不是静默 mock。
订单按 (channel, external_order_id) 去重,重放安全;决策请求、上架、订单导入、退款流转都写入 commerce_events,与 zeus decision 记录一一对应。
HTTP v1 路由、组合根、领域模块与三组端口。存储同时支持 SQLite 和 PostgreSQL,方言锁在存储层,迁移文件按编号双方言配对。
Node ≥22、TypeScript strict(noUncheckedIndexedAccess、exactOptionalPropertyTypes)、Vitest 48 用例,含经假 zeus HTTP 服务器的真实 zeus-client 链路与 GATE-M3 全链路 e2e。
本地用内置 node:sqlite 零依赖,生产用 PostgreSQL;sqlite/pg 迁移按编号配对,由 check:migrations 强校验。
ChannelAdapter(五方法)、DecisionPort(zeus-client)、ContentClient(M3 桩 → M4 loom)。
storage · channel · product · order · decision · content · publishing · aftersale · fulfillment。
在装配处注入 DecisionPort、ContentClient 与通道注册表,领域模块只依赖端口。
12 个路由,统一错误体 { error: { code, message, retryable, details? } },错误码与 HTTP 映射集中管理。
无需任何 live 凭据:沙箱通道回放录制好的 fixtures,假 zeus 决策链路与 GATE-M3 端到端测试证明整条闭环;默认 SQLite,上生产再换 PostgreSQL。
# clone + install
$ git clone https://github.com/bayernjf/commerce-os.git commerce-os
$ cd commerce-os && npm install
# migrate the local SQLite store
$ npm run migrate:up
# start — http://127.0.0.1:8787
$ npm startM3 里程碑产物。live 通道需资质与密钥;M4 内容由 loom 内容底座提供。