系统规范域 · 数据与能力组

x-order · x-order 拖拽排序全链路规范

规范x-order V1.3.0
判据指纹ad57b762
变更历史最新V1.3.0 · 2026-09-18 · 已封版
条款29 条(无机器闸 6 条)
判据标准写法 7 颗 · 非标兜底 25 颗
规则书.claude/rules/x-order-rule.md
判据文件.claude/skills/x-spec-checker/references/x-order-spec.md

本页分两类内容:带「派生区」标识条的方框由引擎从真相源算出,各自被内容指纹锁着、手改即红(上面这张身份表就是其中之一,版本、指纹与计数只此一处,正文一律不复述);其余都是原件,由写页的人负责,机器只能验形态、验不了对错。

一页读懂

x-order 治的是「一行数据排第几」这件事的全链路。名字里的 order 指的是排序不是订单 —— 主体是 orderNo 这个排序号字段从数据表出发,经云函数的两个排序原子、保存适配器,走到后台五种拖拽载体的整条链。一句话概括它的主张:顺序只有一个写入口,界面上不许再给第二个

治理边界:本规范只治排序字段与拖拽形态,不治「这张表该按什么排」「这个顺序对不对」。适用面是数据表、云函数、后台三处;小程序端一颗闸都没有(端上无重排交互,按序渲染即可,条款 ARCH-G01 写明这件事)。云函数骨架归 x-api、详情页编排归 x-detail、行列表配置归 x-curd、权限声明归 x-auth、表文档骨架归 x-data

怎么读本页:「治理版图」的两张泳道图是主图 —— 数据链把本域的闸全部摊在七条道上,业务链讲「给一个实体加拖拽排序」时每一步哪些闸当轮咬。条款原文在条款书 .claude/rules/x-order-rule.md(写三端代码时按路径自动加载),本页的条款总表与判据总表是派生索引。本域没有同前缀 JSON 注册表 —— 拖拽白名单是目录存在性、黑话名单与状态枚举都住在判据的检测器里,改它们就是改判据。

治理版图

数据链:一个排序号从数据表到每一种拖拽载体(本域的闸全在图上)

数据链:一个排序号从数据表出发,经云函数、保存适配器,走到后台每一种拖拽载体数据表字段云函数排序原子BFF 与保存适配器后台拖拽载体后台契约类型与排他详情页编辑态与嵌套订单钱域(与排序正交的第二片射程)有排序云函数就标成系统字段用户不传,新建时由服务端补补的那一条是唯一写路改顺序只剩排序接口这一个口系统字段同样不进前端参数类型批量模式在保存时调它即时模式拖完直接调它步骤的提交顺序从这里来内联子表的重排数组从这里来同一套派生扩到双层挂了拖拽就得关掉别的顺序来源载体底下的换算共用一个工具类型里没有,界面上也不该有台账与状态机是同一片钱域状态变更写进台账的那句话同一条台账上的单号也要真排序号字段的三态契约全量与嵌套可选 · …x-order:NS-DATA-0001拖拽表把它标成系统字用户不可传 · 下游…x-order:NS-DATA-0002新建行:自动追加到末预设 appendNextOrd…x-order:STD-SERVER-0002x-order:NS-SERVER-0002写入面:入参一律不收排序号新建与更新两个入口…x-order:NS-SERVER-0004x-order:NS-SERVER-0005x-order:NS-SERVER-0006重排:预设加一条 SQL 全量重写禁逐行更新 · 标记…x-order:STD-SERVER-0001x-order:NS-SERVER-0001x-order:NS-SERVER-0003保存适配器消费重排数三守卫齐了才调 · …x-order:STD-ADMIN-0004x-order:NS-ADMIN-0012拖拽属性两形态,出现即挂标记左卡即时模式 / 行…x-order:STD-ADMIN-0001x-order:NS-ADMIN-0002排他:分页、列头排序、列表形态同一张表不许有第二…x-order:NS-ADMIN-0010x-order:NS-ADMIN-0008x-order:NS-ADMIN-0005前端参数类型不许带排序号实体类型豁免 · 模…x-order:NS-ADMIN-0009组件里的拖拽换算收口到一个工具拖回原位 / 越界 / …x-order:NS-ADMIN-0001列、表单、详情字段里都不许露出它露出即可写 · 写了…x-order:NS-ADMIN-0004x-order:NS-ADMIN-0006x-order:NS-ADMIN-0007步骤编辑态的拖拽状态字段未拖过与拖过顺序未…x-order:STD-ADMIN-0002x-order:NS-ADMIN-0003内联子表的重排染色新建行与已删行各走…x-order:STD-ADMIN-0003x-order:NS-ADMIN-0011嵌套表外层内层各一份派生两层各有原始映射 ·…x-order:STD-ADMIN-0005x-order:NS-ADMIN-0013台账取值范围三个载体一致清单 / 字段行 / 字…x-order:NS-DATA-0003退款中的行除转出不许再写写一次即把对账时钟…x-order:NS-SERVER-0007员工能看见的字必须是人话黑名单枚举制 · 诊…x-order:NS-SERVER-0008补记审计凭证只取原单重算出的单号可能微…x-order:NS-SERVER-0010
流向守护 · 条款
1数据表字段 · 排序号字段的三态契约数据表字段 · 拖拽表把它标成系统字段有排序云函数就标成系统字段
2数据表字段 · 拖拽表把它标成系统字段云函数排序原子 · 新建行:自动追加到末尾用户不传,新建时由服务端补
3云函数排序原子 · 新建行:自动追加到末尾云函数排序原子 · 写入面:入参一律不收排序号补的那一条是唯一写路
4云函数排序原子 · 写入面:入参一律不收排序号云函数排序原子 · 重排:预设加一条 SQL 全量重写改顺序只剩排序接口这一个口
5数据表字段 · 拖拽表把它标成系统字段后台契约类型与排他面 · 前端参数类型不许带排序号系统字段同样不进前端参数类型
6云函数排序原子 · 重排:预设加一条 SQL 全量重写BFF 与保存适配器 · 保存适配器消费重排数组批量模式在保存时调它
7云函数排序原子 · 重排:预设加一条 SQL 全量重写后台拖拽载体 · 拖拽属性两形态,出现即挂标记即时模式拖完直接调它
8BFF 与保存适配器 · 保存适配器消费重排数组详情页编辑态与嵌套表 · 步骤编辑态的拖拽状态字段步骤的提交顺序从这里来
9BFF 与保存适配器 · 保存适配器消费重排数组详情页编辑态与嵌套表 · 内联子表的重排染色内联子表的重排数组从这里来
10详情页编辑态与嵌套表 · 内联子表的重排染色详情页编辑态与嵌套表 · 嵌套表外层内层各一份派生同一套派生扩到双层
11后台拖拽载体 · 拖拽属性两形态,出现即挂标记后台拖拽载体 · 排他:分页、列头排序、列表形态挂了拖拽就得关掉别的顺序来源
12后台拖拽载体 · 拖拽属性两形态,出现即挂标记后台契约类型与排他面 · 组件里的拖拽换算收口到一个工具载体底下的换算共用一个工具
13后台契约类型与排他面 · 前端参数类型不许带排序号后台契约类型与排他面 · 列、表单、详情字段里都不许露出它类型里没有,界面上也不该有
14订单钱域(与排序正交的第二片射程) · 台账取值范围三个载体一致订单钱域(与排序正交的第二片射程) · 退款中的行除转出不许再写台账与状态机是同一片钱域
15订单钱域(与排序正交的第二片射程) · 退款中的行除转出不许再写订单钱域(与排序正交的第二片射程) · 员工能看见的字必须是人话状态变更写进台账的那句话
16订单钱域(与排序正交的第二片射程) · 员工能看见的字必须是人话订单钱域(与排序正交的第二片射程) · 补记审计凭证只取原单号同一条台账上的单号也要真
格子数据表字段 · 排序号字段的三态契约全量与嵌套可选 · 分页 / 单查 / 单条禁含x-order:NS-DATA-0001
ARCH-A01
ARCH-A02
格子数据表字段 · 拖拽表把它标成系统字段用户不可传 · 下游按它豁免入参对齐x-order:NS-DATA-0002
ARCH-A03
格子云函数排序原子 · 新建行:自动追加到末尾预设 appendNextOrderNo · 分组参数显式传x-order:STD-SERVER-0002
x-order:NS-SERVER-0002
ARCH-B03
格子云函数排序原子 · 写入面:入参一律不收排序号新建与更新两个入口都堵 · repo 不留第二条轨x-order:NS-SERVER-0004
x-order:NS-SERVER-0005
x-order:NS-SERVER-0006
ARCH-B04
ARCH-B05
格子云函数排序原子 · 重排:预设加一条 SQL 全量重写禁逐行更新 · 标记块内必须有真调用x-order:STD-SERVER-0001
x-order:NS-SERVER-0001
x-order:NS-SERVER-0003
ARCH-B01
ARCH-B02
格子BFF 与保存适配器 · 保存适配器消费重排数组三守卫齐了才调 · 失败必须抛出x-order:STD-ADMIN-0004
x-order:NS-ADMIN-0012
ARCH-E01
ARCH-E02
格子后台拖拽载体 · 拖拽属性两形态,出现即挂标记左卡即时模式 / 行列表拖拽表格x-order:STD-ADMIN-0001
x-order:NS-ADMIN-0002
ARCH-C01
格子后台拖拽载体 · 排他:分页、列头排序、列表形态同一张表不许有第二种顺序来源x-order:NS-ADMIN-0010
x-order:NS-ADMIN-0008
x-order:NS-ADMIN-0005
ARCH-C02
ARCH-C03
格子后台契约类型与排他面 · 前端参数类型不许带排序号实体类型豁免 · 模块任意层级 · 云函数目录名反查x-order:NS-ADMIN-0009
ARCH-C06
格子后台契约类型与排他面 · 组件里的拖拽换算收口到一个工具拖回原位 / 越界 / 新删行的边界只在一处x-order:NS-ADMIN-0001
ARCH-C07
格子后台契约类型与排他面 · 列、表单、详情字段里都不许露出它露出即可写 · 写了没反应最难查x-order:NS-ADMIN-0004
x-order:NS-ADMIN-0006
x-order:NS-ADMIN-0007
ARCH-C04
ARCH-C05
格子详情页编辑态与嵌套表 · 步骤编辑态的拖拽状态字段未拖过与拖过顺序未变要分得开x-order:STD-ADMIN-0002
x-order:NS-ADMIN-0003
ARCH-D01
ARCH-D04
格子详情页编辑态与嵌套表 · 内联子表的重排染色新建行与已删行各走各的色x-order:STD-ADMIN-0003
x-order:NS-ADMIN-0011
ARCH-D02
格子详情页编辑态与嵌套表 · 嵌套表外层内层各一份派生两层各有原始映射 · 复用已修改状态x-order:STD-ADMIN-0005
x-order:NS-ADMIN-0013
ARCH-D03
格子订单钱域(与排序正交的第二片射程) · 台账取值范围三个载体一致清单 / 字段行 / 字段说明 · 锚坏即曝红x-order:NS-DATA-0003
ARCH-F04
格子订单钱域(与排序正交的第二片射程) · 退款中的行除转出不许再写写一次即把对账时钟归零x-order:NS-SERVER-0007
ARCH-F01
格子订单钱域(与排序正交的第二片射程) · 员工能看见的字必须是人话黑名单枚举制 · 诊断通道豁免x-order:NS-SERVER-0008
ARCH-F02
格子订单钱域(与排序正交的第二片射程) · 补记审计凭证只取原单号重算出的单号可能微信侧不存在x-order:NS-SERVER-0010
ARCH-F03

业务链:给一个实体加上拖拽排序,每一步当轮咬哪些闸

业务链:给一个实体加上拖拽排序,从决定形态到跑完检测开发动作落盘产物本域当轮咬的闸同轮咬的外域闸先定形态再动字段字段立住再写云函数批量场景才需要适配器落库通了再接界面改完当轮就跑检测开关落盘落盘落盘落盘落盘当轮咬当轮咬当轮咬当轮咬同轮还咬外域同轮还咬外域同轮还咬外域发布那一跳才咬① 先定形态:拖拽还是手工建不建排序云函数 ·…② 数据表加排序号并标系统字段字段名按命名规则 · …③ 云函数:新建追加、入参禁传、重排原子三件一起做 · 重排…④ 批量场景在保存适配器里消费重排即时场景跳过这一步…⑤ 页面挂拖拽属性与权限,关掉排他项权限取自权限声明 ·…⑥ 跑增量检测,再手验一遍拖拽改动文件全列进去 ·…x-server/…/{实体}-order-update/这个目录的存在与否…{表}.datasource.json 与同名 .md排序号字段 + 系统…{实体}-create/repo.js 与 order-update…一处追加、一处重排…{模块}.bff.ts 的保存适配器三守卫 + 排序接口…{模块}.tsx 与 {模块}.types.ts拖拽属性、权限声明…数据端两颗三态契约 + 系统字段x-order:NS-DATA-0001x-order:NS-DATA-0002服务端模板与禁逐行两条标准写法 + 禁 O…x-order:STD-SERVER-0001x-order:STD-SERVER-0002x-order:NS-SERVER-0003适配器模板与闭环三种标记任一 + 块…x-order:STD-ADMIN-0004x-order:NS-ADMIN-0012页面模板、闭环与分页排他拖拽与分页共存当场…x-order:STD-ADMIN-0001x-order:NS-ADMIN-0002x-order:NS-ADMIN-0010入参字段集与 repo 骨系统字段在对齐闸里…x-api:NS-SERVER-0131x-api:STD-SERVER-0004保存适配器骨架本域只管其中排序那…x-detail:STD-ADMIN-0006权限声明与分页开关权限禁硬编码 · 分…x-auth:STD-ADMIN-0001x-curd:NS-ADMIN-0121内核与上传包等值预设住内核母本,上…x-deploy:NS-SERVER-0002
流向守护 · 条款
1开发动作 · ① 先定形态:拖拽还是手工开发动作 · ② 数据表加排序号并标系统字段先定形态再动字段
2开发动作 · ② 数据表加排序号并标系统字段开发动作 · ③ 云函数:新建追加、入参禁传、重排原子字段立住再写云函数
3开发动作 · ③ 云函数:新建追加、入参禁传、重排原子开发动作 · ④ 批量场景在保存适配器里消费重排批量场景才需要适配器
4开发动作 · ④ 批量场景在保存适配器里消费重排开发动作 · ⑤ 页面挂拖拽属性与权限,关掉排他项落库通了再接界面
5开发动作 · ⑤ 页面挂拖拽属性与权限,关掉排他项开发动作 · ⑥ 跑增量检测,再手验一遍拖拽改完当轮就跑检测
6开发动作 · ① 先定形态:拖拽还是手工落盘产物 · x-server/…/{实体}-order-update/开关落盘
7开发动作 · ② 数据表加排序号并标系统字段落盘产物 · {表}.datasource.json 与同名 .md落盘
8开发动作 · ③ 云函数:新建追加、入参禁传、重排原子落盘产物 · {实体}-create/repo.js 与 order-update/repo.js落盘
9开发动作 · ④ 批量场景在保存适配器里消费重排落盘产物 · {模块}.bff.ts 的保存适配器落盘
10开发动作 · ⑤ 页面挂拖拽属性与权限,关掉排他项落盘产物 · {模块}.tsx 与 {模块}.types.ts落盘
11落盘产物 · {表}.datasource.json 与同名 .md本域当轮咬的闸 · 数据端两颗当轮咬
12落盘产物 · {实体}-create/repo.js 与 order-update/repo.js本域当轮咬的闸 · 服务端模板与禁逐行当轮咬
13落盘产物 · {模块}.bff.ts 的保存适配器本域当轮咬的闸 · 适配器模板与闭环当轮咬
14落盘产物 · {模块}.tsx 与 {模块}.types.ts本域当轮咬的闸 · 页面模板、闭环与分页排他当轮咬
15本域当轮咬的闸 · 服务端模板与禁逐行同轮咬的外域闸 · 入参字段集与 repo 骨架同轮还咬外域
16本域当轮咬的闸 · 适配器模板与闭环同轮咬的外域闸 · 保存适配器骨架同轮还咬外域
17本域当轮咬的闸 · 页面模板、闭环与分页排他同轮咬的外域闸 · 权限声明与分页开关同轮还咬外域
18开发动作 · ⑥ 跑增量检测,再手验一遍拖拽同轮咬的外域闸 · 内核与上传包等值发布那一跳才咬
格子开发动作 · ① 先定形态:拖拽还是手工建不建排序云函数 · 这个决定是全链路的开关ARCH-B06
ARCH-G03
格子开发动作 · ② 数据表加排序号并标系统字段字段名按命名规则 · .md 与 .json 一起改ARCH-A01
ARCH-A02
ARCH-A03
格子开发动作 · ③ 云函数:新建追加、入参禁传、重排原子三件一起做 · 重排云函数是新建的部署单元ARCH-B01
ARCH-B03
ARCH-B05
格子开发动作 · ④ 批量场景在保存适配器里消费重排即时场景跳过这一步,直接在页面调接口ARCH-E01
格子开发动作 · ⑤ 页面挂拖拽属性与权限,关掉排他项权限取自权限声明 · 分页与列头排序同批关掉ARCH-C01
ARCH-C02
ARCH-C03
格子开发动作 · ⑥ 跑增量检测,再手验一遍拖拽改动文件全列进去 · 断网回退与无权限两例手验ARCH-E02
格子本域当轮咬的闸 · 数据端两颗三态契约 + 系统字段x-order:NS-DATA-0001
x-order:NS-DATA-0002
ARCH-A01
ARCH-A03
格子本域当轮咬的闸 · 服务端模板与禁逐行两条标准写法 + 禁 ORM 逐行更新x-order:STD-SERVER-0001
x-order:STD-SERVER-0002
x-order:NS-SERVER-0003
ARCH-B01
ARCH-B02
ARCH-B03
格子本域当轮咬的闸 · 适配器模板与闭环三种标记任一 + 块内必须有真调用x-order:STD-ADMIN-0004
x-order:NS-ADMIN-0012
ARCH-E01
格子本域当轮咬的闸 · 页面模板、闭环与分页排他拖拽与分页共存当场报红x-order:STD-ADMIN-0001
x-order:NS-ADMIN-0002
x-order:NS-ADMIN-0010
ARCH-C01
ARCH-C02
格子同轮咬的外域闸 · 入参字段集与 repo 骨架系统字段在对齐闸里被豁免x-api:NS-SERVER-0131
x-api:STD-SERVER-0004
ARCH-A03
ARCH-G03
格子同轮咬的外域闸 · 保存适配器骨架本域只管其中排序那一跳x-detail:STD-ADMIN-0006
ARCH-E01
格子同轮咬的外域闸 · 权限声明与分页开关权限禁硬编码 · 分页开关必须显式x-auth:STD-ADMIN-0001
x-curd:NS-ADMIN-0121
ARCH-C01
ARCH-C02
格子同轮咬的外域闸 · 内核与上传包等值预设住内核母本,上传包是装配产物x-deploy:NS-SERVER-0002
ARCH-B01

