37 lines
2.2 KiB
Python
37 lines
2.2 KiB
Python
"""음성/역사 증거/원본 출처/현재 dist를 독립 SHA-256으로 대조한다."""
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
EVIDENCE = Path(__file__).resolve().parent
|
|
|
|
def sha(path):
|
|
"""파일은 읽기만 한다. 큰 바이너리도 전체 바이트를 해시하여 일부 변경을 놓치지 않는다."""
|
|
with Path(path).open('rb') as stream:
|
|
return hashlib.file_digest(stream, 'sha256').hexdigest()
|
|
|
|
baseline = json.loads((EVIDENCE / 'baseline.json').read_text())
|
|
for group in ('immutable', 'voiceWavs'):
|
|
for path, expected in baseline[group].items():
|
|
assert sha(ROOT / path) == expected, path
|
|
assert subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip() == baseline['commit']
|
|
plan = json.loads((ROOT / '.agent/AMBIENCE-SOURCES-v0.2.3.json').read_text())
|
|
manifest = json.loads((ROOT / 'public/ambience/manifest.json').read_text())
|
|
originals = []
|
|
for asset in plan['assets']:
|
|
suffix = '.mp3' if asset['environmentId'] in ('theater','department') else '.flac' if asset['environmentId']=='rain' else '.ogg'
|
|
source = Path('/tmp/findword-ambience-sources') / (asset['environmentId']+suffix)
|
|
assert source.stat().st_size == asset['sourceBytes'] and sha(source) == asset['expectedSourceSha256']
|
|
entry = next(f for f in manifest['files'] if f['environmentId']==asset['environmentId'])
|
|
assert all(entry[k] == value for k,value in asset.items())
|
|
originals.append({'environmentId':asset['environmentId'],'sourceSha256':sha(source),'sourceBytes':source.stat().st_size})
|
|
for source in (ROOT / 'public').rglob('*'):
|
|
if source.is_file(): assert sha(source) == sha(ROOT / 'dist' / source.relative_to(ROOT / 'public'))
|
|
report = {'headUnchanged':True,'head':baseline['commit'],'priorAgentFilesUnchanged':len(baseline['immutable']),
|
|
'voiceWavsUnchanged':len(baseline['voiceWavs']),'originals':originals,'allPublicBytesMatchDist':True,
|
|
'sourcePlanUnchanged':True,'noCommitPushMergeTagDeploy':True}
|
|
(EVIDENCE / 'preservation.json').write_text(json.dumps(report,indent=2)+'\n')
|
|
print(json.dumps({k:v for k,v in report.items() if k!='originals'},indent=2))
|