{"slug":"ca-donations","total":51,"limit":100,"offset":0,"since":null,"commits":[{"hash":"3296d4e","date":"2026-09-26 09:40:45 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-26T09:40:15 (1 data files) — data/latest.json","body":""},{"hash":"53d04aa","date":"2026-09-25 09:20:51 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-25T09:20:47 (1 data files) — data/latest.json","body":""},{"hash":"1e421ec","date":"2026-09-24 09:44:14 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T09:44:11 (1 data files) — data/latest.json","body":""},{"hash":"181636a","date":"2026-09-23 09:31:47 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-23T09:31:43 (1 data files) — data/latest.json","body":""},{"hash":"6f9e876","date":"2026-09-23 04:15:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-23T04:15:24 (1 data files) — data/latest.json","body":""},{"hash":"129bcf2","date":"2026-09-22 09:54:57 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-22T09:54:34 (1 data files) — data/latest.json","body":""},{"hash":"5ced7f8","date":"2026-09-21 09:21:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-21T09:21:33 (1 data files) — data/latest.json","body":""},{"hash":"27676a1","date":"2026-09-20 09:27:59 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-20T09:27:07 (1 data files) — data/latest.json","body":""},{"hash":"90e19eb","date":"2026-09-19 09:28:02 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-19T09:27:32 (1 data files) — data/latest.json","body":""},{"hash":"dc8c9bf","date":"2026-09-18 09:27:23 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-18T09:26:51 (1 data files) — data/latest.json","body":""},{"hash":"8e86229","date":"2026-09-17 09:21:44 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T09:20:48 (1 data files) — data/latest.json","body":""},{"hash":"bb2d1f9","date":"2026-09-16 09:34:12 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-16T09:33:20 (1 data files) — data/latest.json","body":""},{"hash":"1c5656f","date":"2026-09-15 09:49:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T09:48:56 (1 data files) — data/latest.json","body":""},{"hash":"658763d","date":"2026-09-14 09:26:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T09:19:35 (1 data files) — data/latest.json","body":""},{"hash":"73669e5","date":"2026-09-13 09:50:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-13T09:49:22 (1 data files) — data/latest.json","body":""},{"hash":"ce3d989","date":"2026-09-12 09:29:32 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-12T09:28:54 (1 data files) — data/latest.json","body":""},{"hash":"d02968a","date":"2026-09-11 09:32:11 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T09:31:49 (1 data files) — data/latest.json","body":""},{"hash":"2127872","date":"2026-09-10 09:23:01 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T09:22:46 (1 data files) — data/latest.json","body":""},{"hash":"dbb620a","date":"2026-09-09 09:32:22 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-09T09:32:15 (1 data files) — data/latest.json","body":""},{"hash":"71f6984","date":"2026-09-08 09:40:55 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-08T09:40:47 (1 data files) — data/latest.json","body":""},{"hash":"9770295","date":"2026-09-07 09:25:56 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-07T09:25:49 (1 data files) — data/latest.json","body":""},{"hash":"1a19cc7","date":"2026-09-06 09:42:45 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-06T09:42:39 (1 data files) — data/latest.json","body":""},{"hash":"76d16ab","date":"2026-09-05 09:24:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-05T09:24:41 (1 data files) — data/latest.json","body":""},{"hash":"64181ae","date":"2026-09-04 09:31:27 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-04T09:31:20 (1 data files) — data/latest.json","body":""},{"hash":"5263e1e","date":"2026-09-03 09:53:13 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-03T09:53:05 (1 data files) — data/latest.json","body":""},{"hash":"f0c5d71","date":"2026-09-02 09:35:46 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-02T09:35:20 (1 data files) — data/latest.json","body":""},{"hash":"dc40ae8","date":"2026-09-01 09:42:21 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-01T09:42:16 (1 data files) — data/latest.json","body":""},{"hash":"99b9662","date":"2026-08-31 09:29:10 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-31T09:29:05 (1 data files) — data/latest.json","body":""},{"hash":"9e95ec9","date":"2026-08-30 09:43:16 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-30T09:43:11 (1 data files) — data/latest.json","body":""},{"hash":"201e0b6","date":"2026-08-29 09:43:09 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-29T09:43:04 (1 data files) — data/latest.json","body":""},{"hash":"8273b35","date":"2026-08-28 09:39:34 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-28T09:39:28 (1 data files) — data/latest.json","body":""},{"hash":"1c4c4df","date":"2026-08-27 09:33:39 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-27T09:33:34 (1 data files) — data/latest.json","body":""},{"hash":"c7f03c2","date":"2026-08-26 09:38:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-26T09:38:32 (1 data files) — data/latest.json","body":""},{"hash":"2d6ecd0","date":"2026-08-25 10:48:54 -0700","author":"Steve","subject":"creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)","body":"Fleet inoculation — opening this basic-auth app with credentials in the URL\npoisoned document.baseURI and made relative fetch('/api/…') throw. Guard resolves\nnon-absolute request URLs against location instead. Ref: creds-in-url-fetch-guard-fleet-pattern.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"0ec0654","date":"2026-08-25 09:32:27 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-25T09:32:22 (1 data files) — data/latest.json","body":""},{"hash":"e807f8e","date":"2026-08-24 12:17:09 -0700","author":"Steve Abrams","subject":"ca-donations: materialized k-anon political rollup (political_agg) — agg endpoint fast + Basic-Auth gated (not public), refreshes on ingest","body":""},{"hash":"15aa128","date":"2026-08-24 12:03:17 -0700","author":"Steve","subject":"ca-donations: gated go-live runbook (Kamatera migration + nginx/cert + DNS + daily-loader launchd) — Steve-run","body":""},{"hash":"80ce7b1","date":"2026-08-24 12:00:22 -0700","author":"Steve Abrams","subject":"ca-donations: harden public gate — strict positive allowlist, Object.hasOwn agg validator, explicit column lists (Cody FIX-FIRST)","body":""},{"hash":"b285cb4","date":"2026-08-24 11:50:42 -0700","author":"Steve Abrams","subject":"ca-donations: public tier behind PUBLIC_TIER flag (default-off) — charitable open, political gated, k-anon aggregate rollups","body":"- per-path public allowlist in auth middleware, gated by PUBLIC_TIER (default off = byte-for-byte original fail-closed behavior)\n- /api/political stays Basic-Auth gated even in public tier; only /api/stats,/api/orgs,/api/org/:ein,/api/grants + static open\n- new /api/political/agg?by=recipient|employer|city|jurisdiction: grouped SUM/COUNT only, HAVING count(distinct donor_name)>=5 k-anon floor, no per-donor rows; behind SECOND flag PUBLIC_POLITICAL_AGG (default off)\n- qWithTimeout() bounds the agg full-table scan (8s -> clean 503) so a public endpoint can't hang a connection\n- X-Robots-Tag: noindex on /api/org/:ein; robots.txt (Disallow /api/); takedown.html; index.html public-mode banner + footer link\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1068eb4","date":"2026-08-24 11:45:09 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-24T11:44:27 (2 data files) — data/latest.json public/robots.txt","body":""},{"hash":"1aaea0a","date":"2026-08-24 09:36:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-24T09:36:43 (1 data files) — data/latest.json","body":""},{"hash":"30429c4","date":"2026-08-23 09:39:13 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-23T09:39:07 (1 data files) — data/latest.json","body":""},{"hash":"6af8822","date":"2026-08-23 07:48:35 -0700","author":"steve","subject":"ca-donations: href-to-deeper-data — chips are real drill anchors + URL-synced tab/filter state (deep-link/back-button), clears href-drill regression","body":""},{"hash":"b63091b","date":"2026-08-22 18:14:44 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-22T18:14:40 (1 data files) — data/latest.json","body":""},{"hash":"e220fe9","date":"2026-08-22 17:24:08 -0700","author":"Steve","subject":"ca-donations: freshness+completeness canary + data-quality audit (cycle 2)","body":"- scripts/freshness-canary.mjs: per-source freshness (stale run) AND row-presence\n  (ran-ok-but-0-rows) checks; emits PASS/WARN/FAIL to data/latest.json (fleet-health vocab)\n- caught a real bug on first run: fec_bulk reported ok/5000 but 0 rows landed in\n  political_contributions (federal contributions silently missing)\n- audit: 6.95M state contributions (2018-2026), 31995 legit negative amounts (refunds),\n  17 future-dated + 125 null-donor artifacts already filtered from serving (cycle 1)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8340af8","date":"2026-08-22 11:34:48 -0700","author":"Steve","subject":"ca-donations: FIX-FIRST hardening (Cody gate) — rate limit + data-quality guard","body":"- dependency-free in-memory rate limiter on /api/* (120 req/60s/IP -> 429): caps bulk donor-row scraping\n- POL_CLEAN guard: never serve future-dated (17) or null-donor (125) political artifacts as fact about named people\n- GRANT_CLEAN guard: filter placeholder grantees (See Schedule/Attached/Eligible Patients)\n- verified: 0 future/null rows served, 429 past cap, auth still 401 fail-closed\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"9e7508b","date":"2026-08-22 11:02:16 -0700","author":"Steve","subject":"ca-donations: wire server-side sort (mandatory sort rule) across all 3 families","body":"- whitelisted ORDER BY per endpoint (orgs: name/status/ntee; grants: amount/year/grantor; political: date/amount/donor/recipient)\n- frontend passes st.sort to /api/orgs, /api/grants, /api/political\n- verified: sort=amount surfaces Uber $45M / Congressional Leadership Fund $41.7M; sort=name alphabetizes orgs\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"37ac678","date":"2026-08-22 10:43:40 -0700","author":"Steve","subject":"ca-donations: political + foundation-grant ingest landed (both families live)","body":"- CAL-ACCESS 2018+ state contributions + FEC CA federal -> 6.95M political_contributions\n- 990-PF Part XV grants (top 200 CA foundations) -> 40.5K charitable_grants\n- ingest scripts: calaccess-political, fec-ca, 990-grants (adm-zip/unzipper/fast-xml-parser)\n- verified: /api/political + /api/grants serve real rows; both grid tabs now populate\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5197daa","date":"2026-08-21 08:45:54 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-21T08:45:49 (2 data files) — package-lock.json package.json","body":""},{"hash":"1be72ab","date":"2026-08-21 08:14:26 -0700","author":"Steve","subject":"ca-donations: Express server + Basic-Auth + searchable two-family grid UI","body":"- server.js: 401-gated API (/healthz, /api/stats, /api/orgs, /api/org/:ein, /api/grants, /api/political) with ILIKE search + drill endpoints\n- public/index.html: two-family grid with mandatory sort + density (localStorage), href-drill on every chip, honest 'ingest pending' state for political + grants\n- Verified: auth gate 401->200, stats=161410 orgs, live search returns real CZI/foundation records\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8c89370","date":"2026-08-21 08:12:10 -0700","author":"Steve","subject":"ca-donations: scaffold + schema + charitable ingest pipeline proven","body":"- Postgres schema: political_contributions + charitable_orgs/grants + sources/ingest_runs provenance\n- ProPublica CA-orgs ingest (free API) + CA AG registry-status ingest (free CSV, 161k CA charities loaded)\n- Join proven: orgs carry both NTEE metadata and CA AG status\n- Backbones spot-checked live; plan at ~/.claude/plans/use-high-codex-deep-lovely-sparrow.md\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n"}]}