75 lines
4.5 KiB
Python
75 lines
4.5 KiB
Python
"""Check saved baselines against current files without rewriting historical evidence."""
|
|||
|
|
from datetime import datetime, timezone
|
||
|
|
import hashlib
|
||
|
|
import json
|
||
|
|
from pathlib import Path
|
||
|
|
import subprocess
|
||
|
|
|
||
|
|
ROOT = Path(__file__).resolve().parents[4]
|
||
|
|
EVIDENCE = Path(__file__).resolve().parent
|
||
|
|
|
||
|
|
def sha(path):
|
||
|
|
with path.open('rb') as stream: return hashlib.file_digest(stream, 'sha256').hexdigest()
|
||
|
|
|
||
|
|
baseline = json.loads((EVIDENCE / 'baseline.json').read_text())
|
||
|
|
changed, voices, ambience = [], [], []
|
||
|
|
for name, before in baseline['wavSha256'].items():
|
||
|
|
after = sha(ROOT / name)
|
||
|
|
if after != before:
|
||
|
|
assert name in ('public/ambience/market.wav', 'public/ambience/cafe.wav'), name
|
||
|
|
changed.append({'file': name, 'beforeSha256': before, 'afterSha256': after})
|
||
|
|
elif name.startswith('public/audio/'):
|
||
|
|
voices.append(name)
|
||
|
|
else:
|
||
|
|
ambience.append(name)
|
||
|
|
assert len(voices) == 101 and len(ambience) == 6 and len(changed) == 2
|
||
|
|
assert 'public/ambience/mall.wav' in ambience
|
||
|
|
for name, before in baseline['immutablePriorAttemptFiles'].items():
|
||
|
|
assert sha(ROOT / name) == before, name
|
||
|
|
assert (ROOT / name).stat().st_mode & 0o222 == 0, name
|
||
|
|
preserved = []
|
||
|
|
for name, before in baseline['priorAgentFiles'].items():
|
||
|
|
if name in baseline['mutableAgentFiles']: continue
|
||
|
|
assert sha(ROOT / name) == before, name
|
||
|
|
preserved.append(name)
|
||
|
|
older = json.loads((EVIDENCE.parent / 'baseline.json').read_text())
|
||
|
|
assert all(sha(ROOT / name) == before for name, before in older['priorAgentFiles'].items() if name not in older['mutableAgentFiles'])
|
||
|
|
assert all(sha(ROOT / name) == before for name, before in older['wavSha256'].items()
|
||
|
|
if name not in ('public/ambience/mall.wav', 'public/ambience/market.wav', 'public/ambience/cafe.wav'))
|
||
|
|
tracked = subprocess.check_output(['git', 'ls-files', '.agent'], cwd=ROOT, text=True).splitlines()
|
||
|
|
for name in tracked:
|
||
|
|
saved = subprocess.check_output(['git', 'rev-parse', 'HEAD:' + name], cwd=ROOT, text=True).strip()
|
||
|
|
actual = subprocess.check_output(['git', 'hash-object', name], cwd=ROOT, text=True).strip()
|
||
|
|
assert actual == saved, name
|
||
|
|
before_plan = json.loads((EVIDENCE / 'before-source-plan.json').read_text())
|
||
|
|
plan = json.loads((ROOT / '.agent/AMBIENCE-SOURCES-v0.2.3.json').read_text())
|
||
|
|
assert [a['environmentId'] for a in before_plan['assets']] == [a['environmentId'] for a in plan['assets']]
|
||
|
|
for before, after in zip(before_plan['assets'], plan['assets']):
|
||
|
|
expected = dict(before)
|
||
|
|
if before['environmentId'] in ('market', 'cafe'):
|
||
|
|
expected['selectedSegmentStartSeconds'] = {'market':24, 'cafe':0}[before['environmentId']]
|
||
|
|
assert after == expected, after['environmentId']
|
||
|
|
for name in ['manifest.json', 'AMBIENCE_NOTICES.md', *[p.name for p in (ROOT / 'public/ambience').glob('*.wav')]]:
|
||
|
|
assert (ROOT / 'public/ambience' / name).read_bytes() == (ROOT / 'dist/ambience' / name).read_bytes(), name
|
||
|
|
screen_path = EVIDENCE.parent / 'final-asr.json'
|
||
|
|
screen = json.loads(screen_path.read_text())
|
||
|
|
assert screen['requiredEmptyPassed'] is True
|
||
|
|
assert screen['limitations']['humanListeningAcceptance'] is False
|
||
|
|
assert screen['limitations']['legalPrivacyClearance'] is False
|
||
|
|
assert sha(ROOT / 'public/ambience/manifest.json') == screen['method']['manifestSha256']
|
||
|
|
assert sha(EVIDENCE / 'screen-final.py') == screen['method']['scriptSha256']
|
||
|
|
assert sha(EVIDENCE.parent / screen['priorFailedAttempt']['file']) == screen['priorFailedAttempt']['sha256']
|
||
|
|
assert sha(EVIDENCE.parent / screen['supplementaryNoVadRun']['file']) == screen['supplementaryNoVadRun']['sha256']
|
||
|
|
for entry in screen['files']:
|
||
|
|
assert sha(ROOT / entry['file']) == entry['sha256']
|
||
|
|
report = {'completedAtUtc': datetime.now(timezone.utc).isoformat(), 'voiceWavsUnchanged': len(voices),
|
||
|
|
'unaffectedAmbienceWavsUnchanged': 5, 'mallWavUnchanged': True, 'allAmbienceWavsUnchangedInRetry': ambience,
|
||
|
|
'changedWavs': changed, 'priorAgentFilesUnchanged': len(preserved),
|
||
|
|
'archivedPriorAttemptFilesUnchanged': len(baseline['immutablePriorAttemptFiles']),
|
||
|
|
'archiveFilesReadOnly': True, 'gitTrackedHistoricalAgentFilesUnchanged': len(tracked),
|
||
|
|
'sourceProvenanceUnchangedExceptAuthorizedStarts': True, 'distMatchesCurrentAmbienceBundle': True,
|
||
|
|
'finalScreenMatchesCurrentFilesAndScript': True, 'finalAsrSha256': sha(screen_path),
|
||
|
|
'head': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip()}
|
||
|
|
with (EVIDENCE / 'preservation.json').open('x') as out: out.write(json.dumps(report, indent=2) + '\n')
|
||
|
|
print(json.dumps(report, indent=2))
|