{"slug":"rentv-adintel","total":5,"limit":100,"offset":0,"since":null,"commits":[{"hash":"721e080","date":"2026-08-07 18:18:06 -0700","author":"Steve Abrams","subject":"review(contrarian): wire panelist-mislabel guard onto the live verify write path","body":"Contrarian red-team found assertNotPanelistMislabeledAsSponsor was a dead guard\n(tested but never called on the write path). Fixes:\n- POST /api/v1/review/:id/verify now loads the sighting, runs the guard, and\n  returns 409 + audit 'verify_blocked' on an evidence-less panelist->sponsor\n  promotion. Proven live: 409 block, 200 normal verify, audit recorded.\n- BUILD_STATUS §36 row 4 rewritten to state the real enforcement point (honest).\nVerified NOT bugs (contrarian false alarms, confirmed by reading): export\nrights.js DOES filter 'contacts' (do_not_contact/export_allowed/suppression);\ncsv-import DOES reject no_source_evidence. Left csv pattern-email rejection OUT\nby design (most real published business emails are first.last@ — rejecting the\npattern would drop valid observed contacts; §6.8 bans fabrication, not import).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"048b52e","date":"2026-08-07 18:11:58 -0700","author":"Steve Abrams","subject":"merge: full-spec fan-out (data+seed, compliance, UI/routes, connectors, export, docs+tests)","body":"Node A (seed): 29 orgs incl. 5 verified advertisers + CoStar content-partner\n  (kept distinct, never mislabeled sponsor) + 22 panelists, 24 dated rate\n  snapshots, 45k/50k audience snapshots (unmerged), scores, classification +\n  reversible entity-resolution.\nNode B (compliance): source-policy validator, LinkedIn host block, SSRF guard,\n  no-inferred-email, adapter contract + manual-review fallback, search provider\n  (manual, human-click LinkedIn URLs only).\nNode C (UI): /api/v1 + Simple-View pages (advertisers/ads/conferences/contacts/\n  prospects/media-kit/sources/dashboard), adjustable-columns table engine,\n  CA/AZ + Verified-Only switches, Show-Me-Why drawer.\nNode D (connectors): GA4/GSC fixture-backed importers (is_demo), CSV field-mapper\n  (refuses no-source contacts), Gmail/Ads off, email-upload parser, derived insights.\nNode E (export): pure-node ZIP+XLSX+CSV, rights-aware Download-Everything,\n  self-contained offline executive-viewer.html.\nNode F (docs+tests): 8 docs + README + 45 passing tests (0 fail).\n\nMerge fixes: relocated 3 misfiled static assets to public/; fixed advertisers\nGROUP BY (spurious MAX on ordered subquery). All endpoints 200, export valid,\n43/43 source policies pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"806e0b0","date":"2026-08-07 16:57:39 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T16:56:57 (8 data files) — README.md docs/ADVERTISER_RESEARCH_METHOD.md docs/ADVERTISER_SOURCE_REGISTER.md docs/ANALYTICS_CONNECTORS.md docs/DEPLOYMENT_ADVERTISER_VIEWER.md","body":""},{"hash":"a0476ab","date":"2026-08-07 16:26:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T16:25:56 (10 data files) — docs/ADVERTISER_DATA_POLICY.md docs/ADVERTISER_INTELLIGENCE_BUILD_STATUS.md fixtures/ga4-acquisition.json fixtures/ga4-daily.json fixtures/ga4-geo.json","body":""},{"hash":"fb83652","date":"2026-08-07 16:19:12 -0700","author":"Steve Abrams","subject":"spine: scaffold RENTV Advertiser Intelligence (Express+pg house stack)","body":"- full canonical schema (49 tables, spec §11) + idempotent migration runner\n- shared contract: lib/types (classification/category/role enums, normalizeName),\n  lib/scoring (exact §13 opportunity-score formula + explainScore)\n- server.js skeleton with graceful optional route mounting, CSP/secure headers\n- zero-dep .env loader, .env.example (§30), .gitignore\n- db on local /tmp socket, database rentv_advertisers (migrated clean)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n"}]}