{
  "communities": {
    "0": [
      "config_js",
      "hunt_config_cities",
      "hunt_config_gumtree_location_ids",
      "hunt_config_gumtree_urls",
      "hunt_config_rate_limits",
      "hunt_config_templates",
      "hunt_config_trade_aliases",
      "hunt_config_trades",
      "hunt_db_expirestalejobs",
      "hunt_db_upsertjob",
      "hunt_job_aggregator_cities",
      "hunt_job_aggregator_main",
      "hunt_job_aggregator_parseargs",
      "hunt_job_aggregator_path",
      "hunt_job_aggregator_processcity",
      "hunt_job_aggregator_sleep",
      "hunt_job_aggregator_upsertjob_expirestalejobs",
      "job_aggregator_js"
    ],
    "1": [
      "contractor_hunter_js",
      "hunt_contractor_hunter_axios",
      "hunt_contractor_hunter_cheerio",
      "hunt_contractor_hunter_cities_gumtree_urls_normalizetrade",
      "hunt_contractor_hunter_cleanurl",
      "hunt_contractor_hunter_extractcontacts",
      "hunt_contractor_hunter_extractsuburb",
      "hunt_contractor_hunter_fetchpage",
      "hunt_contractor_hunter_main",
      "hunt_contractor_hunter_parseargs",
      "hunt_contractor_hunter_parsepage",
      "hunt_contractor_hunter_path",
      "hunt_contractor_hunter_randomdelay",
      "hunt_contractor_hunter_randomuseragent",
      "hunt_contractor_hunter_scrapegumtreecontractors",
      "hunt_contractor_hunter_upsertcontact_insertlead",
      "hunt_contractor_hunter_user_agents"
    ],
    "2": [
      "db_js",
      "hunt_contractor_hunter_runcity",
      "hunt_db_contact_cooldown_days_max_contacts_rate_limits",
      "hunt_db_createclient",
      "hunt_db_findcontact",
      "hunt_db_findmatches",
      "hunt_db_insertlead",
      "hunt_db_insertmatch",
      "hunt_db_isuniqueviolation",
      "hunt_db_shouldautoapprove",
      "hunt_db_upsertcontact",
      "hunt_matchmaker_findmatches_insertmatch",
      "hunt_matchmaker_label",
      "hunt_matchmaker_main",
      "hunt_matchmaker_scorematch",
      "hunt_worker_hunter_runcity",
      "matchmaker_js"
    ],
    "3": [
      "hunt_config_filltemplate",
      "hunt_db_cancontact",
      "hunt_db_cansendtoday",
      "hunt_db_getdailysendcount",
      "hunt_db_getleadqueue",
      "hunt_db_recordcontact",
      "hunt_db_updateleadstatus",
      "hunt_outreach_sender_buildunsubscribeurl",
      "hunt_outreach_sender_capitalize",
      "hunt_outreach_sender_getleadqueue_updateleadstatus_cancontact_recordcontact_cansendtoday",
      "hunt_outreach_sender_main",
      "hunt_outreach_sender_runbatch",
      "hunt_outreach_sender_sendplaintext",
      "hunt_outreach_sender_sleep",
      "hunt_outreach_sender_templates_filltemplate_send_delay_ms",
      "outreach_sender_js"
    ],
    "4": [
      "hunt_db_markbounced",
      "hunt_db_markunsubscribed",
      "hunt_db_supabase",
      "hunt_reply_monitor_bounce_senders",
      "hunt_reply_monitor_classifyreply",
      "hunt_reply_monitor_decodebody",
      "hunt_reply_monitor_extractplaintext",
      "hunt_reply_monitor_getheader",
      "hunt_reply_monitor_listmessages_getthread",
      "hunt_reply_monitor_main",
      "hunt_reply_monitor_negative_keywords",
      "hunt_reply_monitor_positive_keywords",
      "hunt_reply_monitor_runcycle",
      "hunt_reply_monitor_supabase_markbounced_markunsubscribed",
      "reply_monitor_js"
    ],
    "5": [
      "hunt_config_normalizetrade",
      "scrapers_gumtree_jobs_chromium",
      "scrapers_gumtree_jobs_cleanurl",
      "scrapers_gumtree_jobs_extractjobsfrompage",
      "scrapers_gumtree_jobs_extractsuburb",
      "scrapers_gumtree_jobs_guesstrade",
      "scrapers_gumtree_jobs_gumtree_urls_normalizetrade",
      "scrapers_gumtree_jobs_headed",
      "scrapers_gumtree_jobs_js",
      "scrapers_gumtree_jobs_path",
      "scrapers_gumtree_jobs_randomdelay",
      "scrapers_gumtree_jobs_scrapegumtreejobs"
    ],
    "6": [
      "scrapers_gumtree_workers_chromium",
      "scrapers_gumtree_workers_extractcontacts",
      "scrapers_gumtree_workers_extractname",
      "scrapers_gumtree_workers_extractworkersfrompage",
      "scrapers_gumtree_workers_guesstrade",
      "scrapers_gumtree_workers_gumtree_urls_normalizetrade",
      "scrapers_gumtree_workers_headed",
      "scrapers_gumtree_workers_js",
      "scrapers_gumtree_workers_path",
      "scrapers_gumtree_workers_randomdelay",
      "scrapers_gumtree_workers_scrapegumtreeworkers"
    ],
    "7": [
      "scrapers_gumtree_scrapingbee_axios",
      "scrapers_gumtree_scrapingbee_cheerio",
      "scrapers_gumtree_scrapingbee_cleanurl",
      "scrapers_gumtree_scrapingbee_extractcontacts",
      "scrapers_gumtree_scrapingbee_fetchpage",
      "scrapers_gumtree_scrapingbee_gumtree_urls_normalizetrade",
      "scrapers_gumtree_scrapingbee_js",
      "scrapers_gumtree_scrapingbee_path",
      "scrapers_gumtree_scrapingbee_scrapegumtreejobs",
      "scrapers_gumtree_scrapingbee_scrapegumtreeworkers"
    ],
    "8": [
      "hunt_db_getstats",
      "hunt_notion_summary_formatsummary",
      "hunt_notion_summary_generatesummary",
      "hunt_notion_summary_getstats_supabase",
      "hunt_notion_summary_gettodaystats",
      "hunt_notion_summary_main",
      "hunt_notion_summary_todaystart",
      "notion_summary_js"
    ],
    "9": [
      "debug_gumtree_js",
      "hunt_debug_gumtree2_axios",
      "hunt_debug_gumtree2_cheerio",
      "hunt_debug_gumtree2_debug",
      "hunt_debug_gumtree_axios",
      "hunt_debug_gumtree_cheerio",
      "hunt_debug_gumtree_debug"
    ],
    "10": [
      "hunt_import_existing_leads_buildidentitykey",
      "hunt_import_existing_leads_createclient",
      "hunt_import_existing_leads_isuniqueviolation",
      "hunt_import_existing_leads_main",
      "hunt_import_existing_leads_supabase",
      "import_existing_leads_js"
    ],
    "11": [
      "hunt_worker_hunter_cities",
      "hunt_worker_hunter_main",
      "hunt_worker_hunter_parseargs",
      "hunt_worker_hunter_path",
      "hunt_worker_hunter_upsertcontact_insertlead",
      "worker_hunter_js"
    ],
    "12": [
      "ecosystem_config_js"
    ]
  },
  "cohesion": {
    "0": 0.1503267973856209,
    "1": 0.15441176470588236,
    "2": 0.21323529411764705,
    "3": 0.20833333333333334,
    "4": 0.2,
    "5": 0.21212121212121213,
    "6": 0.2727272727272727,
    "7": 0.24444444444444444,
    "8": 0.42857142857142855,
    "9": 0.2857142857142857,
    "10": 0.4666666666666667,
    "11": 0.4,
    "12": 1.0
  },
  "gods": [
    {
      "id": "hunt_outreach_sender_runbatch",
      "label": "runBatch()",
      "degree": 11
    },
    {
      "id": "hunt_reply_monitor_runcycle",
      "label": "runCycle()",
      "degree": 7
    },
    {
      "id": "scrapers_gumtree_workers_scrapegumtreeworkers",
      "label": "scrapeGumtreeWorkers()",
      "degree": 6
    },
    {
      "id": "hunt_contractor_hunter_scrapegumtreecontractors",
      "label": "scrapeGumtreeContractors()",
      "degree": 5
    },
    {
      "id": "hunt_contractor_hunter_runcity",
      "label": "runCity()",
      "degree": 5
    },
    {
      "id": "hunt_db_isuniqueviolation",
      "label": "isUniqueViolation()",
      "degree": 5
    },
    {
      "id": "hunt_db_upsertcontact",
      "label": "upsertContact()",
      "degree": 5
    },
    {
      "id": "hunt_db_insertlead",
      "label": "insertLead()",
      "degree": 5
    },
    {
      "id": "hunt_job_aggregator_main",
      "label": "main()",
      "degree": 5
    },
    {
      "id": "hunt_matchmaker_main",
      "label": "main()",
      "degree": 5
    }
  ],
  "surprises": [
    {
      "source": "guessTrade()",
      "target": "normalizeTrade()",
      "source_files": [
        "scrapers/gumtree-workers.js",
        "config.js"
      ],
      "confidence": "INFERRED",
      "relation": "calls",
      "why": "inferred connection - not explicitly stated in source; connects across different repos/directories; bridges separate communities"
    },
    {
      "source": "guessTrade()",
      "target": "normalizeTrade()",
      "source_files": [
        "scrapers/gumtree-jobs.js",
        "config.js"
      ],
      "confidence": "INFERRED",
      "relation": "calls",
      "why": "inferred connection - not explicitly stated in source; connects across different repos/directories"
    },
    {
      "source": "runCity()",
      "target": "upsertContact()",
      "source_files": [
        "contractor-hunter.js",
        "db.js"
      ],
      "confidence": "INFERRED",
      "relation": "calls",
      "why": "inferred connection - not explicitly stated in source; connects across different repos/directories"
    },
    {
      "source": "runCity()",
      "target": "insertLead()",
      "source_files": [
        "contractor-hunter.js",
        "db.js"
      ],
      "confidence": "INFERRED",
      "relation": "calls",
      "why": "inferred connection - not explicitly stated in source; connects across different repos/directories"
    },
    {
      "source": "runCity()",
      "target": "upsertContact()",
      "source_files": [
        "worker-hunter.js",
        "db.js"
      ],
      "confidence": "INFERRED",
      "relation": "calls",
      "why": "inferred connection - not explicitly stated in source; connects across different repos/directories"
    }
  ],
  "tokens": {
    "input": 0,
    "output": 0
  }
}