fix: align local markdown conflict and title behavior
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
# Reasonix Browser Test Contract v1
|
||||
|
||||
## 状态
|
||||
|
||||
- 状态:process
|
||||
- Owner:AI runtime / browser verification
|
||||
- 背景:Reasonix 已能作为独立辅助 agent 执行只读审计,但浏览器验收若只输出自然语言结论,主控仍需重测,无法稳定节省 token。
|
||||
|
||||
## 目标
|
||||
|
||||
把 Reasonix 浏览器测试从“描述性结论”收口为“可审计证据包”。Codex/Hermes 主控只接受带截图、日志、网络、断言和环境前置条件的 Reasonix 浏览器结论。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不让 Reasonix 直接裁决业务 bug 是否完成。
|
||||
- 不让 Reasonix 修改源码、提交 git、回滚文件。
|
||||
- 不把浏览器测试结论写成长期产品事实源;长期事实仍以 bug/design/checklist 和真实验证日志为准。
|
||||
|
||||
## 合同
|
||||
|
||||
每个 Reasonix 浏览器测试任务必须产出以下文件:
|
||||
|
||||
```text
|
||||
result.json
|
||||
final.md
|
||||
process-handoff.md
|
||||
process-handoff.json
|
||||
artifacts/
|
||||
screenshots/
|
||||
console.json
|
||||
network.json
|
||||
trace-or-steps.md
|
||||
```
|
||||
|
||||
`result.json` 至少包含:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "passed | failed | blocked",
|
||||
"run_id": "reasonix-...",
|
||||
"target_url": "http://127.0.0.1:3000",
|
||||
"environment": {
|
||||
"dev_server_restarted": true,
|
||||
"cache_cleared": true,
|
||||
"browser_context": "isolated",
|
||||
"auth_mode": "test-account",
|
||||
"workspace_root": "/tmp/..."
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"name": "upload first attachment",
|
||||
"action": "drag file into editor",
|
||||
"screenshot": "artifacts/screenshots/01-upload-first.png"
|
||||
}
|
||||
],
|
||||
"assertions": [
|
||||
{
|
||||
"name": "attachment opens in tab after second upload",
|
||||
"expected": "tab count increases and active tab kind is resource",
|
||||
"actual": "click produced no tab change",
|
||||
"passed": false,
|
||||
"evidence": "artifacts/screenshots/04-click-after-second-upload.png"
|
||||
}
|
||||
],
|
||||
"console_errors": [],
|
||||
"network_failures": [],
|
||||
"screenshots": [],
|
||||
"modified_files": []
|
||||
}
|
||||
```
|
||||
|
||||
## 浏览器前置条件
|
||||
|
||||
- 测试前重启 `npm run dev:hot` 或复用主控明确提供的已重启服务。
|
||||
- 使用全新 isolated browser context;清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
||||
- 默认使用 `http://127.0.0.1:3000/auth` 的测试账号快速登录。
|
||||
- local-first 测试必须创建临时页面或临时 workspace,并记录路径。
|
||||
- 所有上传文件路径必须记录,不能只写“上传文件”。
|
||||
|
||||
## 截图要求
|
||||
|
||||
用户可见 bug 至少保留:
|
||||
|
||||
- 初始状态截图。
|
||||
- 关键动作后截图。
|
||||
- 失败状态截图。
|
||||
- 修复验证时的通过状态截图。
|
||||
|
||||
如果 bug 涉及 “点击无反应”,必须同时记录:
|
||||
|
||||
- 点击前 tab 列表。
|
||||
- 点击后 tab 列表。
|
||||
- 点击目标节点截图。
|
||||
- console/network。
|
||||
|
||||
## 0524 试验集映射
|
||||
|
||||
`bugs/0524.md` 可作为第一批协同测试样本:
|
||||
|
||||
1. 我的空间拖入附件路径错误:
|
||||
- 验收:上传后文件实际路径应在当前页面 bundle/下级,而不是与主文件夹同级。
|
||||
- Reasonix 输出:文件树截图、实际磁盘路径、上传请求、编辑区附件截图。
|
||||
2. 上传后文件冲突:
|
||||
- 验收:本页面不误报自写冲突;新建页面不继承旧冲突状态。
|
||||
- Reasonix 输出:冲突弹窗截图、页面切换后截图、console/network。
|
||||
3. 隐藏本地 Markdown 标题设置:
|
||||
- 验收:不同 workspace/source 的默认值区分,用户选择刷新后保持。
|
||||
- Reasonix 输出:设置变更前后截图、刷新后截图、local/session storage 或后端请求证据。
|
||||
4. Ctrl+Z/Ctrl+Y 删除链接:
|
||||
- 验收:删除附件链接后 undo/redo 可恢复/再次删除。
|
||||
- Reasonix 输出:键盘动作步骤、编辑区 DOM/截图、断言结果。
|
||||
5. md 文件上传后黑色方块刷新变灰:
|
||||
- 验收:上传前后和刷新后附件 icon 状态一致,或有明确缺失状态样式。
|
||||
- Reasonix 输出:刷新前后截图、附件节点属性。
|
||||
|
||||
## 主控接受条件
|
||||
|
||||
Codex/Hermes 只有在以下条件满足时,才能把 Reasonix 浏览器结果作为验收证据:
|
||||
|
||||
- `result.json` 存在且能解析。
|
||||
- 至少一张截图能直接显示用户可见状态。
|
||||
- console/network 不为空时已被解释;为空时明确记录为空。
|
||||
- `modified_files` 为 `[]` 或 `none`,确认 Reasonix 没有改源码。
|
||||
- `process-handoff` 已 retain 到 Hindsight,主控可 recall。
|
||||
|
||||
## 失败处理
|
||||
|
||||
- 缺截图:结果降级为线索,不作为验收。
|
||||
- 缺 console/network:UI 失败只可作为复现证据,不可作为根因证据。
|
||||
- 没清缓存或没隔离 browser context:结果标记 `blocked` 或 `needs_rerun`。
|
||||
- Reasonix 修改源码:本次测试作废,主控检查 diff 后决定是否保留建议。
|
||||
|
||||
## 评价指标
|
||||
|
||||
- accepted_browser_findings:Reasonix 浏览器发现最终被主控采纳的数量。
|
||||
- false_browser_leads:Reasonix 浏览器结论导致主控走错方向的数量。
|
||||
- retest_required_ratio:主控必须完全重测的比例。
|
||||
- artifact_read_time:主控读取证据包并形成判断所需时间。
|
||||
- missing_artifact_count:缺失截图、console、network、断言的数量。
|
||||
|
||||
## Done Gate
|
||||
|
||||
- [ ] `reasonix-browser-tester` skill 已补入本合同的最小 artifact 要求。
|
||||
- [ ] 使用 `bugs/0524.md` 中至少 1 个 bug 进行 Reasonix 浏览器试跑。
|
||||
- [ ] 试跑后记录 accepted findings / false leads / retest required。
|
||||
- [ ] 根据试跑结果更新本合同或 Reasonix skill。
|
||||
@@ -0,0 +1,146 @@
|
||||
# Reasonix Skill Maintainer v1
|
||||
|
||||
## 状态
|
||||
|
||||
- 状态:process
|
||||
- Owner:AI runtime / multi-agent collaboration
|
||||
- 背景:Hindsight 解决了 Reasonix 过程可追溯问题,但不能自动让 Reasonix 下一次更好。需要一个主控驱动的最小自进化机制,由 Codex/Hermes 根据真实 run 修改 Reasonix skill、任务模板和 handoff 合同。
|
||||
|
||||
## 目标
|
||||
|
||||
建立“真实任务 -> 复盘 -> 修改 Reasonix skill/模板 -> 小 smoke -> 再试跑”的闭环,让 Reasonix 从通用辅助逐步变成可审计、低噪声、能节省主控 token 的 worker。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不让 Reasonix 自主修改自己的 skill。
|
||||
- 不照搬 Hermes 的完整自进化机制。
|
||||
- 不把一次失败就提升为长期规则。
|
||||
- 不修改项目 `AGENTS.md`,除非用户明确要求。
|
||||
|
||||
## 角色边界
|
||||
|
||||
- Codex/Hermes:主控,负责判断哪些协作缺陷值得固化为 skill 规则。
|
||||
- Reasonix:被维护的 worker,负责执行明确任务。
|
||||
- Hindsight:热记忆,保存过程 handoff 和协作复盘。
|
||||
- MemPalace:冷归档,保存长期可检索的会话摘要。
|
||||
|
||||
## 输入
|
||||
|
||||
每次维护 Reasonix skill 前,主控必须先读取:
|
||||
|
||||
- Reasonix run 输出目录:
|
||||
- `result.json`
|
||||
- `process-handoff.json`
|
||||
- `process-handoff.md`
|
||||
- `final.md`
|
||||
- 必要时 `reasonix-transcript.jsonl`
|
||||
- Hindsight recall:
|
||||
- `hindsight-embed -p agents memory recall reasonix "<run-id 或任务关键词>"`
|
||||
- 当前相关 skill:
|
||||
- `reasonix-coding-worker`
|
||||
- `reasonix-browser-tester`
|
||||
- `reasonix-parallel-coding-flow`
|
||||
- 新增 `reasonix-skill-maintainer`
|
||||
|
||||
## 复盘维度
|
||||
|
||||
每个 Reasonix run 至少评估:
|
||||
|
||||
- accepted_findings:被主控采纳的关键发现数。
|
||||
- false_leads:误导主控的判断数。
|
||||
- missing_evidence:缺失证据项。
|
||||
- verification_strength:是否有真实命令、截图、日志、网络、diff。
|
||||
- handoff_cleanliness:handoff 是否能快速读懂。
|
||||
- modified_files_accuracy:是否准确记录修改文件。
|
||||
- retest_required:主控是否必须完全重测。
|
||||
- token_saving_estimate:是否减少主控探索或验证成本。
|
||||
|
||||
## 维护决策
|
||||
|
||||
只有满足以下至少一项,才修改 Reasonix skill:
|
||||
|
||||
- 同类缺陷出现两次以上。
|
||||
- 单次缺陷导致主控明显走错方向。
|
||||
- 缺失 artifact 使浏览器结果无法验收。
|
||||
- `process-handoff` 的结构缺陷导致主控必须重读 transcript。
|
||||
- 用户明确指出 Reasonix 协同方式需要调整。
|
||||
|
||||
不应修改 skill 的情况:
|
||||
|
||||
- 只是单次措辞不佳。
|
||||
- 是当前任务本身不清楚,而不是 Reasonix 规则缺失。
|
||||
- 可通过更好的任务书解决,不需要变成长期规则。
|
||||
|
||||
## 修改范围
|
||||
|
||||
优先顺序:
|
||||
|
||||
1. 修改任务书模板:成本最低,适合单类任务。
|
||||
2. 修改 Reasonix skill:适合跨任务重复规则。
|
||||
3. 修改 runner/extractor schema:适合结构化输出缺陷。
|
||||
4. 修改 Codex/Hermes 主控 skill:适合复核顺序和验收口径。
|
||||
|
||||
每次只做最小修改,并记录:
|
||||
|
||||
- 修改前问题。
|
||||
- 修改文件。
|
||||
- 预期改善。
|
||||
- smoke 验证方式。
|
||||
|
||||
## Smoke 验证
|
||||
|
||||
修改 Reasonix skill 后,必须至少做一个轻量 smoke:
|
||||
|
||||
- 只读任务优先,不改业务代码。
|
||||
- 要求 Reasonix 产出新格式字段。
|
||||
- 主控检查字段是否存在、是否可解析、是否减少噪声。
|
||||
|
||||
浏览器类 smoke 应检查:
|
||||
|
||||
- 是否有截图路径。
|
||||
- 是否有 console/network 摘要。
|
||||
- 是否有 `cache_cleared`、`browser_context`。
|
||||
- 是否有 `assertions[]`。
|
||||
|
||||
## 0524 试跑计划
|
||||
|
||||
使用 `bugs/0524.md` 作为真实任务池,不一次性全交给 Reasonix:
|
||||
|
||||
1. 第一轮:只让 Reasonix 浏览器复现第 2 个 bug“上传后文件冲突”,不修代码。
|
||||
- 目标:验证 browser artifact contract 是否足够。
|
||||
2. 第二轮:让 Reasonix 只读审计第 1 个 bug“我的空间附件路径错误”。
|
||||
- 目标:验证 coding-worker handoff 是否能给出可采纳根因。
|
||||
3. 第三轮:Codex 修复其中一个 bug 后,让 Reasonix 做回归。
|
||||
- 目标:评估 Reasonix 是否能减少主控浏览器验证 token。
|
||||
|
||||
每轮都记录:
|
||||
|
||||
- Reasonix 耗时。
|
||||
- 主控读取 handoff 所需时间。
|
||||
- 主控是否重测。
|
||||
- 被采纳发现。
|
||||
- 误导点。
|
||||
- 需要修改的 skill 规则。
|
||||
|
||||
## 输出记录
|
||||
|
||||
建议每次维护后在对应 bug/design 中补一段:
|
||||
|
||||
```text
|
||||
Reasonix 协同复盘:
|
||||
- run id:
|
||||
- 任务类型:
|
||||
- accepted findings:
|
||||
- false leads:
|
||||
- missing artifacts:
|
||||
- skill changes:
|
||||
- next iteration:
|
||||
```
|
||||
|
||||
## Done Gate
|
||||
|
||||
- [ ] 创建 `reasonix-skill-maintainer` skill。
|
||||
- [ ] `reasonix-browser-tester` 已引用 browser artifact contract。
|
||||
- [ ] 用 `bugs/0524.md` 至少跑一轮真实 Reasonix 协同测试。
|
||||
- [ ] 根据真实结果更新 skill 或明确“不需要修改”。
|
||||
- [ ] 在 Hindsight / MemPalace 中保留协作复盘摘要。
|
||||
@@ -0,0 +1,141 @@
|
||||
# 7-37 Claude Code / Reasonix Worker 评估协议:0524 Bug2 v1
|
||||
|
||||
## 目标
|
||||
|
||||
用 `bugs/0524.md` 第 2 条“本地 Markdown 上传/文件树拖入后误报文件冲突”作为真实任务,评估 Claude Code 与 Reasonix 作为 worker 的可用性:
|
||||
|
||||
1. 编码能力:是否能在相同基线下定位根因、做小范围修复、补测试并通过验证。
|
||||
2. 网页测试能力:是否能在真实浏览器中复现/验收,产出可审计截图、console、network 和结构化结论。
|
||||
|
||||
Codex 仍是主控,负责设计、派发、复核、合并和最终验收。
|
||||
|
||||
## 公平性约束
|
||||
|
||||
- 两个 coding worker 使用从同一 `HEAD` 创建的独立 worktree,不共享当前主工作区未提交改动。
|
||||
- 两个 coding worker 使用同一份任务书,允许修改范围一致,验收命令一致。
|
||||
- 两个 browser worker 对同一个主工作区修复结果做只读验证,不允许改源码。
|
||||
- 评分只基于可复核产物:diff、测试输出、process handoff、截图、console/network,不凭 final 文本。
|
||||
- 若 worker 卡住、超时、无 handoff、无截图或修改范围失控,按实际情况扣分,不手工补完其证据。
|
||||
|
||||
## Coding Worker 任务切片
|
||||
|
||||
输入:
|
||||
|
||||
- bug:`bugs/0524.md` 第 2 条。
|
||||
- 参考设计:`design/05-editor-mainline/process/5-27-local-markdown-working-copy-conflict-contract-v1.md`。
|
||||
- 允许修改:
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/routes/local_folder_events.rs`
|
||||
- `scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
|
||||
- 必要时新增/更新同目录小测试
|
||||
- 禁止修改:无关设计、AGENTS、其它 bugs、git 提交、回滚用户改动。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web document_event_filter_rejects_resource_only_changes -- --nocapture`
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web document_shell_renders_local_markdown_with_same_sidebar_surfaces -- --nocapture`
|
||||
- `cargo fmt --manifest-path rust/Cargo.toml --all --check`
|
||||
- 若能启动浏览器 smoke,运行 `node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js` 并记录结果。
|
||||
|
||||
## Browser Worker 任务切片
|
||||
|
||||
输入:
|
||||
|
||||
- 被测主工作区当前修复结果。
|
||||
- 入口:`http://127.0.0.1:3000`。
|
||||
- 登录:`/auth` 的“测试账号快速登录”。
|
||||
|
||||
必须验证:
|
||||
|
||||
- 打开本地 Markdown 页面,上传附件后,不出现 `mnote-editor-conflict-panel`。
|
||||
- 新建/切换页面后,旧冲突面板不残留到新页面。
|
||||
- 向文件树文件夹拖入文件后,不出现 `external-change-conflict`。
|
||||
- 真实冲突路径仍可用:dirty 当前 Markdown 后外部修改同一 `.md` 文件,应显示冲突。
|
||||
|
||||
必须产出:
|
||||
|
||||
- `result.json`
|
||||
- `process-handoff.md/json`
|
||||
- 至少一张显示通过或失败状态的截图
|
||||
- console/network 摘要
|
||||
- `modified_files` 必须为空
|
||||
|
||||
## 评分维度
|
||||
|
||||
- `root_cause`:是否找到两个核心根因:document event 越界、冲突 DOM 残留。
|
||||
- `patch_scope`:是否只改必要文件,未引入架构外补丁。
|
||||
- `test_quality`:是否补了能失败/能防回归的测试。
|
||||
- `verification`:是否实际运行命令并记录输出。
|
||||
- `handoff_quality`:是否有过程证据,而不是只给最终摘要。
|
||||
- `latency_cost`:完成时间、工具调用量、是否卡住。
|
||||
- `mislead_risk`:错误假设、过度修改、把无关失败归因到本 bug 的风险。
|
||||
|
||||
## 初步观察
|
||||
|
||||
- Reasonix 只读分析较快完成,正确指出空 `documentId` 会污染 session,但对新建页时序有部分猜测,需要主控复核。
|
||||
- Claude Code 修复后本轮可产出 handoff,明确指出冲突面板 DOM 生命周期缺口;耗时更长,但对第二个根因帮助明显。
|
||||
- 后续需要用隔离 coding 任务和真实 browser 任务继续比较,而不是只比较只读分析。
|
||||
|
||||
## 0524 Bug2 本轮实测记录
|
||||
|
||||
### 主控基线
|
||||
|
||||
- 主控修复覆盖三个切片:
|
||||
- document event channel 从 `rootUri` 收窄到 `rootUri#documentId`。
|
||||
- 空 `documentId` 的资源事件不再进入正文冲突链路。
|
||||
- editor view unmount 清理旧 session 冲突面板 DOM。
|
||||
- 主控验证:
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web document_event_filter_rejects_resource_only_changes -- --nocapture`:通过。
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web document_shell_renders_local_markdown_with_same_sidebar_surfaces -- --nocapture`:通过。
|
||||
- `cargo fmt --manifest-path rust/Cargo.toml --all --check`:通过。
|
||||
- `node scripts/task451-local-markdown-conflict-resolution-ui-smoke.js`:通过,真实冲突仍可用。
|
||||
- `node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`:上传附件和文件树拖入 no-conflict 断言通过;后续 broken-link 检查失败,属于其它已知路径,不计入本 bug 修复失败。
|
||||
|
||||
### Coding Worker 对比
|
||||
|
||||
- Reasonix coding:
|
||||
- run id:`reasonix-2026-05-24T07-44-15-864Z-6898e686`。
|
||||
- worktree:`/mnt/Data1T/mnote-wt-0524b-reasonix-coding`。
|
||||
- 正确抓到空 `documentId` 事件污染正文 session。
|
||||
- 补了前端 `if (!documentId) return;` 和后端映射测试。
|
||||
- 漏掉冲突面板 DOM 残留,也没有做 `rootUri#documentId` channel 隔离。
|
||||
- 自报未跑 Playwright,适合作为“定位主因 + 小补丁”证据,不足以直接合并。
|
||||
- Claude Code coding:
|
||||
- run id:`claudecode-2026-05-24T07-44-15-975Z-e03aaf1f`。
|
||||
- worktree:`/mnt/Data1T/mnote-wt-0524b-claudecode-coding`。
|
||||
- 正确抓到空 `documentId` 事件污染。
|
||||
- 额外抓到冲突面板 DOM 生命周期问题。
|
||||
- 修复位置是 `releaseDocumentSession`,比主控采用的 `unmountEditorViewBinding` 更晚,仍可能存在切换瞬间残留风险。
|
||||
- 未做 `rootUri#documentId` channel 隔离,也未补 task479 no-conflict smoke。
|
||||
- 编码帮助大于 Reasonix,但仍需主控补边界。
|
||||
|
||||
### Browser Worker 对比
|
||||
|
||||
- Claude Code browser:
|
||||
- run id:`claudecode-2026-05-24T07-47-11-262Z-46f574f0`。
|
||||
- artifact:`/tmp/mnote-0524-bug2-browser-worker-1779608936242/`。
|
||||
- 产出 `result.json`、截图、console/network。
|
||||
- 上传附件 no-conflict、文件树拖入 no-conflict、dirty + 外部修改真实冲突均通过。
|
||||
- `modified_files=[]`。
|
||||
- 该轮可作为较高质量浏览器验收证据。
|
||||
- Reasonix browser:
|
||||
- run id:`reasonix-2026-05-24T07-47-11-249Z-43f061bb`。
|
||||
- artifact:`/tmp/mnote-0524-bug2-browser-worker-0524T0800/`。
|
||||
- 产出 `result.json`、截图、console/network。
|
||||
- 上传附件 no-conflict、文件树拖入 no-conflict 通过。
|
||||
- runner status 为 `error` / handoff status 为 `failed`,但 `result.json.status=passed`,状态合同不一致。
|
||||
- 将 `/api/local-folder/events` 500 判断为真实冲突阻塞;主控 `task451` 和 Claude Code browser 已证明真实冲突仍可验证,因此该判断有误导风险。
|
||||
- 可作为部分 UI 证据,但不能单独作为最终验收。
|
||||
|
||||
### 可审计性结论
|
||||
|
||||
- Hindsight recall 可召回本轮 Claude Code 与 Reasonix 过程 handoff,但 Reasonix recall 混入了无关项目结果,主控不能只看 recall 摘要。
|
||||
- Claude Code 的 browser artifact 更适合验收:`result.json`、截图路径、console/network、`modified_files=[]` 之间一致。
|
||||
- Reasonix 的 browser artifact 可作为辅助证据,但 runner `status=error` 与 artifact `status=passed` 冲突时,必须降级为线索。
|
||||
- 本轮公平测试说明:worker 能节省主控定位和浏览器操作 token,但不能替代主控做架构边界、diff 取舍和最终验收。
|
||||
|
||||
## 当前评分倾向
|
||||
|
||||
- 编码能力:Claude Code 略优,能补出 DOM 生命周期根因;Reasonix 更快但更像最小局部补丁。
|
||||
- 浏览器测试能力:Claude Code 本轮明显优于 Reasonix,证据更完整且能覆盖真实冲突;Reasonix 产物可审计但状态和结论自相矛盾。
|
||||
- 主控策略:以后可让 Reasonix 做低风险定位/快速 smoke,让 Claude Code 做更完整的 browser artifact;两者结论都必须由 Codex 复核 diff、截图和命令输出。
|
||||
Reference in New Issue
Block a user