roadmap: Codex / Claude Code / OpenCode / Hermes 本地生成与 Agent Backend
[!IMPORTANT] 当前正在推进:Gate 0B「安全隔离与老用户升级兼容验收」,尚未通过。
下一步:继续解决 Gate 0B 当前运行时隔离及交付阻塞,完成验收后进入原 Phase 6b。
原 Phase 编号保持不变,现有 Gate 0B 和 Phase 6B 计划继续有效。新增 ChatGPT OAuth 在 Phase 6d;不会替换 Gate 0B,也不会把原 Phase 6b 政名或移走。
当前进度与接下来做什么
| 状态 | 阶段 | 已完成内容 / 剩余目标 | 证据或前置条件 |
|---|---|---|---|
| ✅ 已完成 | Phase 1 | 生成后端抽象,默认 LiteLLM 不变 | #1751 |
| ✅ 已完成 | Phase 2 | 已登录 Codex 的普通报告生成 | #1769 |
| ✅ 已完成 | Phase 3 | Hermes 本地 HTTP 生成 | #1824;#1787 未合并 |
| ✅ 已完成 | Phase 4 | Claude Code / OpenCode 生成 | #1850、#1857 |
| ✅ 已完成 | Phase 5 | 生成设置、诊断与 smoke | #1883;不含内置登录 |
| ✅ 已完成 | Phase 6a | DSA 统一工具接口 | #1943 |
| ✅ 原型已完成 | Phase 6 | Codex App Server 实验问股 | #2004;不等于后续隔离 Gate 通过 |
| 当前工作,未通过 | Gate 0B | 安全隔离 + 老用户升级兼容;当前有实际失败与未完成验证 | 保留现有执行任务与证据,从当前阻塞继续 |
| ⬜ 待完成 | Phase 6b / 6B | 服务端持久化活动股票,上下文跨刷新/会话恢复一致 | Gate 0B PASS 后,沿用原实施计划 |
| ⬜ 待完成 | Phase 6c | 官方 Harness 接入收口:SDK/MCP、runtime 会话、Skills | 保留原详细契约;runtime 会话依赖 6b |
| ⬜ 新增待完成 | Phase 6d | 双路径产品接入:本机 Codex + DSA 内 ChatGPT OAuth、组件准备、首次分析 | 复用已验证运行时,不代替 Gate 0B |
| ⬜ 待完成 | Phase 7a / 7b / 7c | 分别验证 OpenCode / Claude / Hermes Agent | 复用统一工具及产品会话,不外推 OAuth 能力 |
继续工作的顺序:Gate 0B → Phase 6b → Phase 6c → Phase 6d → Phase 7。 每次完成后只更新对应阶段状态和证据,将“下一步”指向下一个未完成项;部分成功不能把整个阶段勾选。Phase 6c 内 SDK/MCP 采用与否按 parity 结果收口,不强制全量迁移,也不把未必需要的重写设成 OAuth 前置。
背景与当前结论
关联 #1733。本 Issue 保留原有两层执行能力,并在 Phase 6d 补齐新用户账号连接体验:
- 让 DSA 调用用户本机已经安装、登录或配置的 Codex / Claude Code / OpenCode / Hermes,完成普通文本与结构化报告生成。
- 在外部 runtime 具备真实 tool call、tool-result roundtrip、stream、session 和取消能力时,将其作为 DSA 的
AgentBackend。
目标始终不是“让外部 Agent 调用 DSA”,也不是把 CLI 的最终文本伪装成 Agent 成功,而是让 DSA 作为宿主产品拥有股票上下文、业务工具、UI、安全边界和系统记录。
OpenAI 于 2026-08-19 正式把 Codex 定义为可嵌入其他产品的 open agent harness。Harness 负责 conversation state、Agent loop、thread/turn、stream、tools、sandbox 和 approval;宿主应用负责业务上下文、application-owned tools/MCP、UI 与操作边界。这验证了本 Issue 已采用的 GenerationBackend / AgentBackend、runtime_owns_loop、Tool Surface 和 SSE ownership 分层。Codex as a platform
本次刷新后的结论:
- 已完成的 generation 与 Codex Agent feasibility 不重做。
- 官方 SDK 能覆盖的通用 harness lifecycle,后续优先评估迁移到官方实现。
- 官方 SDK 尚未覆盖、或官方仍标为 experimental 的能力,不作为阻塞;由 DSA 保留明确、可测试、可回滚的 adapter。
- DSA Tool Surface 是业务工具唯一真源;Codex
dynamicTools与 app-owned MCP 只是不同 transport adapter。 - Codex thread 是外部 runtime state,不替代 DSA 产品会话、消息权限和活动股票真源。
产品目标:两种连接方式,同时保留
| 用户 | DSA 中的操作 | 账号与运行组件归属 |
|---|---|---|
| 已安装、已登录 Codex 的用户 | 选择「使用本机 Codex」,检查后开始分析 | 沿用用户明确选择的现有安装、配置与登录态 |
| 只有 ChatGPT 账号、不使用命令行的用户 | 选择「登录 ChatGPT」,按需准备官方组件,打开官方授权页,返回 DSA 开始分析 | 使用 DSA 管理的独立运行组件和登录目录,凭据由官方 Codex 管理 |
- 新路径不要求用户手动执行终端命令或填写 OpenAI API Key;账号是否具有相应访问权限、模型和额度,以官方结果为准,不能承诺任意账号都可用。
- 已有用户不因升级被强制安装固定版本、重新登录、修改全局 PATH、切换模型或丢失原有平台支持。
- 两种连接方式与 Generation / AgentBackend 是不同维度。共用既有业务执行入口,不复制股票分析或问股实现;选择连接方式不得暗中改变模型、fallback 或已有 backend 配置。
- DSA 发起官方 managed ChatGPT 登录、展示状态与提供退出入口;不解析用户已有 credential 文件,不把 OAuth token 当作 OpenAI API Key,不把 token 返回 Web。
- 「登录成功」「可生成报告」「可使用问股工具」分别验收。登录不是模型权限、额度、输出契约或工具闭环的证明。
- 新路径第一批面向本地后端与 Desktop。远程 Web / Docker 的浏览器和后端可能不在同一设备,不得宣传为已支持;需独立验证设备授权、账号归属和访问权限后开放。GitHub Actions 不启动交互登录。
- 本次新增账号接入范围限于 Codex / ChatGPT;其他 runtime 保留已有接入边界,不能外推相同 OAuth 支持。
官方依据:Codex App Server 提供 account/login/start、授权链接、登录完成通知、账号查询和退出;managed ChatGPT 模式由 Codex 保存和刷新凭据。项目曾验收的 0.144.3 已有对应协议文档,实际采用版本仍须重新验证。官方认证 / App Server / 历史版本认证协议
架构边界
| 层 | 负责内容 | 当前归属 |
|---|---|---|
| Generation | prompt / schema -> text / JSON | GenerationBackend |
| Agent runtime | Agent loop、thread/turn、stream、tool-call protocol、interrupt | AgentBackend / Codex Harness |
| DSA business tools | 股票 scope、tool schema、执行、脱敏、审计、取消与超时 | DSA Tool Surface |
| Product session | 用户 ownership、可见消息、selected Skills、活动股票、历史恢复 | DSA storage / API / Web |
| Runtime session | Codex thread、Claude/OpenCode/Hermes session | 各 AgentBackend adapter |
GenerationBackend 与 AgentBackend 不得互相冒充:
codex exec、Claude Code print mode、opencode run和 Hermes completion 只证明 generation。- true AgentBackend 必须完成结构化 tool call、DSA tool execution、tool result 回传和最终答案。
supports_sessions只表示外部 runtime session 可恢复,不表示 DSA 产品会话已经持久化。
已完成 Phase 的当前定义
Phase 1:GenerationBackend 抽象与 LiteLLM 零回归 — 已完成
交付结果:
- 建立
GenerationBackend、结构化 result/error 与 backend registry。 - 默认继续使用 LiteLLM,并保留 Router、fallback、response validator、report integrity retry、placeholder fill 和 usage telemetry。
- 主分析、
StockAnalyzer.generate_text()、MarketAnalyzer / market review 统一经过 generation abstraction。 - backend-aware availability 不再只依赖 API Key。
当前边界:Phase 1 只定义 generation,不承担 Agent tool loop。
Phase 2:Codex CLI GenerationBackend — 已完成,需按当前 CLI 重验
交付结果:
codex exec可作为codex_cligeneration backend。- 当前使用
--output-last-message取得 text 或 prompt-constrained JSON,再由 DSA 执行 response/schema validation;覆盖受控 cwd、子进程清理、fallback 和结构化错误。 - 当前 adapter 没有启用 Codex generation JSONL 或
--output-schema,usage 明确记录为 unavailable;这些候选模式只有在后续真实版本 probe 与实现完成后才能标为支持。 AGENT_GENERATION_BACKEND=auto不把 generation-only Codex CLI 当成 AgentBackend。
当前边界:codex exec 继续只用于 bounded generation,不承担交互式 Agent runtime。Non-interactive mode
Phase 3:Hermes / Local HTTP Generation — 已完成 generation-only 范围
交付结果:
- 通过现有 OpenAI-compatible channel 复用 Hermes/local HTTP completion。
- 覆盖 loopback、安全 URL、Bearer auth、health、JSON generation 和 diagnostics。
当前边界:未证明 Hermes tools、runs/session、SSE、approval 或 Agent loop。
Phase 4:Claude Code CLI / OpenCode Generation — 已完成 generation-only 范围
交付结果:
- Claude Code CLI 与 OpenCode CLI 复用统一 Local CLI generation contract。
- 覆盖 preset、非交互执行、安全 argv、输出解析、fallback、诊断和 Desktop PATH。
当前边界:Claude Agent SDK、OpenCode server/ACP 仍属于 Phase 7,不由 CLI final text 代替。
Phase 5:Generation Backend 产品收口 — 已完成
交付结果:
- 完成 backend status、capabilities、cheap check、smoke test、Web/API/Desktop 配置与中英文文档。
- generation-only backend 与 true AgentBackend 在配置和用户可见语义上保持区分。
Phase 6a:DSA Tool Surface — 已完成最小契约
交付结果:
- 建立 provider-neutral tool descriptor、参数 schema、股票 scope、read-only policy、结果序列化、脱敏、错误、审计、超时和取消契约。
- LiteLLM 与 runtime-owned adapter 必须复用同一业务工具真源。
当前边界:Tool Surface 不是独立 MCP server;MCP 是 Phase 6c 新 adapter。
Phase 6:Codex App Server AgentBackend feasibility — 已完成实验原型
交付结果:
- 建立
AgentBackend、LiteLLMAgentBackend和CodexAgentBackend。 - 明确
dsa_owns_loop与runtime_owns_loop。 - 通过本地 App Server stdio JSONL 完成真实
dynamicTools -> item/tool/call -> DSA Tool Surface -> result -> final answerroundtrip。 - 已覆盖 SSE ownership、工具事件、stop/interrupt、timeout、输出预算、凭证脱敏、私有 cwd、read-only sandbox、外部 MCP/Apps/plugins 隔离和进程回收。
- 当前仅开放经过验证的只读股票工具,Codex backend 非默认并明确标记 experimental。
当前边界:每个 Chat turn 使用 ephemeral App Server/thread;仓库真实证据基于 codex-cli 0.144.3,尚未证明与当前官方 0.150.1 兼容。
Codex Open Agent Harness 2026 基线
“Open Agent Harness”是 Codex 开源执行层的总体架构名称,不是一个新的独立安装包。官方提供三个集成层:
| 官方层 | 官方定位 | DSA 使用方式 |
|---|---|---|
codex exec |
bounded script、CI、一次性自动化 | 保留 Phase 2 generation-only |
| Codex SDK | 程序化 thread/turn lifecycle | Phase 6c 评估接管通用 lifecycle |
| Codex App Server | 产品内嵌完整 Agent runtime | 继续作为 Codex AgentBackend 的深集成协议 |
截至 2026-08-28:
- Python 3.10+ 的
openai-codex已有 stable release,发布包携带 pinned Codex runtime;公开 API 支持 thread start/list/resume/fork/archive、turn run/stream/steer/interrupt、usage、structured output 和 sandbox。Codex SDK / Python SDK API reference - App Server 已完整文档化 handshake、thread/turn、stream events、MCP、approval、Skills、schema generation 与 required MCP fail-closed。Codex App Server
dynamicTools和item/tool/call仍是 experimental,需要experimentalApi=true。- WebSocket transport 仍是 experimental/unsupported;当前 DSA 只承诺本地 stdio。
- 官方平台架构明确支持 application-owned MCP,但 DSA 仍需实现 Tool Surface MCP adapter,并通过自己的 scope、安全、取消和资源回收验收。
- 2026-08-24 官方弃用了“让 Codex 自己充当 MCP server”的
codex mcp-server命令,要求使用 App Server;这不影响 DSA 将自己的 Tool Surface 暴露为 local MCP、再由 Codex 消费。 - Codex native Skill input 已可用,但 DSA 的交易 Skill 不是天然的 Codex
SKILL.md;必须显式转换并验证后才能接入,不能仅因名称相同直接替换。 - 2026-08-27 官方最新 CLI 为
0.150.1;当前 DSA 只记录了0.144.3真实验收。Codex changelog
能力成熟度必须按官方定义标注;Experimental 能力可能变化或移除,不能写成 production-stable。Feature maturity
目标架构
DSA Web / API
|
+-- DSA product session
| messages / selected Skills / active stock / ownership
|
+-- AgentBackend
|
+-- LiteLLM adapter # DSA owns loop, default
|
+-- Codex Harness adapter # runtime owns loop, opt-in
|
+-- control path(每次运行只选一种)
| +-- raw App Server # current, complete protocol control
| +-- official SDK # candidate, parity gate 后再采用
|
+-- tool exposure adapter
+-- dynamicTools # current experimental path
+-- local MCP # long-term candidate
DSA Tool Surface
schema / stock scope / policy / execution / redaction / audit / cancel
采用原则:
- 官方 SDK 已覆盖的通用 lifecycle 优先评估由 SDK 承担,但同一个 runtime/thread 不能同时由 SDK 与另一套 raw client 控制。
- parity gate 后每条实现路径二选一:SDK 若能完整保留 DSA tool roundtrip 与安全契约则采用 SDK;否则继续使用 raw App Server adapter,不做宽松猜测。
- Tool Surface 始终只有一份;dynamicTools/MCP 不复制业务规则。
- 不做一次性全量重写;每个 adapter 独立 gate、独立回滚。
待完成 Phase
Gate 0B:安全隔离与老用户升级兼容 — 当前工作,未通过
这不是新建阶段,也不是从零重做。 继续原「Gate 0B:安全隔离与升级兼容验收」任务;原 2026-09-06 Gate 0B 计划及现有证据继续作为实施依据。Phase 6b(本地计划写作 Phase 6B)保持原名称、范围和前置关系。此前临时重编号为 Phase 8/11 的改写撤销,不用于指导执行。
为什么仍必须做: Phase 6 的报告/问股成功,不能证明 Codex 原生能力不可绕过 DSA 工具边界。dynamicTools 是追加工具而非排他工具清单;注册和有效配置是主边界,事件观察只是第二道防线。既要隔离有效,也要升级后原有用户继续可用,两项不能互相牺牲。
已有工作与当前结果(2026-09-08 回读执行记录)
| 工作 | 已取得结果 | 不能据此宣称 |
|---|---|---|
| 源码分析、transport 观察与确定性测试 | 已有局部实现与测试证据 | 真实工具隔离或完整 Gate PASS |
| Batch S 官方完整包下载与静态校验 | PASS | 包已在真实 Agent 路径安全可用 |
| Batch P 零模型预检 | INCONCLUSIVE;观察器异常传播等问题已形成后续修正 | 完整权限与清理验证通过 |
| Batch P2 | FAIL:应禁止的 workspace 写入实际成功 | 只读隔离成立 |
| Batch P3 | INCONCLUSIVE:移除 Minimal 后,第一个正向读取命令在加载阶段失败 | “命令没运行”就是安全拒绝成功 |
| 原生 literal-root A/B | 为限定假设提供窄证据 | 实际 Codex / Code Mode host 已通过 |
| 0.150.1 / 0.153.4 定向源码核对 | 现有配置未找到所需独立 literal-root 授权;新版本相关 helper 改动不能证明普通执行路径已修复 | 直接升级可解决 P2/P3,或所有官方版本都不适用 |
| 整体 Gate | BLOCKED / 未通过;执行任务保留现有产物 | TECHNICAL_PASS、UPGRADE_COMPATIBILITY PASS 或 GATE_0B_PASS |
以上是带日期的实测记录摘要,不是新的实验结果。首轮候选 0.150.1 / Darwin arm64 只限定该实验;0.144.3 是历史兼容基线,0.153.4 是后续局部源码调查对象,三者不能混用。
现在从哪里接着做
- 收敛当前运行时隔离与交付方案。 从 P2/P3 和 literal-root 证据出发,评审最小官方运行时修正/可交付路径;不能靠放宽整个根目录或临时目录权限、换更容易通过的测试位置来消除失败。
- 明确安全方案如何随正常 DSA 升级交付。 新用户按需准备官方组件已纳入 Phase 6d 产品目标;但这不等于自维护 Codex fork、修改 runtime 或强制替换老用户安装已获设计认可。Gate 当前是否需要运行时适配、获取/校验/升级/回滚及跨平台维护,需按实际必要性形成具体方案,不笼统退回“缺少运行授权”。
- 按既有 Gate 流程验证最终候选。 先源码/确定性检查与零模型预检,满足实际注册、有效配置、身份和隔离前提后,再完成受控真实工具与取消验证。复用仍有效的已有证据;更换 runtime/profile/payload 后重验受影响项目,不重复已解决的批次或使用旧预算冒充新验证。
- 独立核对安全与升级兼容。 完成全部缺口并审定,才可记 GATE_0B_PASS,随后开启原 Phase 6B 实施。
Gate 范围内既有运行授权继续有效;本次整理不重置授权、不执行新批次、不修改现有任务/监督流程。真实新增的运行时维护或交付决策与已授权的常规实验分别处理。
Gate 0B 完成标准
- 技术八轴全部有最终候选证据:TARGET_IDENTITY、CONFIG_AND_REGISTRATION、DSA_DYNAMIC_TOOL、AMBIENT_BUILTINS、CODE_MODE_HOST、SANDBOX_NETWORK、GLOBAL_STATE、CANCEL_AND_CLEANUP。
- UPGRADE_COMPATIBILITY:原本有效的配置/账号条件下,旧用户升级后沿用原页面、设置、PATH/backend/model 与支持平台继续使用;包含历史 Codex、Desktop、源码/后端部署及原 macOS/Linux/完整 WSL 矩阵。
- Phase 2 generation、默认 LiteLLM、已有报告/数据库/会话不因 Agent 加固被改写或破坏。
- 不把手工下载指定包、增加必填路径、强制换 backend、缩减支持平台或回退已知不安全 runtime 算作兼容通过。
- 每轴和矩阵行分别标 PASS/FAIL/INCONCLUSIVE/BLOCKED;单机技术通过最多为 TECHNICAL_PASS,最终交付组合的技术和升级兼容全部审定后才是 GATE_0B_PASS。
依赖不得倒置: Gate 0B 若需要组件交付适配,该最小交付与验收就在 Gate 内解决;Phase 6d 复用它提供面向新用户的安装/登录界面。不能写成“Gate 等 6d,6d 又等 Gate”。OAuth 登录也不能修复或豁免 Gate 的安全失败。
本地证据定位(不是已合并产品文档):主工作区 .claude/reviews/issues/issue-1743-gate-0b-plan.md、issue-1743-phase-6b-plan.md;现有执行工作树的 issue-1743-gate-0b-progress.md、issue-1743-gate-0b-batch-p2-result.md、issue-1743-gate-0b-batch-p3-result.md、issue-1743-gate-0b-literal-root-ab-result.md、issue-1743-gate-0b-runtime-seam.md。公开 PR 需补可访问的脱敏证据,不用这些本地路径代替远端附件。
Phase 6b(Phase 6B):DSA 产品会话 active stock context — 待完成,等待 Gate 0B PASS
目标:让服务端已接受的活动股票成为 backend-neutral、可持久化、可恢复的 DSA 产品状态。
继续沿用原 issue-1743-phase-6b-plan.md;Gate 0B 未通过前不进入实施。Phase 6b 不承接 OAuth、安装器或 Codex transport 重写,保持现有工作边界。
核心契约:
- DSA 产品会话与外部 runtime session 分层保存,互不冒充。
- 保存最小
active_stock_code、可选展示名、source user message 与更新时间;不保存任意原始 request context。 - user message 与活动股票在同一事务提交,提交成功后才能发送 SSE
accepted并启动 backend。 - history API 与
accepted返回同一份 additiveactive_stock_context。 - Web store 是唯一客户端状态 owner;名称解析只是本次候选,服务端 accepted 才是事实。
- 显式股票代码先按现有规则规范化;只有股票名称时,服务端必须先通过 server-owned stock index 做确定性、唯一匹配的
name -> canonical code预解析,歧义、模糊或无匹配一律拒绝写入。客户端名称候选和模型猜测都不能直接成为持久化事实。 - 预解析得到 canonical code 后,maintain/switch/compare 继续复用现有
resolve_stock_scope();不新增 provider-specific 股票规则。 - 旧会话只对显式股票代码做保守恢复,不重新扫描历史名称制造事实。
- Agent 成功、失败、超时或被停止,都不回滚已经 accepted 的活动股票。
验收:
- 显式代码或经服务端唯一名称解析得到的 canonical code 建立活动股票后,刷新、重开与切换会话仍恢复同一 scope。
- 名称歧义、无匹配、客户端 hint 与服务端索引不一致或模型猜测时,不建立或修改 authoritative context。
- 明确切股会更新状态;普通追问携带的陈旧客户端 context 不得覆盖服务端新状态。
- compare 不偷偷改写活动股票;歧义名称和准备失败不写状态。
- 新建/删除会话正确创建或清理上下文,且遵循现有消息 ownership。
- LiteLLM 与 Codex 使用同一 DSA 会话上下文。
- 后端、API、Web store/page 和真实浏览器路径均通过验收。
Phase 6c:Codex Open Agent Harness 官方接入收口 — 待完成
Phase 6c 不推翻 #2004,而是在当前原型上吸收官方 2026 Harness 能力,减少自研协议漂移并完善产品表达。
6c-1:官方 Python SDK parity / adoption
- 建立“官方 SDK public surface -> 当前 transport responsibilities”差距表。
- 验证 thread、stream、usage、structured output、steer、interrupt、resume 与并发事件路由 parity。
- 验证 SDK 是否提供 DSA 所需的 MCP/dynamic tool 配置与回调路径;不能通过同一 thread 叠加第二个 raw client 补洞。
- SDK 能完整覆盖的运行路径可迁移;SDK 未覆盖 DSA tool roundtrip 或 safety contract 时,该路径继续整体使用 raw App Server client。
- 只有代码量和漂移风险真实下降、所有安全反例不回归时才迁移。
6c-2:DSA-owned MCP adapter
- 将现有 Tool Surface 导出为 local stdio MCP;Tool Surface 仍是唯一业务真源。
- 使用 per-run/per-session 配置,不读取或继承用户全局 Codex MCP 配置。
- DSA MCP server 设为 required,启动或握手失败时 fail-closed。
- dynamicTools 与 MCP 共用 schema、scope、timeout、cancel、redaction、audit 和 contract tests。
- MCP 完成真实 roundtrip 与全部负例后,再决定是否退役 experimental dynamicTools;迁移前两条路径均明确标注,不静默切换。
6c-3:Codex runtime thread persistence
- 建立
DSA conversation ID -> Codex thread ID映射。 - 支持受控 resume、fork、steer、interrupt 和 stale/missing thread 恢复。
- DSA 数据库继续作为用户、消息、股票和业务状态真源。
- runtime thread 丢失不得删除、覆盖或反推 DSA 产品状态。
6c-4:Skill input
- 定义 DSA selected Skill 与 Codex native Skill input 的显式映射格式。
- 只有经过转换、权限检查和版本验证的 Skill 才作为 filesystem-backed input 传入。
- 无映射或 runtime 不支持时,保持当前 DSA instruction 注入路径,不伪装为 native Skill 成功。
6c-5:Approval / Action Mode — 条件性后续
当前股票分析继续保持 read-only / no-approval。只有出现明确写操作或外部动作需求时才启动:
- pending approval 持久状态;
- Web/SSE 审批交互;
- request/session/user ownership;
- 鉴权、CSRF、重放保护、超时、断线恢复和审计;
- 高风险 MCP side effect 强制审批。
Phase 6d:双路径连接、ChatGPT OAuth 与首次使用 — 新增待完成
目标: 已有用户继续选择本机 Codex;新用户无需命令行,在 DSA 引导下准备组件、完成官方授权、生成第一份报告。原 Phase 6b/6c 的身份和当前工作不变。
依赖:复用 Gate 0B 已审定的安全运行时及交付方案;使用既有 GenerationBackend/AgentBackend 和 Phase 6b 产品会话。Phase 6c 的 SDK/MCP 若不适合采用,保留经验证的现有 adapter,不强制重写才能登录。
- 明确「使用本机 Codex」和「登录 ChatGPT」两种连接来源;状态、smoke 与正式请求使用同一选定来源,不自动改变 backend、模型或 fallback。
- 本机路径保留原安装、登录、配置与平台支持;不强制安装组件、重复登录或改全局 PATH。
- 新路径按需准备经验证的官方完整组件,校验来源/摘要/平台/包布局;提供进度、取消、失败恢复和升级回滚。组件使用独立目录,不覆盖本机 Codex;优先复用 Gate 已确定的交付机制,不另建重复分发系统。
- DSA 发起官方 managed ChatGPT OAuth,打开授权页,接收成功/拒绝/取消/超时;凭据存储和刷新由官方 Codex 管理,DSA 不解析已有 token 文件、不向 Web/日志/导出返回 token。
- 展示账号状态、登录失效和重新连接;DSA 管理账号的退出不注销其他 Codex。本机共享登录默认只断开 DSA 使用,不擅自执行共享 logout。
- 两条路径分别验证首次 JSON/report 生成、正式报告与已支持的只读问股工具/停止/超时;登录成功不代替模型权限、额度或工具闭环验证。
- 覆盖组件未安装、应用重启、连接切换、运行中请求归属、额度耗尽、模型不可用和网络失败;fallback 的实际后端如实展示,不拿其他后端成功冒充 ChatGPT 成功。
- 完成真实 Desktop/本地首次使用、旧用户升级、配置导入导出、中英文说明及 UI 截图。只有通过验收的平台才宣称零命令行使用。
验收:新用户从未安装开始到首次分析跑通;旧用户原路径仍可用,两条路径互不误伤。远程 Web/Docker 的新登录流程和其他 runtime 的 OAuth 不在该首批承诺内,另行验证账号归属与授权设备;GitHub Actions 不启动交互登录。
Phase 7:其他 Agent runtime — 拆分为三个独立 capability-probe issue
Codex Harness 只解决 Codex 的接入方式,不自动完成其他 provider adapter。Phase 7 不再用一个大 PR 同时承载三套协议。
Phase 7a:OpenCode AgentBackend
- 候选:ACP、loopback server、server + DSA MCP。
- 必须验证 auth/password masking、permissions、structured tool call、tool result roundtrip、session、stream、cancel 和 final answer。
- 不默认使用危险权限跳过,不把
0.0.0.0当默认 client target。
Phase 7b:Claude Agent SDK
- 明确为 SDK/API-key 路线,不宣传为简单复用本机 Claude Code CLI 登录态。
- 必须验证认证边界、custom tools/MCP、tool roundtrip、runtime session、stream、approval、cancel 和 DSA Tool Surface 映射。
Phase 7c:Hermes Agent
- 先验证 OpenAI tools/function calling 能否复用 DSA-owned loop;否则再评估自定义 runs/session/SSE adapter。
- 必须验证 auth、session、stream、approval、structured tool event、tool result roundtrip 与 loopback 边界。
三个 probe 的共同通过条件:
- runtime 接收真实 tool schema 并返回结构化 tool call,而不是文本伪调用;
- DSA 执行 Tool Surface 后,tool result 进入后续 turn 并影响 final answer;
- final answer、timeout/cancel 和失败路径必须结构化、fail-closed;
- session、stream、approval 分别独立探测并如实标记
true、false或not_applicable,不把它们全部作为 dsa-owned loop adapter 的硬门槛; - 未通过时
supports_tools=false,只允许 fallback、明确 text-only 或结构化 unsupported; - 全部复用 Phase 6b 产品会话与股票 scope,不建立 provider-specific 股票状态。
安全、隐私与产品边界
- 默认
AGENT_BACKEND=auto继续选择 LiteLLM;Codex/OpenCode/Claude/Hermes true AgentBackend 均显式 opt-in。 - 外部 runtime 不能获得任意 shell、文件系统、网络、数据库、通知或交易能力。
- 当前 Codex 只开放经过验证的 read-only 股票工具。
- prompt、argv、stdout/stderr、tool args/result、env、headers、token、home/executable path 必须脱敏并限制大小。
- 子进程使用固定 argv、私有 cwd、最小 env、deadline、interrupt 和完整 process-tree cleanup。
- DSA 不读取用户已有第三方 credential 文件,不把 key/token 返回给 Web。Phase 6d 可以由用户主动发起官方 managed 登录,由独立官方 runtime 管理凭据;与分析任务分离。
- “本地 Agent”不等于离线模型;prompt、股票、新闻、报告和持仓上下文可能被所选 runtime 背后的服务处理。
- Docker/cloud/remote server 不会天然拥有用户桌面的 CLI/runtime 登录态,必须单独安装和配置。
- 不把 open-source harness 误写成模型或托管服务开源。Open-source Codex
原验收清单状态
按当前主线与合并证据,原 35 项中 29 项已完成;未完成项集中在 Phase 6b 与 Phase 7。Phase 6c、Gate 0B 与新增 Phase 6d 使用各自 checklist,不混入历史完成率;该旧清单不能表达当前 Gate 是否通过。
- 未配置
GENERATION_BACKEND时,现有 DSA 行为保持不变。 -
GENERATION_BACKEND=litellm保留 Router、fallback、usage telemetry、response validator 与 report integrity retry。 - LiteLLM 不发生 backend-level 递归 fallback。
- #1743 是 umbrella roadmap,generation-only PR 不伪实现 AgentBackend。
-
AGENT_GENERATION_BACKEND=auto不无条件继承 generation backend。 -
StockAnalyzer.is_available()已 backend-aware。 - local backend 可完成主分析 JSON 生成、解析、完整性重试、placeholder fill 与 usage 处理。
-
StockAnalyzer.generate_text()、MarketAnalyzer 与 market review 使用同一 Backend 抽象。 - Local CLI 使用 mock CLI 固定 DSA 侧契约。
- 不支持 stream 的 generation backend 可退化为 non-stream 并输出进度。
- CLI preset 使用 argv list/
shutil.which,拒绝 shell 片段与重定向。 - Codex CLI 版本/capability 有真实记录,final text 不作为 Agent 成功。
- Codex JSONL、
--output-schema、--output-last-message、usage 与安全 cwd 的处理策略已经写入 Phase 2;当前实现明确限定为 final-message + DSA validation + usage unavailable。 - Hermes P0 复用 OpenAI-compatible channel,generation 与 Agent capability 分离。
- Claude Code CLI / OpenCode 已按 generation-only 接入。
-
supports_tools=false时 Agent Chat 不会伪成功。 - 外部 Agent adapter 统一复用 DSA Tool Surface。
- Codex App Server feasibility 已完成真实 tool roundtrip,且保持 experimental/非默认。
- Phase 6b 持久化服务端 authoritative active stock context。
- Phase 6b
Source: ZhuLinsen/daily_stock_analysis