File size: 1,723 Bytes
301b0eb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | """Synthetic manifests verify the preflight detects tampering, with no large model files."""
from pathlib import Path
import hashlib,json,tempfile,unittest
from verify_assets import check
class InventoryTest(unittest.TestCase):
def test_manifest_tampering_is_rejected(self):
with tempfile.TemporaryDirectory() as d:
root=Path(d);resources=root/'resources';(resources/'text_encoder').mkdir(parents=True);(resources/'video_vae.safetensors').write_bytes(b'encoder fixture')
(root/'model.safetensors').write_bytes(b'model fixture')
(root/'config.json').write_text(json.dumps(dict(action_dim=20,chunk_size=32,torch_dtype='bfloat16')))
(root/'manifest.json').write_text(json.dumps(dict(kind='policy_export',format_version=1,sha256={n:hashlib.sha256((root/n).read_bytes()).hexdigest() for n in ['config.json','model.safetensors']})))
self.assertTrue(check('flux',root,resources,verify_hashes=True)['hashes_verified'])
(root/'model.safetensors').write_bytes(b'changed')
with self.assertRaisesRegex(ValueError,'Manifest hash mismatch'):check('flux',root,resources,verify_hashes=True)
def test_pi05_requires_checkpoint_norm_stats_not_optimizer(self):
with tempfile.TemporaryDirectory() as d:
root=Path(d);(root/'model.safetensors').write_bytes(b'model fixture')
with self.assertRaisesRegex(ValueError,'norm_stats'):check('pi05',root)
n=root/'assets/umi_v3/norm_stats.json';n.parent.mkdir(parents=True);n.write_text('{"state":{"mean":[0]},"actions":{"mean":[0]}}')
self.assertFalse(check('pi05',root)['optimizer_required_for_inference'])
if __name__=='__main__':unittest.main()
|