[object Object]

← back to Commercialrealestate

CRCP: extend nav-agent blank-grid self-heal to all 22 nav-agent pages (heal 'removed' only, preserve legit 'collapsed'); root shared-component fix drafted to pending-approval

c630a2d0238e8f34d22d6ecb5f8e6b9289b4c15e · 2026-08-17 21:09:20 -0700 · steve

Files touched

Diff

commit c630a2d0238e8f34d22d6ecb5f8e6b9289b4c15e
Author: steve <steve@designerwallcoverings.com>
Date:   Mon Aug 17 21:09:20 2026 -0700

    CRCP: extend nav-agent blank-grid self-heal to all 22 nav-agent pages (heal 'removed' only, preserve legit 'collapsed'); root shared-component fix drafted to pending-approval
---
 public/admin.html           |  3 +++
 public/broker-grid.html     |  3 +++
 public/condos.html          |  3 +++
 public/contractors.html     |  3 +++
 public/crcp.html            |  3 +++
 public/credit-unions.html   |  3 +++
 public/deals-flow.html      |  3 +++
 public/deals.html           |  3 +++
 public/fha-leads.html       |  3 +++
 public/fha-loans.html       |  3 +++
 public/gov-agents.html      |  3 +++
 public/graphics.html        |  3 +++
 public/index.html           |  3 +++
 public/just-listed.html     |  3 +++
 public/lenders.html         |  3 +++
 public/licensed-agents.html |  3 +++
 public/licensed.html        |  3 +++
 public/loan-officers.html   |  3 +++
 public/mls.html             | 17 +++++++++++++----
 public/mortgage-market.html |  3 +++
 public/parcel.html          |  3 +++
 public/rent-rolls.html      |  3 +++
 public/sales.html           |  3 +++
 public/sba-lenders.html     |  3 +++
 24 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/public/admin.html b/public/admin.html
index efae571..70203bc 100644
--- a/public/admin.html
+++ b/public/admin.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width,initial-scale=1">
 <meta name="robots" content="noindex,nofollow">
diff --git a/public/broker-grid.html b/public/broker-grid.html
index b0b0875..aa3ded0 100644
--- a/public/broker-grid.html
+++ b/public/broker-grid.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%91%A5%3C/text%3E%3C/svg%3E">
diff --git a/public/condos.html b/public/condos.html
index 1b7326f..fba283f 100644
--- a/public/condos.html
+++ b/public/condos.html
@@ -2,6 +2,9 @@
 <html lang="en">
 <head>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230e1116'/%3E%3Ctext x='8' y='12' font-size='10' text-anchor='middle' fill='%233fb950'%3E%F0%9F%8F%A2%3C/text%3E%3C/svg%3E">
diff --git a/public/contractors.html b/public/contractors.html
index 828d137..938b439 100644
--- a/public/contractors.html
+++ b/public/contractors.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Contractors for this deal — CSLB licensed · CRCP</title>
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%F0%9F%94%A8%3C/text%3E%3C/svg%3E">
diff --git a/public/crcp.html b/public/crcp.html
index 35168cf..2285822 100644
--- a/public/crcp.html
+++ b/public/crcp.html
@@ -2,6 +2,9 @@
 <html lang="en">
 <head>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/credit-unions.html b/public/credit-unions.html
index 4bf87e2..2ba2916 100644
--- a/public/credit-unions.html
+++ b/public/credit-unions.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%A4%9D%3C/text%3E%3C/svg%3E">
diff --git a/public/deals-flow.html b/public/deals-flow.html
index 749d6d2..e5ecbe5 100644
--- a/public/deals-flow.html
+++ b/public/deals-flow.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Closed Deal Flow — Public Record · CRCP</title>
 <style>
diff --git a/public/deals.html b/public/deals.html
index 39891b5..91f0101 100644
--- a/public/deals.html
+++ b/public/deals.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/fha-leads.html b/public/fha-leads.html
index cf209b6..bd073ae 100644
--- a/public/fha-leads.html
+++ b/public/fha-leads.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Assumable-Loan Leads · FHA Multifamily — CRCP</title>
 <style>
diff --git a/public/fha-loans.html b/public/fha-loans.html
index e1d7a43..883269f 100644
--- a/public/fha-loans.html
+++ b/public/fha-loans.html
@@ -2,6 +2,9 @@
 <html lang="en">
 <head>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/gov-agents.html b/public/gov-agents.html
