""" ChronoVeritas v2 — Standalone Data Generator Generates adversarial tasks using the Mutator and Spreader without requiring any GPU training libraries (TRL, Unsloth, Transformers). """ import argparse import json import random from pathlib import Path from agents.task_bank import SEED_FACTS from agents.mutator import Mutator from agents.spreader import Spreader def main(): parser = argparse.ArgumentParser(description="Generate tasks for ChronoVeritas v2") parser.add_argument("--easy", type=int, default=10, help="Number of easy tasks") parser.add_argument("--medium", type=int, default=10, help="Number of medium tasks") parser.add_argument("--hard", type=int, default=5, help="Number of hard tasks") parser.add_argument("--seed", type=int, default=42, help="Random seed") parser.add_argument("--output-dir", type=str, default="data/tasks/generated", help="Output directory") args = parser.parse_args() out_dir = Path(args.output_dir) out_dir.mkdir(parents=True, exist_ok=True) mutator = Mutator(seed=args.seed) spreader = Spreader(seed=args.seed) rng = random.Random(args.seed) mutation_types = ["distortion", "fabrication", "omission", "context_shift"] total_generated = 0 print(f"Generating tasks to {out_dir}/ ...") for diff, count in [("easy", args.easy), ("medium", args.medium), ("hard", args.hard)]: for i in range(count): # Pick a random seed fact fact = rng.choice(list(SEED_FACTS)) # Cycle through mutation types to ensure a balanced dataset mut_type = mutation_types[(total_generated + i) % 4] try: mutation = mutator.mutate(fact, mutation_type=mut_type) task = spreader.spread(mutation, difficulty=diff) # Enrich ground truth for training scripts task["ground_truth"]["corpus_ids"] = [d["doc_id"] for d in task["corpus"]] # Save to disk file_path = out_dir / f"{task['task_id']}.json" with open(file_path, "w") as f: json.dump(task, f, indent=2) print(f" [{diff.upper()}] {task['task_id']} — {mut_type} applied to {fact.fact_id}") total_generated += 1 except Exception as e: print(f" [ERROR] Failed to generate task: {e}") print(f"\nāœ… Successfully generated {total_generated} tasks in {out_dir}/") if __name__ == "__main__": main()