FastSim 通过范围化的 run.output 服务发布主录制文件。该服务采用事务流程:插件先写入 私有暂存文件,再通过不透明的回读 Lease 完成校验,最后由 Core 发布已经校验的同一 Inode。完整性模式只决定是否计算内容摘要,不会放宽事务门禁或 FSR 结构门禁。

选择完整性模式

RunOutputPolicy 默认使用结构完整性:

python
policy = RunOutputPolicy(output_root)
assert policy.integrity == "structural"

只有部署环境需要验证“校验完成到提交之间”的内容未被修改时,才显式启用 SHA-256:

python
policy = RunOutputPolicy(output_root, integrity="sha256")

只接受 structuralsha256。事务通过 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" 和真实的小写摘要。

事务顺序

  1. begin_primary(...) 为一个逻辑输出创建唯一事务。
  2. open_stream() 返回与 Worker 线程绑定的暂存 Lease。
  3. Worker 写入并关闭这个准确的 Lease。
  4. seal(lease) 校验暂存文件描述符、Inode、链接数和文件尺寸。
  5. open_readback() 返回仅一次、不透明、只读并受尺寸限制的 Lease。
  6. Validator 解析 FSR Container,校验 Manifest、Footer、Index 和 Record Inventory, 然后关闭 Readback Lease。
  7. confirm_validation(lease, receipt) 校验准确的 Lease、字节数与完整性模式。SHA-256 模式还会把 Validator 摘要与写入端摘要进行比对。
  8. commit() 再次检查文件身份,执行所选摘要校验,同步文件和父目录,在不覆盖已有 最终文件的前提下发布,验证已发布 Inode,最后删除暂存入口。

发布前的任何失败都会删除暂存文件;只有受信策略显式要求时才保留有界的不完整证据。 服务撤销与应用关闭也复用同一清理边界。

Receipt

RunOutputValidationReceiptRunOutputCommitReceipt 使用 Schema v2。两者均明确 携带 integrity,摘要字段是否存在由模式决定:

  • structuralcontent_sha256 / sha256 必须为 None
  • sha256:摘要必须为 64 位小写十六进制字符串。

两种模式都不接受空字符串;Receipt 的完整性模式必须与事务完全一致。

安全边界

结构模式能够发现 Inode 身份、链接数或尺寸变化,并拒绝未通过 FSR 结构校验的文件。 它有意不承诺发现“成功回读校验之后发生、文件尺寸不变”的字节修改。如果该威胁属于 部署范围,应选择 integrity="sha256";提交前的重新读取会在发布前发现这种修改。