[object Object]

← back to La Socrata Ingester

yoloforever c4 FIX (Cody): deals feed ranks by lead_score, dedups address, flags outliers

60f88517a801909d116970613ba571ad2aada2ef · 2026-08-12 06:59:11 -0700 · steve

Cody c4 (verified): raw-max-valuation surfaced LAX 3x + a $375M 'addition'. Now:
(1) DISTINCT ON (address,zip) dedups same-project permits; (2) ORDER BY lead_score
then valuation = newsworthiness not brute dollars (ground-up dev now leads, airport
gone); (3) valuation_outlier flag (>$100M or >150x parcel assessed) tags data
artifacts for editorial verify. Now publishable as RE-news leads.

Files touched

Diff

commit 60f88517a801909d116970613ba571ad2aada2ef
Author: steve <steve@designerwallcoverings.com>
Date:   Wed Aug 12 06:59:11 2026 -0700

    yoloforever c4 FIX (Cody): deals feed ranks by lead_score, dedups address, flags outliers
    
    Cody c4 (verified): raw-max-valuation surfaced LAX 3x + a $375M 'addition'. Now:
    (1) DISTINCT ON (address,zip) dedups same-project permits; (2) ORDER BY lead_score
    then valuation = newsworthiness not brute dollars (ground-up dev now leads, airport
    gone); (3) valuation_outlier flag (>$100M or >150x parcel assessed) tags data
    artifacts for editorial verify. Now publishable as RE-news leads.
---
 scripts/deals-feed.js | 42 +++++++++++++++++++++++++++---------------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/scripts/deals-feed.js b/scripts/deals-feed.js
index b60ed12..211145a 100644
--- a/scripts/deals-feed.js
+++ b/scripts/deals-feed.js
@@ -37,29 +37,41 @@ async function main() {
   const names = await cdNames();
   fs.mkdirSync(OUT, { recursive: true });
 
+  // Dedup to one permit per address+zip (highest valuation), then rank by lead_score
+  // (encodes recency/type/status newsworthiness), valuation as tiebreak (Cody c4:
+  // raw-max-valuation surfaces the same airport 3x + institutional infra, not deals).
   const rows = (await q(`
-    SELECT p.permit_nbr, to_char(p.issue_date,'YYYY-MM-DD') AS issued, p.primary_address AS address, p.zip_code AS zip,
-           p.council_district AS cd, p.permit_type AS work_type, p.permit_sub_type AS building_type,
-           p.use_desc, p.valuation AS project_value, p.work_desc AS scope, p.lat, p.lon,
-           a.total_value AS assessed_value, a.year_built, a.sqft_main AS sqft,
-           permit_lead_score(p.issue_date,p.valuation,p.permit_type,p.permit_sub_type,p.status_desc) AS lead_score
-    FROM la_building_permits_raw p
-    LEFT JOIN la_assessor_parcels_raw a ON a.ain=p.apn AND a.roll_year='2025'
-    WHERE p.dataset_id='pi9x-tg5x' AND p.status_desc='Issued'
-      AND p.issue_date >= now() - ($1||' days')::interval
-      AND p.valuation >= $2 AND p.primary_address IS NOT NULL
-    ORDER BY p.valuation DESC NULLS LAST
-    LIMIT 60`, [DAYS, MIN_VALUE])).rows;
+    WITH ranked AS (
+      SELECT DISTINCT ON (p.primary_address, p.zip_code)
+             p.permit_nbr, to_char(p.issue_date,'YYYY-MM-DD') AS issued, p.primary_address AS address, p.zip_code AS zip,
+             p.council_district AS cd, p.permit_type AS work_type, p.permit_sub_type AS building_type,
+             p.use_desc, p.valuation AS project_value, p.work_desc AS scope, p.lat, p.lon,
+             a.total_value AS assessed_value, a.year_built, a.sqft_main AS sqft,
+             permit_lead_score(p.issue_date,p.valuation,p.permit_type,p.permit_sub_type,p.status_desc) AS lead_score
+      FROM la_building_permits_raw p
+      LEFT JOIN la_assessor_parcels_raw a ON a.ain=p.apn AND a.roll_year='2025'
+      WHERE p.dataset_id='pi9x-tg5x' AND p.status_desc='Issued'
+        AND p.issue_date >= now() - ($1||' days')::interval
+        AND p.valuation >= $2 AND p.primary_address IS NOT NULL
+      ORDER BY p.primary_address, p.zip_code, p.valuation DESC
+    )
+    SELECT * FROM ranked ORDER BY lead_score DESC, project_value DESC LIMIT 60
+  `, [DAYS, MIN_VALUE])).rows;
 
   const deals = rows.map(r => {
     const member = names[r.cd];
     const cdTag = r.cd ? `CD ${r.cd}${member ? ' · ' + member : ''}` : '';
-    const headline = `${millions(r.project_value)} ${useKind(r.work_type)} — ${r.address}${r.zip ? ', ' + r.zip : ''}${cdTag ? ' (' + cdTag + ')' : ''}`;
+    const pv = Number(r.project_value);
+    const assessed = r.assessed_value == null ? null : Number(r.assessed_value);
+    // Flag suspicious valuations for editorial verification (Cody c4: LADBS valuation is
+    // self-reported): institutional-scale (>$100M) or wildly > parcel assessed value.
+    const outlier = pv > 100e6 || (assessed && assessed > 0 && pv / assessed > 150);
+    const headline = `${millions(pv)} ${useKind(r.work_type)} — ${r.address}${r.zip ? ', ' + r.zip : ''}${cdTag ? ' (' + cdTag + ')' : ''}${outlier ? ' ⚠verify' : ''}`;
     return {
       headline, permit_nbr: r.permit_nbr, issued: r.issued, address: r.address, zip: r.zip,
       council_district: r.cd, council_member: member || null, kind: useKind(r.work_type),
-      work_type: r.work_type, building_type: r.building_type, project_value: Number(r.project_value),
-      assessed_value: r.assessed_value == null ? null : Number(r.assessed_value),
+      work_type: r.work_type, building_type: r.building_type, project_value: pv,
+      assessed_value: assessed, valuation_outlier: outlier,
       year_built: (r.year_built && String(r.year_built) !== '0') ? r.year_built : null,
       sqft: r.sqft == null ? null : Number(r.sqft),
       lead_score: r.lead_score, scope: r.scope,

← 909b171 yoloforever c4: newsworthy permit deals feed (scripts/deals-  ·  back to La Socrata Ingester  ·  yoloforever c5: permit_lead_score_v2 — parcel-signal teardow 48faabe →