feat: Z36 host_meta-only publish + Z37 SyncPage LWW UX

Allow display-name-only publish via host_meta; stop treating company conflicts 403 as a fault and ship rebuilt web dist.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
whm
2026-08-07 12:01:18 +08:00
parent 4b6c90904b
commit 4f9087bd38
9 changed files with 597 additions and 387 deletions

View File

@@ -1,6 +1,6 @@
# 联调后修改意见 · 宇恒松离线(形态 B
> 初稿2026-08-01 · 修订至 **2026-08-07**Z34b 智建已落实restore-by-host
> 初稿2026-08-01 · 修订至 **2026-08-07**+Z37 SyncPage LWW 403 体验
> 焦点:**§0.2**(按负责方);**改代码前须先写入本意见**(见 §0.0
> 来源:宇恒 `yuhengyihao_client` ↔ 智建(生产 `aisite.yuxindazhineng.com`
> 依据:`松离线-dbsync方案-最终版.md`、`宇恒-松离线数据同步使用文档.md`
@@ -31,6 +31,8 @@
| **Z24 已绑定勿 force 清落点** | **宇恒已改完;智建无需** | 启动自动引导绑定时禁止 `force_rebind` 清 CHANNEL仅用户点「换绑」才清§5.22 |
| **Z34 / Z34b 换机恢复** | **宇恒半程 + 智建已落实** | 有手机静默恢复Z34无手机 `POST …/restore-by-host`Z34b · §5.32 |
| **Z35 库名非法中文** | **智建已落实(须生产 pull** | 绑定/AttachSyncBind/heal 纠正publish 拒非法名§5.33**宇恒勿改** |
| **Z36 编辑发布无增量** | **智建已落实(须生产 pull** | 无增量 + `host_meta.module_name``host_meta_updated`;否则中文 `[NO_BLUEPRINT_DELTA]`§5.34 |
| **Z37 SyncPage LWW 403 吓人** | **智建已落实(须生产 pull** | SyncPage 无冲突队列;中性提示 + 空通道说明conflicts 403 静默§5.35 |
| **仍关注** | 用法 | 通道断了靠智建自愈;表数据靠宇恒双向指纹 / 数据恢复;不是「再点启动」 |
### 0.0 修改流程(冻结)
@@ -75,6 +77,7 @@
| **Z32** | **绑定表单按方式显隐字段2026-08-06 · 宇恒已改完)**`visible_when` + sendFrom 过滤;绑码/手机号/稍后切换下方表单项。**智建无需改** |
| **Z33** | **仅数据同步时勿因缺 app.read 进换绑2026-08-06 · 宇恒已改完)**GET /apps 403 且已 sync_bound → apps=[] 继续模块菜单并提示开通读取模块。**智建无需改**(控制台给智能体开「读取模块」即可列模块) |
| **Z34** | **换机按账号恢复2026-08-06 · 宇恒半程已改完)**:有手机号时可静默 ticket/confirm。**完整「仅宇恒 ID」见智建 Z34b已落实** |
| **Z36** | **编辑发布无增量中文取消2026-08-07 · 宇恒已改完;智建 Z36 已落实)**:宇恒侧预处理;智建 `host_meta_updated` / `[NO_BLUEPRINT_DELTA]`§5.34 |
#### A. 宇恒 · 配合注意(非阻塞新开发)
@@ -98,6 +101,8 @@
| **数据恢复§5.13** | 成功同步后线上库快照latest+previousSyncPage「数据恢复」`GET …/checkpoint` + `POST …/restore` |
| **Z34b** | `POST /api/v1/auth/yuheng/restore-by-host`HMAC 凭票phone 可空)按 `host_key` 恢复已 sync_bound 落点并轮换密钥;见 §5.32 |
| **Z35** | 绑定 `database_name=user_{id}`publish 拒绝中文库名并纠正脏数据;见 §5.33 |
| **Z36** | merge 无增量:有 `host_meta.module_name``publish_mode=host_meta_updated`;否则中文 `[NO_BLUEPRINT_DELTA]`;见 §5.34 |
| **Z37** | SyncPage 无冲突队列;中性 LWW 说明 +「该公司暂无通道」空态;`listSyncConflicts` 403 静默;见 §5.35 |
> 产品一句:**账号已绑定 ⇒ 落点信息固定;通道没了平台自动补,终端无需手填 channel_id。**
@@ -105,7 +110,7 @@
| 优先级 | 编号 | 项 | 说明 |
|--------|------|----|------|
| — | — | Z35 已合入见 B | 其余无阻塞开发项;生产 pull 见 B |
| — | — | Z36/Z37 已合入见 B | 当前无待开发项;运维见 B |
#### B‴. 智建 · 本次明确不改Z15
@@ -121,7 +126,7 @@
| 优先级 | 项 | 说明 |
|--------|----|------|
| **P0** | **生产 pull 本批** | Z10d + fingerprint + Z14c + **Z12h** + **数据恢复** + **Z34b** + **Z35**`bash ./restart.sh --pull` |
| **P0** | **生产 pull 本批** | Z10d + fingerprint + Z14c + **Z12h** + **数据恢复** + **Z34b** + **Z35** + **Z36** + **Z37**`bash ./restart.sh --pull` |
| **P0** | 成员手机 | 「宇信达」绑 **`13531041944`**;勿超管号 |
| **P0** | 通道表白名单 | **勿**「填入测试默认」;形态 B 可空 |
| **P1** | 凭票 Secret | `YuhengTicket.Secret``YXD_YUHENG_TICKET_SECRET` |
@@ -1123,6 +1128,76 @@ POST /api/v1/agent/sync/channels/{id}/pull
2. 智能体 `database_name` 为合法 `a-z0-9_`;控制台展示名仍可为中文。
3. 宇恒侧无需发版即可复测通过。
### 5.34 【Z36 · 2026-08-07】编辑发布 `nothing new to publish`
**状态****宇恒已改提示/预处理;智建已落实(须生产 pull**。
#### 现象
编辑已有模块后发布:
`HTTP 400: nothing new to publish: provide newly generated pages ...`
请求多为 `mode=add_pages``host_meta.module_name` 可能已改(如「记录列表/概览」)。
#### 根因
`add_pages` 走蓝图 merge生成草稿的 page id/route 与线上完全一致、且无新字段/资源时merge 增量为空 → 400。仅改显示名host_meta也会踩中。
#### 宇恒改
1. 发布前 `prepare_add_pages_draft`:去掉完全重复页,冲突 id/route 改写。
2. `draft_has_add_pages_delta` 判定无新页/新字段则中文取消发布,不再抛裸英文 400。
3. 若仍收到该错误,中文说明(并指向本意见 Z36
#### 智建Z36 · 已改)
`add_pages`/`auto` 在 merge 无增量时:若 `host_meta.module_name` 非空 → 只更新显示名并重签胶囊,返回 `publish_mode=host_meta_updated`;否则 400 中文 message 含 `[NO_BLUEPRINT_DELTA]`。有蓝图增量时亦把 `module_name` 写入蓝图 Meta.Name。
#### 验收
1. 编辑需求明确「新增某页」且生成含新页 → add_pages 成功。
2. 生成仅复述旧页 / 仅改显示名 → 宇恒中文取消,不出现裸 `nothing new to publish`
3.(智建)仅改模块显示名再发布(带 `host_meta.module_name`)→ 2xx + `host_meta_updated`;无 module_name → 中文 `[NO_BLUEPRINT_DELTA]`
### 5.35 【Z37 · 2026-08-07】超管进公司「数据同步」红条 LWW 403 + 空表
**状态****智建已落实(须生产 pull 前端 dist宇恒勿改**。
#### 现象(生产控制台截图)
1. 平台超管在「租户/公司」点「管理该公司」(如「帅帅」)→ 绿条:`已打开「帅帅」管理视图(身份仍是平台部/超管)`**预期**:身份仍是超管,只是切到该公司租户上下文)。
2. 打开「数据同步」:顶部**红气泡** + 页内**红 Alert** 同文案:`冲突/LWW 覆盖日志仅平台超级管理员可查`(重复、吓人,像故障)。
3. 「数据同步」通道表、`冲突队列(未解决)` 均为「暂无数据」。
#### 根因(产品设计 + 前端体验)
| 点 | 说明 |
|----|------|
| **权限设计(正确)** | 公司侧 `GET /api/v1/admin/sync/conflicts*` **固定 403**,文案即上句(`syncConflictsHandler`。LWW 覆盖审计只在平台超管页:`GET /api/v1/platform/dbsync/lww-overrides``PlatformTenantsPage`「LWW 覆盖日志」)。方案/开通说明已写「公司侧无冲突台」。 |
| **为何会弹 403** | 生产前端仍在公司 SyncPage 拉冲突队列(截图有「冲突队列」区块)。本仓当前 `SyncPage.tsx` **已去掉**冲突列表与 `listSyncConflicts` 调用,仅文案提示「覆盖审计仅超管可查」——**生产 web 未 pull/未发到与本仓一致**,或残留调用把 403 当成 `setError` + `message.error` 双报。 |
| **空通道表** | 列表按**当前公司租户**过滤。进「帅帅」只看帅帅的通道;该公司从未绑智能体/无通道 →「暂无数据」正常。联调账号若在别的公司(如婷婷),须进**对应公司**管理视图,或回平台租户列表再进目标公司。 |
| **绿条** | 管理视图提示与红条无关可保留。文案「平台部」vs 源码「平台超管」亦说明生产前端偏旧。 |
> 结论:**不是宇恒同步坏了,也不是超管没权限查 LWW**;是公司 SyncPage 仍把「公司侧禁用冲突 API」当错误展示且可能看错公司导致通道为空。LWW 应去平台侧审计区查。
#### 智建改(须 · 已落实)
1. **生产 pull/发版前端**SyncPage 与本仓一致——**无**「冲突队列」区块、**不**再调 `listSyncConflicts`(或 403 静默空列表)。
2. 公司 SyncPage 顶栏中性说明(非 error「冲突已自动 LWW覆盖日志请到平台超管 · LWW 覆盖日志」。
3. 空通道:空态「该公司暂无同步通道…」,勿与 LWW 403 混为一谈。
4. 管理视图绿条文案统一为「身份仍是平台超管」。
#### 宇恒
**无需改代码、无需改契约。**
#### 验收
1. 超管 → 管理某公司 → 数据同步:**无**红条/红气泡「冲突/LWW…仅超管可查」无冲突队列表。
2. 该公司确有通道时列表可见;无通道时空态说明清楚,不报权限错误。
3. 平台租户页「LWW 覆盖日志」仍可查审计;公司侧 conflicts 接口保持 403契约不变
## 6. 联系与附件
- **待改清单(优先看)**§0.2**A 宇恒接入 restore-by-host · B 运维 pull****改代码前先写本意见**§0.0);配合见 **§0.3**