AI-3.4-02 18 类标准化商品体系

建档规范层 + 挂载三候选定稿 —— 实现策略 TDD

文档类型: 技术设计文档(TDD) PRD 版本: V1.4(2026-10-22) 文档版本: v1.0(2026-10-26) 优先级: Must · P1(部分实现,补齐关键缺口) 深度分级: full(字段级 + file:line) 波次: p1 来源: tdd/AI-3.4-02-standardized-product-system.md

摘要

本条目对应 PRD FR-3.4-02「18 类标准化商品体系」。PRD 验收要点为:「建档规范覆盖全部 18 类并发布;新品类准入经规范评审(含薬機法适用性确认)」。现状判定为部分实现:类目树(六大类十八子类)、三语四层翻译闭环、Attribute 系统、发布审核骨架全部在位;而「标准化建档规范层」为零实现(负证据:规范相关关键词全仓检索 0 命中,category_standard 实体不存在)。

技术方案采用两段式结构:技术方案段(attribute 九项映射定义 + category_standard 新模块 + publish 准入校验 + vendor 表单消费 + RK-12 改名重译钩子)无门控、立即可开工;规范发布段(18 类规范内容定稿与 published 发布、新品类准入流程启用)受业务前置 B-c3 门控——「18 类」语义同构核对与薬機法适用性确认归商品团队 + 法务,技术侧仅提供字段位与流程卡控。

挂载方案经三候选对比定稿为 attribute 绑定分类(结构化可校验项)+ 新建本地模块 category_standard(文档型规范 + 版本/评审载体)组合:九项建档维度天然二分——可枚举、可校验、需参与筛选与准入强制的走 attribute(复用上游机制,零上游改动);长文档、需版本化发布与评审留痕的走 category_standard。

优先级 / 深度
Must · P1
部分实现补齐缺口;深度分级 full 字段级 + file:line 锚点复核
缺口
5 项
规范层为零 / 商品 schema 缺字段 / RK-12 改名不重译 / vendor 未接入建品流 / 无版本与评审留痕
新建 Workflow
2 + 1
upsert-category-standard、publish-category-standard 新增;publish-vendor-product 增强准入 step
Blocker
1 项
B-c3(18 类语义核对 + 薬機法确认)仅阻塞发布段,技术方案全部可先行
现状基线(代码证据)

类目树硬编码 seed 与 PRD「六大类十八子类」数量与门类一致(seed-functions.ts:208-311,6 根 + 18 子 = 18 ✓);三语四层闭环在位(seed 字典 24 handle × 3 语 + AI 创建 hook + admin 手工编辑 + 前台 locale 读取);建档规范层 0 命中(rg "类目模板|选品标准|准入规范|建档规范" exit=1,检索式即负证据)。

关键概念

category_standard
从零新建的本地模块(backend/src/modules/category-standard/),承载文档型建档规范 + 版本化(draft/published/deprecated)+ 评审留痕 + 薬機法约束字段位。
挂载三候选
建档规范层的三个候选载体:① category metadata 自由 KV(否决为主通道)② attribute 绑定分类(采纳)③ 新建 category_standard 模块(采纳)。定稿 = ② + ③ 组合。
Attribute 系统
上游 @mercurjs/b2c-core 提供的结构化字段机制:is_required / is_filterable / ui_component 六种组件 / possible_values / product_categories 分类绑定——「每类准入字段」的现成通道,仅经官方扩展点消费。
RK-12
风险编号:分类改名不触发重翻译(现状仅 category-created hook,无 updated 钩子),译文陈旧(probability 4 × impact 2 = medium)。本卡以 categoriesUpdated 官方扩展位补齐。
B-c3 / C3
业务前置 blocker:总纲「18 类」清单与现有分类目录的语义同构核对 + 薬機法适用性确认(商品团队 + 法务)。代码层类目树已与 PRD 门类一致,C3 为语义级收尾,非代码任务。
薬機法约束字段位
category_standard 上的 medical_regulation_applicable(boolean)+ pharmaceutical_law_note(text);规范发布动作强制确认——字段位先建,法务确认结论(C3 同批)后填。
NFR-3.8-01 跳过范式
AI 可选不阻断:AI 未配置/故障时重译任务走 markSkippedNoConfig 终态跳过,分类改名/管理主流程永不阻断。
两段式结构
技术方案段(无门控,p1 立即开工)与规范发布段(B-c3 门控,C3 关闭后方可发布)二分;承 RK-06 mitigation「技术方案先行,类目范围固化标注 C3 前置」。

