Skip to content

fix(analysis): respect the desktop Chat account selection - #6966

Merged
loopx-agent merged 1 commit into
mainfrom
codex/research-analysis-host-profile-20261021
Oct 20, 2026
Merged

loopx-agent merged 1 commit into
mainfrom
codex/research-analysis-host-profile-20261021

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Problem and result

当桌面 App 已明确选择 Chat 账户目录,而启动环境继承了另一个终端的 CODEX_HOME 时,研究分析子进程会使用错误的账户目录。原生 Chat 能正常绑定账户,分析却可能因未携带认证而失败。此修复让分析子进程使用服务已声明的 LOOPX_CHAT_CODEX_HOME;没有声明或为空时,普通 CLI 的账户发现行为不变。

Written by: model_agent · Codex · OpenAI.

Implementation

复用现有子进程 owner,在它的环境副本上应用已有 Chat 目录选择。保持 Codex 的登录、凭据刷新、共享 HTTP transport、read-only sandbox、禁用工具及显式执行/重试语义;父进程环境、固定输入、模型配置和旧结果不改写。没有新的账户设置或凭据副本。说明加入既有 trajectory assessment 合同。

Validation

Tested head: cbba37a1f59bccc557fbe79ef00cf7fd815607ad; baseline: f08ca9dcba2190814ab31407d4cb97d0ef54af99.

  • 37 provider/store/production HTTP tests passed,含真实临时子进程的冲突/缺省/空目录选择、父环境不变、取消、失败、重试、原来源和语言行为。
  • 同一个合成夹具在不可变基线和本版执行,并断言实际导入源码。显式 Chat 与终端目录冲突时,基线的子进程断言失败,本版通过;缺省与空覆盖在两版一致通过。
  • Ruff、仓库配置的 mypy(17 sources)、6项直接检查及本次风险选择检查通过。另行尝试的单模块 mypy 会遍历未纳入现行配置的导入图:基线/本版都是5051个已有诊断,按完整路径和消息比较一致;原失败保留,不称其通过。
  • 当前 benchmark-sensitive 人工 review hold 与精确 head 的 review/readiness 仍独立保留;CI 按 Goal 策略不查询。

这是 #6961 正式 App 验收发现的 host-profile 边界修复。合成进程验证不能证明真实模型执行成功;合并安装后将在同一原实验、同一失败作业上显式重试,并保留失败历史。界面和分析提示未改动,原公开打包视觉证据见 #6961。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机

桌面 App 的使用者在原实验 Goal 中显式启动深度分析。

App 已选择 Chat 账户目录,但启动环境还保留另一个终端账户目录时,原分析子进程会继承后者,可能因没有认证信息而失败;本版让子进程遵循 App 已声明的账户选择。

实际子进程的账户目录与 App 的明确选择一致;未声明或为空时,普通 CLI 行为保持一致,父进程环境不变。

不创建或复制凭据,不切换既有会话身份,不变更模型输入、来源权限、求解实验、预算或沙箱。

本 PR 的工程修复已验证;正式 App 中的真实模型重试将在正常合并安装后核验,旧失败记录仍须保留。

改动思路

账户选择已经由桌面服务和原生 Chat 管理,缺口在分析子进程的 IO 环境传递;七行修复直接消费既有选择,无需新的设置、存储或认证 owner。

只调整原 observer 子进程的环境副本,并补实际子进程回归与既有合同说明;来源路由、分析版本、模型提示和执行控制保持原 owner。

既有桌面启动器明确提供 Chat 的账户目录,ChatRuntimeController 已优先使用它;observer 却让 Popen 全量继承另一份终端目录。这是实际 effect 边界遗漏,重新登录、修改全局环境或新建账户配置都会掩盖问题并影响无关调用。修复只复制当前环境,再把已有非空 Chat 选择传给该子进程;没有声明和空字符串均保留原行为。该选择是已知 Host 意图,不从目录内容、最近线程或其他账户推断。

具体改动

