1e83966049
Two scoring bugs inflated the rankings: - Substring matching: 'rag' matched sto[rag]e / tet[rag]on, 'intern' matched inte[rnal], 'lead' matched [lead]ership. Roche's staff restaurant and Cisco Tetragon roles scored as fits. Now keywords must not be flanked by alphanumerics (c#/.net/c++ keep matching). - Body boilerplate: every Kraken post mentions crypto/blockchain/trading, so sales/PM/design roles scored as high as engineering ones. Title matches now score full weight, body-only matches half (min 1); negatives still count fully anywhere. Strong-fit count drops 13 -> 5; the bogus 'intern' negatives and rag false positives are gone. Shared _kw_in() also backs the title filter. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>