方案设计

总体架构与两段式门控

分段门控内容开工条件
技术方案段 无门控 attribute 映射定义、category_standard 模块 + migration、publish 准入校验、vendor 表单消费、RK-12 updated 钩子 立即可开工(p1)
规范发布段 B-c3 门控 18 类规范 draft 的内容定稿与 published 发布、新品类准入流程启用 前置业务核对 C3 关闭后方可发布
flowchart TB subgraph tech["技术方案段(无门控 · 立即可开工)"] B1["B1 attribute 九项映射定义 + admin 绑定配置"] B2["B2 category_standard 模块 + migration + admin UI"] B3["B3 publish 准入 step + category_standard_gate 灰度"] B4["B4 vendor 建品流 attribute 段 + 建档指引"] B5["B5 RK-12 category-updated 重译钩子"] end GATE{"B-c3 门控:18 类语义同构核对 + 薬機法适用性确认(商品团队 + 法务)"} subgraph pub["规范发布段(C3 关闭后)"] C1["C1 18 类规范定稿 + 批量 published + 新品类准入流程启用"] end B1 --> GATE B2 --> GATE B3 --> GATE B4 --> GATE B5 --> GATE GATE -->|"C3 关闭"| C1
图 1. 两段式总览:技术方案段五线并行先行,规范发布段受 B-c3 门控(依据源 §4.0/§9 DAG 转译的可视化视图)
设计红线(AGENTS.md)

Workflow 承载业务逻辑(规范 draft/publish 数据变更走 Workflow,准入守卫在 step 内);不修改上游源码(attribute 系统与类目 workflow 均上游所有,仅官方 hook/扩展点消费);后端单一数据源(规范与准入状态以后端为准);本卡无新增裸 SQL。

九项建档维度映射(字段级)

#维度(PRD 原文)通道载体字段定义
1品类定义③ category_standarddefinition(text,长文)
2适用行业② attributeindustry_applicability:multivalue,is_filterable=true,is_required=true,possible_values=行业枚举(admin 可维护),product_categories=全 18 类绑定
3目标客群② attributetarget_customer_segment:multivalue,is_filterable=true,is_required=true,possible_values=B2B 企业/B2C 个人/开发者/教育机构…
4核心功能服务③ category_standardcore_functions(text,长文,指引型描述)
5价格区间② attributeprice_range_band:select,is_filterable=true,is_required=false,possible_values=区间档位枚举(以档位枚举表达区间,如「~5万円 / 5-50万 / 50万+」;数值范围校验属商品价格字段本体,attribute 层不做数值区间 DSL)
6交付标准③ category_standarddelivery_standard(text,长文:交付物/时限/验收口径指引)
7售后规范③ category_standardafter_sales_policy(text,长文)
8B2B 批发适配性② attributeb2b_wholesale_fit:toggle 或 select(是/否/部分),is_filterable=true,is_required=true
9新零售零售适配性② attributeretail_fit:toggle 或 select,is_filterable=true,is_required=true
+薬機法约束(合规挂钩字段位)③ category_standardmedical_regulation_applicable(boolean,default false——是否涉薬機法规制对象)+ pharmaceutical_law_note(text nullable——规制说明/表述约束);publish 规范时强制确认

category_standard 新本地模块

模块 backend/src/modules/category-standard/(models/services/index),表 category_standard。挂载通道三候选对比结论:① metadata 自由 KV 否决为主通道(无 schema/类型/校验/版本/留痕,无法承载 required 准入强制,保留作杂项扩展位);② attribute 绑定分类采纳(结构化 + is_required 准入强制 + is_filterable 前台筛选 + 字段增删零 migration);③ category_standard 新模块采纳(文档型规范 + 版本化 + 评审留痕,与类目解耦可先建)。组合使「18 类覆盖」可拆解为「attribute 模板齐备 + 18 条规范 published」双验收位。

