# 数据模型、算法与安全边界

## 分层

1. `binary.mbt` / `writer.mbt`：显式小端数值，检查范围后才读取/分配。
2. `header.mbt` / `metadata.mbt`：版本/格式/全局位与记录 span 校验；VLR 有独立数量和 uint16 payload 边界。
3. `point_read.mbt` / `point_write.mbt`：旧/现代回波与分类位布局、扫描通道、可选 GPS/RGB/NIR、额外字节。
4. `document.mbt` / `encode.mbt`：内存 Document，不透明元数据、长度一致性、规范化头部。
5. `audit` / `selection` / `spatial` / `grid` / `requantize` / `merge`：围绕 LAS 属性与记录编码的下游处理。
6. `cursor.mbt`：共享完整 Bytes，按需解码；不承诺输入增量流式或总内存恒定。

## 不变量

同一文档所有记录宽度必须一致，公开操作重新检查输入。`with_points` 是显式重建入口，先验证版本/格式再按回波编号访问直方图。`encode` 不丢点属性，不尝试修复不可解释的压缩/波形/EVLR。

`read_header` 在构建点数组前检查 `count <= remaining_bytes / record_length`。64 位文件字段只能在可配置的小规模预算内转 Int32。累计 metadata 时做减法形式预算比较，避免先乘加溢出。默认预算并非硬件内存配额：数据、输出、元数据和克隆数组会并存。

球查询使用坐标差除半径后平方，避免有限大半径平方溢出；半径零仅接受坐标相等。栅格先验证各维度与乘积，再分配数组。均值使用增量/权重计算而非整数总和，空 cell 不输出伪造高程。

`requantize` 重新解码目标整数坐标并逐轴量测误差；LAS 没有自动 CRS 推断。拼接逐项比对不透明元数据，拒绝冲突；左侧头部来源字段保留，右侧非点来源信息不归并。

## 复杂度和限制

全文件解码/编码及空间裁剪为线性点扫描；筛选的分类/来源 membership 为线性列表查找。稠密 grid 需要 O(rows×columns) 存储。游标避免全部 Point 数组，但保留输入 Bytes，每次记录读取会复制该记录。不是专用的大规模索引或零拷贝读取器。

输入边界失败返回可恢复 LasError；公开可变数组不能被其他任务同时修改。无网络、文件写入、动态执行或外部 FFI。未经过模糊测试服务或第三方安全审计；截断/异常字段/预算测试只是已实施的工程证据。

## 独立验证

`tools/generate_oracles.py` 使用固定种子、固定日期、UUID、比例尺/偏移，调用固定版本 laspy 生成 11 个文件（共 352 点）。测试逐字段比较读取结果，再修改 X 与强度，要求 MoonLAS 写出与 laspy 更改后的完整文件相同。测试数据是原创合成数据，不是复制公开数据集。1792 个记录属性组合只是自我读写性质测试，与独立差分记录分开计数。
