"""Materialize inspectable membership records for a synthetic observation log.""" import argparse import hashlib import json from pathlib import Path from partitions import MODES, partition, describe, SALT ROOT = Path(__file__).resolve().parent def record(): raw = (ROOT / 'observations.json').read_bytes() rows = json.loads(raw) modes = {} for mode in MODES: parts = partition(rows, mode) modes[mode] = {'summary': describe(parts), 'ids': {name: [r['id'] for r in items] for name, items in parts.items()}} return {'mode': 'synthetic split inspection; no training or model evaluation', 'input_sha256': hashlib.sha256(raw).hexdigest(), 'hash_salt': SALT, 'observations': len(rows), 'modes': modes} def main(): parser = argparse.ArgumentParser() parser.add_argument('--save', type=Path) parser.add_argument('--check', action='store_true') args = parser.parse_args() result = record() if args.check and result != json.loads((ROOT / 'result.json').read_text()): raise SystemExit('split record differs from the bundled fixture') if args.save: args.save.write_text(json.dumps(result, indent=2) + '\n') print(f"Synthetic observations: {result['observations']}; split membership only, no quality scores") for mode, item in result['modes'].items(): s = item['summary']; r = s['rows'] print(f"{mode}: train={r['training']}; validation={r['validation']}; test={r['test']}; " f"excluded={r['excluded']}; train/test shared entities={s['train_test_shared_entities']}") print('Temporal gaps and group isolation answer different deployment questions.') if __name__ == '__main__': main()