Skip to content

[Bug]: 26.721.x 首页 home-icon 非稳定渲染 → homeRoute=true 但 homePresent=false → Initial theme verification failed(1.5.6 仍存在) #306

Description

@JamesOpsLab

Platform / 平台

macOS

OS version / 系统版本

26.5.2 (25F84)

CPU / 架构

Apple Silicon (arm64)

Codex Desktop version / source / Codex 桌面版版本或来源

26.721.41059

Dream Skin version / 皮肤工具版本

1.5.6(1.5.1 / 1.5.4 同样复现)

Problem category / 问题类型

Verify / doctor failed / 校验或 doctor 失败

Self-check / 自检

  • Ran Verify / doctor (or Windows verify script) / 已运行 Verify 或 doctor
  • Tried Restore, then re-apply / 已尝试完全恢复后再应用
  • Official Codex still opens without the skin tools / 不用皮肤工具时官方 Codex 仍可正常打开
  • Searched existing issues / 已搜索现有 Issue

未勾选 Restore:根因已定位到 injector.mjs 的具体分支(见下),与本地状态无关,Restore 不影响结论。

Steps to reproduce / 复现步骤

  1. 在 Codex 首页(显示 "What should we work on?" 的界面)状态下点击菜单栏「应用皮肤」,或运行 start-dream-skin-macos.sh
  2. 随机失败;失败时 start-error.log 写入 Injection verification failed,注入器被停止
  3. 切到任意对话页后重新应用 → 稳定成功

本机 4 天内累计 24 次 Injection verification failed

Expected behavior / 期望结果

注入成功且皮肤已正确渲染时,验证应通过并保持会话。

Actual behavior / 实际结果

注入本身总是成功installed: truestylePresent: truestyleMode: "adopted",截图确认皮肤渲染正常),但验证把一个健康会话拆掉了。

根因:[data-testid="home-icon"] 在 26.721.41059 首页并非稳定渲染。

同一台机器、同一 app build、同一会话,用 CDP 直接实测:

t0  首页    [role=main]=1  home-icon=0  game-source=1   -> verify rc=2  失败
t1  对话页  [role=main]=0  home-icon=0  game-source=0   -> verify rc=0  通过
t2  首页    [role=main]=1  home-icon=1  game-source=1   -> verify rc=0  通过

即:首页显示期间 home-icon 有时缺失。缺失时——

// injector.mjs (1.5.6) :1085-1089
const homeIndicator = document.querySelector(SEL_HOME_ICON);      // null
const homeSignal = homeIndicator
  ?? document.querySelector(SEL_GAME_SOURCE)                      // <- 仍能解析
  ?? document.querySelector(SEL_HOME_SUGGESTIONS);
const homeRoute = homeSignal?.closest('[role="main"]') ?? null;   // truthy
const home = document.querySelector(SEL_HOME_ROUTE);              // :has([data-testid=home-icon]) -> null

homeRoute 为真(经 game-source)但 homenull,于是 homePresent = falsehero = null

// injector.mjs :247-253
const homePass = !result.homeRoute || (result.homePresent && result.hero?.visible && ...);
// false || (false && ...) -> false
result.pass = Boolean(basePass && homePass && payloadPass);   // -> false

其余全部通过:

"checks": { "documentVisible": true, "fallbackWindowPass": true, "nativeWindowPass": false,
            "payloadPass": true, "structurePass": true, "viewportPass": true, "windowPass": true },
"homeRoute": true, "homePresent": false, "hero": null, "pass": false

两个首页信号是独立推导的:homeRoute 接受三个信号中任意一个,而 home 只认 home-icon。当 home-icon 是唯一缺失的那个时,验证就会对一个完好的会话 fail closed。

为什么是间歇性:需要两个条件同时成立 —— (1) 处于首页路由(对话页没有 [role="main"]homeRoute=false 会让 homePass 短路为 true);(2) 该瞬间 home-icon 尚未渲染。所以在对话页应用稳定成功,在首页应用是抛硬币。

这不是 #251,也不是 #244 -32000 的修复已生效(fallbackWindowPass: true / windowPass: true 均正确);#244 的 banner-sibling hero 探针本身工作正常——问题在更早一步,home 本身就是 null,探针拿不到容器。也不是 #256(那是 apply-from-menubar-macos.sh 的 shell unbound variable,已修复)。

Modified official Codex install? / 是否改过官方 Codex 安装?

No — official app only / 否,仅官方安装

Logs / Verify / doctor output(recommended)/ 日志与校验输出(强烈建议)

$ node injector.mjs --verify --port 9341 --theme-dir <theme>
rc=2
homeRoute = True   homePresent = False   hero = None   pass = False
checks = {'documentVisible': True, 'fallbackWindowPass': True, 'nativeWindowPass': False,
          'payloadPass': True, 'structurePass': True, 'viewportPass': True, 'windowPass': True}

$ tail start-error.log
2026-07-28T13:47:27Z Injection verification failed. The injector was stopped
2026-07-28T13:47:27Z exit=1 line=45
(同类记录 4 天内 24 条)

Screenshots / video / 截图或录屏

失败时截图确认皮肤已正常渲染(背景图、配色 token、右下角 quote 全部生效),仅验证判定失败。

Extra context / 其他信息

建议修复homeRoute 已经是"触发的那个首页信号"的 [role="main"] 祖先节点,正是 home 想要的容器。严格选择器落空时回退到它即可:

- const home = document.querySelector(${selectorLiteral("home-route")});
+ // 26.721.x 并不总是渲染 [data-testid="home-icon"],严格的 home-route 选择器
+ // 会在确实处于首页时落空。homeRoute 已经是该首页信号的 [role="main"] 祖先。
+ const home = document.querySelector(${selectorLiteral("home-route")}) ?? homeRoute;

严格选择器命中时仍然优先(?? 短路),因此在 home-icon 存在的构建上行为完全不变。

验证:把 1.5.6 的 hero 算法(第 1115–1126 行)原样跑在实际 DOM 上,分别喂入不同容器:

容器 homePresent hero
严格选择器,home-icon 存在 true 1760×1067 visible
严格选择器,home-icon 缺失 false null ← 当前故障
homeRoute 回退,home-icon 缺失 true 1760×1067 visible

回退产出的 hero box 与严格路径完全一致,属于零副作用替换。本机应用该补丁后,首页状态下 --verify 恒为 pass: true,与 home-icon 是否恰好渲染无关。

披露:为验证该修复,本机已在 ~/.codex/codex-dream-skin-studio/scripts/injector.mjs 上应用上述一行补丁。官方 ChatGPT.app 未做任何改动。上文 t0/t1/t2 的实测数据均采集自未打补丁状态。

旁注selectors.jsonverifiedAgainst.codexVersionMac 在 1.5.1、1.5.4、1.5.6 中始终是 26.715.61943。针对 26.721.x 重新基线可能会一并暴露这类漂移。更根本地说,官方若是条件渲染 home-icon,把它列为 L1 / required 锚点就不太安全——让 home 复用与 homeRoute 相同的已解析信号可以彻底移除这个依赖。

Confirmation / 确认

  • I did not paste API keys or secrets / 我未粘贴 API Key 或其它密钥
  • I understand this is an unofficial theme tool (loopback CDP only) / 我理解这是非官方换肤工具(仅本地回环 CDP)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions