Files
ElyOffice/tasks/TASKS.md
T
2026-10-09 01:36:29 -04:00

138 KiB
Raw Blame History

Tasks

进度真相。自上而下,逐条完成,不跳项。编号前缀是 PRD 章节号,C00 是用户指令的前置项。

每条完成后:scripts/review.sh ID 轮次 在 herdr 开新分栏,codex --yolo(gpt-6.1-sol,effort high)审查,最多三轮。有问题先修,复审通过才勾选。审查只看缺陷,不收“建议增强”。每轮结论写入 tasks/reviews/<编号>-r<轮>.md。

状态:[ ] 未做 [x] 完成且审查通过 [~] 三轮用尽,末轮缺陷已修并有回归测试,未经复审 [!] 外部阻塞,写明原因与证据,不算完成。

C00 前置

  • C00.1 工具链:cmake、ninja、pkg-config、git-lfs 就位;scripts/doctor.sh 打印版本,缺项以非零码退出 — R3 ok
  • C00.2 上游源码:scripts/fetch-references.sh 全部 pin 检出,reference/* 的 HEAD 等于 pin — R2 ok
  • C00.3 组件库研读:可复用组件、缺口、gpui 规则写入 agents.md — R3 ok
  • C00.4 引擎前置验证(§23):LOK 动态库加载与转换,MuPDF 构建并渲染一页,CEF 分发包可取,MailCore 2 依赖可构建。结果与阻塞项写入 docs/engineering-risks.md;官方 macOS 包出不了图块(R-01),出图块的证明改在 C07.1 — R5 ok(codex 复审)

C01 产品定义与平台(§1–§4)

  • C01.1 workspace 骨架(§17.1):八个 app,加当前用到的 crate(ely-ui、ely-platform;其余在各自任务建,不留空 crate);AGPL 许可字段;cargo check --workspace 通过;每个 app 开出一个 Ely 主题窗口;ELY_SMOKE=1 启动即退出的冒烟脚本 — R2 ok
  • C01.2a 打包(§4.1、§4.2):macOS .app 脚本,Linux AppImage 配方,Windows 安装脚本;卸载保留用户目录。本机验证:macOS 包构建、签名、启动;Windows 脚本经 makensis 编译;Linux 桌面文件经校验。未验证:AppImage 构建、Windows 安装与卸载的运行、正式签名与公证 — R4 ok(codex 复审)
  • C01.2b 手动检查更新、下载、离线校验;包管理器安装的版本不自行更新(§4.2)。本条只做 ely_platform::update;更新前保存编辑的提示与界面在 C05.4、C06.4 — R3 ok
  • C01.2c 图形后端初始化失败时显示原因,不留空白窗口(§4.1)。已验证(macOS):失败信息写日志、打到标准错误、弹系统对话框,以 1 退出;GPUI 启动回调里的 panic(macOS 上会 abort)经 panic 钩子走同一条路,首帧之后的 panic 仍是普通 panic;启动前探测 Metal 设备。未验证:没有 Metal 设备的机器(探测失败分支)、open_window 返回错误的分支(macOS 只对弹出窗口返回错误)、Linux 与 Windows 的后端失败(未探测,本机无 Linux C 交叉工具链) — R3 ok

C05 统一 UI/UX(§5)

  • C05.1 主题:浅色、深色、跟随系统,Omarchy Theme Sync,动效 token 与减少动效。已验证(macOS):Omarchy 自带的 22 套色板(reference/omarchy,pin f45461a)映射后满足组件库 A11yChecker 的全部规则(正文与状态色 4.5:1,焦点与图表色 3:1);colorN 形式的生成主题经回退链得到色相;运行中的应用按 Omarchy 的替换顺序跟随,无 colors.toml 时退回;覆盖开关与减少动效进入应用。Linux 与 Windows 的减少动效读取通过了目标编译(x86_64-unknown-linux-gnu、x86_64-pc-windows-msvc),未运行。未验证:Linux 上 Omarchy 默认目录的探测、gsettings 与 Windows 调用的实际结果、真实 Omarchy 机器 — R3 ok
  • C05.2 外壳:标题与标签区、左导航、内容区、右属性区、底部状态区;空侧栏不占位;窗口内转场。已验证(macOS):八应用共用 ely_ui::Shell;画廊冒烟与探针(tests/scripts/shell.sh)断言左右栏渲染与收起、one→two→one 转场、转场后键盘焦点保留、侧栏与内容区宽度(页面键不再重建内容子树);空栏占位与删栏两种变异实现均触发失败 — R3 ok
  • C05.3 命令:统一文件菜单命名、Cmd/Ctrl 语义、命令面板(UX-01、UX-02)。已验证(macOS):应用菜单在前使 File 成为独立菜单;菜单标签、菜单到动作的映射、六个命令经快捷键与菜单动作逐条触发且结果一致;面板经真实按键打开、输入查询、Enter 执行;toggle 关闭走面板自身的焦点归还。键位错接、菜单错接、绑定缺失、on_run 置空、派发丢弃五种变异均触发失败 — R5 ok
  • C05.4 交互规范:焦点与 Esc、禁用原因与混合态、长任务、失败保留输入、危险确认(UX-03 至 UX-07)。已验证(macOS):Tab 经 tab_stop 句柄按 nav→content→props→chip 顺序行进,Esc 只关当前浮层;阻塞命令菜单置灰、面板执行给出原因并 toast;混合选择显示 Mixed;长任务工作在后台执行器(范围/状态/错误/取消/重试,取消在检查点生效且错误优先);PromptDialog 校验失败保留输入与原因;ConfirmDialog 命名对象与影响并键盘可达;探针覆盖纯键盘流程,截图逐像素比对固化渲染 — R4 ok
  • C05.5 国际化与无障碍:简中与英文、非颜色表达、角色与名称、输入法与缩放(UX-08 至 UX-12)。已验证(macOS):语言探测重写(macOS preferredLanguages、Linux 首个非空优先、C/POSIX→en,单测);组件库 7380afb 起面板族文案经 i18n(内建 en/zh-CN)、对话框带角色/名称/说明、正文与校验错误可读、禁用带说明;对话框与面板 Enter 改走 key-down 动作,IME 候选确认不再提前提交,key-up-only 回归锁死且旧实现变异触发崩溃;resize 800×600 往返布局与点击断言;100%/150%/200% 与跨屏缩放需非 Retina 及多屏硬件,本机未验证(UX-10 部分) — R6 ok
  • [~] C05.6 侧栏可调宽度(用户 2026-10-08 提出:左右侧栏太占地方):八个应用共用的外壳侧栏默认变窄(左 220、右 320,原 240、380),内侧边缘可拖动(左至少 160、右至少 220,至多窗口的 45%),宽度按应用记在其设置里、重启后照旧;panels.sh 真窗口核对默认宽、拖宽、记住、重启恢复 — R1 FAIL 三项已修:拖动后立即退出丢了宽度(退出时写入未存的宽度,窗口位置同);存着的无效宽度静默当作默认(严格解析,读不出即在设置窗口写明并用默认);写入失败只进日志(设置窗口以 Banner 写明,下次拖动或退出时重试);panels.sh 加三个场景(去掉退出时写入即失败) — R2 FAIL 两项已修:一个“未保存”提示供所有保存共用,通用设置保存成功即清掉侧栏的失败(按保存种类各记各的:通用、侧栏、窗口位置,各自成功才清);侧栏重试成功后旧提示仍在(成功即清其提示);panels.sh 加交错保存与修好后重试(全部清除即失败) — R3 FAIL 两项已修(不再送审):启动时记下的读取错误在拖动写入有效宽度后仍显示(读取错误也按种类记,该种类写入成功即一并清掉);测试在设置页内容进 AX 树之前就断言提示已消失(先等页面控件出现);回归:无效宽度经拖动修好后提示消失,去掉清除即失败
  • C05.7 窄窗口版面(用户 2026-10-08 提出:缩窄窗口时控件挤成一团、越出边框):外壳一次排两侧栏,内容区至少 360,侧栏先缩后藏(room,单测);组件库 6d95b24 至 69265b4 的纵向滚动区、可折行属性行、只显示图标的分段与标签、可缩的状态栏与按钮、折行的提示条、未聚焦文本框显示开头;应用里的固定宽度改为占满且有上限;重复标签的开关只给无障碍名;tests/scripts/layout.sh 六个应用三种宽度无元素越出窗口左右并留截图 — 未送审:用户 2026-10-09 定性能已够、先发首版
  • C05.8 文档缩放(用户 2026-10-08 问 Doc、Table、Show 为何不能缩放):ely_office::Zooming,Cmd+= / Cmd+- / Cmd+0、“视图”菜单、状态栏缩放控件(组件 ZoomControl 的属主模式),Cmd+滚轮与捏合以指针为中心,25% 至 400%,ElyShow 回到适合幻灯片;单测 zooming_keeps_the_pointed_spot_and_walks_the_steps,真窗口按键记过 125%、150%、125% — 未送审:用户 2026-10-09 定性能已够、先发首版

C06 文件、保存与恢复(§6)

  • C06.1 文件会话:位置、指纹、修订号、状态机、同文件聚焦(FILE-01、02、03,§6.1)。已验证(macOS):新建 crates/ely-files;新建文件首存前无路径;加载/已保存/未保存/保存中/只读/外部已修改/加载失败/保存失败八种状态;保存票据带任务序号与加载代次,旧修订完成不清新编辑状态,重载使旧票据失效,重复与旧回调不释放他人槽位;同文件(含硬链接、符号链接)再开聚焦或只读视图,原子替换后身份实时重取,路径解析错误全部传播且登记原子;32 测试,Windows/Linux 目标编译过 — R10 ok
  • C06.2 保存:原子替换、外部修改检查、冲突流、导出独立、路径与错误(FILE-04 至 FILE-10)。已验证(macOS):暂存写入+校验+替换,失败留原文件与未保存内容;统一 save 流程先查外部修改(冲突保留两版,重载/保留本地/比较三条出路);替换保留原权限与 macOS ACL;非原子卷先排他备份(禁截断禁跟链、源权限继承、名称无界生成),探测可注入并经跨目录符号链接锁死单行回退;导出按解析后路径与 inode 拒同文件;附件导入只复制且重名候选计数器必保;空格/中文/大小写/满长文件名全过;58 测试,Windows/Linux 目标编译过。FILE-10 的解码域错误(损坏/加密/缺字体/不支持)随各引擎任务落地 — R5 ok
  • C06.3 恢复副本与崩溃恢复:10 秒、20 点、7 天、容量;内容、光标、历史分开说明;加密文档不落明文(§6.2、§6.3、§18.2)。已验证(macOS):Recovery 每点暂存发布、单任务占用、20 点/7 天/容量(超限点提交前拒绝、计量含光标)、tick 节律;RecoveryTask 后台线程每 10 秒快照、condvar 即时取消、stop/drop 都 join、状态格不被磁盘 I/O 阻塞;内容/光标/历史三恢复能力分开报告;恢复排他落盘不跟链接;discard 清恢复点并留标记;加密恢复经 AES-256-GCM(RustCrypto,可交叉编译),密钥由 keyring 入系统凭据库(macOS Keychain/Windows 凭据/Linux Secret Service),OS 级排他锁(flock/LockFileEx)保护初始化,锁目录用 getpwuid_r 账户家目录不受 HOME/XDG 影响,加载错误明示不可用不导出明文;89 测试;Linux 的 Secret Service C 链本机交叉缺 dbus 头文件,未验证;Windows 目标编译过 — R11 ok
  • C06.4 保存策略:显式保存、可选自动保存、外部变更停止覆盖;Mark 1 秒自动保存。已验证(macOS):PolicyEngine 三策略(Explicit 默认显式、AutoSave 可选、MarkAutoSave);去抖用单调 Instant(校时不推迟);修订号跟踪——保存期间继续输入的较新编辑保留自己的 1 秒到期,无路径期编辑只记不调度、首保存得路径后续排;外部变更或兼容风险永久停止自动覆盖并一次性提示;自动保存失败保持未保存状态(下拍重试);通用可选自动保存复用 Mark 的 1 秒去抖(PRD 未定值,记此决策);99 测试 — R2 ok
  • [~] C06.5 文档应用接入恢复副本与崩溃恢复:Doc、Table、Show、PDF 每 10 秒后台恢复点(加密文档封存),崩溃后以新副本恢复并分说内容、光标、历史;普通未签名文件可在设置里开自动保存(§6.2、§6.3;2026-10-08 发现只有 ElyMark 接了 ely_files::Recovery) — 已做:ely_office::Recovering(每 10 秒为有改动、已落定的标签写恢复点,进程崩溃后下次启动以未命名副本打开最新点并提示只恢复了内容);ely_office::Stopping(引擎进程退出时上方提示条写明原因与最近恢复点时间,“重新打开文档”起新引擎,有改动的标签从最新点、无改动的从文件重开,没有恢复点的列出);ely_office::Autosaving(设置“文档”页的开关,本应用自有格式、无风险、状态为已编辑的文件停手 2 秒后保存,失败或外部改动后不再自动写);Cmd+W 关闭标签移入共用命令(原来只有 ElyPDF 绑定,文档应用里 Cmd+W 落进内核,内核按自己的快捷键关掉文档,worker 随即在已释放的文档上崩溃),worker 拒绝内核关闭框架与退出的快捷键(Mod1+W、F4、Q);recovery.sh、autosave.sh 真窗口核对 — R1 FAIL 四项已修:恢复出的加密文档丢了封存(重开的副本接过原恢复点的槽,封存随之);恢复副本一载入就删了唯一的旧恢复点(改为新标签接过旧的恢复点文件夹,旧点留到新点写下,载入或解封失败的条目留在索引里);加密 PDF 的恢复副本要密码而重开不问(加密的副本照样询问,答后仍是未命名副本);空闲的 ElyPDF 引擎退出无人察觉(每次恢复计时都查引擎是否已退出);pdf-recovery.sh 真窗口核对加锁 PDF 的封存点、两次崩溃、空闲引擎退出与重开 — R2 FAIL 三项已修:打不开的恢复点在正常退出后的下一次启动被删(索引里未接过的条目标为保留,干净结束后只删其余的,下次再试);索引写不进只进日志(提示一次,之后每次计时重试,写成即止);接过旧恢复点后“最近的恢复点”仍为“尚无”(接过时取其时间);另:崩溃后的重开只在确有条目时写索引 — R3 FAIL 一项已修并加回归,三轮用尽:恢复索引原地覆写,写到一半失败即坏掉上一份(改为暂存后原子替换,a_failed_index_write_keeps_the_last_one)

C07 LOK 共用接入(§7)

  • [!] C07.1 LOK 固定构建与加载:自建 26.2.6.3 并打 patches/libreoffice 补丁,出图块;隔离用户配置,工作进程,打开、关闭、保存、转换,错误码不当成功,不执行宏(LOK-01、09、10、11)。已验证(macOS):补丁构建加载、未打补丁拒绝(官方 dmg 对照)、严格 JSON 版本握手、打开/保存/转换往返、错误码报出不成功、关闭清理(文档释放、joinThreads、kit 销毁、陈锁与 lu*.tmp 清、失败可见);生产 worker 无宏执行入口(dev argv 门 + debug_assertions,release 带 --dev 也拒绝,实测);6 测试。阻塞(不算完成):审查要求「禁用/放开宏两种配置下同一份自动执行文档出标记对照」,但本后端(LOK Aqua/unipoll)任何配置下文档事件都不派发给 Basic(OnLoad/表单按钮经鼠标键盘、温/冷 profile、两种 URL 形式、官方 AcceleratorKeyChecker.fodt 对照、放开宏变异共 10 轮证伪);属本机无法实测的运行验证,审查者与我们在 Linux/LO 7.4.7 上才见到事件触发 — R10 该项仍 FAIL,证据 tasks/reviews/C07.1-r1..r10.md
  • [~] C07.2 图块渲染:失效通知、修订防旧覆盖、坐标、缩放、滚动、DPI;GPUI LokView(LOK-03、04)。已验证(macOS):编辑与 UNO 删除带精确矩形抬代际,只动光标不抬;视图只丢相交图块,旧代际图块不落;文档尺寸随批次刷新;滚动在增删页、缩放、视口变化后都夹回文档内;逻辑像素布局、DPI 只进纹理(2x 下一块 256 逻辑像素、512 纹理像素);BGRA 原样进 RenderImage;释放视图即停事件轮询;坏几何报错且 worker 存活。查出并修复 postUnoCommand 发往桌面活动框架(补丁 0002,补丁前 3/3 失败、后 15/15 通过)。23 测试。未验证:Linux/Windows TDF 构建(无补丁 0002) — R3 FAIL 一项(滚动夹定)已修并加回归,三轮用尽
  • [~] C07.3 输入:键盘、鼠标、中文输入法组合、剪贴板文本、富文本、图片、表格(LOK-06、07)。已验证(macOS):键盘(vcl 键码与修饰位,文本走输入法)、鼠标(按下/拖动/松开、点击计数、按钮,坐标与选区同一规则)、输入法组合开始/更新/提交/取消经 gpui ElementInputHandler 按 UTF-16 处理组合内选区与替换范围;光标、选区、光标可见性经回调画在视图上;系统剪贴板(ely_platform::clipboard,arboard)收发纯文本、HTML(富文本、表格)、PNG;剪切先写系统剪贴板再 .uno:Cut(Calc 不弹对话框);粘贴先验载荷(PNG 与 HTML 内嵌图片须解码),以撤销栈顶条目识别新步骤(满 100 步仍成立),失败回滚并报错;输入失败经 LokError 事件给应用;真窗口探针 tests/scripts/lokview.sh 断言输入法、点击、拖动、复制粘贴的文档结果,去掉鼠标处理或输入法变异均失败;49 测试。未验证:系统级拼音输入法实机、Linux/Windows 剪贴板运行(仅目标编译)、粘贴回滚分支无真实内核失败用例 — R3 FAIL 两项(HTML 内嵌坏图、撤销满)已修并加回归,三轮用尽
  • [~] C07.4 命令与状态:功能到接口映射表,状态回调,字体样式以内核为准,对话框由 Ely 实现,无障碍文本桥(LOK-02、05、08、12,§7 尾段)。已验证(macOS):ely_lok::commands::COMMANDS 为映射表(界面 id→UNO 名、带类型参数、确认方式),worker 只跑表内命令;参数按类型校验(字体须在内核字体表,字号 1–999 且 0.05 步,纯十进制);确认方式按实测:完成结果(SelectAll/粗斜体/下划线/删除线/样式)、同步撤销计数(Calc 另认单元格编辑文本变化)、状态回读(字体/字号),失败经 Undo 回滚并报错;状态回调(含持久已知状态)、选中对象框、字体与样式表来自内核;内核对话框(WINDOW created/JSDialog)在回调里即关并经 LokError 报出,Calc Backspace 不再卡死;无障碍桥:打开即取当前段落,段落/插入点/选区(-1 为无)、Calc 单元格与输入行文本,Role::MultilineTextInput + aria_value,真窗口 AX 树读到打开时与编辑后的段落;空闲时 worker 退出经 LokError 报出;70 测试。未验证:Linux/Windows 运行、Calc 打开时单元格文本(内核快照为空)、Calc 撤销按单元格编辑文本变化确认(非计数)— R3 FAIL 两项(Calc 单元格编辑撤销、字号容差)已修并加回归,三轮用尽

C08 ElyDoc(§8)

  • [~] C08.1 应用壳、新建、模板、打开、保存、格式规则(DOC-01)。已验证(macOS):ElyDoc 文档标签共用一个 LOK worker,启动即开空白文档,焦点在文档,Cmd+N 立即可用(真窗口 AX 探针);新建:空白/报告/信函模板与本地模板文件(复制后无标题打开,原件不动,含宏的模板进入风险模式);打开同一文件聚焦已有标签;保存保留原格式(kernel 以 TakeOwnership 写副本,ely_files::save 原子替换),另存为只写 DOCX(默认)或 ODT,转换写新文件(别名指向原文件时按原格式、拒绝转换);外部修改走冲突对话框(从磁盘重载/保留我的/另存副本);含宏文件(docm/dotm、OOXML/ODF/OLE 宏结构、绑定命名空间的嵌入 Basic)进风险模式,保存只能另存副本;状态栏显示已保存/已编辑/正在保存/磁盘已改动/保存失败/风险模式,载入中显示占位标签;未保存关闭与退出询问(等待输入落地,并以内核撤销历史核对);保存等待排队输入;文件面板错误报出;页面居中、页外为主题底色;17 个应用测试、ely-files 104、ely-lok 72。未验证:原生打开/保存面板的自动化(测试直接给路径)、状态栏文字的 AX 暴露(组件缺口)、Linux/Windows、LOK 随包打包;左栏导航与右栏属性分属 C08.6 与 C08.2 — R3 FAIL 三项(关闭确认时序、只读会话失败、XML 宏识别)已修并加回归,三轮用尽
  • [~] C08.2 文字、段落、样式(DOC-02、03、04)。已验证(macOS,带补丁 0003 的 LOK):右侧属性栏(文字、段落、样式三组)跟随活动标签,选中对象时让位;字体取内核字体表,字号、粗斜体、下划线、删除线、上下标、颜色与高亮(色块弹出色板,“无”清除高亮);对齐、缩进、行距 1/1.5/2、段前与段后分设(磅,内核回显,另一项保持)、项目符号与编号、升降级、制表位(厘米,添加与逐个删除);段落与字符样式的应用、新建(名称校验,列表随即重读)、按所选更新,当前段落样式与字符样式都取内核状态(光标移动、撤销、重新显示后同步);混合选区各控件显示“混合”,不冒用首项,样式不唯一时“更新”禁用并说明原因;段距连续快速编辑不互相覆盖,数值框只在回车、失焦、步进时提交(组件库 NumberInput::on_commit,真窗口 doc-props.sh 断言两值与两条命令,恢复旧回调即失败);字符样式带来的属性不一致也显示“混合”(补丁 0003 扩到 SwTextNode::GetParaAttr);每条命令经 COMMANDS 白名单与内核确认,参数错误报出;真窗口点击加粗、红色与段后,文字与控件同步;落盘 DOCX 含颜色、高亮、上标、制表位、列表、新样式及其父样式与更新后的对齐,更新字符样式只改光标处的样式。21 个应用测试、ely-lok 84。未验证:自定义字号(菜单为常用字号加当前值)、内核界面名与程序名不同的内置样式在列表中的选中、Linux/Windows(需带补丁 0002、0003 的 LOK);“标题样式驱动大纲和目录”分属 C08.6 与 C08.4 — R3 FAIL 两项(字符样式属性的混合状态、段距回归未经真控件)已修并加回归,三轮用尽
  • [~] C08.3 页面、分节、页眉页脚、表格、图片与对象(DOC-05、06、07、08)。已验证(macOS,带补丁 0003–0007 的 LOK):插入菜单(表格对话框、图片经系统文件面板、分页符、分节符(确认后从当前页复制出新页面样式“第 N 节”再分页,前后两节各自分栏与页眉页脚;内核复制页面样式会清空撤销记录,故先确认)、页码、总页数);属性栏页面组(纸张 A3/A4/A5/B5/Letter/Legal 与当前尺寸、纵横向连同尺寸互换、四边页边距厘米连续编辑不互相覆盖、分栏 1–3、本节页面样式、页眉与页脚各自的开关及首页不同与奇偶页不同,未开启时禁用并说明;转向连同尺寸一步撤销);表格组(光标在表内出现:行列插删、合并拆分、平均列宽与行高、适合行高、全部或无边框、底色、标题行每页重复、行跨页允许或保持整行、删除表格,内核禁用的操作灰显并说明);选中图片时只显示图片组(宽高厘米保持比例、裁剪、替换、四种锚点、六种环绕、上下层次);视图画出选中对象的框与 8 个手柄,拖动手柄经 setGraphicSelection 缩放,裁剪模式下裁剪(真窗口实测);落盘含页面尺寸与方向、边距、分栏、页眉页脚与首页/偶数页、分节页面样式、页码与总页数、表格与表头重复、边框底色、行保持、合并单元格、图片锚点与环绕、裁剪、层次。组件库 NumberInput::on_commit、ToggleButton::disabled。26 个应用测试、ely-lok 94;修复 worker 请求在内核空闲任务中途重入的崩溃(补丁 0007,崩溃栈由 worker 信号处理打印)。未验证:Linux/Windows(需补丁 0002–0007 的 LOK)、表格行高列宽的数值设定(以平均与适合代替)、对象的精确位置、JSDialog 崩溃修复的稳定复现、C07.4 的无障碍选区测试约十余次全量运行失败一次(内核未发事件,原因未明) — R3 FAIL 一项(页面回归测试只等页面项、未等尺寸的竞态)已修,两测试改等完整页面状态,串行全量连跑三次 26/26,三轮用尽
  • [~] C08.4 引用结构、公式、审阅(DOC-09、10、11)。已验证(macOS,带补丁 0003–0008 的 LOK):插入菜单加目录(默认目录,标题随界面语言)、更新目录、脚注、尾注、书签(名称不可空、不可重名)、超链接(无文字时以地址为文字)、交叉引用(指向书签,显示文字、页码、章节号或上下方;无书签时说明)、题注(选中图片或公式为“图”,表内为“表”,编号与“: ”分隔照内核题注对话框;无对象时说明)、公式(文字转内核公式对象;选中公式时预填原式并整体替换,一步撤销)、批注;审阅菜单加批注、批注与修订面板、修订开关、全部接受、全部拒绝。右栏可切到审阅面板:修订开关随内核状态(未知时禁用)、全部接受或拒绝,批注按线程列出(作者、时间、正文),选中线程即滚到批注处并放置光标、可回复;修订逐条列出,可逐条接受或拒绝,点条目定位。列表随内核批注与修订回调刷新。补丁 0008 让目录、题注、公式不经内核对话框。真窗口实测:批注、回复、修订开关、键入被标记、逐条接受、公式插入与渲染。落盘含目录、脚注、尾注、书签、书签引用、超链接、题注序列、公式对象与原式、批注与回复、接受后的文字、拒绝后删去的文字。31 个应用测试、ely-lok 78;公式含补充平面与组合字符时不吞前文,替换选中公式留在原处并保留锚点、间距与对齐(浮动与行内),一步撤销复原;批注正文保留首尾与中间空段落未验证:Linux/Windows(需补丁 0002–0008 的 LOK)、作者名(内核显示“Unknown Author”,作者设置待定)、批注组件内部文案(Open、Resolved、Reply、相对时间)为英文(组件 i18n 上游待办)、交叉引用只指向书签(不含标题与题注)、公式导出 DOCX 后的可编辑性、插入目录后光标落在目录内(内核原样) — R3 FAIL 一项(替换浮动公式时把手动纵坐标当作基线自动定位清掉)已修:只对行内公式清除自动纵向定位,回归断言页锚点公式的 svg:x、svg:y 不变,三轮用尽
  • [~] C08.5 查找替换、拼写、字数、文档比较、邮件合并(DOC-12、13、14)。已验证(macOS,带补丁 0003–0009 与英文词典的 LOK):工具菜单“查找和替换”(Cmd+F)在页面右上打开查找框:键入即计数并高亮全部,“n/共 m”随上下一处走,区分大小写、全词、正则(内核 ICU)三个开关,替换一处后重新计数,无当前项时“替换”先选下一处,全部替换;查询可为空白;上下一处滚到匹配处;查找后文档被改动时计数标“已改动”,回车或下一次查找重新计数(边打字边计数会选中全部匹配,故不自动);比较、预览、生成都先等源标签排队的输入落到内核,且始终用发起时的标签;计数中按回车或下一处会等计数落地再定位;字段值里的 «列名» 原样保留(先换成一次性记号再填值);生成先写暂存文件再以独占新建发布,检查之后才出现的同名文件不被覆盖;字数取内核(补丁 0009),状态栏显示全文或选区字数;拼写用随包 Hunspell 英文词典,错词红色波浪线由内核画,右键在插入点下给建议与“全部忽略”(组件库 ContextMenu::manual,967d1e4,注释在 aaaf0d5);审阅菜单“与其他版本比较…”把当前文档作副本开新标签并标出对较旧文件的修订,两份源文件不动,审阅面板随即打开;工具菜单“邮件合并…”选 UTF-8 CSV(首行为列名,空名、重名、无数据行、列数不齐、列名含 « 或 »、非 UTF-8 均报错),字段按钮在光标处写入 «列名»,按记录号预览为新标签,生成按 DOCX 或 PDF 每行一个文件写到所选文件夹,任一目标已存在则整体拒绝,不发邮件。真窗口实测:查找计数、下一处、替换一处、拼写右键建议与应用、合并面板、插入字段、预览。40 个应用测试、ely-lok 81。未验证:Linux/Windows(需补丁 0002–0009 的 LOK 与词典)、写错的正则只显示“无结果”(内核不报原因)、查找框与批注面板的组件内部文案为英文(组件 i18n 上游待办)、英文以外的拼写词典(只随包英文,待用户确认语种)、«列名» 字段写法待用户确认 — R3 FAIL 三项已修:连续两次生成各自占用独立模板与暂存目录;新查询或清空查询使在途结果作废;计数中的多次定位按序排队执行;各加回归,三轮用尽
  • [~] C08.6 打印、导出、长文档导航、兼容风险提示、往返测试(DOC-15、16,§8.3,QA-10)。已验证(macOS,带补丁 0003–0011 的 LOK):文件菜单“导出为 PDF…”(Cmd+E)与“打印…”(Cmd+P)先开同一对话框:页面全部或范围(起止页受页数约束)、批注印在页边、标出修订;导出经系统存储面板写 PDF,完成后提示,目标是打开着的文档(符号链接或硬链接也算)即拒绝;打印把同一 PDF 交给系统打印面板(PDFKit),取消或打印都记日志;加密文档询问密码(遮蔽输入),错的密码再问,对的打开;左栏导航(工具菜单与 Cmd+[ 返回)分大纲、页面、书签三页,大纲、当前标题与书签位置取内核(补丁 0010;当前标题按文档顺序,分栏也对),当前页按光标所在页,点标题、页、书签即按位置跳转,跳前记下所在处(上一跳未落下或光标未跟上时以其目标为准,落下后按实际光标),“返回”逐级回原处(关闭的标签提示);缺字体时页面上方提示条,文档写的字体列表全缺照报,有成员可用的列表不报(补丁 0011)。往返:合同(编号列表、批注、修订)与长报告(标题、目录、跨页且表头重复的 80 行表格)经 DOCX 往返,结构与文字保留。真窗口实测:导航、当前项随跳转(含同页两标题)、返回、缺字体提示、导出对话框与范围、系统打印面板的三页预览与取消。43 个应用测试、ely-lok 110。未验证:Linux/Windows(需补丁 0002–0011 的 LOK;打印在其他平台报错未实现)、QA-10 与 Microsoft Office 互开(本机无 Office)、真实打印机出纸 — R1 FAIL 四项已修:导出可覆盖打开着的源文件;连续跳转时“返回”记成旧光标;文档写的字体列表被整串滤掉;同页标题的当前项不随跳转;各加回归 — R2 FAIL 两项已修:导出与另存为按文件身份比对(硬链接也认出),另存为到本文件的硬链接按本文件格式判定转换;上一跳落下后不再当作在途;各加回归 — R3 FAIL 一项(分栏时当前标题只比纵坐标,落到右栏标题)已修:当前标题改由内核按文档顺序给出(补丁 0010 加 current),加两栏回归,三轮用尽

C09 ElyTable(§9)

  • [~] C09.1 应用壳、工作簿、区域编辑(TABLE-01、02)。已验证(macOS,带补丁 0003–0013 的 LOK):ElyDoc 的文档外壳移入 crates/ely-office 后两应用共用(ElyDoc 41+2 个测试照过,真窗口脚本 doc-shell、doc-props 照过);ElyTable 启动即开空白工作簿,名称框与公式栏随单元格(回车跳转或写入,Esc 交回网格),行列表头按内核几何对齐图块(实测拖宽 A 列后表头随之重排),点表头选整行整列,拖表头边改行高列宽,填充柄拖到 A6 续出等差序列,选区统计取内核数值、名称换成界面语言(平均值 21 求和 42);工作表标签切换、加号插入、右键菜单与“工作表”菜单的插入、重命名(名称校验)、复制、左右移、隐藏、显示、删除(列出引用该表的公式数、第一个公式格与命名区域数);“单元格”菜单插删行列与单元格、合并拆分(两个以上数据格先问移入或保留隐藏)、行高列宽(厘米,作用于整个选区)与最适、隐藏显示行列、冻结(真窗口 B2 冻结后上下左右滚动,首行首列不动,表头同步);Tab 与 Shift-Tab 在格间移动;名称框跳到远处时画布随单元格光标滚动;右键工作表标签先选中该表再出菜单;表头可 Tab 到达、带列头/行头角色与名称、回车或空格选整列整行;新建工作簿另存 XLSX 后重开工作表齐全。内核测试 ely-lok 119(两工作簿各自切表与写入、工作簿与区域编辑各一组、冻结状态、INDIRECT 计数、作者署名),应用测试 10(删除与合并的确认绑定发起的工作簿、含切表前后输入顺序、切表等待期间换工作簿、名称框随活动工作簿);组件库加 Tabs::on_context(2f02c82)。未验证:Linux/Windows(需补丁 0002–0012 的 LOK)、ely_platform::user 的 Linux、Windows 分支未经编译器(本机无交叉工具链)、行列分组与筛选隐藏的表头、触控板以外的大表滚动性能(C09.5 的 TABLE-16)、a11y_follows_the_focused_paragraph 间歇(单跑 8 败 1,全量 4 败 2,原因未明) — R1 FAIL 九项已修:首帧工作表标签崩溃;切表越过输入队列;单元格光标不带动滚动;冻结不分格;尺寸对话框只改一行一列;右键菜单丢失被点的表;INDIRECT 引用未计入删除说明;平面 ODF 宏检测漏子元素命名空间(改用 quick-xml 按命名空间作用域解析);表头无角色与键盘操作;各加回归 — R2 FAIL 五项已修:多工作簿时 worker 未切到文档自己的内核视图(现每次请求先 setView);切表未进有序输入队列;延迟切表丢失发起的工作簿;远处跳转被缓存的文档尺寸截住(真窗口 A100 与连续下移到 A130 实测可见);切换工作簿后名称框与公式栏不刷新;各加回归 — R3 FAIL 两项已修,三轮用尽:删除工作表与合并的等待回调重读活动工作簿(现请求与确认框带发起标签的 id,经 run_in 执行;回归在去掉修复时失败);水平滚动只比左边缘(现比右边缘,回归在去掉修复时失败;真窗口名称框跳 M1,整格与填充柄可见)
  • [~] C09.2 公式输入、计算、计算控制、名称与引用(TABLE-03、04、05、06)。已验证(macOS,带补丁 0003–0015 的 LOK):公式为 Excel A1 语法与逗号分隔(用户定,安装层 ely.xcd;=SUM(1,2)、跨表 'S'!D1、绝对与混合引用实测);单元格内键入时函数列表在格下(真窗口:=SU 列出 SUM 等与签名、说明,下键选 SUMIF、Tab 补全为 =SUMIF()),参数提示取内核用法文字,点选单元格插入引用并画框(真窗口点 C3 得 =SUMIF(C3) 与品红框),点选后继续键入、F2 再编辑已有公式两引用各画框、提交与取消都清框;语法错误的公式照原样输入不弹询问;状态栏按界面语言解释当前格错误(25 条,含循环引用 Err:522);算术、逻辑、条件统计、文本、日期、查找、动态数组(FILTER、SORT、UNIQUE、SEQUENCE、XLOOKUP)取内核结果;自动计算关闭后改值不重算、重新计算后更新,ods、xlsx、xls、fods 存后重开仍为手动(补丁前 xlsx、xls 变回自动);名称:工作簿与工作表范围定义、改引用、撤销、删除,像单元格地址或含符号的名称由内核判定后拒绝,名称框跳转名称,删去目标行后名称标为失效;“公式”菜单(自动计算、重算、名称、追踪错误与引用从属、移去箭头)。同轮修内核:JSDialog 发送者在发送中被关闭的释放后使用(0005 增补)、Aqua 直接超时丢失唤醒致新载入 XLSX 无初始状态(0015,约四分之三复现到 5/5 正常)、载入选项未被 LOK 解析。测试:ely-lok 公式 7 项、ely-table 17 项(含定义名称取所选区域) — R1 FAIL 五项已修:名称列表“转到”按名称跳转,跨表的工作表名称失败、同名工作簿名称被当前表遮蔽(现由内核列出每个名称的绝对区域,转到即跳该区域;非区域名称不可转到);定义名称在排队输入落地前读选区(现等发起工作簿的输入落地,并经新加的 .uno:SelectedRange 同步向内核要所选区域,选区显示为名称时也得到其区域,多个区域时提示后留空);等待后的名称列表改用当前工作簿(现带发起的工作簿 id);七处注释超长。各加回归(跨表名称与遮蔽、排队后定义与名称选区、等待中换工作簿),转到的回归在旧实现下失败 — R2 FAIL 一项已修:定义名称的“范围”列表取自当前工作簿,等待中换工作簿后列出别的工作簿的表(现取自对话框所属工作簿);同类问题一并收口:重命名、显示工作表、行高列宽对话框都带发起的工作簿 id,确认时只作用于它。回归:等待中换工作簿后范围列表与定义落点、重命名中换工作簿,均在旧实现下失败 — R3 FAIL 一项已修,三轮用尽:名称列表“转到”只移动发起工作簿的选区而不切到它(现先切到该工作簿再跳转,名称框随之显示目标);回归断言跳转后活动工作簿与名称框,在旧实现下失败
  • [~] C09.2a 内容区随系统深浅色,重绘不闪(用户 2026-10-04 提出;LokView、ElyDoc、ElyTable)。已验证(macOS):内核以 Ely 的深浅两套颜色方案绘制,Writer 页面与 Calc 网格深色时平均亮度约 26–35、浅色约 240–254,切回浅色复原(the_page_follows_a_dark_theme_and_back);深色下导出 PDF 仍白底(Quick Look 渲染平均约 255);真窗口系统深色下 ElyDoc 页面深底浅字(含中文)、ElyTable 深色网格,ELY_APPEARANCE=light 下为白底;主题切换不把文档标为已改;作废的图块继续显示到新图到达,仍按作废请求重绘(视图测试) — R1 FAIL 两项已修:图块重绘失败只记日志,界面一直显示旧图且同一代际不再重试(现报给应用的错误通路,可视区移动或下次作废时重试;回归注入失败断言报错与移动后重试);主题回归绕过视图(现经 LokView::follow_theme 与有序队列驱动,断言内核实际绘出的深浅;把深色方案名改成浅色时该测试失败) — R2 FAIL 一项已修:单元测试无法初始化应用主题,render 取主题这一步无回归(把它固定为浅色时单测全过);新加真窗口脚本 tests/scripts/theme.sh,以 ELY_APPEARANCE=dark/light 启动 ElyTable、截窗口量网格亮度(实测深 26、浅 252),上述变异下脚本报“the dark grid paints at 252” — R3 FAIL 两项已修,三轮用尽:脚本只量平均亮度,不画图块时底色也能过(现另量网格线像素占比,只有内核图块画网格线;去掉图块绘制的变异下报“no grid lines (0 per mille)”);缺屏幕录制权限时 SKIP 被当亮度比较而报 FAIL(现判断在顶层,权限拒绝时 SKIP 退出 0,已模拟验证)
  • [~] C09.3 格式、数据整理、规则(TABLE-07、08、09) — R1 FAIL 九项已修:分列、数据验证、条件格式列表的等待回调重读活动工作簿(现带发起的工作簿 id);粘贴为公式跨工作簿时按纯文本粘贴丢公式、粘贴为值会执行 = 开头的文字(现只用本视图复制的内核单元格,其余明确拒绝并提示);单元格规则缓存只按地址,原地设规则或清除后不刷新、同地址切表复用(现按工作表计数、地址、编辑数);清除数据验证发空的运算符与样式被内核拒绝(现发完整的“任何值”);“任何值”带输入提示时被当作无规则丢掉提示(现以有无运算符区分);格式面板同地址切表不重读(同上,键含工作表计数);日志记下文档自己的验证标题与内容(现只记种类,内容只进提示);边框验收只看命令成功(现核对存档单元格属性,全部线关的变异下失败);补丁超 500 行(拆为 0016–0018)。各加回归(ely-table 23 项,含三条等待路径、原地设规则与清除、同地址切表;ely-lok rules 7 项)。同轮按用户要求修卡顿,见 agents.md 2026-10-05 决策 — R2 FAIL 五项已修:粘贴为值/公式只比文字,另一工作簿同样文字的复制可通过(现以 Ely 复制写入 HTML 的唯一标记识别,经真实剪贴板验证);数据验证、条件格式列表、数据区、筛选按钮、序列、格式代码、名称、删除工作表、合并等仍在界面线程读内核(现全部经后台读取;保存导出、导出 PDF、比较、邮件合并同改,保存期间状态为正在保存,同标签的保存排队);切换文档时审阅与导航仍显示上一文档的列表(现切换即清空);读取失败后立即重读成环(现记下已问的状态,等下一次变化);按键到新图块的计时可被旧图块结束(现只在编辑落地后的新代际图块到达时结束,回归覆盖)。另修异步后暴露的两处:同一标签的两次保存并发(现排队)、替换一处后的过期标记晚到使“全部替换”只重新计数(现计数结果即刻清除过期并作为基准) — R3 FAIL 五项已修,三轮用尽:导出期间又有编辑时“保存后关闭”仍关闭并丢失这些编辑(现回到关闭询问;回归 typing_during_a_closing_save_is_never_lost);格式代码校验返回后发给当时的活动工作簿(现发给发起的工作簿;回归 a_format_code_lands_in_the_workbook_that_asked);两个标签同时另存为同一路径时后者覆盖前者(现写入前按文件身份再查持有者;回归 two_tabs_saving_as_one_path_keep_one_owner);邮件合并预览在模板导出完成前未保留标签号,交错的预览串用模板(现发起时保留;回归 interleaved_previews_keep_their_sources);关闭干净的标签仍在界面线程读撤销历史(现后台读;回归 closing_a_clean_tab_never_waits_for_the_worker,worker 被占 400 毫秒时关闭调用不足 100 毫秒)。同轮查出事件等待阻塞后台线程(每个文档一个,最多一秒)的根因并改为异步唤醒,测试由约 80 秒降到约 15 秒
  • [~] C09.4 透视表与图表(TABLE-10、11) — 补丁 0019(透视表)、0020(图表);ElyTable“插入”菜单:数据透视表(新建/原地修改,字段放行、列、筛选、值,值函数求和、计数、平均、最大、最小,对话框显示源区域)、刷新数据透视表、图表(柱、条、线、散点、饼;区域、标题、图例、X/Y 轴标题;选中图表时为修改,一步撤销)。顺带修根因:无数据时 select.data 留下单格标记使回车不下移;组件库 e21336f 让属主直接移除的对话框(含一起移除的嵌套浮层)交回焦点。R1 FAIL 六项已修:图表区域解析不了即拒绝;对话框的读取回来时发起的工作簿已非当前标签即丢弃(Tabs::ask_in,ElyTable 全部对话框与合并询问);透视表数据布局字段读写保留(空名),读出原样写回不改表;嵌套浮层一起移除时焦点回到最外层之前;补丁拆为 0019、0020;注释压到十字内。R2 FAIL 三项已修:图表区域另查所指工作表存在(sctools::chartRanges,插入与修改共用;原样“bad range”修改使 worker 因未捕获异常退出,现拒绝且撤销步数不变);已在表中的字段写回时保留小计函数(含小计的 FODS 往返测试,去掉修复时失败);对话框控件经组件库 8658999 的 Select::label、TextInput::label 与开关自身的 label 命名(真窗口 AX 树英文与中文核对:图表对话框六项、透视表各字段、公式栏两项与格式面板两项原先也无名,一并修)。R3 FAIL 一项已修,三轮用尽:图表修改的撤销原只存外观 JSON,换类型后撤销丢掉堆积等设置;现撤销存整个图示与主标题的副本,外观先改、区域后改,撤销先回区域再回图示(undoing_a_new_kind_brings_the_whole_chart_back:堆积柱形图改饼图后撤销,导出仍带 chart:stacked="true";换回旧做法时失败)。测试:ely-lok client::tests::analysis、enter_and_tab_move_the_cell_cursor,ElyTable tests::analysis,组件库 a_dialog_its_owner_drops_hands_focus_back、nested_dialogs_dropped_together_hand_focus_back,ely-lok a_read_layout_applies_back_unchanged,ElyTable a_dialog_asked_from_a_workbook_left_behind_is_dropped;真窗口看过两个对话框与插入的图表。
  • [~] C09.5 CSV/TSV、导出、打印、保护、大数据浏览(TABLE-12、13、14、15、16,§9.3,QA-11)。已验证(macOS,带补丁 0003–0022 的 LOK):打开 csv/tsv/tab/txt 先出导入对话框(编码、分隔符、引号、逐列类型,预览按所选读),GB18030 与 UTF-8 样本、引号内含分隔符、前导零与 20 位编号保持文本、=1+1 文字不执行、年月日列读成日期;导出 PDF/CSV/TSV(文本只写当前表的显示值,对话框写明损失),打印经同一 PDF 交系统面板;页面设置(打印区域、重复行列、方向、三种缩放)与行列分页符,XLSX 往返保留区域、标题行列、横向与按页缩放;工作表保护(密码、八项许可)、锁定与解锁单元格,锁定格不可改、错误密码仍受保护;XLSX 载入总是重算,未知函数显示 #NAME? 且公式保留,过期缓存不冒充结果;外部链接显示保存值并在提示条列出来源;10 万行表滚到底只留屏边图块(去掉淘汰时该测试失败)。真窗口(macOS,中文界面,深色)看过导出(切到 CSV 时的损失说明)、页面设置、保护工作表三个对话框。未验证:1904 日期系统、Linux 与 Windows — R1 FAIL 六项已修:.txt 按扩展名落进 Writer(载入选项加 FilterName,补丁 0022;worker 查文档类型,去掉过滤器名时回归失败);列类型只看前 64 KiB(后台读整个文件,18,000 行后的 007 仍为文本,存 XLSX 重开照旧);解码静默替换(严格解码,读不通即提示且不能打开);预览行宽不含全部列(行宽按列数,真窗口横向滚到后面的列);预览文字未取主题色(取前景色,真窗口深色可读);缩放模式与数值框挤在一列(拆成两行,真窗口三种模式与宽高两框都在可见区)。分隔符改为下拉(分段控件在中文下被裁) — R2 FAIL 四项已修:提交时重新复制源文件,校验与导入不是同一份字节(导入改为写入检查过的字节,回归在对话框期间改写源文件);旧对话框的扫描回调落进新对话框(按字节快照身份与扫描序号核对,两种先后顺序都测,去掉身份核对时失败);第 65 列起无类型选择(去掉列数上限,真窗口 AX 树有第 65 列);链接只在首次读取(随编辑计数重读,回归在空白工作簿里新加外部引用) — R3 FAIL 三项已修,未经复审:预览拆字段与内核不一致(引号前空格、空行;改按 Calc impex.cxx 的规则拆,去掉 csv 依赖;应用回归逐格比对预览与内核导入结果);负号开头的长编号与前导零未判为文本(按数字主体判定,回归中去掉负号处理时失败);补丁 0021 把透视表函数的注释留在新函数上方(移回原处)

C10 ElyShow(§10)

  • [~] C10.1 应用壳、幻灯片管理、模板与母版(SHOW-01、02)。已验证(macOS,带补丁 0003–0026 的 LOK):左侧缩略图(深色随主题,隐藏页半透明带标记,点选与右键)、中间按视口缩放居中的画布、右侧版式(12 种)、母版、配色(内核 7 套)、尺寸(预设与厘米);幻灯片菜单与右键:新建、复制、删除、隐藏、显示、上下移、移到开头末尾,各为一步撤销;新建对话框:内核空白演示与随带模板;编辑母版:缩略图与画布换成母版,新建母版,粘贴到母版的文字出现在用它的幻灯片上并存入母版;关闭母版回到幻灯片。真窗口看过新建、母版进出、新增幻灯片。[!] 章节:内核无章节(PPTX 导入丢弃 p14:sectionLst,ODF 无此结构),用户定为外部阻塞 — R1 FAIL 七项已修:尺寸框在回显前按旧值重建(发出的尺寸保留到读回,连续改宽高以它为底,回归先后两次改尺寸);尺寸改动与撤销不通知 LOK,视图尺寸停在旧值(补丁 0023 在 SetPageSizeAndBorder 与页面格式撤销重做里通知,视图回归读到新尺寸);适配缩放下限 25%(只留上限,3 米页面回归);撤销绕过缩略图重画(读取时比对尺寸、配色、母版表,变了就全部重画;撤销回归逐页比对内核新画像素,去掉比对时失败);缩略图失败后立即重试成环(失败页等下次读取,回归在内核丢文档后只失败一次);缩略图行无 AX 角色(列表与列表项,当前、序号、总数、隐藏说明,真窗口 AX 树核对);宽高框无名称(组件库 7186179 加 NumberInput::label,真窗口 AXTitle 为宽(厘米)、高(厘米)) — R2 FAIL 四项已修:同一尺寸重复提交(按显示尺寸去重,回归回车加失焦只一步撤销);整页适配下光标扩大滚动范围、页面跳到左上(适配时范围取文档尺寸,视图回归把滚动范围扩到三倍后页框不动);母版内容撤销不重画引用页(读取时比对撤销与重做步数,撤销后全部重画,回归逐页比像素);模板行无 AX 与键盘(组件库 80c46b1:模板行为列表项,可 Tab 与方向键选取,真窗口 AX 核对)。另修真窗口发现的文字编辑图块全黑(补丁 0024,内核回归撤补丁即失败)与离开编辑后缩略图留编辑框(LokView::caret,回归去掉即失败) — R3 FAIL 一项已修:撤销后立即编辑时重做数不变,母版内容的撤销漏画(改按撤销、重做列表的条目判定,回归“撤销后立即隐藏”与“重做后立即隐藏”,改回按数即失败)。另修压测发现的偶发全黑图块与命令丢失(补丁 0025、0026,八路并行各 96 次全绿)。三轮审查已满
  • [~] C10.2 文字、图形、图片、对象操作(SHOW-03、04、05、06)。已验证(macOS,带补丁 0003–0027 的 LOK):插入文本框(键入)、矩形、椭圆、三角形、直线、箭头、连接线、图片(落在幻灯片中央,替换原位且一步撤销,裁剪进入裁剪模式);对象面板改位置(3 厘米落在 3 厘米)、大小、旋转、锁定、填充与无填充、透明度、阴影、轮廓、线宽、字体、字号、加粗、项目符号、自动适配三档;两对象左对齐、组合、取消组合;参考线添加、移动、删除与吸附;对象列表在 AX 树里是列表,行名为种类、说明为占位符角色;缩略图随面板命令重画。内核回归:读取、按层次选中、twips 换算、参考线、图片居中与替换。应用回归:七项(含回车加失焦只发一次,去掉判定即失败)。组件库 7df3045:SelectableList 与 ListItem 的 AX 语义。连接线粘附到图形未单独验证 — R1 FAIL 六项已修:清除按钮把 0 当黑色发(清除各发自己的命令,回归走面板常量);已发记录不随读取失效(改按标签与读取次数,撤销后再发与两个同框对象各发各的回归);线类对象无轮廓控件(直线、箭头、连接线、图片显示轮廓与线宽,回归改直线颜色与线宽);列表清空不取消选中(补丁 0027 加只带 Add 即全不选,内核与应用回归);混合值显示为 0 且挡住设 0(混合为空、显示“混合”,回归两对象统一设 0 为一步);补丁重叠使重跑构建失败(scripts/apply-lo-patches.sh 按序列定位,tests/scripts/lo-patches.sh 从第 13 个接着打、再打为空操作,完整构建脚本重跑通过) — R2 FAIL 三项已修:混合数值框里是真的 0,直接回车即发送(组件库 af54877 加 NumberInput::blank,空着不提交,组件回归去掉判定即失败);混合选区的自动适配选“不适配”不发命令(补丁 0027 让 .uno:TextAutoFitToSize 收 Fit,对全部选中对象一步撤销,回归标题缩小、内容增长、合选后不适配为一步);object.rs 502 行(文字组移入 text.rs) — R3 FAIL 两项已修:“不适配”留着横向自动增长(三档都关横向增长);缩小后撤销改了原段落格式(撤销记录连同文字保存);内核回归导入横向增长文本框设不适配后保存无横向增长、20 磅小框缩小再撤销后绘制与保存的段落不变,去掉保存文字即失败。三轮审查已满
  • [~] C10.3 表格与图表、备注与审阅(SHOW-07、08)。已验证(macOS,带补丁 0003–0032 的 LOK):插入表格(4×3 落在中央,选中),表格组在光标进格后可用,下方插入行;插入图表(对话框的外观与数据表,非数字格拒绝并指明,选中图表再开为修改,改值一步撤销,读回为新值);备注栏键入后提交为一步撤销,撤销复原;PPTX 备注(每段带全字符格式)可编辑且沿用原格式,格式不一致的备注只读、命令拒绝;批注对话框打开即可键入,回车保存,批注栏中文、显示作者与“刚刚”,选中点亮画布标记,编辑、删除;批注不进对象列表,对象序号也不数批注。R1 FAIL 十项已修,R2 FAIL 三项已修,均带回归(见下)。R1 修后:备注随所属页提交(切页排在提交前也不错页),段落格式一致时沿用、不一致时只读;缺失的点读写为空;类型错的图表 JSON 拒绝;读图表回来时已换标签即丢弃。R2 修后:图表 JSON 经 boost.json 保留类型;散点图 X 按数字写入并导出,PPTX 存后重开可改数据,再存再开值不变;读图表以读取时内核的选中对象核对(同外框的另一图表、跨页都丢弃);表格对话框键入的行列数即生效(真窗口未复验:本机当时有人在用);批注列键盘可达。内核回归:图表插入、修改与撤销,备注读写与撤销,批注序号、作者、编辑、删除,表格插入与增行。 R3 FAIL 三项已修,带回归与变异检验,未复审:散点图改标题删掉原有连接线(只在图表变成散点图时设为只画点,a_retitled_scatter_keeps_its_lines);散点图的 X 是文字时应用不拦、内核拒绝后草稿丢失(应用按类型先查 X,指明哪一格,对话框保留,a_scatter_with_words_for_x_keeps_its_draft_and_names_the_cell);选中的批注离开所在页后不能再点回(只在所在页显示为选中,a_comment_picked_on_another_slide_shows_its_slide_again)。
  • [~] C10.4 动画、切换、媒体(SHOW-09、10)。已验证(macOS,带补丁 0003–0035 的 LOK):切换按预设设定、读回、一步撤销,Ely 给的十种都能设,全部幻灯片一次设定,类型不合拒绝;动画加入、改开始方式与时长延迟、前后移、删除各一步撤销,十四种都能加,效果的目标序号与放映图层散列相符;图层在 macOS 上有像素(补丁 0033 前全空);真窗口看过淡入预览(标题由暗渐亮,空占位符不显示)与向左推入预览;面板与菜单中文。媒体:嵌入插入在中央、存后重开仍可播放副本,链接文件删去即标为缺失,缺失文件插入被拒;系统播放器(macOS AVFoundation)打开 H.264/AAC 样本、给出 1 秒与 160×90、播放出帧,坏文件给出原因(主线程集成测试)。R1 修后:播放器接口在 Linux、Windows 目标可编译(tests/scripts/media-targets.sh,不可用的播放器为空类型),播放实例按标签、幻灯片名与媒体 URL 认定,换页、删除或替换即停;播完再按播放从头开始(平台测试覆盖);向左揭开时旧页在上;预览按标签、幻灯片名与撤销列表认定,读取回来或绘制时不符即弃,停止使在途读取作废(应用测试与变异检验);时长、等待、延迟的回车加失焦只发一次(应用测试与变异检验)。R2 修后:预览另按视图已落地与待落地的编辑认定,键入未成撤销条目也弃(typing_ends_a_preview_before_any_undo_step);切换各字段以该页已发未读回的切换为底合并,读回相符或换页即清(two_fields_sent_before_a_read_both_land);正在播放的媒体在每次文档状态通知时核对,关闭最后一个标签即停(主线程真窗口探针验证,去掉观察即仍在播;系统播放器只能在主线程打开,应用单测在工作线程,无法常驻测试);media-targets.sh 调用应用用到的全部播放器方法(删去 pause 即失败);切换合成移入 preview/compose.rs,tests/compose.rs 以 Metal 画半程帧取像素(向左揭开、向左覆盖、向左推入左旧右新;叠放顺序任一写死都失败)。R3 FAIL 两项已修,带回归与变异检验,未复审:已发未读回的切换按其命令的输入序号认定,命令落地后开始的读取一到即清(不再比值),发出后立即撤销也不会把撤销掉的时长再写回(an_undone_duration_is_not_sent_again);动画秒数的去重按幻灯片、效果序号与图层散列区分,回读前给两个效果提交同一值都生效,回车加失焦仍各一步撤销(two_effects_take_the_same_value_before_a_read)。未验证:真窗口里插入与播放媒体(本机当时有人在用);Windows 与 Linux 播放器未构建;ElyShow 自身未在非 macOS 目标编译(本机缺 ring 的交叉 C 工具链)。
  • [~] C10.5 放映与多屏、演讲者视图(SHOW-11、12)。已验证(macOS,带补丁 0003–0036 的 LOK):.uno:SlideShow 读出每张的隐藏、备注、切换、动画与媒体(内核测试);母版页脚与页码由内核画成文字层,落在占位处的层次上,字段关闭的幻灯片不画(内核测试,按像素行);放映从头开始与从当前页开始(当前页隐藏也从它开始),单击组逐步播放,跳过隐藏页到黑色结束屏再退出,后退为已完成状态,数字加回车跳页,黑屏、激光笔、Esc 退出,应用快捷键不被吞(应用测试,按键经放映窗口送入,变异检验:按键挂在焦点之下或同步关窗即失败);单击媒体对象按外框命中(应用测试);真窗口:F5 全屏放映、B 黑屏、右键到结束、Esc 结束(日志)。R1 FAIL 九项已修,带回归与变异检验:两窗口的根作用域各自取得焦点(演讲者视图与观众窗口都收按键);连按两次开始只开一次(启动中的状态,每次的副本文件名不同,旧放映结束不清新放映);“从当前幻灯片开始”等已发输入落地,并在同一次 worker 调用里读当前页;放映播的是开始时另存并载入的副本(编辑不进入放映,结束时关闭并删除,副本按应用深浅色设方案);单击组从此前全部动画与入页切换结束之后开始(steps::click_at);离开的页按离开时的动画状态画在切换里(完成的退出不再出现);迟到的图层若已不是当前或下一页即丢弃,同时最多读两页;跳转(含跳到本页、Home、End)无切换并重新开始本页;媒体载入失败与播放中失败都停下并在演讲者视图(单屏时在观众屏)写明原因,放映继续。R2 FAIL 六项已修,带回归与变异检验:后退显示本页全部动画已完成(含只有同时、之后开始的页);本页图层到达才开始入页切换与动画计时,读取期间的单击与自动换片同此时基(worker 被占 400 毫秒的测试);切换结束即释放离开页的图层,只留当前与下一页;离开页的画法移入 compose::left,Metal 像素测试画出完成退出的对象在覆盖切换中不再出现(改回全部显示即失败);循环与失败由 Player::tick 判定(编辑区与放映共用),平台主线程测试覆盖真实播放器的循环边界与损坏文件。放映里异步失败交给提示这一步(media_tick 的错误分支)只能在主线程真实播放器上走到,应用单测在工作线程,未单独测到。R3 FAIL 两项已修,带回归与变异检验,未复审:人按的暂停与播到末尾分开记(Player 记手动暂停,循环只在真正播完后重播;定位改为精确,平台主线程测试在末尾 50 毫秒内暂停并持续 tick 仍停着);播放器之后报出的失败经 Show::media_seen 写出原因、停下并继续放映(应用测试,改为不提示即失败)。未验证:两块屏幕与演讲者视图(本机只有一块屏);真窗口里关闭后回到编辑窗口(修正延迟关窗后,本机当时有人在用,未复看);真窗口里的切换与动画放映、激光点、媒体播放;单屏开激光笔时系统光标仍显示(GPUI 无隐藏光标样式);Windows 与 Linux。
  • [~] C10.6 输出、演示准备检查(SHOW-13、14,QA-12)。已验证(macOS,带补丁 0003–0038 的 LOK):讲义 PDF 由内核按打印的讲义版式排出(每页 1、2、3、4、6、9 张,3 张带笔记线;只排范围内未隐藏的幻灯片;其他张数导出失败;内核测试按 pdftotext 页与文字核对,看过版面);导出(Cmd+E)PDF、图片、讲义,范围全部、当前、从–到;打印(Cmd+P)幻灯片或讲义后交系统打印面板;讲义与图片都在另存的副本上做,原文档的撤销步数不变(应用测试);图片每张未隐藏的幻灯片一个 PNG(宽 1920,浅色方案),任一目标已存在即不写(应用测试);PPTX/ODP 走保存与另存为(外壳已有);PPTX 存后重开,备注、切换、动画、媒体仍在并可改(内核测试)。演示检查(放映菜单“检查演示…”):.uno:SlideCheck 给每张幻灯片与母版的所用字体、链接文件与是否缺失、内核不能显示的对象,结合内核报的缺失字体与 .uno:SlideShow 的媒体,列出缺失字体、缺失媒体、外部链接、无法显示的对象及所在幻灯片或母版,点一行转到该页(内核与应用测试,共用夹具 tests/fixtures/show/trouble.fodp)。真窗口看过导出对话框。R1 FAIL 六项已修,带回归与变异检验:系统打印面板改在 GPUI 放开应用之后打开(ely_office::print_later,ElyDoc、ElyTable 同用;模态循环里点菜单原会因借用冲突崩溃);图片先以排他方式占下全部目标文件再画,任一已存在(含失效的符号链接)即不写并删去本次占下的,失败同样删去;输出的张数、隐藏与当前页取自标准幻灯片(.uno:SlideShow),母版视图下没有“当前”;读不出的图片按载入后的实际状态判定(链接先载入,解码失败的占位也算),OLE 链接的源文件缺失即标缺失(删去源文件的回归);检查与输出对话框的读取回来时,只有仍是最近一次请求且没有别的对话框打开才显示。打印面板的修复未在真窗口复验(本机当时有人在用)。R2 FAIL 三项已修,带回归与变异检验:PNG 编码后显式 flush 并报错(最后一次写入失败原被缓冲区析构吞掉,留下截断的文件);对话框或当前标签有任何变化,此前发起的检查与输出读取一律作废(另一个对话框打开后又取消,旧检查也不再弹出);图片的张数、隐藏与范围取自实际写出的副本(对话框打开后改了显示也一致)。审查者已在真窗口复验打印面板(幻灯片与讲义,面板里操作菜单、取消)不再崩溃。R3 FAIL 两项已修,未复审:范围的起止框键入即记下(原只在提交时记,失焦或直接按导出会丢掉键入的值;审查者以同一改法在真窗口验证,本项无自动测试,组件键入在应用单测里不可驱动);对话框打开后再显示隐藏页、导出图片得到三张可读 PNG 的回归(改回用对话框时的隐藏标志即失败)。未验证:真窗口里打印面板与讲义打印;Windows 与 Linux 的打印(ely_platform::print 只实现 macOS)。

C11 ElyPDF(§11)

  • [~] C11.1 PDF 工作进程与 MuPDF 绑定,C 垫片捕获异常;打开、渲染、阅读模式、搜索、书签(PDF-01)。已验证(macOS,MuPDF 1.28.5):worker 测试(渲染与深色、旋转、字符顺序与外框、搜索不分大小写、嵌套书签、坏文件报错后 worker 照常、关闭后文档不在、1000 页到第一块不到 3 秒);应用测试(打开带页数与书签、查找跨页逐个跳转与 Esc 关闭、跨页选择复制、切换单页仍在原页);布局、旋转换算、缩放档、选择与书签的纯函数测试;真窗口:打开 30 页文件、深色页面、放大、查找“2 of 30”并标出、双页。未验证:加密文件的密码流程(测试 PDF 待 C11.7 能写加密文件);200 MB 的真实大文件;Windows 与 Linux。 — R1 FAIL 十三项已修:测量层位置未绑视口(拖选无效);首次拖选丢起点;跳转后当前页回退;旧查找结果混入新查找;后台查找改动别的标签;画不出的块反复请求;单页命中超 512 被截;跨行短语算两处;第二个加密文件挤掉第一个;长页屏外块不丢;空书签仍占左栏;空白窗口即起 worker;截断的帧头当作流结束;另修垫片三处长注释并让注释检查覆盖项目 C 源码;各加回归,去掉修复时回归失败(左栏只测判定,渲染接线未单测) — R2 FAIL 四项已修:密码框里取消时下一个密码框建不出(窗口仍在事件中;现延后到事件结束,建不成即关闭该文档);双页时当前页被改回左页;横向屏外的块照请求照留;零页文件开出标签、单页视图越界崩溃(现报错并关闭,布局接受空页集);各加回归,去掉修复时回归失败 — R3 FAIL 五项已修,三轮用尽:提交密码时对话框的关闭回调放弃了文档(现关闭后对话框仍是这一份才放弃);连续密码框共用一个标识,第二个收不到 Esc(现按输入框实体区分);双页当前页不看横向(现只在两向可见的页里定);放大双页跳到右页不横移(现目标页左缘出视口即横移);视口右缘恰在图块边界时多取一列(现按半开区间);各加回归(真键入回车、两次 Esc、横滚、跳转、边界),去掉修复时回归失败;真窗口加密文件流程仍待 C11.7
  • [~] C11.2 页面组织(PDF-02)。已验证(macOS,MuPDF 1.28.5 加补丁 0001):外壳 ely-office 按引擎泛化(LOK 与 MuPDF),ElyDoc、ElyTable、ElyShow 全量照过(ElyDoc 加锁测试改为关外壳的密码框);worker 测试(删除后书签、链接、字段、页码标签,移动后书签跟随页,旋转、按所见边距裁剪与去裁剪,空白页与从文件插入,提取不改文档也不成重做,保存后撤销重做,坏编辑回滚);应用测试(删除后标签为未保存、撤销回到已保存,保存写入移动、保存后撤销为未保存、重做为已保存,编辑一次一条按序,编辑前的读取丢弃,关闭询问,提取与拆分写新文件、不覆盖打开的文件、目标已存在即一个不写,裁剪按毫米,点选、连选、增减);逐项变异验证;真窗口:缩略图栏、深色页面。组件库 2ce3368(ContextMenu 可定宿主大小)。未验证:拖动移动只经单测的同一入口(move_to),未在真窗口拖;修复后打开的文件不能保存(快照不支持,待 C11.8);200 MB 文件的保存内存峰值;Windows 与 Linux — R1 FAIL 八项已修:提取在原文档的撤销历史上做临时删除,冲掉重做(现在快照副本上做);结构编辑后区间点选的起点仍指旧页,插入空白页越界崩溃(现清掉起点);编辑失败不通知,等着的保存挂住(现失败也通知);窗口关闭在界面线程同步读历史、持锁关闭文档(现全在后台,关完再移除窗口;ElyDoc、ElyTable、ElyShow 同);从文件插入丢掉链接、批注与字段(现一并嫁接并改指新页,重名字段加序号);省略 /P 的字段控件不随页删除(现按被删页的 /Annots);裁剪不看视图旋转;裁剪不看 /UserUnit;各加回归,去掉修复时回归失败 — R2 FAIL 三项已修:重名字段的候选名用 256 字节定长缓冲,长名截断后永远同名,worker 卡死(现按需分配);插入的字段丢了源表单的默认外观与字体资源,合并后外观改变(现带过来,冲突的字体改名并改写引用;回归按红色像素比对渲染);一处注释超长;各加回归,去掉修复时回归失败 — R3 FAIL 两项已修,三轮用尽:改写字体引用不解 PDF 名称的 #xx 转义,转义写法的字段仍绑到目标的同名字体(现解码查表、转义写出);源表单的默认对齐 /Q 丢失(现与 /DA 一起给到字段树根);各加回归(保存后的字节),去掉修复时回归失败
  • [~] C11.3 文字对象编辑、图像与对象(PDF-03、04,§11.3)。已验证(macOS,MuPDF 1.28.5 加补丁 0001):worker 测试(块的文字、字号、可否编辑,表单里的字不可改;改字后旧字形不在、撤销复原;字体缺字时什么都不改、换中文字体写入;预览画出改动而文档不变;新文字落在点击处、颜色照设;图片与表单的移动、缩放、按比例替换、删除、添加与撤销;自带字体写入后再改;预览或撤销后再加同一字体仍正确);应用测试(点选块用自带字体改字不出预览;换字体先出预览、缺字提示;拖动图片与拉角缩放;新文字与删除对象;Esc 退出工具);去掉修复时回归失败(资源缓存);真窗口:编辑工具的轮廓、点选出面板、改字应用。用户定:字体用 MuPDF 内置,对象为图片与表单 XObject。未验证:页面内联图片(BI…EI)不可选;竖排与旋转的字不可改;Windows 与 Linux — R1 FAIL 七项已修:预览与缺字拒绝在开步后才查,冲掉重做(现检查都在开步前、预览在快照副本上);字号变大未出预览(现字号或范围变了即预览);同一基线的几段被当成两行,行距为零(现按不同基线);选文件期间换了标签,替换与添加图片落到别的文档(现绑定发起视图与版本);编辑落地时进行中的图层读取被丢弃,读取标记永远为真(现回来总清标记);文字框里按 Esc 不退出(上下文移到窗口根);注释超长,注释检查补上 .h 与多行 C 注释;各加回归,去掉修复时回归失败 — R2 FAIL 两项已修:预览确认不核对文档版本,删页后改写到别的页(现预览带版本,编辑落地即关,确认与执行前核对);选文件期间有排队的编辑,序号作废仍执行(现核对版本且须无排队编辑);各加回归(同文两页删首页后旧预览不写、排队时不执行),去掉修复时回归失败 — R3 FAIL 一项已修,三轮用尽:删除对象不核对版本与排队,连按两次删除删掉未选中的对象(现删除与拖动都须视图未变且无排队编辑);各加回归(连按两次删除只删一个、排队时拖动不入队),去掉修复时回归失败
  • [~] C11.4 批注、表单(PDF-05、06)。已验证(macOS,MuPDF 1.28.5 加补丁 0001):worker 测试(九种批注一步添加、读回种类颜色内容作者印章、高亮按颜色画出、撤销重做、存后另一 worker 读到;坏的批注连同好的都不加、重做不丢;按对象号改色改内容与删除、撤销回同一对象;新建文本、复选、两个同组单选、选择框,填写后保存重开值与选中保留、文本值画出;重名、点号、非组的单选名、空选项拒绝,改名撞名拒绝,组里最后一个按钮删去即删组;选择框换选项保留或清空原值;填写在撤销重做之间照样画出);应用测试(拖选高亮一步、作者为账户名、撤销;矩形与手绘按拖动落位、单击不画椭圆;便签与印章先问后加、单击选中改色删除;拖出复选与选择框后单击勾选与取消、右栏填选择框与原有文本字段;第二个单选默认并入本页组、组内只一个选中;排队编辑时单击复选框不入队;左栏批注读完全部页、点行转页;表单工具改名改选项、无改动不成一步);变异验证(排队守卫、开步前检查、删组);真窗口:高亮画出、左栏批注列表、右栏颜色与作者、表单菜单画复选框、阅读时单击勾选。组件库 3d08744(DescriptionList 的值占满所在列)。未验证:已有文件里的签名字段与按钮只读不改;多选列表框只当单选填;Windows 与 Linux — R1 FAIL 三项已修:子字段改名按父路径下的全名查重(原从根查,与兄弟字段同名),右栏只改名字末段;文字未读到时拖出的高亮等文字到后再加(原直接丢弃),换工具、新的按下或编辑即作废,读取失败即报错;新字段默认名按全文已有字段取(原只看本页),右栏等全部页读完再给;另修:右栏在拖动或绘制期间不打开(原按下即开,视图变窄,页面在手下移动,C11.3 的拖图测试约三成失败);单击按窗口像素判定(原按页面点,手下页面平移时误判为拖选);各加回归,去掉修复时回归失败 — R2 FAIL 两项已修:默认名也避开字段的父名(原只比完整名,有 Text1.Child 时仍给 Text1);已开的右栏在手势中保持开着(原手势中一律收起,页面在手下移动);另修根因:手势开始时冻结该页在窗口中的位置与比例,拖动与绘制都按它换算(右栏动画中开始的拖动也不再错位);各加回归,去掉修复时回归失败 — R3 FAIL 一项已修,三轮用尽:没有页面控件的字段(如只在字段树里的父字段)仍占名,默认名照样撞上(现 worker 读整棵 /AcroForm/Fields 的全部名称,右栏等它读完再给);加回归(worker 列出无控件的父与子、应用默认名避开它并能添加),去掉修复时回归失败
  • C11.5 文档结构、OCR(PDF-07、08)。已验证(macOS,MuPDF 1.28.5 加补丁 0001、0002,tessdata_fast):worker 测试(扫描页按行识别出英文两行、位置为页面点;写入隐藏层后可查、可搜、画面逐像素不变,一步撤销重做,存后保留;重新识别替换旧层、不替换则并存;BMP 外字符、空行、越界页拒绝且不改;简体与繁体中文识别;坏语言报 Tesseract 错误后 worker 照常;书签加在末尾与子项之后、改名改目标、按标题核对、删除连子项、撤销、存后保留;链接列出内部目标、加网址、改到页、地址已变即拒、javascript 与 file 拒绝、删除;属性读写、生成程序不可改、存后保留;附件按名列出与读出字节、重名拒绝、移除、存后保留);应用测试(单击链接跳页;链接工具拖出后坏目标不写、网址写入、单击已有链接改到页与删除;书签以页名为默认标题添加、选中后改名与删除;属性只写改过的,无改动不成一步;附件栏列出、另存为写出原字节、移除;OCR 一页读完后一步写入可查,再识别时跳过已有文字的页;取消即不写);变异验证(OCR 跳过策略、属性只写改过的、补丁 0002 两处);真窗口:识别文字对话框、扫描页识别后查找命中。未验证:XMP 元数据不随属性改;Windows 与 Linux 上的 OCR — R1 FAIL 六项已修:OCR 层的 3 Tr 漏到之后写的字,新字不显示(现层内 q … Q);范围字段只在提交时更新,键入后直接点识别仍用旧值(现随键入更新,真窗口键入 2 后只读第 2 页);取消的识别回来的页会进入新一次识别(现每次识别带编号);多语言里有一种载入失败仍报成功(补丁 0003,载入数少于请求即报错);批注里的附件不在附件栏(现一并列出、读取、移除,以键区分);缺 /Size 的附件显示 0 B(现按实际字节);各加回归,去掉修复时回归失败 — R2 FAIL 一项已修:读附件时取走了文档自己持有的流缓冲区,再读为空、保存后附件内容丢失(现复制字节);加回归(连读两次、读取不改历史、存后重开字节完整),去掉修复时回归失败 — R3 PASS
  • [~] C11.6 内容删除与文档清理(PDF-09、10,§11.4,QA-14)。已验证(macOS,MuPDF 1.28.5 加补丁 0001 至 0003):worker 测试(删去“Hello”与其上的隐藏文字后,输出文本不含二者、其余文字保留、文件字节里无该词、只有一个 startxref,打开着的文档历史不变;图片被区域盖住的一半全黑、另一半保留颜色;区域内的便签删去、远处的保留;空区域与越界页不写文件;清理前计数,全选清理后各类为零、属性无标题、无附件、无隐藏文字、可见文字保留、原文档计数不变;只清批注时属性保留;未勾选报错);应用测试(区域标记与单击取消;文字标记写出新文件后无该词、原文档无编辑;编辑后标记清空、无标记时不开对话框;清理先计数再写出、标题已去);变异验证(删去区域内批注、编辑后清空标记);核对本身抓出过两处:判字相交须与删除同一缩框规则(原把邻字算作残留),并证实隐藏文字随删除一并去掉;真窗口:区域标记的深色框与删除对话框。未验证:Windows 与 Linux — R1 FAIL 八项已修:部分盖住的路径留在文件里(现碰到即整条删,核对加设备重放,区域内除黑框外有画即失败;图片单独画出只许白或黑);字段删控件后空父字段带值留下(现一并去掉);关着的图层与零透明度文字未清(现过滤器设 View 用途,删图层内一切与看不见的字);页面上的 XMP 未清(现清全部对象的 /Metadata 与 /PieceInfo);无 /Names 时清理报错(现判空);隐藏批注两头不计(现计入隐藏内容);扫描回来不核对标签与版本(现用 ask_in 并核对版本,对话框写文件名);路径选择期间改了标记仍写(现确认时绑定标记与版本,变了不写);各加回归,去掉修复时回归失败 — R2 FAIL 六项已修:删字后标记内容的 /ActualText 留下(现有区域的页去掉标记内容与结构元素的替代文字);重叠区域后者删掉前者的 Redact 批注(现先删后建);/AF 关联文件、嵌套直接字典里的元数据、链接与父字段上的脚本、/Next 链里的脚本漏清(现一遍遍历全部对象与嵌套值,脚本从链中摘除、后续接回);各加回归,逐一变异验证失败 — R3 FAIL(三轮用完)四项已修:子项 MCR 指定页的结构元素替代文字留下(现按子项 Pg 判定并连同上级);页面 /Thumb 引用原图(现删去,核对查缩略图);隐藏文字的标记内容 /ActualText 留下(现有隐藏文字被删的页去掉替代文字);隐藏链接与隐藏字段漏清(现按 /Annots 删链接,控件连同字段值删);各加回归,逐一变异验证失败;未经第四轮审查
  • [~] C11.7 密码、签名(PDF-11、12,QA-15)。已验证(macOS,MuPDF 1.28.5 加补丁 0001 至 0004,OpenSSL 3.6 静态链接):worker 测试(AES-256 保护副本要密码、只许所给权限,越权请求以权限名拒绝;错的所有者密码不改访问,AES-128 样本上错一次后文字照读;对的解除限制;只凭用户密码不能改保护,所有者可去掉保护;所有者密码必填且不同于打开密码;无打开密码的文件照守限制;新签名摘要未改、签名者与原因地点读回、证书即所给证书;证书密码错不写文件;改一字节即为已改;二次签名后首个仍未改且标为其后有更新;空签名字段原位签;不许改页面时不能加新签名字段;普通保存的已签文件不带签名、字段留空;键入签名以嵌入的 Great Vibes 写入、缺字报出该字);系统信任测试(自签名证书不受信任、以其为锚即受信任);应用测试(限制在所有者密码前拦住旋转、错密码再问、对后可旋转;禁止复制时剪贴板不变;保护对话框要求不同的所有者密码并写出加锁副本;已签文件为签名风险、签名对话框读出未改与不受信任并画出;签名写出副本、原文档无编辑;拖框后有编辑即不签;手写、键入、图片三种可视签名各落为墨迹、文字、图片且按比例;对话框把手写交给放置工具);逐项变异验证(所有者错后重认证、权限核对、复制拦截、整份写出去签名、签名前核对版本);真窗口:已签文件的提示条与状态、签名对话框(曾抓出列表行含换行即崩溃,改为对话框分行)、可视签名对话框(组件库 a6b1bb0 让签名板文案进中英目录)。未验证:Windows 与 Linux 的证书信任;时间戳与吊销;在真窗口拖框签名与放置可视签名(同入口经单测) — R1 FAIL 五项已修:只按页面控件列签名,漏了不在页面上的签名字段(现按表单字段树列,页可无;无 /P 时从页面 /Annots 找);另存为已签文件后打开的文档仍带签名(现保存时同一步去掉内存里的签名值,不算编辑,列表重读);签名完成清掉当前标签的位置(现只清发起视图的同一位置);所有者密码回复关掉后开的对话框(现只关同一输入框的对话框);补丁注释超长且检查漏看补丁里的块注释(现缩短,检查覆盖);各加回归,逐项变异验证失败 — R2 FAIL 两项已修,根因同一:上轮在保存时去掉打开文档的签名,写入失败即坏了原签名、撤销重做又带回签名;现签名一律从文件读(SIGNATURES 带路径,另开文件核对),列表按标签当前路径读,内存去签名删去;加回归:另存失败后仍为已签与原签名、另存后撤销重做列表仍无签名,变异(改回读编辑中的文档)即失败 — R3 FAIL(三轮用完)三项已修:另存为后签名仍用内存里带旧签名的文档(现已签文件另存成功即按新文件重开标签;去签名时清掉该字段自身的只读位,副本里的空字段可再签);签名列表按路径缓存,文件被外部改动后仍显示旧结果(现每次打开对话框重读);保存打不开输出文件后 MuPDF 的保存中标志留着、此后编辑不进撤销(补丁 0005);各加回归,逐项变异验证失败;未经第四轮审查
  • [~] C11.8 输出、文件恢复(PDF-13、14,QA-13)。已验证(macOS,MuPDF 1.28.5 加补丁 0001 至 0005):worker 测试(页面按 144 dpi 导出为两倍点数的 PNG、离谱分辨率报错;文字按页以换页符分开;优化副本小于原件十分之一、432 dpi 的图片降到 150 dpi(宽 205 至 212)、降到高于阈值报错;无打印许可不能出打印副本、无复制许可不能导出文字;损坏文件打开得修复报告、两页照读、编辑后能保存、原件字节不变,完好文件无报告;保存打不开输出后历史仍完整);PDFKit 读回改字、填写的字段与页序;应用测试(导出两页图片与文字;损坏文件为修复风险、有报告、报告对话框画出,另存到原件被拒且原件不变,另存新文件后按新文件重开、无风险);变异验证(不换修复副本、修复风险不报、另存后不重开);真窗口:损坏文件的提示条与状态、导出对话框。未验证:Windows 与 Linux 打印;真窗口实际打印;图片编辑经独立阅读器核对 — R1 FAIL 三项已修:另存后立即重开丢掉快照之后的编辑(现标签记下待重开,内存与文件一致时才重开,期间的编辑留着、下一次保存后重开);尾部完好而对象偏移坏时 MuPDF 读到才修复,漏报且保存失败(现打开与解锁后逐个读对象,修复都在打开时发生);降采样数值只在回车或失焦时生效,键入后直接导出用旧值(现随键入生效);前两项各加回归,变异验证失败;第三项真窗口复测:键入 72 后直接点导出,输出图片宽 100(即 72 dpi) — R2 FAIL 两项已修:结构完好而内容流解压失败时当作正常文件、导出空文字、保存覆盖原件(现打开时解码图片以外的数据流,有警告即为损坏、改开副本;导出遇警告报错);打印副本照原加密、打印面板打不开(现打印副本不加密,打印后删去);各加回归,逐项变异验证失败;真窗口:带打开密码的文件打印面板打开,取消后副本已删 — R3 FAIL(三轮用完)两项已修:扫描跳过图片,坏图片照样可原位覆盖(用户定:图片在画出时检查,没画过的在原位保存前检查;画出遇警告即转修复风险,保存前检查有问题即转另存为);导出图片在等编辑与选路径前取页码,删页后导出另一页(现绑定发起时的视图版本,变了即拒绝);各加回归(画出的坏图、没画过的坏图、排队删页),变异验证失败;未经第四轮审查

C13 ElyTree(§13)

  • C13.1 Git 运行器(参数数组、porcelain v2)、仓库管理、工作区状态(TREE-01、02)
  • [~] C13.2 差异、暂存(TREE-03、04)。已验证(macOS,随附 Git 2.56.0):Git 自己的差异解析(无换行结尾、二进制、非 UTF-8、空白上下文行);按块与按行暂存和取消暂存,索引字节逐一核对(两块只暂存一块;只选一行加入或删去;末行无换行时的追加与恢复;用户 apply.whitespace=fix 不改所选字节);显示后文件变了即拒绝、索引不动;空旧文件不折叠;文件与链接互换两段都显示、整份暂存、行与行号逐一核对;悬空链接与指向非 UTF-8 文件的链接按链接路径读;图片与二进制按大小或图片显示;忽略空白时空白改动不显示;窗口内选行(Shift 取范围)、暂存后所选清空、换文件后旧读取迟到即弃;真窗口经 AX:选两行暂存,索引恰为所选,已暂存区显示实际索引内容,并排视图,各行、块按钮与分段在 AX 树中。未验证:Windows 与 Linux — R1 FAIL 八项已修:换文件后旧读取覆盖新文件(读取序号窗口内唯一);未选删去行留作上下文时照搬无换行标记,追加行被并入(按两侧实际行尾生成);apply.whitespace 改写所选字节(--whitespace=nowarn);差异外的非 UTF-8 字节被替换成 U+FFFD 仍进文本视图(两侧整份核对);diff.suppressBlankEmpty 使差异读不出(命令里覆盖);空旧文件被算成一行(零行);组件 viewer.rs 超 500 行(拆出 rows.rs);三条组件注释超十词。R2 FAIL 三项已修:取消暂存时所选删去行的无换行标记照搬,与后行相接(统一规则:无换行的行在哪一侧后面还有行就带上换行);文件变成符号链接时同一路径两段输出读不出(解析多段);rows.rs 一条注释超十词。R3 FAIL 两项已修(不再送审):类型变化两段共用折叠游标,已删除内容又显示为未改动(多段时不折叠);工作树侧跟随符号链接读目标(按 Git 读链接自身的路径字节)。
  • [~] C13.3 提交、历史、Blame(TREE-05、06)。已验证(macOS,随附 Git 2.56.0):历史读分支、标签、合并,分页,按信息、作者、提交号、改动文字搜索;文件历史跨重命名;提交详情(根提交、重命名、新增)与其文件差异;Blame 含未提交行;提交与修改最近提交,# 行在用户 commit.cleanup=strip 下照留,钩子失败报出原话;身份与签名取自 Git 设置;窗口:提交框提交后历史自动重读、选提交与文件,提交框按仓库各存一份,连按两次修改最近提交读回作废,提交期间键入的保留,Blame 只取最新一次读取,历史读取期间的外部提交读完后补上,引用读不出时报错、修好后恢复,外部改身份后重读、身份对话框字段有无障碍名;真窗口经 AX:历史页、提交详情各字段、差异行与 Blame 行的文字、文件历史。未验证:Windows 与 Linux;实际 GPG/SSH 签名 — R1 FAIL 八项已修:提交框与修改最近提交各仓库共用(按仓库存);修改最近提交的读取迟到又打开(作废序号);提交完成无条件清空(只清仍是所提交内容的);文件历史与 Blame 回调只比路径(每次打开的序号);commit.cleanup=strip 删 # 行(--cleanup=whitespace);历史里的文件无文件历史与 Blame 入口(文件标题栏);提交详情不进 AX(DescriptionList::text 等);组件注释超十词。R2 FAIL 三项已修:勾选在读回前不显示,第二次点击仍是勾选(立即勾选、读回前不能提交);只读差异行不进 AX;Blame 行不进 AX。R3 FAIL 五项已修(不再送审):历史读取期间的外部更新漏掉(记下、读完再比);引用读不出只写日志(显示原话,读通即清);外部改身份与签名不重读(状态重读与窗口回前台时重读,取最新);身份对话框输入框无无障碍名(以标签命名);组件注释超十词。
  • [~] C13.4 分支、标签、合并、变基、冲突(TREE-07、08、09)。已验证(macOS,随附 Git 2.56.0):分支与标签的建、改名、删(每次先问)、切换(远程分支按完整引用跟踪,不被同名标签劫走);合并、拣选冲突停下不弹失败框,提示条写明两侧;按块取一侧、保存、标为已解决、继续得到合并提交;标记宽度照 conflict-marker-size(5、10,以及 0、-1、abc、10abc 按 Git 当作 7),正文里形似分隔的行照留,只按 LF 断行;diff3 空基底不被补填;含 NUL 的冲突整份解决;钩子拒绝(继续时的 pre-commit、取一侧时的 post-checkout,输出含 CONFLICT 字样也算)显示 Git 原话;真窗口:冲突提示条、三侧、按块取另一侧。未验证:Windows 与 Linux — R1 FAIL 七项已修:符号链接与二进制冲突按文本处理(整份解决);保存不经写队列、顺着符号链接写(入队、拒绝链接);钩子失败被当成冲突停下(按未合并条目判定);冲突分块另算一套合并(照 Git 的标记);同名分支与标签混淆(完整引用名);行内动作未接;窄时删除按钮被挤出。R2 FAIL 六项已修:标记宽度写死 7、======= 前缀行当分隔(按属性宽度、整行判定);仍有未合并条目时钩子失败被当成停下(按命令与 Git 的 CONFLICT 行判定);NUL 的 UTF-8 文件当文本(按 Git 视为二进制);zdiff3 基底覆盖 diff3 空基底(只填缺的);远程分支切换被同名标签劫走(refs/remotes/);组件注释超十词。R3 FAIL 三项已修(不再送审):conflict-marker-size 为 0、负数或非数时读错(照 Git 的 strtol_i,不合即 7);正文里的独立 CR 被当作行界(组件 a284c71 按 LF 断行);任意含 CONFLICT 子串的钩子输出被当成停下(须是合并类命令、输出有以 CONFLICT ( 起头的行、且索引仍有未合并条目;Git 的报错带上 stdout 与 stderr 两者,拣选的 CONFLICT 行在 stdout)。
  • C13.5 Stash、远程、worktree、submodule、LFS(TREE-10、11、12)。已验证(macOS,随附 Git 2.56.0 与 git-lfs 3.8.0):储藏的列表、说明与分支、未跟踪文件分开显示与其差异;弹出遇冲突保留储藏;储藏列表变了即拒绝;远程的地址与推送地址;强制推送列出将覆盖的提交,远端在计划之后变了即被租约拒绝,取回后再推成功;没有上游或游离不给强制推送;工作树的分支与失效、清理;子模块未检出与在记录的提交上;LFS 对象在本机与只有指针;窗口:储藏对话框、储藏详情、删除先问、弹出;取回带进度落地;停止取回不报失败;无上游推送先问远程并设上游;强制推送对话框;设置与取消上游;真窗口:仓库页各列表、储藏与工作树详情。未验证:Windows 与 Linux;真实网络凭据;LFS 对象下载 — R1 FAIL 六项已修:强制推送确认后本地分支再动会推出未预览的内容(推送所示的源提交);对话框提交时写进当前标签而非打开时的仓库(各表单带仓库号,含 C13.4 的分支、标签、改名与身份对话框);按冒号前缀合并输出删去钩子的报错行(只合并回车改写的行);推送的远程名前无 --(加上);空说明的储藏使整个列表读失败(按三字段解析);行的焦点框不画、行内动作只在悬停时显示(组件 bc6f1c2 与 3741d5d:透明边框、动作一律显示)
  • [~] C13.6 恢复与清理、外部工具、操作规则、外部 Git 响应(TREE-13、14,§13.3,QA-19、20)。已验证(macOS,随附 Git 2.56.0):引用日志的位置、原因与先后;把分支移回保留工作区改动,HEAD 在预览后动过即拒绝;清理预览含制表符、引号、中文名与文件夹,只删所列,预览后新建的与被忽略的留下;锁文件在时对话框重试、锁文件不被删除、去掉后重试成功;凭据被拒显示 Git 原话;变基中断、中止后回到原处;窗口:清理对话框、引用日志选中与移回;编辑器设置的读写与损坏不覆盖;真窗口:工具行、清理预览、文件标题栏按钮与启动 ElyMark。未验证:Windows 与 Linux 的终端;ElyMark 打开文件的内容(C14) — R1 FAIL 八项已修:清理把预览的文件夹整个交给 Git,预览后其中新建的文件也被删(展开为文件,只删所列,空了的文件夹才删);reset --keep 丢掉独立暂存的内容(有暂存即拒绝,执行前再查);移回只核对提交,切到同一提交的另一分支也会被移(另核对完整分支引用与游离);引用日志时间取了提交时间(取该次移动的时间);同一提交的多条日志一起选中、详情取错条(按条目选);编辑器设置字段类型不对被当成未选并覆盖(报错不覆盖);open -a 的失败被丢掉(等它结束并显示);配置文件锁不认作锁(加上其原话)。R2 FAIL 两项已修:所列文件在确认前被换成同名文件夹时 git clean 递归删去其中新文件(先查类型、变了即整体拒绝,由 Ely 逐个删文件);刷新后按旧位置取引用日志条目,选中与详情漂到别的事件(按事件本身认定)。R3 FAIL 三项已修(不再送审):直接删文件时不管确认前已被跟踪的文件(改回 git clean -f -- 所列文件,Git 留下被跟踪的);父文件夹被换成指向仓库外的链接时删到外面(逐段核对无链接、类型不变,变了即拒绝);同一秒同原因的两条引用日志无从区分(加自最早起的序号)

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 秒的图排队时切回源码,之后的主线程长停顿须不超过一次,去掉核对时为两到三次)
  • 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 加响应式图片三种、错误公式、图片名与公式文字不进日志;去掉各项时失败

C15 ElyAgent(§15)

第二批发布(用户定,2026-10-08):首版不发布 ElyAgent,首版的完整测试与打包不等它。

  • C15.1 嵌入 Kigi CLI 的 Rust 代码作后端,沿用其提供商登录与模型配置,不用 ACP(§15.2)
  • C15.2 工具管理、配置管理、配置保护(AGENT-01、02、03)
  • C15.3 会话、输入输出、并行运行(AGENT-04、05、06)
  • C15.4 工具与授权、文件与产物(AGENT-07、08)
  • C15.5 会话恢复、执行控制、历史、用量(AGENT-09、10、11、12)
  • C15.6 本地模型、托盘、生命周期(AGENT-13、14,§15.4,QA-23、24)

C12 ElyMail(§12)

第二批发布(用户定,2026-10-08):首版不发布 ElyMail,首版的完整测试与打包不等它。

  • C12.1 MailCore 2 构建、C 垫片、Rust 绑定,三类协议连通与 MIME 解析
  • C12.2 本地存储:SQLite 索引、内容目录、消息身份(账号、邮箱、UIDVALIDITY、UID)、容量(§12.3、§18.1)
  • C12.3 账号、TLS、OAuth 流程、应用密码(MAIL-01、02)
  • C12.4 同步:头与 90 天正文、按需附件、队列、POP3、同步控制(MAIL-14,§12.3)
  • C12.5 邮箱视图、阅读、会话线程(MAIL-03、04)
  • C12.6 写信、草稿、发送队列与发送状态机(MAIL-05、06、07,§12.4,QA-17)
  • C12.7 组织、搜索、附件(MAIL-08、09、10)
  • C12.8 规则、联系人、迁移、通知(MAIL-11、12、13、15,QA-16、18)

R1 首版:六个应用的打包(§2.2、§21,用户 2026-10-08 定)

  • [~] R1.1 八个应用的图标(同一套设计:macOS 为标准 squircle,Linux 与 Windows 为无底形);系统交给应用的文件(启动参数与访达的打开请求)都经同一条路打开;macOS 包自带各自的引擎(LOK 与其 worker、PDF worker 与 OCR 数据、ElyTree 的 Git),带文档类型与图标,按批次出 dmg — R1 FAIL 五项已修:正式签名的 CEF 辅助程序缺 JIT 许可,页面载入失败(渲染与 GPU 辅助程序带 allow-jit,hardened-macos.sh 以开发证书签名后页面画出);随包 Git 随本机 SDK 要求 macOS 27(以 14.0 构建,release-macos.sh 核对每个二进制的最低系统);同时打开多个 CSV 时前一个导入询问被替换丢失(排队逐个询问,单测);发行无许可与源码资料(每个包的 Licenses、源码包,缺即失败);图标测试放过全透明图标(核对标记与颜色)。另:嵌入整个 LibreOffice.app 使系统登记其快速查看插件,设置里出现“LibreOffice 扩展”(用户发现;改为只带内核并注销本机登记,测试不再运行 LibreOffice);Git 的内建命令改为链接(ElyTree 689 MB 降到 63 MB)。去掉各项时相应测试失败 — R2 FAIL 两项已修:MuPDF 编进 worker 的五组字体(urw、sil、noto、droid、han)缺许可(按构建实际嵌入的字体族收齐,release-macos.sh 核对);图标测试只验 ico 的 256 层(逐层、逐个 icns 尺寸验标记,清空 16 像素层即失败) — R3 FAIL 五项已修(不再送审):字体许可把 README 当作许可(每族须有 LICENSE、COPYING、NOTICE 或 OFL,README 只作附加;release-macos.sh 同样要求,去掉 SIL 的 OFL 即失败);ICO 小尺寸层换成实心方块仍通过(每个 png、ico 层与 icns 尺寸都与母版重新渲染逐像素比对,按预乘比较,macOS 的 16、32 像素旧格式容差 8;实心与清空 16 像素层都失败);三处注释超过十词(改短,comments.py 另查 packaging 下的 Python 与 Swift)
  • R1.2 各系统的文件关联(用户 2026-10-08 要求核对):packaging/types.tsv 一处定义;Linux 桌面项 MimeType=,Windows 安装程序“打开方式”注册与卸载(packaging/windows/types.sh,makensis 编过),macOS 照旧;都不设为默认;tests/scripts/types.sh 核对三端一致 — 未送审:用户 2026-10-09 定性能已够、先发首版

C16 应用之间的连接(§16)

  • C16.1 六个入口:邮件附件、导出查看、Markdown 版本、Agent 产物、文件作邮件附件、应用切换。首版做六个应用之间的三项(导出后查看、Markdown 查看版本、应用切换),邮件附件、文件作邮件附件与 Agent 产物随第二批 — R1 FAIL 三项已修:符号链接文件交给 ElyTree 时按目标文件取历史(只解析所在文件夹的真实路径,保留 Git 跟踪的名字,单测含仓库外的链接);系统默认程序打开的失败被吞(apps::open_default 核对退出状态并提示,单测);mark-output.sh 只按回车提交保存面板(改按其“存储”按钮,连跑两次通过)。另:系统打开、应用切换与 ElyMark 交 ElyTree 都改在后台运行,界面线程不等子进程 — R2 FAIL 一项已修:新加的符号链接单测未限 Unix,Windows 测试编译失败(加 #[cfg(unix)];同类的 ElyDoc 导出、ElyMark 文件夹、ElyShow 图片三个旧单测一并加上);本机无 MSVC 工具链,Windows 测试编译未能本机核对

C17 工程结构与接入边界(§17)

  • [~] C17.1 进程与状态规则核对:工作进程、请求带会话与修订、FFI 边界、后台任务(§17.2、§17.4) — R1 FAIL 六项已修:LOK 文档号取内核指针、释放后被复用(每次载入一个会话号;关后再开四次,旧句柄被拒、新文档事件照常);PDF 请求不带预期修订(Doc 带历史标记,指向页与对象的请求在动内核前核对,过期以 stale: 拒绝;删页后按旧页码转页被拒);PDF 句柄不分 worker(句柄带 worker 会话,文档号带进程前缀);发送端可写超限帧(发送前即报错,worker 的超限结果回错误);LOK 输出读错时请求一直等(错误经回复通道交回,停下并回收 worker);PDF 打开中途失败泄漏原生文档(失败即释放,超过 MuPDF 256 MB 缓存后不再增长)。另:对话框关闭原以文档号当指针(回调另带原生句柄)。各项都有回归测试,去掉修复即失败。R2 FAIL 三项已修:LOK 按编号的命令不带预期修订(worker 记修订,EXPECT 核对,删表后按旧编号改名被拒);LOK 会话号每个 worker 都从 1 起(会话号带进程前缀,句柄带 worker 会话,别的 worker 的句柄被拒);PDF 附件的读取与删除带“任意”(改为带标记,同名附件换过后旧读取与旧删除都被拒、新附件不动)。随之:一次读取得出的一组命令只核对一次;不按键的鼠标移动不算改动;ElyTable、ElyShow 落后于视图所见修订时重读;读取闭包取视图的句柄。R3 FAIL 四项(第三轮后修,各有回归测试,去掉修复即失败):幻灯片备注的 Part 等编号不核对(编号参数补齐 Part、TabNo、行列与区域四角;删去前一张幻灯片后旧备注请求被拒、余下幻灯片的备注不动);重命名对话框确认时取最新修订(对话框记下打开时的修订,经 run_on 执行;对话框开着时删去第一张表,确认后 C 不被改名);输入失败时视图丢了 worker 已加的修订(失败也取回修订;拆分失败后输入器报出的修订与 worker 一致);ElyDoc 删除所示制表位被拒(属性栏按视图所见修订发;添加后删除再保存)

C18 数据、配置与隐私(§18)

  • [~] C18.1 配置:版本化、原子写入、文件锁、合并已知字段;通用与应用偏好 — 通用与应用的 settings.json(版本、锁、只改所写的键、原子替换),设置窗口(Cmd+,:外观、语言、动效、Omarchy、作者名、ElyTree 的 Git),别的应用写入即刻跟随,主窗口位置;顺带修 ElyMark 启动的应用收不到 SIGTERM、组件 ThemeSelector 文案与 Banner 无障碍角色 — R1 FAIL 五项已修:作者框只在开窗时读一次,别的应用改名后失焦写回旧名(未编辑时跟随,只写真正的编辑);Git 校验迟到覆盖后一次选择(提交带序号,校验后在同一把锁下核对是最新的才写,过期的不回显);写入失败的提示被随后的重读清掉(另记保存错误,以 Banner 显示);ElyTree 自己的设置读不出时只进日志(Git 页显示原因);版本核对只看 stdout(先核对退出状态、带上 stderr);各加回归(settings.sh 四个场景,去掉修复各自失败;version_of 单测) — R2 FAIL 两项已修:作者名写入前就当作已存,写失败后被别处的名字顶掉、重按回车也不再写(已存与键入分开,写成功才更新已存,失败的输入留着可重试);提交与磁盘相同的 Git 时不作废在途校验,慢校验随后写回旧程序(每次提交先作废在途校验);settings.sh 各加场景,去掉修复各自失败 — R3 FAIL 两项已修(不再送审):作者名的在途写入在等锁期间被改回原值后照样落盘(每次提交都编号,含改回已存值);Git 的“是否最新”在拿到文件锁之前核对,等锁期间被作废的写入锁释放后照写(Store::set_if 在文件锁下核对,作者与 Git 共用);回归:另一进程持锁时改回原值、最后的选择留下(settings.sh 两个场景,去掉锁下核对即失败),set_if 单测
  • [~] C18.2 凭据:系统凭据库,不可用时只留本次会话;日志不含正文与密钥 — 恢复密钥在凭据库不可用时只留本次运行(内存);worker 日志并入应用日志、两端都读 ELY_LOG;设置里的诊断先列内容、默认去掉路径与姓名再导出;privacy.sh 真窗口核对日志与诊断不含正文 — R1 FAIL 六项已修:引擎原生 stderr(MuPDF 警告引出内容流里的词)原样进日志(relay 只放行 worker 自己的结构化记录与崩溃栈帧,其余只计数;worker 的失败日志把引号里的片段换成 …;崩溃提示改为结构化记录);脱敏只换家目录(凡含 / 或 \ 的词与 URL 都换成 <path>,分段标题只写文件名);短名先换拆开长名(按长度从长到短);日志读不出被当作没有(只有不存在算没有,其余报错);relay 把 worker 的模块名改成 lok-worker 后按模块的 ELY_LOG 过滤失效(保留原模块名与级别);privacy.sh 清理时以 143 退出(保留自身状态);回归:真 worker 读坏内容流后日志无该词(放行原生行即失败)、脱敏与日志错误单测 — R2 FAIL 三项已修:引擎错误串经“去引号”仍漏出无引号的数据与字段内的引号(worker、ElyPDF 应用与 LOK 输入通道的失败日志只记请求号与错误类别,全文只经回复交给界面;去掉 scrubbed);带空格的路径只换掉第一段(从路径起点整段换掉:有引号到引号为止,否则到行末);单字姓名不换(凡非空姓名都换);回归:真 worker 拒绝带凭据的 ftp 地址后日志无该串(记错误全文即失败),脱敏单测含空格路径、Windows 路径与单字中文名 — R3 FAIL 四项已修(不再送审):双引号内的转义引号提前结束路径(双引号里反斜杠转义,按 JSON 找收尾);日志尾部从行中截断,半截路径的文件名漏出(截在行中即跳到下一整行);姓名来源读不出照样导出(Redact::of_account 返回错误,导出即失败并显示);LOK worker 启动失败用原生输出,原因被 relay 丢掉、客户端只见管道关闭(改为结构化记录,Relay::last_error 把最后一条错误带进客户端的报错);回归:各项单测,真 worker 装不上内核时报错带 worker 的原因(改回原生输出即失败)
  • [~] C18.3 数据管理:缓存、清理、恢复副本、导出;数据库升级前备份,失败只读 — 设置里的“存储”:本应用的日志、网页内容缓存(ElyMark)、恢复副本各自大小与清除(日志当场清空;缓存与恢复副本用着,记下后下次启动、打开任何东西之前清掉),每个文档的恢复点数与空间可选(写进应用设置,ElyMark 的恢复点照用;C06.5 的文档应用同);日志过 8 MB 时启动即只留后一半(从整行起);数据库升级与备份只属 ElyMail(第二批),首版六个应用无数据库;邮件与 Agent 历史导出同属第二批;storage.sh 真窗口核对;组件库 ea4ed4c:SettingsRow 是以标题命名、带说明的组,辅助技术说得出各控件设的是什么 — R1 FAIL 四项已修:恢复点数与空间两个选择各自写回读取时的整份,连续修改互相覆盖(以界面此刻的值改一项,提交带序号,在文件锁下核对最新);清除不经确认(一律先问,写明删什么、何时删,确认才清);启动时清除失败只进日志(设置页写明,记号留着下次再试);测试只核对名称(已知大小的样本核对显示的大小,选 10 后连写 12 个恢复点只留 10 个,确认前不删,持锁时两次选择都留下) — R2 FAIL 四项已修:页面切换后的回读盖掉了未写入的选择(选过未写下的限额留在页面上,写成之后才按磁盘);启动时清除失败仍打开数据(改为启动失败并说明原因,记号留着下次再试);ax-values 新增的说明列挡住了其后的坐标(说明移到坐标之前);日志与恢复副本的大小未核对(日志不小于样本,恢复副本等于磁盘上按同法算出的大小);测试另加持锁时切页再选、清除失败时不启动 — R3 FAIL 三项已修并加回归,三轮用尽:设置窗口关掉再开丢了待写入的限额(待写入的限额、提交序号与写入失败移到应用级的全局,不随窗口);清除成功盖掉了限额写入的失败(两者各记各的,限额的失败留到限额写入成功);一条注释超过十词;storage.sh 加关窗重开两次持锁选择都留下、限额写入失败后清空日志仍提示、再写成功后提示消失

C19 文件兼容与输出(§19)

  • [~] C19.1 版本化兼容清单、往返验证用例(独立于内核比较) — 已做:docs/compatibility.md(版本、内核与补丁、验证机,六个应用各自的编辑保存、导入受限、输出范围,已验证与限制);independent.rs 三个用例(DOCX、XLSX、PPTX:Ely 编辑、保存、关闭、再打开、再编辑、再保存),由 tests/scripts/ooxml.py 不经 LibreOffice 解 OOXML 检查,预期值由它自己算(整数、日期、错误值、文本严格,浮点按用例容差),DOCX 另交 macOS textutil。未做:与 Microsoft Office 的交叉检查(本机没有 Office);字体一致与缺失两种环境的对照 — R1 FAIL 六项已修:读取器改为按关系找部件(主文档、批注、设置、工作表、幻灯片顺序与各页备注,目标须在),批注须在其所在段落被引用,修订开关按 OOXML 的开关值读,表格另查输入格,删去无用函数;读取器另有自测(ooxml.py selftest:评审给的每种损坏都须被查出),往返用例在核对后跑它 — R2 FAIL 三项已修:批注须紧跟“Alpha 甲”(同段挪到别处即不过),幻灯片须各为其部件、按序为 First、空白、Second 且只有末张隐藏、备注只在首张;注释改为一行;三种损坏加入自测 — R3 FAIL 三项已修并加回归(各为一种自测损坏),三轮用尽:批注须仍是点(不带范围标记);第二次会话的 Gamma 也须是修订插入;备注须在备注页的正文占位符里(挪到页脚即不过)
  • C19.2 打印与 PDF 输出:同一修订、纸张、页边距、缩放 — 已做:打印原用系统共用的打印设置(打印机默认纸张与边距),不缩放时 A4 以外的文档会被裁切或偏移;改为每次打印取一份副本,纸张取 PDF 首页的尺寸与方向、边距为零(文档的页边距已在 PDF 里);导出与打印都在该标签的输入落地之后(同一修订),对话框给出页数与范围,系统面板另有预览;取消不动文档,打印副本删去。print.sh 真窗口:A5 横向 DOCX(不经 LibreOffice 写成)以 595×420 点打印,取消后文件不变、打印副本不在、关闭不问。未验证:Windows 与 Linux 的打印(未构建) — R1 FAIL 三项已修:打印设置的副本另把缩放设为 1(原沿用系统共用的缩放);纸张取最大的一页(一次打印只有一种纸张,较小的页按原大印在其上,不裁不缩;逐页纸张做不到,已知限制);测试改核实际输出:ELY_PRINT_TO 让打印作业写成文件而不弹面板,print.sh 以 pdfinfo 与 pdftotext 读出页面尺寸、页数与文字位置(A5 页文字距左 72 点;A5 加 A3 的文档两页都在 A3 纸上、右缘文字在) — R2 FAIL 两项已修:纸张按两轴取(最长边与各页短边的最大者,方向随最大的一页,各页按自身旋转计),宽高交叉的页也不裁(paper_for 单测;print.sh 加 1000×200 与 600×600 混排,两端文字都在);ELY_PRINT_SHARED_SCALE 让测试先把共用缩放设为一半,A5 文字仍距左 72 点才算过(去掉缩放复位即失败) — R3 PASS

C20 质量与性能(§20)

  • [~] C20.1 性能基准:PERF-01 至 PERF-09 的度量工具与记录格式 — 已做:tests/perf/bench.py、samples.py、docs/perf/README.md;办公三应用先开窗口、内核在后台启动(ElyDoc 日常启动 P95 由 3.9 秒降到 0.19 秒,空白文档仍随内核约 2.7 秒);PERF-08 跑 40 次,内存起落、文件数不变;PERF-09 属第二批。未达标照实记录:首次按键到图块的 P95 约 250 毫秒(内核首次输入的初始化)、空白文档就绪 P95 超 3 秒;2026-10-08 全量重测八项全部达标(补丁 0039、PERF-02 计时、关闭标签释放图像,见 agents.md) — R1 FAIL 六项已修:worker 启动核对失败后保持失败、一切请求被拒(单测);PERF-03、04 不再以缓存或请求日志为成功;DOCX 样本实为 62 页(分页符改放在标题段内,测前核对 100 页);PERF-02 每键须有计时;PERF-08 记基线与内核文档数;注释超长 — R2 FAIL 四项已修:首屏改为图块真正画到窗口上之后(lok: first tile drawn、pdf: first tile drawn,ElyPDF 的图块改由画布直接画以知成败),窗口画失败亦作废;PERF-08 按句柄身份(类型与名称)比对基线,多出的只许 /System/Library/ 的只读资源且每次相同,首次关闭漏下 /dev/null 即失败;文档数日志缺失即失败;tests/perf/test_bench.py 以造出的日志与句柄核对这些判定;按修后的基准重测记录 — R3 FAIL 三项已修(不再送审):PERF-02 计时改在显示该编辑的图块真正画到窗口后结束(EditClock::drawn,单测),打字时有图块画失败即失败;PERF-08 每轮只认本轮写下的文档数(日志游标,单测);删去不再用的 files();PERF-08 的 Cmd+N、Cmd+W 改以带 Command 标志的事件直接投给应用(chord.swift),原 osascript 偶尔丢掉 Command 打出 w
  • C20.2 稳定性:保存失败、内核崩溃、磁盘不足、只读目录、休眠 — 已做:写满磁盘的保存(4 MB 磁盘映像,原文件不变、不留半成品);tests/perf/soak.py 长时编辑切换(两个文档轮流键入、保存、只在一个里撤销,每 10 轮以不经内核的读取器核对:内容在、撤销不跨文档、文件不坏);它查出图像不释放(见 agents.md),修后 40 分钟 673 轮全部核对通过,内存 359 至 468 MB(文档与撤销历史随之增长,约每轮 0.17 MB);内核崩溃与强制结束见 recovery.sh、pdf-recovery.sh。未做:8 小时整跑、系统休眠(测试不能让本机休眠)。2026-10-08 01:34 ElyMark 在 CEF 内一次 XPC 回复释放处 SIGTRAP(~/Library/Logs/DiagnosticReports/ely-mark-2026-10-08-013420.ips,CEF 帧无符号),未复现,信息不足 — 未送审:用户 2026-10-09 定性能已够、先发首版
  • C20.3 无障碍与国际化复核 — 已做:docs/accessibility.md(§20.3 逐条:依据与缺口);查出文档区与 ElyMark 页面把 Tab 留给自己、键盘无出口,组件库 029632b 加 F6 与 Shift+F6 照 Tab 次序移出移回(f6_leaves_a_field_that_keeps_tab);内核数字区域固定 en-US,改界面语言不重解释已存数值 — 未送审:用户 2026-10-09 定性能已够、先发首版

C21 开源与许可证(§21)

  • C21.1 AGPL 许可文件、第三方通知、锁定依赖清单、源码对应 — 已做:docs/licenses.md;release.sh 另出上游源码包(实际编译的打过补丁的 MuPDF 与随包 Git),release-macos.sh 核对其中为打过补丁的 MuPDF。未做:法律审查;LibreOffice 外部库的源码随包与否 — 未送审:用户 2026-10-09 定性能已够、先发首版

C22 测试与验收(§22)

  • C22.1 功能编号到测试用例的对照表 — 已做:scripts/test-map.py 生成 docs/test-map.md(首版 159 个编号各有任务,写明的测试与测试所在) — 未送审:用户 2026-10-09 定性能已够、先发首版
  • C22.2 QA-01 至 QA-28 的执行记录 — 已做:docs/qa.md;六个发行应用空闲时无网络套接字(lsof -i) — 未送审:用户 2026-10-09 定性能已够、先发首版

C23 工程风险证据(§23)

  • C23.1 九项风险的证据与处理 — 已做:docs/engineering-risks.md 末尾 PRD §23 九项的证据与状态 — 未送审:用户 2026-10-09 定性能已够、先发首版

C24 交付物与完成定义(§24)

  • C24.1 交付物清单、构建说明、已知限制、测试报告 — 已做:根目录 README.md(构建、测试、文档索引)、docs/help.md(打开保存、恢复、离线边界、仓库操作);已知限制与测试报告见 docs/compatibility.md、docs/qa.md、docs/perf/ — 未送审:用户 2026-10-09 定性能已够、先发首版
  • C24.2 验收逐条核对表 — 已做:docs/acceptance.md;结论:macOS 首版六个应用可交付,PRD 的首个正式版(八个应用、三端)未达到 — 未送审:用户 2026-10-09 定性能已够、先发首版

R2 发布之后:修复本次查出的问题(用户 2026-10-09 定:逐条修,逐条送审)

  • R2.1 官网下载:源码入口指向 v0.1.0 的两个源码包;未公证应用的打开步骤补 macOS 15 起的“系统设置 › 隐私与安全性 › 仍要打开”(中英);链接文字对比度在浅色与深色下都有回归断言 — R1 不合成透明度、无打开步骤断言;R2 漏祖先 opacity;R3 PASS
  • R2.2 官网名称标签:视口或模型尺寸变化后按当前几何重新放置,窄屏聚焦时不产生横向滚动;端到端测试捕获控制台与资源加载错误
  • R2.3 视频:应用名的体素字在屏幕展平前散尽,不压在录屏上;群像结束时六块屏幕带着录屏离场,不在强拍上变黑
  • R2.4 ElyShow:点幻灯片缩略图后画布即刻换到该页(现在要缩放一次才重画)
  • R2.5 ElyShow:放映窗口真正全屏,菜单栏与程序坞不压在幻灯片上
  • R2.6 ElyPDF:批注或签名落地后页面不闪白(旧图块留到新图块到达)
  • R2.7 ElyDoc:页面水平位置每次一致;缩放以视口中的页面为锚,左页边不滚出视口
  • R2.8 ElyTable:状态栏统计按单元格格式显示数值,不出现 8128.33333333333
  • R2.9 ElyTable:对选中区域开自动筛选不扩到区域外紧邻的合计行
  • R2.10 ElyTable:新插入的图表放在数据区旁的空白处,不压住数据
  • R2.11 ElyTree:改动数的单复数(“1 file changed”)
  • R2.12 ElyTree:差异按文件类型着色,Markdown 不按代码高亮
  • R2.13 ElyMark:紧凑写法的 GFM 表格(无对齐空格)在可视模式显示为表格
  • R2.14 ElyMark:任务列表的勾选框与正文同大、对齐首行
  • R2.15 “打开方式”里不得出现 LibreOffice(用户 2026-10-09 加急,先于 R2.2 收尾):构建出的 LibreOffice.app 去掉文档类型与快速查看插件并注销;任何测试不挂载官方镜像(官方内核解到无包的文件夹);tests/scripts/lo-unregistered.sh 核对 — R1 注销不幂等、吞查询与 plist 错误、负例不认原因;R2 inert 步骤吞坏 plist;R3 PASS
  • R2.16 ElyTable(用户 2026-10-09 报):单击单元格跳到别处(如 A5876),无法拖选多格
  • R2.17 ElyPDF(用户报):编辑文字时报“这种字体画不出‘V’”,而所改文字里没有 V;改字对应的文字块须与面板所示一致
  • R2.18 官网(用户定):下载一律指向 GitHub 的 v0.1.x 发布页,不直接链 DMG
  • R2.19 发布 0.1.1:版本号、打包、GitHub Release、官网指向新发布页