"""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))