# 当前支持范围

版本：0.4.0。实现基于 RFC 2849；这是有明确边界的结构检查配置，不是完整目录 Schema 或服务器兼容认证。

| 输入/能力 | 当前行为 |
|---|---|
| LDIF 内容记录 | 多记录、多值属性、空值、原始字节、行号 |
| 变更记录 | add、delete、modify、moddn / modrdn |
| modify 操作 | add / delete / replace，保留操作及值的顺序，要求每组 `-` 结束 |
| 空 modify | 允许结构解析并给出警告；不保证服务器接受 |
| 重命名 | newrdn、deleteoldrdn=0/1、可选 newsuperior |
| DN/RDN | RFC 4514 字符串语法；旧分隔空格需 --legacy-dn-spaces 并发出警告；不改写值 |
| 控制项 | 解析 OID、criticality、可选值；区分没有值与空字节值；不解释控制语义 |
| Base64 | 严格字符、长度和填充检查；二进制字节不会转为替代字符 |
| 中文 | 中文属性值和 DN 通过 Base64 表示；DN/重命名等文本字段须为有效 UTF-8 |
| 折行 | 删除每个续行的一个前导 ASCII 空格；合并后才去除注释 |
| 换行 | LF、CRLF；接受末行没有换行；不接受裸 CR 或文件 BOM |
| 版本 | 默认必须为 `version: 1`；`--compat` 只放宽缺版本头，不放宽其他错误 |
| 文件外部值 | 保留 `:< URL`，报告 incomplete，绝不打开 URL 或文件；安全写回拒绝 |
| 未知变更 | incomplete，已有可解析记录和诊断保留，退出码 2 |
| 内容/变更混用 | 报错，分成两个文件后分别处理 |
| 属性名称比较 | ASCII 大小写不敏感，选项顺序不敏感；不比较属性值或 DN 是否语义相等 |
| 安全写回 | LF、ASCII/Base64、76 列折行；保持语义顺序与字节；写回后再解析并比较模型 |
| 原文件还原 | 不保留注释、原始布局及 changetype 别名拼写；modrdn 写为 moddn |
| 核心目标平台 | 核心已实测 JS 与 Wasm GC；CLI 使用 JS + Node.js 24；其他目标未验证 |

## 结构边界

- 属性 `dn` 位于记录首行；后续出现 `dn` 被视为可能漏掉分隔空行并报错。名为 `control` 的普通内容属性可以解析；记录前部的 `changetype` 会按变更标记解释。
- `check` 与 CLI 检查 DN/RDN 字符串语法，`parse` 只解析结构。名称匹配/规范化、重复条目、父条目存在性、属性类型/Schema、必填属性、权限、控制语义、服务端插件或真实导入结果不在范围内。
- `--deny-delete` 只拦截 `changetype: delete` 删除整条目录记录；modify 中删除属性或值不在这项策略范围内。
- 整个控制项的 Base64 扩展返回 incomplete；空控制值导出为等价空 Base64，详见互操作差异记录。
- 控制 OID 只做点分数字形式检查，不校验 OID 注册信息；URL 只保留引用和基本空白检查，不声称验证协议、可达性或内容。
- 兼容性细节：允许版本头之前的空行/注释及末行无换行；控制字段允许额外填充空格。请勿将 `complete` 解读为逐字节满足 RFC 的所有语法及目录要求。

## 状态与退出码

| 状态 | 退出码 | 意义 |
|---|---|---|
| complete | 0 | 当前支持范围的检查完成，已启用的策略未拦截 |
| complete + policy | 1 | 结构检查完成，启用的风险策略拦截 |
| invalid / incomplete | 2 | 输入错误、执行失败或无法完整解释；优先于策略退出码 |

警告不单独改变退出码。`inspect --format json` 包含实际属性内容，`check` 默认只输出统计及诊断。检查结果不是导入许可。

## 资源限制

最大输入 8 MiB，最大物理行和展开行 1 MiB，最大物理行数 100,000，最大已解析记录数 10,000。诊断最多保留 100 条，超限额外给出一条错误。当前为有界完整缓冲区解析器，不承诺无限流或海量目录吞吐性能。

## moonldap 可选适配

独立位于 `integrations/moonldap`，核心库不依赖 moonldap。使用 `hbYlj/moonldap 0.3.0` 的公开类型构造 add/delete/modify/moddn 操作，并验证其 BER 编解码往返。内容记录不会隐式转换成新增操作。

当前拒绝全部操作控制：上游公开构造函数不足以保持“值缺失/空值”的区别。也拒绝不完整、无效或策略拦截的报告。没有网络连接、身份认证或真实服务端导入。上游模型/协议实现及其许可证按来源声明记录，不计作本项目原创能力。

## 新增风险策略与报告

`--deny-clear` 只拦截 modify 的无值 delete / replace；指定值删除及非空 replace 不命中。`--deny-rename` 拦截 moddn/modrdn，包括移动。CLI 新策略默认关闭，浏览器只默认开启整条删除。所有已解析记录均执行策略，即使审阅仅显示前 200 项。

完成的 0/1/2 结果可生成 Markdown/JSON 审阅报告；2 不代表完整审查。只有 0 可安全写回。报告包含 DN、属性名称及源字节指纹，不包含完整原文或属性值。元数据是调用者传入的内容标识，不是签名或防篡改认证。见 [风险策略](RISK_POLICY.md)。

## 批量预检

batch 显式接收 1–50 份本地文件，单份 8 MiB、累计接受字节 32 MiB；各文件独立应用相同选项。2 优先于 1，缺失/超限/不完整不会使其余已发现问题消失。不执行跨文件事务、不做目录/通配符展开、不批量写回。报告有基本名与序号用于区分输入，详见 [批量支持与库 API](BATCH.md)。

## 迁移前后快照核对

compare 只比较两份内容导出，DN 原字符串匹配、属性值按字节和重复次数比较；不支持服务器名称语义或重命名推断。新命令的 1 表示差异，2 表示不完整或错误。两侧无效/不完整时不推断条目删除，重复 DN 排除对应键并保留其他结果。详见 [完整比较合同](SNAPSHOTS.md)。
