# 核心实现与可解释边界

MoonBit 核心不依赖 JavaScript 的 LDIF 解析库。Node CLI 与浏览器 Worker 调用同一编译结果。

| 层 | 文件 | 责任 |
|---|---|---|
| 物理行与折行 | `src/lines.mbt` | 限制输入规模，将折行还原并保留原始物理行范围 |
| 属性值 | `src/values.mbt` | 区分内联字节、Base64 和外部 URL 引用，拒绝错误编码 |
| 文件模型与解析 | `src/model.mbt`、`src/parser.mbt` | 记录、属性、控制项与有序修改；未知/未支持内容保留诊断 |
| 名称预检 | `src/names.mbt` | DN/RDN 字符串语法；不实施目录匹配、Schema 或服务器状态判断 |
| 写回 | `src/writer.mbt` | 确定性编码；重新解析并比较字节和语义模型，拒绝不完整数据 |
| 审阅与报告 | `src/review.mbt`、`src/report.mbt` | 将操作解释为有位置的审阅项，保留原输入状态与策略结果 |
| 两个入口 | `src/bridge/bridge.mbt` | CLI 参数与浏览器调用桥接，公共核心 API 同源 |
| 平台外壳 | `cmd/`、`web/src/` | 文件 I/O、交互、Worker 生命周期、下载，不重写规则 |

关键选择：

- 属性值使用 Bytes，避免二进制被解码成文本后损坏。外部 URL 是引用，不主动取值。
- 数组保留记录和修改顺序，因为操作顺序会影响计划含义。属性名称比较的有限规则不等于 DN 语义相等。
- 无效或未完成分析返回 2，优先于风险策略的 1。已经发现的审阅项仍保留，但不会变成“完整通过”。
- 格式化前后比较结构与字节，不比较格式、注释或源行号；这些本来会因重新排版改变。不是逐字节原文复制。
- 200 项审阅上限会标记截断，统计总数保留；审阅不展开属性/控制值，但 DN 和属性名仍可能包含用户数据，分享报告前需自己判断。
- 浏览器只有当前内存状态。编辑使旧结果立即失效，Worker 有版本号和超时；下载前再运行核心写回核对。

验证分工：核心测试覆盖规则和边界；CLI 测试覆盖真实文件、路径与退出码；Python 与 Java SDK 是独立行为对照；RFC 示例保留原刊和修订差异；MoonLDAP 测试验证生态模型；浏览器真实操作验证完整流程。每一种证据都有边界，不能互相替代。

0.2.0 的 src/policy.mbt 扫描全部解析记录，独立于前 200 项的显示列表。src/review_report.mbt 生成 Markdown/JSON 报告正文，宿主对实际分析字节计算 SHA-256；元数据采用新增字段保留旧 JSON。检查完成的 0/1/2 可下载报告，只有 0 可导出 LDIF。
