# 0.4.0 三分钟展示建议

0:00–0:35：打开工作台，文件预检的整条删除示例展示风险拦截及位置。

0:35–1:35：切换“迁移前后核对”，载入合成迁移示例并开始核对。指出 Alice 的 CN 只是 Base64 表示变化，没有误报；邮箱与成员缺失、Bob 缺失及 Carol 新增分别列出。定位迁移前邮箱源行。

1:35–2:10：下载核对报告，展示两份输入指纹、位置与明确比较边界。编辑迁移后内容，证明旧报告立即不可下载，重新核对后生成新结果。

2:10–2:45：展示 compare_snapshots 公共 MoonBit API 及 compare CLI，说明同一核心复用于浏览器和 CI；展示注册表独立安装与模型对照证据。

2:45–3:00：说明项目补充 MoonLDAP 的文件层，不连接服务器、不实现名称匹配规则、不生成执行补丁。演示都是合成文件，不冒充真实企业试用。

此文是录制脚本，不表示已录制视频或完成答辩。原有单文件脚本如下保留。

# 三分钟演示与个人复验（0.3.0）

演示入口：https://weir-h.github.io/moonldif/ 。展示页脚版本；全部示例均为合成资料。检查通过只表示支持范围和已启用策略通过，不代表真实服务器导入成功。

| 时段 | 操作 | 应看到的结果与解释 |
|---|---|---|
| 0:00–0:35 | 选择“整条删除”，点击定位原文 | 默认拦截删除，目标 DN 与位置可核对；LDIF 导出不可用 |
| 0:35–1:05 | 选择“属性清空”，启用拦截属性清空并重新检查 | 无值 replace / delete 被拦截；指定值删除有不同语义 |
| 1:05–1:35 | 为 replace: mail 补一行 mail: demo@example.com，删除整个 delete: description 子操作并重新检查 | 内容已修改时旧报告失效；检查通过后可导出新文件 |
| 1:35–2:05 | 下载 Markdown 或 JSON 报告，展示源指纹、选项、位置 | 没有原始属性值；包含 DN；指纹用于核对内容而非签名 |
| 2:05–2:30 | 选择“改名与移动”启用拦截，再选择“不完整输入” | 分别为策略拦截 1、不完整 2；两者仍可下载报告但不能导出 LDIF |
| 2:30–3:00 | 展示 mooncakes API 页面和以下调用 | 库可直接接入 MoonBit；CLI 和浏览器复用同一核心 |

```moonbit
let report = @ldif.check_text(
  "version: 1\ndn: cn=Demo\nchangetype: modify\nreplace: mail\n-\n",
  risk_policy={ deny_clear: true, deny_rename: false },
)
println(report.exit_code()) // 1
```

CLI 复验：`node dist/moonldif.js check <导出的文件>` 应返回 0，再用 `inspect --format json` 检查语义。PowerShell 用 `$LASTEXITCODE` 查看退出码。

参赛者独立执行以上流程并记录日期、浏览器、实际结果和问题；当前 AI 开发自测不得写成第三方试用。演示脚本是可录制材料，不表示已有演示视频或完成答辩。

## 批量预检展示（可替换演示最后 30 秒）

执行 README 的 batch 三文件示例，展示每份文件的基本名、指纹和退出码，以及整批返回 1。混入一个不存在的路径，再展示整批返回 2、已有风险仍保留。打开 examples/ci/README.md 解释如何让检查阻止有风险的 CI。批量能力在 CLI 和公共库中，网页仍为单文件操作。
