Skip to content

Commit 16a7cd5

Browse files
committed
docs: record routing strategy bypass plan
1 parent 32c689f commit 16a7cd5

5 files changed

Lines changed: 76 additions & 2 deletions

File tree

docs-linhay/memory/2026-05-26.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# 2026-05-26
22

3+
## Codex 请求模式重新布局
4+
- 结论:`#frame=codex&workspace=account-list` 的请求模式区改成了两段式 header,上行只放标题、说明和当前模式,下行把 `顺序 / 均衡` 两个切换按钮铺满整行,空白感明显少了。
5+
- 体验:这比把模式按钮挤在右上角更稳,也更适合当前只有两个模式的场景。
6+
37
## CLIProxyAPI 刷新成功未清理异常态
48
- 结论:`sdk/cliproxy/auth/conductor.go``refreshAuth` 的成功分支只清了 `LastError / NextRefreshAfter / UpdatedAt`,没有把失败后留下的 `StatusError / Unavailable / StatusMessage` 显式回收;因此一次 refresh 失败后,即使后续 refresh 成功,auth 仍可能一直显示“异常”,直到 app 重启把内存态重建。
59
- 证据:失败分支会把 auth 标成 `unauthorized` 并写入运行态;对象存储 / 文件持久化只保存 metadata,不会把这类运行态带到磁盘,所以重启后状态恢复正常。
@@ -12,6 +16,11 @@
1216
- 验证:`node --test frontend/src/features/channel-routing/tests/channelRouting.test.mjs frontend/src/features/codex/codexAccountList.test.mjs` 通过。
1317
- 风险:当前 in-app browser 里按钮点击没有稳定触发可见状态变化,视觉上只能确认新布局已热更新;同时 `npm --prefix frontend run typecheck` 仍被仓库里既有的 `UnifiedComposeModal.tsx` `formatLabel` 缺失报错阻断。
1418

19+
## routing.strategy 完整绕过计划启动
20+
- 决策:Codex / Claude 的 channel routing 进入“完整绕过 `routing.strategy`”收口,后续以 `channel-routing` 快照作为唯一决策源;旧 `config.yaml` 只保留 legacy relay 边界,不再参与渠道路由主路径。
21+
- 计划:已新增 space 计划 [routing.strategy 完整绕过实施计划 v01](../spaces/20260524-account-routing-engine/plans/routing-strategy-bypass-v01.md),首批动作是补红灯测试,锁住 `config.yaml``channel-routing` 的分裂现象,再拆读写链路。
22+
- 风险:如果侧边车仍有遗留路径读取 `routing.strategy`,请求结果会继续出现“配置已改、实际路由没改”的错觉;这次必须同时断读取和写回。
23+
1524
## Codex 路由不切换的诊断
1625
- 结论:当前“看起来有另外两个可用号,但请求仍死盯第一个号”的现象,主要不是账号卡展示问题,而是运行时路由没有把 quota 预览状态纳入候选阻断;本机 sidecar 的 `~/.config/gettokens/config.yaml` 仍是 `routing.strategy: fill-first`,而 `~/.config/gettokens-data/channel-routing/config.json` 里的 `routeMode: balanced` 是独立工作台状态,二者没有自动同步。
1726
- 证据:`channel-routing` runtimeStates 为空,说明没有额外的运行态阻断把那三个账号拦住;`fill-first` 会优先反复选第一个仍然 requestable 的账号,所以 5H 视图里显示 0% 也不会自动把它踢出候选池。
@@ -21,8 +30,9 @@
2130
- 决策:`#frame=accounts` 的独立 `+ ADD ACCOUNT` 按钮不再单独占据 header 动作区,改为收进右侧 actions menu 的第一项;同一个菜单继续承载 `ChatGPT 登录``导入 Auth File``粘贴账号内容``添加 Codex API Key``轮动设置`,避免 header 再出现一层独立入口。
2231
- 实现:`AccountsHeader` 新增扁平菜单模型与图标映射,菜单项使用纯行式 hover / active 状态,不再套用 card shell;`+ ADD ACCOUNT` 保持原文案但只在菜单中出现。
2332
- 验证:本地预览确认 header 外只剩刷新与菜单按钮,菜单展开后首项为 `+ ADD ACCOUNT`,并且菜单项没有 border/shadow 卡片壳。新增单测 `frontend/src/features/accounts/tests/accountHeaderMenu.test.mjs` 已通过。
33+
- 补充:用户反馈菜单项字号过小后,将 actions menu 行字号提升到 `--font-size-ui-md`,图标同步提升到 20px;Playwright 复核 5 个菜单项实际字号为 12px、行高 44px,且无横向溢出。
2434
- 归档:验收截图已保存到 `docs-linhay/spaces/20260526-account-provider-picker-icons/screenshots/20260526/accounts/20260526-accounts-header-actions-menu-after-v01.png`
25-
- 风险:`npm run typecheck` 当前仍被仓库里既有的 `ChannelRoutingWorkbench` `onSave` 契约问题阻断,和这次账号页头收口无关,后续需要单独修
35+
- 归档:字号修正截图已保存到 `docs-linhay/spaces/20260526-account-provider-picker-icons/screenshots/20260526/accounts/20260526-accounts-header-menu-font-after-v01.png`
2636

