admin_backend 27 端点后端绑定 · 验收底稿(判据侧 · 支援 WIP-352)

版本:v1.1(v1=23:3x 出稿;v1.1=23:4x 按小齐实施进度校准:已接 0→5、三域 7→13)
任务卡(开工闸门)
- 目标:为 WIP-352①「27 端点数据面逐个接 resolve_destination」提供绑定后的验收判据与证据位,小齐照单实施、本岗照单验收
- 范围:只出判据/分档/证据位,不改 backend/app 任何代码(后端属主=阿仁+小齐,四域属主限制)
- 批准来源:小冈 R1 派工 WIP-352(22:4x)+义父 23:3x 令「350/352 别过夜」;本件为判据侧自领支援,不占用 352 实施位
- 验收标准:27 端点全覆盖、每条给「绑定后判据 + 证据位」、优先级分档有据、豁免项写明理由

一、现状真值(v1.1 · 已按小齐实施进度校准)

项值
admin_backend 端点数27(与派工口径吻合)
函数体内 destination_id / resolve_destination 引用5 / 27(v1 出稿时为 0,小齐 0ead2ccb 后为 5)
三域合计(73 条)含目的地引用13 / 73(17.8%)(v1 时为 7 条 9.6%)
a端落点12(a端会自动带 destination_id;已接的端点开始读它,未接的仍被忽略)

已接 5 条(小齐 0ead2ccb + f71ee6c2,与本底稿 P0 分档完全一致)

方法端点实现方式判据侧提示
GET/api/admin/merchants/{p}/service-fee-profile见小齐提交说明已可举证:跨目的地访问应 403/404 或空集
GET/api/admin/orders见小齐提交说明已可举证:跨目的地访问应 403/404 或空集
GET/api/admin/orders/{p}/interventions见小齐提交说明已可举证:跨目的地访问应 403/404 或空集
GET/api/admin/products见小齐提交说明已可举证:跨目的地访问应 403/404 或空集
GET/api/admin/products/{p}见小齐提交说明已可举证:跨目的地访问应 403/404 或空集
🔴 依赖传递风险(本岗判据侧观察,请小齐确认):GET /orders/{id}/interventions 是
借 orders 表 JOIN 校验归属(order_intervention_logs 本身无 destination_id,零新增列)。
⇒ 该端点的隔离强度完全依赖 orders 的隔离:一旦 orders 侧过滤失效或有绕过路径,
干预记录随之泄露,且无第二道防线。建议:①把这条依赖写进证据位备注 ②终验时该端点必须与 orders 一起测(单独测不足以证明)。
v1 结论作废:「admin_backend 27 条 dest 引用为 0」已不成立(现 5 条)。
仍成立的部分:未接的 22 条(含 P0 剩余 10 条)在绑定前,「切目的地后返回集应变化」的判据依旧不成立,不得判 PASS。

二、优先级分档

档条数判据说明
P015(已接 5/剩 10)数据面核心:订单 / 商品 / 商户 / 概览绑定后必须隔离;这档清完,335 终验面的 a端判据即可成立
P110(已接 0/剩 10)内容·身份·审计:cms / identities / roles / audit-logs次优先,随 P0 之后推进
豁免/待裁2login / track-event写明理由,见 §四
建议最小可验收增量:先做满 P0 一档,即可让「a端切目的地后 admin_backend 数据随之变化」成立;
P1 与豁免项可登记结转,不阻断 335 终验的 a端面。

三、逐条判据与证据位(27 条)