射程与普查

这一域的射程不是按模块圈的,是按一样东西会经过哪些地方圈的。域名里的 order 同时是两个意思 —— 排序号与订单单据,于是射程成了两条互不相交的链共用一个门牌:排序号那条从建表出发,穿过云函数的入参与数据层,一路走到界面上的一个拖拽手柄;订单那条从一条更新语句的条件段出发,一路走到客服念给客户听的那句话。两条链都不是任何一个目录圈得住的,所以适用面只能逐类文件点名,而不是指向某个模块 —— 读这一节时别去找「订单模块在哪」,本域从头到尾没有这样一个位置。

包含面排序与钱域两条链
  • 排序号的出生地数据表的模型定义与字段说明,主表、嵌套表、叶子表三类都在内 —— 这张表该不该有排序号、它是不是用户碰不到的系统字段,都在这里定下来
  • 排序号唯一的写入口云函数的新建与更新入参校验,以及数据层的重排与追加。这一列只许从这里写进去,别处能写就是第二条轨,两条轨并存时顺序既不由拖拽决定也不由用户决定
  • 排序号在界面上的每一处露面后台页面、类型契约、聚合层,以及详情页那几个承载拖拽的框架组件。列、表单、详情字段、参数类型,任何一处露出来,用户就会想去改它
  • 订单钱域的收敛链路退款中状态的写入、对账补记的凭证取值、两张台账的取值范围,以及这条链上直达员工与客户屏幕的那些文字
排除面 · 三种性质完全不同不许混为一谈
  • 结构性看不见判据读的是写法形态:更新语句拆成多行写、状态值写成参数而不是字面量、用逗号隐式联表,它一概读不出来;同样看不见的还有换个写法取入参、把列头排序写成比较函数、把接口调用提取到别的文件
  • 判据够不着排序差分算得对不对、乐观更新失败后有没有真的退回原样、提示有没有真的弹出来、真机上拖拽手柄顺不顺手 —— 这些是运行时的事,静态判据只看得见代码长什么样
  • 不归本域移动端整端一颗闸都没有,端上不存在重排这个动作,将来要做先走治理环立判据;入参的具体校验规则归接口域,权限标识归权限域,保存适配器的骨架归详情域,选项集的消费面登记归数据域,内核母本的装配归发布域

普查:射程内今天实际有多少东西

下面每一块都是机器当场数出来的,但它是快照、不随代码自动刷新 —— 每块顶上标着快照日期。