按修改前的 docs/reference/trajectory-assessment.md、固定版本 f08ca9dcba2190814ab31407d4cb97d0ef54af99 评审:Producer and consumer boundary 已实现,认证与刷新仍属 Codex,输入/工具/规则不从账户配置扩展;Explicit execution and readback 已实现,read-only sandbox、禁用工具、显式执行/取消/重试及保留失败历史继续通过真实进程和 HTTP 验证。新增说明不能充当修改前的独立验收依据。

关键代码讲解

  1. execute 在原有 transport 构造后建立环境副本,只有已有 LOOPX_CHAT_CODEX_HOME 非空才覆盖子进程 CODEX_HOME。同一 Popen 使用该副本,父环境、analysis key、输入和旧作业不变。异常仍由原 process owner 保存,必须显式重试,不增加登录或认证 fallback。
  2. 未改动的 ChatRuntimeController.__init__ 是本次比较的重要调用上下文:服务此前已明确选择 host home,不能让 observer 从另一个启动上下文重新猜账户。测试从实际子进程读环境,而非仅检查参数列表,所以能捕获原代码的错误继承。

本版3路径38增3删,其中生产修改7行,其余是既有夹具中的三种账户选择和合同说明。没有引入新状态、协议版本、账户设置、凭据复制或第二个身份 owner;继续使用原 shared transport 与进程恢复路径,代码量相称。

对主干的风险

最需防止的是修复时偷偷改变普通 CLI 账户或父进程环境。不可变基线与精确 head 运行同一个真实临时子进程夹具,并断言实际导入源码:显式账户冲突时基线断言失败、本版成功;缺省与空覆盖在两版一致通过,父环境和模型配置均未改写。此前一次 pytest 基线采集意外导入当前 checkout,已排除为基线证据,使用明确源码路径的独立 probe 替代,没有把假阳性当通过。

37项 provider/store/生产 HTTP 测试通过,保留原来源权限、语言缓存、旧结果、并发、取消、失败与重试。Ruff 与仓库配置 mypy 的17个源文件通过,6项直接和15项选中 premerge 检查通过。额外单模块 mypy 会遍历未纳入配置的导入图:基线与本版同为5051条已有诊断,完整路径、位置、消息逐项多重集合相同,仅输出顺序不同;此失败保留,不以总数相同代替归因,也不称它通过。benchmark-sensitive 人工 hold 由本次实际边界评审覆盖,新鲜 readiness 仍须独立就绪。CI 按 wait_for_ci=false 没有查询。

语义与 CI 对齐

本次复用现有 host 账户选择词汇,无新增 enum、主体范围 gate 或通用义务。源权限、read-only sandbox 和显式操作语义不变;reference note 是说明,不能授权另一个账户或放宽工具权限。环境适配属于现有 Python provider IO,无须新增 TypeScript 决策或迁移持久化状态。

我的整体评价

APPROVE,精确 head cbba37a1f59bccc557fbe79ef00cf7fd815607ad。long_horizon 与 user_experience 的工程路径改善:原服务已有的账户选择进入实际子进程,避免反复在错误账户目录尝试,不向用户索要已经知道的信息或新增配置步骤。兼容性由真实缺省/空值对照证明;现有产物和会话身份保留,不需新 decoder 或账户迁移。

这是 justified_increment。正确目录不等于凭据始终有效,也不证明模型判断或科学收益;真实模型原作业的安装后重试仍需核验,并保留本次401失败。未发现代码阻断;已核对远端正文和空评论列表,CQR cqr_8411d2512aacc928ab3c 有效。此批准只适用于该精确 head,不能替代当前独立的合并授权/readiness,也不关闭原研究工作区任务。

English verdict: APPROVE — cbba37a1f59bccc557fbe79ef00cf7fd815607ad. The existing observer now forwards the desktop host's explicit account selection only to its child. Source-asserted baseline/head process evidence catches the original mismatch; omitted/empty parity,37 provider/store/HTTP tests and required local checks pass. Native credentials, fixed inputs, sandbox and explicit retry remain unchanged. Real installed retry and model validity remain separate qualifications.

@loopx-agent
loopx-agent merged commit 2b6d410 into main Oct 20, 2026
25 of 37 checks passed
@loopx-agent
loopx-agent deleted the codex/research-analysis-host-profile-20261021 branch October 20, 2026 22:42
@loopx-agent

