# 变更记录

## 0.2.3（2026-10-31）

- Web 使用一次分析 / 一次修复结果的 bundle，强制实际导出重读；修复文件读取竞态与同文件重选，默认 16 MiB、硬上限 32 MiB / 50 万面。
- 缩放计算三角形法线与面积，新增 area_checked / nearest_point_checked；旧最近点无结果返回 Infinity。多边形三角化增加操作预算。
- CLI / Web 处理受检 SVG 错误，paint 使用允许列表；失败不覆盖已有预览文件。
- 实际计算 Git Blob SHA-1，校验许可允许列表与完整条款哈希；CI 检查实际打包内容并覆盖四类负向输入。模型文件和既有来源保持不变。
- 本机四后端各 427 项、Web / CLI / 模型语料与四后端各 1000 次变异通过。Linux 压力测试及最终发布证据以 [整改记录](docs/round2-remediation.md) 为准；旧包、标签不修改。

## 0.2.2（2026-10-31）

固定全部 11 个独立 .mbtx 脚本的 async 0.22.1 与 x 0.5.5 模块/子包版本，修复注册表新依赖导致旧 SDK 下脚本无法启动的问题。0.2.1 包和标签保留不动，核心几何及公开 API 无变化；见 [0.2.2 说明](docs/releases/0.2.2.md)。

## 0.2.1（2026-10-31）

汇总下列两批先前未发布的验收修订；完整兼容变化、示例、编译器及证据见 [0.2.1 发布说明](docs/releases/0.2.1.md)。增加可执行 README 库示例、Quick Start 真实入口复核和 Linux / Windows 发布包安装矩阵。0.2.0 及更早包和标签保持不动。

### 0.2.1 边界与许可修订（原主分支记录，2026-10-31）

- 新增 validate_checked / repair_checked / RepairLimits；拒绝非法容差和不安全补洞，简单平面凹环采用耳切三角化，旧 repair 失败时保留原网格。
- 使用稳定向量范数与局部缩放 PCA；厚度查询去除全局包围盒 inset，新增可重复面积加权采样接口。
- SVG 转义属性、验证参数并限制预览面数；CLI 校验真实路径，保护符号链接及目录别名，保留硬链接、竞态及非原子写入边界。
- 加强 OBJ 不支持几何、PLY 重复属性和 header 限额、3MF mesh 容器与变换检查；镜像调整绕向，保持源体积符号。
- 为 17 个官方样例补齐固定上游内容锚点和 SHA-256；修复浏览器许可证链接，新增完整许可与哈希校验。
- 固定 Actions 提交、最小权限、Dependabot、Windows CI 和编译器版本检查。远程安全设置未修改；这些代码归入 0.2.1，实际包发布证据见交付说明。

### 0.2.1 数值与导出修订（原主分支记录，2026-10-29）

- 体积、重心使用局部参考点和补偿求和；惯量直接在重心附近积分，修复平移后负惯量及大坐标体积错误。新增必要数值复核，异常时不输出可用质量属性。
- 新增 `write_stl_binary_checked`；`write_mesh` 拒绝非有限坐标、Float32 溢出和量化新增的退化 / 反向面，旧底层编码器保留。CLI 写盘前解析字节，写盘后重读实际文件，严格结论和 SVG 使用重读网格；网页修复输出也使用重读 STL。
- CLI 拒绝输入与输出的规范化路径冲突；保留符号链接 / 硬链接及非原子写入的边界说明。
- CLI 对面数×样本数超过 20000000 的分析返回明确资源错误；网页按面数降低并显示预算。没有宣称运行时限或 BVH 加速。
- 新增解析值、真实 CLI 和网页回归，加入 CI；申报基线与验收交付状态分开记录。旧标签及已发布包不改写，本批随 0.2.1 交付。

## 0.2.0（2026-10-28）

- 新增 inspection_json、parse_mesh_checked / ParseError 与 CLI --json；规定 null/未评估/计算非有限值、schema_version 和 JSON 退出码，保留旧中文报告和字符串 API。
- 新增独立 IndexedMesh 快照、Face3、精确坐标去重、法线保留、往返与统计；拓扑验证暂时展开旧 Mesh，未宣传性能优化。
- 100k 转换内存实测约 40 MB，高于 full 的约 23–24 MB；逻辑字段量不是实际堆大小。
- 新增 JSON 协议、索引不变量、内存报告与真实 CLI 回归；公开包 consumer 覆盖新增 API。详见 [发布说明](docs/releases/0.2.0.md)。

## 0.1.6（2026-10-28）

- 修正独立 consumer 脚本：`moon add --upgrade` 明确升级示例中原有依赖，检查已安装包的版本后才运行四后端。避免命令指定新版本但实际测试旧版本。
- 0.1.5 的核心解析限额代码保持一致；新版本用于交付安装验证修正。0.1.5 包和标签保留不动。详情见 [发布说明](docs/releases/0.1.6.md)。

## 0.1.5（2026-10-28）

