From 875cfadc3d6317d1678ae87805cb74d304b53a79 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Apr 2026 15:36:53 -0500 Subject: [PATCH] Graceful sparse data: show what exists, hide what doesn't MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Worker cards now handle sparse-to-rich data gracefully: - Name only? Shows name + 'New — data builds with placements' - Name + role? Shows name + role tag - Name + role + skills + certs? Shows full tag row - Has reliability data? Shows colored meter bars - No metrics? No empty bars, no 0% — just what's there Contract cards: urgency dot, progress bar, fill count. Workers inside: avatar initials, name, role, location, skill/cert tags (blue/green), archetype (purple), reliability/availability bars — all ONLY when data exists. GitHub-style dark theme. Call/SMS per worker. Search collapsed. ADR-021 compliant: works with a name and earns everything else. Co-Authored-By: Claude Opus 4.6 (1M context) --- mcp-server/search.html | 467 ++++++++++++++--------------------------- 1 file changed, 154 insertions(+), 313 deletions(-) diff --git a/mcp-server/search.html b/mcp-server/search.html index a6c32b9..caa9d06 100644 --- a/mcp-server/search.html +++ b/mcp-server/search.html @@ -4,331 +4,172 @@ Staffing Co-Pilot -
-

Staffing Co-Pilot

-
Loading...
-
+

Staffing Co-Pilot

Loading...
-
- -
Loading your day...
- -
- 🔍 Search all 500,000 workers - -
- - -
- -
-
- - +
Your Contracts
+
Loading...
+
Search workers
+ +
+
+
+
- - +function doSearch(){ +var q=document.getElementById('sq').value.trim();if(!q)return; +var st=document.getElementById('sst').value,rl=document.getElementById('srl').value; +var out=document.getElementById('sresults');out.textContent='Searching...'; +var f="CAST(reliability AS DOUBLE)>=0.5"; +if(st)f+=" AND state='"+st+"'";if(rl)f+=" AND role='"+rl+"'"; +fetch(A+'/search',{method:'POST',headers:{'Content-Type':'application/json'}, +body:JSON.stringify({question:q,index_name:'workers_500k_v1',sql_filter:f,dataset:'workers_500k',id_column:'worker_id',top_k:8,generate:false}) +}).then(function(r){return r.json()}).then(function(d){ +out.textContent='';var src=d.sources||[];if(!src.length){out.textContent='No matches.';return} +var h=document.createElement('div');h.style.cssText='color:#8b949e;font-size:11px;margin-bottom:8px'; +h.textContent=(d.sql_matches||0)+' matches, '+src.length+' best ('+(d.duration_ms||0)+'ms)';out.appendChild(h); +src.forEach(function(s,i){var w=pw(s.chunk_text);if(!w.nm)w.nm=s.doc_id; +var wk=document.createElement('div');wk.className='wk';wk.style.cssText='background:#161b22;border:1px solid #21262d;border-radius:8px;margin-bottom:6px'; +var av=document.createElement('div');av.className='av';av.style.background=AC[i%AC.length]; +av.textContent=(w.nm||'?').split(' ').map(function(n){return(n[0]||'').toUpperCase()}).join('').substring(0,2);wk.appendChild(av); +var bd=document.createElement('div');bd.className='bd'; +var nm=document.createElement('span');nm.className='nm';nm.textContent=w.nm;bd.appendChild(nm); +if(w.role||w.loc){var rl=document.createElement('span');rl.className='loc';rl.textContent=[w.role,w.loc].filter(Boolean).join(' · ');bd.appendChild(rl)} +if(w.skills.length||w.certs.length){var tgs=document.createElement('div');tgs.className='tags'; +w.skills.forEach(function(s){var t=document.createElement('span');t.className='tg s';t.textContent=s.trim();tgs.appendChild(t)}); +w.certs.forEach(function(c){var t=document.createElement('span');t.className='tg c';t.textContent=c.trim();tgs.appendChild(t)});bd.appendChild(tgs)} +if(w.hasM){var mt=document.createElement('div');mt.className='meters';addM(mt,'Rel',w.rel);addM(mt,'Avail',w.avail);bd.appendChild(mt)} +wk.appendChild(bd);out.appendChild(wk)}) +}).catch(function(e){out.textContent='Error: '+e.message})} +