Copy link
Copy Markdown
Collaborator Author

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

Post-merge audit — new P2 finding at cbba37a1f59bccc557fbe79ef00cf7fd815607ad. The PR merged while this review was running; the prior approval remains historical evidence. REQUEST_CHANGES below is the engineering conclusion for a corrective follow-up, not a formal review action against the merged PR.

动机

在桌面 Chat 已选择账户后,显式启动研究分析的使用者。

终端账户与 Chat 账户冲突时,旧分析使用终端目录;本版把 Chat 选择传给分析。绝对路径已生效,但同一选择为相对路径时,Chat 正常、分析仍会查错目录。

实际子进程的绝对账户选择、缺省和空覆盖已验证;相对路径还不能保证与原生 Chat 使用同一个账户目录。

本次不更换登录、复制凭据、增加账户设置、放宽工具权限,也不修改模型输入、求解实验或自动重试策略。

需要在切换到作业目录前,按现有原生 Chat 的路径语义解析账户选择,再补相对路径的真实子进程回归;真实模型与正式 App 安装后的验收仍独立保留。

改动思路

账户意图已由桌面服务提供,缺口位于现有分析进程的环境适配;继续使用这个 IO owner 是合理边界,但必须复用原生 Chat 的目录解析语义。

本 PR 的合理边界是把已有 Chat 账户选择正确传给现有分析子进程,保持缺省、父环境、固定证据、权限和显式失败恢复不变。

原生 Chat 先把服务给出的目录展开并解析成绝对路径,再交给子进程;分析新增代码只复制原始字符串,然后在分析作业目录中启动子进程。因此,环境字符串相同并不能证明使用了相同账户。把已知选择在原服务上下文中规范化即可修复这个缺口,无需让用户重新登录、修改全局环境或增加设置。

当前精确 head 的输入 原生 Chat 分析子进程
绝对 Chat 目录,与终端目录不同 已选目录 已选目录,成功
未提供或空覆盖 原有发现行为 与基线一致
相对目录 profiles/selected Chat 服务目录下的已选账户,成功 作业目录下的另一位置,失败

表格概括实际合成进程观察;它不代表真实凭据或模型调用成功。

具体改动

规范依据是修改前的 trajectory-assessment 合同,固定版本 f08ca9dcba2190814ab31407d4cb97d0ef54af99。Producer and consumer boundary:共享认证 transport、Codex 自己管理凭据/刷新、固定证据与禁用工具均保持,但相对路径账户与原生 Chat 不一致,当前为 not_met。Explicit execution and readback:显式启动、失败历史、取消/重试、只读查询和既有结果重用经源码与独立安装 wheel 的真实 HTTP/子进程路径验证,为 implemented。新增账户说明本身不能证明实现满足该说明。

关键代码讲解

  1. execute 的环境覆盖 复制父环境,只在 Chat 选择非空时替换子进程的 CODEX_HOME。父环境不变、缺省和空字符串分支保持旧行为,这部分已有实际进程证据。问题在第164行直接使用未经解析的 chat_home。
  2. Popen 的作业目录 使用 cwd=directory 和该环境副本。相对目录会在这里改变含义;已有 ChatRuntimeController.__init__ 则使用 expanduser().resolve(),两条消费者路径没有保持同一账户语义。
  3. 新增 test_actual_child_uses_explicit_chat_account_not_unrelated_terminal 运行真实临时子进程,能抓到原来的继承错误。但它只断言原始环境字符串等于 selected-chat-home,不读取该目录下的文件,也不比较解析后的目录,故当前测试通过时仍会漏掉这个 P2。应在既有夹具补相对路径/实际目录断言。

全部3路径38增3删已读:7行生产环境传递、26增2删的既有子进程测试、5增1删的原合同说明。没有新的账户存储、schema、enum、CLI、权限或 UI。继续复用现有 Python 进程 IO owner 合理;无需为这个目录问题引入第二个认证 owner 或语言迁移。

对主干的风险

