# Cold Start Data — N2-A-001 star-velocity measurement (as-run method)

Run date: **2026-08-27** (UTC). This is the complete measurement behind the episode
*"We Tracked Every Viral AI Repo. Most Stars Predict Nothing."* — every number
narrated in that video comes from these files.

The sample design was frozen **before** the pull; it is reproduced verbatim in
`PRE-REGISTRATION.md`. Every place the as-run measurement departed from that plan
is listed below under *Deviations*, in full, including the ones that were
inconvenient. Scripts are in `scripts/`; unmodified raw pulls are in `raw/`.

## Route used

**Route (a): ClickHouse public playground** (`play.clickhouse.com`, user `play`,
`github_events` dataset — a mirror of the GH Archive event stream). Currency check
passed at run time: dataset spans **2023-01-13 13:00 → 2026-07-02 23:00 UTC**
(3,173,399,592 events; see `raw/clickhouse_meta.txt`). This is well past the
mid-2025 requirement, so the playground was used for discovery and daily series.

**Route (b): GitHub Search API** was run regardless, as the pre-registered
cross-check: monthly `created:` buckets × `stars:>=5000`, per_page=100, throttled
under 30 req/min, no bucket exceeded the 1,000-result cap. Search measures stars
**today**, not 60-day velocity, and cannot see deleted repos — the delta between
routes is the survivorship measurement, not noise.

## Cohort rule (pre-registered, as applied)

Public repos **created 2023-01-01..2025-06-30** that gained **≥5,000 stars
(WatchEvents) within 60 days of creation**. Stars counted from the GH Archive
event stream (gross star additions; unstars are not events). Outcomes at T+12
measured from each repo's **crossing day** (the day cumulative WatchEvents from
creation reached 5,000), in 30-day months; peak proxy = best of months 1–3
after crossing (pre-registered peak proxy).

## Deviations from the pre-registration (complete list)

1. **Dataset floor 2023-01-13.** The playground's `github_events` begins
   2023-01-13, not 2011. Repos created 2023-01-01..2023-01-13 are invisible to
   route (a); the Search cross-check covers that sliver (stars-today basis only).
   Effective route-(a) creation window: 2023-01-14..2025-06-30.
2. **Discovery keyed on first public event, not CreateEvent.** Repos born
   private and later made public (verified: twitter/the-algorithm,
   yoheinakajima/babyagi, AntonOsika/gpt-engineer) emit **no public
   repository-CreateEvent**, so a CreateEvent-based discovery misses them (it
   found only 68 of the eventual candidates). As run: candidates = repos with
   ≥5,000 total WatchEvents whose first public event of any type falls in the
   window and whose stars within 60 days of that first event reached ≥5,000;
   the pre-registered rule (60 days of **creation**) was then re-applied using
   the true `created_at` fetched from the GitHub API. Candidates whose
   creation-based 60-day count fell below 5,000 (quiet-launch/born-private
   cases) were excluded and are preserved in `excluded_candidates.csv`.
   Residual risk: a repo created in-window whose *public launch* happened >60
   days after creation and whose creation-window stars still reached 5,000
   cannot exist (stars require being public), so the rule is conservative
   exactly as pre-registered. A repo public-since-birth but starless for its
   first 60 days then viral later is correctly excluded.
3. **Deleted repos' creation dates are proxied.** For 404/403 repos the GitHub
   API has no `created_at`; fallback order: earliest public
   CreateEvent(repository) in the archive, else first-seen date. Recorded per
   row in `creation_source`.
4. **Renames merged via API redirects.** WatchEvents are logged under
   name-at-event-time; alias rows (e.g. `Torantulino/Auto-GPT` +
   `Significant-Gravitas/Auto-GPT` → `Significant-Gravitas/AutoGPT`) were
   merged by following REST redirects; per-day series summed across aliases.
   Renamed-and-then-deleted repos cannot be re-merged; none were observed with
   >5,000-star aliases in-window.
5. **Day granularity.** 60-day windows are day-granular (dates, not
   timestamps); the discovery pass used second-granular first_seen. Off-by-hours
   at window edges is possible; immaterial at cohort thresholds.
6. **Commit-window sampling cap.** Commit author pages capped at 12 pages
   (1,200 commits) per 30-day window; windows above the cap extrapolate the
   sampled human/bot ratio to the window's `totalCount` (`truncated` flag in
   `raw/outcomes.jsonl`). Human-commit counts are therefore estimates for the
   busiest windows.