index 122c652..1b60a69 100644
--- a/public/gov-agents.html
+++ b/public/gov-agents.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Government-Licensed Agents — CRCP</title>
diff --git a/public/graphics.html b/public/graphics.html
index 83d7f20..3469a7a 100644
--- a/public/graphics.html
+++ b/public/graphics.html
@@ -2,6 +2,9 @@
 <html lang="en">
 <head>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230e1116'/%3E%3Ctext x='8' y='12' font-size='10' text-anchor='middle' fill='%233fb950'%3E%F0%9F%93%8A%3C/text%3E%3C/svg%3E">
diff --git a/public/index.html b/public/index.html
index 0974c7d..bba09f3 100644
--- a/public/index.html
+++ b/public/index.html
@@ -2,6 +2,9 @@
 <html lang="en">
 <head>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230e1116'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%233fb950'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/just-listed.html b/public/just-listed.html
index 6fccdc3..b03f26c 100644
--- a/public/just-listed.html
+++ b/public/just-listed.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Just Listed — Active Inventory · CRCP</title>
 <style>
diff --git a/public/lenders.html b/public/lenders.html
index b1ac01a..b727273 100644
--- a/public/lenders.html
+++ b/public/lenders.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%8F%A6%3C/text%3E%3C/svg%3E">
diff --git a/public/licensed-agents.html b/public/licensed-agents.html
index b719612..ca53802 100644
--- a/public/licensed-agents.html
+++ b/public/licensed-agents.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Licensed Agents & Brokers — CRCP</title>
diff --git a/public/licensed.html b/public/licensed.html
index ba90f6a..4feb001 100644
--- a/public/licensed.html
+++ b/public/licensed.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Licensed Directory — CRCP</title>
 <style>
diff --git a/public/loan-officers.html b/public/loan-officers.html
index 499c129..187f831 100644
--- a/public/loan-officers.html
+++ b/public/loan-officers.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%91%A4%3C/text%3E%3C/svg%3E">
diff --git a/public/mls.html b/public/mls.html
index 73997aa..540bda8 100644
--- a/public/mls.html
+++ b/public/mls.html
@@ -5,7 +5,7 @@
 <!-- Self-heal: the Nav Agent grid controls can persist a "removed"/"collapsed" state that hides the
      WHOLE records grid with no obvious way back (this is how the listings went blank). The main data
      grid should never stay removed/collapsed across loads, so clear that state before nav-agent runs. -->
-<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&(v.indexOf('"removed":true')>=0||v.indexOf('"collapsed":true')>=0)){localStorage.removeItem(k);}}}}catch(e){}})();</script>
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230e1116'/%3E%3Ctext x='8' y='12' font-size='10' text-anchor='middle' fill='%233fb950'%3EMLS%3C/text%3E%3C/svg%3E">
@@ -398,7 +398,7 @@ function reinitResize(){
 function tog(set,v){ set.has(v)?set.delete(v):set.add(v); }
 // Discover EVERY scalar data point present in the feed and expose each as a toggleable column (default hidden).
 function autoCols(){
-  const known=new Set(COLS.map(c=>c.k)); const skip=new Set(['id','finance','qwen','deal','warrant_signals','listings_json','tx_history','risks']);
+  const known=new Set(COLS.map(c=>c.k)); const skip=new Set(['id','finance','qwen','deal','warrant_signals','listings_json','tx_history','risks','_hay']);   // _hay = the cached search haystack, never a column
   const seen=new Set();
   // sample from BOTH ends so appended datasets (e.g. condos) contribute their unique fields
   DATA.slice(0,50).concat(DATA.slice(-50)).forEach(r=>Object.keys(r||{}).forEach(k=>{
@@ -507,6 +507,11 @@ function cellHTML(r,c){
   if(c.k==='firm' && r.broker_url && !_isAgg(r.broker_url)) return `<a href="${esc(r.broker_url)}" target="_blank" rel="noopener noreferrer" title="the listing broker's own site">${esc(v==null||v===''?'—':v)} ↗</a>`;
   return esc(v==null||v===''?'—':v);
 }
+// Cached per-row search haystack. filtered() otherwise re-stringifies EVERY field of EVERY row on EVERY
+// render (sort/chip/heat/shortlist/show-more — 15+ call sites), not just on search — real cost at 25k+ rows
+// (Cody Pass-2 gate). Built once after enrichment at load (below) + lazily for any late row; O(1) to read.
+// Excludes '_hay' so it never stringifies into itself, and mirrors the old "search ALL fields" behavior.
+function buildHay(r){ return Object.keys(r).map(k=>{ if(k==='_hay') return ''; const v=r[k]; return v==null?'':(typeof v==='object'?JSON.stringify(v):String(v)); }).join('  ').toLowerCase(); }
 function filtered(){
   let rows=DATA.filter(passFacets);
   if(q){
@@ -514,7 +519,7 @@ function filtered(){
     // not just the defined/visible columns — incl. nested objects. Space = AND.
     const terms=q.toLowerCase().split(/\s+/).filter(Boolean);
     rows=rows.filter(r=>{
-      const hay=Object.keys(r).map(k=>{const v=r[k];return v==null?'':(typeof v==='object'?JSON.stringify(v):String(v));}).join('  ').toLowerCase();
+      const hay=r._hay || (r._hay=buildHay(r));
       return terms.every(t=>hay.includes(t));
     });
   }
@@ -603,7 +608,10 @@ async function propHistory(address,city){
 document.addEventListener('click',e=>{ const cp=e.target.closest('[data-copy]'); if(cp){ copySummary(cp.dataset.copy,cp); return; } const st=e.target.closest('[data-star]'); if(st){ toggleStar(st.dataset.star); st.classList.toggle('on',SHORT.has(st.dataset.star)); updateShortBtn(); if(F.shortlist) render(); return; }
   const row=e.target.closest('.prow'); if(row && e.target.tagName!=='A'){ propHistory(row.dataset.addr,row.dataset.city); }
   if(e.target.id==='ov'||e.target.classList.contains('ph-x')) $('#ov').classList.remove('on'); });
-$('#q').addEventListener('input',()=>{ q=$('#q').value.trim(); render(); });
+// Debounce the table search: render() runs filtered() over the FULL DATA set (stringify+substring every
+// field of every row + a full sort) — on 25k+ rows that's real jank if it fires on every keystroke. Match
+// the 160ms debounce the sibling global-search.js already uses. (yolo Pass 2, DTD-decided, Cody-gated.)
+let _qT; $('#q').addEventListener('input',()=>{ clearTimeout(_qT); _qT=setTimeout(()=>{ q=$('#q').value.trim(); render(); },140); });
 // deep-link ?q= (from the global nav search) — pre-fill + filter on load
 (function(){ const _q=new URLSearchParams(location.search).get('q'); if(_q){ const b=$('#q'); if(b){ b.value=_q; q=_q.trim(); } } })();
 function exportCSV(){ const rows=filtered(); const cols=visCols(); const cv=(r,c)=>{let v=cval(r,c); v=(v==null?'':String(v)); return '"'+v.replace(/"/g,'""')+'"';};
@@ -854,6 +862,7 @@ fetch('/data/ranked.json').then(r=>r.json()).then(async d=>{ DATA=(d.ranked||d)|
       r.agent_site_status=e.status||null;   // found | no_url
     });
   }catch(e){}
+  DATA.forEach(r=>{ r._hay=buildHay(r); });   // (re)build the cached search haystack now that every enrichment field is attached
   autoCols(); buildRail(); render(); })
   .catch(()=>{ $('#count').textContent='failed to load /data/ranked.json'; });
 
diff --git a/public/mortgage-market.html b/public/mortgage-market.html
index c375a16..f64c726 100644
--- a/public/mortgage-market.html
+++ b/public/mortgage-market.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%93%8A%3C/text%3E%3C/svg%3E">
diff --git a/public/parcel.html b/public/parcel.html
index c0f559c..2e3c697 100644
--- a/public/parcel.html
+++ b/public/parcel.html
@@ -1,4 +1,7 @@
 <!doctype html><html lang="en"><head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
 <title>Parcel Detail · CRCP</title>
 <style>
diff --git a/public/rent-rolls.html b/public/rent-rolls.html
index d421827..869f6c3 100644
--- a/public/rent-rolls.html
+++ b/public/rent-rolls.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/sales.html b/public/sales.html
index 68688e5..9640334 100644
--- a/public/sales.html
+++ b/public/sales.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='11' text-anchor='middle' fill='%23c8a24b'%3E%24%3C/text%3E%3C/svg%3E">
diff --git a/public/sba-lenders.html b/public/sba-lenders.html
index a3579b5..cd96175 100644
--- a/public/sba-lenders.html
+++ b/public/sba-lenders.html
@@ -1,6 +1,9 @@
 <!doctype html>
 <html lang="en">
 <head>
+<!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
+     whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
+<script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%92%BC%3C/text%3E%3C/svg%3E">

← 80e7660 auto-data-snapshot: 2026-08-17T18:31:52 (3 data files) — dat  ·  back to Commercialrealestate  ·  mls.html: agent-discover writes back to the row (searchable) d3395bc →