[P2] 在改变子进程工作目录前解析显式 Chat 账户目录。 服务从有效的相对目录 profiles/selected Chat 选择账户时,原生 Chat 的真实 model-discovery 子进程读取该合成账户成功;分析却把同一个相对值解释为 jobs/<analysis_key>/profiles/selected Chat,没有选定账户文件,实际子进程退出1并留下 failed receipt。绝对路径对照成功。源码与私有安装 wheel 均复现,生产模块字节一致;没有读取真实凭据或调用模型。这个缺口在本 PR 当前承诺的账户选择路径内,并不要求它完成整个研究功能,也不把旧版本已经缺失的相对选择说成新引入的回归。

最小修复是非空选择在服务工作目录中按原生 Chat 既有路径语义解析后再传给 Popen,保留父环境、缺省/空覆盖、沙箱和显式重试。回归需让实际子进程比较解析后的目录并读取同一份合成账户文件;运行 uv run --extra test python -m pytest -q tests/capabilities/test_trajectory_assessment.py tests/test_chat_codex_home.py tests/presentation/test_research_analysis_api.py,并补跑源码及 wheel 的相对账户与失败后显式重试路径。重复重试或重新登录不能修复路径指向错误。

69项相关测试通过。同一不可变基线/当前 head 的五组真实子进程对照中,显式绝对冲突和仅 Chat 选择按预期改变,缺省、空和两者皆无三组完全保持;全部输入、配置、analysis key、prompt hash、结果与父环境控制保持。源码和 wheel 的生产 HTTP/托管后端验证失败保留、无显式重试不再启动、显式第二次成功、结果重用不再启动、原来源引用和源字节不变。

以实际不可变 PR 基线运行的 premerge 六项直接、六项 catalog、八项风险和一项公开边界检查通过,benchmark-sensitive 人工 hold 独立保留。此前使用移动的 origin/main 时该 PR 已合入,检查得到0改动,已排除为本 PR 验证,未称其通过。必跑的前端合同在真实基线和 head 都因未改的 Goal 显示名称断言退出7;完整 stderr 仅替换 checkout 根路径后相同,测试和实际 dashboard 页面源码均逐字节相同,归为已有无关质量红项并保留。初始 wheel 构建拒绝旧的 ignored 前端产物,经正常 npm ci / build:chat 后完整打包成功,没有跳过构建校验。CI 按当前策略未查询。

语义与 CI 对齐

本次复用既有账户目录词汇,没有新增主体覆盖 gate 或通用义务。具体违反的是原生 Chat 与分析对同一明确目录选择的一致性;原账户 owner、触发输入、实际错误、最小修复及复跑命令如上。文档说明不会授权登录 fallback、工具或自动重试。前端红项与人工 hold 保留各自边界,不能用来掩盖或替代这个当前账户缺陷。

我的整体评价

工程结论 REQUEST_CHANGES:保留这次修复绝对账户冲突的有用增量,并在同一既有 IO owner 补完相对目录语义。问题和代码量相称;没有要求新账户框架、额外用户确认或整个父任务完工。long_horizon=preserved:固定证据、失败历史、显式恢复及成功重用均保持,未声称长期效益已测量。user_experience=not_yet_proven:绝对目录已减少重复排障,但一种原生 Chat 支持的明确选择仍无法完成分析,补上述回归后方可核验完整承诺。

这是有剩余缺口的 justified_increment;新增配置/迁移没有必要,缺省隔离已有实际对照。真实登录有效性、模型判断和正式 App 原作业重试仍需原有验收。本评论只针对相同精确 head 的新可行动发现;已读取当前合并状态和已有批准,未重复批准、撤销评论或执行任何合并/安装操作。

English verdict: REQUEST_CHANGES — post-merge audit of cbba37a1f59bccc557fbe79ef00cf7fd815607ad. P2: a relative explicit Chat home is copied raw into a child running from the analysis-job cwd, so it resolves to a different account directory than native Chat. Real source and installed-wheel children reproduce the mismatch; absolute and absent/empty controls,69 focused tests and HTTP retry/readback pass. Normalize the selected home before changing cwd and add resolved-path coverage. Existing unrelated frontend failure and live-model/App qualification remain separate.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant