Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
721e080 · 2026-08-07 · review(contrarian): wire panelist-mislabel guard onto the live verify write path
Contrarian red-team found assertNotPanelistMislabeledAsSponsor was a dead guard
(tested but never called on the write path). Fixes:
- POST /api/v1/review/:id/verify now loads the sighting, runs the guard, and
returns 409 + audit 'verify_blocked' on an evidence-less panelist->sponsor
promotion. Proven live: 409 block, 200 normal verify, audit recorded.
- BUILD_STATUS §36 row 4 rewritten to state the real enforcement point (honest).
Verified NOT bugs (contrarian false alarms, confirmed by reading): export
rights.js DOES filter 'contacts' (do_not_contact/export_allowed/suppression);
csv-import DOES reject no_source_evidence. Left csv pattern-email rejection OUT
by design (most real published business emails are first.last@ — rejecting the
pattern would drop valid observed contacts; §6.8 bans fabrication, not import).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
048b52e · 2026-08-07 · merge: full-spec fan-out (data+seed, compliance, UI/routes, connectors, export, docs+tests)
Node A (seed): 29 orgs incl. 5 verified advertisers + CoStar content-partner
(kept distinct, never mislabeled sponsor) + 22 panelists, 24 dated rate
snapshots, 45k/50k audience snapshots (unmerged), scores, classification +
reversible entity-resolution.
Node B (compliance): source-policy validator, LinkedIn host block, SSRF guard,
no-inferred-email, adapter contract + manual-review fallback, search provider
(manual, human-click LinkedIn URLs only).
Node C (UI): /api/v1 + Simple-View pages (advertisers/ads/conferences/contacts/
prospects/media-kit/sources/dashboard), adjustable-columns table engine,
CA/AZ + Verified-Only switches, Show-Me-Why drawer.
Node D (connectors): GA4/GSC fixture-backed importers (is_demo), CSV field-mapper
(refuses no-source contacts), Gmail/Ads off, email-upload parser, derived insights.
Node E (export): pure-node ZIP+XLSX+CSV, rights-aware Download-Everything,
self-contained offline executive-viewer.html.
Node F (docs+tests): 8 docs + README + 45 passing tests (0 fail).
Merge fixes: relocated 3 misfiled static assets to public/; fixed advertisers
GROUP BY (spurious MAX on ordered subquery). All endpoints 200, export valid,
43/43 source policies pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fb83652 · 2026-08-07 · spine: scaffold RENTV Advertiser Intelligence (Express+pg house stack)
- full canonical schema (49 tables, spec §11) + idempotent migration runner
- shared contract: lib/types (classification/category/role enums, normalizeName),
lib/scoring (exact §13 opportunity-score formula + explainScore)
- server.js skeleton with graceful optional route mounting, CSP/secure headers
- zero-dep .env loader, .env.example (§30), .gitignore
- db on local /tmp socket, database rentv_advertisers (migrated clean)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>