- 新增统一 ParseLimits：输入、声明、面数、列表、ZIP 解压、XML 与组件展开预算；旧 API 保留默认参数。详见 [预算与迁移](docs/resource-limits.md)。
- CLI 读取前检查大小，提供四项资源参数；网页可设置文件与面数限额。3MF 启用 CRC；修复二进制 STL header 魔数误路由。
- 新增确定性变异独立 CI 和干净目录发布包 consumer CI；四后端各 371 项测试，各 10,000 次变异摘要一致。新增源代码和种子采用 Apache-2.0。
- [第一批发布说明](docs/releases/0.1.5.md) 与 [后续路线](docs/roadmap.md) 区分已交付和未来能力，旧标签不移动。

## 0.1.4（2026-10-23）

- OBJ 解析并验证 vt；四种面引用检查各表范围和一致形式，拒绝缺字段、非单位 w 及非法索引。
- PLY 检查 ASCII 整数词法/类型范围、列表类型、内部索引溢出、非法 header 和不足三个顶点的 face。
- 3MF 默认严格检查 OPC 关系、内容类型、精确且有作用域的 Core 命名空间、对象 Id 及几何层级；旧定位回退改为显式 compatibility=true。
- 增补规范参考/支持子集/拒绝条件/未实现语义和申报说明；保留完整许可及来源、逐模型报告。四后端各 352 项库测试，并扩展真实 CLI/网页负向回归。
- 收录此前主分支的模型语料及性能证据；历史性能记录保持原测量日期，不冒充新版本重新计时。

## 0.1.3 — 2026-10-21

- PLY header 必须以 ply 开始，第二行包含唯一、完整的 `format <编码> 1.0` 声明；拒绝缺失、重复、字段不全 / 多余、未知编码、非 1.0 版本及延后声明。不再根据布尔默认值猜测 ASCII。
- 大小端二进制 PLY 在消费全部声明元素与属性后必须精确到 EOF，拒绝零填充、空格、换行或完整额外标量等尾部垃圾；合法未知属性 / 元素仍按声明跳过。ASCII 逐行兼容选项不放宽这些规则。
- 新增 9 项库回归（各后端共 330 项），以及 CLI / 网页共享的自制输入与真实入口回归。此前接受的非法 header 或二进制尾部现在明确失败；旧包与标签保留，发布为 0.1.3。

## 0.1.2 — 2026-10-21

- PLY 在读取正文前校验每个 vertex 元素的坐标 schema：x/y/z 各需一个标量属性，拒绝缺失、list 型和重复声明。三种编码及显式 ASCII 兼容模式行为一致，保留合法属性重排、零坐标与未知属性消费。
- CLI 的修复与 SVG 输出在写入前按宿主平台规则比较规范化绝对路径，覆盖相对 / 绝对路径、`.`、`..`、重复分隔符及 Windows 大小写；不将词法路径比较宣称为符号链接或硬链接身份检查。
- CI 显式执行 Wasm、Wasm-GC、JS、Native 四种测试命令；新增坐标 schema、真实 CLI 与网页回归，库测试增加到各后端 321 项。
- 补充正式 GitHub Release 交付入口并更新仓库描述、Topics；0.1.1 的包与标签保留，当前修订使用 0.1.2。范围与复核方法见 [发布说明](docs/releases/0.1.2.md)。

## 0.1.1 — 2026-10-21

Mooncakes `mik1e80/stlkit@0.1.1`，源码标签 `v0.1.1`。此版本合并以下修订，兼容边界及固定版本复核方法见 [发布说明](docs/releases/0.1.1.md)。

### 2026-10-21

- 修复 CLI 同时指定 `--fix` / `--svg` 时提前返回、不生成 SVG 的问题：修复流程返回最终 Mesh 与复核状态，保存网格后继续用最终 Mesh 导出预览，严格模式在导出后按最终结果退出。
- 无需自动修复时也保存指定的网格输出；拒绝完全相同的网格与 SVG 输出路径。增加组合参数顺序、修复前后预览对照、无需改动、修复后仍薄壁及两类写入失败的真实 CLI 回归。同步帮助、README、申报说明，并修正流式声明法线校验的残留旧表述。

- 统一 STL 输入契约：二进制全量 / 整块流式 / 分块扫描严格匹配头部声明长度，拒绝任意多余尾字节与截断，流式路径同样校验有限声明法线；计数字段避免有符号截断。
- ASCII 全量与流式共用逐面状态机，支持制表符 / CRLF，统一拒绝错误顶点数、坏数字、嵌套 / 未结束面、错误记录顺序及未知非空行；solid 包装可省略，几何退化交给验证层。此前部分入口接受的坏输入现在会失败。
- 新增同一输入经直接解析、自动入口、不同分块尺寸、CLI 与网页的一致性回归，并覆盖所有单记录分割点。

- CLI / 网页共用新增 `PrintabilityReport::mass_properties_available()`，明确检查非空、闭合、无退化面、绕向一致及分量朝向可靠；不满足时重心 / 主惯量显示“未评估”，网页协议继续省略相应数值字段并新增质量属性状态 / 前提字段。底层质量属性 API 保留原行为，不自动验证几何。
- 增加闭合且正体积但含共线退化面的自制案例，以及合法值、开放 / 反向 / 局部绕向冲突、潜在重叠、修复恢复与薄壁不阻断质量属性的回归；同步 README 和申报边界。