2737
## v1.0.28 发版验收
2838
- 结论:`v1.0.27` tag 已推到远端但未触发 Release workflow;按发布治理“不复用已创建 tag”的规则,版本继续 bump 到 `1.0.28` 并发布 `v1.0.28`

docs-linhay/references/CLIProxyAPI

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit 02277fdc6f74a4457d21d4b11d90d482fc07ca87
1+
Subproject commit 5db7768ae54962f185f9fe4080b4b137a8b4a098

docs-linhay/spaces/20260524-account-routing-engine/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ sidecar 现有账号轮动能力已经包含 `round-robin`、`fill-first`、prio
122122
- [Sidecar Route Policy](../../dev/20260513-sidecar-route-policy.md)
123123
- [Account Routing Engine 技术边界](../../dev/20260524-account-routing-engine.md)
124124
- [实施计划 v01](./plans/implementation-plan-v01.md)
125+
- [routing.strategy 完整绕过实施计划 v01](./plans/routing-strategy-bypass-v01.md)
125126
- [实施准备清单 v01](./plans/implementation-readiness-v01.md)
126127
- [实施记录 v01](./plans/implementation-log-v01.md)
127128
- [前端重做范围 v01](./plans/frontend-rewrite-scope-v01.md)
@@ -133,6 +134,7 @@ sidecar 现有账号轮动能力已经包含 `round-robin`、`fill-first`、prio
133134
## 当前状态
134135
- 状态:implementation-ready
135136
- 最近更新:2026-05-26
137+
- 2026-05-26 补充:Codex / Claude 的 channel routing 进入“完整绕过 `routing.strategy`”收口,后续以 `channel-routing` 快照作为唯一决策源;旧 `config.yaml` 只保留 legacy relay 边界,不再参与渠道路由主路径。
136138
- 2026-05-26 补充:Codex 账号列表的旧 `session-affinity` / `websocket-pin` / `route-order-header` 现在只作为 `兼容层提示` 的总数与说明呈现,不写入新的 `ChannelRoutingConfig`,也不展开三条明细,以便后续继续和上游代码保持最小合并面。
137139
- 2026-05-26 补充:Codex / Claude 路由工作台主界面进一步降噪,只保留当前请求模式和参与账号列表;诊断、预演、Shadow、候选/过滤和最近路由默认隐藏。验收截图:`screenshots/20260526/codex/20260526-channel-routing-workbench-desktop-after-v05.png``screenshots/20260526/codex/20260526-channel-routing-workbench-mobile-collapsed-after-v05.png`
138140

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# routing.strategy 完整绕过实施计划 v01
2+
3+
日期:2026-05-26
4+
5+
## 背景
6+
7+
当前 `Channel Routing` 的配置已经独立落在 `~/.config/gettokens-data/channel-routing/config.json`,但 sidecar 仍存在一条旧的 `routing.strategy` 兼容链路。实际表现是:
8+
9+
- channel-routing 显示 `balanced`
10+
- `~/.config/gettokens/config.yaml` 仍保留 `routing.strategy: fill-first`
11+
- 请求侧看起来仍可能被旧策略影响
12+
13+
这说明现在不是“展示问题”,而是路由状态分裂。这个 plan 只处理一件事:把 Codex / Claude 的路由决策完整收口到 `channel-routing`,不再让 `routing.strategy` 参与主路径。
14+
15+
## 目标
16+
17+
1. Codex / Claude 的路由保存只写 `channel-routing`
18+
2. 请求侧选择只读 `channel-routing` 快照,不再依赖 `routing.strategy`
19+
3. `routing.strategy` 仅保留给旧 relay / 兼容边界,不参与 Channel Routing 的决策。
20+
4. 补齐回归测试,锁住“写回不串层、读取不串层、展示不误导”。
21+
5. 更新 space、dev 和记忆,确保后续维护者知道这条边界已经被刻意切开。
22+
23+
## 修改顺序
24+
25+
### Phase 0:红灯测试
26+
27+
- 增加测试,证明 Codex / Claude 保存 `channel-routing` 时不会同步改写 `config.yaml``routing.strategy`
28+
- 增加测试,证明当 `config.yaml` 仍是 `fill-first`、但 `channel-routing``balanced` 时,解释与选路结果以 `channel-routing` 为准。
29+
- 增加测试,证明 legacy relay 配置与 channel routing 彼此隔离。
30+
31+
### Phase 1:断开写回
32+
33+
- 找出所有把 Channel Routing 结果写回 `config.yaml` 的路径。
34+
- 取消 `routing.strategy` 的联动写回。
35+
- 如果还需要保留旧 relay 配置入口,就把它限制在旧页面和旧语义里,不再和 Codex / Claude 路由共享状态。
36+
37+
### Phase 2:断开读取
38+
39+
- 把请求侧的主路由决策入口切到 `channel-routing`
40+
- 对 Codex / Claude 路由来说,`routing.strategy` 只作为遗留字段存在,不再参与候选选择、排序和 fallback。
41+
- 如果仍要展示兼容信息,只做只读提示,不做决策输入。
42+
43+
### Phase 3:回归验收
44+
45+
- Codex / Claude 各自保存、各自解释、各自生效,互不污染。
46+
- 代码里不再出现“channel-routing 改了但请求仍吃 config.yaml”的分裂结果。
47+
- 文档与记忆同步更新,qmd 索引完成重建。
48+
49+
## 验收标准
50+
51+
1. Given 用户修改 Codex / Claude 的 channel routing,When 保存成功,Then 只影响对应渠道配置,不再改写 `routing.strategy`
52+
2. Given `config.yaml` 仍保留旧值,When 请求进入 channel routing,Then 选路结果仍以 `channel-routing` 为准。
53+
3. Given legacy relay 边界仍存在,When 用户只调整 channel routing,Then relay 侧状态不被连带污染。
54+
4. Given 用户查看路由说明,When 页面展示策略来源,Then 说明的是 `channel-routing`,不是旧的 `routing.strategy` 主路径。
55+
56+
## 首批执行项
57+
58+
1. 先补测试,锁住当前分裂现象。
59+
2. 再拆读写链路,断开 `routing.strategy` 对 channel routing 的影响。
60+
3. 最后补文档、记忆和 qmd 索引。
61+

docs-linhay/spaces/20260526-account-provider-picker-icons/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@
4343
- 最近更新:2026-05-26
4444
- 备注:`+ ADD ACCOUNT` 已从 header 独立按钮收口到 actions menu 的第一项,后续图标与布局优化继续围绕同一入口推进。
4545
- 验收截图:`docs-linhay/spaces/20260526-account-provider-picker-icons/screenshots/20260526/accounts/20260526-accounts-header-actions-menu-after-v01.png`
46+
- 字号修正截图:`docs-linhay/spaces/20260526-account-provider-picker-icons/screenshots/20260526/accounts/20260526-accounts-header-menu-font-after-v01.png`

0 commit comments

Comments
 (0)