#!/usr/bin/env python3 """Build a new, verified release archive after board acceptance. Never overwrite it.""" import argparse import hashlib import json from pathlib import Path import shutil import tarfile def digest(path): with path.open('rb') as f:return hashlib.file_digest(f,'sha256').hexdigest() def main(): p=argparse.ArgumentParser(description=__doc__) p.add_argument('--root',type=Path,required=True) a=p.parse_args() root=a.root.resolve();source=root/'source' package=root/'package/mindnano-ling3-rk3588-selective-20260911' archive=root/(package.name+'.tar.gz') partial=archive.with_suffix(archive.suffix+'.building') if archive.exists() or partial.exists():raise FileExistsError('archive already exists') result=json.loads((root/'validation/results.json').read_text()) assert result['passed'] and all(x['bitwise_equal'] for x in result['logit_equality']) assert result['health_restored']['status']=='ok' api=json.loads((root/'validation/api.json').read_text()) cache=json.loads((root/'validation/prefix-cache.json').read_text()) assert api['passed'] and cache['passed'] manifest=json.loads((package/'MANIFEST.json').read_text()) assert manifest['files']['mindnano-infer-engine']['sha256']==digest(root/'build/mindnano-infer') readme_template=source/'docs/deployment-selective-readme.md' if not readme_template.is_file():readme_template=source/'README.md' shutil.copyfile(readme_template,package/'README.md') merge=package/'ling3-tiny-w4.merge.json' if merge.exists():merge.rename(package/'MODEL.json') model=json.loads((package/'MODEL.json').read_text()) assert model['all_payload_sha256_valid'] and model['source_payloads_verified'] validation=dict(passed=True,model_merge=model,portable_health=result['health'], portable_api_passed=api['passed'],prefix_cache_passed=cache['passed'], performance=dict(context=65536,input_tokens=128,output_tokens=64,warm_request_excluded=True, runs=3,**result['performance']), run_metrics=[x['mindnano_metrics'] for x in result['runs']], full_candidate_logit_comparison=result['logit_equality'], source_weight_rmse=0.005611173617454249, fixed_prefix_tv=dict(nothink=0.08169259726325992,think=0.09401621062421926), notes='Speed is package acceptance under current background load; quality is fixed-prefix, not long generation') (package/'VALIDATION.json').write_text(json.dumps(validation,ensure_ascii=False,indent=2)+'\n') def keep(info): if '__pycache__' in Path(info.name).parts or info.name.endswith('.pyc'):return None info.uid=info.gid=0;info.uname=info.gname='root' return info with tarfile.open(package/'SOURCE.tar.gz','w:gz',compresslevel=6) as tar: for name in ('CMakeLists.txt','LICENSE','LICENSES.md','src','include','tools','tests','third_party','deployment','docs'): if not (source/name).exists():continue tar.add(source/name,arcname='Ling3RKNN/'+name,filter=keep) checks=[] for file in sorted(package.iterdir()): if file.is_file() and file.name!='SHA256SUMS':checks.append(digest(file)+' '+file.name) (package/'SHA256SUMS').write_text('\n'.join(checks)+'\n') print(json.dumps(dict(phase='archive',files=[x.name for x in sorted(package.iterdir())], performance=result['performance'])),flush=True) with tarfile.open(partial,'w:gz',compresslevel=6) as tar: tar.add(package,arcname=package.name,filter=keep) partial.rename(archive) sha=digest(archive) archive.with_name(archive.name+'.sha256').write_text(sha+' '+archive.name+'\n') print(json.dumps(dict(archive=str(archive),bytes=archive.stat().st_size,sha256=sha)),flush=True) if __name__=='__main__':main()