[object Object]

← back to Rentv 2026

Cody-gate: buyer/seller/broker are now admin-editable (added to CLOSE_FIELDS + F + modal inputs) — an admin can correct a wrong LLM-extracted party, and the GET merge's edits-last precedence makes the correction win over the corpus

dfe922fe3b7911af7eede90a70de58c2a6f9eeb7 · 2026-08-05 14:50:05 -0700 · Steve Abrams

Files touched

Diff

commit dfe922fe3b7911af7eede90a70de58c2a6f9eeb7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 5 14:50:05 2026 -0700

    Cody-gate: buyer/seller/broker are now admin-editable (added to CLOSE_FIELDS + F + modal inputs) — an admin can correct a wrong LLM-extracted party, and the GET merge's edits-last precedence makes the correction win over the corpus
---
 public/closings.html | 7 ++++++-
 server.js            | 4 +++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/public/closings.html b/public/closings.html
index c7dea5a6..1388eb06 100644
--- a/public/closings.html
+++ b/public/closings.html
@@ -164,6 +164,11 @@
           <label>Year built<input id="f_year_built" placeholder="1998"></label>
           <label>Headline / title<input id="f_title" placeholder="Investor buys downtown tower"></label>
         </div>
+        <div class="row">
+          <label>Buyer<input id="f_buyer" placeholder="Acquiring party"></label>
+          <label>Seller<input id="f_seller" placeholder="Selling party"></label>
+        </div>
+        <label>Broker<input id="f_broker" placeholder="Brokerage / agent"></label>
         <label>Image URL<input id="f_image" placeholder="https://… (optional)"></label>
         <label>Summary / notes<textarea id="f_summary" placeholder="Optional details about the transaction"></textarea></label>
       </form>
@@ -271,7 +276,7 @@ function render(){
 }
 
 // ── editor modal ──
-const F=['id','address','city','state','property_type','amount_label','close_date','size_label','year_built','title','image','summary'];
+const F=['id','address','city','state','property_type','amount_label','close_date','size_label','year_built','title','image','summary','buyer','seller','broker'];
 function openAdd(){
   $('#mTitle').textContent='Add closing'; $('#mMsg').textContent='';
   F.forEach(k=>{const el=$('#f_'+k);if(el)el.value='';});
diff --git a/server.js b/server.js
index c6a6f2a7..4928ee51 100644
--- a/server.js
+++ b/server.js
@@ -304,7 +304,9 @@ app.get('/api/unified-search', adminOnly, (req, r) => {
 //    { adds:[…], edits:{ id:{fields} }, hides:[ id… ] }. GET merges all of it; neither pull
 //    NOR the crawl ever clobbers a manual edit/add/hide. ──
 const CLOSINGS_OV = 'closings-overrides.json';
-const CLOSE_FIELDS = ['title', 'address', 'city', 'state', 'property_type', 'amount_label', 'size_label', 'year_built', 'close_date', 'image', 'summary'];
+// buyer/seller/broker included so an admin can CORRECT a wrong LLM-extracted party — the GET merge
+// spreads `edits` last, so a manual correction wins over the corpus-enriched value.
+const CLOSE_FIELDS = ['title', 'address', 'city', 'state', 'property_type', 'amount_label', 'size_label', 'year_built', 'close_date', 'image', 'summary', 'buyer', 'seller', 'broker'];
 const readCloseOv = () => readJSON(CLOSINGS_OV, { adds: [], edits: {}, hides: [], updated_at: null });
 const writeCloseOv = (o) => fs.writeFileSync(path.join(DATA, CLOSINGS_OV), JSON.stringify(o, null, 1));
 // A corpus Sale article whose title says it is being marketed, not closed → NOT a closing.

← 676a7464 PR intel: tighten LinkedIn slug guard to require surname (Co  ·  back to Rentv 2026  ·  re-search: click items expand INLINE + left detail panel (no caa3fa7c →