Apache-3 BidOps · Docs · 03
Scoring algorithm
How the platform scores SAM.gov opportunities against the Apache-3 profile for go/no-go decisions.
The scoring algorithm produces a fit_score (0-100) plus a recommended_action (pursue | monitor | decline) for every SAM.gov opportunity.
Inputs
opportunity(RawSamGovOpportunity) — what we know about the noticeprofile(CompanyProfile) — Apache-3's profileorg(Organization) — Apache-3's corporate identifiers
Scoring dimensions
Each dimension contributes 0-20 points. Total: 100.
1. Set-aside fit (0-20)
| Set-aside | Apache-3 qualifies? | Points |
|---|---|---|
| SDVOSB | Yes (SBA VetCert) | 20 |
| VOSB | Yes (SBA VetCert) | 20 |
| Native American-Owned | Yes (Lipan Apache Tribe of Texas) | 20 |
| 8(a) | Yes (Native American-Owned set-aside path) | 20 |
| WOSB | No | 0 |
| HUBZone | No | 0 |
| Full and open small business | Yes | 15 |
| Open / Full and Open (no set-aside) | Yes | 10 |
2. NAICS match (0-20)
| NAICS in opportunity | Apache-3 registered? | Points |
|---|---|---|
| 541519, 541512, 541611, 611420, 611430 | Yes | 20 |
| 541xxx (other Computer Services category) | Adjacent | 12 |
| 611xxx (other Education) | Adjacent | 12 |
| Anything else | No | 4 |
3. PSC match (0-20)
U012 (training), D316 (help desk), D399 (other IT services), R408 (program management support), R699 (other professional services) score 20. Adjacent PSCs in the same family score 12. Everything else scores 4.
4. Geography (0-20)
| Place of performance | Points |
|---|---|
| Kansas | 20 |
| Colorado, Missouri, Nebraska | 15 |
| Remote acceptable | 18 |
| Continental US (non-listed) | 10 |
| Outside continental US | 0 |
5. Past performance fit (0-20)
A deterministic similarity score based on keyword overlap between the opportunity description and Apache-3's relevant_experience entries. High keyword overlap (~70%+ of unique nouns) scores 20. Moderate overlap (~40-70%) scores 12. Low overlap scores 4.
Aggregation
fit_score is the sum, 0-100.
recommended_action:
pursue— fit_score >= 70 AND set-aside fit > 0monitor— fit_score 50-69 OR (set-aside fit = 0 but other dimensions strong)decline— fit_score < 50 OR set-aside is one Apache-3 cannot qualify for
Why deterministic?
LLM-based scoring is unstable — same opportunity scored twice can produce different scores. Deterministic scoring is auditable, defensible at a contract review board, and CI-testable. The LLM is reserved for content generation, where variance is acceptable.
Implementation: src/lib/scoring.ts.