How We Score & What We Share
Developers are right to distrust directories. So here is the entire machine: the exact scoring formula with its weights, how every price is collected and logged, and how to verify any number yourself without trusting us.
1 · The 12-signal BizOps Score
Every open-source tool is scored 0–100 from twelve public GitHub & package-registry signals. Nothing self-reported, nothing editorial.
sᵢ = signal normalised to 0–1 · wᵢ = category weight (Σwᵢ = 1)
security_bonus = +5 if ≥ 2 verified security-patching commits in the window
| Signal | Measures | Normalisation | Base w | AI/ML w |
|---|---|---|---|---|
| commit_recency | Days since last commit | decay curve | .20 | .18 |
| stars | Total stars | min-max across batch | .13 | .15 |
| fork_velocity | Forks, last 30d | min-max across batch | .11 | .08 |
| issue_response | Avg hrs to first response | decay curve | .10 | .06 |
| bus_factor | Top-contributor share | 1 − clamp(share−0.2, 0, 0.8)/0.8 | .08 | .01 |
| ci_status | CI passing on default branch | 1.0 pass / 0.3 fail | .07 | .07 |
| contributors | Distinct contributors | min-max across batch | .07 | .04 |
| pr_merge_rate | Merged / opened PRs | rate curve | .07 | .04 |
| pkg_downloads | Registry downloads | min-max of log1p | .05 | .12 |
| has_tests | Test suite present | 1.0 yes / 0.2 no | .05 | .08 |
| branch_protection | Protected default branch | 1.0 yes / 0.3 no | .04 | .01 |
| release_recency | Days since last release | decay curve | .03 | .16 |
Weights are re-normalised to sum to 1 per category (the AI/ML column shows why: shipping cadence and adoption matter more there than bus factor). Trend badges: rising / falling = ±3 points vs the previous run; scores recompute on every scrape, never by hand.
2 · How prices are collected
Weekly, from public pricing pages only, with robots.txt honoured and a 3-second crawl delay. Each record carries its collection method so you can weigh it:
| source.method | Meaning |
|---|---|
| direct | Plain fetch of the public page |
| proxy_render | JS-rendered via a scraping API (Cloudflare-fronted SPAs) |
| playwright_semantic | Headless browser; anchors on the text "per 1M tokens" and climbs to the nearest $-block — survives CSS redesigns |
| ai_web_search | Structured LLM web-search fallback (flagged, never silent) |
| wayback | Internet Archive snapshot — archive timestamp preserved |
| manual | Human override of last resort (flagged) |
Tracked consumption vectors
input / output / cache-read / cache-write $ per 1M tokens · context windows · vector storage $/GB-mo · $/1M vector dimensions · read/write QPS · tool-call token overhead · GPU $/hr · seat pricing — plus free-tier allowances (monthly credit $, free tokens, free requests/day, rate-limit RPM, free storage GB), because a quietly shrinking free tier is the earliest signal of market tightening.
3 · Verify it yourself — don't take our word for it
The hash seals both the numbers and the raw source text they were
extracted from — a value cannot be disputed without breaking the excerpt. Records chain per vendor
via prev_record_sha256 (first link: genesis:<slug>); backfilled archive
records are re-chained chronologically and keep their provenance. A second, whole-file seal
(/ledger.json, hash-chained) sits on top of the dataset.
Reproduce a hash yourself
curl -s https://bizopstool.com/ai/pricing_history_ai.json | python3 -c "
import json,sys,hashlib
t=[x for x in json.load(sys.stdin)['tools'] if x['slug']=='pinecone'][0]
s=t['snapshots'][-1]
p=json.dumps(s['metrics'],sort_keys=True,separators=(',',':'))+'\n'+s['source_url']+'\n'
print('published:',s['record_sha256'][:16],'… (recompute with raw_excerpt from the full export)')"
The public window omits raw_excerpt for size;
full exports (Pro) include every field needed
for byte-exact recomputation. Chain checks: GET /api/notary/verify?slug=<vendor>.
4 · Independence & corrections
rel="sponsored"); they earn us a commission and have zero write-access to the data —
the ledger would show the mismatch anyway.Corrections policy: if we mis-parse a price, the fix is appended
as a new hash-logged record with source.method preserved — history is never rewritten, because a
ledger that can be edited is not a ledger. Report errors: hello@bizopstool.com.