FastSim 通过范围化的 run.output 服务发布主录制文件。该服务采用事务流程:插件先写入
私有暂存文件,再通过不透明的回读 Lease 完成校验,最后由 Core 发布已经校验的同一
Inode。完整性模式只决定是否计算内容摘要,不会放宽事务门禁或 FSR 结构门禁。
选择完整性模式
RunOutputPolicy 默认使用结构完整性:
policy = RunOutputPolicy(output_root)
assert policy.integrity == "structural"
只有部署环境需要验证“校验完成到提交之间”的内容未被修改时,才显式启用 SHA-256:
policy = RunOutputPolicy(output_root, integrity="sha256")
只接受 structural 和 sha256。事务通过 transaction.integrity 公开已选择的模式,
Validator 因此无需执行 Core 没有要求的计算。
| 工作 | structural(默认) |
sha256 |
|---|---|---|
| 写入端 Payload SHA-256 | 0 | 1 次流式摘要 |
| Validator 全文件 SHA-256 | 0 | 1 次 |
| Commit 全文件 SHA-256 | 0 | 1 次 |
| Writer 与 Readback Lease 已关闭 | 必需 | 必需 |
| 已校验字节数 | 必需 | 必需 |
| FSR 结构与 Inventory 校验 | 必需 | 必需 |
| 文件描述符、Inode、链接数与尺寸身份 | 必需 | 必需 |
fdatasync、目录 fsync、原子发布与清理 |
必需 | 必需 |
当前 FSR binary 1.2 集成使用 structural-validation Reader Profile。结构校验的
Validation Receipt 使用 validation_profile="structural-container"、
integrity="structural" 和 content_sha256=None;严格校验使用
validation_profile="full-file-and-inventory"、integrity="sha256" 和真实的小写摘要。
事务顺序
begin_primary(...)为一个逻辑输出创建唯一事务。open_stream()返回与 Worker 线程绑定的暂存 Lease。- Worker 写入并关闭这个准确的 Lease。
seal(lease)校验暂存文件描述符、Inode、链接数和文件尺寸。open_readback()返回仅一次、不透明、只读并受尺寸限制的 Lease。- Validator 解析 FSR Container,校验 Manifest、Footer、Index 和 Record Inventory, 然后关闭 Readback Lease。
confirm_validation(lease, receipt)校验准确的 Lease、字节数与完整性模式。SHA-256 模式还会把 Validator 摘要与写入端摘要进行比对。commit()再次检查文件身份,执行所选摘要校验,同步文件和父目录,在不覆盖已有 最终文件的前提下发布,验证已发布 Inode,最后删除暂存入口。
发布前的任何失败都会删除暂存文件;只有受信策略显式要求时才保留有界的不完整证据。 服务撤销与应用关闭也复用同一清理边界。
Receipt
RunOutputValidationReceipt 与 RunOutputCommitReceipt 使用 Schema v2。两者均明确
携带 integrity,摘要字段是否存在由模式决定:
structural:content_sha256/sha256必须为None。sha256:摘要必须为 64 位小写十六进制字符串。
两种模式都不接受空字符串;Receipt 的完整性模式必须与事务完全一致。
安全边界
结构模式能够发现 Inode 身份、链接数或尺寸变化,并拒绝未通过 FSR 结构校验的文件。
它有意不承诺发现“成功回读校验之后发生、文件尺寸不变”的字节修改。如果该威胁属于
部署范围,应选择 integrity="sha256";提交前的重新读取会在发布前发现这种修改。