{
 "generated": "2026-08-16T05:21:47+00:00",
 "cutoff": "2026-08-15",
 "methodology": {
  "server": "https://gis.tucsonaz.gov/arcgis/rest/services/PublicMaps/PermitsCode/MapServer (returnCountOnly / outStatistics / groupByFieldsForStatistics only -- no row downloads, no DESCRIPTION text fetched)",
  "layers": {
   "85": "residential building permits (PDSD_ResidentialBldg)",
   "81": "commercial building permits (PDSD_CommercialBldg)",
   "102": "code enforcement cases (ENGOV_CodeCases)"
  },
  "dateFloor": "2022-01-01",
  "cutoff": "2026-08-15",
  "whereClauses": {
   "panel": "(UPPER(DESCRIPTION) LIKE '%PANEL UPGRADE%' OR UPPER(DESCRIPTION) LIKE '%MPU%' OR UPPER(DESCRIPTION) LIKE '%SERVICE UPGRADE%' OR UPPER(DESCRIPTION) LIKE '%ELECTRICAL UPGRADE%' OR UPPER(DESCRIPTION) LIKE '%ELECTRIC UPGRADE%' OR UPPER(DESCRIPTION) LIKE '%SERVICE CHANGE%')",
   "hvac": "(UPPER(DESCRIPTION) LIKE '%HVAC%' OR UPPER(DESCRIPTION) LIKE '%CHANGE OUT%' OR UPPER(DESCRIPTION) LIKE '%CHANGEOUT%' OR UPPER(DESCRIPTION) LIKE '%HEAT PUMP%' OR UPPER(DESCRIPTION) LIKE '%AIR CONDITION%' OR UPPER(DESCRIPTION) LIKE '%A/C%')",
   "solar": "WORKCLASS='Residential Solar Permit'",
   "ev": "(UPPER(DESCRIPTION) LIKE '%EV CHARG%' OR UPPER(DESCRIPTION) LIKE '%ELECTRIC VEHICLE%' OR UPPER(DESCRIPTION) LIKE '%EVSE%')",
   "remodel": "(UPPER(DESCRIPTION) LIKE '%REMODEL%' OR UPPER(DESCRIPTION) LIKE '%ADDITION%' OR UPPER(DESCRIPTION) LIKE '%RENOVAT%' OR UPPER(DESCRIPTION) LIKE '%TENANT IMPROVEMENT%' OR UPPER(DESCRIPTION) LIKE '%ADU%' OR UPPER(DESCRIPTION) LIKE '%CASITA%' OR UPPER(DESCRIPTION) LIKE '%GUEST HOUSE%')",
   "codeElectrical": "(UPPER(DESCRIPTION) LIKE '%ELECTRIC%' OR UPPER(DESCRIPTION) LIKE '%WIRING%')",
   "ti": "(UPPER(DESCRIPTION) LIKE '%TENANT IMPROVEMENT%' OR UPPER(DESCRIPTION) LIKE '%T.I.%' OR UPPER(DESCRIPTION) LIKE '% TI %')",
   "switchgear": "(UPPER(DESCRIPTION) LIKE '%SWITCHGEAR%' OR UPPER(DESCRIPTION) LIKE '%SERVICE UPGRADE%' OR UPPER(DESCRIPTION) LIKE '%SWITCHBOARD%' OR UPPER(DESCRIPTION) LIKE '%MDP%')"
  },
  "categoryLayers": {
   "total": {
    "layers": [
     "85",
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "panel": {
    "layers": [
     "85",
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "hvac": {
    "layers": [
     "85",
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "solar": {
    "layers": [
     "85"
    ],
    "dateField": "ISSUEDATE"
   },
   "ev": {
    "layers": [
     "85",
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "remodel": {
    "layers": [
     "85",
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "ti": {
    "layers": [
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "switchgear": {
    "layers": [
     "81"
    ],
    "dateField": "ISSUEDATE"
   },
   "codeElectrical": {
    "layers": [
     "102"
    ],
    "dateField": "OPENEDDATE"
   }
  },
  "quarterTechnique": "Per-category (year, month) count matrices fetched via groupByFieldsForStatistics='EXTRACT(YEAR FROM x), EXTRACT(MONTH FROM x)' -- ONE request per category-layer covers the entire 2022+ history. EXTRACT(QUARTER FROM x) was tried first and returns a 400 (not supported by this ArcGIS server); quarters are summed client-side from the month grain instead. Q3 2026 is quarter-to-date: no WHERE upper bound is needed beyond the general defensive one below, because live GIS data for a month in progress already only contains permits issued so far.",
  "upperBound": "Every ISSUEDATE/OPENEDDATE query is bounded < 2026-08-16 (cutoff+1 day) as a defensive guard against any stray future-dated test rows in the source data.",
  "medianTechnique": "Binary search on counts of (ISSUEDATE - APPLYDATE) <= N -- verified live that this server evaluates direct date subtraction in a WHERE clause. n = panel/service-upgrade permits (layers 85+81) with both dates present in the year. median = smallest N where count(diff<=N) >= ceil(n/2). A small fraction of rows show diff == -1 exactly (verified: never < -1, a same-day midnight-boundary artifact) -- these are real same-day turnarounds, kept in n, and correctly counted at every N>=0 tested. Replicated separately per year (2024, 2025, 2026-to-date); n recorded per year. The neighborhood/report research earlier found ~6 days all-time (n=1,281) with a narrower ad hoc WHERE/date-window; this run's per-year n values are independently computed and not expected to sum to 1,281.",
  "wardTechnique": "WARD is a plain attribute on layers 85 and 81 (verified live -- values are 'Ward 1'..'Ward 6', a blank string, or 'Outside City'; no join/geometry needed). groupByFieldsForStatistics=WARD, summed across res+com layers per category. Blank WARD -> 'unassigned'; 'Outside City' and any other non-numeric value -> 'other'.",
  "solarVerification": "WORKCLASS values matching '%SOLAR%' since 2022-01-01 on layer 85: {'Residential Solar App': 1353, 'Residential Solar Permit': 1871}. 'Residential Solar Permit' (the value this script and the neighborhood script both filter on) is confirmed distinct from 'Residential Solar App' (application-stage records, not permits -- excluded).",
  "categoryOverlapCaveat": "Categories are NOT mutually exclusive by design, per the task's WHERE specs: 'switchgear' shares the '%SERVICE UPGRADE%' phrase with 'panel', and 'ti' shares '%TENANT IMPROVEMENT%' with 'remodel'. Do not sum categories expecting them to add up to `total`.",
  "caveats": [
   "GIS permit layers (85/81/102) are ~2022+ only, owner-verified elsewhere in this repo; older permits live only in PRO (pro.tucsonaz.gov) and are out of scope for this report.",
   "EV is an explicit-language floor (DESCRIPTION mentions 'EV CHARG'/'ELECTRIC VEHICLE'/'EVSE') -- undercounts EV circuits folded into a panel/remodel permit with no EV-specific wording.",
   "Every category is a DESCRIPTION LIKE text match, not a coded field (except solar/WARD) -- subject to the same false-positive/false-negative risk as the neighborhood dataset.",
   "'Quarter to date' (Q3 2026) means data as of the `cutoff` date above, not a full quarter; do not compare its raw count to a full prior quarter without noting that.",
   "Umbrella permits: per this repo's other verified finding, some solar permits also carry panel-upgrade language -- see solarWithUpgrade below for the measured overlap by year."
  ],
  "requestCount": 106,
  "elapsedSeconds": 43.2,
  "cityWideComparison": "Matches neighborhoods.json cityWide exactly: {'total': 20630, 'panel': 1908, 'hvac': 1169, 'solar': 1871}."
 },
 "quarters": [
  {
   "q": "2022-Q1",
   "from": "2022-01-01",
   "to": "2022-03-31",
   "partial": false,
   "total": 338,
   "panel": 23,
   "hvac": 4,
   "solar": 11,
   "ev": 1,
   "remodel": 46,
   "ti": 6,
   "switchgear": 1,
   "codeElectrical": 8
  },
  {
   "q": "2022-Q2",
   "from": "2022-04-01",
   "to": "2022-06-30",
   "partial": false,
   "total": 733,
   "panel": 89,
   "hvac": 20,
   "solar": 52,
   "ev": 0,
   "remodel": 62,
   "ti": 6,
   "switchgear": 4,
   "codeElectrical": 13
  },
  {
   "q": "2022-Q3",
   "from": "2022-07-01",
   "to": "2022-09-30",
   "partial": false,
   "total": 999,
   "panel": 138,
   "hvac": 20,
   "solar": 243,
   "ev": 2,
   "remodel": 42,
   "ti": 1,
   "switchgear": 4,
   "codeElectrical": 19
  },
  {
   "q": "2022-Q4",
   "from": "2022-10-01",
   "to": "2022-12-31",
   "partial": false,
   "total": 1220,
   "panel": 145,
   "hvac": 17,
   "solar": 234,
   "ev": 2,
   "remodel": 44,
   "ti": 6,
   "switchgear": 2,
   "codeElectrical": 91
  },
  {
   "q": "2023-Q1",
   "from": "2023-01-01",
   "to": "2023-03-31",
   "partial": false,
   "total": 1423,
   "panel": 134,
   "hvac": 30,
   "solar": 291,
   "ev": 1,
   "remodel": 43,
   "ti": 5,
   "switchgear": 4,
   "codeElectrical": 66
  },
  {
   "q": "2023-Q2",
   "from": "2023-04-01",
   "to": "2023-06-30",
   "partial": false,
   "total": 1364,
   "panel": 135,
   "hvac": 93,
   "solar": 210,
   "ev": 3,
   "remodel": 70,
   "ti": 7,
   "switchgear": 2,
   "codeElectrical": 85
  },
  {
   "q": "2023-Q3",
   "from": "2023-07-01",
   "to": "2023-09-30",
   "partial": false,
   "total": 1244,
   "panel": 125,
   "hvac": 91,
   "solar": 72,
   "ev": 7,
   "remodel": 47,
   "ti": 6,
   "switchgear": 4,
   "codeElectrical": 48
  },
  {
   "q": "2023-Q4",
   "from": "2023-10-01",
   "to": "2023-12-31",
   "partial": false,
   "total": 1117,
   "panel": 116,
   "hvac": 68,
   "solar": 49,
   "ev": 6,
   "remodel": 44,
   "ti": 2,
   "switchgear": 20,
   "codeElectrical": 33
  },
  {
   "q": "2024-Q1",
   "from": "2024-01-01",
   "to": "2024-03-31",
   "partial": false,
   "total": 1135,
   "panel": 110,
   "hvac": 50,
   "solar": 27,
   "ev": 7,
   "remodel": 59,
   "ti": 2,
   "switchgear": 2,
   "codeElectrical": 47
  },
  {
   "q": "2024-Q2",
   "from": "2024-04-01",
   "to": "2024-06-30",
   "partial": false,
   "total": 1201,
   "panel": 123,
   "hvac": 96,
   "solar": 51,
   "ev": 1,
   "remodel": 67,
   "ti": 8,
   "switchgear": 24,
   "codeElectrical": 45
  },
  {
   "q": "2024-Q3",
   "from": "2024-07-01",
   "to": "2024-09-30",
   "partial": false,
   "total": 954,
   "panel": 95,
   "hvac": 56,
   "solar": 46,
   "ev": 5,
   "remodel": 86,
   "ti": 9,
   "switchgear": 12,
   "codeElectrical": 46
  },
  {
   "q": "2024-Q4",
   "from": "2024-10-01",
   "to": "2024-12-31",
   "partial": false,
   "total": 665,
   "panel": 43,
   "hvac": 45,
   "solar": 62,
   "ev": 2,
   "remodel": 55,
   "ti": 4,
   "switchgear": 1,
   "codeElectrical": 22
  },
  {
   "q": "2025-Q1",
   "from": "2025-01-01",
   "to": "2025-03-31",
   "partial": false,
   "total": 780,
   "panel": 76,
   "hvac": 43,
   "solar": 66,
   "ev": 8,
   "remodel": 89,
   "ti": 4,
   "switchgear": 6,
   "codeElectrical": 47
  },
  {
   "q": "2025-Q2",
   "from": "2025-04-01",
   "to": "2025-06-30",
   "partial": false,
   "total": 1037,
   "panel": 85,
   "hvac": 75,
   "solar": 55,
   "ev": 6,
   "remodel": 87,
   "ti": 4,
   "switchgear": 5,
   "codeElectrical": 32
  },
  {
   "q": "2025-Q3",
   "from": "2025-07-01",
   "to": "2025-09-30",
   "partial": false,
   "total": 1364,
   "panel": 152,
   "hvac": 129,
   "solar": 82,
   "ev": 15,
   "remodel": 95,
   "ti": 8,
   "switchgear": 4,
   "codeElectrical": 40
  },
  {
   "q": "2025-Q4",
   "from": "2025-10-01",
   "to": "2025-12-31",
   "partial": false,
   "total": 1537,
   "panel": 117,
   "hvac": 69,
   "solar": 133,
   "ev": 11,
   "remodel": 113,
   "ti": 5,
   "switchgear": 8,
   "codeElectrical": 34
  },
  {
   "q": "2026-Q1",
   "from": "2026-01-01",
   "to": "2026-03-31",
   "partial": false,
   "total": 1128,
   "panel": 60,
   "hvac": 72,
   "solar": 42,
   "ev": 4,
   "remodel": 129,
   "ti": 12,
   "switchgear": 0,
   "codeElectrical": 37
  },
  {
   "q": "2026-Q2",
   "from": "2026-04-01",
   "to": "2026-06-30",
   "partial": false,
   "total": 1522,
   "panel": 92,
   "hvac": 133,
   "solar": 80,
   "ev": 7,
   "remodel": 194,
   "ti": 26,
   "switchgear": 10,
   "codeElectrical": 52
  },
  {
   "q": "2026-Q3",
   "from": "2026-07-01",
   "to": "2026-08-15",
   "partial": true,
   "total": 869,
   "panel": 50,
   "hvac": 58,
   "solar": 65,
   "ev": 5,
   "remodel": 61,
   "ti": 9,
   "switchgear": 1,
   "codeElectrical": 28
  }
 ],
 "wards": {
  "trailing12": {
   "from": "2025-08-16",
   "to": "2026-08-15",
   "byWard": {
    "unassigned": {
     "total": 5,
     "panel": 2
    },
    "1": {
     "total": 850,
     "panel": 61,
     "hvac": 44,
     "solar": 54,
     "ev": 5,
     "remodel": 79
    },
    "2": {
     "total": 975,
     "panel": 88,
     "hvac": 68,
     "solar": 81,
     "ev": 13,
     "remodel": 87
    },
    "3": {
     "total": 899,
     "panel": 55,
     "hvac": 67,
     "solar": 33,
     "ev": 3,
     "remodel": 89
    },
    "4": {
     "total": 1052,
     "panel": 53,
     "hvac": 107,
     "solar": 86,
     "ev": 6,
     "remodel": 37
    },
    "5": {
     "total": 831,
     "panel": 50,
     "hvac": 53,
     "solar": 45,
     "ev": 5,
     "remodel": 59
    },
    "6": {
     "total": 1219,
     "panel": 98,
     "hvac": 58,
     "solar": 68,
     "ev": 6,
     "remodel": 200
    },
    "other": {
     "total": 9
    }
   }
  },
  "y2025": {
   "from": "2025-01-01",
   "to": "2025-12-31",
   "byWard": {
    "unassigned": {
     "total": 38,
     "panel": 5,
     "hvac": 2,
     "solar": 1,
     "remodel": 1
    },
    "other": {
     "total": 4
    },
    "1": {
     "total": 651,
     "panel": 63,
     "hvac": 48,
     "solar": 46,
     "ev": 4,
     "remodel": 53
    },
    "2": {
     "total": 809,
     "panel": 76,
     "hvac": 53,
     "solar": 64,
     "ev": 11,
     "remodel": 61
    },
    "3": {
     "total": 806,
     "panel": 57,
     "hvac": 63,
     "solar": 38,
     "ev": 3,
     "remodel": 78
    },
    "4": {
     "total": 874,
     "panel": 65,
     "hvac": 69,
     "solar": 96,
     "ev": 6,
     "remodel": 23
    },
    "5": {
     "total": 633,
     "panel": 70,
     "hvac": 44,
     "solar": 38,
     "ev": 4,
     "remodel": 42
    },
    "6": {
     "total": 903,
     "panel": 94,
     "hvac": 37,
     "solar": 53,
     "ev": 12,
     "remodel": 126
    }
   }
  }
 },
 "medianDays": {
  "2024": {
   "median": 8,
   "n": 371
  },
  "2025": {
   "median": 4,
   "n": 430
  },
  "2026": {
   "median": 5,
   "n": 202
  }
 },
 "solarWithUpgrade": {
  "2022": {
   "solar": 540,
   "withUpgrade": 85,
   "pct": 15.7
  },
  "2023": {
   "solar": 622,
   "withUpgrade": 72,
   "pct": 11.6
  },
  "2024": {
   "solar": 186,
   "withUpgrade": 33,
   "pct": 17.7
  },
  "2025": {
   "solar": 336,
   "withUpgrade": 34,
   "pct": 10.1
  },
  "2026": {
   "solar": 187,
   "withUpgrade": 13,
   "pct": 7.0
  }
 },
 "sameQuarterYoY": {
  "cutoffSlice": {
   "label": "Jul 1 - Aug 15 each year, like-for-like (same cutoff day-of-quarter)",
   "from": "07-01",
   "to": "08-15",
   "2024": {
    "total": 514,
    "panel": 49,
    "hvac": 35,
    "solar": 18,
    "ev": 0,
    "remodel": 37,
    "ti": 1,
    "switchgear": 11,
    "codeElectrical": 26
   },
   "2025": {
    "total": 580,
    "panel": 64,
    "hvac": 64,
    "solar": 35,
    "ev": 4,
    "remodel": 41,
    "ti": 4,
    "switchgear": 2,
    "codeElectrical": 19
   },
   "2026": {
    "total": 869,
    "panel": 50,
    "hvac": 58,
    "solar": 65,
    "ev": 5,
    "remodel": 61,
    "ti": 9,
    "switchgear": 1,
    "codeElectrical": 28
   }
  },
  "fullQuarter": {
   "label": "Full Q3 (Jul 1 - Sep 30). 2026 omitted here -- not over yet, see quarters[-1] for quarter-to-date.",
   "2024": {
    "total": 954,
    "panel": 95,
    "hvac": 56,
    "solar": 46,
    "ev": 5,
    "remodel": 86,
    "ti": 9,
    "switchgear": 12,
    "codeElectrical": 46
   },
   "2025": {
    "total": 1364,
    "panel": 152,
    "hvac": 129,
    "solar": 82,
    "ev": 15,
    "remodel": 95,
    "ti": 8,
    "switchgear": 4,
    "codeElectrical": 40
   }
  }
 },
 "totalsSince2022": {
  "total": 20630,
  "panel": 1908,
  "hvac": 1169,
  "solar": 1871,
  "ev": 93,
  "remodel": 1433,
  "ti": 130,
  "switchgear": 114,
  "codeElectrical": 793
 }
}