文件x-server/**/repo.js
文件数214
正则reorderByPk m
命中文件4
命中次数8

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

文件x-server/**/repo.js
文件数214
正则appendNextOrderNo m
命中文件4
命中次数8

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

文件x-admin/src/**/*.tsx
文件数163
正则dragSort= m
命中文件1
命中次数1

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

文件x-admin/src/**/*.ts*
文件数940
正则X-RULE-BEGIN-STANDARD-x-order- m
命中文件6
命中次数8

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

文件x-data/**/*.datasource.json
文件数61
正则orderNo m
命中文件27
命中次数78

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

文件x-server/**/repo.js
文件数214
正则UPDATE order_item_node m
命中文件5
命中次数14

快照 · 2026-09-16(不随代码自动刷新;刷新走 sync --census --date=YYYY-MM-DD)

设计机理:为什么长成这样

一、两条轴,不是一份规范里塞了两件事

本规范的全部闸分成两片:排序轴(数据表、云函数与后台三处各占一段)与订单钱域轴NS-DATA-0003NS-SERVER-0007NS-SERVER-0008NS-SERVER-0010)。两片的适用面不重叠、判据互不引用。钱域那四颗历史上落在本规范而非 x-api,是因为它们守的是钱域的状态机与文案这条轴,而 x-api 持的是链路不变量轴 —— 两轴正交共管同一批文件(2026-08-05 已把 wechatpay 目录的领域归属由单值改成数组,两个规范同时可达,详见「取舍与在案裁定」)。

二、白名单为什么是目录存在性,以及它的三个代理判据

「这个实体是拖拽专属吗」这个问题,全链路要问十次,而判据给出的答案来自四种不同的代理

四种代理在今天的库里结论一致,但它们分家的条件不同:把排序云函数与新建云函数放进不同父目录,只有「同级找兄弟」那一种失明(今天四个排序实体恰好都是兄弟布局,那是巧合不是保证);接口改名或调用被提取到别处,只有「文件里有没有那次调用」那一种失明。两种反查代理的失明条件最窄 —— 只有名字本身落在它们的匹配臂之外才看不见。正查曾是本域最大的成片盲区:表名或模块名与云函数前缀不同形(sop_step_nodesop-steps-order-update)时正查恒落空,两颗闸因此长期半盲,V1.1.0 与 V1.2.0 先后把它们改成反查。这件事写进条款 ARCH-B06,并在「诚实边界」里列出今天的实测分布。

三、模板体系:两个服务端原子 + 五个后台载体

七条标准写法按宿主分工:服务端两条(重排、追加)各配一颗闭环闸;后台五条分别对应五种拖拽载体,每条也各配一颗闭环闸。全部是 if-exists 形态 —— 没挂标记就一行都不比,所以标准写法的真实射程等于它那颗闭环闸的射程。闭环闸这一侧有两种形态:锚在一文件一处的整文件模板或框架件上的五颗(两个服务端原子、三个详情页框架件)判「文件里有块」并做「块内必须有真节点」的反伪空块检查(重排块里要有预设调用、追加块里要有追加调用、染色块里要有派生),单挂一个空标记块过不了;锚在一个文件里能出现多处的写法上的两颗(后台页面的拖拽属性、保存适配器里的排序接口调用)V1.3.0 起改成逐处归属 —— 每一处都要落在一对标记块内,空块什么都掩护不了。

四、批量模式为什么要染色

五种载体里有三种是批量模式:拖完不落库,等用户点保存时与增删改一起提交。这带来一个即时模式没有的问题 —— 用户在保存前无法回答「我到底动过哪些行」。三条染色标准写法(步骤状态字段、内联子表派生、嵌套双层派生)解决的都是这一件事,并且共用同一套判定:拿当前位置与原始位置比,位置变了才算;新建行与已删行各走各的色;优先级固定为「已删除 > 新建 > 重排」。三处口径必须一致,否则同一个操作在不同表里染出不同颜色。机器守到哪要说实话:三条标准写法里只有两条(内联子表派生、嵌套外层派生)锁的是可运行的位置派生,测试床在同一份行变动夹具上对拍的也只有这两处;步骤编辑态那一条只锁一行类型契约,它的派生算法有意不模板化(见「取舍与在案裁定 · 排序差分算法有意不模板化」),物理上进不了对拍;嵌套表的「新建 / 已删优先」分支链与外层缓存依赖数组写在标记块外,闸也不看。所以「三处一致」今天是两处机器对拍 + 一处靠人(条款 ARCH-D01 / ARCH-D03 / ARCH-D04),判据 STD-ADMIN-0002 与 0005 各有一段「机器守到哪」写明同一件事。

条款总表

