import json, os, re # Existing site titles (from API fetch) existing = """Proactive Key Rotation via Secret Sharing without Consensus Pause or Disruption Two-Phase Commit with Early Termination and Parallel Vote Aggregation CFFS-Based Fast Finality for Heterogeneous Validator Set Sizes in Practice Stochastic Liveness Analysis under Dynamic Network Churn and Variable Latency Private Transactionpool within BFT via Vector Commitments and Zero-Knowledge Rollup-Centric Consensus with Data Availability Sampling Fraud Proofs Energy-Optimized BFT for Constrained Edge Devices with Duty-Cycle Awareness BFT for Duty-Cycled Low-Power IoT Networks with Scheduled Radio Wakeups Location-Aware Validator Assignment with Distance-Weighted Scoring for BFT Cross-Shard Execution with Super-Block Atomic Commitment and Finality Modular Finality as a Service Layer for Existing BFT Consensus Engines zkSNARK-Proven Correctness of Leader Rotation in Permissionless Consensus Time-Lock Puzzle Based Leader Scheduling for Quorum Fairness in BFT Governance Parameter Updates via Time-Locked Delegation and Vote Escrow Threshold MPC for Validator Key Management with Proactive Secret Rotation Post-Quantum BFT via WOTS+ Signatures and Merkleized State Digests EigenLayer Restaking for Multi-Chain Shared Security with Validator Churn Multi-Shard Atomic Operations with Threshold Signatures and Watcher Nodes Formal Synthesis of BFT Protocols from Temporal Logic Specifications ML-Based Byzantine Detector using Gradient Anomaly and Behavior Profiling""".split('\n') existing_set = set(existing) # Parse TOPICS from harness.py with open('harness.py','r') as f: content = f.read() m = re.search(r'TOPICS\s*=\s*\[(.*?)\]', content, re.DOTALL) if not m: print('TOPICS not found') exit(1) topics_raw = m.group(1) # Split by commas, strip quotes topics = [] for t in topics_raw.split(','): t = t.strip() if not t: continue # Remove surrounding quotes if t.startswith('"') or t.startswith("'"): t = t[1:] if t.endswith('"') or t.endswith("'"): t = t[:-1] topics.append(t.strip()) print(f'Total TOPICS in harness: {len(topics)}') overlaps = [t for t in topics if t in existing_set] safe = [t for t in topics if t not in existing_set] print(f'Overlap with existing site papers: {len(overlaps)}') for t in overlaps: print(f' DUPLICATE: {t}') # Already used in harness results used = set() if os.path.exists('harness_results.jsonl'): with open('harness_results.jsonl') as f: for line in f: try: r = json.loads(line) used.add(r.get('topic','')) except: pass print(f'\nAlready used in harness results: {len(used)}') print('Used topics:') for t in sorted(used): print(f' {t}') remaining_safe = [t for t in safe if t not in used] print(f'\nRemaining safe (not overlapping site AND not yet attempted): {len(remaining_safe)}') print('Remaining safe topics:') for t in remaining_safe: print(f' {t}') # Suggest new topics to add if needed if len(remaining_safe) < 14: print(f'\nWARNING: Only {len(remaining_safe)} safe topics remain. Need to add more to reach 50 total new papers.') print('Suggested new topics (BFT-related, not overlapping):') new_topics = [ "Adaptive Val Set Size with Load-Aware Scaling in BFT", "Geo-Partitioned Consensus with bounded latency using Satellite Links", "BFT Middleware for Serverless Functions with Stateless Validation", "Cross-Domain BFT via Trust Expressors and Signature Bridge", "Zero-Knowledge Proofs for BFT State Validation at Scale", "Economic Finality Gadget for BFT with Slashing Bond Insurance", "Hardware Security Module Integration for BFT Leader Signing", "AI-Driven Node Reputation with Multi-Armed Bandit Selection", "BFT for Autonomous Vehicle Fleets with Edge Computing", "Privacy-Preserving BFT via Homomorphic Encryption and MPC", ] for t in new_topics: print(f' - {t}')