Repository navigation
Expand file tree
/
Copy pathcompany.ts
More file actions
529 lines (498 loc) · 28.6 KB
/
Copy pathcompany.ts
File metadata and controls
529 lines (498 loc) · 28.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
// Company-specific configuration for the GitHub scraper.
// To adapt this scraper for a different company, duplicate this file and update the values.
//
export interface CriterionDefinition {
key: string;
label: string;
tiers: { [tier: number]: string };
weight?: number; // Default 1. Higher weight = more impact on total score.
}
export const companyConfig: {
name: string;
description: string;
githubOrg: string;
engineerArchetypes: string[];
criteria: CriterionDefinition[];
// Maximum possible sum of tier scores (for normalization if needed)
maxTierSum: number;
teamMembers: string[];
seedProfiles: string[];
ratingPrompt: string;
} = {
name: 'Rogo',
description:
'AI platform for investment banking and private equity - presentation generation, Excel automation, and investment research',
githubOrg: 'rogodata',
// Engineer archetypes used for classification
engineerArchetypes: [
'full-stack',
'frontend',
'backend/infra',
'ML engineer',
'AI engineer',
'AI researcher/scientist',
'data engineer',
'Other',
'None',
],
// Scoring criteria with tier definitions.
// Each criterion is scored 0-3 by the LLM.
// The final score is the simple sum of all criterion scores.
criteria: [
{
key: 'startup_experience',
label: 'Startup Experience',
weight: 5,
tiers: {
0: 'No startup experience or non-technical startup roles. Also use for someone who has spent their entire career (10+ years) at one or two large corporations (e.g., Bloomberg, IBM, Oracle, Microsoft, Google) without any startup involvement - these candidates are very unlikely to thrive in a fast-moving Series B environment.',
1: 'Worked at a startup in a hands-on engineering role, but not a well-known or fast-growing one. Indie hackers and solo SaaS builders without significant traction also fall here.',
2: 'Founding engineer or early engineer at a startup with some validation (known investors, meaningful revenue, or growing team)',
3: 'Founded or co-founded a productivity/AI/fintech startup with strong validation (tier-1 VC funding, acquisition, significant traction)',
},
},
{
key: 'ai_agent_experience',
label: 'AI / Agent Experience',
weight: 3,
tiers: {
0: 'No AI or agent experience',
1: 'General interest, courses, or minor AI or agent projects',
2: 'Built AI-powered tools or applied AI or agent in a real product. Corporate ML/inference infrastructure (model serving, ML pipelines) at large companies falls here, not tier 3.',
3: 'Shipped AI agents, RAG systems, text-to-SQL, document processing, or research automation in production. Must be building the AI-powered product itself, not just the infra/platform underneath it.',
},
},
{
key: 'productivity_software',
label: 'Productivity Software',
tiers: {
0: 'No relevant experience building productivity software. Simple/non-innovative tools (calculators, basic CRUD apps, static sites, portfolio pages) do not count.',
1: 'Minor or dated experience - a single old project (3+ years ago), or generic dev tools (CLIs, linters, frameworks, libraries) that are not knowledge-work productivity tools',
2: 'Has built productivity software that helps people get work done faster: document editing, note-taking, workflow automation, BI tools, text-to-SQL, AI-assisted coding tools, search engines, data analysis platforms, or domain-specific workflow tools (e.g. IB deal flow, legal research). Shipped at a company or as a side project with real users.',
3: 'Deep, recent experience (last 2-3 years) building innovative productivity tools. Examples: core features of Notion, Figma, Linear, Cursor/Claude Code, Superhuman, Airtable; or building text-to-SQL engines, AI research automation, or complex domain-specific workflow software.',
},
},
{
key: 'financial_services',
label: 'Financial Services Domain',
weight: 2,
tiers: {
0: 'No exposure to financial services',
1: 'Minor exposure or interest in finance, banking, or trading',
2: 'Worked at a financial services company or built financial tools',
3: 'Deep hands-on engineering for investment banking, private equity, trading, or hedge fund software',
},
},
{
key: 'education',
label: 'Education',
tiers: {
0: 'Degree from an unknown or low-reputation university with no notable CS/engineering program',
1: 'No degree / dropped out, OR degree from a decent but unremarkable university',
2: 'Degree from a top-tier CS/engineering program (e.g., Waterloo, Georgia Tech, UIUC, ETH Zurich, TU Munich)',
3: 'Degree from a tier-1 university (MIT, Stanford, Harvard, CMU, Berkeley, Princeton, Caltech, Oxbridge)',
},
},
{
key: 'location',
label: 'Location',
weight: 3,
tiers: {
0: 'Asia, Africa, or other regions where relocation to NYC is unlikely.',
1: 'Western world (Europe, Canada, Australia, Latin America) - regions where relocation to NYC is plausible. Also use for US-based people who have been in the same non-NYC city for 5+ years (check LinkedIn experience locations) - long tenure in SF/Seattle/etc. makes relocation unlikely.',
2: 'In the US (not NYC), with some indication of mobility (moved cities in the last few years, or less than 5 years in current city)',
3: 'New York City area (NYC, NJ, CT commutable)',
},
},
{
key: 'builder_signal',
label: 'Builder Signal',
weight: 2,
tiers: {
0: 'No signal of shipping or building products. Also use for pattern of many short-lived micro-SaaS or side projects (few months each) without meaningful traction or users - this signals lack of follow-through, not building ability.',
1: 'Some open source contributions or side projects, but nothing with significant adoption or impact',
2: 'Clearly ships real products, active builder with curiosity-driven projects that have real users or meaningful adoption',
3: 'Exceptional track record of shipping - successful products with significant traction, strong OSS portfolio with real adoption (1000+ stars), or clear hustler/builder mentality with demonstrated follow-through',
},
},
{
key: 'company_pedigree',
label: 'Reputable Company',
weight: 4,
tiers: {
0: 'Most recent role is at a non-tech/traditional company (media, publishing, banking, insurance, government, consulting, agency - e.g. NYT, Bank of America, McKinsey, Deloitte), a non-venture-backed company, an unknown startup with no funding, or no meaningful work experience.',
1: 'Most recent role is at a venture-backed startup or a known tech company, but not a standout name. Large established tech companies that are not known for exceptional engineering (e.g., LinkedIn, Adobe, Etsy, Salesforce, Oracle) fall here.',
2: 'Most recent role is at a well-known tech company with strong engineering culture (e.g. Google, Meta, Stripe, Databricks, Vercel) or a startup backed by strong investors',
3: 'Most recent role is at a top-tier AI/tech startup backed by tier-1 VCs (Sequoia, Thrive Capital, Founders Fund, Benchmark, Khosla Ventures, a16z, Accel) or at a company known for exceptional engineering talent density (e.g., Anthropic, OpenAI, Jane Street)',
},
},
{
key: 'seniority_fit',
label: 'Seniority Fit',
weight: 1,
tiers: {
0: 'VP/C-suite at a well-known or large company, famous tech leader, tenured professor - way too senior for a Series B startup',
1: 'Director at a large company, engineering manager whose recent roles are primarily people management. Staff/tech lead at a big company with managerial responsibilities also falls here - they may struggle to go back to pure IC work.',
2: 'Junior engineer with 1-3 years experience, or tech lead at a startup who still codes hands-on',
3: 'IC engineer (mid through staff/principal) who is clearly still hands-on coding, or early-stage startup engineer - the ideal seniority for a Series B startup',
},
},
{
key: 'experience_level',
label: 'Experience Level',
weight: 0,
tiers: {
0: 'Current student or no professional engineering experience at all. Only has personal/university projects.',
1: 'Current student or recent grad (<1 year out) BUT has founded startups, had high-status internships at venture-backed/tier-1 startups, or has significant open-source/side project output. Also: new grad with <2 years of professional experience.',
2: '2-4 years of professional engineering experience. Has held at least one full-time engineering role beyond internships.',
3: '4+ years of professional engineering experience across one or more full-time roles. Seasoned engineer with real production experience.',
},
},
{
key: 'hireability',
label: 'Hireability',
weight: 3,
tiers: {
0: 'CEO/CTO/co-founder/VP at a company that is clearly growing (positive headcount growth, >10 employees, or raised significant funding recently). Use company insights data if available. Also: anyone in a senior position (Principal, Staff, Distinguished, Director+) at a rocket-ship AI company (Anthropic, OpenAI, Thinking Machines, Cursor, etc.) - these people are extremely well-compensated and will not leave. These people will not leave their company.',
1: 'Co-founder/exec at a funded startup with moderate or unknown growth, or C-suite at an established company. Also: junior/mid-level IC engineer at a rocket-ship AI company (Anthropic, OpenAI, Cursor, etc.) where leaving would be irrational. Also: someone who just started a new role or company (<6 months ago) - they are in the honeymoon phase and very unlikely to leave. Also: someone who has been at the same large company for 10+ years - they are deeply embedded and very unlikely to leave for a startup.',
2: 'Founder of a small/stagnating/early-stage company (<5 employees, no/negative growth in company insights), recently exited founder, someone whose company shut down. Also use for someone stuck at a tiny company (1-3 employees, no growth) for 3+ years - this signals they may be comfortable/complacent rather than ambitious. Serial indie hackers/bootstrappers who have been running their own small projects for 5+ years are also unlikely to join a venture-backed startup.',
3: 'Employee (not founder/exec), IC engineer at a normal company, or someone clearly between roles and open to new opportunities. Not at a rocket-ship company. Not stuck at a stagnant company for years. Not a serial indie hacker.',
},
},
{
key: 'role_fit',
label: 'Role Fit',
weight: 2,
tiers: {
0: 'Not a relevant engineering role (PM, designer, researcher only, or no engineering background). Also: robotics, embedded systems, hardware, computer vision, or other non-web engineering.',
1: 'Adjacent engineering role (data engineer, DevOps, ML researcher, mobile-only, or primarily ML/CV engineer who does some web work on the side)',
2: 'Partial overlap (backend-only or frontend-only engineer)',
3: 'Full-stack web engineer or full-stack + AI engineer building web products - the ideal archetype for the team',
},
},
{
key: 'tech_stack_fit',
label: 'Tech Stack Fit',
tiers: {
0: 'No TypeScript/JavaScript experience evident. Primarily uses other languages (Python-only, Go-only, Rust-only, etc.)',
1: 'Some JavaScript/TypeScript usage but primarily works in other languages',
2: 'Regular TypeScript/JavaScript user with web development experience',
3: 'Heavy TypeScript usage, React/Next.js experience, full-stack web development as primary stack',
},
},
],
// Team members to exclude from scraping results (GitHub URLs)
teamMembers: [
'https://github.com/AJNandi',
'https://github.com/AmitRoopnarineRogo',
'https://github.com/catherine-rogo',
'https://github.com/chasegoulet-rogo',
'https://github.com/chaserogo',
'https://github.com/itstheonlychris',
'https://github.com/connerlambden',
'https://github.com/curtjanssen',
'https://github.com/deepak-rogo',
'https://github.com/edmund-sec',
'https://github.com/wieandteduard',
'https://github.com/erictu22',
'https://github.com/exu24',
'https://github.com/flornkm',
'https://github.com/gabrielstengel',
'https://github.com/gmeinhardt-rogo',
'https://github.com/gradients-rogo',
'https://github.com/jamespolemeni-afk',
'https://github.com/jan-wilhelm',
'https://github.com/jbedard',
'https://github.com/jchecca',
'https://github.com/JGalbss',
'https://github.com/JimmyGreaser',
'https://github.com/jkim-rogo',
'https://github.com/johnwillett7',
'https://github.com/johnheintschel-ops',
'https://github.com/johnmann-rogo',
'https://github.com/joseph-mccombs',
'https://github.com/xeniyandkn',
'https://github.com/lennydong-rogo',
'https://github.com/martin-rogo',
'https://github.com/MichelCarroll',
'https://github.com/mvickers-rogo',
'https://github.com/nils-e13',
'https://github.com/octavien-rogo',
'https://github.com/pratyush-rogo',
'https://github.com/RoboTums',
'https://github.com/Ronan-ACN',
'https://github.com/rysloan4',
'https://github.com/sbarreiros',
'https://github.com/stribwal41',
'https://github.com/tbui-rogo',
'https://github.com/thejacobkatz',
'https://github.com/thomasrogo',
'https://github.com/tuan-rogo',
'https://github.com/TumasRackaitis',
'https://github.com/moritzWa',
],
// Computed below after object definition
maxTierSum: 0,
// Seed profiles for graph traversal starting points
seedProfiles: [
// Team / original seeds
'https://github.com/moritzWa',
'https://github.com/wuweiweiwu',
'https://github.com/AJNandi',
'https://github.com/jan-wilhelm',
'https://github.com/JGalbss',
'https://github.com/JimmyGreaser',
'https://github.com/virattt',
'https://github.com/habanzu',
// Outreach candidates (validated as strong - explore their connections)
'https://github.com/timsuchanek',
'https://github.com/RobertCraigie',
'https://github.com/NathanFlurry',
'https://github.com/DeMoorJasper',
'https://github.com/N2D4',
'https://github.com/MichaelAlfano',
'https://github.com/r2d4',
'https://github.com/dominikmoehrle',
'https://github.com/edisonqu',
'https://github.com/rileytomasek',
'https://github.com/Yonom',
'https://github.com/kamath',
'https://github.com/adamcohenhillel',
'https://github.com/tommoor',
'https://github.com/juliusmarminge',
'https://github.com/mfts',
'https://github.com/raghavpillai',
'https://github.com/xdotli',
// other ppl i respect
'https://github.com/samuelstroschein',
'https://github.com/mitsuhiko',
// recruiting contacts + manually added seeds
'https://github.com/anirudhhramesh',
'https://github.com/ghollbeck',
'https://github.com/avrecum',
'https://github.com/simonbohnen',
'https://github.com/mnida',
'https://github.com/bjsi',
'https://github.com/annawang7',
'https://github.com/stefanbielmeier',
'https://github.com/LitMSCTBB',
'https://github.com/benjaminshafii',
'https://github.com/compuives',
'https://github.com/dexhorthy',
'https://github.com/antfu',
'https://github.com/c45',
'https://github.com/matsjfunke',
'https://github.com/arnestrickmann',
'https://github.com/ZeroSumQuant',
'https://github.com/nickscamara',
'https://github.com/pirate',
'https://github.com/MagMueller',
'https://github.com/gregpr07',
'https://github.com/Alezander9',
'https://github.com/reformedot',
'https://github.com/kalil0321',
'https://github.com/degtrdg',
'https://github.com/ex3ndr',
],
// The full LLM rating prompt (static part).
// {ARCHETYPES} and {CRITERIA} are replaced at runtime.
ratingPrompt: `Hiring deeply technical full-stack engineers for Rogo, a Series B AI startup building productivity software for investment banking and private equity. The product includes AI-powered presentation generation, Excel automation, research agents, and financial data tools. We need exceptional builders who ship.
Reviewing GitHub profiles to assess fit:
1. Bio & Background: Use GitHub bio, readme, X bio, and web research for career/interest insights.
2. Repositories: Assess for interest in our company's topics (productivity tools, AI agents, document/data processing, financial services, research tools, text-to-SQL, NLP) or cultural fit as a builder.
3. Engineer Archetype: Categorize into one or more: {ARCHETYPES}. Use 'Other' or 'None' if unclear. Base archetypes on substantial, recent (last 3-5 years) hands-on engineering work, not solely on research or theoretical work.
Guidelines:
* Focus on recent (last 5-7 years) hands-on technical contributions. Use LinkedIn dates to verify recency.
* Managerial roles: only count as technical if they still do hands-on coding. If unclear, err on the side of caution.
* Non-technical roles (Investors, pure Eng Managers, PMs, Designers) get tier 0 across the board.
* Use all available info (GitHub, LinkedIn, X, web research) to determine location. Check LinkedIn experience locations to see how long someone has been in their current city - if they've been in the same non-NYC US city (e.g., SF, Seattle) for 5+ years across multiple jobs, relocation is unlikely.
* For builder_signal: distinguish between genuine builders who ship products with real users/traction and people who churn through many micro-SaaS or short-lived projects without meaningful impact.
* For hireability: if someone has been running a 1-3 person company with no growth for 3+ years, that's a negative signal (stuck/complacent), not a positive one. If someone just started a new role or company (<6 months ago), they are in the honeymoon phase and very unlikely to leave - score tier 1. Check LinkedIn start dates carefully.
* For role_fit: we need full-stack WEB engineers who build web applications, not robotics engineers, computer vision researchers, embedded systems engineers, or hardware people. Someone whose career is primarily in robotics/CV/hardware with some minor web projects on the side is NOT a full-stack engineer - score them 0-1.
* For company_pedigree: traditional/non-tech companies (media, banking, insurance, government, consulting) are tier 0 regardless of brand prestige. Distinguish between large established tech companies (LinkedIn, Adobe, Etsy, Salesforce) and companies known for exceptional engineering talent density (Anthropic, Stripe, Jane Street). A career spent entirely at big established tech is a tier 1-2, not tier 3. If you haven't heard of the company, it's tier 0-1.
* For seniority_fit: if someone's recent titles are "Staff Engineer", "Tech Lead", or "Engineering Manager" at a big company, they likely have significant managerial responsibilities and may not be a good fit for a hands-on IC role at a Series B. Look at their GitHub activity to verify they still code.
* For builder_signal and ai_agent_experience: only score high if there is concrete evidence from GitHub repos, stars, or verifiable product launches. Do NOT trust vague web research claims like "10,000 interactions" or "widely used" without corroborating evidence in their repos. A repo with <100 stars is not "significant traction".
* Be skeptical of web research results - they may contain hallucinated or exaggerated claims. Cross-reference with actual GitHub repos and LinkedIn experience. If the LinkedIn data seems inconsistent with the GitHub profile (wrong person, different career focus), trust GitHub over LinkedIn.
* Serial indie hackers/bootstrappers who have been running their own small SaaS projects for many years (without ever joining or founding a venture-backed company) are a poor fit. They are unlikely to join a startup as an employee, and their experience building solo projects doesn't translate to the team/scale dynamics of a Series B. Score them low on startup_experience (tier 0-1) and hireability (tier 1-2).
For each criterion, first reason about the evidence, then assign a tier score (0-3). Be honest and consistent - don't inflate. When evidence is missing (e.g., no LinkedIn profile, no web research results), default to lower tiers rather than assuming the best. Absence of evidence is not evidence of a positive signal.
{CRITERIA}
Example 1:
---
GitHub Profile:
Name: Jan Wilhelm
Company: @rogodata
Location: New York, NY
Recent Repos:
- text-to-sql-engine [TypeScript] (pushed 2 months ago)
- financial-data-parser [TypeScript] (pushed 3 months ago)
- react-dashboard [TypeScript] (pushed 5 months ago)
Web Research: Software Engineer at Rogo in New York. Previously built text-to-SQL tools at a data analytics startup. MS CS from TU Munich.
ENGINEER_ARCHETYPE: full-stack, AI engineer
LOCATION: New York, US
startup_experience: "Currently at Rogo (Series B AI startup) as engineer, previously at data analytics startup." -> 2
ai_agent_experience: "Built text-to-SQL engine in production, hands-on AI agent work at Rogo." -> 3
productivity_software: "Data tools and dashboards, works on productivity features at Rogo." -> 2
financial_services: "Works on financial data products at Rogo for IB/PE clients." -> 2
education: "MS CS from TU Munich (top-tier engineering program)." -> 2
location: "Based in NYC." -> 3
builder_signal: "Ships real products, active contributor to multiple repos." -> 2
company_pedigree: "Currently at Rogo (Series B, backed by strong investors), previously at a data analytics startup." -> 2
seniority_fit: "Software engineer IC at a Series B startup, ideal seniority." -> 3
experience_level: "MS CS + multiple full-time roles, 4+ years of professional experience." -> 3
hireability: "Employee at Rogo, not a founder/exec. Open to opportunities." -> 3
role_fit: "Full-stack and AI engineer, directly matches ideal archetype." -> 3
tech_stack_fit: "All repos in TypeScript, React/Next.js stack." -> 3
---
Example 2:
---
GitHub Profile:
Name: Alex Kumar
Company: Chief Scientist @ AI Lab
Recent Repos:
- ml-model-serving [Python] (pushed 5 years ago)
- distributed-training [Python] (pushed 6 years ago)
Web Research: Chief Scientist at AI Lab (2020-present) in London. Previously Research Engineer at Meta AI. PhD in CS from Stanford.
ENGINEER_ARCHETYPE: AI researcher/scientist
LOCATION: London, UK
startup_experience: "No startup experience, large-company research roles only." -> 0
ai_agent_experience: "Research-focused AI role, no production agent/RAG systems." -> 1
productivity_software: "No relevant productivity software experience." -> 0
financial_services: "No financial services exposure." -> 0
education: "Stanford PhD (tier-1 university)." -> 3
location: "Based in London (Western world, relocation plausible)." -> 1
builder_signal: "No evidence of shipping products, repos are 5+ years old." -> 0
company_pedigree: "AI Lab and Meta AI are top-tier companies known for engineering excellence." -> 3
seniority_fit: "Chief Scientist - way too senior, famous tech leader." -> 0
experience_level: "PhD + years as Research Engineer at Meta AI and Chief Scientist. 10+ years." -> 3
hireability: "C-suite at established company, unlikely to leave for Series B." -> 1
role_fit: "AI researcher/scientist, not an engineering role with hands-on coding." -> 0
tech_stack_fit: "Python-only repos, no TypeScript/JavaScript evidence." -> 0
---
Example 3:
---
GitHub Profile:
Name: Priya Gupta
Company: Founder @ DocuAI
Location: Brooklyn, NY
Recent Repos:
- docuai-platform [TypeScript] (pushed 1 month ago)
- pdf-parser-ml [Python] (pushed 2 months ago)
- agent-workflow-engine [TypeScript] (pushed 3 months ago)
Web Research: Founded DocuAI (AI document processing for legal/finance, $2M seed, 3 employees) in NYC. Previously SE at Notion working on editor infrastructure. BSc from Waterloo.
Current Company Insights (from LinkedIn data):
Company: DocuAI
Employee Count: 3
1Y Headcount Growth: 0%
6M Headcount Growth: 0%
ENGINEER_ARCHETYPE: full-stack, AI engineer
LOCATION: New York, US
startup_experience: "Founded DocuAI with $2M seed funding, strong validation." -> 3
ai_agent_experience: "Built agent workflows and ML document processing in production." -> 3
productivity_software: "Notion editor infrastructure, DocuAI document processing platform." -> 3
financial_services: "DocuAI serves legal/finance, minor exposure." -> 1
education: "BSc from Waterloo (top-tier CS program)." -> 2
location: "NYC-based." -> 3
builder_signal: "Founded company, shipped multiple products, active builder." -> 3
company_pedigree: "DocuAI ($2M seed), previously at Notion (tier-1 VC backed, top eng culture)." -> 3
seniority_fit: "Founder, previously IC at Notion. Would come in at senior/staff level." -> 3
experience_level: "Founded company + SE at Notion, 4+ years of professional experience." -> 3
hireability: "Founder of small stagnating company (3 employees, 0% growth). Likely open to a move." -> 2
role_fit: "Full-stack and AI engineer, builds across the stack." -> 3
tech_stack_fit: "TypeScript as primary language, React/Next.js, with some Python for ML." -> 3
---
`,
};
// Bonus points for public presence signals (computed from profile data, no LLM needed).
// People with a strong public presence (Twitter, GitHub followers) tend to be
// more sophisticated and better outreach candidates.
export const MAX_PROFILE_BONUS = 6;
export function computeProfileBonus(profileData?: {
twitter_username?: string | null;
followers?: number;
following?: number;
}): number {
if (!profileData) return 0;
let bonus = 0;
if (profileData.twitter_username) bonus += 3;
if ((profileData.followers ?? 0) >= 200) bonus += 2;
const ratio = (profileData.followers ?? 0) / (profileData.following || 1);
if (ratio >= 5) bonus += 1;
return bonus;
}
// Bonus for people at stagnating companies - they're more likely to be hireable.
// Founders get a larger bonus (they're tied to the company's fate).
// Employees get a smaller bonus (stagnating employer = might be looking).
export const MAX_STAGNATION_BONUS = 6;
export function computeStagnationBonus(
companyInsights?: {
foundedYear?: number | null;
employeeCount?: number | null;
headcountGrowth6m?: number | null;
headcountGrowth1y?: number | null;
} | null,
founderStartYear?: number | null,
isFounder?: boolean
): number {
if (!companyInsights) return 0;
const currentYear = new Date().getFullYear();
const foundedYear = companyInsights.foundedYear ?? founderStartYear;
const growth1y = companyInsights.headcountGrowth1y;
const growth6m = companyInsights.headcountGrowth6m;
const employees = companyInsights.employeeCount;
const hasGrowthData = growth1y != null || growth6m != null;
const isSmall = employees != null && employees <= 10;
const isStagnating =
hasGrowthData && (growth1y ?? 0) <= 5 && (growth6m ?? 0) <= 5;
const isShrinking =
hasGrowthData && ((growth1y ?? 0) < 0 || (growth6m ?? 0) < 0);
if (!isStagnating && !isSmall) return 0;
const companyAge = foundedYear ? currentYear - foundedYear : 0;
if (isFounder) {
// Founders: bigger bonus, company age matters a lot
if (companyAge < 2) return 0;
let bonus = 0;
if (companyAge >= 2) bonus += 2;
if (companyAge >= 3) bonus += 2;
if (isShrinking) bonus += 1;
if (isSmall && employees! <= 5 && companyAge >= 2) bonus += 1;
return Math.min(bonus, MAX_STAGNATION_BONUS);
} else {
// Employees: smaller bonus, company age less important
let bonus = 0;
if (isShrinking) bonus += 2;
else if (isStagnating) bonus += 1;
if (isSmall && employees! <= 5) bonus += 1;
return Math.min(bonus, 3);
}
}
// Max possible tier sum: each criterion scores 0-3, multiplied by its weight
companyConfig.maxTierSum =
companyConfig.criteria.reduce((sum, c) => sum + 3 * (c.weight ?? 1), 0) +
MAX_PROFILE_BONUS +
MAX_STAGNATION_BONUS;
// Compute total score as weighted sum of tier values + profile bonus + stagnation bonus.
// Used for ranking: higher sum = better fit.
export function computeTotalScore(
criteriaScores: Record<string, number>,
profileData?: {
twitter_username?: string | null;
followers?: number;
following?: number;
},
companyInsights?: {
foundedYear?: number | null;
employeeCount?: number | null;
headcountGrowth6m?: number | null;
headcountGrowth1y?: number | null;
} | null,
founderStartYear?: number | null,
isFounder?: boolean
): number {
const criteriaSum = companyConfig.criteria.reduce((sum, c) => {
return sum + (criteriaScores[c.key] ?? 0) * (c.weight ?? 1);
}, 0);
return (
criteriaSum +
computeProfileBonus(profileData) +
computeStagnationBonus(companyInsights, founderStartYear, isFounder)
);
}