#!/usr/bin/env python3
"""Second independently frozen batch; sampled evidence, never full acceptance."""
import json
from pathlib import Path
import subprocess
import sys
import integrate_20261010 as tool

AI = tool.AI
STORE = tool.STORE

def verify():
    category = AI + 'parallel-ai-article-category-20261010/'
    subprocess.run([sys.executable, str(tool.ROOT / category / 'compare.py'),
        str(tool.ROOT / category / 'evidence-B.json'), str(tool.ROOT / category / 'evidence-C.json')],
        check=True, capture_output=True)
    region = tool.load(AI + 'parallel-ai-region-spec-20261010/results.json')
    assert region['scenario_pairs'] == 22 and region['strict_equal_cases'] == 18
    assert region['region_routes_cold_db_observed'] == region['region_warm_cache_cases'] == 6
    assert region['spec_nonempty_C_cases'] == region['spec_nonempty_both_cases'] == 0
    cases = [c for c in region['cases'] if '/region/' in c['path'].lower()]
    assert len(cases) == 12 and len({c['path'] for c in cases}) == 6
    for case in cases:
        assert case['strict_differences'] == 0 and case['source_rows_B'] == case['source_rows_C'] == 3835
        count = 1 if case['scenario'].endswith('_COLD') else 0
        assert case['region_data_select_B'] == case['region_data_select_C'] == count
    for audit in region['audit'].values():
        assert audit['natural_unchanged'] and audit['non_select_observed'] == 0
        assert audit['token_cleaned'] and audit['region_cache_cleaned']
    finance = STORE + 'parallel-store-finance-readonly2-20261010/'
    subprocess.run([sys.executable, str(tool.ROOT / finance / 'compare.py')], check=True, capture_output=True)
    cleanup = tool.load(finance + 'cleanup.json')
    lanes = {r['lane']: r for r in cleanup['lanes']}
    assert set(lanes) == {'B', 'C'} and cleanup['worker_cache_rechecked_after_shutdown']
    for lane in ['B', 'C']:
        assert lanes[lane]['worker_stopped'] and lanes[lane]['port_not_listening']
        assert lanes[lane]['private_cache_files_remaining'] == 0 and lanes[lane]['selected_source_unchanged']

def targets():
    out = []
    def add(repo, method, path, module, terminal, scope, evidence, **extra):
        out.append(dict(repo=repo, method=method, path=path, module=module, terminal=terminal,
            role='isolated-approved-local-fixture-or-readonly-auth', risk='read' if method == 'GET' else 'content-write',
            scope=scope, evidence=evidence, **extra))
    for app, terminal in [('api', '移动端'), ('store', 'PC端'), ('terminal', '设备端')]:
        for action in ['all', 'tree']:
            add('ai_api', 'GET', f'/{app}/Region/{action}', '地区字典', terminal,
                'ai-primary-region-cold-source-and-private-warm-cache', AI + 'parallel-ai-region-spec-20261010/REPORT.md',
                parity='partial-evidence-complete-3835-node-response-equal-cold-and-warm')
    for app, terminal in [('store', 'PC端'), ('terminal', '设备端')]:
        for action in ['list', 'add', 'edit', 'delete']:
            add('ai_api', 'GET' if action == 'list' else 'POST', f'/{app}/content.article.Category/{action}',
                '文章分类', terminal, 'ai-primary-own-category-and-owned-article-reference',
                AI + 'parallel-ai-article-category-20261010/REPORT.md',
                boundary_empty_min_max='partial-evidence-empty-quoted-Chinese-sort-and-referenced-delete-rejection',
                parity='partial-evidence-24-complete-responses-equal-own-tenant-source-verified',
                request_type='GET-query' if action == 'list' else 'JSON-or-form-see-evidence')
        add('ai_api', 'GET', f'/{app}/goods.Spec/list', '商品规格读取', terminal,
            'ai-primary-natural-goods-spec-rel-spec-spec-value-readonly', AI + 'parallel-ai-region-spec-20261010/REPORT.md',
            mysql_state='tested-pass', dm_state='partial-evidence-empty-snapshot-no-positive-row',
            mysql_readback='tested-pass-code-local-source-relations', dm_readback='partial-evidence-source-three-tables-empty',
            readback='partial-evidence-B-positive-C-empty-snapshot-boundaries-only',
            parity='partial-evidence-boundary-errors-equal-natural-positive-snapshot-diff-not-SQL-failure',
            boundary_empty_min_max='partial-evidence-zero-negative-and-missing-goods-id',
            evidence_only=app == 'store')
    for action in ['list', 'detail']:
        add('store', 'GET', '/api/balance.log/' + action, '移动余额流水读取', '移动端',
            'store-primary-owned-current-user-ledger-readonly', STORE + 'parallel-store-finance-readonly2-20261010/REPORT.md',
            from_repo='unreviewed', from_source='apifox-2026-05-08',
            parity='partial-evidence-own-source-values-and-all-JSON-types-equal-money-red-green',
            boundary_empty_min_max='partial-evidence-missing-detail-error' if action == 'detail' else 'not-tested')
    add('store', 'GET', '/api/cashout/list', '移动提现列表读取', '移动端',
        'store-primary-natural-cashout-list-readonly', STORE + 'parallel-store-finance-readonly2-20261010/REPORT.md',
        from_repo='unreviewed', from_source='apifox-2026-05-08',
        parity='partial-evidence-own-source-values-and-all-JSON-types-equal-money-red-green')
    return out

if __name__ == '__main__':
    tool.main(targets(), Path(__file__).with_name('integration-20261010-batch2.json'), verify)