7. **Bot filter (frozen, as pre-registered plus email evidence):** commit author
   counted as bot if login or name matches `.*\[bot\]$`, `user.__typename ==
   "Bot"`, or author email contains `[bot]` / starts `actions@github.com`.
8. **Issue responsiveness was NOT measured** (pre-registration listed it as an
   outcome; per-issue comment paging did not fit the API budget). RESULT C
   substitutes release count as the third health measure. The script line in
   Beat 8 referencing issue responsiveness must be adjusted before lock.
9. **"Week-one star velocity" = stars in the first 7 days of public life**
   (first-seen basis). For born-private launches, week one of *creation* would
   be degenerate (zero by construction). Recorded per row (`stars_7d_launch`).
10. **T+12 "dormant" is measured two ways** (both reported): the bracketed
    definition from the task/pre-registration (pushedAt >6 months stale at run
    date) and a historical one (zero human commits in month 12 after crossing).
    `pushedAt` is only observable as-of-today; it also counts bot pushes, which
    makes "alive now" generous.
11. **AI-rubric ambiguity policy:** the three ambiguous keywords (`ai`, `rag`,
    `agents`) match on token boundaries only; the distinctive eight match as
    substrings (`machine-learning`/`deep-learning` also match with spaces).
    Every borderline call is listed in `ai_label_borderline_calls.json`
    (keyword-only positives, and ambiguous-substring negatives such as DragGAN
    via the `rag` in "drag"). Known rubric miss kept frozen: `xai-org/grok-1`
    (description "Grok open release" carries no rubric keyword) labels non-AI.
12. **The frozen rubric undercounts AI repos on 2026 metadata** (descriptions
    get rewritten or emptied — cursor/cursor and babyagi now have EMPTY
    descriptions; "llama", "agent" (singular), "sd" are not rubric keywords).
    The rubric label is reported unchanged as `ai_label` (pre-registered
    number); a documented manual audit
    (`ai_label_manual_review.json`: 41 additions, 1 false-positive removal,
    8 kept-as-is judgment calls, every one with a reason) is reported alongside
    as `ai_label_reviewed`. Both shares appear in RESULT A; the episode should
    quote the rubric number as primary and the audited number as the check.

## Rate limits & runtime notes

- ClickHouse playground: no auth; three queries (~1–2 min each), retried on 5xx.
- Search API: 47 requests over ~2 min at ~27 req/min; no secondary-limit hits.
- REST metadata: 247 requests (~1 min); GraphQL outcomes: ~1 point per repo +
  history paging, stayed >4,000 remaining of 5,000/hr throughout.
- Stargazers-restriction test (`raw/stargazers_restriction_test.json`),
  run against a foreign repo (twitter/the-algorithm) on 2026-08-27:
  - REST `/stargazers` (both media types): **HTTP 404**.
  - GraphQL `stargazers(orderBy: STARRED_AT)`: opaque execution error
    ("Something went wrong while executing your query", reference
    `D28A:2EF9DF:640997D:1507B750:6A90C972`).
  - GraphQL `stargazers(first:2)` without orderBy: **silently returns zero
    edges**. Control: `stargazerCount`/`totalCount` still public (73,868).

## Files

| File | Contents |
|---|---|
| `cohort.csv` | final cohort, one row per repo (pre-registered columns first, extras after) |
| `excluded_candidates.csv` | discovery candidates that failed the strict creation-window rule, with reasons |
| `ai_label_borderline_calls.json` | every borderline AI-rubric call |
| `ai_label_manual_review.json` | the secondary audit layered on the frozen rubric — every override, with reasons |
| `raw/` | unmodified pulls: ClickHouse TSVs, search TSV, REST/GraphQL JSONL, restriction test |
| `scripts/` | the four scripts that produced everything here, in run order |
| `PRE-REGISTRATION.md` | the sample design as frozen before the pull |
| `results.json` | RESULT blocks A–D, machine-readable |
| `results.md` | the narrated numbers with their caveats |

## Reproduction

```
python3 scripts/01_discovery_clickhouse.py   # no token needed
python3 scripts/02_search_crosscheck.py      # needs GITHUB_TOKEN in .env
python3 scripts/03_outcomes_graphql.py       # needs GITHUB_TOKEN in .env
python3 scripts/04_analyze.py
```

Note: 01 re-runs against a live mirror and 02/03 against the live API, so exact
counts drift with time; `raw/` is the frozen snapshot backing the episode.

## Reuse

Published by [Vantedge Vault](https://vantedgevault.com) so this measurement can be
checked and re-run. Take it, re-run it, argue with it — attribution appreciated,
corrections more so: hello@vantedgevault.com.