条款标题要求守护
ARCH-A01分页表、单查表、单条表里不许有排序号禁止x-data/** 下的 *_base / *_node / *_leaf 三类业务表(*_log / *_relation / *_dict 不在射程),凡读取形态是分页 B、单查 C 或单条表的,字段里出现 orderNo 或任何 *OrderNo 后缀字段(后缀按 ^[a-z][a-zA-Z0-9]*OrderNo$ 识别,裸 OrderNo 不算)。形态识别按固定次序:① .md 里出现「单记录」「单条记录」「全系统仅一条」「全系统只有一条」四词之一 → 单条表;② 否则 _node / _leaf → 全量 A;③ 否则 _base 拿表名去后缀、下划线换连字符,全树递归找 {前缀}-read 云函数的 controller.js,剥注释与字符串后 pageSize: z.pageNumber: z. 同时在场 → 分页 B(只测出现与否,不看带不带 .optional);否则取文件里**第一个**匹配 xxxCode: z.string()xxxId: z.string() 的字段,它不带 .optional → 单查 C;其余 → 全量 A。全量 A 与嵌套表反过来是「可选」:带不带排序号由排序需求决定。x-order:NS-DATA-0001
ARCH-A02排序字段只能叫 orderNo,或以 OrderNo 结尾必须:排序号字段命名为 orderNo;同一行需要两级排序时用 *OrderNo 后缀(camelCase 前缀 + OrderNo 结尾,如 groupOrderNo + paramOrderNo)。无机器闸:射程类(判据按字段名字面识别排序字段,换个名字整条链上的闸同时失明,而失明与通过在报表上无法区分)
ARCH-A03拖拽表的排序号是系统字段,用户碰不到必须:有对应 *-order-update 云函数的业务表,其 orderNo 字段在 .datasource.json 里标 "x-system": true.md 字段表同步标注它由排序云函数维护。判据按表前缀反查:表名去掉 _base / _node / _leaf 后缀、下划线换连字符得到表前缀,再枚举 x-server 下全部带 package.json{前缀}-order-update 目录,前缀**等于表前缀**或**等于表前缀的复数形**(尾部加 s)即判拖拽专属(supplier_basesupplier-order-updatesop_step_nodesop-steps-order-update)。x-order:NS-DATA-0002
ARCH-B01重排只有一种写法:调 sys 预设的 reorderByPk必须x-server/**/*-order-update/repo.js(排除 templates/sys/ 与撞名的 refund-order-update/)里的重排写成两段 —— P1 从 ./sys/utils/order/presets/reorder-by-pk 引入 reorderByPk,P2 一行 return reorderByPk(db, '表名', '主键字段', orderedIds),四个参数顺序固定,表名是 snake_case 字符串字面量、主键是 camelCase 字符串字面量。这类文件只要存在就必须挂 STD-SERVER-0001 的标记,且标记块内必须真有 reorderByPk 调用 —— 空块不算。x-order:STD-SERVER-0001
x-order:NS-SERVER-0001
ARCH-B02重排禁逐行更新,必须一条 SQL 全量重写禁止*-order-update/repo.js(同样排除撞名的 refund-order-update/)里出现 ORM 的 .update(.updateMany(;同样禁止的是「两样批量重写手段一个都没有」—— 剥掉注释与字符串之后的代码里必须至少出现 reorderByPk($runSQL( 之一,两者皆无照样报红。x-order:NS-SERVER-0003
ARCH-B03新建行的排序号由 appendNextOrderNo 追加必须:拖拽专属实体的 *-create/repo.js 写成两段 —— P1 从 ./sys/utils/order/presets/append-next 引入 appendNextOrderNo,P2 一行 record.orderNo = await appendNextOrderNo(db, '表名', 分组参数);赋值目标必须是 record.orderNo(其他变量名禁止),无分组传 {},有分组传 { 字段: 值 }。闭环闸的触发条件是「剥注释与字符串后文件里出现 orderNo 且同级兄弟目录有 {本函数前缀}-order-update/package.json」,触发即必须挂 STD-SERVER-0002 的标记,块内必须真有 appendNextOrderNo 调用。x-order:STD-SERVER-0002
x-order:NS-SERVER-0002
ARCH-B04拖拽专属的新建不许留「用户传了就用」的第二条轨禁止:拖拽专属的 *-create/repo.js 里出现 if (params.orderNo 开头的双轨分支(判据按这一个形态匹配,剥注释与字符串后的代码视图)。x-order:NS-SERVER-0006
ARCH-B05拖拽专属实体的新建与更新入参里不许有排序号禁止:拖拽专属实体的 *-create/controller.js*-update/controller.js 的 zod schema 里出现 orderNo: z. 形态的字段(*-order-update/controller.js 自身除外 —— 它就是排序接口本身,已在适用面排除)。两颗闸都按「同级兄弟目录里有没有 {本函数前缀}-order-update/package.json」判拖拽专属。x-order:NS-SERVER-0004
x-order:NS-SERVER-0005
ARCH-B06拖拽还是手工,开关就是那个云函数目录本身必须:想让一张表从手工排序变成拖拽排序,就建 {实体前缀}-order-update 云函数目录;不想要拖拽,就不要建它。建与不建之间,全链路十颗闸同时改判。无机器闸:射程类(拖拽专属与否由目录存在性代理,删掉或改名之后十颗闸集体静默,与「扫过了没问题」在报表上无法区分)
ARCH-C01后台的拖拽属性只有两种形态,且必须挂标记必须x-admin/src/**/*.tsxxComponents 除外)里的拖拽属性写成 STD-ADMIN-0001 的两种形态之一 —— P1 是左卡列表的即时模式(dragSort 对象里写 onConfirmpermissiononConfirm 内调 xxxOrderUpdate({ orderedIds }),权限取自 AUTH_META.orderUpdate.id),P2 是行列表的 pro3 拖拽表格形态(写 dragSortKeyonDragSortEnd,权限在回调内用 access.canCallFunction(AUTH_META.orderUpdate.id) 自己判,因为这个组件没有权限属性)。两种形态的原子服务名都必须是 camelCase 且以 OrderUpdate 结尾。文件里**每一处** dragSort={{ 都必须落在一对 STD-ADMIN-0001 的标记块内(V1.3.0 起逐处归属:同页两个载体各配拖拽时,挂了一个块不能掩护另一处),且标记块内必须真有 dragSort={{ —— 挂个空块不算。x-order:STD-ADMIN-0001
x-order:NS-ADMIN-0002
ARCH-C02拖拽与分页互斥禁止:同一个 .tsxx-admin/src/**xComponents 除外)里同时出现 dragSort={{usePagination={true}x-order:NS-ADMIN-0010
ARCH-C03拖拽页不许再给用户第二种排序入口禁止:拖拽专属页面(文件里有 xxxOrderUpdate( 调用)的列配置里出现 sorter: truesortField: 'orderNo';以及同一文件里 dragSort={{displayMode="list" 共存。x-order:NS-ADMIN-0005
x-order:NS-ADMIN-0008
ARCH-C04拖拽页不许把排序号画成一列禁止:拖拽专属页面(xModulesxCore 下的 .tsx)的列配置里出现 dataIndex: 'orderNo'x-order:NS-ADMIN-0004
ARCH-C05拖拽页的表单与详情字段配置里也不许有排序号禁止:拖拽专属页面的新建 / 编辑表单里出现 name='orderNo' 的录入控件;详情页的字段配置里出现 dataIndex: 'orderNo'x-order:NS-ADMIN-0006
x-order:NS-ADMIN-0007
ARCH-C06拖拽专属实体的前端参数类型里不许有排序号禁止:拖拽专属实体的 *CreateParams / *UpdateParams 类型里含 orderNo 字段(实体类型本身豁免 —— 它描述的是「读回来的行长什么样」,那一列确实存在)。x-order:NS-ADMIN-0009
ARCH-C07组件里的拖拽计算收口到一个工具必须x-admin/src/xComponents/** 下的 .tsx 组件用了 @dnd-kit/ 拖拽库,就必须写一条 from '@/xTools/sortable' 的引入,由 resolveReorder 把拖拽事件换算成有序 id 数组。x-order:NS-ADMIN-0001
ARCH-D01详情页步骤的编辑态拖拽有固定的字段契约必须use-detail-editable-steps.ts 导出 reorderedStepIds: string[] | null 这个状态字段(null 表示本次没拖过),由它派生出提交用的顺序(collectStepChanges 过滤掉临时新建行与已标删除行后产出 stepOrder,再经保存适配器调 sopStepsOrderUpdate({ orderedIds: stepOrder }) 落库);该文件必须挂 STD-ADMIN-0002 的标记,且标记块内必须真有 reorderedStepIds —— 空块不算。x-order:STD-ADMIN-0002
x-order:NS-ADMIN-0003
ARCH-D02内联子表的重排要染色,派生算法写死必须:详情页内联子表(table.tsx)的行样式里含 isRowReordered 这个派生函数:它比对某一行在当前列表里的位置与在原始列表里的位置,位置变了才算重排;新建行(键以新建前缀起头)与已标删除的行直接返回否,各自走各自的染色。行样式的优先级固定为「已删除 > 新建 > 重排 > 无」。该文件里只要出现 sortableResolved 这个标识符,就必须挂 STD-ADMIN-0003 的标记,且块内必须真有 isRowReorderedx-order:STD-ADMIN-0003
x-order:NS-ADMIN-0011
ARCH-D03嵌套双层表的重排染色,外层内层各一份必须:嵌套表(nested-table.tsx)的行状态派生里,外层与内层各加一个重排分支 —— 外层基于 originalKeyToIdx 比对当前外层索引,内层基于本组内的 origInnerKeyToIdx 比对当前内层索引,两者都是「映射里有这个键,且记录的位置与当前位置不同」双条件,命中后统一设成 modified(已修改)状态,排在字段修改分支之后。文件里只要出现 useSortable(,就必须把 STD-ADMIN-0005 的 P1 与 P2 两段标记都挂上,且 P1 块内必须真有 originalKeyToIdx、P2 块内必须真有 origInnerKeyToIdxx-order:STD-ADMIN-0005
x-order:NS-ADMIN-0013
ARCH-D04排序差分的算法本体不模板化,只锚住它的字段名必须:知道编辑态的排序差分算法(哪些行算「位置真的变了」、按什么顺序产出提交数组)有意不被模板化,本规范只焊住它对外的字段名与消费方式;改算法时自己对着原始顺序逐例核对,别指望闸会拦。无机器闸:语义类(判据只逐字比对字段名与消费形态,算法本身算得对不对它看不见,且算错的表现是数据错位而非报错)
ARCH-E01子表的重排在保存适配器里落库必须:保存适配器消费内联子表变更时,按 STD-ADMIN-0004 的形态写 —— 先判模式是 'inline-edit'、再判有重排数组(xxx.toReorder)、再判主表主键不是 NEW_ 起头的临时值,三个守卫齐了才调 xxxOrderUpdate({ orderedIds: 子表.toReorder }),并且用 unwrapApiResult 包住让失败抛出去。*.bff.ts 里**每一处** await xxxOrderUpdate( 调用(import / export 起头的行不算)都必须落在 STD-ADMIN-0001 / 0002 / 0004 三种标记之一的块内(V1.3.0 起逐处归属)。x-order:STD-ADMIN-0004
x-order:NS-ADMIN-0012
ARCH-E02拖不动、拖了没落库,都要让用户看得见必须:即时模式下拖拽先动画后落库,接口失败时把顺序退回原样并给出提示;批量模式下排序随保存一起提交,失败时整次保存要报错,不许出现「保存成功但顺序没变」。无机器闸:运行时类(乐观更新有没有回退、提示有没有弹、真机手感如何,都是运行时行为,静态判据看不见)
ARCH-F01进入退款中的订单行,除了转出状态不许再写禁止:任何 UPDATE order_item_nodeUPDATE order_refund_node,如果它的 WHERE 段能匹配到该表状态列等于退款中(等值或 IN 列表都算;订单行的状态列是 itemStatus,退款单行是 refundStatus),它的 SET 段里就必须包含**同一个状态列**的赋值 —— 只允许转出退款中,不允许「保持退款中、只改别的列」。形态域是 UPDATE <表> [别名] [INNER|LEFT|RIGHT|CROSS] JOIN … SET,联表写法与直写同等看见;判据把 SET 段与顶层 WHERE 段按括号深度分开,SET 右值里的子查询自带的 WHERE 不算。x-order:NS-SERVER-0007
ARCH-F02员工和客户能看见的字,必须是人话禁止:钱域的运行时字符串(台账备注、业务异常的提示语、批量结果里的失败说明)里出现工程黑话 —— 工程编号(F 加**恰好**两位数字:F54F50a 算,后面紧跟第三位数字的商品型号如 F543 不算)与架构术语(不变式、实收锚、幂等、竞态、半程崩溃、存量黑洞、前滚、预登记、翻态、三步式、幻值、单语句、TOCTOU、CAS、Σ、attempt 已耗、payShareFen、直翻、翻单、行级)。x-order:NS-SERVER-0008
ARCH-F03补记审计凭证时,退款单号只准取原值禁止:对账补记那条路径里(order-payment-reconcile-update/service.js),在写退款台账的调用(writeRefundTxnLog()所在行往上数 15 行的窗口内出现 'RF' + 这样的单号拼接。x-order:NS-SERVER-0010
ARCH-F04台账的取值范围,三个载体一起改必须:两张台账表(订单状态台账 order_status_log、订单交易台账 order_transaction_log)的取值范围有三个声明载体 —— x-data/选项集清单.md(真相源,按 orderLogSource / orderTxnDirection 两个条目取「标识:\x\」行)、表 .md 的对应字段行(| source | / | direction |)、.datasource.json 里**该字段自己**的 description;加值或改值时三处一起改,任一处漏掉即违规。x-order:NS-DATA-0003
ARCH-G01小程序端不在本规范射程内必须:知道本规范的适用面只有数据表、云函数、后台三处;小程序端没有任何一颗闸。无机器闸:射程类(本规范的适用面不含移动端,端上写什么都结构性看不见)
ARCH-G02新增以 order-update 结尾但不是排序的云函数,同批加排除必须:新建一个名字以 -order-update 结尾、但语义不是「重排序号」的云函数时,同一批把它加进判据里那三处排除面(重排标准写法 STD-SERVER-0001、重排闭环兜底 NS-SERVER-0001、禁逐行更新 NS-SERVER-0003),并在架构页留痕。无机器闸:流程类(判据靠目录名后缀圈射程,撞名只能逐例登记排除;有没有同批登记是流程事实,一次扫描看不出来)
ARCH-G03手工模式要么做完整,要么不做必须:没有排序云函数的表走手工模式 —— 排序号字段不标系统字段、新建与更新的 zod 里要含它、前端表单要给出录入控件。三样要么齐,要么这张表就别有排序号。x-api:NS-SERVER-0131

判据实现:闸怎么咬

规则号名称认领条款
STD-SERVER-0001reorder调用模板ARCH-B01
STD-SERVER-0002append调用模板ARCH-B03
STD-ADMIN-0001dragSortProp模板ARCH-C01
STD-ADMIN-0002useDetailEditableSteps契约ARCH-D01
STD-ADMIN-0003DetailInlineTable拖拽染色契约ARCH-D02
STD-ADMIN-0004DetailBFFReorder消费模板ARCH-E01
STD-ADMIN-0005NestedTable双层reorder派生ARCH-D03
NS-DATA-0001业务表 orderNo/*OrderNo 三态契约ARCH-A01
NS-DATA-0002拖拽专属orderNoXSystem:trueARCH-A03
NS-SERVER-0001STDSERVER0001闭环兜底ARCH-B01
NS-SERVER-0002STDSERVER0002闭环兜底ARCH-B03
NS-SERVER-0003排序云函数repo禁逐行更新ARCH-B02
NS-SERVER-0004拖拽专属*-create zod禁orderNoARCH-B05
NS-SERVER-0005拖拽专属*-update zod禁orderNoARCH-B05
NS-SERVER-0006拖拽专属*-create repo禁双轨ARCH-B04
NS-SERVER-0007refunding态原子性锁(对账时钟不可污染)ARCH-F01
NS-SERVER-0008员工可见文本人话律ARCH-F02
NS-SERVER-0010补记路禁幻值单号复活ARCH-F03
NS-DATA-0003台账值域声明双载体一致ARCH-F04
NS-ADMIN-0001xComponents拖拽强制import xTools/sortableARCH-C07
NS-ADMIN-0002STDADMIN0001闭环兜底ARCH-C01
NS-ADMIN-0003STDADMIN0002闭环兜底ARCH-D01
NS-ADMIN-0004拖拽专属ProColumns禁orderNo列ARCH-C04
NS-ADMIN-0005拖拽专属ProColumns禁sorterARCH-C03
NS-ADMIN-0006拖拽专属form禁orderNo字段ARCH-C05
NS-ADMIN-0007拖拽专属DetailSections禁orderNoARCH-C05
NS-ADMIN-0008dragSort与Sorter/list互斥ARCH-C03
NS-ADMIN-0009拖拽专属*Params禁含orderNoARCH-C06
NS-ADMIN-0010dragSort与usePagination互斥ARCH-C02
NS-ADMIN-0011STDADMIN0003闭环兜底ARCH-D02
NS-ADMIN-0012STDADMIN0004闭环兜底ARCH-E01
NS-ADMIN-0013STDADMIN0005闭环兜底ARCH-D03

取舍与在案裁定

V4 放宽:读取形态与排序需求解耦(2026-06-19)

V3 要求「全量加载的嵌套表必须含排序号」,把两个正交问题焊在一起,结果是语义上明明属于「被父表拥有的子表」的表,为了不带排序号而伪装成主数据聚合根 —— 本末倒置。V4 拆开:排序号的有无由排序需求决定,拖拽、手工、派生排序(如按默认标记与更新时间)三者皆合法;放宽只发生在「可选」那一侧,分页 / 单查 / 单条禁含一个字没松。落地在条款 ARCH-A01。

撞名排除:退款退货单审批函数不是排序云函数(2026-08-09)

refund-order-update 更新的是「退款退货」,与重排序号毫无关系,但它的目录名结构性地撞上 *-order-update 这个后缀。此前三颗闸(重排标准写法、重排闭环、禁逐行更新)把它扫进来,逼一个审批函数去挂重排模板的标记。裁定是实体化批排除:三处排除面同批登记,一处不漏。撞名不会因为谁更小心就消失,只能逐例登记 —— 条款 ARCH-G02 把这条流程写下来。

对账时钟保留最后更新时间,不改用台账时间

超时退款件的扫描用「行状态是退款中 + 最后更新时间早于截止点」当时钟。改查状态台账的最近一次翻态时间看似更干净(台账只追加、时间戳物理不可重置),但引入更严重的失败模式:翻状态与写台账分属两条语句而平台无跨表事务,中间崩溃就会出现「行是退款中、台账无记录」→ 子查询为空 → 谓词恒假 → 永久漏扫(活体探针实证过)。而最后更新时间与状态变更在同一条 UPDATE 内原子写入,永不缺失。裁定:保留现有时钟,并用 NS-SERVER-0007 把它的前提(进入退款中后除转出零写入)焊成物理闸 —— 普查时全库写入点全部满足这条不变量,但那是巧合而非强制。

人话律与备注四分类(2026-08-01 立)

台账备注与业务异常提示经订单事件流、工单流水直达客户与员工屏幕。立闸时实测约 30 条备注里 14 条以上含工程黑话。裁定:黑名单走枚举制(新黑话出现时按需扩,禁预防性泛化 —— 泛化必然误伤业务文案);工程归因锚移入代码注释;备注内容按四类处置(独立信息必须写清楚、事件复述保留、原始取证体改走日志、工程考古长文归表文档变更历史);SYS_500 行豁免是架构语义(工程师诊断通道)而非兜底。同日立法者自己的 4 行存量违规也一并改写 —— 闸只扫代码不扫库存量,这是它的诚实边界。

单号两条路刻意相反

补记路只准取原值NS-SERVER-0010),恢复路恒重算绝不查表。看似矛盾,实则各自正确:补记写的是审计凭证,重算出的值可能是微信侧不存在的幻值(v1.5 前的 4 行 …N0 即此病),写进台账等于伪造;恢复路算出的单号要拿去问微信,问错了微信会告知不存在,可以自纠。裁定是把这条差异物理化,而不是统一成一种写法。

清单与代码消费面那一轴已收编退役(2026-08-09)

本规范原有的 NS-COMMON-0001(订单值域选项集三方一致)是「清单 ↔ 代码消费面」的一对一先例,2026-08-09 泛化成 x-data:NS-DATA-0215 通用闸,全部选项集统一治理,本规范那颗退役。台账值域三载体一致(NS-DATA-0003)作为特例保留 —— 它管的是「清单 ↔ 表文档字段行 ↔ 表定义字段说明」三个声明载体,与消费面那一轴正交。这也是本规范编号里 NS-COMMON 段空缺的原因。

四锚 fail-loud(2026-08-18)

台账值域那颗闸原本有四个静默点(清单文件缺失、条目锚失配、段内零值提取、表文档字段行锚失配),任一处锚漂移,检测就整个消失而报表照常显示通过 —— 典型的假牙。裁定:四处全部改成锚坏当场曝红,与 x-data:NS-DATA-0215 的锚有效性同哲学。

排序差分算法有意不模板化

详情页步骤的差分算法依赖运行时表单注册结果裁剪原始数据、业务形态多,物理上写不成逐行比对的模板(原则 15 的业务逻辑块豁免),且它属详情页编排域。裁定:本规范只焊住对外字段名保存适配器的消费形态,算法本体归代码审查 —— 代价写在条款 ARCH-D04,算错的表现是数据错位而非报错。

行列表拖拽形态零业务消费者,但能力保留

标准写法 STD-ADMIN-0001 的 P2(pro3 拖拽表格)示例源自商品拖拽,而该功能已于 2026-07-14 按架构决策整体移除、排序云函数与本地代码全链清除。裁定:P2 能力保留、示例作为教学留在判据里,新增行列表拖拽时按它实例化,避免临时另发明一种写法。代价是这一段模板当前零活体,报表上与「扫过了没问题」无法区分 —— 记在「诚实边界」。

钱域文案面的领域归属改成共管(2026-08-05)

人话律那颗闸的支付网关目录 glob 曾经两种扫描模式都不可达:领域独占在聚合阶段剔除非属主规范,与扫描模式无关,所以它当时是一条死规则、支付文案面零闸。根治方式是把该目录的属主由单值改成数组(x-apix-order 并列),两轴正交共管,语义同内核目录的三规范共享。现状是两种模式均可达。

V1.2.0:钱域那颗闸严堵到底,反查推广到数据端(2026-09-16)

V1.1.0 把三个缺口登记成了「诚实边界」留待拍板,用户口径是钱域有漏洞必须严堵、方案禁复杂化,于是同一天全部堵上,只升一次版。三处改动都不改判定语义、只扩它看得见的面:① 原子性锁的形态域容纳 UPDATE <表> [别名] [INNER|LEFT|RIGHT|CROSS] JOIN … SET —— 改前正则要求表名/别名后直接跟 SET,库里 2 处联表写法长期在视野外;② 守护落点补上 order_refund_node —— 对账时钟的真实落点在退款单行,改前本闸只守订单行、与后果链分家,两张表各用各的状态列(itemStatus / refundStatus);③ 数据端系统字段那颗正查改反查,容纳复数前缀,四张排序表全部进入射程。三处改完实测零新增违规(40 处钱域 UPDATE 里 18 处命中退款中、全部转出;四张表的排序号早已标系统字段)—— 堵的是将来,不是存量。

为什么不加第三处「时钟迁移」的选项:把对账时钟从 updatedAt 迁到独立来源是一次跨云函数的改造,而本轮要解决的问题只是「闸没看见该看的地方」。扩形态域与扩表名各是一行判据改动,配一张床就能钉死;迁时钟则要动业务代码、改扫描谓词、还要处理迁移期的双写 —— 那是「复杂化」,与用户口径相反。时钟本身的设计取舍(为何不用台账时间)仍按下方那一条,没有变。

V1.1.0:拖拽专属的判法从「正查同名」改成「反查前缀」(2026-09-16)

前端参数类型那颗闸此前把模块路径正则锁死成单层、又按「模块名 + -order-update」去正查目录,两者叠加后真正被判过的模块只剩 supplier 一个:多级模块(xModules/ecommerce/** 等 8 份 types)结构性出界,而 sop 的排序函数叫 sop-steps-order-update、正查恒落空。裁定:模块路径放开到任意层级;拖拽专属改为枚举 x-server 下全部 {前缀}-order-update 目录反查,前缀等于模块名或以「模块名-」起头即算,反向不成立(模块名比前缀长时不算,避免组件级子模块继承父模块的拖拽属性)。撞名的 refund-order-update 照样会被枚举进来,此处不加第四处排除:今天没有同名模块,而假阳是会报红的(可见),静默失明才是不可见的 —— 宁可留一个将来会炸出来的红,也不预先加一份要维护的名单。目录树遍历改用引擎注入的 tools.ignoredDirs,不再手抄跳过表。配套床见「测试床」节第一行。

规范名与内容的张力(登记)

本规范叫 x-order,内容主体却是拖拽排序;同时它又确实持有四颗订单钱域的闸。两件事共用一个 order 字而语义不同,读判据时极易误以为它是订单业务规范。本轮迁四件套不动判据一个字,仅在此登记这条张力:如果将来要拆,拆的应当是钱域那四颗(连同它们的适用面一起迁到钱域规范),而不是给排序轴改名。

测试床:凭什么信它在咬人

本域的闸全部有床,零待补。V1.1.0 改了参数类型那颗的射程,同批建了 x-test/x-order-ns-admin-0009-module-depth-tooth.test.js(10 例);V1.2.0 扩了原子性锁的形态域与守护落点、把系统字段那颗的正查改成反查,同批建了 x-test/x-order-ns-server-0007-ns-data-0002-money-clock-tooth.test.js(20 例)。2026-09-16 补床轮把余下 29 颗一次补齐,新建的床合计 230 例,全过。V1.3.0 判据整改轮三张床同批补样本(钱域 34 → 36、拖拽载体 24 → 27、保存适配器 20 → 23),十张床合计 268 例,全过。

三种臂,缺一不可。「形态」臂把样本喂给引擎真检测器(extractNsRuleDetector + buildDetectorTools);标准写法那七颗另有一条「模板」臂,走引擎真模板匹配器(checkStandardFormat,在系统临时目录落真文件 —— 引擎的 STANDARD 段是从磁盘读目标文件的,只喂内存字符串会静默得到零违规,立床当场踩到);「射程」臂把假工作区喂给引擎真选文件器(scanFilesByRule)验适用面与排除面 —— 本域绝大多数闸的路径过滤不在检测器体内,拿检测器去断言「某某目录不该咬」是问错了对象。所有床零复刻判据逻辑,假工作区一律建在系统临时目录、跑完即删,仓里零写盘。

七颗标准写法都是 if-exists —— 文件里一个标记都没有时它整体不适用。八张床各有一发把这条静默面写成断言(「写了拖拽却不挂标记 ⇒ 模板闸零违规」),因为这正是七颗闭环闸存在的全部理由:模板能不能被绕过,押在「出现特征就必须挂标记」+「挂了标记块里没有真节点也要咬」这两条上。每一颗闭环闸都配了反伪空块的那一发;V1.3.0 改成逐处归属的两颗(拖拽属性、保存适配器的排序接口调用)另各补「一处包住 + 一处裸写 ⇒ 恰咬 1 条且点名那一行」与「只写 BEGIN ⇒ 咬」两发 —— 文件级判定时这两种写法都是零违规。

按「守实现不守闸」口径不登记的相邻床有七张:x-test/order-reconcile/reconcile.test.jsx-test/order-refund-preview/preview.test.jsx-test/refund-apply-create/apply.test.jsx-test/refund-order-create/order-create.test.jsx-test/refund-order-update/refund-order-update.test.jsx-test/refund-self-cancel/self-cancel.test.jsx-test/dispatch-reopen/reopen.test.js —— 它们跑的是退款与对账的运行时行为(状态机、金额、幂等),确实与钱域那三颗闸守着同一批代码,但没有任何一例断言过判据的判定逻辑:闸判的是「这条 SQL 的形态合不合法」,床验的是「这次退款算得对不对」。两者同绿不互相担保。下面每一行写清那张床给它守的闸钉住了什么、以及哪些方向没验

这些床验到了什么可复跑的事实
  • 闸真的会咬造出违规样本喂给引擎里那颗真检测器,正例必红,且报错点名到具体位置
  • 闸拆掉就不咬反向注入:临时改坏判据,对应那一发必须变绿 —— 这才证明闸没在空转
  • 射程真的覆盖到问引擎真选文件器:该进门的进门,射程外的确实不进
  • 判据写明的边界确实不咬把「刻意不管」的写法逐条钉成绿,防止后人误以为漏了
这些床证明不了什么别把它当保证
  • 不证明床真测到了那颗闸架构层的元闸只验「床存在、内文写了闸号、真调了引擎」,验不了它测的是不是那一颗
  • 不证明床被跑过点名与执行是两条独立的链:页面说「有床守着」,不等于哪个运行器真的扣了扳机
  • 不证明判据是对的床按判据当下的语义写;判据本身理解错了,床会忠实地复现这个错误

诚实边界:守不住什么

本节是承诺不是待办:做不到的明说,删掉本节等于默认宣称全覆盖。这一域说「无机器闸」的条款分属射程、流程、语义与运行时几类,病根却是同一个:本域的闸认不出「排序」这件事本身,它认的是名字 —— 字段叫什么、云函数目录叫什么、接口调用叫什么。名字一改,整条链上认它的闸同时失明,而失明与「扫过了没问题」在报表上长得一模一样。另有一条看着像没有闸、其实由接口域的字段集对齐闸咬住一头(手工排序那条),不在本节重复承接。

条款书说「无机器闸」的那些,实际由谁兜底

闸射程内已知的失明点

射程事实(2026-09-16 实测)

判据自陈的静态不可判面

本页与判据的分工

本页不复述判据的检测逻辑,只写结构、取舍与边界;每颗闸的判定细节以判据 .claude/skills/x-spec-checker/references/x-order-spec.md 为准,每条条款的「必须 / 禁止 / 为什么 / 怎么做」以条款书 .claude/rules/x-order-rule.md 为准。本页的条款总表、判据总表、两张泳道图与普查快照都是派生区,手改即红 —— 改原件后跑 meta.js --action=sync 重新生成。

本页自己的边界

上面讲的是治理面的边界。这一段讲这张页面本身 —— 架构页也是被治的东西,它同样有机器管不到的地方。

本页是 x-order 系统四件套的设计件。另三件:条款 .claude/rules/x-order-rule.md、判据 .claude/skills/x-spec-checker/references/x-order-spec.md、执法由写前拦截与收尾环承担。变更历史见同目录 CHANGELOG.md。页面骨架遵循《系统架构标准》,带斑马边框的区块全部由生成器产出、受内容指纹锁。