【学习工作赛道】Outsider——站在用户侧的 AI 第三方观察者

## 0. 先和大家打个招呼

我是一名在读大学生和独立产品创作者,不是科班工程师,也一直把自己当作技术小白。

之前在用 Claude 和 ChatGPT 做项目的时候,我发现一个反复出现的问题:长对话进行到二三十轮以后,AI 会悄悄偏离最初定好的方案结构,或者忘记早期明确写下的约束。等我发现的时候,已经走了很远。每次都要从头翻聊天记录,手动对照"我们一开始说好的是什么"。

这个痛点很具体,但我不知道怎么做。直到我遇到 TRAE。

我的做法是把产品想法告诉 TRAE:我希望扩展在浏览器侧被动捕获对话,不侵入 AI 的正常工作;我希望它检测四类信号——架构偏离、约束遗忘、一致性风险和并行机会;我希望数据全部存在本地,分析只调用用户自己选择的模型。TRAE 帮我完成了 Chrome Extension 后台调度、对话捕获、存储迁移、流式消息治理和全部自动化测试。

这不是一个"点一下按钮就生成"的过程。中间经历过好几轮真实错误:signal 还没递送就标记 delivered、clearAllData 后 content script 内存没清理、ChatGPT 的 DOM 结构和 Claude 完全不同导致捕获失败。每一次都是 TRAE 读取真实代码、定位问题、给出修复方案,我确认方向后一起完成。

## 1. Demo 简介

**Outsider 是什么**

一个 Manifest V3 Chrome Extension,安装在用户浏览器侧,在用户与 Claude、ChatGPT 等 AI 对话时充当第三方观察者。它观察的是人机交互轨迹——不是普通网页内容,也不是 Agent 内部 trace。

**面向谁**

经常和 AI 进行长对话协作的开发者、研究者和学习者。如果你曾经在 30 轮对话后发现"我们一开始说好的不是这个"、“AI你一直在同样的事情上绕了很久了”、“做了很久的任务发现在错的方向高歌猛进,最后浪费一周时间还发现需要推倒重来”

**核心功能**

1. 四类信号检测:架构偏离、长对话遗忘、AI 一致性倾向、并行待办提示

2. 右下角浮窗提醒:不抢焦点,不打断当前操作

3. 用户反馈闭环:每条提醒可以标记"有用"“误报”“知道了”

**当前支持**

- 平台:Claude、ChatGPT

- 产品形态:Chrome Extension(Manifest V3)

- 四种比赛 Demo 无需 API Key

## 2. Demo 创作思路

**灵感来源**

在做项目的过程中,我发现 AI 的"健忘"和"偏移"不是随机的——它有模式。比如,当你连续追问某个技术细节时,AI 会越来越倾向于维护自己已经给出的方向,即使这个方向已经失败了三次。又比如,当对话变长后,早期"不能加后端"这样的硬约束会被悄悄忽略。

**为什么选择用户侧第三方位置**

市面上已经有不少开发者侧的 observability 工具,比如 LangSmith、Langfuse。它们监控的是 Agent 内部的 trace、token 用量和调用链。但用户的体验是:我坐在对话的这一端,我看到的是 AI 说的每一句话,而不是它内部的调用栈。

Outsider 选择站在用户这一侧。它看到的和用户看到的一样——对话内容本身。它的价值不在于监控 AI 的内部状态,而在于帮用户发现"AI 正在悄悄偏离我们说好的方向"。

**当前、即将上线、长期愿景的边界**

- 当前已实现:单次对话中的偏离、遗忘、一致性风险与并行机会

- 即将上线:跨 Agent 工作流监督,在不同 Agent 交接与执行时检查委托是否被正确传递

- 长期愿景:形成由用户授权、由用户自己拥有的自我认知数据,类似体检报告,而不是说教式认知画像

## 3. Demo 体验方式

附件文件名:`Outsider-TRAE-Demo.zip`

Outsider-TRAE-Demo.zip (95.2 KB)

**方式一:双击 index.html 体验**

解压 ZIP 后,直接双击 `index.html` 用浏览器打开。可以点击四个场景按钮,体验 Outsider 的四类信号提醒。这是免安装交互预览,不涉及真实浏览器权限。

**方式二:加载 extension/ 体验真实 Chrome Extension**

解压 ZIP 后,进入 `extension/` 文件夹,按照 README 中的步骤加载已解压的扩展程序。真实扩展会自动捕获 Claude/ChatGPT 对话并进行分析。

## 4. TRAE 实践过程

以下是三个关键开发 Session,对应 Outsider 从规格到可运行扩展的核心阶段。

### 4.1 从产品规格到代码骨架

Session ID: `2539199929528936:e86904dbf11f7410ff8cacaeb00a928a_6a38f2452936d399a40f68c6.6a38f2452936d399a40f68c9.6a38f2452936d399a40f68c7:TRAE Work CN.0.1.34.no_sid.no_ppe.T(2026/6/22 16:28:53)`

