Skip to content

[REQ-162] 平台 token 全程有效:15 分钟 TTL 下运行中的平台调用不因过期 401 #529

Closed
2 of 2 issues completed

Description

@jinjunnn

结果

app 运行任意时长,平台模型调用使用的 token 始终有效;续期由真实 expiresAt 驱动,一切成功续期(含 account 401 重试路径)汇入同一换血入口。

背景(正确性缺陷,非 UX)

注释/测试/整点 tick 调度按 ~7 天 token 假设设计,真实 TTL = 15 分钟 ⇒ 运行中的 sidecar 可携带过期静态 token 数十分钟;account summary 401 触发的续期只更新 main 内存,不换 sidecar 的 {file:} 密钥。Codex 对抗轮定性:正确性问题(2026-07-23)。

AC

  • AC1 续期调度由 expiresAt/refreshDueAt 驱动(成功刷新/系统唤醒/登录变化后重排),小时轮询废除。证明:调度单测。
  • AC2 任何路径的成功续期后,sidecar 在换血窗口内不再使用旧 token;UI 已恢复态下的首次平台推理不得 401。证明:T7 跨两个 TTL 周期长会话用例。
  • AC3 续期失败分类(refreshed/still-valid/transient/invalid-grant):transient 降级保持、禁循环 respawn;invalid-grant 走登出语义。证明:状态机单测。
  • AC4 换血遇活动流式生成的行为有明确安全边界并被验证。证明:T7 专项用例。
  • AC5 token 不进 sidecar env/renderer/IPC/日志(A6 不变量回归)。证明:既有断言套件扩展。

复杂度

M(单一换血入口 + 调度重写;与 REQ-109 的 A′ 共享续期结果建模)

方案基线(共享)

https://github.com/jinjunnn/alpha-code/blob/99df5b32d/docs/design/2026-07-23-startup-availability-baseline.md(§① 第 6 条、§② TTL 调度修正、§④ T5)

Out of scope

  • 15 分钟 TTL 契约本身的变更(平台侧);D 中继架构(另立)。

Activity

  1. changed the title [-][REQ-110] 平台 token 全程有效:15 分钟 TTL 下运行中的平台调用不因过期 401[/-] [+][REQ-162] 平台 token 全程有效:15 分钟 TTL 下运行中的平台调用不因过期 401[/+] on Sep 17, 2026
  2. jinjunnn commented on Sep 17, 2026

    @jinjunnn
    OwnerAuthor

    编号更正(2026-09-16):本需求由 REQ-110 改为 REQ-162。

    原因:REQ-110 在 2026-07-18 已由 jinjunnn/alpha-work#12(支付结果按订单归属生效)先行登记;本需求 2026-07-24 在 alpha-code 本地复用了同一个号。

    已同步:本需求及其名下 alpha-code 子票标题前缀一律改为 [REQ-162]。未改:仓内历史文档(如 docs/verification/2026-07-24-req109-110-pr3-longrun.md)与已合并 PR 中的 "REQ-110" —— 在「平台 token 续期」语境下出现的 REQ-110 即指本需求。

  3. jinjunnn commented on Sep 17, 2026

    @jinjunnn
    OwnerAuthor

    owner 2026-09-17 裁决:按证据验收,关闭。

    这个需求交付的是:桌面端的平台凭证(15 分钟过期)无论应用运行多久,都按真实过期时间自动续上,续上后引擎立刻换用新凭证,平台模型调用不会因凭证过期而失败;续期失败按原因降级或登出;凭证不出现在环境变量、界面、进程间消息或日志里。五条验收均按原文判定,未改写。alpha-code#799(换凭证后发消息偶尔被拦「模型没加载」,8 月 2 日见过一次、未复现)的现象是发送前被拦、不是 401,与 AC2 的判据不同,作为独立 bug 保留开着。

    AC 结论 证据
    AC1 PASS packages/ui-mac/src/main/alpha-auth-clock.ts:1-35(提前 1/3 寿命、封顶 5 分钟,按 expiresAt 排程)与 alpha-auth-clock.test.ts(#534 / PR #556);docs/verification/2026-08-06-req109-110-t7-runtime/README.md:60「accelerated two-TTL session」两次续期、两次换血、reload=0
    AC2 PASS 同 README:61「rotation during active stream」首个恢复请求 200、使用新凭证、无旧 token;README:374-384 #858 签名包 alpha@5f8d6096d 打包实测 mounts=1、reloads=0,首恢复请求 200 且只带 renewed 凭证
    AC3 PASS README:54-57:refresh timeout 10 s / HTTP 502 判 transient 且零换血,HTTP 400 / 401 判 invalid-grant 并登出;packages/ui-mac/src/main/auth-renewal.test.ts:708 分类用例
    AC4 PASS README:61 活动流中换血如实中断、草稿保留、reload=0;#858 打包 README:382 interruption seen、draft preserved、mount=1
    AC5 PASS README:69-82「What passed」:合成凭证在进程环境、renderer DOM/storage、renderer 可见的 auth IPC 状态与时间线日志中均为阴性,凭证文件权限 0600

    坐标于 2026-09-17 在 alpha-code origin/alpha @ 8eb092b73 上核对仍然成立。子票 alpha-code#858、#859 已关。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type:bugSomething is incorrect or regressed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions