demo: profiler index — ticker associations (direct, parent, co-permit)
J's framing: "if a contractor works for Target, future Target contracts
mean money flows back to the contractor — the ticker is an associated
indicator." Now the profiler index attaches three flavors of ticker per
contractor and renders them as colored pills:
green DIRECT contractor IS the public issuer (Target Corp → TGT)
amber PARENT contractor is a subsidiary of a public parent
(Turner Construction → HOC.DE via Hochtief AG)
blue ASSOCIATED contractor co-appears on permits with a public
entity (TORNOW, KYLE F → TGT, 3 shared permits with
TARGET CORPORATION)
The associated flavor is the correlation signal J described — it pulls
the ticker for whoever the contractor has been working *with*, not
just what they are themselves. Most contractors are private; the
associated link is how the moat shows up.
Server-side:
- entity.ts new export `lookupTickerLite(name)` — cheap in-memory
resolver that does only the SEC tickers index lookup + curated
KNOWN_PARENT_MAP check, no per-call SEC profile or Stooq fetch.
~10ms per name after the index is loaded once.
- /intelligence/profiler_index now runs a third Socrata pull
(5K permit pairs in window) to build a co-occurrence map. For each
contractor in the result, attaches:
.tickers.direct[] — name matches a public issuer
.tickers.associated[] — top 5 co-permit partners that resolve
to a ticker, with partner_name +
co_permits count + partner_via reason
Front-end:
- mcp-server/profiler.html — new .ticker-pill styles (3 colors per
attribution kind), pills render under the contractor name in the
table. Hover title gives the full reason path.
Verified end-to-end on the public URL:
search="tornow" → blue TGT pill, hint "Associated via co-permits
with TARGET CORPORATION (3 shared permits) —
TARGET CORP"
search="target" → green TGT × 2 (TARGET CORPORATION +
CORPORATION TARGET name variants both resolve
direct to the same issuer)
default top 200 → 15 ticker pills surface across the page including
JPM (via JPMORGAN CHASE BANK co-permits) and
parent-link tickers for the construction majors.
This commit is contained in:
@@ -30,6 +30,12 @@ td.name a:hover{text-decoration:underline}
|
||||
td.right{text-align:right;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums}
|
||||
td.role{font-size:10px;color:#8b949e}
|
||||
td.role .pill{display:inline-block;padding:2px 7px;border-radius:9px;font-size:9px;font-weight:600;background:#161b22;border:1px solid #21262d;color:#8b949e;margin-right:4px;text-transform:uppercase;letter-spacing:0.5px}
|
||||
.tickers{display:flex;gap:4px;flex-wrap:wrap;margin-top:3px}
|
||||
.ticker-pill{display:inline-block;padding:1px 7px;border-radius:5px;font-size:10px;font-weight:700;font-family:ui-monospace,SFMono-Regular,monospace;letter-spacing:0.3px;cursor:help}
|
||||
.ticker-pill.direct{background:#0d2818;border:1px solid #2ea04388;color:#3fb950}
|
||||
.ticker-pill.parent{background:#1a1410;border:1px solid #d2992288;color:#d29922}
|
||||
.ticker-pill.associated{background:#0d1830;border:1px solid #58a6ff66;color:#58a6ff}
|
||||
.ticker-pill.exact{background:#0d2818;border:1px solid #2ea043;color:#3fb950}
|
||||
.cost-band-1{color:#3fb950}
|
||||
.cost-band-2{color:#d29922}
|
||||
.cost-band-3{color:#f85149}
|
||||
@@ -181,6 +187,30 @@ function render(){
|
||||
a.target='_blank'; a.rel='noopener';
|
||||
a.textContent = r.name;
|
||||
ntd.appendChild(a);
|
||||
// Ticker association pills — direct (green) = the contractor is a
|
||||
// public issuer; parent (amber) = subsidiary of a public parent;
|
||||
// associated (blue) = co-appears on permits with a public entity.
|
||||
// Shows the correlation indicator J described — when Bob's Electric
|
||||
// works permits with Target, TGT renders here as associated.
|
||||
var t = r.tickers || {direct:[], associated:[]};
|
||||
var allTk = (t.direct||[]).concat(t.associated||[]);
|
||||
if(allTk.length){
|
||||
var trk = document.createElement('div'); trk.className='tickers';
|
||||
allTk.forEach(function(x){
|
||||
var p = document.createElement('span');
|
||||
p.className = 'ticker-pill ' + (x.via||'direct');
|
||||
p.textContent = x.ticker;
|
||||
// Tooltip shows the full reason path
|
||||
var hint = x.via === 'associated'
|
||||
? 'Associated via co-permits with '+x.partner_name+' ('+(x.co_permits||0)+' shared permits)' + (x.matched_name ? ' — '+x.matched_name : '')
|
||||
: x.via === 'parent'
|
||||
? 'Subsidiary of '+(x.matched_name||x.ticker) + (x.exchange ? ' · '+x.exchange : '')
|
||||
: 'Direct match: '+(x.matched_name||r.name);
|
||||
p.title = hint;
|
||||
trk.appendChild(p);
|
||||
});
|
||||
ntd.appendChild(trk);
|
||||
}
|
||||
tr.appendChild(ntd);
|
||||
var ptd=document.createElement('td'); ptd.className='right';
|
||||
ptd.textContent=(r.permits||0).toLocaleString();
|
||||
|
||||
Reference in New Issue
Block a user