- 修复 `Mesh::ray_cast()` 非单位方向下将射线参数误作为命中距离的问题；内部先按最大绝对分量缩放再归一化，`RayHit.distance` 统一为欧氏距离，并使用同一单位方向计算命中点。零 / 非有限方向及非有限起点返回 None，不输出非有限命中。
- `ray_triangle()` 保持底层参数 t 语义，更新源码注释与两份 README；旧调用方若把 ray_cast().distance 当 t 使用，需按新距离语义迁移。增加轴向、反向、斜向、极大 / 极小比例及无效输入回归。

- 收窄声明面法线检查的表述：仅统计已保留声明向量与几何法线点积 < 0 的情况；零或近零向量跳过，不检查单位长度、垂直性及精确一致性。
- 明确 OBJ 三顶点法线不完全相同时置零并跳过，不宣称完整平滑法线校验。同步 README、接口说明、申报材料、对比文档、源码注释及 CLI / 网页措辞，保留原算法与报告字段。
- 增加法线检查边界回归；“错误法线”继续作为兼容字段名，含义为声明面法线反向计数。

### 2026-10-20

- 新增 `MeshFormat::Obj`，CLI 与网页不再把 `Unknown` 标为 OBJ。对 `MeshFormat` 做穷尽匹配的调用方需增加 Obj 分支；依赖旧 Unknown=OBJ 语义的代码应改为 Obj。
- 文本格式探测改为按行首记录扫描至首个提示或文件末尾，修复超过 512 字节的 ASCII STL 文件头以及 OBJ 注释含 STL 关键字时的误判。未知文本在统一入口尝试 ASCII STL / OBJ，均失败时返回组合诊断；已识别的格式保留自身错误。
- 增加长文件头及关键字注释的自建样例，补齐库、CLI、网页回归，并重建网页编译产物。

- ASCII PLY 默认连续按 header 声明消费正文 token，修复共行及跨行记录被丢弃的问题；拒绝声明外的尾随值。新增显式 `lenient_ascii=true` 逐行兼容，不自动回退；依赖旧版隐式忽略行尾数据的调用方需迁移。未知属性 / 元素仍按声明消费，面先声明时延后验证索引；补齐库、CLI、网页与自建案例回归。
- `PrintabilityReport.inward_component_count()` 直接提供负体积分量数；CLI / 网页统一调用该接口。`needs_review()` 独立检查分量朝向，不再依赖厚度未评估来间接阻止朝向未定或可能重叠的报告通过；增加正总量下多个反向分量、修复后计数及已有厚度结果的回归。
- 绕向报告新增每个共享边连通分量的面索引、有符号体积与朝向状态；总正体积不再掩盖朝里的小零件。
- 独立闭合分量按各自符号统一方向；可能嵌套或重叠的壳层保留符号，避免把合法内腔全部翻成正体积。
- 新增 `RepairResult.reoriented_components` 并计入 `changed()`；CLI / 网页与厚度门禁改用分量结果。网页字段“整体朝内”改为“负体积分量”，内部文本协议调用方需更新。
- 自行用结构体字面量构造 `WindingReport` 或 `RepairResult` 的调用方需补齐新增字段；通常应使用检查与修复函数取得报告。

- PCA 定向包围盒改用完整 Jacobi 正交特征向量组，修复两重特征值可能产生零轴的问题；新增方柱、圆柱及特征方程 / 矩阵重建回归。
- 重写 README，集中说明使用方法、PCA 重根方向不唯一、采样及流式边界；旧单特征向量接口保留作兼容查询。

- 统一使用限定网格检查与采样最小厚度表述；报告明确列出未评估的工艺条件。
- 增加射线预算参数、只记录的喷嘴 / 支撑上下文及同模型原始报告；修复后沿用采样预算。
- 增加默认 1000 条射线漏掉 0.05 mm 薄板的确定性反例，不将样本值当成全局最薄处。
- 增加独立 `--stream-only` 入口和 `StlScanner::storage()` 逻辑计数，明确边记录包含重复边，存储随规模增长。
- 新增申报说明与案例文档，并把报告重新生成核对纳入 CI。
- 网页协议字段“最薄处”改为“采样最小厚度”；调用此内部文本协议的应用需同步改键。公开库 `ThicknessReport.min_thickness` 保留，语义为采样结果。
- 当日修订合并到 0.1.1，不作为单独版本发布。

### 2026-10-17

- 拒绝 STL / OBJ 非有限数；二进制与分块顶点路径一致拒绝无效坐标。
- 拒绝 3MF 非有限变换、运算溢出和未实现的必需扩展，保留可选扩展行为。
- 增加无效模型、库与真实入口回归。
- Pages 分发携带完整项目许可与来源说明。
- 当日修订合并到 0.1.1，不作为单独版本发布。

兼容约定：非法或未支持输入可能因正确性修复从成功变为明确失败，此类收紧会记录反例和原因；公开接口移除或含义改变必须说明迁移办法。