#方法端点档绑定后判据(同目的地 / 跨目的地 / 越权写)证据位
1GET/api/admin/rolesP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-roles/
2GET/api/admin/identitiesP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-identities/
3POST/api/admin/identities/{p}/revokeP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-identities-p-revoke/
4GET/api/admin/audit-logsP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-audit-logs/
5GET/api/admin/cms/postsP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-cms-posts/
6POST/api/admin/cms/postsP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-cms-posts/
7PUT/api/admin/cms/posts/{p}P1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/put-cms-posts-p/
8POST/api/admin/cms/posts/{p}/publishP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-cms-posts-p-publish/
9POST/api/admin/cms/posts/{p}/offlineP1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-cms-posts-p-offline/
10DELETE/api/admin/cms/posts/{p}P1同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/delete-cms-posts-p/
11GET/api/admin/merchants/{p}/service-fee-profileP0✅已接 同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-merchants-p-service-fee-profile/
12POST/api/admin/merchants/{p}/signP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-merchants-p-sign/
13PUT/api/admin/merchants/{p}/statusP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/put-merchants-p-status/
14GET/api/admin/ordersP0✅已接 同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-orders/
15POST/api/admin/orders/{p}/interveneP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-orders-p-intervene/
16GET/api/admin/orders/{p}/interventionsP0✅已接 同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-orders-p-interventions/
17POST/api/admin/track/event豁免/待裁埋点采集匿名可写(user 可空),写入 analytics_events 表无 destination_id 字段 ⇒ 结构上无法按目的地隔离 ⇒ 需裁决:加字段(可隔离)或明确为平台级全局数据(豁免并写入契约)docs/delivery/evidence/352/post-track-event/
18GET/api/admin/stats/overviewP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-stats-overview/
19POST/api/admin/login豁免/待裁登录签发,按 phone 查 users、无目的地语义 ⇒ 豁免(JWT 是否携带目的地归属属 chain-identity 范畴,另行登记)docs/delivery/evidence/352/post-login/
20GET/api/admin/productsP0✅已接 同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-products/
21POST/api/admin/productsP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-products/
22GET/api/admin/products/{p}P0✅已接 同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(本端点为读,验证只读集):拒绝时数据库零变更docs/delivery/evidence/352/get-products-p/
23PUT/api/admin/products/{p}P0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/put-products-p/
24DELETE/api/admin/products/{p}P0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/delete-products-p/
25POST/api/admin/products/{p}/componentsP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-products-p-components/
26DELETE/api/admin/products/{p}/components/{p}P0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/delete-products-p-components-p/
27POST/api/admin/orders/{p}/refund/executeP0同目的地 200 且返回集与绑定前一致(回归);跨目的地:换 destination_id 后须 403/404 或空集,不得返回他域数据;越权写(写端点):拒绝时数据库零变更docs/delivery/evidence/352/post-orders-p-refund-execute/

四、豁免 / 待裁两项 —— ✅ R1 裁决落定(2026-09-16 08:4x · 刘总授权开工件)

4.1 共享域五端点裁决(加列 vs 豁免)

端点裁决依据
/identities豁免(平台级身份域)用户身份跨实例复用=白标前提(chain-identity-v1 D9 分离层);身份映射无目的地归属语义
/roles豁免(平台级 RBAC)角色定义全局统一;a端操作员不分实例(当前 admin 全局模型)
/audit-logs豁免(平台级审计)审计日志价值=全局可查性;「谁动了 B 目的地的 X」由日志行内容承载而非行归属
/cms/posts隔离(加列)· P1 档接线内容=实例资产(白标第六波语义);cms_posts 无 destination_id=结构缺口 → 076 迁移加列+回填,端点接线随 P1 档(同 admin_content.py pois 落列先例 L26-69)
/stats/overview拆层(混合)①可接:total_orders/redemption/merchants 计数按 destination_id 过滤(orders/fulfillment_items 借 orders/merchants 有列)②平台级+响应内标注 scope:analytics 2 项(analytics_events 无 dest 列=track/event 同域)+new_users(users 平台身份域)

4.2 track/event 匿名写裁决

豁免正式落档(维持 09-15 R1 初裁):/api/admin/track/event 匿名可写+analytics_events 无 destination_id——定性平台层分析域(D9 分离标注),非业务数据面;跨目的地聚合是埋点的存在目的。V2 可选优化=加 destination_id 列启用实例级分析(登记 backlog,非本波必须)。契约动作:写入 white-label-d2-v1.md §3 豁免清单+矩阵 D9 行标注。

4.3 login

维持豁免:JWT 是否携带目的地归属属 chain-identity 范畴另行登记(原判不变)。

4.4 执行落点(转小齐 352①)

五、四条通用判据模板(每条端点都套这四条,缺一不可)

  1. 同目的地回归:绑定后,token 目的地与资源目的地一致 ⇒ 200,返回集与绑定前逐字段一致(防绑定改坏现有功能)。
  2. 跨目的地读:token 属 A、请求 destination_id=B(或资源属 B)⇒ 403/404 或空集;任何 B 域字段出现在响应里即 FAIL。
  3. 越权写:POST/PUT/DELETE 目标资源属 B ⇒ 403/404,且数据库零变更(硬断言:拒绝时不得有任何写副作用)。
  4. 证据位命名:docs/delivery/evidence/352/<method>-<endpoint-slug>/,每目录存:命令、回显、时间戳、hostname、exit code。证据缺任一项判 BLOCKED 不判 PASS(沿用 335 剧本证据协议)。

六、与 335 终验 / 二号 349 的关系


本岗边界:只出判据与验收底稿,未改 backend/app 任何文件;实施位仍属小齐(WIP-352①)。