docs: 写入 Z28 同步绑定≠换票,智建需回传密钥/复用 active

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
whm
2026-08-06 20:46:04 +08:00
parent 51c1238a62
commit d9d126fbbb

View File

@@ -1,6 +1,6 @@
# 联调后修改意见 · 宇恒松离线(形态 B # 联调后修改意见 · 宇恒松离线(形态 B
> 初稿2026-08-01 · 修订至 **2026-08-06 20:20**Z27 他机自动生成 host_key > 初稿2026-08-01 · 修订至 **2026-08-06 20:45**Z28 同步绑定≠换票;登记勿另起 pending
> 焦点:**§0.2**(按负责方);**改代码前须先写入本意见**(见 §0.0 > 焦点:**§0.2**(按负责方);**改代码前须先写入本意见**(见 §0.0
> 来源:宇恒 `yuhengyihao_client` ↔ 智建(生产 `aisite.yuxindazhineng.com` > 来源:宇恒 `yuhengyihao_client` ↔ 智建(生产 `aisite.yuxindazhineng.com`
> 依据:`松离线-dbsync方案-最终版.md`、`宇恒-松离线数据同步使用文档.md` > 依据:`松离线-dbsync方案-最终版.md`、`宇恒-松离线数据同步使用文档.md`
@@ -29,9 +29,10 @@
| **Z22 绑定表单失败可重试** | **宇恒已改完;智建无需** | prepare 只做非交互检测;`ask_fields`/`Expecting value` 不冒泡成「绑定引导失败」必弹绑定表单§5.20 | | **Z22 绑定表单失败可重试** | **宇恒已改完;智建无需** | prepare 只做非交互检测;`ask_fields`/`Expecting value` 不冒泡成「绑定引导失败」必弹绑定表单§5.20 |
| **Z23 表单推送失败禁止空等** | **宇恒已改完;智建无需** | `ask_fields_via_chat` 推送失败立即抛错;进行中再选中会话给出提示;对齐 ty_host≥1.2.35§5.21 | | **Z23 表单推送失败禁止空等** | **宇恒已改完;智建无需** | `ask_fields_via_chat` 推送失败立即抛错;进行中再选中会话给出提示;对齐 ty_host≥1.2.35§5.21 |
| **Z24 已绑定勿 force 清落点** | **宇恒已改完;智建无需** | 启动自动引导绑定时禁止 `force_rebind` 清 CHANNEL仅用户点「换绑」才清§5.22 | | **Z24 已绑定勿 force 清落点** | **宇恒已改完;智建无需** | 启动自动引导绑定时禁止 `force_rebind` 清 CHANNEL仅用户点「换绑」才清§5.22 |
| **Z25 自动引导勿 force + host_key** | **宇恒已改完;智建无需** | prepare 失败只弹表单不清落点host_key 回落 env/config,禁止空串打智建§5.23 | | **Z25 自动引导勿 force + host_key** | **宇恒已改完;智建无需** | prepare 失败只弹表单不清落点host_key 回落 env/config§5.23 |
| **Z26 已有 CHANNEL 禁再弹绑表** | **宇恒已改完;智建无需** | 本机已有同步通道时自动引导不再弹绑定公司同步」;仅换绑才清§5.24 | | **Z26 已有 CHANNEL 禁再弹绑表** | **宇恒已改完;智建无需** | 本机已有同步通道时自动引导不再弹绑定§5.24 |
| **Z27 他机自动生成 host_key** | **宇恒已改完;智建无需** | 无 YXD_HOST_KEY/config.host_key 时自动生成并固化,禁止空串绑定失败§5.25 | | **Z27 他机自动生成 host_key** | **宇恒已改完;智建无需** | 无 host_key 时自动生成并固化§5.25 |
| **Z28 同步绑定≠换票 / 禁另起 pending** | **宇恒已改·智建待改** | 已绑 CHANNEL 勿用 user_id 清凭证再 SelfRegister智建绑定回传 client 密钥§5.26 |
| **仍关注** | 用法 | 通道断了靠智建自愈;表数据靠宇恒双向指纹 / 数据恢复;不是「再点启动」 | | **仍关注** | 用法 | 通道断了靠智建自愈;表数据靠宇恒双向指纹 / 数据恢复;不是「再点启动」 |
### 0.0 修改流程(冻结) ### 0.0 修改流程(冻结)
@@ -943,26 +944,41 @@ POST /api/v1/agent/sync/channels/{id}/pull
3. 已 sync_bound 时 bootstrap_auth 失败不要清绑定;保留 runtime 或走门闸。 3. 已 sync_bound 时 bootstrap_auth 失败不要清绑定;保留 runtime 或走门闸。
### 5.23 【Z25 · 2026-08-06】自动引导禁止 force 清绑host_key 必须回落 ### 5.26 【Z28 · 2026-08-06】同步绑定成功后仍报 pending两套身份错位
**状态****宇恒已改**。 **状态****宇恒已改(禁 user_id 覆盖);智建待改(绑定回传密钥 / register 复用 active**。
1. `runtime is None` 自动绑定时 `force_rebind=False`(仅「换绑」/门闸显式换绑才 clear。此前 `force_rebind=not already_bound` 在未绑时仍会 clear出现「已清空」+ 空表。 #### 现象(他机日志)
2. `_host_key` / `_host_key_default` 回落 `YXD_HOST_KEY` 与技能 `config.json`;空 host_key 本地拦截,避免智建 `host_key required`
- `skip bind form: local CHANNEL present (b9345197…)`**公司同步落点已是坤坤,不是「又要绑测试账号」**
- 紧接着 `POST /auth/token``401 agent pending approval`**换票用的是另一条智能体账号**SelfRegister 新建/复用的 pending与 CHANNEL 上那条 active 不是同一套凭证。
### 5.24 【Z26 · 2026-08-06】已有 CHANNEL 禁止再弹绑定表 #### 根因
**状态****宇恒已改完**。 1. **智建同步绑定路径**(手机号/绑定码/凭票 → `bindUserHostSync``AttachSyncBind(..., activate=true)`)会把该 `host_key` 智能体设为 **active** 并挂通道。
2. **宇恒 `prepare_runtime`** 在 config.`host_key` ≠ 当前宇恒 `user_id` 时:**清空 `client_id/client_secret`,并把 `host_key` 改成 user_id**,再 `bootstrap_auth``POST /auth/agent/register`
3. **`/auth/agent/register`SelfRegister设计为默认 pending**(须管理员启用)。于是出现:同步落点已是坤坤 active换票却打到 **user_id 名下新建的 pending**
4. 绑定成功响应**不回传** `client_id/client_secret`,宇恒无法直接用「同步绑定那条」换票,只能再走 SelfRegister。
本机 `YXD_SYNC_CHANNEL_ID` 已存在时:`ensure_sync_bound_interactive` 直接 skip`prepare` 失败分支也不再打开绑定表单,只走门闸「重新检查/换绑」。避免他机已绑仍反复弹出「绑定公司同步」 「测试账号」误解config 里 `active_env=prod` 仍可能因上述逻辑登记出**另一条**智能体与「绑到测试租户」不是一回事。CHANNEL=`b9345197…` 已证明同步落点是坤坤
#### 宇恒改(本仓)
### 5.25 【Z27 · 2026-08-06】他机自动生成并固化 host_key 1. **已有 `YXD_SYNC_CHANNEL_ID`(同步已绑)时**:禁止因 user_id≠config.host_key 清空 client 凭证;换票/`register` 使用稳定 `_config_host_key` / `YXD_HOST_KEY`**不要**把会话 `host_key` 改成 user_id 用于登记。
2. 用户可见文案区分「同步已绑定」vs「生成发布换票待启用」避免再说成「绑定失败」。
3. (可选后续)绑定成功若智建回传密钥,写入 config 并直接换票。
**状态****宇恒已改完**。 #### 智建改(需配合)
他机首次无联调 `YXD_HOST_KEY`、技能 config `host_key` 为空时:`_host_key_default` 自动 `token_hex(12)` 写入 env 文件与 config绑定不再报缺 host_key。用户可见文案避免 Markdown 吃掉下划线。 1. **P0**`phone-confirm` / `bind-code/redeem` / `ticket-exchange` 成功响应增加 `client_id` + `client_secret`(新建或本轮轮换时必带;已有未轮换可省略 secret 但须带 client_id并文档说明宇恒如何续用
2. **P0**`POST /auth/agent/register`:若同 `host_key` 已存在 **active 且已 sync_bound****禁止**再开一条 pending应复用该账号可轮换 secret 并返回),或 409 提示「请使用同步绑定凭证」。
3. **P1**:配置开关(如 `Agent.RegisterAutoActivate`):合法 `register_secret` 自注册时直接 `active` + 默认「生成发布」角色权限(松离线开通场景减少人工点启用)。当前「登记默认 pending」对**未绑定自注册**仍可保留。
4. **P1**:控制台列表区分「同步已绑 active」与「仅登记 pending」避免管理员启用错条host/client_id 不一致)。
#### 验收
- 他机仅完成手机号/绑定码同步后:有 CHANNEL换票不再 401 pending或明确门闸「待启用」且 client_id 与控制台同一条)。
- 管理员启用后「重新检查」一次即可生成发布;无需再走绑定表单。
## 6. 联系与附件 ## 6. 联系与附件