# 算法、坐标与可证明边界

## 正规化草稿与提综
Draft 仅能通过验证的构造路径得到，所有容器访问器返回副本。综框、踏板的编号从 1 开始。交织图行号是投纬 pick，列号是经纱 warp，两者从 0 开始。D[p][x] = lifts[p].contains(threading[x])。

每次踩踏可能同时操作多个踏板。先对这些踏板连接的综框取集合并集，下降式织机再在 1..shafts 中取一次补集；不能分别取补集再取并集。空踩踏在提升式不提升任何综框，在下降式正规化为所有综框保持在上。

模型允许整行没有经／纬交错及没有被使用的综框，以便预检指出这些问题，不能把语法有效解释为真实可织。

## 浮线和周期
有限浮线扫描每根纱线，记录达到阈值的最大连续同面区间。经浮线取经纱在当前面上，纬浮线取纬纱在当前面上。不能把同一方向的 false 区间也标为该方向的正面浮线。

循环扫描从前驱为 false 的 true 开始，因此每一段只记录一次；start 可以靠近周期尾端，length 可以跨越起点。全部为 true 时没有唯一段首，规范记录 start=0、length=周期长度、wraps=true、unbounded=true。无界情况无论有限阈值多大都返回。正反面各运行一次可诊断一直浮在任一面的纱线。

复杂度：浮线扫描在交织矩阵构建后为 O(W*H)，交织矩阵为 O(W*H*S)，S ≤64。周期段坐标不做人工视觉倒置。bindings 统计相邻交点正反面改变次数；周期模式会额外比较首尾一次，它不是材料强度或物理接触次数。

## 最小综框反推
每根经纱对应 H 位提升签名。处于同一综框的经纱在每一次投纬都只能同升同降，因此不同签名必须使用不同综框（下界）。将相同签名分为一组并为每组分配一个综框恰好达到下界，所以对于**给定完整二值交织图、任意提综控制、单综框穿综**，组数是精确的最小综框数。

编号按第一次出现的列排序，结果稳定。不存在某种后续简化能让两个不同的签名共用一个综框而仍保持相同交织图。超过 64 个签名会失败，不进行有损近似。至多 O(W*H*S) 比较。此结论不涉及踏板数量、其他织机机构、换面／换相位后的设计选择。

## 踏板合成不是组合优化
为每个不同的非空提综集合分配一个踏板，空提综不踩踏。全部为空时保留一个无连接的闲置踏板，保证可用既有构造器复原。每个投纬至多踩一个踏板。这是可行构造，可能比多踏板同时踩踏方案使用更多踏板；超过预算时返回 weave.pedal_capacity，**不能由此推断不存在更巧妙的多踏板方案**。

## 重复、变换与诊断
repeat_size 分别查找可整除宽／高且完整复原矩阵的最小周期。它识别的是交织图周期而非综框编号周期。reduce_repeat 保留原始综框定义并裁切前缀，不压缩综框，crop 也不承诺裁切区可作为连续织造的周期。

other_face 取补集；两次操作恢复原稿。经序反转和投纬反转也具有对合性质。shift 对偏移先取模再相加，避免极端 Int 溢出。tile 在进行乘法和分配前先做除法边界检查。

Finding 使用 code + 可选语义字段。浮线诊断的 pick/thread 是其第一交点，direction/back 表示纱线方向与布面；shaft 仅用于综框诊断。-1／null 表示不适用。闭合梭口诊断在当前图样一整行全 true 或全 false 时报告，其含义是该投纬没有形成交织，不模拟真实机械几何。

## 交换格式
moonweave/1 JSON 示例：

    {"schema":"moonweave/1","shafts":2,"threading":[1,2],"lifts":[[1],[2]]}

只允许四个顶层字段；缺失／额外字段、错误版本、浮点 ID、非法集合、超限尺寸被拒绝。依赖 core JSON 解析器；重复键后值覆盖，不作为签名／安全校验格式使用。网格格式是项目自定义的 #/. 行文本，不是 WIF；接受 LF、CRLF、一个结尾换行，拒绝空行、空白、参差行。

## 验证策略与限制
测试包括小图穷举反推、周期段覆盖、独立逐格 oracle、双次变换、编解码往返、CLI 非零错误状态和 XML 解析。它们验证实现与文档语义，不是形式化证明或纺织专家认证。未采集或复制真实用户织物设计；所有固定样例和穷举数据由项目内生成。
