← back to Rentv
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
M public/closings.htmlM server.js
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
·
re-search: click items expand INLINE + left detail panel (no caa3fa7c →