# 后台审计与取消

浏览器中的 JSON / JSONL 审计和修复比较在模块 Worker 中执行，仍调用同一份编译后的 MoonBit 核心。JavaScript 只传递输入、解析输出、管理任务和显示结果，不增加另一套审计规则。

## 如何使用

- 点击“运行审计”后，计算期间显示“取消审计”；取消会保留输入、清空旧报告并恢复运行按钮。
- 修改输入、格式或监督策略，以及导入新文件、选择演示，会让旧报告失效并终止旧计算。重新运行后才可导出报告。
- 修复比较使用独立 Worker；清除或替换基线、修改当前输入会使旧比较失效。取消按钮只针对审计阶段，比较阶段可通过清除基线停止。
- 离开页面会取消任务并清空报告，返回缓存中的页面后可重新运行。
- Worker 不可用、加载失败或消息无法读取时显示错误，不偷偷改用主线程运行。可使用支持模块 Worker 的浏览器或 CLI。

## 实现与验证

`web/engine-client.js` 为每个任务创建 Worker，完成、失败或取消时调用 `terminate()`；任务身份检查会忽略旧 Worker 的迟到消息。直接终止线程可以中断同步 MoonBit 计算，不需要等待正在计算的线程处理取消消息。行为依据见 MDN 的 [Worker 构造器](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker) 和 [terminate](https://developer.mozilla.org/en-US/docs/Web/API/Worker/terminate)。

`web/app.js` 另行检查当前输入版本及基线版本，防止已送达但尚未呈现的旧结果覆盖当前状态。审计与比较分别持有客户端，基线变化不会取消无关的审计。

验证分为三层：

- 可控 Worker 事件测试：替换任务、显式取消、迟到成功/失败、重复取消、构造失败、消息克隆/读取失败及任务复用。
- Node 真实线程执行浏览器 Worker 入口和 MoonBit 核心：JSON/JSONL、修复比较、取消后重跑、页面离开后重跑、导出及既有基线竞态。
- 本地真实浏览器演示：初始预训练错误样本成功审计；修复对比显示通过、0 项新增问题和 2 项已消失问题。浏览器演示不等于所有平台验证；取消由确定性自动测试验证。

## 当前边界

这次改动不提高 1 MiB 文件选择上限或核心样本、token 和输入预算。JSONL 仍整份读取，尚未实现流式处理。取消计算不会取消已经开始的 `File.text()`，其过期结果仍由输入版本保护。

文件文本读取后的消息复制、比较输入序列化、返回结果复制和界面绘制仍有成本；每个任务新建 Worker 也有启动成本。尚未测量吞吐量、内存峰值或交互延迟，不承诺大文件完全不卡顿。数据在本地浏览器中处理，不上传训练文件。
