← 全部文章

我用 Codex 修复了它自己的一个问题

31 条目录记录、三次尝试,和一个仍未解决的同步问题。

头图:用 Codex 修 Codex,31 条目录记录,3 次尝试。AI 生成插画。
头图:用 Codex 修 Codex,31 条目录记录,3 次尝试。AI 生成插画。

做了多年软件开发,多多少少,有点技术洁癖。

同一个项目,ChatGPT 电脑端一个名字,手机端另一个名字。已经删掉的还在,改过名的也没跟过来。

每次打开看到,心里都怪难受的。

同一项目在电脑与手机上的名称对照。目录修复后:4 个项目数量一致,3 个自定义名称仍未同步。
同一项目在电脑与手机上的名称对照。目录修复后:4 个项目数量一致,3 个自定义名称仍未同步。

来回修改、反复重启,试了很多遍,始终没解决。

今天半夜醒来,睡不着。我索性躺在床上,拿起手机:让 ChatGPT 自己修自己,试试看。

准确地说,我用的是手机里的“远程”,连接 Mac 上的 Codex。我在手机上发指令,它在电脑上排查和执行。

我直接问它:

你能尝试直接修复底层数据吗?

没想到,修到第二次,它写的修复脚本先把自己卡住了:检测到数据库被占用,查到最后,占用数据库的正是它自己。

折腾了三次,项目数量和旧目录残留的问题解决了,自定义名称同步还没有。

我把过程记了下来,尤其是中间那个 SQLite 连接的坑。

手机里怎么多了几个项目?

最初,手机列表里有 6 项。已经删除的 Elsewise 仍然在;P1-自媒体 和旧的 P1-自媒体-陈不一 同时出现;创业项目也还挂着旧目录名。

桌面整理后只剩 4 个项目,手机没有跟上。

Codex 对照项目清单、真实文件夹和任务记录,发现新目录已经存在,旧目录已经不存在,但一批未归档任务的工作目录 cwd 仍指向旧路径。

而且,这个路径不只存了一份。

任务索引在 SQLite 里,桌面还有目录缓存,会话记录的首行 session_meta 里也保存着 cwd。这些地方得一起核对,否则可能改了一处,另一处还留着旧路径。

查到这里,至少知道先改哪里了:把还指向旧目录的任务记录找出来,改成现在的路径。

要改的是 31 条目录记录

最后圈定的是 24 条自媒体任务、6 条创业任务,以及 1 条桌面已归属 mall、却仍指向用户主目录的任务。

合计 31 条。

更早的归档任务和内部子任务,没有一并扫进去;聊天标题、正文和归档状态也不在修改范围内。

确认范围后,我授权它退出桌面应用、备份涉及的数据,再做离线修复。应用运行时会维护内存里的状态,直接改磁盘上的文件,可能又被应用写回去。

修复流程:先确认31条记录,再离线备份、修正元数据,经过数据校验和手机验收。目录残留已修复,自定义名称仍未同步。
修复流程:先确认31条记录,再离线备份、修正元数据,经过数据校验和手机验收。目录残留已修复,自定义名称仍未同步。

前两次都没成功

第一次,脚本等桌面应用退出。我手动确认退出晚了,它超时停止。回头看日志,这次根本没写入修改。

这期间,手机里那个已删除的 Elsewise 消失了。我一度以为修复生效了。后来对上日志,才知道这次变化不能归功于脚本。

第二次,应用正常退出了,脚本却仍然报告:数据库被占用。

问题出在预检查的 Python 代码里。简化后是这种写法:

with sqlite3.connect(db_path) as conn:
    inspect(conn)

容易误以为离开 with 就会关闭连接。但 SQLite 连接的这个上下文管理器负责事务提交或回滚,不会自动关闭连接Python 官方文档对此有明确说明。

脚本先打开数据库做检查,检查完没关连接,接着又用 lsof 检查文件占用。结果把自己查了出来,还当成了别的进程。

难怪应用都退出了,它还说数据库被占用。

Codex 复现后,在这些需要显式释放连接的地方使用了 contextlib.closing。只读预检查可以这样写:

from contextlib import closing

with closing(sqlite3.connect(db_path)) as conn:
    inspect(conn)

这里解决的是连接释放。涉及写入的事务,仍然需要单独处理提交和回滚。

接着,它在数据副本上验证三类目录迁移,并确认检查结束后,进程不再持有数据库文件。第三次执行才真正完成了修复。

第三次,手机上终于有变化了

这次写入包括任务索引、相关桌面缓存,以及那 31 份会话记录首行里的目录元数据。

会话首行之后的内容按原字节保留,并与备份做 SHA-256 比较。这样就能核对聊天正文有没有被改动。

最终校验结果是:31 条任务目录已修正;当时的 814 条任务索引全部保留;标题、归档状态和时间没有改变;数据库完整性检查通过,相关会话正文哈希一致。

然后,我重新看手机。

列表剩下 4 项:P1-自媒体ElsewiseP1-创业mall。旧的自媒体项目名消失了,创业项目也显示当前目录名。

这次日志里的结果,终于和我在手机上看到的对上了。

名字还是没同步

电脑上的自定义名称分别是 We-MediaKnowledgeBaseStartUpBusiness;手机显示的依然是对应目录名。

继续检查发现:桌面项目清单、旧版名称映射、底层项目表,都已存着正确的自定义名称。

名字在电脑上已经存对了,继续改同一个字段,恐怕也没用。手机为什么没用这个名字,是没读到,还是两端处理方式不同,目前还没查清楚。

这次改的是我电脑上的目录记录。Codex 的产品代码没动,以后还会不会再出现,也得继续用着看。

我已经让它整理了问题和修复报告,明确提出我的期望:手机和电脑都采用自定义项目名,重命名后保持一致。 截至写稿,报告准备好了,但受提交工具限制,还没有成功发送给 OpenAI。

以后工具出毛病,我可能会先问问它自己

过去遇到工具自身的问题,我通常只能重启、搜解决办法,或者等更新。这次多试了一步:让它看看自己电脑上的数据,到底哪里没对上。

它查记录、写脚本,我也没法完全撒手:提供手机截图、确认修改范围、完成退出操作、反复告诉它“结果还不对”。

以后再让 Agent 修东西,我大概还会这样追问:查到什么了?具体要改哪几条?改完我在哪里看结果?

至少这回,反复重启没解决的项目残留,最后躺着用手机处理掉了。剩下的名字不同步,我还是想让 OpenAI 给修好。

文中个人及项目名称已脱敏。本文是特定版本、特定本机数据的实战复盘,不是可直接套用的数据库修改教程。头图为 AI 生成插画。