ElyMark goes native: task list, markion and markdown-rs references, reviews at effort high
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
60d82d0c5e
commit
ef6dd7e06b
29 files changed
+345
-535
No files matched your search
+19
-8
@@ -95,14 +95,25 @@
|
||||
|
||||
## C14 ElyMark(§14)
|
||||
|
||||
- [~] C14.0 本地 Web 内容宿主 `ely-web-content`:CEF 离屏接入 GPUI,输入、焦点、缩放、主题 token(§17.3;ElyMark 先用,ElyMail 后用)。已验证(macOS arm64,CEF 154.0.32):开发构建与 `.app` 包(五个辅助应用)里页面画出、随应用深色;点选、中英文键入、回车、退格、方向、拷贝粘贴;输入法组字与提交、焦点、主题变量、缩放 1.25、`elyQuery` 往返、页面跳不出所在文件夹(`tests/scripts/webview.sh`);连续五次启动都画出。未验证:Windows 与 Linux;辅助技术读页面文字(缺口) — R1 FAIL 七项已修:资源请求不过门(每个请求都判定,外面的脚本与 HTTP 被取消);符号链接可出门(按真实路径);浏览器与表面互相持有,关闭后不释放(关闭时断开,20 个都释放);载入失败当作载入完成且显示 Chromium 的错误页(报失败,显示组件错误视图与重新载入);文件名里的 `#` 当作 URL 语法(逐字节转义);渲染进程退出与 CEF 起不来只写日志(视图内显示故障并可重新载入);测试不量像素(截窗口量标记色,去掉绘制即失败)。另修:在 GPUI 更新里同步调 CEF 偶发中止(全部经主线程队列在更新之外执行)。R2 FAIL 两项已修:WebSocket 不经资源回调可达本机(每个 CEF 进程把一切网络送往不通的代理,含回环);崩溃测试不看故障视图(截窗口须不见旧画面,经辅助功能按下 Reload 才恢复)。R3 FAIL 两项已修(不再送审):WebRTC 经 UDP 绕过代理(只许经代理,且页面里删去 WebRTC 构造;本机 UDP 收不到 STUN,去掉时测试失败);恢复只看载入事件(重新载入后截窗口须见页面标记,保留故障时测试失败)
|
||||
- [~] C14.1 内容包:Milkdown、CodeMirror 6、Mermaid、数学公式,本地构建、随包、无 CDN。已验证(macOS):`tests/scripts/mark-content.sh` 构建后在真窗口里三种模式渲染标题、任务、表格、脚注、公式、代码块、Mermaid 与两种错误(带原文与位置),每个代码块滚入视口后读出、要求可见(不透明、未被遮挡),图不小于 100×80,预览只读,切换深浅色后图的颜色随之变(含首次绘制途中切换,且首次落下的就是新颜色),绘制途中把代码块改成 Rust 后旧图不落入,连续两次显示只留后一次且只报后一次,截窗口时背景色占比须低于 0.97(隐藏正文时为 0.999),KaTeX 字体载入,无越界请求;`.app` 包内页面显示。未验证:Windows 与 Linux;树莓派载入时间 — R1 FAIL 四项已修:按钮图标的尺寸规则也压扁了 Mermaid 图(限于工具栏与语言列表);主题变化后已显示的图不变色(图带编号,令牌一变即经代码块的回调重画,只取每块最新的一次);连续两次显示会留下两个编辑器(每次显示一个容器与序号,过期的创建即销毁、不报告);测试不看是否真的可见(逐块可见性、图的尺寸、换主题、竞争与截窗口,各以变异核对会失败) R2 FAIL 五项已修:Milkdown 每次预览给的回调都是新的函数,按回调认定的记录对不上,改语言后旧图仍落入(预览先返回带编号的占位,结果只在占位仍在页面上时落下;改语言、改文字、卸载都会换掉占位);首次绘制途中换主题时记录被当作已离开而删去(占位在页上即保留,换主题时连同待画的一并重画);记录由全局持有、编辑器销毁不释放(每个编辑器拥有自己的记录,销毁即释放;占位离开页面的记录在下一次绘制或换主题时清掉;实测 20 次显示与切回源码后为 0);测试的退出钩子在探针已回收后返回 1(只停仍在运行的探针,清理总执行);块公式只查节点存在(滚入视口查可见,隐藏公式的变异会失败)。重载页面使两项竞争发生在 Mermaid 包载入与绘制途中,去掉各项修复的变异都会失败 R3 FAIL 两项已修(不再送审):主题重画复用同一记录,旧主题的首次结果仍会先落下约一秒(每次绘制带代次,重画即作废此前的结果);编辑器销毁后队列里排着的绘制仍逐个执行(每个绘制在调用 Mermaid 前与落下前都核对属主、占位与代次,失效即跳过;测试在三张约 3 秒的图排队时切回源码,之后的主线程长停顿须不超过一次,去掉核对时为两到三次)
|
||||
- [x] C14.2 文件会话与原文保留:BOM、换行、front matter、未知语法(§14.3,QA-21)。已验证(macOS):`tests/scripts/mark-session.sh` 在真窗口打开 BOM、CRLF、front matter、Setext 标题、`1)` 列表、HTML 块、`~`删除线、硬换行、链接定义与 `[[...]]` 的文件,不改保存逐字节相同,首段键入一字保存只改该段(整篇序列化与去掉 BOM 的变异都失败),不能对应的文档以源码模式打开并可保存;`text.rs` 单测(BOM、换行、混用、非 UTF-8)。未验证:Windows 与 Linux;混用换行的文件编辑后统一为多数的换行(已知限制) — R1 FAIL 六项已修:改动段落时其中的 `[[...]]` 被转义、引用与列表内的局部改动重写整个容器(Milkdown 不能逐字写回的顶层块一律以原文块显示与编辑,序列化照文档自己的写法);块间隐藏的链接定义被移动与修剪(块间原文也成原文块,无隐藏原文);页面重载后新编辑被当作旧版本丢弃(每次载入一代,回报带代数,计数归零);无读权限的文件被当作加密文件问密码(权限错误照原话报出);注释超过十词 — R2 FAIL 两项已修:保存写出的文字与随后读的修订标记取自两次快照,导出与读标记之间的编辑被记为已保存(写出时记下所写文字的标记,读修订时先交它;单测在两者之间改文字);链接定义的测试用多行 grep 恒真(改为逐字节比较)
|
||||
- [~] C14.3 编辑模式、Markdown 与扩展语法(MARK-01、02、03、04)。已验证(macOS):`tests/scripts/mark-modes.sh` 真窗口里文档旁图片画出,可视、源码、预览往返不改文件,预览不收键入,经预览往返后撤销仍有效,源码改动回到可视并保存,重命名拒绝已有名称、改到新名后继续保存,新建为空可视文档;`mark-content.sh`、`mark-session.sh` 照过;`rename_new` 单测。未验证:Windows 与 Linux(改名的平台实现未构建);“直接打开文件夹”随文件树在 C14.4 — R1 FAIL 七项已修:另一模式改过文字后回来,原编辑器连同撤销历史被销毁(旧编辑器留在新编辑器之后,撤销用尽即回到它,重做用尽回到较新的);改名完成时标签已关仍去登记(须仍开着且仍是原路径);Windows 路径的 file URL 无效(驱动器与 UNC 分别处理,围栏反向转换,单测);构建中再要的模式被丢(记下,构建完显示最后一个);新建的测试不看内容(读外壳写下的文件须为空);`handlers.rs` 超过 500 行(请求处理移入 `fence.rs`);`Renaming` 只有一个使用者(移回 ElyMark) — R2 FAIL 四项已修:跨模式撤销被当作新编辑、丢了重做(跳转只报新文字,不截时间线);按模式分开的历史使撤销次序不对(改为本文件一条时间线,以当前模式重建);改名间隙里打开新名字得到第二个可写标签(登记记下文件身份,原路径不在而身份相同即同一文件,改名后迁移登记;单测);构建完成的回报回来后旧请求覆盖新的(请求按序号,只认最新) R3 FAIL 三项已修(不再送审):编辑器内撤销后切换模式,重做丢失(离开时把全部重做后的文字记在时间线前方);原子保存换了文件身份,保存后改名的间隙仍得到第二个会话(外壳每次保存成功后以 `Sessions::track` 更新登记的路径与身份;单测在原子替换后改名);旧回报清掉了较新构建排队的模式(代次不符即退出,不碰排队请求;探针按住两个回报复现)
|
||||
- [~] C14.4 导航与搜索:文件树、大纲、多标签、最近文件、文件夹搜索(MARK-05、10)。已验证(macOS):`tests/scripts/mark-places.sh` 真窗口打开文件夹与文件,树只列 Markdown、回车打开,大纲跳转后键入落在标题,文件夹搜索找到两文件的行、不搜 .txt、结果打开到该行,最近列表重启后保留并可打开文件夹;`folder.rs` 与 `ely_files::recent` 单测;其他三个 ElyMark 门照过。未验证:Windows 与 Linux;大纲项的无障碍(组件库待办) — R1 FAIL 六项已修:搜索定位只到块首(带上查询,落在块内该行那一处);可视与预览的行号未计 front matter(按 front matter 行数换算,落在其中即滚到它);以原文块显示的标题不进大纲(原文块记下标题级别,大纲取其首行文字,跳转落在标题文字上);本文件的搜索结果不随标签切换(切换即重搜,迟到的结果按次序作废);读不出的文件只记日志(以“某文件未能搜索”的行列在结果里,带原因);改名后最近列表仍是旧名(最近列表按真实路径,改名即迁移,旧路径不在即移出)。各项去掉时 `mark-places.sh` 或 `mark-modes.sh` 失败 R2 FAIL 三项已修:块内命中按源码计数,链接地址里的词打乱次序(此前行先经 Milkdown 解析,按编辑器所见的文字计数;原文块照源码);引用、列表里的标题成了原文块后不进大纲(原文块的源码以 remark 读出其中全部标题与位置,不再只记顶层标题的级别);改名后文件树与文件夹搜索仍是旧名(改名即重列文件夹,列表变了即重搜文件夹)。各项去掉时 `mark-places.sh` 失败 R3 FAIL 两项已修(不再送审):此前命中的计数与块内查找的重叠规则不一(都按不重叠,`ana` 在 `banana` 里只算一次);命中只在链接地址里时落到下一处可见的命中(该行所见文字没有查询词即落在该行开头)。另修:已打开的文件因路径写法不同(`/var` 与 `/private/var`)不被认出,跳转落空(文件夹以真实路径列出,标签按真实路径认);块内位置把软换行算进与不算进两边不一(编辑器一侧也算入换行)。去掉各项时 `mark-places.sh` 失败
|
||||
- [~] C14.5 编辑工具与附件(MARK-06、07)。已验证(macOS):`tests/scripts/mark-tools.sh` 真窗口可视全部替换、源码正则替换、Tab 与 Shift-Tab、列表续写、Cmd+Down 后插入表格与行列操作、拖放图片落到 assets,`ELY_CLIPBOARD_TEST=1` 时粘贴图片;`edit.rs`、`attach.rs`、`import_attachment` 单测;其他 ElyMark 门与 `webview.sh` 照过。未验证:Windows 与 Linux — R1 FAIL 五项已修:查找框整窗一个,替换用了该标签页面里旧的查询(下一处与替换带上框里的查询,换标签即重查);键入替换文字使命中后移(查询变化从命中起点找);源码里替代文字的方括号未转义(加转义);复制期间另存到别处,链接指向新文件夹里不存在的图片(完成时核对文件夹,变了即不写链接并说明);四处注释超过十词(缩短,`comments.py` 另查 Swift 与页面 JS)。去掉各项时 `mark-tools.sh` 失败 R2 FAIL 三项已修:空查询仍调 CodeMirror 的查找命令,打开它自带的面板(各命令先核对查询有效);正则校验未带编辑器所用的 `u` 标志,`a{`、`\a` 报成无结果(按 `gmu` 校验);`comments.py` 漏过 JS 的跨行块注释(一并检查,`comments-rules.sh` 核对)。`mark-content.sh` 的 find 步核对两种模式都无 CodeMirror 面板、四个错误;去掉守卫或 `u` 时失败 R3 FAIL 两项已修(不再送审):可视模式零宽正则在表情字符处只进一个 UTF-16 单元,落在代理对中间时同一命中反复收集,页面进程耗尽内存崩溃(零宽命中按码点前进,命中不再往前即停);`comments.py` 漏过代码之后开始的跨行块注释(任意位置未闭合的 `/*` 都算)。`mark-content.sh` 在两种模式下对 `😀 alpha` 找 `(?=.)` 得 7 处(只进一个单元时页面崩溃、测试失败),`comments-rules.sh` 核对行内起头的跨行注释
|
||||
- [~] C14.6 外部变更与会话恢复(MARK-08、12,§14.4,QA-22)。已验证(macOS):`tests/scripts/mark-outside.sh` 真窗口原子替换后重载并保持位置、键入后 1 秒自动保存;未保存时外部写入不被覆盖,三方比较、保留你的、合并;外部改名跟随、删除后不自动保存不重建、读不出时提示并可再查;退出后恢复标签、模式与行;崩溃后恢复未命名文档的未保存内容并标为未保存,显式不保存后不回来;`Sessions::renamed_in`、`alive` 单测;其他 ElyMark 门与 `webview.sh` 照过。未验证:Windows 与 Linux;网络目录;导出(C14.7) — R1 FAIL 六项已修:比较期间磁盘再改,合并与保留按旧的磁盘指纹写入、覆盖新改动(比较记下所读内容的指纹,选定前核对,不符即重读重比;重载与比较都以所读字节的指纹为准,`Session::reload_at`);有路径文件的崩溃恢复内容直接进了原文件、下一次编辑自动保存覆盖原件(恢复内容一律开成未命名副本,原件照磁盘打开);原件已不在时恢复内容随标签被丢(照样开成副本,并提示哪个文件没能打开);取消退出后会话清单一直不更新(外壳的“未保存”询问取消时调 `Host::close_cancelled`,清单恢复跟随;已关闭或放弃的标签的恢复点随即删去);只恢复行、不恢复行内位置(记下并恢复列);“保留你的”之后自动保存一直停着(选定后重新开始)。另:启动参数给了文件时只开它(及崩溃恢复的副本),不再连带上次的标签(否则加载先后决定哪个标签在前,键入落到别的文件)。去掉各项时 `mark-outside.sh` 失败 R2 FAIL 五项已修:“保留你的”仍走无条件覆盖(改为以所比较的指纹为基线 `Session::rebase` 后走普通保存,之后的外部改动照样冲突);一个标签连续消费多份恢复文本(每个标签只在首次显示时恢复一次);询问里点保存、随后取消保存面板(或保存失败)时清单仍冻结(外壳在这些出口也调 `close_cancelled`,冲突询问取消同);放弃的标签要等下一次定时才删恢复点与清单(外壳关闭标签时调 `Host::tab_closed`,即刻删去其恢复点、在途的恢复点写完即删,并更新清单);旧会话文件缺列即启动失败(缺列读作 0)。另:自动保存撞上外部改动时不弹外壳的冲突框,交给比较(`Host::conflicted`);组件库 f756043:脏标签与非当前标签的关闭按钮原为隐藏(`invisible`),辅助技术按不动、无法关闭,改为透明仍可按;`ax-press` 另找应用的各窗口并可限定角色。去掉各项时 `mark-outside.sh` 或单测失败 R3 FAIL 三项已修(不再送审):外壳冲突询问的“保留我的”仍以 `save_overwrite` 无条件覆盖,导出期间的新外部写入被盖掉(改以此刻磁盘的指纹为基线 `rebase` 后走普通保存,之后的变化照样冲突;文件已不在时才直接写;ely-files 单测核对其后的写入不被覆盖,ElyDoc 的保留我的测试照过);退出时冲突询问的“从磁盘重新载入”丢了挂起的关闭、清单冻结(先调 `close_cancelled` 再重载);退出途中首次保存的未命名标签在清单里仍无路径,重启不恢复(关闭钩子按恢复槽把新路径与名称写回冻结的清单)。`mark-outside.sh` 覆盖退出时冲突→重新载入→新文档进清单、退出时首次保存→重启恢复该文件;去掉各项时失败
|
||||
- [~] C14.7 书写视图、输出、Git 配合、大文件(MARK-09、11、13、14)。已验证(macOS):`tests/scripts/mark-output.sh` 真窗口专注模式与外观持久、HTML/资源文件夹/PDF/纯文本导出全文、打印出 PDF、Git 状态随保存变化并打开 ElyTree、3.3 MB 文件只用源码且全文保存与导出、富文本复制带 HTML;`mark-content.sh` 的 look 步;`paper`、`look` 单测;PERF-07 release 1 MB 1.4 秒(冷启动 2.0 秒);其他 ElyMark 门与 `webview.sh` 照过。未验证:Windows 与 Linux R3 FAIL 两项已修(不再送审):导出只收 `img[src]`,`srcset` 与 `picture > source` 的资源留着相对路径(导出时每张图定为一个 `src`:去掉 `srcset`、`sizes` 与 `picture` 的 `source`,无 `src` 时取 `srcset` 的首个地址,随后照常内嵌或拷入资源文件夹);KaTeX 的语法错误被吞,导出照报完整(保留渲染的 VFile,公式错误带行号与 KaTeX 的说明进提示,日志只记行号)。另:组件库 28a6bba 的 `Toaster` 原把每条提示的标题写进日志(提示可引用正文与图片名),改为只记编号与级别;外壳加 `toast_unlogged`,ElyMark 的缺失提示用它。`mark-output.sh` 加响应式图片三种、错误公式、图片名与公式文字不进日志;去掉各项时失败
|
||||
用户 2026-10-11 定:ElyMark 不用 CEF,不用 Electron。界面用 Ely-GPUI-Components 的 Markdown 组件(`documents::MarkdownEditor` 一族,缺的在组件库补并推到 Gitea),解析用 markdown-rs,公式用 RaTeX,Mermaid 用 mermaid-rs-renderer,PDF 用 MuPDF Story。删去 CEF 与网页内容,ElyMail 也不用 CEF 与 Electron。旧 C14.0 至 C14.7(CEF 实现)作废,记录在 git 历史。
|
||||
|
||||
- [x] C14.0 前置:`reference/` 加 markion 与 markdown-rs 并钉提交;`scripts/review.sh` 照用户新定(gpt-6.1-sol,effort high,fast,每条最多三轮) — R2 ok
|
||||
- [ ] C14.1 组件库:`MarkdownRenderer`、`MarkdownEditor`、Markdown 着色、块范围、大纲与链接查找改用 markdown-rs(`documents` 的 `tree`、`markdown`、`render`);`BlockEditor` 的导入导出不属 ElyMark,仍用 pulldown-cmark;原有测试照过,改了语义的测试写明 markdown-rs 的读法;推送,ElyOffice 钉新提交
|
||||
- [ ] C14.2 组件库:公式与 Mermaid(MARK-04)。`typography::Latex` 改由 RaTeX 排出;Mermaid 由 mermaid-rs-renderer 画成图;画不出即显示错误与原文;`MarkdownRenderer` 用二者,本地图片按属主给的文件夹读,网络图片不自动载入
|
||||
- [ ] C14.3 组件库:文件级 Markdown 文档组件。一个 `CodeEditor` 持全文与撤销;可视(变高虚拟列表,逐块渲染,按下的块开成源码,写回为一步撤销)、源码(`CodeEditor` 加 Markdown 着色)、预览(只读);属主可读写文本、模式、插入点行列、滚动,可跳到行;改动发事件
|
||||
- [ ] C14.4 ElyMark 文件会话改为原生(MARK-01,§14.3,QA-21):视图换成 C14.3 的组件,文本即文件原文,无序列化;BOM、CRLF 照旧;新建、打开、保存、另存、重命名照旧;应用不再依赖 `ely-web-content`
|
||||
- [ ] C14.5 删去 CEF:`crates/ely-web-content`、`scripts/fetch-cef.sh`、`scripts/build-mark-content.sh`、`apps/ely-mark/web`、打包里的 CEF 辅助应用与许可、CEF 的测试脚本;PRD 与 `agents.md` 写明新路线,ElyMail 正文不用 CEF 与 Electron
|
||||
- [ ] C14.6 编辑模式与大文件(MARK-02、14,PERF-07):可视、源码、预览按标签切换,切换不改文件,撤销跨模式;超过阈值的文件只开源码并说明;1 MB 文档 2 秒内可编辑,实测记录
|
||||
- [ ] C14.7 Markdown 与扩展语法(MARK-03、04):CommonMark 与 GFM、脚注、公式、Mermaid、front matter(不进可视,原样在上方);文档旁图片;链接照 M-05(可视 Cmd/Ctrl 单击、预览单击交应用)
|
||||
- [ ] C14.8 导航(MARK-05):大纲取 markdown-rs 的标题与位置,按标题跳转;文件树、多标签、最近文件照旧
|
||||
- [ ] C14.9 编辑工具(MARK-06):查找替换(大小写、全词、正则),缩进,列表续写,表格插入与行列操作,代码高亮
|
||||
- [ ] C14.10 附件(MARK-07):拖放与粘贴图片复制到文档旁 `assets/`,在插入点写相对链接
|
||||
- [ ] C14.11 外部修改(MARK-08,§14.4,QA-22):干净即重载并保持位置,有改动即比较,合并结果为一步撤销;改名、删除、读错照旧
|
||||
- [ ] C14.12 书写视图(MARK-09):专注模式、打字机滚动、正文宽度、字体、字号,存 `look.json`,不改 Markdown
|
||||
- [ ] C14.13 搜索(MARK-10):本文件与文件夹,结果跳到该行该处
|
||||
- [ ] C14.14 输出(MARK-11):自包含 HTML、带资源文件夹的 HTML、纯文本(markdown-rs)、PDF(MuPDF Story,经 `ely-pdf-worker`)、打印、富文本复制;缺图、错公式、画不出的图随导出提示
|
||||
- [ ] C14.15 会话恢复(MARK-12):标签、未保存内容、模式、插入点、滚动、视图设置
|
||||
- [ ] C14.16 Git 配合与验收(MARK-13):状态栏 Git 状态与打开 ElyTree 照旧;三端构建,ElyMark 冒烟;逐条核对 MARK-01 至 14、QA-21、QA-22、PERF-07
|
||||
|
||||
## C15 ElyAgent(§15)
|
||||
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
FAIL
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:317 — The content boundary covers navigation only; subresource requests bypass it. In the real-window probe, a page under its permitted root loaded a script from the sibling outside directory and reported `{"externalCode":"outside-code-ran"}` through elyQuery. An image also reached the local HTTP server at `/pixel?text=REVIEW_SENTINEL`. This breaks PRD §17.3's bundled-code and restricted-resource contract. Apply resource authorization before subresource requests and redirects, covering scripts, images and other resource types; enforce the permitted file identities and deny unauthorized network destinations.
|
||||
|
||||
crates/ely-web-content/src/view.rs:81 — The folder check compares lexical paths and follows symlinks during the eventual load. Create `root/link` pointing to a sibling outside directory, then navigate the loaded page to `file:///.../root/link/outside.html`. The real CEF page loads and executes the outside script, reporting `{"outside":true,"href":"file:///.../root/link/outside.html"}`. This contradicts the C14.0 claim that pages cannot leave their content folder. Resolve the target's filesystem identity and verify containment in the canonical root before allowing navigation or resources.
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:301 — Closing a browser removes the registry entry while leaving `Surface.browser` populated. Surface owns Browser, Browser retains its client handlers, and those handlers own Surface, producing a reference cycle. A real-window open/close probe tracked surfaces with Weak references: after closing 20 views it reported `release: dropped=20 alive=20`. Clearing the stored browser reference in the copy's close callback changed the same result to `alive=0`. This violates PERF-08. Break the browser/surface ownership cycle during completed browser closure and add a regression that verifies release after repeated closes.
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:275 — Load failures have no error callback handling, and on_load_end unconditionally produces Event::Loaded. Delete the page after WebView::open validates it and before the asynchronous browser loads it: the probe reports Loaded, with location `chrome-error://chromewebdata/` and body `Your file couldn’t be accessed ... ERR_FILE_NOT_FOUND`; no application failure event is emitted. Chromium's default error UI consequently occupies the content area. Handle load errors explicitly, report failure to the owner, and display the error through GPUI; emit Loaded only for a successful content load.
|
||||
|
||||
crates/ely-web-content/src/view.rs:155 — File URLs are assembled from raw path text, so legal filename characters are interpreted as URL syntax. Opening an existing `name#part.html` succeeds at the host API and then loads Chromium's ERR_FILE_NOT_FOUND page because the suffix becomes a fragment. The real-window probe confirmed this with the existing file still present. Construct a properly escaped file URL from the filesystem path and test reserved characters in both content directories and page filenames.
|
||||
|
||||
apps/ely-mark/src/main.rs:36 — CEF initialization and renderer failures are handled solely by logging. In the independently built .app, terminating its renderer processes emits `mark: the page crashed: TerminationStatus(TS_PROCESS_WAS_KILLED) (9)`, while the window continues displaying the previous editor image with no visible fault or reopening action. Screenshots before and after termination confirm the unchanged content. This breaks the visible-failure contract in PRD §6.3. Handle Event::Crashed by updating the application UI to a fault state and providing a reopening path, including failures from asynchronous initialization.
|
||||
|
||||
tests/scripts/webview.sh:21 — The live-window gate checks page-reported strings without checking the rendered output. In the isolated copy, replacing WebView's window.paint_image call with a successful no-op removed all page painting; the unchanged script still exited successfully with `ok: webview`. The core C14.0 rendering regression therefore escapes the acceptance gate. Add an assertion on actual window pixels that fails when the page is absent, and prove it with the same removed-paint mutation.
|
||||
scripts/fetch-references.sh:59 — 新增 markion、markdown-rs 后未同步 `tests/scripts/references.sh:7` 的固定名单,两项新 pin 都不在回归检查内。实际运行 `bash tests/scripts/references.sh` 在第 16 行退出:`FAIL: script pins 19 sources, test names 16`,尚未检查任何 checkout。此前已有 git 漏列,本次又新增两项未覆盖的来源。修复方向:同步完整来源名单,纳入两项新增仓库的 HEAD/pin 校验,并运行该测试确认通过。
|
||||
@@ -1,5 +1 @@
|
||||
FAIL
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:406 — The resource fence leaves WebSocket connections unrestricted. In the independently built real-window probe, replacing the blocked image request with `new WebSocket('ws://127.0.0.1:<port>/pixel?text=REVIEW_SENTINEL')` made the same local listener report `probe: network=reached`; its captured bytes contained `GET /pixel?text=REVIEW_SENTINEL HTTP/1.1` and `Upgrade: websocket`. Thus page data reaches an unauthorized network destination despite the C14.0 claim that all requests outside the content folder are cancelled, violating PRD §17.3's restricted-resource contract. Enforce the destination policy for WebSocket connections as well as ordinary resource loads, and add a live regression that verifies the listener receives no handshake.
|
||||
|
||||
tests/scripts/webview.sh:42 — The crash/recovery gate accepts a missing fault interface and recovery button. Its pixel assertion runs before the renderer is terminated, and recovery is driven directly by the probe calling `WebView::reload`. In the isolated copy, suppressing the entire fault-rendering branch with `self.fault.clone().filter(|_| false)` kept the previous page image visible after the crash and removed the Reload button, while the unchanged gate still exited successfully with `ok: webview (marker share 0.0871, 23 pages freed)`. This lets the PRD §6.3 visible-failure and reopening contract regress undetected. Assert the rendered fault state after termination and recover by activating the displayed Reload control; require the suppressed-fault mutation to fail.
|
||||
PASS
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:103 — The dead HTTP proxy leaves WebRTC UDP traffic unrestricted, so page data can still reach destinations outside the content folder. In the independently built real-window probe, bundled JavaScript created an RTCPeerConnection and data channel, installed an answer derived from its offer with `a=ice-ufrag:REVIEW_SENTINEL`, and added a host ICE candidate targeting a local UDP listener at `127.0.0.1:52027`. The listener received 173 STUN packets containing the page-controlled `REVIEW_SENTINEL` bytes while the current gate exited successfully with `ok: webview (marker share 0.0871, 23 pages freed)`. A simpler `iceServers: [{urls: 'stun:127.0.0.1:<port>'}]` probe also reached its UDP listener. This violates PRD §17.3's restricted-resource contract and the all-network restriction claimed in agents.md:185. Apply the outbound restriction to WebRTC networking and add a live UDP regression that checks for both STUN requests and page-controlled ICE payloads. Evidence: `/tmp/c14-r3-ice-capture.log`, `/tmp/c14-r3-ice-gate.log`.
|
||||
|
||||
tests/scripts/webview.sh:59 — Recovery is accepted from a load event without checking that the recovered page is displayed. `examples/webprobe.rs:67` prints `probe: recovered` and immediately quits on `Event::Loaded`. In the isolated copy, removing both assignments that clear `WebView::fault` during reload and successful loading left the renderer permanently selecting the fault view, yet the unchanged gate still exited successfully with `ok: webview (marker share 0.0871, 23 pages freed)`. A separate observation with exit delayed three seconds measured a post-reload marker share of `0.0000`. Thus the PRD §6.3 reopening interface can remain broken while the recovery gate passes. Keep the probe alive until the recovered content is displayed, assert the page marker and disappearance of the fault state after activating Reload, and require the retained-fault mutation to fail. Evidence: `/tmp/c14-r3-stuck-fault.log`, `/tmp/c14-r3-stuck-fault-visible.log`.
|
||||
@@ -1,9 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/main.css:150 — SVG 图标样式同时命中 Mermaid 的整张图,强制图宽、高为 14px,违反 §14 的 Mermaid 渲染要求。复现:在预览模式显示包含 `graph TD\n A --> B` 的 Mermaid 代码块,真窗口中 SVG 的 viewBox 为 `4 4 168 152`,实际尺寸为 14×14,节点文字缩成无法阅读的小点;窗口截图确认该结果。独立副本中将选择器收窄为 `.milkdown-code-block .tools svg` 后,同一图恢复为 168×152。修复方向:将图标尺寸规则限定在工具按钮内,保留预览图的自然尺寸及响应式约束,并验证实际可见图形。证据:`/tmp/ely-c141-r1-logs/deep.log`、`repair.log`。
|
||||
|
||||
apps/ely-mark/web/src/diagram.js:21 — Mermaid 的主题颜色在生成 SVG 时固化;页面主题 token 更新后,已显示图形继续使用旧主题,违反 §17.3 的主题同步要求。复现:渲染上述图后,经页面主题入口更新 `--ely-surface`、`--ely-fg`,节点填充仍为 `rgb(27, 25, 23)`,SVG 内容完全相同;再次显示相同 Markdown 才得到新 token 对应的 `rgb(255, 0, 255)`。系统深浅色变化走同一 token 更新路径,已有图形也会保留旧色。修复方向:在主题变化时更新现有图形的样式或重新渲染当前 Mermaid 源码,补充显示完成后的主题切换回归断言。证据:`/tmp/ely-c141-r1-logs/deep.log`。
|
||||
|
||||
apps/ely-mark/web/src/main.js:9 — `show()` 的异步创建缺少调用顺序与当前实例校验,连续模式请求会在同一根节点留下两个独立可写编辑器,违反 §14.1 的单一当前编辑模式约束。复现:在真实 CEF 页面连续调用 `ely.show('# OLD', 'visual', texts)` 与 `ely.show('# NEW', 'source', texts)`,等待两者完成后,根节点的 mode 为 `source`,CodeMirror 显示 `# NEW`,同时仍有显示 `OLD` 的可编辑 Milkdown;两次调用都报告成功。原因是第二次调用执行时,第一次创建尚未完成,`close` 仍属于前一个实例;第一次完成后又挂入旧编辑器并覆盖关闭函数。修复方向:按调用顺序管理创建与销毁,校验当前请求身份,销毁过期创建结果,保证根节点始终只保留当前模式的实例。证据:`/tmp/ely-c141-r1-logs/deep.log` 中 `raceMode`、`raceHeads`、`raceSource`、`raceEditors`。
|
||||
|
||||
tests/scripts/mark-content.sh:39 — 渲染验收只读取 DOM 数量与属性,缺少对实际可见内容的断言,整页不可见也会通过,属于 C14.1 的弱测试。复现:独立构建与原有脚本通过;随后仅在副本的页面样式追加 `#document { opacity: 0; }`,重新构建并运行同一脚本,仍输出 `ok: mark content`。现有断言也允许前述 14×14 Mermaid 图通过;代码块数量虽由探针读取,脚本同样未检查。修复方向:对标题、代码和图形建立与内容及尺寸相关的真窗口可见性断言,并要求隐藏正文、压缩图形等变异触发失败。证据:`/tmp/ely-c141-r1-logs/gate.log`、`hidden-gate.log`;`cargo test -p ely-mark` 独立运行通过,当前为 0 项单测。审查结束前已删除探针源码、独立构建目录与自建 CEF 缓存,原始范围内 22 个文件的散列保持一致,核对记录在 `verification.log`。
|
||||
@@ -1,11 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/code.js:32 — 异步结果只核对 Mermaid 请求编号,代码块切换语言后旧请求仍有效,导致 Rust 代码块显示旧 Mermaid 图。复现:真实 CEF 页面显示 `graph TD\n A --> B` 的 Mermaid 代码块,渲染完成前用 ProseMirror 的 `setNodeMarkup` 将语言改为 `rust`;等待后文档属性和语言按钮均为 `rust`,旧 SVG 仍可见,`checkVisibility(...)` 为 true,预览面板仍显示。修复方向:将当前代码块的语言、原文和存活状态纳入结果校验,在语言变化、清空和销毁时使旧渲染失效。证据:`/tmp/ely-c141-r2-logs/recheck-summary.log`、`logic.log`。
|
||||
|
||||
apps/ely-mark/web/src/code.js:45 — 主题观察器把正在渲染、尚无 `data-diagram` 元素的有效请求当作已脱离页面的记录删除,随后旧主题 SVG 仍能回填,违反 §17.3 的主题同步要求。复现:真实 CEF 中开始显示 Mermaid,在副本中仅将生成 SVG 到回填之间延迟 800 毫秒以固定交错;此时把 `--ely-surface` 改为 `#ff00ff`,最终节点填充仍为旧色 `rgb(27, 25, 23)`,渲染记录已被删至 0。上一轮的已显示图形换主题场景通过,本场景覆盖首次渲染期间换主题。修复方向:按代码块生命周期区分待渲染和已销毁状态,主题变化使旧主题结果失效并调度当前源码重绘。副本修复后同一交错得到 `rgb(255, 0, 255)`。证据:`/tmp/ely-c141-r2-logs/recheck-summary.log`、`repair-summary.log`。
|
||||
|
||||
apps/ely-mark/web/src/code.js:61 — 全局 `drawn` 强引用每次渲染的源码和回调,编辑器销毁及模式切换缺少相应释放;清理依赖下一次主题变化,导致固定主题下持续积累失效记录,违反 PERF-08 的资源释放要求。复现:真实 CEF 页面连续 20 次显示 Mermaid 预览并切回源码,等待所有渲染结束后缓存由 2 项增至 22 项,22 项对应的图均已脱离 DOM;回调和源码继续由 Map 持有。修复方向:让每个编辑器或代码块拥有其渲染记录,在替换、清空和销毁时释放源码及回调,并取消失效任务。副本加入生命周期释放后,同一 20 次循环回到 0 项。证据:`/tmp/ely-c141-r2-logs/recheck-summary.log`、`repair-summary.log`。
|
||||
|
||||
tests/scripts/mark-content.sh:14 — EXIT trap 在 `set -e` 下终止已经由 `wait` 回收的探针,`kill` 返回 1 使成功验收变成失败,并跳过临时目录清理。复现:独立构建后运行原脚本,全部内容断言通过,打印 `ok: mark content (background share 0.9422)`,最终退出码为 1,工作目录仍存在;最小 Bash 复验同样在打印 success 后返回 1,清理语句未执行。修复方向:只终止仍在运行的探针,保证清理总能执行,并保留验收本身的退出状态。证据:`/tmp/ely-c141-r2-logs/gate.log`、`gate-report.log`、`trap.log`。
|
||||
|
||||
tests/scripts/mark-content.sh:72 — 块公式验收只检查 KaTeX 节点存在,整块公式完全透明仍满足“公式已显示”的断言,属于 C14.1 的弱测试。复现:在独立副本中仅修正上述 EXIT trap,再给样式追加 `.milkdown-code-block .preview .katex { opacity: 0; }`;三种模式的内容检查全部通过,脚本退出 0,打印 `ok: mark content (background share 0.9427)`,预览中的块公式实际不可见。隐藏整个正文的变异已按预期失败,背景占比为 0.9991。修复方向:将块公式滚入视口后核对实际可见性,并要求隐藏块公式的变异触发失败。证据:`/tmp/ely-c141-r2-logs/hidden-math-gate.log`、`hidden-math-report.log`、`hidden-body-gate.log`;`cargo test -p ely-mark` 独立运行通过,当前为 0 项单测,打包构建及内容比对通过。审查副本、独立构建目录和本轮 CEF 缓存均已删除,原始范围内 22 个文件散列保持一致,见 `verification.log`。
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/diagrams.js:44 — 主题重绘复用同一个 record,结果校验只检查占位和对象身份,旧主题任务仍能回填;R2 的首次绘制期间换主题缺陷仍有残留,违反 PRD §17.3 的主题同步要求。复现:真实 CEF 中渲染验收探针同款 150 节点 Mermaid,在副本中仅将首次 SVG 生成到返回之间延迟 800 毫秒以固定交错,此时把 --ely-surface 改为 #ff00ff。首次回填的可见 SVG 节点仍为 rgb(27, 25, 23),滚入视口后的命中与可见性检查均通过,旧色持续 1129.5 毫秒后才被新色覆盖;tests/scripts/mark-content.sh:98 只检查最终颜色,原脚本仍退出 0。修复方向:为每次绘制记录代次,主题变化立即使旧结果失效,回填校验当前代次;验收覆盖换主题后的首次回填。副本加入代次校验后,同一交错的首次可见填充为 rgb(255, 0, 255)。证据:/tmp/ely-c141-r3-logs/recheck.log、repair.log、gate.log。
|
||||
|
||||
apps/ely-mark/web/src/diagrams.js:47 — 全局 Promise 队列在调用 Mermaid 前无存活检查,release 清空记录后,排队闭包仍持有源码和回调并逐个执行旧图渲染,导致已经切到源码模式的页面持续处理失效文档,违反 PERF-02 的交互要求。复现:真实 CEF 中将首个异步绘制暂挂以固定交错,连续 20 次显示验收探针同款 Mermaid 后切回源码,再放行队列。此时渲染记录与属主均已为 0、页面只有一个源码编辑器,队列仍完成全部 20 个旧图,其中 19 个在源码模式下开始,耗时 37784.6 毫秒,页面 16 毫秒定时器的最大间隔达 1819 毫秒。修复方向:销毁或替换编辑器时使待执行任务失效,并在调用渲染器前检查当前属主、占位和绘制代次,跳过失效任务;增加待渲染时销毁的回归断言。副本增加执行前校验后,同一交错只完成已进入渲染器的一项,其余 19 项均被跳过。证据:/tmp/ely-c141-r3-logs/queue.log、queue-repair.log、verification.log。独立构建、基础内容验收、包内离线渲染和隐藏公式变异验证均已执行;审查副本、独立 target 与临时缓存已删除,原范围 24 个文件散列保持一致。
|
||||
@@ -1,13 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/preserve.js:74 — 修改段落时直接序列化整个段落,破坏其中的未知扩展语法,违反 PRD §14.3、QA-21。复现:打开 `Alpha with [[Wiki Link]].\n`,在段首键入 `x` 后保存,实际字节为 `xAlpha with \[\[Wiki Link]].\n`;未知链接被加上转义。真窗口原生键入与保存已复现。修复方向:保留未编辑的未知语法原文;无法保证保留的结构使用原文块或源码编辑,并加入在未知语法所在段落编辑的字节断言。证据:`/tmp/ely-c142-r1-logs/wiki-bytes.log`、`wiki-native.log`。现有 `tests/scripts/mark-session.sh` 和四项文本单测均独立运行通过。
|
||||
|
||||
apps/ely-mark/web/src/preserve.js:60 — 原文对应与差异仅覆盖顶层节点,引用和列表内部的局部编辑会序列化整个容器,改写无关段落与代码块,违反 PRD §14.3、QA-21。复现:打开 `> First.\n>\n> Setext\n> ======\n>\n> Last with [[Wiki]].\n`,仅在首段键入 `x` 并保存,后面的 Setext 标题变成 `> # Setext`,末段变成 `> Last with \[\[Wiki]].`;另一个引用样本中,未编辑的 `~~~~python` 围栏变成三个反引号。列表首项编辑同样重写后续项目。修复方向:对应到实际修改的子块,保留其余子块原文;无法对应的容器走原文块或源码模式,补充嵌套段落和代码块的保存回归。证据:`/tmp/ely-c142-r1-logs/quote-bytes.log`、`quote-native.log`、`preservation-results.log`。
|
||||
|
||||
apps/ely-mark/web/src/preserve.js:79 — 保留编辑器隐藏的块间原文时调用 `trim()`,随后重新插入到修改块末尾,造成未编辑的链接定义被改写,违反 PRD §14.3、QA-21。复现:打开 `Alpha.\n\n[r]: /path " T " \n\nBeta.\n\nTail.\n`,将插入点移动到首段末尾并按 Forward Delete 合并两个可见段落,保存结果为 `Alpha.Beta.\n\n[r]: /path " T "\n\nTail.\n`;链接定义被移到合并段落后,原有三个尾部空格被删除。真窗口键盘操作与保存已复现。修复方向:将隐藏语法作为带原始字节和位置关系的保留片段处理,保持其原文;无法可靠合并的边界使用源码编辑,补充跨隐藏定义的合并和删除测试。证据:`/tmp/ely-c142-r1-logs/gap-bytes.log`、`gap-native-clean.log`。
|
||||
|
||||
apps/ely-mark/src/view.rs:62 — 页面重载后沿用旧的 `changed`、`reported`,而 main.js:8 的页面版本从零开始,恢复后的新编辑会被判为旧文本丢弃,保存仍宣称成功,违反文件会话内容与修订一致性的要求。复现:分别键入 `x`、`z` 并保存,使旧版本为 2;通过真实 CEF `Page.crash` 终止页面,经原生 AX 按下 Reload 后用 CEF `Input.insertText` 输入 `y`。页面显示 `yxzAlpha with [[Wiki Link]].`,日志出现 `mark: an older text was dropped`;原生 Cmd+S 记录保存成功,磁盘仍为 `xzAlpha with \[\[Wiki Link]].\n`,新增的 `y` 丢失。修复方向:为每次页面载入建立独立代次并同步版本基线,过滤旧代次回报,确保保存等待当前代次的全文;加入崩溃恢复后的编辑、保存和关闭测试。证据:`/tmp/ely-c142-r1-logs/wiki-native.log`、`crashed-ax.log`、`reload-dom.log`、`reload-bytes.log`。
|
||||
|
||||
apps/ely-mark/src/engine.rs:52 — 普通 Markdown 读取的 `PermissionDenied` 原样进入外壳的加密询问路径(open.rs:181),系统权限错误被隐藏为密码错误。复现:创建 UTF-8 文件并设为 `chmod 000` 后用 ElyMark 打开,窗口出现密码框;输入 `abc` 并回车后再次要求密码,日志将普通文件记为 `is locked`、`a password failed: true`,应用未显示实际读取权限错误。修复方向:在 Mark 载入路径明确区分普通文件读取错误与引擎确认的加密状态,使权限失败显示系统错误并结束打开流程;补充无读取权限的文件测试。证据:`/tmp/ely-c142-r1-logs/denied-native.log`、`denied-ax.log`。
|
||||
|
||||
apps/ely-mark/web/src/preserve.js:4 — 注释 `Pairs of equal runs between a and b, by Myers' diff.` 共 11 个英文词,超过 agents.md 的十词限制。复现:去除注释界定符和内联代码标记后按空白分词得到 11。修复方向:缩短至十词以内。证据:`/tmp/ely-c142-r1-logs/verification.log`;该日志同时记录五个应用的独立编译检查通过、审查副本已删除及原源码散列保持一致。
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/engine.rs:79 — 保存字节与保存修订取自两份文本快照,保存期间的新编辑会被错误标记为已保存,并在关闭时丢失,违反 PRD §14.3 的内容与当前修订一致性。`write` 写出后释放文本锁,外壳读回临时文件再调用 `history`;此时 `current` 可已被页面更新,返回的新文本哈希随后成为 `MarkView.saved` 的基线。具体复现:真 CEF 窗口打开 `Alpha.\n`,原生 Cmd+S 导出 7 字节后,用内部 `save.md` 的 FIFO 延迟读回;经 CEF `Input.insertText` 输入 `x`,等待应用收到版本 1、长度 8 的全文,再放行原来的 7 字节。日志记录 `write len 7`、`text version 1 len 8`、`history len 8`;磁盘仍为 `Alpha.\n`,页面为 `xAlpha.`,原生 Cmd+Q 直接以 0 退出,新增字符丢失。修复方向:将导出字节与修订标记绑定到同一文本快照,保存完成后以该快照标记已保存,后续编辑继续保持未保存状态;补充导出与历史读取之间继续编辑的回归。副本中的修订绑定变异已验证:同一调度下关闭会弹出 `Save changes to race.md?`,原生 AX 可见 Save、Cancel 和 Don't Save。证据:`/tmp/ely-c142-r2-logs/race-method.log`、`race-native-broken.log`、`race-instrument.log`、`race-repair.log`、`race-repair-ax.log`。
|
||||
|
||||
tests/scripts/mark-session.sh:132 — 链接定义回归的多行 `grep -qF` 将各行视为独立模式,其中的空行模式匹配任意非空文件,后面的全文比较随之被跳过,无法验证 R1 的定义移动与修剪缺陷。具体复现:将 gap2 的保存结果替换为 R1 的损坏结果 `Alpha.Beta.\n\n[r]: /path " T "\n\nTail.\n`,断言通过;进一步在副本测试脚本中于此断言前将 gap2 全文写成 `CORRUPTED\n`,完整真窗口测试仍以 0 退出并报告 `ok: mark session`。修复方向:使用逐字节比较,并要求上述损坏结果变异使测试失败。证据:`/tmp/ely-c142-r2-logs/predicate.log`、`session-mutant.log`。R1 六项已复核通过;独立网页构建、`cargo test -p ely-mark`(四项通过)、原始 mark-session 测试及五个受影响应用的编译检查均通过。审查源码副本与其独立构建目录已在写结论前删除,原范围内文件散列一致;验证记录:`/tmp/ely-c142-r2-logs/verification.log`。
|
||||
@@ -1 +0,0 @@
|
||||
PASS
|
||||
@@ -1,15 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/main.js:92 — 在另一模式编辑后返回时,`drop(entry)` 销毁原编辑器及其撤销历史,违反 PRD §14.3 的“保留内容历史与当前修订”。真窗口复现:打开 `Alpha.\n`,可视模式键入 `v`,源码模式键入 `s`,返回可视,连续 Cmd+Z 两次并保存,落盘仍为 `svAlpha.\n`;同模式编辑、撤销的对照用例通过。CEF 探针测得可视历史深度从 1 变为 0,经预览往返的对照仍为 1。方向:让本文件的编辑事务和历史跨模式保持连续,模式切换同步当前修订。证据:`/tmp/ely-c143-r1-logs/mark-history.log`、`history-after.log`、`reviewprobe.log`。
|
||||
|
||||
crates/ely-office/src/rename.rs:82 — 重命名完成回调在发起标签已关闭时仍调用 `sessions.open`,创建没有标签承接的会话登记,随后打开该文件会被这个登记挡住。隔离副本仅在文件系统改名调用前延迟 2 秒:发起 `a.md → closed.md`,通过正常 `request_close` 关闭干净标签,等改名完成后重新打开 `closed.md`;实测关闭后的标签数为 0、登记为 `Ok(true)`,重新打开进入 `Open::Focus`,最终仍是 `tabs=0, active=None`。方向:完成回调先核对发起标签的存活和路径身份,再更新登记;关闭标签后完成的操作应保持登记与现存标签一致。证据:`/tmp/ely-c143-r1-logs/rename-race.err`。
|
||||
|
||||
crates/ely-web-content/src/surface.rs:118 — `file_url` 把 Windows 驱动器冒号和路径反斜杠都转义到 `file://` 的 authority 中,生成无效 URL。按现有函数算法处理 `C:\Users\Alice\notes\doc.md`,结果为 `file://C%3A%5CUsers%5CAlice%5Cnotes%5Cdoc.md`,URL 解析器直接报 `Invalid URL`;Windows 的内容页面路径和图片目录均经过此函数,因而页面载入及本地图片解析受影响。本轮验证的是路径转换与 URL 解析,Windows 应用运行仍未验证。方向:按平台处理驱动器、UNC 和规范化路径,生成合法 file URL,并让路径围栏使用对应的反向转换。证据:`/tmp/ely-c143-r1-logs/file-url.log`。
|
||||
|
||||
apps/ely-mark/web/src/main.js:128 — 新模式异步构建期间 `current` 为 null,后续模式请求直接返回,用户最后选择的模式被丢弃。真 CEF 页面从源码模式连续调用 `ely.mode('visual')`、`ely.mode('preview')`,第二次调用返回 undefined,最终页面模式为 visual。相同路径可由快速连续的 Cmd+1、Cmd+3 触发。方向:保留最新模式请求和对应文本修订,使构建完成后呈现最后一次选择,并覆盖构建中的连续切换。证据:`/tmp/ely-c143-r1-logs/reviewprobe.log` 的 `mode_race`。
|
||||
|
||||
tests/scripts/mark-modes.sh:122 — “新建为空文档”的检查只等待 visual 模式日志,缺少内容断言,支撑不了 TASKS.md 的空文档验证声明。隔离副本把 `Desk::on_new` 的空字符串改成 `REVIEW_NONEMPTY\n`,重新构建后完整脚本仍输出 `ok: mark modes`、退出码 0。方向:对新建标签的实际空内容做断言,让非空初始化变异触发失败。证据:`/tmp/ely-c143-r1-logs/new-mutation.diff`、`mark-modes-new-mutation.log`;原实现的 mark-modes.sh、mark-content.sh、mark-session.sh 均独立通过,相关五个 crate 单测共 140 通过、1 忽略,Doc/Table/Show/PDF/Mark 调用点编译检查通过。
|
||||
|
||||
crates/ely-web-content/src/handlers.rs:501 — 文件实测 507 行,违反 agents.md 的每文件 500 行上限。方向:拆出完整的一组 CEF handler 职责,使各源码文件符合行数上限。
|
||||
|
||||
crates/ely-office/src/rename.rs:29 — `Renaming: Host` 为全部 Host 引入通用扩展 trait,经 lib.rs 和 prelude 公开,产品调用者实际只有 `apps/ely-mark/src/desk.rs`,违反 agents.md 的“无第二个使用者的抽象”约束。全项目调用点扫描确认其他文档应用沿用 FILE 命令表,只有 Desk 调用该 trait 的 rename。方向:将 Mark 专属的改名流程落实到 Desk,保留 ely-files 的平台原子改名函数。
|
||||
@@ -1,9 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/main.js:100 — 跨模式撤销调用 changed,把刚建立的 forward 链当作新编辑销毁,丢失重做历史,违反 PRD §14.3。真窗口打开 `Alpha.\n`,可视模式键入 `v`,源码模式键入 `s`,返回可视;Cmd+Z 后保存得到 `vAlpha.\n`,Shift+Cmd+Z 后保存仍为 `vAlpha.\n`,预期恢复 `svAlpha.\n`。隔离副本将历史跳转与新编辑的报告分开后,同一操作恢复 `svAlpha.\n`。方向:历史跳转保留重做链,仅新的内容编辑截断重做分支,并覆盖跨模式撤销、重做。证据:`/tmp/ely-c143-r2-logs/redo.json`、`redo-repair.json`、`repair.diff`。
|
||||
|
||||
apps/ely-mark/web/src/main.js:127 — back 指向该模式的旧编辑器,形成按模式分开的历史,破坏本文件编辑事务的撤销顺序(PRD §14.3)。真窗口可视模式键入 `v`、源码模式键入 `s`,在源码连续撤销两次并保存,仍为 `vAlpha.\n`,较早的可视编辑无法撤销;另一路径返回可视撤销 `s`,再切源码并撤销,落盘反而从 `vAlpha.\n` 变回 `svAlpha.\n`,恢复了已撤销的编辑。方向:按本文件实际编辑顺序连接历史与修订,让两种编辑器的历史边界共同推进同一条时间线,覆盖切换后的连续撤销。证据:`/tmp/ely-c143-r2-logs/linear.json`、`reverse.json`。
|
||||
|
||||
apps/ely-mark/src/rename.rs:130 — 将 Open::Focus 当作新登记赋给发起标签,导致两个可写标签共享文件和登记号,违反 PRD §6.1 的同文件会话规则。隔离副本仅在文件系统改名成功后、完成回调前延迟两秒:发起 `a.md → closed.md`,期间通过正常 open_file 打开 `closed.md`;完成后实测 `tabs=2`,两个标签路径均为 `closed.md`、registry 均为 `Some(1)`。关闭任一标签还会删除另一标签共用的登记。上一轮“关闭发起标签后产生孤立登记”的复现已通过,本项是目标在异步间隙被另一标签打开的竞争。方向:改名期间保留目标身份的占用,并一致地迁移文件会话登记;完成回调遇到已有目标会话时处理其归属与待保存内容,避免复用其登记号创建第二个可写会话。证据:`/tmp/ely-c143-r2-logs/rename-owner.log`、`rename-closed.log`。
|
||||
|
||||
apps/ely-mark/web/src/main.js:142 — shown 回报的异步确认回来后,直接执行旧 asked 请求;期间正常发起的新模式请求既未清除它,完成回调也未重核 latest,最后一次选择仍可能被覆盖。真 CEF 探针将回报确认延迟 300 毫秒:从源码请求可视,构建中请求预览,可视挂载后、确认前再请求源码;页面先报告源码,随后被旧预览请求覆盖,最终 mode 为 preview。隔离副本在新请求时清除旧排队请求、确认回来时核对代次后,同一探针最终为 source。方向:所有模式请求共享递增代次,异步确认与构建完成都只落实最新请求,并覆盖确认期间的三次连续切换。证据:`/tmp/ely-c143-r2-logs/asked-native.log`、`asked-repair.log`、`repair.diff`。原版 mark-modes.sh、mark-content.sh、mark-session.sh 均独立通过;相关五个 crate 单测 142 通过、1 忽略,Doc/Table/Show/PDF/Mark 编译检查通过。上一轮新建非空变异已使脚本失败;Windows 驱动器与 UNC URL 单测通过;handlers.rs 为 424 行;Renaming 扩展 trait 已移除。源码散列核对一致,隔离源码副本与构建目录均已在写结论前删除;完整验证记录为 `/tmp/ely-c143-r2-logs/verification.log`。
|
||||
@@ -1,7 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/main.js:87 — 模式切换销毁当前编辑器,时间线只记录离开时的正文,编辑器内部撤销产生的重做历史随之丢失,违反 PRD §14.3。真窗口打开 `Alpha.\n`,源码模式键入 `v`、Cmd+Z 撤销,切预览再回源码,Shift+Cmd+Z 后保存仍为 `Alpha.\n`,预期 `vAlpha.\n`;可视模式同样失败。对照组直接撤销、重做并保存得到 `vAlpha.\n`。第二轮跨模式跳转后的重做与连续撤销场景已通过,本项覆盖编辑器内部撤销后的模式切换。方向:将编辑器内的编辑、撤销和重做纳入文件的内容历史,切换时保留历史游标与可重做事务,并增加两种编辑模式经预览返回后的重做断言。证据:`/tmp/ely-c143-r3-logs/local-redo.json`、`visual-redo.json`、`local-redo-control.json`、`r2-redo.json`、`r2-linear.json`、`r2-reverse.json`。
|
||||
|
||||
crates/ely-files/src/session/registry.rs:101 — 原路径消失时使用首次登记的文件身份判重;正常原子保存已更换文件身份,改名间隙因此再次建立可写会话,违反 PRD §6.1。真窗口打开 `a.md`、Cmd+S 保存一次、改名为 `b.md`;隔离副本仅在文件系统改名成功后延迟完成回调两秒,期间经正常 `open_file` 打开 `b.md`。完成后两个标签都指向 `b.md`,登记号分别为 `Some(0)`、`Some(1)`。首次打开后直接改名的第二轮场景已有一个标签;保存后再改名仍失败。独立单测经 `Session::load`、`save`、`rename_new`、`Sessions::open` 同样得到 `Fresh(1)`,预期 `Focus(0)`;改名前刷新当前文件身份后,单测和真窗口竞争均保持一个会话。方向:让登记中的身份随原子保存更新,改名前占用实际文件身份并在完成时迁移,覆盖保存后改名期间打开目标的竞争。证据:`/tmp/ely-c143-r3-logs/rename-native.log`、`rename-refresh.log`、`saved-rename-unit.log`、`saved-rename-refresh.log`、`rename-probe.diff`、`rename-refresh.diff`。
|
||||
|
||||
apps/ely-mark/web/src/main.js:98 — 旧 `shown` 确认回调先读取并清空共享 `asked`,随后才检查请求代次,会删除较新构建期间排队的模式请求,违反 MARK-02。真 CEF 探针在隔离副本仅注入预览构建完成延迟 500 毫秒、可视 `shown` 确认延迟 300 毫秒:从源码请求可视并排队预览,可视等待确认时切源码,随后请求预览并立即再请求源码;旧可视确认在较新预览完成前清空排队的源码请求,最终显示预览。将代次检查移到读取与清空 `asked` 之前,同一探针最终显示源码。第二轮三次切换的原版断言已通过,本项覆盖旧确认与较新构建重叠。方向:旧回调在代次失效时直接退出,每个构建只读取和清理属于自己的排队请求,并增加上述连续请求回归。证据:`/tmp/ely-c143-r3-logs/asked-native.log`、`asked-repair.log`、`asked-probe.diff`、`asked-latency.diff`、`asked-repair.diff`。原版 `mark-modes.sh`、`mark-content.sh`、`mark-session.sh` 均独立通过,五个相关 crate 单测 143 通过、1 忽略,Doc/Table/Show/PDF/Mark 编译检查通过;完整记录为 `/tmp/ely-c143-r3-logs/verification.log`。原项目 854 个文件的散列保持一致,隔离源码、副本依赖、CEF 缓存与独立构建目录已在写结论前删除。
|
||||
@@ -1,13 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/visual.js:116 — 搜索行定位只把光标放到所属块的起点,丢失块内行位置(MARK-10)。复现:b.md 为 `# Other\n\nFirst line.\nwords too\n`,搜索 words,打开第 4 行结果,键入 Q 后保存。真窗口探针得到 `# Other\n\nQFirst line.\nwords too\n`,应改动的命中行保持原样。原 mark-places.sh 通过,把其样本改为这个多行段落后,现有保存断言报 FAIL。修复方向:把命中行的源码偏移映射到块内对应选区;覆盖多行段落、列表与代码块。
|
||||
|
||||
apps/ely-mark/web/src/main.js:85 — 可视及预览模式剥离 YAML front matter 后,直接沿用正文编辑器的 line 方法,传入的全文行号缺少偏移换算(MARK-10)。复现:文档为 `---\ntitle: Test\n---\n# Heading\n\nneedle here.\n\n# Other\n\nother paragraph.\n`,打开第 6 行 needle 的搜索结果。真实 CEF 的 `ely.reveal({line:6})` 把选区放到 other paragraph.;第 4 行 Heading 的定位也落到 Other。修复方向:在全文与正文之间换算行号,并处理位于 front matter 内的命中。
|
||||
|
||||
apps/ely-mark/web/src/visual.js:94 — 大纲只读取 heading 节点;preserve.js:72 将需要保留写法的标题替换成 ely_raw 后,其标题语义丢失(MARK-05)。复现:打开合法 CommonMark `# Heading #\n\nBody.\n`。真实 CEF 显示 visual、fallback false,但发送的 outline items 为 [],按标题跳转回报 nothing at {"heading":0}。修复方向:保留原始标题信息及其与编辑节点的位置对应,使原文保留的标题同样进入大纲并可跳转。
|
||||
|
||||
apps/ely-mark/src/side.rs:45 — 观察 Desk 时只重绘,当前文件搜索结果没有随活跃标签改变,也没有按标签身份作废(MARK-10)。复现:在 b.md 的 This file 范围搜索 words,切到 a.md;真窗口 AX 仍显示 b.md 的 Qwords too,并继续标示 This file。激活该结果会打开旧标签。修复方向:活跃标签变化时重新执行当前文件查询,后台回包同时校验查询代次与所属标签。
|
||||
|
||||
apps/ely-mark/src/side.rs:120 — 文件读取或解码失败后仅写日志并 continue,随后把其余命中作为正常搜索结果展示,用户看不到搜索范围有缺漏(agents.md 规则 2、MARK-10)。复现:打开含可读文件及 bad.md 的文件夹,令 bad.md 内容为 words 并 chmod 000,再搜索 words。真窗口日志出现 Permission denied,AX 只显示其余文件的命中,缺少失败提示;非 UTF-8 文件也走同一条路径。修复方向:将失败文件与原因返回界面,经现有错误反馈显示本次搜索的失败情况。
|
||||
|
||||
apps/ely-mark/src/desk.rs:73 — 最近列表按标签 id 只登记一次,同一会话重命名或另存后的新路径无法更新记录(MARK-05)。复现:mark-modes.sh 真窗口把 doc.md 重命名为 moved.md 并成功继续保存;读取 recent.json,仍只有 doc.md,moved.md 缺失。重启后的最近项因此指向已消失的文件。修复方向:按会话当前路径更新最近项,改名成功时迁移旧路径。独立构建后 mark-places.sh、mark-modes.sh、mark-session.sh、mark-content.sh 通过;ely-mark 8 项、ely-files 108 项、ely-tree 110 项单测通过,这些现有门缺少上述失败场景。
|
||||
@@ -1,7 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/visual.js:153 — 搜索定位把源码中的命中次数直接对应到编辑器文本,链接地址等源码内容会打乱次序,随后静默落到块首(MARK-10)。复现:文件内容为 `# Other\n\nwords [link](words)\nwords too\n`,搜索 words,打开第 4 行结果,键入 Q 并保存。把此样本放入 mark-places.sh 后,真窗口测试失败,实际文件为 `# Other\n\nQwords [link](words)\nwords too\n`;目标行保持原样。修复方向:按命中行的源码位置映射到编辑节点,正确处理链接属性、格式标记与可见文本的对应关系,并增加该多行链接回归。上一轮六项原始场景已通过 mark-places.sh、mark-modes.sh;mark-content.sh、mark-session.sh、cargo check --workspace、ely-mark 8 项、ely-files 108 项及 ely-ui 21 项单测也通过。失败日志:`/tmp/ely-c144-r2-logs-enj2h8k5/places-url.log`。
|
||||
|
||||
apps/ely-mark/web/src/preserve.js:80 — 原文保留只保存顶层 heading 的级别,引用或列表块中的标题转换成 ely_raw 后丢失大纲语义(MARK-05)。复现:打开 `> First.\n>\n> Setext\n> ======\n>\n> Last with [[Wiki]].\n`,真实 CEF 回报 visual、fallback false,大纲 items 为 [];`ely.reveal({heading:0})` 回报 nothing at。切到源码后同一文件的大纲包含 Setext。把 mark-places.sh 的 Beta 标题及后续段落放入引用块,真窗口大纲跳转保存断言同样失败,Beta 保持原样;普通引用块中的标题控制样本可以跳转。修复方向:保留原文块内全部标题及对应源码位置,使可视与预览大纲能够列出并定位内部标题,增加引用与列表中的保留块回归。证据:`/tmp/ely-c144-r2-logs-enj2h8k5/reveal3.log`、`places-nested.log`。
|
||||
|
||||
apps/ely-mark/src/rename.rs:138 — 重命名成功后更新标签和最近项,文件树与文件夹搜索继续使用旧的 folder.files 快照(MARK-05、MARK-10)。复现:打开含 a.md 的文件夹及该文件,在窗口内重命名为 moved.md。磁盘只剩 moved.md,真窗口 AX 标签为 moved.md,AXRow 仍为 a.md;激活旧树行并按 Enter,应用报 `a.md did not open: No such file or directory`。窗口一直保持激活时,此路径持续失效。修复方向:成功重命名后同步刷新当前文件夹清单及相关搜索状态,增加打开文件夹后的重命名导航回归。证据:`/tmp/ely-c144-r2-logs-enj2h8k5/rename-after.ax`、`rename.err`。
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/visual.js:135 — 搜索定位的两处计数采用不同的重叠规则:前文用 split 计数,nth 每次前进一个字符,导致光标落在前一行(MARK-10)。复现:文件为 `# Other\n\nbanana\nana too\n`,搜索 ana,打开第 4 行结果,键入 Q 并保存。真窗口实际保存为 `# Other\n\nbanQana\nana too\n`,第 4 行保持原样。修复方向:统一前文计数与节点内定位的匹配规则,增加重叠子串跨行回归;隔离副本中让 nth 按查询长度前进后,真实 CEF 编辑结果为 `# Other\n\nbanana\nQana too\n`。证据:`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/mark-overlap.log`、`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/nav-dom.log`、`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/nav-repair.log`。
|
||||
|
||||
apps/ely-mark/web/src/visual.js:160 — 源码中链接地址的搜索命中直接使用编辑器内下一处可见匹配,定位跨到另一行(MARK-10)。复现:文件为 `# Other\n\n[link](words)\nwords too\n`,搜索 words,打开第 3 行的 `[link](words)` 结果,键入 Q 并保存。真窗口实际保存为 `# Other\n\n[link](words)\nQwords too\n`,目标链接地址保持原样;真实 CEF 的 visual、fallback false 控制样本同样复现。修复方向:按目标源码行及命中位置映射编辑节点,链接地址等隐藏命中转源码精确定位,并增加该回归。证据:`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/mark-hidden-url.log`、`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/nav-dom.log`。上一轮三项原始场景已复核通过;mark-places.sh、mark-modes.sh、mark-content.sh、mark-session.sh、嵌套 Setext 标题变体、cargo check --workspace、ely-mark 8 项、ely-files 108 项及 ely-ui 21 项单测均通过。原源码 596 个文件散列一致,隔离副本及其构建目录已于写入结论前删除;检查记录:`/var/folders/g4/sj7njkr93jz0rgmg0b_zqnvr0000gn/T/ely-c144-r3-logs-p_gj2rg_/summary.log`。
|
||||
@@ -1,11 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/finding.rs:95 — 查找面板全窗口共用,各标签网页各自保留查询;替换直接调用当前网页的旧查询。复现:A、B 均为 `alpha beta`;A 设置 `alpha → X`,切 B 设置 `beta → Y`,再切 A 点击“Replace all”。面板显示 `beta → Y`,A 保存结果却为 `X beta`,应为 `alpha Y`(MARK-06)。真实窗口证据:`/tmp/ely-c145-r1-logs-5o5drxqq/tabs.log`;副本中替换前同步当前面板规格后,同一操作得到 `alpha Y`。修复方向:标签激活时同步查询与结果状态,查找步进及替换核对当前面板规格,消除过期的标签查询。
|
||||
|
||||
apps/ely-mark/src/finding.rs:50;apps/ely-mark/web/src/find.js:62、101 — 替换字段每次变化调用 seek,两种编辑器的 seek 都执行“下一个命中”,导致输入替换文本移动当前目标。复现:可视文档 `alpha beta alpha beta alpha`,搜索 `alpha` 选中第一处,在替换字段连续输入 `XY` 后执行单处替换,结果为 `alpha beta alpha beta XY`(MARK-06)。CEF 日志依次报告 current 为 0、1、2,见 `/tmp/ely-c145-r1-logs-5o5drxqq/probe-final.log`;副本只在搜索条件改变时移动命中后,结果为 `XY beta alpha beta alpha`。修复方向:更新替换文本时保留命中选区,把查询更新与显式步进分开,并覆盖两种模式的逐字符输入测试。
|
||||
|
||||
apps/ely-mark/web/src/source.js:61 — 图片 alt 直接拼入 Markdown,文件名中的方括号与反斜杠未经转义。复现:在已保存文档的源码模式拖入 `a]b.png`,attach 使用文件 stem `a]b`,生成 `![a]b](assets/a%5Db.png)`;切预览显示原文,图片节点为 0(MARK-07)。CEF 插入入口的实际文本与渲染结果见 `/tmp/ely-c145-r1-logs-5o5drxqq/probe-final.log`;副本转义 alt 后生成 `![a\]b](assets/a%5Db.png)`,预览出现图片节点。修复方向:正确转义 alt 的 Markdown 特殊字符,补充特殊文件名附件的保存与预览回归。
|
||||
|
||||
apps/ely-mark/src/attach.rs:106、120 — 后台复制捕获原目录,完成后直接向已经移动目录的文档插入 `assets/<name>`。复现:拖入复制较慢的图片,在复制完成前将文档另存到另一目录;图片落在旧目录的 assets,相对链接按新目录解析,图片缺失(MARK-07)。延迟文件读取探针调用真实 attach、moved 路径,得到 `before`;旧目录有图片、新目录为空,CEF 报资源请求被拒绝,见 `/tmp/ely-c145-r1-logs-5o5drxqq/race.log`、`race.err`。副本增加目录身份核对后,过期操作保留 `before`。修复方向:绑定发起时的文档路径与目录身份,完成时核对;路径变化须显式中止,或把资源迁入当前目录后再插入有效链接,并加入延迟复制期间另存的测试。
|
||||
|
||||
tests/scripts/mark-tools.sh:136;tests/scripts/drop.swift:1;/Users/zacharyzhang/Documents/GitHub/Ely-GPUI-Components/src/buttons/group.rs:55、218 — 四处注释分别为 11、13、11、17 个英文单词,超过本轮明确要求的十词上限;组件文件已核对为 8f4729c。按空白分词即可复现,其中 drop.swift 的首行是 `Drags a file from a small window and drops it at x, y.`。修复方向:删去多余注释或压缩至一行十词以内,并让源码规则检查覆盖脚本与本轮组件改动。
|
||||
@@ -1,7 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/find.js:112、125 — 空查询仍调用 CodeMirror 的 findNext;该命令会为无效查询打开自带查找面板,clear 也留下这个面板。复现:打开文档,切源码,按 Cmd+F,保持查询为空;窗口顶部出现 Ely 查找框,底部同时出现 CodeMirror 的 Find/Replace 面板。按 Esc 后顶部查找框关闭,底部面板继续占据正文区域。真实窗口截图已检查,原始状态与关闭后的 panels=1 见 `/tmp/ely-c145-r2-logs-f2qn59cz/native.err`;副本按查询有效性守卫命令后,同一路径始终 panels=0,见 `native-patched.err`。修复方向:空查询及无效查询只更新搜索状态,各步进、替换入口先核对查询有效性,关闭操作完整清除查找界面;加入空查询、清空字段和 Esc 的窗口回归。
|
||||
|
||||
apps/ely-mark/web/src/find.js:24 — 正则校验使用无标志的 RegExp,两种编辑器实际使用带 Unicode 标志的正则,导致部分编译错误被回报为零命中。复现:源码模式搜索 `a{` 并开启正则,界面显示 No results;实际查询因 Incomplete quantifier 无效。搜索 `\a` 同样被编辑器拒绝,两种模式的回报均为 current=null、total=0,缺少 error,见 `/tmp/ely-c145-r2-logs-f2qn59cz/regex-state.log`、`probe.log`。副本按实际编辑器的标志校验后,窗口显示编译错误,两种模式均回报 Invalid escape,见 `patched-probe.log`。修复方向:让错误校验与编辑器采用相同的正则编译规则,显式显示编译失败,并覆盖这类受 Unicode 标志影响的表达式。
|
||||
|
||||
tests/scripts/comments.py:59 — 跨行块注释检测只覆盖 C/H,新增的 JavaScript 扫描会漏过跨行块注释。复现:在隔离副本的 find.js 末尾加入两行 `/* A comment` 和 `spanning lines. */`,运行 comments.py,退出码仍为 0,并声称全部注释均为单行,违反本轮明确要求。原始检查与扩展检测后的失败结果见 `/tmp/ely-c145-r2-logs-f2qn59cz/comments-mutation.log`。修复方向:覆盖 JavaScript 的跨行块注释,增加该变异必须失败的回归检查。
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/find.js:54 — 零宽正则命中后仅前进一个 UTF-16 单元;落到代理对中间时,Unicode 正则会再次返回前一个位置,循环持续收集同一命中,耗尽内存并使页面进程崩溃。复现:打开正文为 U+1F600 字符后接 ` alpha` 的文档,在可视模式开启正则并搜索 `(?=.)`;实际 CEF 探针停在 `before unicode seek`,随后报告 `TS_PROCESS_CRASHED`,V8 日志显示约 4 GB 堆分配失败。实际 docFinder 的 Node 探针也超时;副本按 Unicode 字符边界推进后,真窗口返回 7 个命中并完成。证据:`/tmp/ely-c145-r3-logs-v1e5g43e/native-baseline.out`、`native-baseline.err`、`native-patched.out`、`zero-width-node.log`。修复方向:让命中枚举始终向前推进并遵守 Unicode 字符边界,加入含代理对字符的零宽正则回归,验证查找完成与页面存活。
|
||||
|
||||
tests/scripts/comments.py:59 — 跨行块注释检测要求注释起点位于行首,仍漏过代码之后开始的 JavaScript 块注释。复现:在副本 find.js 末尾加入 `const marker = 1 /* A comment`,下一行为 `spanning lines. */`;运行 comments.py 返回 0,并声称全部注释均为单行,违反本轮单行注释规则。扩大起点检测的副本对同一变异返回 1;既有 comments-rules.sh 仅覆盖行首起点。证据:`/tmp/ely-c145-r3-logs-v1e5g43e/comments-inline.log`、`comments-inline-patched.log`。修复方向:识别代码行后的真实块注释起点,加入该跨行变异必须失败的回归检查。
|
||||
@@ -1,13 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/compare.rs:93 — 比较结果使用旧磁盘内容,却通过 `session.reload()` 接受当前磁盘指纹,随后自动保存会覆盖比较期间的新修改,违反 §14.4、FILE-05、QA-22。真窗口复现:基线为 `base\n\nend\n`,本地插入 `X`,外部追加 `tailA`,打开 Compare;外部再把末段改为 `tailB`,等待监听确认第二次变更后点击 Use the Merge。最终磁盘为 `Xbase\n\nend\n\ntailA\n`,`tailB` 丢失。证据:`/tmp/c146-stale2-1.log`、`/tmp/c146-probes-extra.log`。修复方向:比较快照携带对应磁盘指纹与本地修订,提交前核对;变化时重新比较,并让写入检查使用参与比较的指纹。`outside.rs` 的异步读取与重载也须保持内容和指纹配对。
|
||||
|
||||
apps/ely-mark/src/restore.rs:194 — 有路径文件的恢复内容直接进入原文件会话,下一次编辑会自动覆盖原件,违反 §6.3 的“恢复生成新副本,不先覆盖源文件”。真窗口复现:原件为 `ORIGINAL\n`,崩溃恢复点为 `RECOVERED\n`;重启恢复后原件仍为 `ORIGINAL\n`,键入 `X` 并等待自动保存,原件变为 `XRECOVERED\n`。证据:`/tmp/c146-recovered-1.log`、`/tmp/c146-probes.log`。修复方向:将恢复内容打开为独立恢复副本,保留原件身份与内容;写回原件需经过明确选择和外部变更检查。现有脚本只验证未命名文档的崩溃恢复,遗漏此路径。
|
||||
|
||||
apps/ely-mark/src/restore.rs:98 — 原路径无法 canonicalize 时直接跳过标签,已读出的有效恢复内容随之丢失,违反 MARK-12 和 §14.4。复现:文件有未保存文本并生成恢复点,外部删除原件后终止应用;重启时该标签及其恢复文本均被跳过。独立执行 `deleted_original_keeps_recovered_text`,实际等待恢复标签数为 0,期望为 1;在隔离副本中将缺失原件的有效恢复内容保留为无路径副本后,同一探针通过。证据:`/tmp/c146-mark-tests.log`、`/tmp/c146-deleted-repair.log`。修复方向:区分原件不可访问与恢复内容可用,保留有效恢复内容并提供另存入口;将原路径读取错误呈现给用户。
|
||||
|
||||
apps/ely-mark/src/restore.rs:280 — 退出开始时将 `keeping.leaving` 永久置为 true,取消退出后仍持续跳过会话清单写入,违反 MARK-12。真窗口复现:新建并输入 `first`,Cmd+Q 后 Cancel;再新建并输入 `second`,等待超过 10 秒。两个标签均已生成恢复点,`session.json` 仍只记录 Untitled 1;终止并重启后只恢复一个标签,第二份文本失去恢复入口。证据:`/tmp/c146-cancelled-restart.log`、`/tmp/c146-cancelled3-2.log`。修复方向:取消退出或关闭流程时解除清单冻结,并更新实际存活标签;已完成的放弃操作同步移除对应恢复记录。
|
||||
|
||||
apps/ely-mark/web/src/main.js:157 — 恢复光标只调用 `current.line(place.line, '')`,`Place` 也仅保存行号和滚动值,行内光标位置丢失,违反 MARK-12。真窗口复现:源码为 `abcdef\n`,将光标置于 `abcd|ef`,等待位置上报后正常退出;重启并键入 `X`,保存结果为 `Xabcdef\n`,期望为 `abcdXef\n`。证据:`/tmp/c146-caret-2.log`、`/tmp/c146-probes.log`。修复方向:位置上报、会话序列化与编辑器恢复共同保存并还原完整光标位置;增加行内位置的重启回归检查。
|
||||
|
||||
apps/ely-mark/src/compare.rs:81 — Keep Yours 成功解决冲突后,保留了被 `external_modified()` 停止的自动保存策略,后续编辑持续无法按 §6.2 在输入停止 1 秒后保存。真窗口复现:本地输入 `X`,外部写入触发冲突,Compare → Keep Yours,保存得到 `Xbase\n`;再输入 `Z` 并等待 3 秒,磁盘仍为 `Xbase\n`;Cmd+S 后得到 `XZbase\n`,确认新编辑已在文档中。证据:`/tmp/c146-stopped3-1.log`、`/tmp/c146-probes-verify.log`。修复方向:显式冲突解决成功后重新建立自动保存策略,并与已保存修订及后续编辑同步。现有 `mark-outside.sh` 在 Keep Yours 后进入合并流程,合并分支重建策略,掩盖了该缺陷。
|
||||
@@ -1,11 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/compare.rs:106 — Keep Yours 在异步导出完成后调用无条件覆盖的 `keep_mine`,比较指纹仅在点击时核对,第一轮的并行写入缺陷仍有窗口,违反 FILE-05、§14.4、QA-22。复现:基线为 `base\n\nend\n`,本地插入 X,外部追加 tailA;Compare → Keep Yours 后、导出完成前,外部写入 tailB。在隔离副本中仅给后台导出加入 750 毫秒延迟,最终磁盘为 `Xbase\n\nend\n`,新写入的 tailB 丢失。证据:`/tmp/c146r2-slowmine-result.log`。将比较指纹设为受检保存的基线并走普通保存后,同一探针保留 tailB,见 `/tmp/c146r2-slowmine-repair-result.log`。修复方向:把选定快照的指纹带到导出完成后的实际写入检查,遇到后续变化重新比较;Keep Yours 也须走该受检路径。
|
||||
|
||||
apps/ely-mark/src/restore.rs:184 — 所有无路径恢复项都匹配任意无路径标签,且 `Desk::observed` 在每次 Reported 后调用 `restore_shown`;一个标签会连续消耗多份恢复文本,违反 MARK-12、§6.3。真窗口复现:两个合法恢复槽分别含 `FIRST\n` 和 `SECOND\n`,重启时日志连续两次记录 `restores tab 1 as source`;第二份正文覆盖第一份,另一标签为空。等待 10 秒后,清单只引用第二个恢复槽和一个新的空标签槽,FIRST 的旧槽被 sweep 删除。证据:`/tmp/c146r2-multirestore3-result.log`、`/tmp/c146r2-multirestore3-1.log`。隔离副本限制每个标签只恢复一次后,两份正文均保留,见 `/tmp/c146r2-multirestore-fullrepair-result.log`。现有 `mark-outside.sh` 仅统计恢复提示数量,此场景仍能满足两条提示。修复方向:创建恢复标签时绑定恢复槽与唯一标签 ID,按该身份消费一次,并逐份断言重启后的正文及所属标签。
|
||||
|
||||
crates/ely-office/src/dialogs.rs:109 — 未保存询问的 Save 分支继续关闭流程;后续系统保存面板取消时,`save.rs:187` 仅写日志,`close_cancelled` 没有被调用,ElyMark 的 `keeping.leaving` 持续为 true,第一轮的清单冻结缺陷仍存在,违反 MARK-12。真窗口复现:新建并输入 first,Cmd+Q,按 AXButton 角色定位询问中的 Save,取消系统保存面板;再新建并输入 second,等待 12 秒。AX 有两个标签、两份恢复点已写入,session.json 仍只记录 Untitled 1;终止并重启仅恢复第一份。证据:`/tmp/c146r2-savecancel-button-result.log`、`/tmp/c146r2-savecancelbutton-2.log`。保存面板取消时调用关闭取消钩子后,清单记录两个标签,见 `/tmp/c146r2-savecancel-button-repair-result.log`。修复方向:关闭流程所有后续取消与失败出口统一结束关闭状态,并恢复会话清单更新;增加 Save → 系统面板 Cancel 的重启回归。
|
||||
|
||||
apps/ely-mark/src/desk.rs:75 — 取消退出只解除 leaving 标记,已放弃标签的清单记录与恢复槽仍等到下一次十秒定时任务才删除,违反 §6.2 的显式放弃契约,也违背 TASKS.md 的“随即删去”声明。真窗口复现:恢复含 FIRST 的 Untitled 1,再新建含 SECOND 的 Untitled 2;Cmd+Q,对第一个标签选 Don't Save,对第二个选 Cancel,立即终止应用。此时清单与恢复目录仍保留第一个标签;重启显示 Untitled 1 的恢复提示,已放弃内容再次返回。证据:`/tmp/c146r2-discarded2-result.log`。隔离副本在取消关闭时立即同步实际标签与恢复槽,同一探针只恢复 Untitled 2,见 `/tmp/c146r2-discarded2-repair-result.log`。修复方向:完成放弃或关闭时立即持久化结果并清理对应恢复槽,处理在途恢复任务,保证随后崩溃也遵守放弃结果。
|
||||
|
||||
apps/ely-mark/src/view.rs:28 — 新增 column 为必填反序列化字段,第一轮已写出的合法 `{line, scroll}` 光标记录会导致整个应用启动失败,违反 MARK-12。复现:session.json 保留有效文件路径、source 模式和 `place: {"line": 1, "scroll": 0}`,运行当前已构建的 ElyMark;进程退出码为 1,报 `missing field column`,标签和正文均未打开。证据:`/tmp/c146r2-oldplace.log`。在隔离副本兼容旧记录的缺列字段后,同一格式恢复为 source,原件字节保持 `abc\n`,见 `/tmp/c146r2-oldplace-repair-result.log`。修复方向:为既有会话格式迁移新增列字段,保留已有标签、正文、模式、行号和滚动位置,并加入第一轮会话文件的启动回归。
|
||||
@@ -1,7 +0,0 @@
|
||||
FAIL
|
||||
|
||||
crates/ely-office/src/save.rs:332 — 退出保存冲突框的 Keep Mine 仍调用无条件覆盖的 `save_overwrite`,导出期间的新外部写入会被覆盖,违反 FILE-05、§14.4、QA-22。真窗口复现:基线 `base\n\nend\n`,本地插入 X,外部追加 tailA;Cmd+Q → Save → Keep Mine,在导出完成前外部改成 tailB。隔离副本仅给 `Mark::write` 加入 750 毫秒延迟,最终磁盘为 `Xbase\n\nend\n`,tailB 丢失,应用退出。同样延迟下 Compare → Keep Yours 能保留 tailB。证据:`/tmp/c146r3-slowclosemine-result.log`、`/tmp/c146r3-slowmine-result.log`。修复方向:退出冲突的保留本地分支也携带选定磁盘版本的指纹,走受检保存,在实际写入时遇到新变化继续报冲突。隔离副本改为指纹基线加普通保存后,tailB 保留且应用停留在冲突询问,见 `/tmp/c146r3-slowclosemine-repair-result.log`。
|
||||
|
||||
crates/ely-office/src/dialogs.rs:132 — Reload from Disk 分支丢弃挂起的 `then`,重开标签后退出流程停止,ElyMark 的 `keeping.leaving` 持续为 true,会话清单冻结,违反 MARK-12。真窗口复现:有路径文档输入本地内容并发生外部冲突,Cmd+Q → Save → Reload from Disk;随后新建并输入 AFTERRELOAD,等待超过十秒。恢复点已包含 `AFTERRELOAD\n`,session.json 仍仅记录原文件;终止并重启后,新正文失去恢复入口。证据:`/tmp/c146r3-conflictreload-result.log`。修复方向:Reload 分支明确结束挂起的关闭状态,调用关闭取消钩子恢复清单更新,再重开文档,并增加该路径的崩溃重启回归。隔离副本加入该钩子后清单记录两个标签,重启恢复 AFTERRELOAD,见 `/tmp/c146r3-conflictreload-repair-result.log`。
|
||||
|
||||
apps/ely-mark/src/restore.rs:336 — 退出时的冻结清单保留保存前的路径;未命名标签首次保存成功后,关闭钩子收到的是有路径标签,此分支留下旧的 `path: null`,违反 MARK-12 的打开标签恢复要求。真窗口复现:新建并输入 SAVEDTEXT,Cmd+Q → Save,在系统面板保存到新文件并完成退出。磁盘文件含 `SAVEDTEXT\n`,session.json 仍记录 Untitled 1 和 `path: null`;重启恢复标签数为 0。证据:`/tmp/c146r3-savedquit-result.log`。修复方向:按恢复槽身份,将退出期间保存成功后的路径和名称同步到冻结记录并持久化,再完成关闭;增加首次保存后退出的重启回归。隔离副本同步路径和名称后,重启恢复标签数为 1,见 `/tmp/c146r3-savedquit-repair-result.log`。
|
||||
@@ -1,17 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/export.rs:256 — PDF 导出将源文件保护参数传为 `None`,会经符号链接覆盖正在编辑的 Markdown,违反 FILE-06。真窗口复现:打开 `t.md`,创建 `alias.pdf -> t.md`,导出 PDF 到 `alias.pdf` 并确认 Replace;随后 `t.md` 的文件头变成 `%PDF-`,应用报告导出成功。修复方向:将来源会话身份带到 PDF 写入阶段,以文件身份核对目标与打开的文档,拒绝覆盖。副本加入身份检查后,相同操作显示错误并保留 `# Title` 原文。
|
||||
|
||||
apps/ely-mark/src/paper.rs:152、apps/ely-mark/src/export.rs:353 — 资源目录与图片文件名直接拼成 URL,保留字符会改变 URL 的含义,破坏 MARK-11 的带资源 HTML。实际调用 `write`:将引用 `a%23b.png` 的文档导出为 `report#1.html`,生成 `src="report#1_files/1-a#b.png"` 与 `href="report#1_files/export.css"`;浏览器将 `#` 后的内容作为片段,图片和样式路径均错误。修复方向:对资源 URL 的路径部分做百分号编码,再做 HTML 属性转义。原版复现断言失败;副本编码后断言通过。
|
||||
|
||||
apps/ely-mark/src/paper.rs:55 — 图片扫描只识别双引号的 ` src="`,遗漏合法 HTML 图片,破坏 MARK-11 的资源打包。页面实测将 `<img src='pic.png'>` 原样交给导出;对存在的 `pic.png` 调用 `inline` 后仍得到相对引用,且缺图列表为 `[]`;调用资源目录导出也会遗漏该图片。自包含 HTML 移到其他目录后丢图,PDF 的暂存页面也失去图片路径。修复方向:按 HTML 标签和属性语法解析图片来源,覆盖单引号等合法写法,并让遗漏资源进入错误结果。
|
||||
|
||||
apps/ely-mark/web/src/render.js:48 — 纯文本输出在转换时丢弃整个 HTML 原文块,导致 MARK-11 输出丢失正文。实际 CEF 页面打开 `<div>VISIBLE_RAW_TEXT</div>\n\nEND\n` 后请求纯文本,返回结果只有 `END`;HTML 输出仍包含该可见正文。修复方向:将 HTML 块中的可见文字纳入文本转换,并加入核对实际正文的导出测试。
|
||||
|
||||
apps/ely-mark/src/export.rs:324 — HTML 导出忽略渲染结果的 `failed` 列表,吞掉 Mermaid 解析错误;PDF/打印路径同样遗漏该列表,违反项目错误暴露规则及 §14.2 的语法错误要求。实际 CEF 渲染 `graph TD; A -->` 返回带行号的解析错误;真窗口 HTML 导出仅留下代码块,应用记录 `mark: exported` 并显示成功。修复方向:将图表错误及位置传递到所有输出完成路径,向用户显示失败或明确的部分输出提示,并覆盖错误图表场景。
|
||||
|
||||
apps/ely-mark/src/export.rs:187 — PDF/打印阶段丢弃 `paper::inline` 返回的缺图列表,最终以空错误列表报告成功。真窗口打开引用 `missing.png` 的文档并导出 PDF,CEF 拒绝加载暂存目录中的图片,PDF 只留下图片替代文字,应用仍记录 `mark: exported` 并显示成功。修复方向:让缺图结果随暂存、打印和最终写入传递,完成时明确报告缺失资源;输出测试应核对缺图提示。
|
||||
|
||||
apps/ely-mark/src/vcs.rs:49 — `rev-parse` 的所有失败均被转换为 `Tracked::Outside`,吞掉真实 Git 错误。实际创建仓库后将 `.git/config` 写为 `[bad\n`,Git 返回配置解析失败,`ask` 却返回 `Outside`,界面隐藏 Git 状态和错误。修复方向:识别明确的仓库外结果,其余失败保留 Git 错误并显示 `Unknown`。原版错误暴露断言失败;副本区分错误后通过。
|
||||
|
||||
apps/ely-mark/src/vcs.rs:52 — 对仓库根路径调用 `trim()`,裁掉合法路径末尾的空格,破坏 MARK-13 的 ElyTree 联动。实际在名为 `repo ` 的目录中创建仓库并打开 `t.md`,`ask` 返回的根路径变为 `repo`;点击状态项会将这个错误目录交给 ElyTree。修复方向:只移除 Git 输出的行结束分隔符,完整保留路径字符。原版路径身份断言失败;副本保留末尾空格后通过。
|
||||
@@ -1,9 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/src/export.rs:296、apps/ely-mark/src/export.rs:132 — 导出仅保护发起标签的文件身份,仍会覆盖其他已打开标签的原件,违反 FILE-06。真窗口复现:同时打开 `t.md` 与 `b.md`,选中 `t.md`,建立 `other.pdf -> b.md`,导出 PDF 到 `other.pdf` 并确认 Replace;`b.md` 的文件头变为 `%PDF-1.4`,应用报告已导出。上一轮的本标签符号链接用例已通过。修复方向:所有输出在最终写入前按文件身份核对全部打开标签;副本在 PDF 写入前加入 `holder` 检查后,同一操作显示错误,`b.md` 保持 `# Other document`。
|
||||
|
||||
apps/ely-mark/src/paper.rs:102、apps/ely-mark/src/paper.rs:66、apps/ely-mark/src/paper.rs:25 — 图片扫描仍按字符串寻找标签结束和属性名,遗漏或改错合法 HTML 图片,违反 MARK-11。真窗口导出含 `<img alt='a > b' src='assets/pic.png'>` 的文档,HTML 保留相对图片路径,缺图列表为 `[]`;移走导出文件即丢图。实际 `inline` 探针还确认:`<img alt="example src='trap.png'" src='pic.png'>` 会改写 alt 中的文字并留下真实 src;`<img src='pic.png'>` 在 `pic.png` 存在时仍报缺图。现有四项 paper 单测通过,三个新增合法 HTML 用例均失败;实际 CEF 渲染保留了这些写法。修复方向:按 HTML 标签、带引号属性和字符引用的完整语法提取并解码真实 src,覆盖上述资源打包场景。
|
||||
|
||||
apps/ely-mark/web/src/render.js:51 — HTML 原文块经 `textContent` 转成单个文本节点,丢掉块边界与换行分隔,导致纯文本输出合并正文,违反 MARK-11。实际 CEF 页面打开 `<div>ONE</div><div>TWO</div>` 后请求纯文本,得到 `ONETWO`;上一轮的 `VISIBLE_RAW_TEXT` 用例已通过。修复方向:按 HTML 的可见文本结构转换,保留块与换行的分隔;副本经 DOM 转 HAST 再取文本后,同一输入得到 `ONE TWO`。
|
||||
|
||||
apps/ely-mark/src/export.rs:167、apps/ely-mark/src/export.rs:195 — 新增缺失内容提示将含正文片段的 Mermaid 解析诊断写入日志,违反 agents.md 第 4 条“日志不含正文”。真窗口导出含 `graph TD; PRIVATE_DOCUMENT_TEXT -->` 的 Mermaid 块,WARN 日志的 `Lost` 调试值包含原文片段 `...E_DOCUMENT_TEXT -->`;同一诊断经提示组件再次出现在 INFO 日志,PDF 输出也复现。修复方向:日志只记错误类别、位置与数量,并处理提示组件记录文案的路径,使正文诊断保持在界面内。
|
||||
@@ -1,5 +0,0 @@
|
||||
FAIL
|
||||
|
||||
apps/ely-mark/web/src/render.js:43 — 图片收集只遍历 `img[src]`,遗漏 `srcset` 与 `picture/source` 的资源,并在导出后保留其相对路径,违反 MARK-11。真窗口打开含 `<img src="assets/pic.png" srcset="assets/high.png 1x">` 和 `<img srcset="assets/high.png 1x">` 的文档,两张 PNG 均存在;导出自包含 HTML、带资源目录 HTML 和 PDF,应用均显示成功。将 HTML 移到其他目录后,实际 CEF 的两个 `currentSrc` 都指向未打包的 `assets/high.png`,`naturalWidth` 均为 0;资源目录只有备用图 `1-pic.png`,PDF 只有损坏图片图标。当前 16 项单测、`mark-output.sh` 与 `mark-content.sh` 均通过。修复方向:收集并重写响应式图片的资源来源,或将所选来源归一为已打包的 `src`,同时传递缺失资源;隔离副本归一来源后,两种 HTML 的两张图片均为 1×1,PDF 也包含两张 1×1 图片。
|
||||
|
||||
apps/ely-mark/web/src/render.js:56、apps/ely-mark/web/src/render.js:58 — KaTeX 的解析诊断被丢弃,`failed` 仅包含 Mermaid 的失败,公式错误经静默回退后仍报告完整导出成功,违反错误暴露规则与 §14.2 的语法错误位置要求。真窗口导出第 3 行为 `$\privateDocumentToken$` 的文档:HTML、带资源目录 HTML、PDF 均显示 `Exported`,输出只有红色命令原文,缺少诊断与行号。实际 CEF 渲染返回 `failed: []`;同一渲染管线保留 `VFile` 时可读到第 3 行的 `parseerror` 与 `Undefined control sequence`。修复方向:保留并处理 KaTeX 的文件诊断,将错误类别和位置传递至 HTML、PDF、打印的完成路径,日志保持正文隔离,并覆盖错误公式场景;副本保留诊断后,同一 CEF 请求明确返回公式错误所在行。
|
||||
Reference in new issue
Block a user