#!/usr/bin/env python3
"""Supplier phase5; keep unexplained natural category drift explicit."""
import hashlib
import json
from pathlib import Path
import subprocess
import integrate_20261010 as tool
from integrate_20261011_batches46_48 import item

HERE = Path(__file__).resolve().parent
P = Path('/Users/wiscourper/Documents/workspace/local/dm8-store-purchase-read3-20261012.L5dTYR/stage3')
BASE = 'work_store/apifox/2026-09-30-dm8-interface-acceptance/parallel-store-purchase-read3-20261012/'
REPORT = BASE + 'PHASE5_ROOT_REVIEW.md'

def verify():
    for name, pin in {
        'REPORT_PHASE5.md': 'a896113a4e66c6dd9d8235dce6bb8f95551c8063eb260047550c89fbe0909e1b',
        'manifest-phase5.json': 'eef4725971e694ed4473a4af7648ab11ebde4848445a206b25bc286ad02daacb',
        'audit-phase5.js': '35530ba0e00a16be011a643622cd949085f53b34ae2ad63905e31c2045c9edde',
    }.items():
        assert hashlib.sha256((P/name).read_bytes()).hexdigest() == pin
    result = json.loads(subprocess.check_output(['node', str(P/'audit-phase5.js'), '--readonly']))
    assert result['readonly'] and result['checks'] == 215 and result['assets'] == 83
    assert result['new_keys'] == ['POST /p/Supplier/del']
    assert result['continuous'] == {'B':1783, 'C':2279}
    for lane in ['B', 'C']:
        root = P/(lane+'-phase5')
        before = json.loads((root/'setup.json').read_text())['snapshot']
        final = json.loads((root/'final-phase5.json').read_text())
        assert not final['strict_equal']
        assert [k for k in before if before[k] != final['snapshot'][k]] == ['categories']
        assert final['snapshot']['categories']['rows'] == before['categories']['rows'] + 2

if __name__ == '__main__':
    audit = HERE/'integration-20261012-batch117.json'
    assert not audit.exists()
    targets = [item('store','POST','/p/Supplier/del',BASE,evidence=REPORT,
        from_repo='unreviewed',from_source='apifox-2026-05-08',
        readback='partial-evidence-own-supplier-softdelete-annex-zero-native-transaction-and-independent-full-row',
        parity='partial-evidence-original-HTTP-shape-and-independent-typed-source-DTO-match',
        cleanup='marked-own-fixtures-retained-natural-category-plus2-both-lanes-unexplained-outside-recorded-write-set')]
    for path in ['/p/Supplier/add','/p/Supplier/read']:
        targets.append(item('store','POST',path,BASE,evidence=REPORT,evidence_only=True))
    tool.main(targets,audit,verify)
