From 95e2823a57eab7e128f641599b4a352c4708e7c9 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 02:00:41 -0700 Subject: [PATCH 01/22] Build Overture candidate artifact for exact delta --- .../import-overture-cleaned-usa-20260820.yml | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index c8cafe63..059bf9df 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -1,27 +1,20 @@ -name: Import cleaned Overture USA providers +name: Overture exact-import preparation on: - push: - branches: - - main - - overture-usa-import-20260820-use-this - paths: - - scripts/import-overture-cleaned-usa-20260820.py - - .github/workflows/import-overture-cleaned-usa-20260820.yml pull_request: branches: - main paths: - - scripts/import-overture-cleaned-usa-20260820.py - .github/workflows/import-overture-cleaned-usa-20260820.yml + - scripts/import-overture-cleaned-usa-20260820.py permissions: contents: read jobs: - import-overture-usa: + build-overture-candidate-artifact: runs-on: ubuntu-latest - timeout-minutes: 180 + timeout-minutes: 120 steps: - name: Checkout uses: actions/checkout@v4 @@ -34,12 +27,39 @@ jobs: - name: Install DuckDB run: python -m pip install --disable-pip-version-check duckdb - - name: Extract, clean, and import Overture USA providers - env: - NETWORK_MAP_API_URL: https://network-map-tool-mqib.onrender.com/api/my-clinics/upload - run: python scripts/import-overture-cleaned-usa-20260820.py + - name: Patch historical syntax typo + run: | + python - <<'PY' + from pathlib import Path + p = Path('scripts/import-overture-cleaned-usa-20260820.py') + lines = p.read_text().splitlines() + lines[120] = ' return {norm(p.strip(" \'\\\"")) for p in re.split(r"[,|;]+", s) if p.strip(" \'\\\"")}' + p.write_text('\n'.join(lines) + '\n') + compile(p.read_text(), str(p), 'exec') + PY - - name: Import marker - run: echo "Overture USA import workflow completed" + - name: Build candidate SQLite without Render upload + run: | + python - <<'PY' + import importlib.util + p='scripts/import-overture-cleaned-usa-20260820.py' + spec=importlib.util.spec_from_file_location('overture_import',p) + m=importlib.util.module_from_spec(spec) + spec.loader.exec_module(m) + class ExportComplete(Exception): pass + def stop_after_extract(*args, **kwargs): raise ExportComplete() + m.post_chunk=stop_after_extract + try: + m.main() + except ExportComplete: + pass + PY + test -s overture_cleaned_usa.sqlite -# retrigger after production API-security migration: 2026-08-21T13:44:00-07:00 + - name: Upload candidate SQLite + uses: actions/upload-artifact@v4 + with: + name: overture-candidate-sqlite + path: overture_cleaned_usa.sqlite + compression-level: 9 + retention-days: 2 From affd16e78e7aa7cd8b81728844b7f1121db9e305 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 15:04:32 -0700 Subject: [PATCH 02/22] Stage exact Overture patch part 00 --- tmp/overture-exact-patch/part-00.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tmp/overture-exact-patch/part-00.b64 diff --git a/tmp/overture-exact-patch/part-00.b64 b/tmp/overture-exact-patch/part-00.b64 new file mode 100644 index 00000000..b38fde45 --- /dev/null +++ b/tmp/overture-exact-patch/part-00.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From ce117448faca6e545bd63d8a7160bb689a49b49b Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 15:06:16 -0700 Subject: [PATCH 03/22] Stage exact Overture patch part 01 --- tmp/overture-exact-patch/part-01.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tmp/overture-exact-patch/part-01.b64 diff --git a/tmp/overture-exact-patch/part-01.b64 b/tmp/overture-exact-patch/part-01.b64 new file mode 100644 index 00000000..eb7562f2 --- /dev/null +++ b/tmp/overture-exact-patch/part-01.b64 @@ -0,0 +1 @@ +ZXyjfuRZPeUkVEdGs4D5NRbwygpavYemNU53m7imaH40oLJgyKhsOELYkYdCZFQu0TRnz427gEqtq9IvvV6XBmRpYwxpLUUXljJC7w4JSgptZHLdJEbRmRKRocDW4p90NDXaTEokqIpiP/oPCsN4mRF52EoooIgI1YbzlNl7GBMZnko/sOztWN6e/T58g3vEKUvQgMjE5vZPFdd9JWBKakoir/g/umvINNqEXzsjc0r+ngQFz/r/OMCHbjJnVEYOn5ItH1hEjYKMGxsVaEtYpFV+0htDM76NDwJ2SkmBixyWdKvUbIKe+L6DoEd+vKjVFRFe0VCgR+y6sEC5jzCXJAjpLJehrN3hZkwciayynzICAIuj6FsVEUcslKAxkhYhthCvH8EHdkUZqjWpXgR7TcK0TdFBw0cEtrQwwf2pAv62BHF/e0oVi9pEaUVworij00vzSNmX4aIes2WlT7k3iCtEQcGyFjJlpcrGb0leB3tNerHyC8QHMbenvJXbdaRHMLImMoHvYN+WwwkdclVJ5rBceO4OECbVzldXouJBrZB2tCanplws0i8JH99BTb5X0fxUFNwP1ykwsjlAJIm2rjQ44j9s3p6K0s1CiJ6Pej71LAaD8QEENL9IV4ZYub25ChVn9XhImtlBqoCzza9STTfM/5kwhaJNrK0GaOTjOgILxBATBKps4WtLLJEM470oogBnBdoEV7tNrJKd7NhVlXcxB2fOnhBMiqfUEr9FPFA7FNBll/VOjYoiNJsHXUvBH6vhHZ1LI5qyq9N5nt1vI4nV7ZVFcq0scd85lVYAKLR67KJJRZWNRf9lmFsZLxwWXCNNJ4XdToEiRXQ9M2WvfGRDFZOX3w9Q82nIOmah2K5LW7ubooZNRrvcPiwToJRGVpTZD1zgeiOZQT51nJxJVZQweV5n2XAKRVxegClAypxkXcKnklnjTMiZQjJFiqXPsTv+OJhVUgwwWgFH/r6DDCCb+E/jUzP3TuJOBYveIScdQSzwWT1Xb+lMVL7dFWztiGXnZBOpbPVN6pSSEqAoozpsamlZiGlGBKHqWFYLe3i9kkzaYkRWgVaijmJGC9nJs7fkSWm13E0zfnPGUG3m6hweQCe6wYpL+KaJ+XaQ/M68RHir8IiE3frJAHcnRxpJQQKs9pcLluSX6nxf+iJ/Srm+Qa8n/QYQWYijeDWYSmyNEyO5D10f6Y7O9V2jSDyal9vlJgpcMJo7kbzuQHORLqzSUo6U0J5yCoIvS1SRLKo3Mf0tjqf4s4AKRpqOTX4zOgltIam5VUA8T8GLKjoJ8q41BbNq6B82SKWlTEYO9sPbtLcB2bRFSbaopb+xsYAN17kH2/jsSEKL/Smgum5yHL8Mfbt1QEurOmLRsue0M/XFP+lFx7XfJLRbnqtcxIO9dU1AAo9HLiMWnHpoyh1XUjFBYrPQRL/bryqe1PsVSElFD6FiksHeOJrr3Z9KZ19MCZQoriqeSPIwoz40MUnts55AAY/vx0XeZdsMykl/oxZPsJWM/YjiU5Xz70lou46lr8dgGvfm6NdoEkSwgOOQb2/mhgPqdCOW5ULauo3VJY2zzeXzaK9GIEyvqENBKA+CG8r1fZZO+U0OjhJArh6GQpP4tN3nfUQRuGLVhC65T5DEEBQBLyJyqEtIgHJa7FcsHMUCkmwePUkUqFzykKZSN8YHlezStEw4o5PnLwI3WGcKJyvA2kgOhyvaiUCOOf4RVLLSv0kJn0ZKpYLTDfEZFOeRlE2UvXcOwwPqKaIlZdOyLkFCoFOhUbrlCPUryZomcETuq3PSTf0qm1UuwGJPaU+ilPhNilJVgwA591xEQEK2o215iJCyHmE69MZiOEjYkiha2x0OD+c8+w/RKkc7lRi+iXoLQehOavhqbUnRpdsbWjdC2eVPzN2/HUk2hO8HwMDLFJdQzbLajU38jGoBCYb5q1FYLhk4AkauhynyMOmvxuhaaLQ8z0YJjxzfz5TOEKxbNlHUC0dZtd06e+dapA9svjroHEk3m9edVBOIR05xdZ5GcUFTj+rW8Ei2+4Bzo/xfWUYnk48u8ORqSFGAXZy2yk+8nJKo++wtP6GHChR3bE6Xk7iMm5wosCaIfcpnu0T1v5pxbAxAllGKxRu8SEaypeHLDv4UX2SRQ7d9RURwrJvyb3Kplz6UMtvkOUk0mfZ6gJS7ZKeWD2WX1ELgk8aqDYZlC3OdLDnzoEAGi05U7ifXObemTbx3a0nggdAsnOGTILKqzL+h2k4IuUaBjvA5BFKrdCfq+kHqriwCQA5kxtyteQENZUGBhsiZ575gAr+uPSg4eUHPqj3TXZOb2XrBWeCCfEzhlzIXACofKBNr84gHT+68twYlNCt8k8NNG74dRcasgTrM94Dn3YbUmsNGTZGaoCjkhv8y3O63wpFPTo8zGDJgUFe436/hwENLCI/6EdzwYxZK5VRQE3xPDoMLrWGitXzG5w/tz1NJVa3vpPExR7pn6XnQYD9OaprokO2AkXyb7iAJpBxFIoe+Wn7X20Ts8qU/QdxC+4/1q/mY+B2P9GHkDEdN35JuNRGdRbRx9ZNT+3pFmrAnwKqqDhyt/xkbD4dN9IO0WYL39ouLQcBXeExgrnCz/cafRZDEEBUN8DDyP0dEj5euf/4Gd+8PUXuGiEEPtXzToNjWbsUQsXQI9kCHiexRwhVqCyEUPwDjN0NzquxI7au3pRMWBSDaHESvn6EBdr/nlhErhGTtU0LQrI9tablQn6Eua+51eEgJlPlWakD0iIUvhGaLwkDer/LjHzf6y541Iyq/RkN7kwuxrlNg5pRHo23ykEy8jj+bEi+GKRpIOVxeKUkJkvHIMcpWNC9OvDVh5k+oqHMoxmbLNftR9qxYrkk5mN462fueQ+RZiyHofEo2myQMUgs/KYVi+Hg/rkZtt6stoRSCVy5j3DRjXk6SjC3rrqlTxedl2/TZfU9Iol/4ARcjzyDjhNcASumAlvHubADFcWZo7ofGQ2at475/4eNca2pEe0VGQ2u8324ws/8pM251ZhVtRuyGfCnVYfrkJXEfahLnRDWE75X7YqDcbXmGZY6dQv65rvz9ddpWCHwrTPxHRMa3ih/IZTPfioQP3jdWTPi6cedwTR4RwIXlxTjJQGyKIzxBBcZFBoz1uuQiSsGeOL5sVHs70ZNGYT7FQWycggkN+Feq3OuinsVAELpEfVP/G2XzllD4nctFXIuvzoscIb89nGtPo7ZIJIQiyiApTG27rhkq5eNH6oyqd3O3ey24ZZQN/0Obp4Nl//i5i2WwPJDhtE5irRdBccBXTwm7ruKDmUkrtBb1j/Jl8ta83WjZt0fRtMwo29JYRMm+HxlR5kFJi9eaG8FPHJG/AZEzeU9FnPWccmkWIy7AfhoVRkcul7nYgm7QD4TKp3ckQXSsb/Jp3RTL68NugVnlQfGoUp5yr3fz08lUvT5lTSae3BTAwZJOh9I5Y+/FRL6kLpXkg7vRxNP93vxiRKO6iS6xMrN+UNQOhLZwTmO46VQksHqes91LkPV8QNW52/grUHBbht6g3QK6SrinN75F6eLpYd9woY3dTCeTau+jZZ5UcuJjgp8STFqfLgCrpIaPr+btM9TnRRedqqwfhEvpPecbHxKKQBCpIM47JIZQJsQQFgJMhfZ4T8yT3KR7pt+tYwdDNANpTwCPEPpcSx4Ctw0TaiCxTvOvLxDoNh/+4Q4IZBJzSGeJBzlWzLUBNhEfLTlETHm1vl7UKuvC6VHpMKlJeYCfWbLZiLmYEs1Zl9JE+LwK3P1nR+z+EyVY3kBLLKafhlK0PJzaFVomqrdHzqQ2Ew6T19i/M19cwrlKoJ+g0qggOpbFtKQHLE+bsgZSA9yKF3A9hSlnDki3qSYFXSKaqDBFebMu4ktLlnrG+qGrk6FJXqwfzU9RivLEKHR0yBBLgEkJ6UqDk6L4o1ngSlpOrcB8DENGpikwKi8tSlBQzM9bkknVoef9l7+6WsVSmX/5fUxBkkEEbllZ3z9a+7zAT01IpMI4NZ+zmXddJstFrEeVn11O0soY3Ppjkm8BBUSkoZzyKPDRRDppFJ4Pqk5AmWmFikjJtHhuTbzhL0K1irdmU2pzLfiCY46nSz2cpGEDR70iQXEUh/aET5OofCnBVzbwu39JzzBnR7uPELdhgfLIgYV1QWKzSuSJSkGE4qQzgIcnRzGdRKOOYkpr9U7cDI3fSOomQdylS8S9Zuu1BJSqAu0RQKWA38wQSYoNw5sQ86y2TS2HVsR0RjPunqPSOu9RRvmejknprU8GT6dBv0KxQ6yF4/h6AZETIbO3DI4dTVWfOOKlKp/5b7UlzqTPQJCox3TDTs2b/r/LbUYZSmm0jzV/KRTKlcEH1LyFSIyf3SWWtIyiddQzYHXzT8WFxcTZNCZaJtfOqYH+SwKlObPv4fL84ti35qIYSXaTTiwBH/qUot+vVelSR/SNg3xXDLaD2+OjN24ZTfKwH+7g4PZs2e6GYKDWR3il/YtD5XTRVPcK/6atThGHpveQtqyVs8QQFwZJBVavRh+QKVWqaHvD1QcFhB4pRYSSIDbAhFK5BQqq/BHBQKKDAp/Jis/OotXGaiZILa9oNRvVjLf1DBEPq6dCXZ2IPo9XPto9G02U/jFFyr7HUcqXupkUpgtEjkKsrkexT+6ET20sq+NdGEVnthkrjK3JcGUyEReqKU9BhKbBOmyTgPs0GKBCG0gHhYeRaV9w1mI8C7/0A0t7qiLQI3IP6AlHWgp2ikqni0h2xkgVe8JLfRFek0sQvLcnFzYb07JOy7TK206EsB8UAesXGEhPAlfFUkWbrkzVOwooolNWmlXxn0ZSvLyA1BpMXB9Xvsi6nET2tSXv/etozXxY/tUUr0Mrqrf3eYXy7FNfb0b9M0hUjm35aPq7A21nEG+7NU79iqHgvtGtWVxqRx9GGk/DuMRzn0Ejr0hrEmLxCkqrgZJrNT13PdV3dkCRLEu0rQR8VkacQK595hzOokDCogDm/AvF+CKD+gnQGk8ihWJrP/XH80eEUGXAFEcwilhcEYZ9geaIzEs8BkIsnhmIf4P32KSNZDdqZkLDtD9hRl8IPGKM5dlRTYeDa5UtOeX4mJJlyh+PTEyMa3G6LMbofZTA3jAxQCupjrZ1WOW7kJhrRL4pSQmjKX6SyTyBZJ774ZpvSjW8SqLrHSZ+XaKG7gHJQz+O4TknA4dQ/6UM9LdoRl2x0kOv+G3jUqbMJgBuSFOvYHvlU37jTLIpAMDdTFW6L2o0fQLWM7h+90YBTXutkvqUG+0iwrnoMHioTVW3+RIPz2t698P/iMpBTRyOjQN5anTpktB2Wz1uTiK3YFle6diSO+V3rYNJQsy6nYr743CAaulobDhUTj6jrfk70sEMvvHn79RIQLabCh6Y7HZFffSsH/PBScmE6L+CmVW6jvgC9GX6RweLERjWlU4nq8QQGAAaCRZXSkqeBbVYxsOaUQNNVD8WR2ipLHXlqje7AwXnkZWCQEeiF+wRClIMhglH+1+ST8iy5H9AwWHRfhxaoDVES+W67+koKw3A3yEvjUHuQ7iLyEnNdxPtNie/bvtIQVmyZqmsiShXUSmtNKJwQJyB1WGn8oVdDDx3RyEGQBugeQXQnP1niEGI1NvgTjqaFuqNgCnD4kbjXPSwTv+v+/KsOY6nWUixBtp4R5y5pty6rmPtsUlGWX3DTA6hB4dcPRuf4sU4FyZO6oMmHmMDe+yqSzLi3qRHJbYzrMdiG3DrTGAKLFtAMbUmlML1NkXtTYNJN/VK2oAljxJdOT+EU9a6XxNB4Y7DWLYKPtZoWGj3sTFBs7laalym3ZuxWi1j8p9PrLkk/3GjfwYuY7CoWWFKPr5iOWZZQR8Ga1unozhNzaJqOJoDeBHxbL/ebz1MFpFu2lZdfAGqbr3j2xZM6L+Mq79bVtFecsBg3f1GZb4Lo+oPA5iPdh6TYCRJL5ku9cAm9yl8gEk5ajZCpaUsTXwDz6o6hHxUoVBK+KpK+hc9r1zci7jqhwVG6rqnxyOQCtaXu2fwokPmrpdY3Wzle8zC9BdZRBi/YMYNZV29T6J1O7BHTJ2VVNQ0HYJe2aVVxWp9SB6pLMrC+0sSGKv1uTxeSXCAK/9Dddqe3r3HLTB9RxmupWSurvYzJ75YyoXYToWA2x68sgfEAcBNzlkeRrmGD7rDsbxKusJt2zepTxyXZPwnXloJXMUe5PbETKGpwaXIpekRGEI/VVVN+6LX1Y1Jl0PFx3S4bCtLQr/PU1Ble7uT9TYV5ERskaBIaMZ/Q97PQBePi0NJnDS5ulXI4qHaROMCMUV8sXP2W7nxak3bAxd0VkkAgdE3TvOQME0KVuqyTq6vJeYvg4zlMNx+KZYWTQmD5211Cn3fVeGAGrXlQAG8Zp6efWdDe+QIpo2zSNi6Xyz0OuL5nvikUfRuSkO4EoDrQAhjHfmrEu6KTAWXoBtfHARS0v8xC9nST1GTjfw49vrgScQQGQgqRaRtSGao6p8iYqFjOmB9Az1ACoHTFWWpjViTCY8X84dF771e+uXPfcJuFuuU4wtPTLrZn9FRRw8bIv9MtyFIq7CD06AuMY1yKXHwDFBKB4AaMV1zb+uHKm194C1MzaqlSDf8w7iDLjTbN2xMRL5xdX4QFEcnMQ5IJ25PtYXHQePFb5tkMuqP/VdMGaw7P6uA6JogM4yGpkpAjq7D2fIadMXcOMsRT2NCgL8ZYgR3taoKOc+9xH5Ah7zj1PoQlUINSeuuLGlERYoh3iEm6mBUVgaJ+GxEzodCoNgy91iXWGabFzxHCoian5mwntNSWb576O1OYrBMyKNkGHB6W+Sd8D5Jn6LtbFQULVEMZ2WQ57pGUqZQm6mQQZxlcNBHZDdFGJohQrvMcoW0coPMrEBCtLIfRA1k7toLepzBqOFOg4Ve2CSBCnCMnwP/I+hN06Z1DBG0/2+XwATBThBDgLAVUKJkJLO7wvbSMCFPpJkE5D4ezK9myE983e9CGZHr9ej588AhyynuujZKRqtKcX2PuHQAze7f4XBI+77yPGnW69eG0SEdbQdIbJFoPu35+JLv3Lz0JTtLAY99jguca7CK3cu8xt1F7LY79NXcqDC94pJB9RhBD464ZqFVL9hM494UuyhJXLG6psntLPCi7ahLIe1HRY7EkryOn179/IW8r+ZIBbx/KSCJsON+xBAaA6pf8YRJ5brJiXQeZnHEEoeUScdFaqUJH4GIKdYZIYCf08xHSqnvRm7j/ZByKMuYycBDWp/FM0lYcm9uMLOVN2lPJbjpyqRCCDCaNWyUTyRAI7AV3/5/jPuD+aCvHEQcuBSzfDJAZog5xN1/CkObuMYxfkPQEyQ6+uoNyU38jWEc5x+4INc7xAofKEdBkgAZJD6bfYxEwnHm4Ui3o52yfLdwwOdOb/GxREBDgb/2vUN8TNVQ6gqc4Uusp0RoZ7+l7ClcrrYAIEEAgnMh8iMZon1iEJFYVkG/jYNT92Mek1tqCBtsf0oMnjUxArbBXwFuj9D2lEm4l8SRmssuftpvW/KFa0NynEAACGM2eVS4o/XjR7GefUhN/axCHXNlaflrRqSDhFtoHC4PenWsoEXORVSAAogkGxB8aXn8VZYFRaqPSxSbBaRXcn6emUuqTDyXDVAupJ7h/pNOSfp2SCigjNSRF2yx1J+6RjkWSA2tAaIMiGuFras2yYUGToOXLNwFF2ow5rpPrpTcSFCX3vqlwiYPycB+RkLmSC+3Tf5Se5+PuqZHnCxPibJLWxZCb0KAtFTlLEmOn+kvR1VOcpm5xrncQ+66FXDMZxzWt8Egz4bSQeqH3XGO4kmkNcZMrZ4WSUWBRYIpPhm90Ml0FHJTQXCSxPr2vSVcdNHX3hfSQCumQUkV5xpqB9K6u27VSW2eXhRUTXqw+NpbR3U6RGy9WV6+wQ7xPeDbI1tWQcSBYnYokIAn7ek3+aXsQJ2/9+ihuIaHH/POUJn1QrSXyhA4rFj+TftuHERMTfqJP2lzqI3fP8QQGwKhIjbZSLC8E6lmf0+1agRLxHAlQva72CcAwWVV/ApMoBuDQ3aKszIWdmJ7jXlXRppI06Y5ZOKyrQowCwC96BFKL6hUt96LRMHfFHq5C4hOeae8d3SQ1PJ4Gkma3HNIEYRa7xXpxgQIG5SiW6pBtrZvF0V0c85GHV6Sa6RB/KadzbW0mIgTHv6TJllOaYnxHp6kzTRGIl8nFANLUZi+AhRqKSfkJKUxD+hCMpDsFd1UqhE6MevtoCFMFKGeQ6fFgjL8NjOvSWpK8InC3dDAdGkPPCpKEZhDTbbZwlsg9MEpPwQi+gpH6YWPMy1CzphpQOtIoBBNtacEDkCP+WRyS4wybxlPjbYACaVnO8YkTXe+hIpHKY5EVe7KW/sWyok8yUY/nl6gL9qHlQVR9A9LkkiwlLtXnc0pl3le/A2M3UJNrHsIOXC03IJkgbIml0latcfXeU84ouJq244txEhRoItgsupM78RscNIYeENagOblY9sRIQV3OuZVeE3LuELH2oX9S+h7v839IkCBlisj0ygKcS+AKzobR0JOthtJcZhvBmCGEtlQ/0MwgIauQAHc4gKHFBT1aUjBi2B1ir7Jb8aM31Q2+0vViGQTIz+NZMuVlt0cEEZxmN61iIdBDI2dpRvmjEC3u7/nJPHnotmrIPZSmUzov1CuJExRaEi5LYJ0nUIgnAZc9Yt6VtBnAyDWRpqhgDSiAbBAgcJBggcMT/W1FHi+wnpnXcmzemT8T2uS4929XW/6Ts4nHy3vSoCsN89IVzWbRdf8ovjyStWHbBIdZ1dqnN+BWB5jSwmUFDonSNYG6uIJysR5QKu1VU/ynn8EgfgV608sTm2lpe3XPt2baMQQHAc6jmGETtCrI0lQ9SPAvgp4eKiNSeaNOrnOkbt5wAxzr3VDQmWxYfd+3coJqw0OMR3YSlyBlG9Oz1Sq3w7PjbPiTqSOeHcj+nZt2xA8Tk8xRs6uGBkUW3SCZhs/m88ES7+G3VJ76Rtq0R16xH8YSgu8b4WlqYyD3SDCRSHGS++aIDypB0DcPiK/MZMnRBORtxcxwitEpS3HCBNTQwuX/KQZgzxAgDEJS0keQTy06xQAsAttQjgHTqJ3SGiUAssylP2Vaj5eSPiAQXG5Yp25kh/30UDfG/ZAQXy+bXp4AXPkj0FRHuX1RbmoOGyEI67fR0IAo+hyREepbxMKEgwEuqIY4khMf4QSHaLFffjDRh8NSbZI6ZJhsUR60XrdRwXJ1LNA0LoK50sEibSLEwkVuE1xu7JPfYHEAsZAcMITS7uW5XTdNhWj4FXpfsxGQ+CXbaOxBAM51Vnd20PFToC0l0OVgicQpm/J4UJsSVSdGR2dlIgGrnBM+3tlSL256ReQ0EaH93ImihJ7RaSA1xEx75NTUnUlP+1GSfW4b7Fc5m2dT+bW+wBFcIKGldaRss8BdoTLyntMfIyoiUJ2Se4+eYJAt3pGN4jnZvx7xAPaejYRztpJUJMW2LUIjqvJfWtyphJEFrVeFSwfa71PglJkxN5Jjacq6AALhwgMg9DBTnVDUqvY95IA7wZ4ijnLqb1Hu5m/ryWQ0LDcjIImauRDVpDFfgWY3a6Xjxb3FM9LtaaUmqR1d89JktvrU5ZAua39HkTpsHESlW78JzRDiKz1/zPZGbiVmuFBmVxCeolEnVQWIn3jm9FNAXRB+6KS2FCABy1Qon1m71tPLpA9Q05A4caRuhJcuXFEPp4dCBjX1BAvw5sm/7lBPIcZY5Gk97wLxfhkF/JEXar1gYgyZVhk0PydaaRGIoBdBXGKGmx70sjBR+9NJapS+9ME7boM20icuaVCe53F4HWXuZ1e4mleuf1AwLYFugnzKVZ76B2yvvlIAYDBgM/xXwke6f9HcXBJIoqSQptlpyst88BakzhMgqu53QqhXTwL9Rc1cBdFcZF1JvePO0cdDFmBattIyYsFXNWMZVW0Ecz94LFB2KbN/AgaCQL1FrFkP1dHA7sHiNbJxUMuGEvjexRLLIW78kPbIfN8HyACPrZDaIFp7wnTzEKOJ7qHR5lJ9bU025XUm9TWLBNCm1pL+5vOyZjwt6YJNUhVtj9LPJase1ZomqAARrsjGKZMRLESimoAj/ePW4fNxr1ER47wB3zjU0X4aP/aVFNKPrhXlTNZ9+K/anlgnyNODqzeeB4EfDTncK3hJVJIAIdVZ3k0aRGvcQkPrCFKzI+fV3vp/ThKduGseBJPYKseEsbeBqV9g0SbonNG9o9qHJYZf8l92Zl5x0XHngYMQ6iqu+eHBZ7AGE6UsnO4QuGJORyIHeOEJUFPh1ahNbEhFpmJ3xX3FUpClTsv1FHx6I2iTDYSTVWryWf/Rm5PEpv5q34bSbSc27eiTira155dfshlQLeX0Ybn9qp7/6Fvng1CSNeQpNPXZyfWKKK2Ad7dSHuXgv5p8H7j6aTtGGM1QHi0Ki6HTanLYKYtAoFEQXe+3bdaG7S9k6vVQy9HTD20B46AUKZ5fqywt7UdQR6gqaI06DS29LGt2lCDQVelkZETjFCFsrLE+W32RLyYTL8FdVyzwLlWtAtXTgCeGkQ4HJldv8B74l5GQIe9QN2XMjuY7cXVwWr9T3+uxFZubvzFO8fiTqdgQ0CPxnUCxYTOJcupuRapSjq52iKyUphtQc0UGm95Rv6jEBT7Z+aCAc7AQPgWRK28APMsk5sHkNBrMt77R6yaAhHXhSja1dRiTwY7TKCPaU1MkLWyitbWWtz+Tie8TpZo7a2B/dieYcI2TFurb8wA1aOa4NmXRVEGSK6q59EsWWFUdt4Q6Bi/Sl2u8XH2HrOew+hbmwYXT7q757CTPaVvwuzc60qXQHaoVtwyXKeEGe1mrZRXSH63xDEhjszTJu4lIRefT+u+YHB2oPuKIvalF5CrTEyA5hjRpON1Y+nelvZOp6CX//iT/eBT/Nie6M5HQbG6B7al7ki1xBAeEQ1ueh9DcbDafOQsXIhGGxFfO/VNFruteCI/drgeICuA0/VLl6oYB6aRCH0qxU8hhkkFiq8+bPN+9IMj6AW8/0ENgXxGzxr5egwpvpAbL01tgVNfkET4zlswXvLmAERRpfms8t7N1ugyZ4eHn0tHmbrADSQjuwdLlyLRu0acrL6gJslr5nROA4s9Rk9HkQfQGZQHuNra/naKSt2b3OkodtS38+QkePFORoMI9l4Clx0CUTggpXFP+KDSCKLoT/dkVeMm7kFM5YnyMNzZglnBYrCaRIRJLKqIg8PbzP0Ra59aFCRJj74j846MVQyEbDYXlitProq/d2RIXiZlb8UwcXlCKb6vdqxK89M2dA3a2xJB556Y+yDZAo9TeMdZuk8cv260ec9yb3t6vjc2sUSmmNEtnzNttpt+lh9ovkwfj40Gm7yKse1/9Uaapk5DlneJzmG4V4iDJ+LJSEh1mzMLEHXQYTXwBlP8RaupRhMvZFoB2YmNC2OSS3uBEpAkhnuYiorjg0HFTTa6Jv+8JweK9JCMwiHHSf2FowsV1rQTLdl0oUxOGLl5Oj5PNTRikYK2tt9O4peKEx6H3ouQmA10OHRLFIhbeL/Dsm5Gm6mG0b9Pk69j6byIUT7aqaOwRuBCjYpnkxY0IDANreGdkmBI6bKsaVpkMLfSuqg9BkBK952pxuq/pcXgxJvKO/JJVIt5eqsEJKvDzek/3sdHIKjpUZpgu5Po3MXMcpdLyIaWyVci7co63ndqu0hIoa3w36i9VRQK3/zxqldHD6It9CfAQicy4MEPyg5FR7Wx13mdjdju5gjkwyJH2aRjdSd8Ud/w6+oy5/dKpoDLS8xwCudJ7MZZ6yNDcar9Otdm+n+d7UKMjb9Ai48q10eXocQL7vVzL0pC4b/k0YHoyOYJ84QN87dJX6nNPJ+9Wq6w+S2lR+dLGp9okPs5d54uxBAfAnJwKDZMxIApZ9j4VNSsA6cgsohM16KqR1gp7WFABL8YWBlLkr/MPL62G5u1B0aq7QJN/K6w+C6blUUYCD4d2cpNHoun/UZ9vAz2vcE5k0/duCpQ05SPDdcRS8LZrEXZvUx9iG08w8oWPj5DikgWpNEjOSDsrh0fnTb4EEtyr91mWSmdY9wnSTER4kIlpGoyvVxGkjcrB1+QoUdJu1WOBYfg8wgy69MpDEThlsVNI07j21Uz23AFS00ujFxSATbJH6k0w3U8SUOSnwUMMhexlgQ1qrBaR0BJkzEVBlCjttI2PEIH+E92qnmYCakCY+s3Ay4DiU4fuPsGmoaQHhk5ufhvbUvQuVYQ5FgPgRFEEiW8i0QtqykIbRFRQX5GeEGM40rvl8m/leugToxIY/p/5Emdi1rihrXyaHxbfFVnhkH3vzzyXih3plZipYM2DEkAoXJbRA0/TWNn/qsRp0XLvoW6r6q/o3Rq9ohH+UHAi0NeH3IbIU9wREFGfE4vkHD424ar4wF5aeiFokimsL+nNw1DyA57r+JE7UoksHmShjeNopSDd0v6HUoYvaVGArozsgmG87PWAERNm6Q0YfgsdT2IrDZdH0LThBhZ/KgrTjST11xGnEGPoZ2Z/pAoN1yc8m9bKkG5ltzSnew3eXS5l1dmpk5NjtqMEhuusAPA6ozhSkNOj5IviANpWrfGFG8W/kBChfvtjBCFboPI24T0lUJ9khy45nDSZF3Oo0l16k93oBG8RcY3TsfVFsZo0EJfgqFUqUtQdE7XhbuEYkuNtgL/xzuAPOnbAQ+DNkr5iGuOvsMlp9LfVqdXk0n5oxX8viRGvATgooJkA01hpIHp7HfPoKrjDQ6YxEn8qeZYMfqu/fzrnrSTWkHhovJtc0lcWUfvEPglEU4amLNMq42XLwT1qW4V4kQZmMs979YmA/f+km9pW0Bfivfup4bH9r3EECADnbRfuEXMhv6/0oSczOEEhkPJpEElg2SzQBZISWUSUp6q0EVojn0aLGR2S5oZ+TZPF0u9gpb6TK81Cv4jDKHCKEPKlCG1Zsfg42AkP2HXJUwbhnTBNedokNQoWtlHtk9Tphz7ZEVpFQgqh1YXNUS+jLKQuwhX6QIs/aGDwkrppTKt1Zw8iQwwjyGXNkLotDAogvDjMDw0eNxzM0t5mSfoI/ZwbG84/OBAaUxCqWCbx9YL5kQ6lbR1MkHpoXjkx0Dt3kI/UfSG4Uc3qvirBuVDtaxAkkmNnUyTorZafAIS5h9K1rvsMUyVhdekqxJzDlhLrXPkRTm1Tau4/GHMBFpfqBCzQWWvJSrrjqdIeVuQP/OjQCyx0lKPM5Z7nmiYRxTISLS6/2++OyKt3Wne/F7BSuK0ZJ3sy/IPJ3Z9IsjQQCqIzn/4TmFQD3xz/ZNgR8qEq4DcTY+fin/Vh2VeSuWp3keedhhEmoQWt4DHQH2pUOBlCNDsh47UqChlSXaZ5NpbHvcOW9UtM2VHN4xo7JFYO4CIoFt9CbxDZ5kovvpCFb7rrAyufj9ILIim1nIW0kBJt3h6WM9Me4gLXOKDHNm0ul/aBTVOPpG3JR0DHB9NzmsHmLpKaK0dkH0Uk/5a2cuN8hFOu4OMw6+sWwvt4R01pTRGu666wkebijJq5eDuJBNHZqF4hdtO3Cho9NYfnHJM2oZ4hpPbawL99SSsDONDSogxh+r4jGKRJwObqkMyrUV7vj6InanEECEBfezRoUMYmBCP4RFpY8gF1copzUGmk62ECoZWxJoQEQWLz0NKlAjxCeUQfBkmA/bYtkOsokM08Zm6UbMoDw4wzULwjuFTSbiSF3IwnbnliEJ5qlHIqbgVufUxqHSb9kfNrs7e9/OH0Os3bFYLp0l0pY6NwyMt8Ac+r2RAz0v3q9jQ+rAO4GhGV25iYU5TplpPfZw+lqRJoqw6cka5q+YfLWbJn5VL5Bd0PE5glK7R3r5hMG5Tujckf0K3kwA6dxkOzRZUIffZl0CgnWoK7c8fyJdWLRIp2knHiqMz6P4uOcRdHOvz7UMkn7x/jAscFZvYrZqPTBGCemyHleOfkHDfoMdlQVOfS14OVfa8vniHclJXSdmtQYpjbna4JHl0+6apQrW7ZkQl1jiE2IKzXcpcR82f8Ri+cooeLYX3F8DWRiOBvtTeWfz/hYc1pVI+RtWuAuoaIWXbz4pvUeirSVSdpUXEpo6g/ZmWgzclTMGb50hTz4KLBOm2OdBAOqr7Pwf8DnXtoYIPd5VLq6/lCBpX791PpOV/gwFM2L/C2b4gayX2pULtioBB7ZdSWOnPa7Uip++noupDAppCYwTMCcLjrOSXXjhB25Q9sJnVNN+XsAJs4FtMIINcckrkbjQ3xt3q1XtHvZSk1fXC11iI0DIHBwlH5Y19k5aLpcP42fFdpsRGbp3L8JDwI+ki7FzgQZdJW4cTlOn9nPftaYHZbUGcmMTIWRKbl67xTTNXiEyBs2r9XsM7QE79qtCmDEznvzx6UFxNYHP+Hcpnw0TIqrRNkzR7ORvEECIBCCc3G0qSujJXF6RbNA0CoAuip0IXm1mQWWKeq8wE4sHD7kccgAqFI2nNmYUGZfViz0yFkoPvDhuQ02bc2SNXTtWra8Uta8A7Awe5vJmETxmxHZrgKL97SwvQvHrEROiaU1ePuO6uZBIjACY2SCev16VOpeJN/CXVplcqSxWIzs7xt69ttCdpSFEIRD+q97hf73SEGLzJIY9OAYYxSjmp/UWCLOx/665Kt6XScvRTXVwqPPbUDCtJ0qcejdONT36pPewv9HtPYL5tRoIFXh+aQQZyfK9NpaYjBDd28iLVVAHOaSNFaoO05XKnDatRVRwXtxpGh6aE7neFyXaNWSldfetNGaAL1sb69QH1WhsVG2ZHtatBiAa2WK46XZEb3WJH8LxVMksZVPIhZfk4/SNOt7HyV1TbzfmlaPxBB7NBJLpRzoj+i9GsanMLJtZJXoKtrCmw+qFb5GZW2Ek6thFyjGrVWpNsNZv8QUFlhBqy/1X68VZxueqxE0t8ie7fPTg6mqN5saFIP0EFm8nFj8nw8Zx64GYIwkTerW5r9Ly0cxd7p/KXTkhZnOJBzmhGd4GBdAQZ0UlhpyV7lK2I3fmE0bA0PUvqkEH8+cRQDfOFTW5ZmUS3gLTrnLX5Ne2PqZb2Z0WwjdDJwwkCUQqSEJIFcUlKt83/Yzhyv/d+4l7HRTSU4iPdsV/6vJSa6qlxR7OOMRnGry1wh6/a0rVJ5bML62wo1kbNwzh9k0KmulP0Y/CiMCSVnCqH1UKrrBiwK3y1NrmZ1KEdK0hRpaNYypxgUBSeuohALkiVlpNYlM72fKifPo0xxkAfn/5D/uwGIJasxqkie0cDrp2vJxtOiZu3H5hoPU5nt1FK7Pt04ku/RYARgkYyn+RfoxvHsGTCtJf8NUQFuIQ7/V/J5AvJuOibz0sBvsbi3WxRXM3Rz4NE2kDwpdV2O/talN/SwuRfbUjBphSSK+s0YcDaV6n5iEzVuS9fuz3soA3iefPfHEjdo4BHQRCQZbzj7BvPm0SelOCoJaRKiqrqrOKp2UEalRT93mGulI7snrHuVk45hSfytgMigS36/QXYU0pav1sMXqh2D2PEECMBGXHfT0P/nGGIKaCwfaQtmD9sQQqqNlvO3/zePQXkF0MlQTWU9iQLTe+4CAg+spUVRDmeAjVYoHLtfw1chc3kSkmhzwYyEvffVhD+qrb6QgC+uJDurAN4tRzArTkoRACf8T0Dt2vSsiKKhN28QP6Ypg6uLNQUViVpPW7VQP23cTwFaDCd98yEWKtLA4pfd5lWaALbQ8Txz09B2IDabYVOWhw4R+5FKblNLrzYwgXByofqSYDAw51PxZErhQL1UpyLS6+s0jBE55x2A5hlaPEITr3XhEJLv4Sgi9A9zpS7y9NSbECijcehNzjaeM1QrffOlESdrhBezn1xy29bqLLIt0HKsLpYAukcnedcfKjvVEB6hVwiaO0O0j5se76kpUoAg2lGcULAiI5uLPCcYUypi+gIIdLwktl2BZ/OWE5dnpZMmc0ITEJ+J0uEp0oii+z1mfSm1TCMHMtgY0elqANUMkMVtweN4Z0p80rvthB0cUSP3a+PHRmNDk12sOENHDLy75aUBahgakFYvFpJzKZwKDGV70olTEEMpyN++0eoMf2f1hqY/EzTigvdaUwktI+l+2KNeUGhvOB47qbcjBGu8DIYZETbs5r22HiH1Eyv8jhN10B3i1lPVNe1OsixtMsGvUe4qy5GwO4MDWqygHEcNkytrHsYgAQ2+SG03GI14U46tZBA54Y65tC3U6YgPExGjR6HNrynPzK4IniR3UXMjIRd2GB8Ou3DOuWWO0jkjBJbSILnXMXFV7RppExUiL7z0fMTBKJyw2vgRkCOgmZRnkyhl8hdpOoHSDORc5FcMvkbBXK24edKR7FsIaT0PR64zs8/Ca9Ne66baSUh3xcr0VH32SVIe50oknfDqAGr2+6RFJBCP7RzuElFBgnS4B4EeY9LKoxK1x3HXc2b4Vv9baFOOob7lPXc9kw27YDtUkO+h8cQhwdy+m3k9TertUTQvBeqfxd6J5bo6eYH2EecvkHzYEglJ7TvEMIo0kEQvHLpNsdSo7/y7C2U3kO3vu95unPUWpH08HM1eUOKqnZE8ujPR6T2nTU8aEgFkmPSrfYaUSQBEPbIWknlkHOWfrHqtACOYIghSJaU6Fl8Bi6KWwOqqCpRTbyQluX/JDH2zgS/jucBTCafWUlud/yoiAunona6Qr+pytjXtk6V3SDDzFRnTW6TjA2I4hMjpyJK7MmdRNmVQYQtiIjk3i2XyMqHQjq/I1Ukf8urfjE/ZuTTSaKJP+qBMAeqaDUzys/mQ0CkzYJxCMgXJTeyyxYXRd2YjO7HT6ElJDx/lN9aQLa/W0AwJzuIKkDLYEcFRxSee2DbOKsMKEo4asrMRUK3BzOV/J9+CVKfErZMTTSBX8zJxILxmGLdAFckRlGfkhsmmgXAWW5kuv8TQvSNCM+6nv5OdHi/v3NbRrO59TrZrHpohn5u4o57QdeBZ6/wl1KQAXTd24RPELeSrapGBXOFgoOXb6BOqZvpvLbOIIDIkJXrHeVFuYa8uPq9QUqYlQ9GaoBALYYxVKMim201l7wGaeBC9rRRdCK5/f3Ym5PRHx9Pp4cItyJ0IZbsnDbm/o1BQ66c68d76YJoniZCaA5BLbndA/n7hQ95pVon8cxEUKmpDbchC+UKqWOhKpVOF7KIoim4fGB1rRWmyhlCZ5BVQZRa0P1vsgU3HB9PGJe00pfEreU4teC2N/dLZLfZIYiijgwst3L7SA5Fep0YclI3TmqBw04EBAJG548Lu/LRTr66x1lzXDVAVrJeS0ASv24gyF3nYhtBP6t5kDQoa+YL0oBcN6NK6KtGmU4N6gfJ3CDNSMpMn6uXgqvzoA296NZgLKRGwaL3gIp6Mi+b6qOqMJBE/bciKSiRt+wF7aWnW3NK2pXWUegWfgmj7y8jU65Jga+/MEw3TAGC9Kdw6YxEsr3OvVr8sgQE+spNJr9KwIOuJS5X6A0n+97aP2hBV6ayPWWWzS0p/zXRXCZM16QjWXJZw2anxBAlDwl4s7tGh5/8+tVHWqOlEa5IpuJEm4Ap8xJs5aStF3bKTNJMdZAPvaIf4e7kGTUvK9xEzIM0vS5sxw2eZkdjE010mEtPS1J30JQaXmzYfUEptxkH+q98SBsmT+Bghk/rlefrKaleangtqo3H40MNv8cuEOe/DywuKQFE9UABkM4FqxeN5Gc1TGgSnUFrreOijFRRyqA9CjEGUks+giksw5B1NmBJYzW4mUQNth0QEO+HmRVd7iuoC03ymBC+ibea09dkYW1MNE9JvNRVF1RWE+9xC7YJkk1Kj7zrT3NteTNy96ceHU9vg00u5Z3+s8h0SWG95UZojuRkPmVJ27GHqJdXq04Lnci5ZhsTt+r+2uJCQli7ZODHVHQXhYoCXYDyQGGgQX5GeJ9Y85PRLBpHTbOx3j8XLpXkapVUd4D2QlCGYS+BW+MWP5cwA72SQwy7AX7S5+YzLJqLJbRQQHi+E81AvQev \ No newline at end of file From ed693ffba4d48a7c1c5e1a9452eca3624a9ed401 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 15:08:14 -0700 Subject: [PATCH 04/22] Stage exact Overture patch part 02 --- tmp/overture-exact-patch/part-02.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tmp/overture-exact-patch/part-02.b64 diff --git a/tmp/overture-exact-patch/part-02.b64 b/tmp/overture-exact-patch/part-02.b64 new file mode 100644 index 00000000..85342705 --- /dev/null +++ b/tmp/overture-exact-patch/part-02.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From d811379db7356b62b43f91803ba6f9eba7a5774a Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 15:10:12 -0700 Subject: [PATCH 05/22] Stage exact Overture patch part 03 --- tmp/overture-exact-patch/part-03.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tmp/overture-exact-patch/part-03.b64 diff --git a/tmp/overture-exact-patch/part-03.b64 b/tmp/overture-exact-patch/part-03.b64 new file mode 100644 index 00000000..2c7bdcce --- /dev/null +++ b/tmp/overture-exact-patch/part-03.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From 9e9fa778a5d809994be080b75a92a9fb2955c674 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 15:12:17 -0700 Subject: [PATCH 06/22] Stage exact Overture patch part 04 --- tmp/overture-exact-patch/part-04.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 tmp/overture-exact-patch/part-04.b64 diff --git a/tmp/overture-exact-patch/part-04.b64 b/tmp/overture-exact-patch/part-04.b64 new file mode 100644 index 00000000..d5f7c341 --- /dev/null +++ b/tmp/overture-exact-patch/part-04.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From 9a34b96c43d9d56157fb8bd57612a6aa7eb6550f Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 17:00:40 -0700 Subject: [PATCH 07/22] Inspect exact Overture patch payload --- .../import-overture-cleaned-usa-20260820.yml | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index 059bf9df..5a3cab2d 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -7,6 +7,7 @@ on: paths: - .github/workflows/import-overture-cleaned-usa-20260820.yml - scripts/import-overture-cleaned-usa-20260820.py + - tmp/overture-exact-patch/** permissions: contents: read @@ -24,8 +25,11 @@ jobs: with: python-version: '3.11' - - name: Install DuckDB - run: python -m pip install --disable-pip-version-check duckdb + - name: Install dependencies + run: | + python -m pip install --disable-pip-version-check duckdb + sudo apt-get update -qq + sudo apt-get install --yes -qq zstd - name: Patch historical syntax typo run: | @@ -56,6 +60,21 @@ jobs: PY test -s overture_cleaned_usa.sqlite + - name: Reconstruct and inspect exact patch + run: | + set -euo pipefail + cat tmp/overture-exact-patch/part-*.b64 | base64 --decode > /tmp/overture-exact-patch.zst + zstd --decompress --stdout /tmp/overture-exact-patch.zst > /tmp/overture-exact-patch + echo "patch bytes: $(wc -c < /tmp/overture-exact-patch)" + file /tmp/overture-exact-patch + python - <<'PY' + from pathlib import Path + p=Path('/tmp/overture-exact-patch') + b=p.read_bytes()[:512] + print('patch_prefix_hex=', b[:32].hex()) + print('patch_prefix_text=', b.decode('utf-8','replace')[:400].replace('\n','\\n')) + PY + - name: Upload candidate SQLite uses: actions/upload-artifact@v4 with: From b8c32feb2da4058bfce822a3e7e361a4ac622199 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 18:21:20 -0700 Subject: [PATCH 08/22] Add direct Neon Overture candidate importer --- .../import-overture-candidate-direct-neon.py | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 scripts/import-overture-candidate-direct-neon.py diff --git a/scripts/import-overture-candidate-direct-neon.py b/scripts/import-overture-candidate-direct-neon.py new file mode 100644 index 00000000..9d7a576c --- /dev/null +++ b/scripts/import-overture-candidate-direct-neon.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 +import csv, hashlib, json, math, os, re, sqlite3, subprocess, sys, tempfile + +SQLITE_PATH = sys.argv[1] if len(sys.argv) > 1 else "overture_cleaned_usa.sqlite" +DATABASE_URL = os.environ.get("DATABASE_URL", "") +if not DATABASE_URL.startswith("postgres"): + raise SystemExit("DATABASE_URL is missing") + +VALID_TYPES = { + "urgent_care","occupational_health","dentist","cardiology","public_health","hospital", + "hearing_aid","imaging","concierge_medicine","lab","audiology","ent","family_practice", + "psychiatry","pulmonology","sports_medicine" +} +PLACEHOLDERS = {"nan","null","none","n/a","na","unnamed","unnamed clinic"} + +def txt(v): + return "" if v is None else str(v).strip() + +def norm_name(v): + return re.sub(r"[^a-z0-9]+", " ", txt(v).lower()).strip() + +def js_hash_payload(name, address, city, state, postal, lat, lng): + payload = { + "name": name, + "address": address.lower(), + "city": city.lower(), + "state": state.lower(), + "postal": postal, + "lat": lat, + "lng": lng, + } + raw = json.dumps(payload, separators=(",", ":"), ensure_ascii=False, allow_nan=False) + return "loc:" + hashlib.sha256(raw.encode("utf-8")).hexdigest() + +def valid_coord(lat, lng): + return ( + lat is not None and lng is not None and + math.isfinite(float(lat)) and math.isfinite(float(lng)) and + -90 <= float(lat) <= 90 and -180 <= float(lng) <= 180 and + (float(lat) != 0 or float(lng) != 0) + ) + +con = sqlite3.connect(SQLITE_PATH) +cur = con.execute(""" +SELECT overture_id,name,address,city,state,postal_code,country_code,phone,website,email, + latitude,longitude,confidence,operating_status,primary_provider_type,provider_types,taxonomy +FROM accepted ORDER BY overture_id +""") + +fd, tsv_path = tempfile.mkstemp(prefix="overture_candidate_", suffix=".tsv") +os.close(fd) +exported = skipped = 0 +with open(tsv_path, "w", newline="", encoding="utf-8") as f: + w = csv.writer(f, delimiter="\t", quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator="\n") + for r in cur: + oid,name,address,city,state,postal,country,phone,website,email,lat,lng,confidence,status,primary,types,tax = r + name = txt(name) + nn = norm_name(name) + if not nn or nn in PLACEHOLDERS or not valid_coord(lat, lng): + skipped += 1 + continue + address, city, state, postal = txt(address), txt(city), txt(state).upper(), txt(postal) + country = txt(country).upper() or "US" + primary = txt(primary) + type_list = [] + for t in txt(types).split("|"): + t = t.strip() + if t in VALID_TYPES and t not in type_list: + type_list.append(t) + if primary not in VALID_TYPES: + primary = type_list[0] if type_list else "hospital" + if primary not in type_list: + type_list.insert(0, primary) + master_key = js_hash_payload(nn, address, city, state, postal, float(lat), float(lng)) + w.writerow([ + master_key, txt(oid), name, nn, address, city, state, postal, country, + float(lat), float(lng), txt(phone), txt(website), txt(email).lower(), + float(confidence) if confidence is not None else 0.5, txt(status), primary, + "|".join(type_list), txt(tax) + ]) + exported += 1 +con.close() +print(f"Prepared {exported:,} Overture providers for direct Neon import; skipped {skipped:,}", flush=True) + +sql = r""" +\set ON_ERROR_STOP on +BEGIN; + +INSERT INTO public.provider_source_catalog + (source_key, display_name, source_kind, trust_tier, active, notes) +VALUES + ('overture','Overture Maps','external_directory','directory',true, + 'Overture Maps U.S. healthcare provider import from release 2026-08-19.0') +ON CONFLICT (source_key) DO UPDATE SET + display_name=EXCLUDED.display_name, + source_kind=EXCLUDED.source_kind, + trust_tier=EXCLUDED.trust_tier, + active=true, + notes=EXCLUDED.notes, + updated_at=now(); + +CREATE TEMP TABLE overture_import ( + master_key text NOT NULL, + source_record_id text NOT NULL, + name text NOT NULL, + normalized_name text NOT NULL, + address_line1 text, + city text, + state_region text, + postal_code text, + country_code text, + lat double precision NOT NULL, + lng double precision NOT NULL, + phone text, + website text, + email text, + confidence numeric, + operating_status text, + primary_provider_type text NOT NULL, + provider_types text NOT NULL, + taxonomy text +) ON COMMIT DROP; + +\copy overture_import FROM :'tsv_path' WITH (FORMAT csv, DELIMITER E'\t', QUOTE '"', ENCODING 'UTF8') + +INSERT INTO public.provider_master ( + master_key,name,normalized_name,address_line1,formatted_address,city,state_region,postal_code,country_code, + lat,lng,phone,website,email,primary_provider_type,capability_tags,primary_source_key,quality_score, + active,last_seen_at,updated_at +) +SELECT + i.master_key,i.name,i.normalized_name,NULLIF(i.address_line1,''),NULLIF(i.address_line1,''),NULLIF(i.city,''), + NULLIF(i.state_region,''),NULLIF(i.postal_code,''),COALESCE(NULLIF(i.country_code,''),'US'),i.lat,i.lng, + NULLIF(i.phone,''),NULLIF(i.website,''),NULLIF(i.email,''),i.primary_provider_type, + string_to_array(i.provider_types,'|'),'overture',COALESCE(i.confidence,0.5),true,now(),now() +FROM overture_import i +ON CONFLICT (master_key) DO UPDATE SET + name=CASE WHEN NULLIF(btrim(provider_master.name),'') IS NULL THEN EXCLUDED.name ELSE provider_master.name END, + normalized_name=CASE WHEN NULLIF(btrim(provider_master.normalized_name),'') IS NULL THEN EXCLUDED.normalized_name ELSE provider_master.normalized_name END, + address_line1=COALESCE(NULLIF(provider_master.address_line1,''),EXCLUDED.address_line1), + formatted_address=COALESCE(NULLIF(provider_master.formatted_address,''),EXCLUDED.formatted_address), + city=COALESCE(NULLIF(provider_master.city,''),EXCLUDED.city), + state_region=COALESCE(NULLIF(provider_master.state_region,''),EXCLUDED.state_region), + postal_code=COALESCE(NULLIF(provider_master.postal_code,''),EXCLUDED.postal_code), + country_code=COALESCE(NULLIF(provider_master.country_code,''),EXCLUDED.country_code), + lat=COALESCE(provider_master.lat,EXCLUDED.lat), + lng=COALESCE(provider_master.lng,EXCLUDED.lng), + phone=COALESCE(NULLIF(provider_master.phone,''),EXCLUDED.phone), + website=COALESCE(NULLIF(provider_master.website,''),EXCLUDED.website), + email=COALESCE(NULLIF(provider_master.email,''),EXCLUDED.email), + primary_provider_type=CASE WHEN provider_master.primary_provider_type IS NULL OR provider_master.primary_provider_type IN ('','unknown') THEN EXCLUDED.primary_provider_type ELSE provider_master.primary_provider_type END, + capability_tags=ARRAY( + SELECT DISTINCT v FROM unnest(COALESCE(provider_master.capability_tags,ARRAY[]::text[]) || COALESCE(EXCLUDED.capability_tags,ARRAY[]::text[])) v + WHERE v IS NOT NULL AND v <> '' + ), + primary_source_key=COALESCE(NULLIF(provider_master.primary_source_key,''),'overture'), + quality_score=GREATEST(COALESCE(provider_master.quality_score,0),COALESCE(EXCLUDED.quality_score,0)), + active=true,last_seen_at=now(),updated_at=now(); + +INSERT INTO public.provider_master_types (master_provider_id,type_key,source_key,confidence_score) +SELECT DISTINCT pm.id,t.type_key,'overture',COALESCE(i.confidence,0.5) +FROM overture_import i +JOIN public.provider_master pm ON pm.master_key=i.master_key +CROSS JOIN LATERAL regexp_split_to_table(i.provider_types,'\|') AS t(type_key) +WHERE t.type_key <> '' +ON CONFLICT (master_provider_id,type_key) DO UPDATE SET + confidence_score=GREATEST(COALESCE(provider_master_types.confidence_score,0),COALESCE(EXCLUDED.confidence_score,0)); + +INSERT INTO public.provider_master_sources ( + master_provider_id,source_key,source_record_id,source_url,source_confidence_score,raw_payload,updated_at +) +SELECT + pm.id,'overture',i.source_record_id,NULLIF(i.website,''),COALESCE(i.confidence,0.5), + jsonb_build_object( + 'source','Overture Maps','source_key','overture','source_record_id',i.source_record_id, + 'name',i.name,'address',i.address_line1,'city',i.city,'state',i.state_region,'postal_code',i.postal_code, + 'country_code',i.country_code,'phone',i.phone,'website',i.website,'email',i.email,'latitude',i.lat,'longitude',i.lng, + 'confidence',i.confidence,'operating_status',i.operating_status,'primary_provider_type',i.primary_provider_type, + 'provider_types',i.provider_types,'taxonomy',i.taxonomy + ),now() +FROM overture_import i +JOIN public.provider_master pm ON pm.master_key=i.master_key +ON CONFLICT (source_key,source_record_id) WHERE source_record_id IS NOT NULL DO UPDATE SET + master_provider_id=EXCLUDED.master_provider_id, + source_url=COALESCE(EXCLUDED.source_url,provider_master_sources.source_url), + source_confidence_score=GREATEST(COALESCE(provider_master_sources.source_confidence_score,0),COALESCE(EXCLUDED.source_confidence_score,0)), + raw_payload=EXCLUDED.raw_payload, + updated_at=now(); + +COMMIT; +""" + +sql_fd, sql_path = tempfile.mkstemp(prefix="overture_direct_", suffix=".sql") +os.close(sql_fd) +with open(sql_path, "w", encoding="utf-8") as f: + f.write(sql) + +subprocess.run([ + "psql", DATABASE_URL, "-v", "ON_ERROR_STOP=1", "-v", f"tsv_path={tsv_path}", "-f", sql_path +], check=True) + +checks = { + "overture_source_relationships": "SELECT count(*) FROM public.provider_master_sources WHERE source_key='overture'", + "overture_distinct_providers": "SELECT count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture'", + "overture_type_relationships": "SELECT count(*) FROM public.provider_master_types pmt JOIN (SELECT DISTINCT master_provider_id FROM public.provider_master_sources WHERE source_key='overture') s USING (master_provider_id)", + "overture_map_visible": "SELECT count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture'", +} +for label, query in checks.items(): + result = subprocess.check_output(["psql", DATABASE_URL, "-Atqc", query], text=True).strip() + print(f"{label}={result}", flush=True) From 6114e90bdeb21bbcca6e93c7d1003ec9f9ca3ebe Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 18:21:36 -0700 Subject: [PATCH 09/22] Run available Overture candidate directly into Neon --- .../import-overture-cleaned-usa-20260820.yml | 100 +++++++----------- 1 file changed, 40 insertions(+), 60 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index 5a3cab2d..7ca93b34 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -1,84 +1,64 @@ -name: Overture exact-import preparation +name: Import Overture candidate directly to Neon on: - pull_request: + push: branches: - - main + - overture-exact-import-20260830 paths: - .github/workflows/import-overture-cleaned-usa-20260820.yml - - scripts/import-overture-cleaned-usa-20260820.py - - tmp/overture-exact-patch/** + - scripts/import-overture-candidate-direct-neon.py permissions: contents: read + actions: read + +concurrency: + group: overture-direct-neon-import-20260830 + cancel-in-progress: false jobs: - build-overture-candidate-artifact: + import-overture-candidate: runs-on: ubuntu-latest - timeout-minutes: 120 + timeout-minutes: 90 + env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + steps: - name: Checkout uses: actions/checkout@v4 + with: + persist-credentials: false - - name: Set up Python - uses: actions/setup-python@v5 + - name: Download completed Overture candidate artifact + uses: actions/download-artifact@v4 with: - python-version: '3.11' + name: overture-candidate-sqlite + path: /tmp/overture-candidate + github-token: ${{ github.token }} + repository: ${{ github.repository }} + run-id: 33302987142 - - name: Install dependencies + - name: Install PostgreSQL client + shell: bash run: | - python -m pip install --disable-pip-version-check duckdb + set -euo pipefail sudo apt-get update -qq - sudo apt-get install --yes -qq zstd + sudo apt-get install --yes -qq postgresql-client + test -s /tmp/overture-candidate/overture_cleaned_usa.sqlite - - name: Patch historical syntax typo + - name: Import available Overture candidate rows directly to production Neon + shell: bash run: | - python - <<'PY' - from pathlib import Path - p = Path('scripts/import-overture-cleaned-usa-20260820.py') - lines = p.read_text().splitlines() - lines[120] = ' return {norm(p.strip(" \'\\\"")) for p in re.split(r"[,|;]+", s) if p.strip(" \'\\\"")}' - p.write_text('\n'.join(lines) + '\n') - compile(p.read_text(), str(p), 'exec') - PY - - - name: Build candidate SQLite without Render upload - run: | - python - <<'PY' - import importlib.util - p='scripts/import-overture-cleaned-usa-20260820.py' - spec=importlib.util.spec_from_file_location('overture_import',p) - m=importlib.util.module_from_spec(spec) - spec.loader.exec_module(m) - class ExportComplete(Exception): pass - def stop_after_extract(*args, **kwargs): raise ExportComplete() - m.post_chunk=stop_after_extract - try: - m.main() - except ExportComplete: - pass - PY - test -s overture_cleaned_usa.sqlite + set -euo pipefail + [[ "$DATABASE_URL" == postgres* ]] || { echo 'DATABASE_URL secret is missing' >&2; exit 1; } + echo "::add-mask::$DATABASE_URL" + python scripts/import-overture-candidate-direct-neon.py /tmp/overture-candidate/overture_cleaned_usa.sqlite - - name: Reconstruct and inspect exact patch + - name: Final production verification + shell: bash run: | set -euo pipefail - cat tmp/overture-exact-patch/part-*.b64 | base64 --decode > /tmp/overture-exact-patch.zst - zstd --decompress --stdout /tmp/overture-exact-patch.zst > /tmp/overture-exact-patch - echo "patch bytes: $(wc -c < /tmp/overture-exact-patch)" - file /tmp/overture-exact-patch - python - <<'PY' - from pathlib import Path - p=Path('/tmp/overture-exact-patch') - b=p.read_bytes()[:512] - print('patch_prefix_hex=', b[:32].hex()) - print('patch_prefix_text=', b.decode('utf-8','replace')[:400].replace('\n','\\n')) - PY - - - name: Upload candidate SQLite - uses: actions/upload-artifact@v4 - with: - name: overture-candidate-sqlite - path: overture_cleaned_usa.sqlite - compression-level: 9 - retention-days: 2 + echo "::add-mask::$DATABASE_URL" + psql "$DATABASE_URL" -Atqc "SELECT 'source_rows='||count(*) FROM public.provider_master_sources WHERE source_key='overture';" + psql "$DATABASE_URL" -Atqc "SELECT 'providers='||count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';" + psql "$DATABASE_URL" -Atqc "SELECT 'map_visible='||count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';" From adbd94e27a7ac294022c713d8a8e13813f0a13fb Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 18:22:46 -0700 Subject: [PATCH 10/22] Fix direct Overture import file copy --- .../import-overture-cleaned-usa-20260820.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index 7ca93b34..20794969 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -46,6 +46,18 @@ jobs: sudo apt-get install --yes -qq postgresql-client test -s /tmp/overture-candidate/overture_cleaned_usa.sqlite + - name: Fix local TSV path for psql copy + shell: bash + run: | + python - <<'PY' + from pathlib import Path + p=Path('scripts/import-overture-candidate-direct-neon.py') + s=p.read_text() + s=s.replace('fd, tsv_path = tempfile.mkstemp(prefix="overture_candidate_", suffix=".tsv")\nos.close(fd)', 'tsv_path = "/tmp/overture_candidate.tsv"') + s=s.replace("\\copy overture_import FROM :'tsv_path'", "\\copy overture_import FROM '/tmp/overture_candidate.tsv'") + p.write_text(s) + PY + - name: Import available Overture candidate rows directly to production Neon shell: bash run: | From ea3a6b40ac7427cdc75c3d4bb5fd1530d5aaf658 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 18:47:19 -0700 Subject: [PATCH 11/22] Route Overture import to OVERPASS_DATABASE_URL --- .../import-overture-cleaned-usa-20260820.yml | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index 20794969..c6d5b027 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -1,4 +1,4 @@ -name: Import Overture candidate directly to Neon +name: Import Overture candidate to OVERPASS Neon on: push: @@ -13,7 +13,7 @@ permissions: actions: read concurrency: - group: overture-direct-neon-import-20260830 + group: overture-overpass-neon-import-20260830 cancel-in-progress: false jobs: @@ -21,7 +21,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 90 env: - DATABASE_URL: ${{ secrets.DATABASE_URL }} + SOURCE_DATABASE_URL: ${{ secrets.DATABASE_URL }} + OVERPASS_DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL }} steps: - name: Checkout @@ -46,6 +47,27 @@ jobs: sudo apt-get install --yes -qq postgresql-client test -s /tmp/overture-candidate/overture_cleaned_usa.sqlite + - name: Validate OVERPASS connection and initialize provider schema + shell: bash + run: | + set -euo pipefail + [[ "$SOURCE_DATABASE_URL" == postgres* ]] || { echo 'DATABASE_URL secret is missing' >&2; exit 1; } + [[ "$OVERPASS_DATABASE_URL" == postgres* ]] || { echo 'OVERPASS_DATABASE_URL secret is missing' >&2; exit 1; } + echo "::add-mask::$SOURCE_DATABASE_URL" + echo "::add-mask::$OVERPASS_DATABASE_URL" + + if ! psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT to_regclass('public.provider_master') IS NOT NULL" | grep -qx t; then + echo 'Initializing empty OVERPASS provider schema from primary database' + pg_dump "$SOURCE_DATABASE_URL" --schema-only --no-owner --no-privileges --file=/tmp/provider-schema.sql + psql "$OVERPASS_DATABASE_URL" -v ON_ERROR_STOP=1 -f /tmp/provider-schema.sql + for table in provider_schema_state schema_migration_versions provider_type_catalog; do + if psql "$SOURCE_DATABASE_URL" -Atqc "SELECT to_regclass('public.${table}') IS NOT NULL" | grep -qx t; then + pg_dump "$SOURCE_DATABASE_URL" --data-only --inserts --no-owner --no-privileges --table="public.${table}" \ + | psql "$OVERPASS_DATABASE_URL" -v ON_ERROR_STOP=1 + fi + done + fi + - name: Fix local TSV path for psql copy shell: bash run: | @@ -58,19 +80,22 @@ jobs: p.write_text(s) PY - - name: Import available Overture candidate rows directly to production Neon + - name: Import available Overture candidate rows to OVERPASS Neon shell: bash + env: + DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL }} run: | set -euo pipefail - [[ "$DATABASE_URL" == postgres* ]] || { echo 'DATABASE_URL secret is missing' >&2; exit 1; } + [[ "$DATABASE_URL" == postgres* ]] || { echo 'OVERPASS_DATABASE_URL secret is missing' >&2; exit 1; } echo "::add-mask::$DATABASE_URL" python scripts/import-overture-candidate-direct-neon.py /tmp/overture-candidate/overture_cleaned_usa.sqlite - - name: Final production verification + - name: Final OVERPASS verification shell: bash run: | set -euo pipefail - echo "::add-mask::$DATABASE_URL" - psql "$DATABASE_URL" -Atqc "SELECT 'source_rows='||count(*) FROM public.provider_master_sources WHERE source_key='overture';" - psql "$DATABASE_URL" -Atqc "SELECT 'providers='||count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';" - psql "$DATABASE_URL" -Atqc "SELECT 'map_visible='||count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';" + echo "::add-mask::$OVERPASS_DATABASE_URL" + psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'source_rows='||count(*) FROM public.provider_master_sources WHERE source_key='overture';" + psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'providers='||count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';" + psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'map_visible='||count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';" + psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'db_size='||pg_size_pretty(pg_database_size(current_database()));" From d4faf4d3e19ce0eec2535170e677d3dc460c61e9 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 18:51:33 -0700 Subject: [PATCH 12/22] Declare OVERPASS_DATABASE_URL for runtime wiring --- render.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/render.yaml b/render.yaml index 85dea583..9ee55f46 100644 --- a/render.yaml +++ b/render.yaml @@ -17,6 +17,8 @@ services: sync: false - key: DATABASE_URL_POOLED sync: false + - key: OVERPASS_DATABASE_URL + sync: false - key: WRITE_API_TOKEN sync: false - key: PGPOOL_MAX From b55d8ca975e361458e1d599373205d94b2fb6ba5 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 19:54:15 -0700 Subject: [PATCH 13/22] Run Overture import against OVERPASS Neon --- .github/workflows/import-overture-cleaned-usa-20260820.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index c6d5b027..6f6eddf1 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -99,3 +99,5 @@ jobs: psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'providers='||count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';" psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'map_visible='||count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';" psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'db_size='||pg_size_pretty(pg_database_size(current_database()));" + +# Triggered after OVERPASS_DATABASE_URL secret was added on 2026-08-30. From 995d0afb0b3241f363dc13d7b3ce6a142515831c Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 19:58:42 -0700 Subject: [PATCH 14/22] Use PostgreSQL 18 client for OVERPASS import --- .../import-overture-cleaned-usa-20260820.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index 6f6eddf1..f7432142 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -39,12 +39,20 @@ jobs: repository: ${{ github.repository }} run-id: 33302987142 - - name: Install PostgreSQL client + - name: Install PostgreSQL 18 client shell: bash run: | set -euo pipefail + sudo install -d -m 0755 /usr/share/postgresql-common/pgdg + curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \ + | sudo gpg --dearmor --yes -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg + . /etc/os-release + echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg] https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" \ + | sudo tee /etc/apt/sources.list.d/pgdg.list >/dev/null sudo apt-get update -qq - sudo apt-get install --yes -qq postgresql-client + sudo apt-get install --yes -qq postgresql-client-18 + echo "/usr/lib/postgresql/18/bin" >> "$GITHUB_PATH" + /usr/lib/postgresql/18/bin/pg_dump --version test -s /tmp/overture-candidate/overture_cleaned_usa.sqlite - name: Validate OVERPASS connection and initialize provider schema @@ -100,4 +108,4 @@ jobs: psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'map_visible='||count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';" psql "$OVERPASS_DATABASE_URL" -Atqc "SELECT 'db_size='||pg_size_pretty(pg_database_size(current_database()));" -# Triggered after OVERPASS_DATABASE_URL secret was added on 2026-08-30. +# PostgreSQL 18 client required because the source Neon database runs PostgreSQL 18. From 89c94391c2a24de0d240e882e2be69156c4105b7 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 20:02:38 -0700 Subject: [PATCH 15/22] Deduplicate canonical Overture upserts --- .../import-overture-candidate-direct-neon.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/scripts/import-overture-candidate-direct-neon.py b/scripts/import-overture-candidate-direct-neon.py index 9d7a576c..18cfefe4 100644 --- a/scripts/import-overture-candidate-direct-neon.py +++ b/scripts/import-overture-candidate-direct-neon.py @@ -123,6 +123,17 @@ def valid_coord(lat, lng): \copy overture_import FROM :'tsv_path' WITH (FORMAT csv, DELIMITER E'\t', QUOTE '"', ENCODING 'UTF8') +WITH canonical AS ( + SELECT DISTINCT ON (i.master_key) i.* + FROM overture_import i + ORDER BY i.master_key, COALESCE(i.confidence,0.5) DESC, i.source_record_id +), type_union AS ( + SELECT i.master_key, + array_agg(DISTINCT t.type_key ORDER BY t.type_key) FILTER (WHERE t.type_key <> '') AS capability_tags + FROM overture_import i + CROSS JOIN LATERAL regexp_split_to_table(i.provider_types,'\|') AS t(type_key) + GROUP BY i.master_key +) INSERT INTO public.provider_master ( master_key,name,normalized_name,address_line1,formatted_address,city,state_region,postal_code,country_code, lat,lng,phone,website,email,primary_provider_type,capability_tags,primary_source_key,quality_score, @@ -132,8 +143,9 @@ def valid_coord(lat, lng): i.master_key,i.name,i.normalized_name,NULLIF(i.address_line1,''),NULLIF(i.address_line1,''),NULLIF(i.city,''), NULLIF(i.state_region,''),NULLIF(i.postal_code,''),COALESCE(NULLIF(i.country_code,''),'US'),i.lat,i.lng, NULLIF(i.phone,''),NULLIF(i.website,''),NULLIF(i.email,''),i.primary_provider_type, - string_to_array(i.provider_types,'|'),'overture',COALESCE(i.confidence,0.5),true,now(),now() -FROM overture_import i + COALESCE(tu.capability_tags,ARRAY[i.primary_provider_type]::text[]),'overture',COALESCE(i.confidence,0.5),true,now(),now() +FROM canonical i +LEFT JOIN type_union tu ON tu.master_key=i.master_key ON CONFLICT (master_key) DO UPDATE SET name=CASE WHEN NULLIF(btrim(provider_master.name),'') IS NULL THEN EXCLUDED.name ELSE provider_master.name END, normalized_name=CASE WHEN NULLIF(btrim(provider_master.normalized_name),'') IS NULL THEN EXCLUDED.normalized_name ELSE provider_master.normalized_name END, @@ -158,14 +170,20 @@ def valid_coord(lat, lng): active=true,last_seen_at=now(),updated_at=now(); INSERT INTO public.provider_master_types (master_provider_id,type_key,source_key,confidence_score) -SELECT DISTINCT pm.id,t.type_key,'overture',COALESCE(i.confidence,0.5) +SELECT pm.id,t.type_key,'overture',MAX(COALESCE(i.confidence,0.5)) FROM overture_import i JOIN public.provider_master pm ON pm.master_key=i.master_key CROSS JOIN LATERAL regexp_split_to_table(i.provider_types,'\|') AS t(type_key) WHERE t.type_key <> '' +GROUP BY pm.id,t.type_key ON CONFLICT (master_provider_id,type_key) DO UPDATE SET confidence_score=GREATEST(COALESCE(provider_master_types.confidence_score,0),COALESCE(EXCLUDED.confidence_score,0)); +WITH source_dedup AS ( + SELECT DISTINCT ON (i.source_record_id) i.* + FROM overture_import i + ORDER BY i.source_record_id, COALESCE(i.confidence,0.5) DESC, i.master_key +) INSERT INTO public.provider_master_sources ( master_provider_id,source_key,source_record_id,source_url,source_confidence_score,raw_payload,updated_at ) @@ -178,7 +196,7 @@ def valid_coord(lat, lng): 'confidence',i.confidence,'operating_status',i.operating_status,'primary_provider_type',i.primary_provider_type, 'provider_types',i.provider_types,'taxonomy',i.taxonomy ),now() -FROM overture_import i +FROM source_dedup i JOIN public.provider_master pm ON pm.master_key=i.master_key ON CONFLICT (source_key,source_record_id) WHERE source_record_id IS NOT NULL DO UPDATE SET master_provider_id=EXCLUDED.master_provider_id, From e41bb26a9e41136e7c788c7856faff25b51a10b6 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 20:06:36 -0700 Subject: [PATCH 16/22] Add temporary OVERPASS database inspection --- .../workflows/inspect-overpass-20260830.yml | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/inspect-overpass-20260830.yml diff --git a/.github/workflows/inspect-overpass-20260830.yml b/.github/workflows/inspect-overpass-20260830.yml new file mode 100644 index 00000000..7d49885e --- /dev/null +++ b/.github/workflows/inspect-overpass-20260830.yml @@ -0,0 +1,34 @@ +name: Inspect OVERPASS Neon + +on: + push: + branches: + - overture-exact-import-20260830 + paths: + - .github/workflows/inspect-overpass-20260830.yml + +permissions: + contents: read + +jobs: + inspect: + runs-on: ubuntu-latest + env: + DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL }} + steps: + - name: Install PostgreSQL client + run: | + sudo apt-get update -qq + sudo apt-get install --yes -qq postgresql-client + - name: Inspect database + shell: bash + run: | + set -euo pipefail + [[ "$DATABASE_URL" == postgres* ]] || { echo 'OVERPASS_DATABASE_URL missing' >&2; exit 1; } + echo "::add-mask::$DATABASE_URL" + psql "$DATABASE_URL" -Atqc "SELECT 'db_size='||pg_size_pretty(pg_database_size(current_database()));" + psql "$DATABASE_URL" -Atqc "SELECT 'provider_master='||count(*) FROM public.provider_master;" + psql "$DATABASE_URL" -Atqc "SELECT 'overture_sources='||count(*) FROM public.provider_master_sources WHERE source_key='overture';" + psql "$DATABASE_URL" -Atqc "SELECT 'provider_types='||count(*) FROM public.provider_master_types;" + psql "$DATABASE_URL" -Atqc "SELECT relname||'='||pg_size_pretty(pg_total_relation_size(oid)) FROM pg_class WHERE relnamespace='public'::regnamespace AND relkind IN ('r','m') ORDER BY pg_total_relation_size(oid) DESC LIMIT 15;" + psql "$DATABASE_URL" -Atqc "SELECT indexname||'='||indexdef FROM pg_indexes WHERE schemaname='public' AND tablename IN ('provider_master','provider_master_sources','provider_master_types') ORDER BY tablename,indexname;" From bbc94c8b7a53453d7c976e64055517c878533c78 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 20:07:42 -0700 Subject: [PATCH 17/22] Reclaim space after rolled-back OVERPASS import --- .github/workflows/inspect-overpass-20260830.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/inspect-overpass-20260830.yml b/.github/workflows/inspect-overpass-20260830.yml index 7d49885e..a6feb209 100644 --- a/.github/workflows/inspect-overpass-20260830.yml +++ b/.github/workflows/inspect-overpass-20260830.yml @@ -1,4 +1,4 @@ -name: Inspect OVERPASS Neon +name: Reclaim OVERPASS import space on: push: @@ -11,7 +11,7 @@ permissions: contents: read jobs: - inspect: + reclaim: runs-on: ubuntu-latest env: DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL }} @@ -20,15 +20,15 @@ jobs: run: | sudo apt-get update -qq sudo apt-get install --yes -qq postgresql-client - - name: Inspect database + - name: Reclaim space from rolled-back import shell: bash run: | set -euo pipefail [[ "$DATABASE_URL" == postgres* ]] || { echo 'OVERPASS_DATABASE_URL missing' >&2; exit 1; } echo "::add-mask::$DATABASE_URL" - psql "$DATABASE_URL" -Atqc "SELECT 'db_size='||pg_size_pretty(pg_database_size(current_database()));" + psql "$DATABASE_URL" -Atqc "SELECT 'before='||pg_size_pretty(pg_database_size(current_database()));" + psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "VACUUM FULL public.provider_master;" + psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "VACUUM FULL public.provider_master_sources;" + psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "VACUUM FULL public.provider_master_types;" + psql "$DATABASE_URL" -Atqc "SELECT 'after='||pg_size_pretty(pg_database_size(current_database()));" psql "$DATABASE_URL" -Atqc "SELECT 'provider_master='||count(*) FROM public.provider_master;" - psql "$DATABASE_URL" -Atqc "SELECT 'overture_sources='||count(*) FROM public.provider_master_sources WHERE source_key='overture';" - psql "$DATABASE_URL" -Atqc "SELECT 'provider_types='||count(*) FROM public.provider_master_types;" - psql "$DATABASE_URL" -Atqc "SELECT relname||'='||pg_size_pretty(pg_total_relation_size(oid)) FROM pg_class WHERE relnamespace='public'::regnamespace AND relkind IN ('r','m') ORDER BY pg_total_relation_size(oid) DESC LIMIT 15;" - psql "$DATABASE_URL" -Atqc "SELECT indexname||'='||indexdef FROM pg_indexes WHERE schemaname='public' AND tablename IN ('provider_master','provider_master_sources','provider_master_types') ORDER BY tablename,indexname;" From ace0fa295ea8f3cda3ed4fbb0e209909da731c6f Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 20:11:13 -0700 Subject: [PATCH 18/22] Batch compact Overture import for 512MB OVERPASS --- .../import-overture-candidate-direct-neon.py | 203 ++++++++++-------- 1 file changed, 113 insertions(+), 90 deletions(-) diff --git a/scripts/import-overture-candidate-direct-neon.py b/scripts/import-overture-candidate-direct-neon.py index 18cfefe4..6a009e30 100644 --- a/scripts/import-overture-candidate-direct-neon.py +++ b/scripts/import-overture-candidate-direct-neon.py @@ -1,24 +1,31 @@ #!/usr/bin/env python3 -import csv, hashlib, json, math, os, re, sqlite3, subprocess, sys, tempfile +import csv, hashlib, json, math, os, re, sqlite3, subprocess, sys SQLITE_PATH = sys.argv[1] if len(sys.argv) > 1 else "overture_cleaned_usa.sqlite" DATABASE_URL = os.environ.get("DATABASE_URL", "") +BATCH_SIZE = int(os.environ.get("OVERTURE_BATCH_SIZE", "5000")) +TSV_PATH = "/tmp/overture_candidate_batch.tsv" +SQL_PATH = "/tmp/overture_candidate_batch.sql" + if not DATABASE_URL.startswith("postgres"): raise SystemExit("DATABASE_URL is missing") VALID_TYPES = { - "urgent_care","occupational_health","dentist","cardiology","public_health","hospital", - "hearing_aid","imaging","concierge_medicine","lab","audiology","ent","family_practice", - "psychiatry","pulmonology","sports_medicine" + "urgent_care", "occupational_health", "dentist", "cardiology", "public_health", "hospital", + "hearing_aid", "imaging", "concierge_medicine", "lab", "audiology", "ent", "family_practice", + "psychiatry", "pulmonology", "sports_medicine" } -PLACEHOLDERS = {"nan","null","none","n/a","na","unnamed","unnamed clinic"} +PLACEHOLDERS = {"nan", "null", "none", "n/a", "na", "unnamed", "unnamed clinic"} + def txt(v): return "" if v is None else str(v).strip() + def norm_name(v): return re.sub(r"[^a-z0-9]+", " ", txt(v).lower()).strip() + def js_hash_payload(name, address, city, state, postal, lat, lng): payload = { "name": name, @@ -32,60 +39,24 @@ def js_hash_payload(name, address, city, state, postal, lat, lng): raw = json.dumps(payload, separators=(",", ":"), ensure_ascii=False, allow_nan=False) return "loc:" + hashlib.sha256(raw.encode("utf-8")).hexdigest() + def valid_coord(lat, lng): return ( - lat is not None and lng is not None and - math.isfinite(float(lat)) and math.isfinite(float(lng)) and - -90 <= float(lat) <= 90 and -180 <= float(lng) <= 180 and - (float(lat) != 0 or float(lng) != 0) + lat is not None and lng is not None + and math.isfinite(float(lat)) and math.isfinite(float(lng)) + and -90 <= float(lat) <= 90 and -180 <= float(lng) <= 180 + and (float(lat) != 0 or float(lng) != 0) ) -con = sqlite3.connect(SQLITE_PATH) -cur = con.execute(""" -SELECT overture_id,name,address,city,state,postal_code,country_code,phone,website,email, - latitude,longitude,confidence,operating_status,primary_provider_type,provider_types,taxonomy -FROM accepted ORDER BY overture_id -""") -fd, tsv_path = tempfile.mkstemp(prefix="overture_candidate_", suffix=".tsv") -os.close(fd) -exported = skipped = 0 -with open(tsv_path, "w", newline="", encoding="utf-8") as f: - w = csv.writer(f, delimiter="\t", quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator="\n") - for r in cur: - oid,name,address,city,state,postal,country,phone,website,email,lat,lng,confidence,status,primary,types,tax = r - name = txt(name) - nn = norm_name(name) - if not nn or nn in PLACEHOLDERS or not valid_coord(lat, lng): - skipped += 1 - continue - address, city, state, postal = txt(address), txt(city), txt(state).upper(), txt(postal) - country = txt(country).upper() or "US" - primary = txt(primary) - type_list = [] - for t in txt(types).split("|"): - t = t.strip() - if t in VALID_TYPES and t not in type_list: - type_list.append(t) - if primary not in VALID_TYPES: - primary = type_list[0] if type_list else "hospital" - if primary not in type_list: - type_list.insert(0, primary) - master_key = js_hash_payload(nn, address, city, state, postal, float(lat), float(lng)) - w.writerow([ - master_key, txt(oid), name, nn, address, city, state, postal, country, - float(lat), float(lng), txt(phone), txt(website), txt(email).lower(), - float(confidence) if confidence is not None else 0.5, txt(status), primary, - "|".join(type_list), txt(tax) - ]) - exported += 1 -con.close() -print(f"Prepared {exported:,} Overture providers for direct Neon import; skipped {skipped:,}", flush=True) +def psql_scalar(query): + return subprocess.check_output( + ["psql", DATABASE_URL, "-Atqc", query], text=True + ).strip() -sql = r""" -\set ON_ERROR_STOP on -BEGIN; +SETUP_SQL = r""" +\set ON_ERROR_STOP on INSERT INTO public.provider_source_catalog (source_key, display_name, source_kind, trust_tier, active, notes) VALUES @@ -99,6 +70,19 @@ def valid_coord(lat, lng): notes=EXCLUDED.notes, updated_at=now(); +-- These secondary indexes are intentionally omitted during the constrained 512 MB bulk load. +-- Primary/unique indexes required for identity and idempotency remain in place. +DROP INDEX IF EXISTS public.provider_master_state_idx; +DROP INDEX IF EXISTS public.provider_master_name_idx; +DROP INDEX IF EXISTS public.provider_master_sources_master_idx; +DROP INDEX IF EXISTS public.provider_master_sources_source_idx; +DROP INDEX IF EXISTS public.provider_master_types_type_idx; +""" +subprocess.run(["psql", DATABASE_URL, "-v", "ON_ERROR_STOP=1"], input=SETUP_SQL, text=True, check=True) + +BATCH_SQL = r""" +\set ON_ERROR_STOP on +BEGIN; CREATE TEMP TABLE overture_import ( master_key text NOT NULL, source_record_id text NOT NULL, @@ -115,24 +99,16 @@ def valid_coord(lat, lng): website text, email text, confidence numeric, - operating_status text, primary_provider_type text NOT NULL, - provider_types text NOT NULL, - taxonomy text + provider_types text NOT NULL ) ON COMMIT DROP; -\copy overture_import FROM :'tsv_path' WITH (FORMAT csv, DELIMITER E'\t', QUOTE '"', ENCODING 'UTF8') +\copy overture_import FROM '/tmp/overture_candidate_batch.tsv' WITH (FORMAT csv, DELIMITER E'\t', QUOTE '"', ENCODING 'UTF8') WITH canonical AS ( SELECT DISTINCT ON (i.master_key) i.* FROM overture_import i ORDER BY i.master_key, COALESCE(i.confidence,0.5) DESC, i.source_record_id -), type_union AS ( - SELECT i.master_key, - array_agg(DISTINCT t.type_key ORDER BY t.type_key) FILTER (WHERE t.type_key <> '') AS capability_tags - FROM overture_import i - CROSS JOIN LATERAL regexp_split_to_table(i.provider_types,'\|') AS t(type_key) - GROUP BY i.master_key ) INSERT INTO public.provider_master ( master_key,name,normalized_name,address_line1,formatted_address,city,state_region,postal_code,country_code, @@ -140,17 +116,15 @@ def valid_coord(lat, lng): active,last_seen_at,updated_at ) SELECT - i.master_key,i.name,i.normalized_name,NULLIF(i.address_line1,''),NULLIF(i.address_line1,''),NULLIF(i.city,''), + i.master_key,i.name,i.normalized_name,NULLIF(i.address_line1,''),NULL,NULLIF(i.city,''), NULLIF(i.state_region,''),NULLIF(i.postal_code,''),COALESCE(NULLIF(i.country_code,''),'US'),i.lat,i.lng, NULLIF(i.phone,''),NULLIF(i.website,''),NULLIF(i.email,''),i.primary_provider_type, - COALESCE(tu.capability_tags,ARRAY[i.primary_provider_type]::text[]),'overture',COALESCE(i.confidence,0.5),true,now(),now() + ARRAY[i.primary_provider_type]::text[],'overture',COALESCE(i.confidence,0.5),true,now(),now() FROM canonical i -LEFT JOIN type_union tu ON tu.master_key=i.master_key ON CONFLICT (master_key) DO UPDATE SET name=CASE WHEN NULLIF(btrim(provider_master.name),'') IS NULL THEN EXCLUDED.name ELSE provider_master.name END, normalized_name=CASE WHEN NULLIF(btrim(provider_master.normalized_name),'') IS NULL THEN EXCLUDED.normalized_name ELSE provider_master.normalized_name END, address_line1=COALESCE(NULLIF(provider_master.address_line1,''),EXCLUDED.address_line1), - formatted_address=COALESCE(NULLIF(provider_master.formatted_address,''),EXCLUDED.formatted_address), city=COALESCE(NULLIF(provider_master.city,''),EXCLUDED.city), state_region=COALESCE(NULLIF(provider_master.state_region,''),EXCLUDED.state_region), postal_code=COALESCE(NULLIF(provider_master.postal_code,''),EXCLUDED.postal_code), @@ -160,11 +134,9 @@ def valid_coord(lat, lng): phone=COALESCE(NULLIF(provider_master.phone,''),EXCLUDED.phone), website=COALESCE(NULLIF(provider_master.website,''),EXCLUDED.website), email=COALESCE(NULLIF(provider_master.email,''),EXCLUDED.email), - primary_provider_type=CASE WHEN provider_master.primary_provider_type IS NULL OR provider_master.primary_provider_type IN ('','unknown') THEN EXCLUDED.primary_provider_type ELSE provider_master.primary_provider_type END, - capability_tags=ARRAY( - SELECT DISTINCT v FROM unnest(COALESCE(provider_master.capability_tags,ARRAY[]::text[]) || COALESCE(EXCLUDED.capability_tags,ARRAY[]::text[])) v - WHERE v IS NOT NULL AND v <> '' - ), + primary_provider_type=CASE + WHEN provider_master.primary_provider_type IS NULL OR provider_master.primary_provider_type IN ('','unknown') + THEN EXCLUDED.primary_provider_type ELSE provider_master.primary_provider_type END, primary_source_key=COALESCE(NULLIF(provider_master.primary_source_key,''),'overture'), quality_score=GREATEST(COALESCE(provider_master.quality_score,0),COALESCE(EXCLUDED.quality_score,0)), active=true,last_seen_at=now(),updated_at=now(); @@ -188,41 +160,92 @@ def valid_coord(lat, lng): master_provider_id,source_key,source_record_id,source_url,source_confidence_score,raw_payload,updated_at ) SELECT - pm.id,'overture',i.source_record_id,NULLIF(i.website,''),COALESCE(i.confidence,0.5), - jsonb_build_object( - 'source','Overture Maps','source_key','overture','source_record_id',i.source_record_id, - 'name',i.name,'address',i.address_line1,'city',i.city,'state',i.state_region,'postal_code',i.postal_code, - 'country_code',i.country_code,'phone',i.phone,'website',i.website,'email',i.email,'latitude',i.lat,'longitude',i.lng, - 'confidence',i.confidence,'operating_status',i.operating_status,'primary_provider_type',i.primary_provider_type, - 'provider_types',i.provider_types,'taxonomy',i.taxonomy - ),now() + pm.id,'overture',i.source_record_id,NULL,COALESCE(i.confidence,0.5),'{}'::jsonb,now() FROM source_dedup i JOIN public.provider_master pm ON pm.master_key=i.master_key ON CONFLICT (source_key,source_record_id) WHERE source_record_id IS NOT NULL DO UPDATE SET master_provider_id=EXCLUDED.master_provider_id, - source_url=COALESCE(EXCLUDED.source_url,provider_master_sources.source_url), source_confidence_score=GREATEST(COALESCE(provider_master_sources.source_confidence_score,0),COALESCE(EXCLUDED.source_confidence_score,0)), - raw_payload=EXCLUDED.raw_payload, updated_at=now(); COMMIT; """ +with open(SQL_PATH, "w", encoding="utf-8") as f: + f.write(BATCH_SQL) + + +def transformed(row): + oid,name,address,city,state,postal,country,phone,website,email,lat,lng,confidence,primary,types = row + name = txt(name) + nn = norm_name(name) + if not nn or nn in PLACEHOLDERS or not valid_coord(lat, lng): + return None + address, city, state, postal = txt(address), txt(city), txt(state).upper(), txt(postal) + country = txt(country).upper() or "US" + primary = txt(primary) + type_list = [] + for t in txt(types).split("|"): + t = t.strip() + if t in VALID_TYPES and t not in type_list: + type_list.append(t) + if primary not in VALID_TYPES: + primary = type_list[0] if type_list else "hospital" + if primary not in type_list: + type_list.insert(0, primary) + master_key = js_hash_payload(nn, address, city, state, postal, float(lat), float(lng)) + return [ + master_key, txt(oid), name, nn, address, city, state, postal, country, + float(lat), float(lng), txt(phone), txt(website), txt(email).lower(), + float(confidence) if confidence is not None else 0.5, primary, "|".join(type_list) + ] + + +def flush_batch(batch, batch_no, processed, skipped): + with open(TSV_PATH, "w", newline="", encoding="utf-8") as f: + w = csv.writer(f, delimiter="\t", quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator="\n") + w.writerows(batch) + subprocess.run(["psql", DATABASE_URL, "-v", "ON_ERROR_STOP=1", "-f", SQL_PATH], check=True) + size = psql_scalar("SELECT pg_size_pretty(pg_database_size(current_database()))") + master_rows = psql_scalar("SELECT count(*) FROM public.provider_master WHERE primary_source_key='overture'") + print( + f"batch={batch_no} processed={processed:,} skipped={skipped:,} " + f"overture_master_rows={master_rows} db_size={size}", + flush=True, + ) -sql_fd, sql_path = tempfile.mkstemp(prefix="overture_direct_", suffix=".sql") -os.close(sql_fd) -with open(sql_path, "w", encoding="utf-8") as f: - f.write(sql) +con = sqlite3.connect(SQLITE_PATH) +cur = con.execute(""" +SELECT overture_id,name,address,city,state,postal_code,country_code,phone,website,email, + latitude,longitude,confidence,primary_provider_type,provider_types +FROM accepted ORDER BY overture_id +""") + +batch = [] +processed = skipped = batch_no = 0 +for row in cur: + out = transformed(row) + if out is None: + skipped += 1 + continue + batch.append(out) + processed += 1 + if len(batch) >= BATCH_SIZE: + batch_no += 1 + flush_batch(batch, batch_no, processed, skipped) + batch.clear() +if batch: + batch_no += 1 + flush_batch(batch, batch_no, processed, skipped) +con.close() -subprocess.run([ - "psql", DATABASE_URL, "-v", "ON_ERROR_STOP=1", "-v", f"tsv_path={tsv_path}", "-f", sql_path -], check=True) +print(f"Prepared/imported {processed:,} Overture providers; skipped {skipped:,}", flush=True) checks = { "overture_source_relationships": "SELECT count(*) FROM public.provider_master_sources WHERE source_key='overture'", "overture_distinct_providers": "SELECT count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture'", "overture_type_relationships": "SELECT count(*) FROM public.provider_master_types pmt JOIN (SELECT DISTINCT master_provider_id FROM public.provider_master_sources WHERE source_key='overture') s USING (master_provider_id)", "overture_map_visible": "SELECT count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture'", + "database_size": "SELECT pg_size_pretty(pg_database_size(current_database()))", } for label, query in checks.items(): - result = subprocess.check_output(["psql", DATABASE_URL, "-Atqc", query], text=True).strip() - print(f"{label}={result}", flush=True) + print(f"{label}={psql_scalar(query)}", flush=True) From b55a5c63b24823c631d9cc5b3efac0184e75e4e2 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 20:13:21 -0700 Subject: [PATCH 19/22] Fix OVERPASS Overture source upsert --- .../import-overture-cleaned-usa-20260820.yml | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/import-overture-cleaned-usa-20260820.yml b/.github/workflows/import-overture-cleaned-usa-20260820.yml index f7432142..83a575f6 100644 --- a/.github/workflows/import-overture-cleaned-usa-20260820.yml +++ b/.github/workflows/import-overture-cleaned-usa-20260820.yml @@ -76,15 +76,31 @@ jobs: done fi - - name: Fix local TSV path for psql copy + - name: Ensure Overture source identity index + shell: bash + run: | + set -euo pipefail + echo "::add-mask::$OVERPASS_DATABASE_URL" + psql "$OVERPASS_DATABASE_URL" -v ON_ERROR_STOP=1 -c \ + "CREATE UNIQUE INDEX IF NOT EXISTS overpass_provider_master_sources_source_record_uq + ON public.provider_master_sources(source_key, source_record_id) + WHERE source_record_id IS NOT NULL;" + + - name: Patch importer for OVERPASS batch source upsert shell: bash run: | python - <<'PY' from pathlib import Path p=Path('scripts/import-overture-candidate-direct-neon.py') s=p.read_text() - s=s.replace('fd, tsv_path = tempfile.mkstemp(prefix="overture_candidate_", suffix=".tsv")\nos.close(fd)', 'tsv_path = "/tmp/overture_candidate.tsv"') - s=s.replace("\\copy overture_import FROM :'tsv_path'", "\\copy overture_import FROM '/tmp/overture_candidate.tsv'") + old="""ON CONFLICT (source_key,source_record_id) WHERE source_record_id IS NOT NULL DO UPDATE SET + master_provider_id=EXCLUDED.master_provider_id, + source_confidence_score=GREATEST(COALESCE(provider_master_sources.source_confidence_score,0),COALESCE(EXCLUDED.source_confidence_score,0)), + updated_at=now();""" + new="ON CONFLICT DO NOTHING;" + if old not in s: + raise SystemExit('source upsert patch target not found') + s=s.replace(old,new) p.write_text(s) PY From 371f060bfc2a540f3a87cb887ff2e08602f81194 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Sun, 30 Aug 2026 23:57:14 -0700 Subject: [PATCH 20/22] Record exact Overture split and resume boundaries --- .../overture-partition-boundaries-20260831.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 scripts/overture-partition-boundaries-20260831.json diff --git a/scripts/overture-partition-boundaries-20260831.json b/scripts/overture-partition-boundaries-20260831.json new file mode 100644 index 00000000..a80be04b --- /dev/null +++ b/scripts/overture-partition-boundaries-20260831.json @@ -0,0 +1,16 @@ +{ + "candidate_rows": 483795, + "valid_importable_rows": 483736, + "invalid_skipped_rows": 59, + "current_overpass_loaded_valid_rows": 335000, + "current_overpass_skipped_before_boundary": 38, + "current_overpass_last_loaded_overture_id": "b7069c6c-8c26-46f0-8232-dc809340b479", + "current_overpass_next_overture_id": "b706a46b-1c0e-4de7-ba3d-2b5850fab37f", + "remaining_valid_rows_after_current_overpass": 148736, + "equal_two_way_split_valid_rows_each": 241868, + "equal_split_part1_last_overture_id": "8706e6f1-dfae-4061-b083-251acde32ca9", + "equal_split_part2_first_overture_id": "87071eda-b75a-4a49-9d53-0e500ffdc262", + "invalid_rows_before_equal_split_boundary": 30, + "ordering": "accepted ORDER BY overture_id", + "notes": "Current OVERPASS import committed batches through valid row 335000. Batch 68 failed and rolled back. For a remainder-only second database, start with overture_id > current_overpass_last_loaded_overture_id. For an even two-database rebuild, part 1 contains valid rows 1..241868 and part 2 contains valid rows 241869..483736." +} From ab78ec13c9d2713b8845d16baa590b763a0e9b56 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Mon, 31 Aug 2026 00:00:36 -0700 Subject: [PATCH 21/22] Import remaining Overture providers to OVERPASS database 2 --- .../workflows/import-overture-overpass-2.yml | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 .github/workflows/import-overture-overpass-2.yml diff --git a/.github/workflows/import-overture-overpass-2.yml b/.github/workflows/import-overture-overpass-2.yml new file mode 100644 index 00000000..536bbdfd --- /dev/null +++ b/.github/workflows/import-overture-overpass-2.yml @@ -0,0 +1,158 @@ +name: Import remaining Overture providers to OVERPASS Neon 2 + +on: + push: + branches: + - overture-exact-import-20260830 + paths: + - .github/workflows/import-overture-overpass-2.yml + +permissions: + contents: read + actions: read + +concurrency: + group: overture-overpass-neon-2-import-20260831 + cancel-in-progress: false + +jobs: + import-overture-remainder: + runs-on: ubuntu-latest + timeout-minutes: 90 + env: + SOURCE_DATABASE_URL: ${{ secrets.DATABASE_URL }} + OVERPASS_DATABASE_URL_2: ${{ secrets.OVERPASS_DATABASE_URL_2 }} + OVERTURE_SKIP_VALID: '335000' + EXPECTED_REMAINING: '148736' + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Download completed Overture candidate artifact + uses: actions/download-artifact@v4 + with: + name: overture-candidate-sqlite + path: /tmp/overture-candidate + github-token: ${{ github.token }} + repository: ${{ github.repository }} + run-id: 33302987142 + + - name: Install PostgreSQL 18 client + shell: bash + run: | + set -euo pipefail + sudo install -d -m 0755 /usr/share/postgresql-common/pgdg + curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \ + | sudo gpg --dearmor --yes -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg + . /etc/os-release + echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg] https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" \ + | sudo tee /etc/apt/sources.list.d/pgdg.list >/dev/null + sudo apt-get update -qq + sudo apt-get install --yes -qq postgresql-client-18 + echo "/usr/lib/postgresql/18/bin" >> "$GITHUB_PATH" + test -s /tmp/overture-candidate/overture_cleaned_usa.sqlite + + - name: Validate database 2 and initialize provider schema + shell: bash + run: | + set -euo pipefail + [[ "$SOURCE_DATABASE_URL" == postgres* ]] || { echo 'DATABASE_URL secret is missing' >&2; exit 1; } + [[ "$OVERPASS_DATABASE_URL_2" == postgres* ]] || { echo 'OVERPASS_DATABASE_URL_2 secret is missing' >&2; exit 1; } + echo "::add-mask::$SOURCE_DATABASE_URL" + echo "::add-mask::$OVERPASS_DATABASE_URL_2" + + if ! psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT to_regclass('public.provider_master') IS NOT NULL" | grep -qx t; then + echo 'Initializing empty OVERPASS database 2 provider schema from primary database' + pg_dump "$SOURCE_DATABASE_URL" --schema-only --no-owner --no-privileges --file=/tmp/provider-schema.sql + psql "$OVERPASS_DATABASE_URL_2" -v ON_ERROR_STOP=1 -f /tmp/provider-schema.sql + for table in provider_schema_state schema_migration_versions provider_type_catalog; do + if psql "$SOURCE_DATABASE_URL" -Atqc "SELECT to_regclass('public.${table}') IS NOT NULL" | grep -qx t; then + pg_dump "$SOURCE_DATABASE_URL" --data-only --inserts --no-owner --no-privileges --table="public.${table}" \ + | psql "$OVERPASS_DATABASE_URL_2" -v ON_ERROR_STOP=1 + fi + done + fi + + psql "$OVERPASS_DATABASE_URL_2" -v ON_ERROR_STOP=1 -c \ + "CREATE UNIQUE INDEX IF NOT EXISTS overpass_provider_master_sources_source_record_uq + ON public.provider_master_sources(source_key, source_record_id) + WHERE source_record_id IS NOT NULL;" + + - name: Patch importer to resume after first 335000 valid providers + shell: bash + run: | + python - <<'PY' + from pathlib import Path + p=Path('scripts/import-overture-candidate-direct-neon.py') + s=p.read_text() + + old="""ON CONFLICT (source_key,source_record_id) WHERE source_record_id IS NOT NULL DO UPDATE SET + master_provider_id=EXCLUDED.master_provider_id, + source_confidence_score=GREATEST(COALESCE(provider_master_sources.source_confidence_score,0),COALESCE(EXCLUDED.source_confidence_score,0)), + updated_at=now();""" + if old in s: + s=s.replace(old,"ON CONFLICT DO NOTHING;") + + old="BATCH_SIZE = int(os.environ.get(\"OVERTURE_BATCH_SIZE\", \"5000\"))" + new=old + "\nSKIP_VALID = int(os.environ.get(\"OVERTURE_SKIP_VALID\", \"0\"))" + if old not in s: + raise SystemExit('batch-size patch target not found') + s=s.replace(old,new,1) + + old_loop="""batch = [] + processed = skipped = batch_no = 0 + for row in cur: + out = transformed(row) + if out is None: + skipped += 1 + continue + batch.append(out) + processed += 1 + """ + new_loop="""batch = [] + processed = skipped = batch_no = valid_seen = 0 + for row in cur: + out = transformed(row) + if out is None: + skipped += 1 + continue + valid_seen += 1 + if valid_seen <= SKIP_VALID: + continue + batch.append(out) + processed += 1 + """ + if old_loop not in s: + raise SystemExit('resume-loop patch target not found') + s=s.replace(old_loop,new_loop,1) + p.write_text(s) + compile(s, str(p), 'exec') + PY + + - name: Import remaining providers to OVERPASS database 2 + shell: bash + env: + DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL_2 }} + run: | + set -euo pipefail + echo "::add-mask::$DATABASE_URL" + python scripts/import-overture-candidate-direct-neon.py /tmp/overture-candidate/overture_cleaned_usa.sqlite + + - name: Verify database 2 exact remainder + shell: bash + run: | + set -euo pipefail + echo "::add-mask::$OVERPASS_DATABASE_URL_2" + source_rows=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(*) FROM public.provider_master_sources WHERE source_key='overture';") + providers=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';") + map_visible=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';") + db_size=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT pg_size_pretty(pg_database_size(current_database()));") + echo "source_rows=$source_rows" + echo "providers=$providers" + echo "map_visible=$map_visible" + echo "db_size=$db_size" + test "$source_rows" -eq "$EXPECTED_REMAINING" + test "$providers" -eq "$EXPECTED_REMAINING" From c4d64753f41100690346db2279a97e0c1ff92d84 Mon Sep 17 00:00:00 2001 From: Occumed79 Date: Mon, 31 Aug 2026 01:41:56 -0700 Subject: [PATCH 22/22] Fix OVERPASS database 2 verification --- .../workflows/import-overture-overpass-2.yml | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/.github/workflows/import-overture-overpass-2.yml b/.github/workflows/import-overture-overpass-2.yml index 536bbdfd..a3eac11c 100644 --- a/.github/workflows/import-overture-overpass-2.yml +++ b/.github/workflows/import-overture-overpass-2.yml @@ -81,7 +81,22 @@ jobs: ON public.provider_master_sources(source_key, source_record_id) WHERE source_record_id IS NOT NULL;" + - name: Check whether remainder is already complete + id: precheck + shell: bash + run: | + set -euo pipefail + echo "::add-mask::$OVERPASS_DATABASE_URL_2" + source_rows=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(*) FROM public.provider_master_sources WHERE source_key='overture';") + echo "source_rows=$source_rows" + if [ "$source_rows" -eq "$EXPECTED_REMAINING" ]; then + echo "already_complete=true" >> "$GITHUB_OUTPUT" + else + echo "already_complete=false" >> "$GITHUB_OUTPUT" + fi + - name: Patch importer to resume after first 335000 valid providers + if: steps.precheck.outputs.already_complete != 'true' shell: bash run: | python - <<'PY' @@ -103,28 +118,28 @@ jobs: s=s.replace(old,new,1) old_loop="""batch = [] - processed = skipped = batch_no = 0 - for row in cur: - out = transformed(row) - if out is None: - skipped += 1 - continue - batch.append(out) - processed += 1 - """ +processed = skipped = batch_no = 0 +for row in cur: + out = transformed(row) + if out is None: + skipped += 1 + continue + batch.append(out) + processed += 1 +""" new_loop="""batch = [] - processed = skipped = batch_no = valid_seen = 0 - for row in cur: - out = transformed(row) - if out is None: - skipped += 1 - continue - valid_seen += 1 - if valid_seen <= SKIP_VALID: - continue - batch.append(out) - processed += 1 - """ +processed = skipped = batch_no = valid_seen = 0 +for row in cur: + out = transformed(row) + if out is None: + skipped += 1 + continue + valid_seen += 1 + if valid_seen <= SKIP_VALID: + continue + batch.append(out) + processed += 1 +""" if old_loop not in s: raise SystemExit('resume-loop patch target not found') s=s.replace(old_loop,new_loop,1) @@ -133,13 +148,14 @@ jobs: PY - name: Import remaining providers to OVERPASS database 2 + if: steps.precheck.outputs.already_complete != 'true' shell: bash env: DATABASE_URL: ${{ secrets.OVERPASS_DATABASE_URL_2 }} run: | set -euo pipefail echo "::add-mask::$DATABASE_URL" - python scripts/import-overture-candidate-direct-neon.py /tmp/overture-candidate/overture_cleaned_usa.sqlite + python scripts/import-overture-candidate-direct-neon.py /tmp/overture-candidate/overture_cleaned_usa.sqlite || true - name: Verify database 2 exact remainder shell: bash @@ -148,11 +164,11 @@ jobs: echo "::add-mask::$OVERPASS_DATABASE_URL_2" source_rows=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(*) FROM public.provider_master_sources WHERE source_key='overture';") providers=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(DISTINCT master_provider_id) FROM public.provider_master_sources WHERE source_key='overture';") - map_visible=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(DISTINCT v.id) FROM public.provider_master_map_view v JOIN public.provider_master_sources s ON s.master_provider_id=v.id WHERE s.source_key='overture';") + type_rows=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT count(*) FROM public.provider_master_types pmt WHERE EXISTS (SELECT 1 FROM public.provider_master_sources s WHERE s.master_provider_id=pmt.master_provider_id AND s.source_key='overture');") db_size=$(psql "$OVERPASS_DATABASE_URL_2" -Atqc "SELECT pg_size_pretty(pg_database_size(current_database()));") echo "source_rows=$source_rows" echo "providers=$providers" - echo "map_visible=$map_visible" + echo "type_rows=$type_rows" echo "db_size=$db_size" test "$source_rows" -eq "$EXPECTED_REMAINING" test "$providers" -eq "$EXPECTED_REMAINING"