@opendirectory.dev/skills 0.1.36 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/registry.json +20 -0
- package/skills/map-your-market/.env.example +3 -0
- package/skills/map-your-market/README.md +147 -0
- package/skills/map-your-market/SKILL.md +469 -0
- package/skills/map-your-market/evals/evals.json +102 -0
- package/skills/map-your-market/references/icp-signals.md +90 -0
- package/skills/map-your-market/references/pain-scoring.md +85 -0
- package/skills/map-your-market/references/subreddit-map.md +58 -0
- package/skills/map-your-market/scripts/fetch.py +710 -0
- package/skills/sdk-adoption-tracker/.env.example +3 -0
- package/skills/sdk-adoption-tracker/README.md +153 -0
- package/skills/sdk-adoption-tracker/SKILL.md +808 -0
- package/skills/sdk-adoption-tracker/evals/evals.json +108 -0
- package/skills/sdk-adoption-tracker/references/import-patterns.md +183 -0
- package/skills/sdk-adoption-tracker/references/scoring-guide.md +148 -0
- package/skills/sdk-adoption-tracker/scripts/fetch.py +462 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "eval_001",
|
|
4
|
+
"name": "npm SDK with real company adopters",
|
|
5
|
+
"description": "Full pipeline run on a well-known npm SDK with 20+ public repos. Verifies company org detection, scoring, enrichment, and brief generation all work end-to-end.",
|
|
6
|
+
"input": {
|
|
7
|
+
"prompt": "Find who is using my SDK on GitHub: stripe",
|
|
8
|
+
"env": {
|
|
9
|
+
"GITHUB_TOKEN": "set"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"expected_behavior": [
|
|
13
|
+
"Detects ecosystem as npm from the SDK name",
|
|
14
|
+
"Builds 4 query patterns: require(\"stripe\"), require('stripe'), from \"stripe\", from 'stripe'",
|
|
15
|
+
"Fetches up to 100 results per pattern, deduplicates by repo full_name",
|
|
16
|
+
"Filters forks and repos whose name starts with 'stripe' as noise",
|
|
17
|
+
"Classifies repos with owner.type == Organization as company_org",
|
|
18
|
+
"Fetches full repo metadata, owner profile, and top contributors for non-noise repos",
|
|
19
|
+
"Computes adoption_score using formula from scoring-guide.md",
|
|
20
|
+
"AI generates adoption briefs for repos with score >= 80",
|
|
21
|
+
"Every repo in the brief exists in the raw code search results",
|
|
22
|
+
"Every company name comes from the GitHub org.name or user.company API field",
|
|
23
|
+
"Every contributor handle comes from the contributors API response",
|
|
24
|
+
"Saves output to docs/sdk-adopters/stripe-YYYY-MM-DD.md and .json"
|
|
25
|
+
],
|
|
26
|
+
"expected_output": "Report with at least 1 company_org repo, adoption velocity metrics, and at least 1 adoption brief with company name, top contributor handle, and outreach message."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "eval_002",
|
|
30
|
+
"name": "Python SDK ecosystem detection",
|
|
31
|
+
"description": "Verifies auto-detection of Python ecosystem from snake_case package name and correct query pattern construction.",
|
|
32
|
+
"input": {
|
|
33
|
+
"prompt": "Track adoption of my Python library: boto3",
|
|
34
|
+
"env": {
|
|
35
|
+
"GITHUB_TOKEN": "set"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"expected_behavior": [
|
|
39
|
+
"Detects ecosystem as python from snake_case name with no hyphens or slashes",
|
|
40
|
+
"Builds 3 query patterns: 'import boto3', 'from boto3 import', 'from boto3.'",
|
|
41
|
+
"Does NOT use npm-style require() patterns",
|
|
42
|
+
"Fetches results and deduplicates repos",
|
|
43
|
+
"Classifies repos by tier using the same scoring formula",
|
|
44
|
+
"Proceeds through Steps 4-8 normally"
|
|
45
|
+
],
|
|
46
|
+
"expected_output": "Report showing Python repos importing boto3, with correct ecosystem label in the output header."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "eval_003",
|
|
50
|
+
"name": "Very new SDK not yet indexed",
|
|
51
|
+
"description": "Handles the case where a brand-new SDK returns 0 results from GitHub code search because indexing takes 1-4 weeks.",
|
|
52
|
+
"input": {
|
|
53
|
+
"prompt": "Find who is using my new SDK: my-brand-new-sdk-2026",
|
|
54
|
+
"env": {
|
|
55
|
+
"GITHUB_TOKEN": "set"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"expected_behavior": [
|
|
59
|
+
"Runs code search queries successfully (no API error)",
|
|
60
|
+
"Receives 0 results from all pattern queries",
|
|
61
|
+
"Does NOT proceed to Steps 4-8",
|
|
62
|
+
"Stops with a clear message: 'No repos found importing my-brand-new-sdk-2026. GitHub code search indexing takes 1-4 weeks for new packages.'",
|
|
63
|
+
"Does not write any output files",
|
|
64
|
+
"Does not hallucinate any repo results"
|
|
65
|
+
],
|
|
66
|
+
"expected_output": "Graceful stop message with indexing explanation. No output file created."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "eval_004",
|
|
70
|
+
"name": "GITHUB_TOKEN missing",
|
|
71
|
+
"description": "Verifies the skill stops immediately at Step 1 when GITHUB_TOKEN is not set, with a clear actionable error message.",
|
|
72
|
+
"input": {
|
|
73
|
+
"prompt": "Who is using my SDK: express",
|
|
74
|
+
"env": {
|
|
75
|
+
"GITHUB_TOKEN": "not set"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"expected_behavior": [
|
|
79
|
+
"Step 1 setup check detects GITHUB_TOKEN is missing",
|
|
80
|
+
"Stops immediately with error: 'GITHUB_TOKEN is required for code search.'",
|
|
81
|
+
"Includes instruction: 'Add a token at github.com/settings/tokens (no scopes needed for public repos).'",
|
|
82
|
+
"Explains why: unauthenticated code search hits 3 req/min secondary rate limit",
|
|
83
|
+
"Does NOT proceed to Step 2 or any API calls",
|
|
84
|
+
"Exit code 1 (or equivalent failure signal)"
|
|
85
|
+
],
|
|
86
|
+
"expected_output": "Error message at Step 1 with token setup instructions. No API calls made."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "eval_005",
|
|
90
|
+
"name": "All results are tutorial noise",
|
|
91
|
+
"description": "Handles the case where code search returns results but all repos are tutorials, examples, or forks -- no production adopters.",
|
|
92
|
+
"input": {
|
|
93
|
+
"prompt": "Find who is using my SDK: todo-app",
|
|
94
|
+
"env": {
|
|
95
|
+
"GITHUB_TOKEN": "set"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"expected_behavior": [
|
|
99
|
+
"Runs code search and finds repos",
|
|
100
|
+
"Step 4 classification marks all repos as tutorial_noise (name/description contain tutorial keywords)",
|
|
101
|
+
"No repos remain after filtering tutorial_noise",
|
|
102
|
+
"Does NOT proceed to Step 5 enrichment or Step 6 AI brief generation",
|
|
103
|
+
"Stops with message: 'All repos found appear to be tutorials or examples. No production adopters detected in public GitHub.'",
|
|
104
|
+
"Does not hallucinate production users"
|
|
105
|
+
],
|
|
106
|
+
"expected_output": "Graceful stop with explanation. Breakdown table shows tutorial_noise count but 0 company/solo repos."
|
|
107
|
+
}
|
|
108
|
+
]
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Import Patterns Reference
|
|
2
|
+
|
|
3
|
+
Used by SKILL.md Step 3 to build GitHub code search queries per ecosystem.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Ecosystem Detection
|
|
8
|
+
|
|
9
|
+
Auto-detect from the SDK name before falling back to user input:
|
|
10
|
+
|
|
11
|
+
| Signal | Ecosystem |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Starts with `@` (e.g. `@clerk/nextjs`) | npm |
|
|
14
|
+
| Contains `-` and no `github.com/` (e.g. `react-query`) | npm |
|
|
15
|
+
| snake_case only, no `-` or `/` (e.g. `requests`, `boto3`) | python |
|
|
16
|
+
| Contains `github.com/` (e.g. `github.com/stripe/stripe-go`) | go |
|
|
17
|
+
| Contains `.` with no other signals (e.g. `org.springframework.boot`) | java |
|
|
18
|
+
| Ambiguous | ask the user |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## npm / Node.js
|
|
23
|
+
|
|
24
|
+
**Search patterns (run each as a separate code search query):**
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
require("sdk-name")
|
|
28
|
+
require('sdk-name')
|
|
29
|
+
from "sdk-name"
|
|
30
|
+
from 'sdk-name'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Notes:**
|
|
34
|
+
- `from "sdk-name"` catches ES module default and named imports: `import foo from "sdk-name"` and `import { bar } from "sdk-name"`
|
|
35
|
+
- `require("sdk-name")` catches CommonJS usage
|
|
36
|
+
- Use the full package name including `@org/` prefix for scoped packages
|
|
37
|
+
- Do NOT search `"sdk-name"` as a bare string -- too many false positives in package.json files
|
|
38
|
+
|
|
39
|
+
**Example for `@clerk/nextjs`:**
|
|
40
|
+
```
|
|
41
|
+
require("@clerk/nextjs")
|
|
42
|
+
from "@clerk/nextjs"
|
|
43
|
+
from '@clerk/nextjs'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Python
|
|
49
|
+
|
|
50
|
+
**Search patterns:**
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
import sdk_name
|
|
54
|
+
from sdk_name import
|
|
55
|
+
from sdk_name.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Notes:**
|
|
59
|
+
- `from sdk_name.` catches submodule imports: `from requests.exceptions import`
|
|
60
|
+
- Use the PyPI package name (snake_case), not the import name if they differ
|
|
61
|
+
- Example: `Pillow` installs as `pillow` but imports as `PIL` -- search `from PIL import` not `import pillow`
|
|
62
|
+
|
|
63
|
+
**Example for `requests`:**
|
|
64
|
+
```
|
|
65
|
+
import requests
|
|
66
|
+
from requests import
|
|
67
|
+
from requests.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Go
|
|
73
|
+
|
|
74
|
+
**Search patterns:**
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
"github.com/org/sdk-name"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Notes:**
|
|
81
|
+
- Go imports use the full module path, not just the package name
|
|
82
|
+
- Include the full `github.com/org/sdk-name` path in quotes
|
|
83
|
+
- For major version suffixes, add the version: `"github.com/org/sdk-name/v2"`
|
|
84
|
+
|
|
85
|
+
**Example for `github.com/stripe/stripe-go`:**
|
|
86
|
+
```
|
|
87
|
+
"github.com/stripe/stripe-go"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Ruby / RubyGems
|
|
93
|
+
|
|
94
|
+
**Search patterns:**
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
require 'sdk-name'
|
|
98
|
+
require "sdk-name"
|
|
99
|
+
gem 'sdk-name'
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Notes:**
|
|
103
|
+
- `gem 'sdk-name'` catches Gemfile declarations (projects listing the dependency)
|
|
104
|
+
- `require 'sdk-name'` catches runtime usage
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Rust / Cargo
|
|
109
|
+
|
|
110
|
+
**Search patterns:**
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
sdk-name =
|
|
114
|
+
sdk_name =
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Notes:**
|
|
118
|
+
- Search `Cargo.toml` files for the dependency declaration
|
|
119
|
+
- Add `filename:Cargo.toml` to the query to narrow results
|
|
120
|
+
- Cargo uses hyphens in package names but underscores in crate names -- search both
|
|
121
|
+
|
|
122
|
+
**Example for `tokio`:**
|
|
123
|
+
```
|
|
124
|
+
tokio =
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## PHP / Composer
|
|
130
|
+
|
|
131
|
+
**Search patterns:**
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
require 'vendor/sdk-name'
|
|
135
|
+
use VendorName\SdkName
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Java / Maven
|
|
141
|
+
|
|
142
|
+
**Search patterns:**
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
import com.vendor.sdkname
|
|
146
|
+
<artifactId>sdk-name</artifactId>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Notes:**
|
|
150
|
+
- Maven/Gradle projects declare dependencies in `pom.xml` or `build.gradle`
|
|
151
|
+
- `<artifactId>sdk-name</artifactId>` catches Maven declarations
|
|
152
|
+
- Add `filename:pom.xml` to the query to narrow to Maven projects
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Generic Fallback
|
|
157
|
+
|
|
158
|
+
If the ecosystem is unclear, use the bare SDK name as the search query. This catches any file that mentions the name but produces more false positives. Always filter by file extension or language qualifier when possible:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
sdk-name language:javascript
|
|
162
|
+
sdk-name language:python
|
|
163
|
+
sdk-name language:typescript
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Query Limit Budget
|
|
169
|
+
|
|
170
|
+
GitHub code search rate limit: 10 requests/minute (authenticated).
|
|
171
|
+
|
|
172
|
+
- npm: 4 queries
|
|
173
|
+
- Python: 3 queries
|
|
174
|
+
- Go: 1 query
|
|
175
|
+
- Ruby: 3 queries
|
|
176
|
+
- Generic: 1-3 queries
|
|
177
|
+
|
|
178
|
+
Sleep 6 seconds between queries to stay within 10 req/min.
|
|
179
|
+
|
|
180
|
+
Total scan time per ecosystem:
|
|
181
|
+
- npm: ~24 seconds (4 queries x 6s)
|
|
182
|
+
- Python: ~18 seconds (3 queries x 6s)
|
|
183
|
+
- Go: ~6 seconds (1 query)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Adoption Scoring Guide
|
|
2
|
+
|
|
3
|
+
Used by SKILL.md Step 4 and scripts/fetch.py to classify repos by adoption signal strength.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The Problem with Raw Search Results
|
|
8
|
+
|
|
9
|
+
A GitHub code search for `require("stripe")` returns 1,000+ repos. Most are:
|
|
10
|
+
- Tutorials: "learn-stripe-payments", "stripe-integration-example"
|
|
11
|
+
- Forks: someone forked the official Stripe SDK
|
|
12
|
+
- Abandoned side projects: last push was 2021
|
|
13
|
+
- Test repos: "stripe-test-app", "payment-playground"
|
|
14
|
+
|
|
15
|
+
The adoption score filters these out and surfaces the signal that matters: an active company repo using your SDK in production.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Scoring Formula
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
score = 0
|
|
23
|
+
|
|
24
|
+
# Company signals (highest weight -- this is what you want to find)
|
|
25
|
+
if owner_type == "Organization": score += 50 # GitHub org = company or team
|
|
26
|
+
if company_field and company_field.strip(): score += 20 # user has company listed on GitHub
|
|
27
|
+
|
|
28
|
+
# Activity signals
|
|
29
|
+
score += min(stars, 500) / 10 # up to 50 points; capped at 500 stars
|
|
30
|
+
if days_since_push < 30: score += 30 # active in last month
|
|
31
|
+
if days_since_push < 7: score += 20 # active this week (cumulative with above)
|
|
32
|
+
|
|
33
|
+
# Quality signals
|
|
34
|
+
if not is_fork: score += 10 # original project, not a fork
|
|
35
|
+
if not is_archived: score += 10 # not abandoned
|
|
36
|
+
if not is_tutorial: score += 20 # not a demo or example
|
|
37
|
+
|
|
38
|
+
# Maximum possible score: 160+
|
|
39
|
+
# Typical company_org with recent activity: 110-150
|
|
40
|
+
# Typical active solo dev project: 60-90
|
|
41
|
+
# Typical stale personal project: 20-40
|
|
42
|
+
# Tutorial/noise: 0-20
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Score Tiers
|
|
48
|
+
|
|
49
|
+
| Score | Tier | What it means |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| >= 80 | High signal | Generate a full adoption brief and outreach message |
|
|
52
|
+
| 40-79 | Medium signal | List in report, no full brief |
|
|
53
|
+
| < 40 | Noise | Include in breakdown count only |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Company Classification Tiers
|
|
58
|
+
|
|
59
|
+
| Tier | Criteria | Confidence |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `company_org` | `owner.type == "Organization"` | High -- GitHub org accounts are almost always a company, team, or serious open-source project |
|
|
62
|
+
| `affiliated_dev` | `owner.type == "User"` AND `company` field populated on GitHub profile | Medium -- self-reported, but developers with a company listed are usually professionals |
|
|
63
|
+
| `solo_dev` | `owner.type == "User"` AND no company field AND stars >= 10 | Low -- could be anyone; stars signal real usage |
|
|
64
|
+
| `tutorial_noise` | Name or description matches tutorial keywords, OR repo is a fork, OR repo is archived | Excluded from lead output |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Tutorial Noise Detection
|
|
69
|
+
|
|
70
|
+
A repo is classified as `tutorial_noise` if its name or description contains any of these words:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
example, tutorial, demo, learn, sample, starter, boilerplate,
|
|
74
|
+
template, playground, test, course, workshop
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Additional noise signals:
|
|
78
|
+
- `fork == true`: the repo is a fork (could be a fork of the SDK itself)
|
|
79
|
+
- `archived == true`: the repo is no longer maintained
|
|
80
|
+
- Repo name matches the SDK name exactly (e.g. searching for `stripe` and finding a repo called `stripe`)
|
|
81
|
+
- Repo name starts with the SDK name followed by a dash (e.g. `stripe-clone`, `stripe-copy`)
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Velocity Signals
|
|
86
|
+
|
|
87
|
+
Velocity is inferred from `created_at` dates, not from direct historical data.
|
|
88
|
+
|
|
89
|
+
**Primary velocity metric:** Count of repos with `created_at` in the last 7, 14, and 30 days.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
New repos last 7 days: 3
|
|
93
|
+
New repos last 30 days: 11
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This tells you: 3 new teams started using the SDK in the last week.
|
|
97
|
+
|
|
98
|
+
**Secondary velocity metric (requires previous snapshot):** When a previous JSON snapshot exists in `docs/sdk-adopters/`, compare the current repo list to the previous one. The difference is the exact set of new adopters since the last run.
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
New since last run (14 days ago): 5
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Velocity interpretation:**
|
|
105
|
+
- 0 new in 30 days: stagnant adoption, possibly indexed months ago and no new users
|
|
106
|
+
- 1-3 new in 7 days: healthy organic growth
|
|
107
|
+
- 5+ new in 7 days: breakout adoption, consider proactive outreach
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## The Top Contributor Signal
|
|
112
|
+
|
|
113
|
+
For each enriched repo, the script fetches the top 3 contributors by commit count via:
|
|
114
|
+
`GET /repos/{owner}/{repo}/contributors?per_page=3`
|
|
115
|
+
|
|
116
|
+
The person with the most commits is the most likely person to have introduced the SDK to that project. They are the warmest possible outreach target because:
|
|
117
|
+
1. They chose the SDK
|
|
118
|
+
2. They understand what it does
|
|
119
|
+
3. They have the context to evaluate an upgrade, integration, or partnership
|
|
120
|
+
|
|
121
|
+
If you cannot identify the top contributor (rate limit, private contributors), fall back to the repo owner.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Why Organization Repos Are Worth 50 Points
|
|
126
|
+
|
|
127
|
+
A `owner.type == "Organization"` repo means:
|
|
128
|
+
- A team created a GitHub org to publish this code
|
|
129
|
+
- At minimum, multiple people are involved
|
|
130
|
+
- The code is likely maintained beyond a single developer's interest
|
|
131
|
+
- The org may represent an actual company (check `org.blog` for the website)
|
|
132
|
+
|
|
133
|
+
Contrast with a user repo: one developer, may be a side project, no team ownership.
|
|
134
|
+
|
|
135
|
+
The 50-point weight reflects that finding a company using your SDK is 2-3x more valuable for GTM purposes than finding an individual developer.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Common Misclassifications
|
|
140
|
+
|
|
141
|
+
**Large open-source projects classified as company_org:**
|
|
142
|
+
A GitHub org doesn't always mean a company. The Linux Foundation, Apache, CNCF, and similar foundations use orgs. These are valuable signal (indicates enterprise-grade adoption) but the outreach angle differs -- reach out to the project maintainers, not a sales contact.
|
|
143
|
+
|
|
144
|
+
**Tutorial repos with high stars:**
|
|
145
|
+
A well-known tutorial like "stripe-payments-tutorial" may have 500 stars. The adoption score caps the star contribution at 50 points (max 500 stars / 10), but the tutorial detection should have already filtered it. If a high-star tutorial slips through, check `data_quality_flags`.
|
|
146
|
+
|
|
147
|
+
**New repos with inflated scores:**
|
|
148
|
+
A repo created this week by an organization (50 points) with active recent push (50 points) scores 100+ even with 0 stars. This is intentional: a company adopting the SDK this week is a higher-priority outreach target than a solo dev with 50 stars who hasn't pushed in 6 months.
|