我把完整的产品规格文档发给 TRAE,要求它先不写功能代码,只做两件事:第一,复述对数据流和模块边界的理解;第二,按规格创建目录结构和空文件。

TRAE 准确理解了核心边界:扩展只负责产生幂等的 CaptureEvent,所有持久化由 background 单写入,content script 不直接写 chrome.storage.local。对话提炼与提醒递送相互分离,分析过程不会阻塞用户当前的对话。在此基础上,TRAE 创建了 manifest.json、types.js、store.js、capture.js、options.html、options.js 六个初始文件,并在 store.js 中实现了 chrome.storage.local 的基础读写和 schema 初始化。

这一步确立了整个项目的数据流方向和模块职责,后续所有功能都在这个骨架上生长。

【TRAE 开发截图 1】

### 4.2 DOM 捕获与 MV3 工程挑战

Session ID: `2539199929528936:710906db37acd1ca32af0c465cd4c370_6a38f2452936d399a40f68c6.6a38fcdf2936d399a40f694f.6a38fcdf2936d399a40f694d:TRAE Work CN.0.1.34.no_sid.no_ppe.T(2026/6/22 17:14:07)`

capture.js 是 Outsider 最核心的 content script。这个 Session 里 TRAE 解决了两个关键问题。

第一个是 MV3 的工程限制:content_scripts 在 manifest 中静态声明,不支持 ES module 的 `import`/`export`。TRAE 最终用 IIFE 自包含方式实现 capture.js,把所有依赖手动内联,避免了构建工具的环境依赖。

第二个是 Claude 的 DOM 结构。Claude 的用户消息在 `[data-testid=“user-message”]`,助手回答在 `.font-claude-response-body`,两个选择器不对称。TRAE 验证了选择器的稳定性,并实现了 MutationObserver 轮询和流式状态判断。

后来 Outsider 需要支持 ChatGPT,DOM 结构完全不同。TRAE 新建了 `site-adapters.js`,集中维护 ChatGPT 的 `article[data-testid^=“conversation-turn-”]` turn 提取、角色判断、正文解析和 messageId 优先级,避免了把"复制、朗读、点赞"等界面按钮混入回答正文。

另一个实际问题是:Chrome 在扩展更新后不会自动注入 content script 到已打开的旧 tab。TRAE 实现了自愈机制——先发 PING 检测 overlay 是否存在,如果不存在,用 `chrome.scripting` API 按序注入 CSS 和 JS,注入后再次确认。这让用户不用刷新页面就能使用扩展。

【TRAE 开发截图 2】

### 4.3 数据架构冻结、错误修复与测试

Session ID: `2539199929528936:552a0852ae71eb9534ee8d35168d9470_6a38f2452936d399a40f68c6.6a4cb1aa1424c68c85e41f18.6a4cb1aa1424c68c85e41f16:TRAE Work CN.0.1.34.no_sid.no_ppe.T(2026/7/7 15:58:34)`

项目推进到中期,数据结构需要冻结。这个 Session 里 TRAE 完成了三件事:定义 `SCHEMA_VERSION = 1`,引入 `SIGNAL_TYPE`、`CONFIDENCE`、`SIGNAL_OUTCOME` 三个枚举,创建 `createDetectionSignal()` 工厂函数,并实现了 schema 迁移框架,让后续版本升级时能自动迁移旧数据。

在此之后,开发进入错误修复和测试阶段,也全部由 TRAE 协助完成:

**Signal delivery 时序问题**:detector 产生 signal 时不应提前标记 delivered。TRAE 发现部分模块在创建 signal 时就设了 `delivered: true`,但此时消息还没发送。修复方式:创建时 `delivered: false`,只有 Overlay 确认渲染后才标记。

**clearAllData 生命周期问题**:删除全部数据后,content script 的内存状态没有清理。TRAE 新增了 RESET 消息,由 background 向所有受监听 tab 广播,capture.js 收到后清空所有内存状态。

**Streaming 覆盖问题**:ChatGPT 流式输出期间,旧消息可能被新内容覆盖。TRAE 增加了适配器级别的流式状态判断,只有适配器确认不再流式且全局稳定后才最终化。

最终 TRAE 编写了 71 个自动化测试,覆盖 ChatGPT DOM 适配、Claude 回归、signal delivery 时序、rendered 门控、clearAllData 生命周期、streaming 稳定性、递送失败去重和 overlay signalId 绑定。静态检查脚本验证 manifest 引用文件存在性、JS 语法、scripting permission 和加载顺序。

```

:information_source: tests 71

:information_source: pass 71

:information_source: fail 0

```

【TRAE 开发截图 3】

## 5. 报名审核通过帖子链接

截图:

很不错的设计~~已投票!期待后续迭代,相互支持一下~~~ 机闹工厂 - 像素无人车间模拟器

看起来不错,很有创意的,已投票。麻烦帮帮我给我的作品投一票,互相支持支持吧https://forum.trae.cn/t/topic/96939/15?u=一叶孤舟