stateDiagram-v2 [*] --> draft: upsert-category-standard(handle 校验 + 草稿写入) draft --> draft: upsert 修订(同 version 或新 draft) draft --> published: publish-category-standard(薬機法确认守卫通过 + 发布/评审留痕) published --> deprecated: 新版本 published 后旧版自动置 deprecated published --> draft: 修改 = 新版本 draft(published 行只读) deprecated --> [*]: 停用(数据不删)
图 2. category_standard 规范生命周期状态机:仅 published 参与发布准入校验;同 handle 多 version 共存

publish 准入执行点

插入位:publish-vendor-product.ts:130 的 publishVendorProductWorkflow step 链首(既有 validateProductForPublishStep 之前并列新增 assertCategoryStandardComplianceStep,保持既有校验函数零改动、职责单一):

assertCategoryStandardComplianceStep({ product_id })
  ① 查商品所属类目(product.product_categories → handle)
  ② 查该 handle 的 published category_standard(status=published 最新 version)
     └ 不存在 → 按 flag 阶段行为:阶段1 logger.warn 留痕放行;阶段2 抛
        AppError(PRODUCT_CATEGORY_STANDARD_MISSING, "category has no published standard")
  ③ 查该类目绑定的 is_required=true attribute(经上游 attribute 模块 product_categories 绑定)
     对照 product.attribute_values 逐一核对
     └ 缺失 → 阶段1 warn;阶段2 抛
        AppError(PRODUCT_REQUIRED_ATTRIBUTE_MISSING, "required attributes missing: [names]")
  • 守卫全部在 step 内(红线);错误码在 backend/src/errors/error-codes.ts ErrorCode 枚举扩展两项,沿用 PRODUCT_NO_SHIPPING_PROFILE 等既有命名范式;
  • 灰度开关:featureFlags 新增 category_standard_gate(默认 false=阶段1 warn;沿用「阶段1 warn → 阶段2 强制」两阶段灰度范式);
  • 现状行为兼容:flag 默认关 ⇒ 上线即回现状(无规范/无 attribute 校验),已售商家零感知。
sequenceDiagram participant V as vendor 建品/发布 participant W as publish-vendor-product Workflow participant G as assertCategoryStandardComplianceStep participant D as 后端数据(category_standard / attribute) V->>W: 发布商品(product_id) W->>G: step 链首校验(flag=category_standard_gate) G->>D: 查商品类目 handle → published 规范(最新 version) alt 类目无 published 规范 G-->>W: 阶段1 logger.warn 放行 / 阶段2 抛 PRODUCT_CATEGORY_STANDARD_MISSING end G->>D: 查该类目 is_required=true attribute → 对照 product.attribute_values alt required attribute 缺失 G-->>W: 阶段1 warn / 阶段2 抛 PRODUCT_REQUIRED_ATTRIBUTE_MISSING else 全部齐备 G-->>W: 通过 → 既有校验链继续(shipping / image / variants / inventory) end
图 3. publish 准入校验时序:两阶段灰度(flag 关 = warn 放行 = 现状行为),错误码 PRODUCT_CATEGORY_STANDARD_MISSING / PRODUCT_REQUIRED_ATTRIBUTE_MISSING

RK-12:分类改名重译钩子(category-updated)

现状仅创建 hook(category-created-translation.ts:25-36),改名后译文陈旧(RK-12 medium:4×2)。两候选取舍:

候选机制评估
A. 重译入队复用 translation-job 队列 新 hook 文件 category-updated-translation.ts:注册 updateProductCategoriesWorkflow.hooks.categoriesUpdated(官方扩展位);diff 新旧 name/description,有变更则幂等入队;retry worker retryCategory 已就绪 选定 与「预检→enqueue」范式同构;AI 未配置时 markSkippedNoConfig 终态 = NFR-3.8-01 不阻断改名;幂等防重复入队;零新状态字段
B. 陈旧标记 + admin 提示 译文行打 stale 标记 + TranslationSection 提示横幅 本期否决 上游译文表无 stale 字段,成本高于复用队列;保留为 AI 未接入期的人工提示增强项(不阻塞)

选定候选 A 的配套三点:

  1. seed 侧同步:CATEGORY_I18N 字典(seed-category-translations.ts:26 起,24 handle × 3 语)为事实源——分类改名必须同步改 seed 字典并重放 seed(写入逻辑先删后写幂等);同步步骤 runbook 化(改类目名 → 改 CATEGORY_I18N → pnpm db:seed → 重译自动入队);
  2. admin 手工编辑闭环保留:category-detail.tsx:69-74 TranslationSection 不动——重译产出会覆盖译文,admin 可在重译完成后再次手工修正(人工最终确认权保留);
  3. feature flag:category_retranslate_on_update(默认 false 灰度)——hook 内 flag 关闭时直接 return,回滚 = 关 flag。
sequenceDiagram participant A as admin 类目编辑 participant H as category-updated-translation hook participant Q as translation-job 队列 participant W as retry worker A->>H: updateProductCategoriesWorkflow(categoriesUpdated) H->>H: diff 新旧 name/description · flag=category_retranslate_on_update alt flag 关闭或内容无变更 H-->>A: 直接 return(零入队 = 现状行为) else 检测到变更 H->>Q: enqueueTranslationJob(reference=product_category · 幂等去重) Q->>W: 领取(指数退避 2^n 分钟 · 并发信号量既有) alt AI 已配置 W->>W: translateCategoryToLocales(源 ja-JP → zh-Hans / en-US) else AI 未配置 W->>Q: markSkippedNoConfig(failed + no-config 终态 · logger.info 非告警) end W-->>A: 改名主流程零阻断(NFR-3.8-01 跳过范式) end
图 4. RK-12 改名重译链路:官方 categoriesUpdated 扩展位 → 幂等入队 → markSkippedNoConfig 降级兜底

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

Workflow状态steps 链补偿事件
upsert-category-standard 新增 ① assertCategoryExistsStep(handle 校验,对齐 seed 树)→ ② upsertCategoryStandardStep(draft 写入,携带 previous 快照) ② 失败回写 previous 无
publish-category-standard 新增 ① loadDraftStep → ② assertPharmaceuticalLawConfirmedStep(守卫在 step:medical_regulation_applicable 未确认(false 且 note 空)→ 抛 INVALID_DATA「薬機法适用性确认未完成(C3 同批法务确认)」)→ ③ markPublishedStep(status=published + published_at/by + reviewed_at/by 留痕;旧 version 置 deprecated) ③ 回写 previous status 完成后直接 emit category-standard.published(供 admin 列表刷新)
publish-vendor-product(现有) 增强 step 链首插入 assertCategoryStandardComplianceStep 无写操作无补偿 无
createProductCategoriesWorkflow / updateProductCategoriesWorkflow(上游) 仅 hook 注册 categoriesCreated(既有)/ categoriesUpdated(本卡新增) C6 try/catch 经 translation-job 队列

数据模型 · API · Workflow

数据模型:category_standard 表

字段类型约束/默认说明
idtextPK,prefix catstd—
category_handletextnot null对齐 seed 类目树 handle 事实源(用 handle 而非 id:seed 重放/类目重建下稳定)
versionintegernot null, default 1规范版本;同 handle 多版本共存
statusenum(draft, published, deprecated)not null, default draft生效语义:仅 published 参与 publish 准入校验
definitiontextnullable维度1 品类定义
core_functionstextnullable维度4 核心功能服务
delivery_standardtextnullable维度6 交付标准
after_sales_policytextnullable维度7 售后规范
medical_regulation_applicablebooleannot null, default false薬機法规制对象确认位(法务确认 = C3 同批)
pharmaceutical_law_notetextnullable薬機法表述约束说明
dimensions_jsonjsonbnullable其余可变扩展(预留 C3 核对后新增维度,避免频繁 migration)
published_at / published_bytimestamptz / textnullable发布留痕
reviewed_at / reviewed_bytimestamptz / textnullable评审留痕(对接 NFR-3.9-04 巡检口径,references_only;reviewed_by=req.auth_context.actor_id 落库范式)
created_at / updated_at / deleted_attimestamptz标准三件套medusa 约定

索引:UNIQUE(category_handle, version);INDEX(status)(published 查询热点);INDEX(category_handle)。migration 走 medusa db:generate。

erDiagram product_category ||--o{ category_standard : "同一 handle 多 version 共存" attribute }o--o{ product_category : "product_categories 绑定(多对多)" product_category ||--o{ translation_job : "RK-12 改名重译入队(枚举已含)" vendor_product }o--o{ attribute : "attribute_values 填报(required 校验对象)" category_standard }o--|| admin_user : "published_by / reviewed_by 留痕"
图 5. 实体关系:category_standard 以 handle 对齐 seed 类目树;attribute 经 product_categories 绑定承载结构化建档字段

API 契约

路由方法变更权限域要点
/admin/category-standardsGET / POST新增admin列表(filter: handle/status/version)+ draft 创建;zod validators 挂 middlewares
/admin/category-standards/[id]GET / PUT新增admindraft 编辑;published 行只读(改 = 新版本 draft)
/admin/category-standards/[id]/publishPOST新增admin调 publish-category-standard workflow;400 = 薬機法确认缺失 / 已发布
/vendor/categories/[handle]/standardGET新增vendor商家建档指引(published 规范九项 + 该类 required attribute 清单,复用 applicable-attributes 上游查询语义按 handle 反查)
/admin/attributes、/vendor/products/[id]/applicable-attributesGET / POST / PUT无改动admin / vendor上游 @mercurjs/b2c-core 提供,本卡仅消费不改
/store/* 三前台—无改动public建档规范为供给侧治理数据,前台不透出(B2B/B2C 消费的是 attribute 筛选值本身,经既有商品 API 自然带出)

AI 能力接入点

本条无直接 LLM 调用。与 translation client 通路的关系为间接复用(经 translation-job 队列,管道契约引用不重复设计):

  • RK-12 重译链路:categoriesUpdated hook → 幂等 enqueue → retry worker(并发信号量/指数退避/MAX 5 既有)→ translateCategoryToLocales(源 ja-JP → zh-Hans/en-US)→ AI 调用走 backend/src/modules/translation/client.ts 唯一通路(SSRF 三层防护/60s 超时既有);
  • 降级与跳过(NFR-3.8-01):AI 未配置时任务入队后由 retry worker markSkippedNoConfig 终态化(failed+[no-config] 前缀,logger.info 非告警)——分类改名/类目管理主流程零阻断;翻译故障时任务指数退避重试,改名单独成功;
  • 范式测试点:①未配置态改名 → 任务 markSkippedNoConfig、改名本身成功;②故障态 → 任务入队退避重试、改名成功;③幂等态 → 同分类连续两次改名 → 队列无重复活跃任务;
  • 未来演进注记:建档规范文档型字段(四长文)的三语化可后续经 translation 管道扩展(需扩白名单 + reference 路由),列为后续增强不阻塞本卡。

合规挂钩

NFR / 法规挂钩点本卡动作
《薬機法》 ①品类准入确认:新品类/新规范发布须确认是否涉薬機法规制对象(医疗类 AI 产品、健康功效相关表述);②涉规制类目的规范必须在 note 中固化宣传表述约束,并传导至该类商品 attribute 值与文案的表述审核口径;③宣传与译文表述按薬機法广告规制执行——翻译侧衔接 NFR-3.9-02 与 AI-3.5 系管道,本卡只挂约束字段不设计译文审查 字段位 medical_regulation_applicable + pharmaceutical_law_note;publish-category-standard workflow step 强制确认;适用性由法务确认 = C3 同批(字段位先建、确认后填,C3 关闭前规范只能停 draft)
NFR-3.9-04(人工审核把关) 建档规范评审(draft→published 的 reviewed_by/at 留痕 + publish 人工动作)对接其巡检口径,references_only 把关框架本体归 AI-3.9-04,本卡不重设计把关状态机,仅按既有 reviewed_by 落库范式留痕
NFR-3.9-03(审计与可追溯) 规范变更全程可溯 规范版本链(version + deprecated)+ 发布/评审留痕;RK-12 重译任务留痕复用 translation_job.last_error/status
C3(业务风险) 类目语义同构核对 + 薬機法适用性确认 = 规范发布前置 技术字段位与流程先备(要素 7 二分);外部决策点仅引用编号与原文,不内联臆造核对结论

前端改动面与 i18n

前端触点(逐端)

端改动依据
admin-panel ① 新增 routes/categories/category-standard/ 管理页(列表 + 详情编辑 + publish 动作 + 薬機法确认位);② category-detail 挂「建档规范」Section(读 published/draft 概要,入口跳管理页);③ attribute 管理页既有——为 9 项维度 attribute 建 18 类绑定的配置操作说明(runbook),无代码改动 维度映射 / 新模块
vendor-panel ① product-create 建品流 organize 段新增「类目建档字段」区:选类目后按 applicable-attributes 渲染(复用 AttributeSelect 组件范式与既有查询),required 项标必填;② 发布前预检提示(缺 required attribute / 类目无规范时前端先行提示,服务端 step 校验为准);③ 建档指引查看(消费 vendor standard API,Drawer 展示九项规范) 缺口④收口
storefront / b2b / h2b无改动前台不透出治理数据
influencer / referrer panel无改动无触点

i18n 三语言 key 规划(en / zhCN / ja)

admin-panel(admin-panel/src/i18n/translations/{en.json, zhCN.json, ja.json},categoryStandard.* 命名空间):

新增 key用途
categoryStandard.list.title / .status.draft / .status.published / .status.deprecated管理列表与状态徽标
categoryStandard.form.definition / .coreFunctions / .deliveryStandard / .afterSalesPolicy四文档维度字段标签(对齐字段表列名)
categoryStandard.form.medicalRegulation / .pharmaceuticalLawNote / .medicalConfirmHint薬機法确认位 + 提示(「适用性由法务确认(C3 同批)」)
categoryStandard.publish.confirmMissingMedical / .publishSuccess / .versionNewDraftpublish 动作文案(含未确认报错、新版本草稿入口)
categoryStandard.review.reviewedBy / .reviewedAt评审留痕展示(NFR-3.9-04 巡检口径对接位)

vendor-panel(同三文件,products.categoryStandard.* 命名空间):

新增 key用途
products.categoryStandard.guidance.title / .viewStandard建档指引 Drawer 标题 / 入口
products.categoryStandard.requiredAttributeMissing建品/发布预检提示(「该类目必填建档字段未齐:{names}」(i18n 插值占位))
products.categoryStandard.noPublishedStandard类目无 published 规范提示(阶段1 warn 文案)

三语值随实现提交,三文件同步新增;storefront 系无新增 key。

风险

Blocker B-c3:「18 类」语义同构核对 + 薬機法适用性确认(RK-06,4×3=high)
总纲「18 类标准化商品体系」与现有分类目录数量巧合(六大类十八子类),语义是否同一体系待商品团队逐一核对;直接引用会造成类目错配;薬機法适用性由法务确认。仅阻塞「类目范围固化与建档规范发布」:18 类规范内容定稿与 published 发布、新品类准入流程启用。可并行:技术方案先行全部可开工(attribute 九项映射、category_standard 模块 + migration、publish 准入校验灰度、RK-12 钩子、vendor 表单消费、admin 管理 UI)——代码层类目树已与 PRD 六大类十八子类数量与门类完全一致,C3 为语义级收尾,非代码任务。
Medium RK-12:分类改名译文陈旧(4×2=medium)
现状仅创建 hook,无 updated 钩子,改名后三语译文停留在旧值。缓解:本卡补 categoriesUpdated 官方扩展位钩子 + 幂等入队复用 translation-job 队列 + seed 字典同步 runbook + admin 手工编辑闭环保留(人工最终确认权)。
Low metadata 自由 KV 语义漂移
若误用 categories-metadata 自由 KV 承载建档规范,将无 schema/类型/校验/版本防护,九项维度语义漂移。已通过挂载三候选对比否决为主通道(保留作杂项扩展位),规范载体收敛到 attribute + category_standard 组合。

前置决策点

  • B-c3 「18 类」与总纲类目清单语义同构性核对 + 薬機法适用性确认(PRD 8.1 C3 / 8.2-2 / 7.5 依赖 3)——归属商品团队 + 法务;关闭标准与核对结论本卡仅引用编号,不内联臆造。
  • DEC-5 量化指标基线立项定:建档规范覆盖率(=18/18 硬指标)、attribute 填报完整率等运营指标数值本卡不臆造。
  • 维度 8/9 组件形态 b2b_wholesale_fit / retail_fit 采用 toggle 或 select(是/否/部分)——实现期随 admin 配置定稿。
  • 后续增强 建档规范文档型字段(四长文)的三语化经 translation 管道扩展(需扩白名单 + reference 路由)——本卡不设计其实现。
依赖与下游消费

内部依赖:无硬前置 TDD;上游契约引用 = AI-3.5-02 翻译管道契约(translation-job 队列 / 幂等 enqueue / markSkippedNoConfig 降级范式——只引用不重复设计)。下游消费:AI-3.4-03(P2 智能选品)消费本卡建档规范九项结构化维度为选品特征源,PRD §7.5 依赖 3 明示 C3 为两者共同输入;AI-3.3-02(三语检索)attribute is_filterable 字段为检索筛选候选面(远期);RK-06 mitigation 即本卡两段式结构。外部资源:法务(薬機法适用性,C3 同批)、商品团队(语义核对)——两者仅阻塞发布段。

实施排期与验收

子任务 DAG 与估时(技术方案段五线并行;规范发布段等 C3)

子任务依赖估时
B1 attribute 映射 + 绑定配置无1d
B2 category_standard 模块 + API + UI无2.5d
B3 publish 准入 step + 灰度B1 / B2(判定数据源)1d
B4 vendor 消费改造B1 + B21.5d
B5 RK-12 钩子无(复用 AI-3.5-02 队列契约)1d
C1 规范发布段B-c3 + B1/B21d(流程性)

上线顺序建议:B5(RK-12,独立价值先行)→ B1+B2 → B3/B4(flag 默认关灰度)→ 观察 warn 日志盘点缺口类目 → C3 关闭后 C1 批量发布 → 阶段2 强制。

验收标准

#验收标准映射
A1建档规范覆盖全部 18 类并发布:category_standard published 行覆盖 seed 类目树全部 18 个子类 handle(18/18 硬性结构指标);显式注明:18 类覆盖验收以 C3 关闭为前提(C3 未关闭前仅有 draft,publish 动作被薬機法确认守卫与流程卡控)PRD 验收要点①
A2新品类准入经规范评审(含薬機法适用性确认):publish-category-standard 在 medical_regulation_applicable=false 且 note 为空 时拒绝(400);published 后新品类创建流程含「建规范 draft → 评审 → 发布」前置PRD 验收要点②
A3publish 准入负向测试:①类目无 published 规范时发布被拒(阶段2)/ warn 放行(阶段1);②缺 required attribute(删 industry_applicability 值)发布被拒并报 PRODUCT_REQUIRED_ATTRIBUTE_MISSING;③齐备时发布链路零回归准入执行点
A4RK-12 回归:admin 改类目名 → categoriesUpdated hook 触发 → translation_job 新增(幂等)→ AI 配置时译文更新为 done;AI 未配置时任务 markSkippedNoConfig 且改名主流程成功;flag 关闭时零入队RK-12 钩子
A5vendor 建品流消费:选类目 → 该类 required attribute 渲染必填 → 缺失时预检提示 + 服务端拦截;附加值 Drawer 既有功能零回归前端触点
A6三语覆盖:9 项维度 attribute 值与 4 项规范文档在 admin 三语界面可维护;分类三语四层闭环零回归(CATEGORY_I18N 24 handle × 3 语 seed 重放幂等)i18n / 现状闭环
A7量化指标:建档规范覆盖率(=A1 硬指标)、attribute 填报完整率等运营指标基线立项定(DEC-5),不臆造数值DEC-5 口径

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

L0 门禁:文档十要素齐备、关键 code anchor 可 rg 命中、既有商品发布/翻译域单测回归通过(含 publish-vendor-product/__tests__/product-listing-review.unit.spec.ts 与 translation 域 8 单测)。

层范围明细
新增单测(后端)category_standard 模块 + workflowupsert 补偿回写;publish 守卫三分支(薬機法未确认拒绝 / 正常发布 + 旧版 deprecated / 重复发布拒绝);assertCategoryStandardComplianceStep 三态(无规范两阶段行为 / 缺 required attribute / 齐备通过);错误码断言
新增单测(后端)RK-12 hook改名 diff 判定(name 变 / description 变 / 无变化零入队);flag 关闭直返;enqueue 幂等(连续改名无重复活跃任务);markSkippedNoConfig 兜底
新增单测(admin/vendor)UI 逻辑规范表单校验(薬機法位联动提示)、vendor 建品流 attribute 段渲染与预检(RTL)
集成跨模块建类 → 建规范 → 发布 → vendor 建品 → 发布全链;seed 重放(db:reset:demo)后 category_standard 与类目树/三语字典一致
降级路径测试NFR-3.8-01三测试点(未配置/故障/幂等)全量纳入;阶段1 flag 下发布主链路零阻断断言

迁移与回滚

变更迁移 / 回滚路径
category_standard 表medusa db:generate 新表独立 migration(全列 + unique(category_handle,version) + index);drop 回滚无连锁;已 published 规范停用走 status=deprecated(数据不删)
attribute 九项定义无 migration(上游数据行,经 admin API 配置);停用 = 解绑 product_categories
publish 准入校验category_standard_gate 置 false = 阶段1(warn 不拦截)= 现状行为等价;step 移除属代码回滚,无数据回滚(只读校验)
RK-12 重译钩子category_retranslate_on_update 置 false = hook 直返 = 现状;已入队任务由 retry worker 自然消化或留 failed 终态(无副作用)
vendor 建品流 attribute 段前端组件级回滚(feature flag 或路由回退);applicable-attributes 查询为既有上游能力零回滚面
seed 兼容pnpm db:reset / db:reset:demo 零改动(类目树与三语字典事实源不动);category_standard 空表时 publish 校验阶段1 仅 warn,demo 建品链路零影响

附录 · 溯源

本文档生成自 docs/reports/ai-module-prd/tdd/AI-3.4-02-standardized-product-system.md(TDD 深度分级 full;PRD V1.4)。章节映射与处理方式如下:

本文档章节源章节处理
摘要元数据表 + §1.3 现状三态判定Summarized
关键概念§1 / §4.1 / §6 术语Summarized
方案设计 · 两段式总览§4.0Preserved
图 1 两段式 DAG / 图 2 状态机 / 图 3 准入时序 / 图 4 重译时序§4.0 / §4.3 / §4.4 / §4.5Inferred(可视化转译,节点内容对齐源文字)
九项建档维度映射表§4.2Preserved
挂载三候选对比与定稿§4.1Preserved(叙述重组)
category_standard 字段表与索引§4.3Preserved
publish 准入执行点(伪代码/错误码/灰度)§4.4Preserved
RK-12 两候选取舍与配套三点§4.5Preserved
Workflow 表(steps 链/补偿/事件)§4.6Preserved
API 契约表§4.7Preserved
图 5 实体关系§4.3 + §2.1 模块清单Inferred(按源字段定义绘制)
AI 能力接入点 / 合规挂钩§5 / §6Preserved(条目化)
前端触点 / i18n key 规划§4.8 / §4.9Preserved
风险§7 二分表 + PRD §8.1 C3Summarized
前置决策点§7 + §8.1 A7Preserved
实施排期与验收(DAG/估时/验收/测试/迁移回滚)§8 / §9 / §10Preserved(迁移回滚压缩为表)
代码现状底座(file:line 证据①~⑧)§2.1Summarized(锚点保留关键项:seed-functions.ts:208-311、category-created-translation.ts:25-36、publish-vendor-product.ts:130、translation-job 枚举等)
锚点复核约定

源 TDD 全部锚点在其 run(run-f8e0c4ddb903)以 rg/sed 限定子目录逐条复核,漂移处以「来源锚点(复核:实际行号)」双写标注。本文档保留关键锚点原文;规范性要求以源 TDD 为准。