# 支持范围与数据合同

本库处理一个明确收窄的 COMTRADE 输入 profile，不宣称完整 IEEE C37.111 符合性。范围外输入返回错误，不能把拒绝理解成源文件不符合全部标准。

## 接收条件

- CFG 修订字段为 1999；DAT 编码字段为 ASCII。CFG 与 DAT 限可打印 ASCII、制表符及 CR/LF 换行；末尾可有一个换行。不是通用 Unicode 配置读取器。
- 一个正采样率段；1–256 个模拟/状态通道，总行数 1–200000，通道值总数最多 2000000。两份文本合计最多 32 MiB；单行最多 65536 字符。Node 文件入口另限 CFG 1 MiB、DAT 32 MiB。
- 模拟通道 skew 必须为零，a/b、上下界和变比必须有限；primary/secondary 为正，P/S 标记有效。通道编号在模拟组与状态组内分别唯一。
- DAT 行数与 CFG 的末样本编号一致，样本编号恰为 1..N，字段数一致；时间 tick 是非负 Int64 且严格递增，转换后的 Double 秒也必须有限且严格递增。
- 相邻 tick 的秒差与声明采样间隔相差不得超过一个原始 tick 加浮点舍入容差。该检查不是时钟精度校准，也不把时间重建为理想采样网格。
- 模拟原值接受有限十进制浮点拼写，须在 CFG min/max 内；标定结果必须有限。数值 99999 作为本 profile 的保守缺失标记被拒绝，不转为零或空值。状态字段仅接收整数 0/1。
- 起始和触发日期只检查两个非空字段，并保留文本；不验证日历有效性、时区或 UTC。公开输入的 0001 年不能当作真实事件日期。

## 窗口与列式交换

窗口是 DAT tick 派生的相对秒坐标上的 `[start,end)`。允许有限负边界和零宽空窗；不截断超量窗口，超过 `max_rows` 即报错。默认最多 10000 行，可显式提高至 200000。

保留源样本编号、Int64 tick 和相对秒；每个模拟通道有 raw 与 scaled 两列，后者为 `a*raw+b`，处于 CFG 的 P/S 声明侧，**不乘变比**。原始列单位为 raw-count；物理列使用 CFG 单位。状态列是原始布尔字段，不能推断保护动作或故障类别。

列名使用通道位置，避免显示名重复导致覆盖。字段元数据保留编号、显示名、相位、回路、标定、变比、P/S 和 CFG 通道原行；schema 保留来源日期文本、窗口及采样参数。这里的原行不含换行符，已经过统一换行处理，不是原文件逐字节复刻。

`Recording` 由解析器创建，内部数组不可修改；返回的窗口拥有独立数组。Arrow 入口接收 `Recording` 并自行选择窗口，不接受调用方随意构造的未检查窗口。Arrow schema、类型、编码及文件格式由已发布的 `shunge/arrow@0.1.0` 完成。

## 文件发布与边界

Node 入口先完成解析、窗口和 IPC 编码，再写同目录独占暂存文件并同步文件内容；使用不覆盖目标的硬链接发布新文件名，随后清理暂存名。文件系统需要支持硬链接，目标目录必须存在。已有目标、坏输入和超量窗口失败，不替换用户文件。

输入必须在调用期间保持稳定。读取检查大小与修改时间，但不保证识别同大小的并发重写。没有目录 fsync、断电事务、多文件提交或流式大数据内存保证。原始文本和解析数组会同时占用内存，容量限制不是进程内存硬隔离。

未支持：1991/2013、二进制 DAT、多采样率、非零 skew、缺失模拟值、自动时间修复、绝对 UTC 对齐、继电器故障识别、保护动作建议。不得据一条公开记录的验证扩大这些边界。
