ShipSleuthShipSleuthPublic GitHub diligence

Methodology

How ShipSleuth turns messy public GitHub activity into an honest DD read.

The goal is not to pretend public GitHub is the whole truth. The goal is to make the visible surface more legible, comparable, and harder to misuse.

What ShipSleuth measures

  • Public, owned GitHub repositories for an org or user
  • Default-branch commits inside the selected date window
  • Public PRs opened or merged inside the selected date window
  • Visible releases published in-window
  • Author-versus-bot-account activity, repo breadth, collaboration, and concentration
  • PR merge velocity and bus-factor concentration from the same data

What it does not know (by default)

  • Private repositories or private deployment activity — unless the user opts in to the private activity supplement
  • Internal engineering velocity outside GitHub.com
  • Whether a hidden org membership maps to an employee or contractor
  • Product quality; it only measures public shipping signal

How the read works

  • Author commits, merged PRs, releases, active contributors, active repos, active days, and lines changed are the primary reads
  • Concentration and bot-heavy patterns are called out so the visible activity shape is harder to misread
  • Confidence and caveats are shown with every result so partial samples stay obvious
  • Trend windows let you compare adjacent periods without pretending the tool knows the whole company
  • "View the Math" on any result shows the exact anchors, interpolation, and population estimates

Why caveats are first-class

  • Commit counts are easy to misuse when presented without context
  • Monorepos, squashes, mirrors, and bots distort the naive story
  • Some companies ship heavily in private and look quiet in public
  • This is a diligence signal, not a verdict

Optional private supplement

ShipSleuth defaults to public-only analysis, but users can optionally enter self-reported private activity — additional commits, PRs, repos, releases, active days, and lines changed — to produce a more complete picture. When supplemented:

Private supplement values are self-reported and not verified by ShipSleuth. They are meant to reduce the structural blind spot of private work, not to replace proper diligence. The analysis always indicates when private data has been included.

Calculator-first

Earlier drafts experimented with composite scoring and leaderboard-style presentation. ShipSleuth now prioritizes direct metrics and context to avoid false precision.

Author commitsVisible commit volume from real accounts (bot accounts excluded) inside the window.
Merged PRsA cleaner signal of integrated public work than commit count alone.
Contributor breadthHow many visible contributors and repos share the public activity footprint.
ReleasesVisible shipping artifacts that suggest something reached a public milestone.
Active daysDistinct days with at least one push event inside the window.
Lines changedWeekly code adds + deletes via GitHub code frequency. Noisy — includes all authors and generated code.
Merge velocityMedian hours from PR open to merge for author-attributed PRs merged in-window.
Bus factorMinimum contributors needed to account for half of author commits.
ConcentrationWhether one repo or one actor dominates the visible public output.
ConfidenceHow trustworthy the visible sample looks after caps, failures, and truncation.

Percentile anchor calibration

Where the threshold numbers come from

When ShipSleuth says “Top ~0.1%” for a metric, it interpolates your value against a table of anchor thresholds derived from real GH Archive data. Here is how each one was derived.

Data source

Anchors are derived from GH Archive data queried via ClickHouse Playground (July 2026, covering the preceding 90 days). GH Archive captures all public GitHub events — pushes, PRs, releases, etc. — and ClickHouse provides free, zero-auth SQL access to the full dataset.

Population baseline

GitHub reports 100M+ total accounts (Octoverse 2023). Most are inactive. Querying GH Archive for distinct actors with at least 1 public PushEvent in the last 90 days yields ~8.7M accounts (8,677,027). Filtering out known bot/CI accounts (dependabot, renovate, github-actions, etc.) brings the human pool to ~8.6M — bots account for only ~0.4% of push-active accounts.

Last refreshed: 2026-07-21.

Commits (humanCommits)

GH Archive counts PushEvents, not individual commits. Each push contains ~1-3 commits on average, so we apply a ×2 multiplier. Raw GH Archive percentiles (push events): P50=4, P90=28, P99=178, P99.99=12,793.

8Top ~50%P50=4 pushes ×2. Median dev pushes ~4 times in 90 days.
20Top ~25%P75=10 pushes ×2. Commits a few times per week.
56Top ~10%P90=28 pushes ×2. Pushing almost daily — consistent contributor.
106Top ~5%P95=53 pushes ×2. Multiple pushes per day, full-time open-source pace.
356Top ~1%P99=178 pushes ×2. Among the most active public contributors.
2,390Top ~0.1%P99.9=1,195 pushes ×2. Extremely prolific — often monorepo or multi-project workflows.
25,586Top ~0.01%P99.99=12,793 pushes ×2. Top handful globally — may include automated-but-human-attributed workflows.

Merged PRs (mergedPullRequests)

GH Archive PullRequestEvent(action=closed). Only 42,055 actors closed any public PRs in 90 days (~0.5% of pushers), so percentiles for this metric are within that cohort, not among all pushers — and the recorded actor is the account that closed the PR (often a maintainer), not necessarily its author. Cohort percentiles: P50=1, P90=2, P99=10, P99.99=2,796.

1Top ~50%GH Archive P50=1 closed PRs. Most PR-active accounts close just 1 in 90 days.
2Top ~10%GH Archive P90=2 closed PRs. Consistent PR contributor.
3Top ~5%GH Archive P95=3 closed PRs. Active reviewer and contributor.
10Top ~1%GH Archive P99=10 closed PRs. Heavy PR throughput — managing multiple repos.
253Top ~0.1%GH Archive P99.9=253 closed PRs. Among the most active closers on GitHub.
2,796Top ~0.01%GH Archive P99.99=2,796 closed PRs. Near the absolute ceiling for public PR closes.

Profile contributions (profileContributions)

GH Archive count of PushEvent + PullRequestEvent + IssuesEvent + PullRequestReviewCommentEvent per actor over 365 days (~18.6M non-bot actors — a wider universe than the 8.7M pushers, since it includes accounts that only open issues or review). P50=5, P75=16, P90=47, P95=91, P99=340, P99.9=1,597, P99.99=14,829. ShipSleuth scrapes the in-window contribution count, so these 365-day thresholds are scaled to your analysis window before comparison. This is an event-count proxy for GitHub's contribution number, which counts individual commits rather than pushes. Last refreshed: 2026-07-21.

Lines changed (linesChanged)

Not available in GH Archive. Estimated anchors are retained for reference but no percentile badge is shown for this metric since we cannot validate the thresholds against real population data. The raw metric value is still displayed.

10kTop ~50%~110 lines/day. Light but steady code changes. (Estimated — no GH Archive data.)
30kTop ~25%~333/day. Regular feature development.
80kTop ~10%~888/day. Heavy development or multiple active projects.
200kTop ~5%~2.2k/day. Major features, migrations, or multiple concurrent repos.
500kTop ~1%~5.5k/day. Often includes generated code, large refactors, or monorepo changes.
1MTop ~0.1%~11k/day. Almost certainly includes codegen, migrations, or vendor updates.
2MTop ~0.01%~22k/day. Extreme outlier — major infrastructure or generated code.

Active repos

GH Archive distinct repos per actor. P50=1, P75=2, P90=4, P95=5, P99=11, P99.99=264. Most devs push to just 1 repo. Maintaining 11+ active repos in 90 days puts you in the Top ~1%.

Releases

GH Archive ReleaseEvents. Only 88,682 actors published any releases in 90 days (~1% of active devs), so percentiles are within the publisher cohort. Among publishers: P50=1, P75=2, P90=3, P95=5, P99=15, P99.99=478.

Active days

GH Archive distinct push dates per actor. P50=2, P75=5, P90=11, P95=17, P99=41, P99.99=72. The median developer pushes on just 2 distinct days per quarter. Active days are capped at window length (72 days = Top ~0.01% for a 90-day window — shipping most weekdays all quarter).

Contributors

GH Archive distinct pushers per repo owner, across ~8.6M owners with public push activity. Over 90% of owners have just 1 contributor (themselves). P99=4, P99.9=10, P99.99=44. Having 4+ distinct contributors puts an owner in the Top ~1%.

How interpolation works

Your value is placed between the two nearest anchors. The percentile axis is interpolated in log-space (not linearly) because developer activity follows a power-law distribution — a small number of developers are orders of magnitude more active than the median. Log-interpolation respects this shape.

Thresholds are scaled from each metric's calibration window to your analysis window (most metrics are calibrated on 90 days; profile contributions on 365; commits/week is a rate and never scales). A 30-day window scales 90-day thresholds to 1/3. The effective window is clamped to 9–720 days: beyond ~2 years, contributor churn makes linear scaling unreliable, so longer windows are compared against 720-day thresholds and percentiles for 2y+ windows should be read as generous upper bounds. The percentile axis stays the same — “Top ~1%” always means Top ~1% of the stated cohort.

Limitations and honesty

  • Anchors are derived from real GH Archive data, but GH Archive only captures public GitHub events. Private repo activity is invisible.
  • GH Archive counts PushEvents, not individual commits. The ×2 multiplier for commits is an approximation — actual commit-per-push ratios vary by workflow.
  • PR “closed” events include both merges and rejections. The real merged-PR distribution may differ.
  • The real distribution shifts over time as GitHub grows. We plan to refresh anchors periodically via automated ClickHouse queries.
  • Monorepo teams, squash-merge policies, and CI bot patterns can inflate or deflate raw counts.
  • The “Top ~X%” claim means: “among ~8.6M human accounts active on public GitHub in the last 90days, we estimate your visible activity places you roughly in the top X%.” It is not an exact ranking.
  • You can verify every step: click “View the math” on any analysis result to see your value, the scaled anchors, and the exact interpolation.

Overall score

The composite score is a weighted average of 7 log-scaled dimensions (volume 30%, breadth 19%, consistency 18%, releases 10%, recency 10%, collaboration 8%, concentration 5%). The score itself is then mapped to a percentile tier using a separate set of anchors calibrated against the expected score distribution. A score of 85+ maps to Top 1%; a score of 30 maps to Top 50%.

Transparency note: Unlike per-metric percentiles (which are derived directly from GH Archive population data), the overall score anchors are estimated based on the expected distribution of composite scores. There is no way to query GH Archive for a composite score that only exists inside ShipSleuth. The individual metrics feeding the score are well-calibrated, but the overall percentile mapping is an informed estimate, not a measurement.

Builder · AI usage methodology

How Builder turns local AI-tool state into a private dashboard.

Builder is the AI agent usage layer of the analyzer, folded into the main page rather than living at a separate URL. It tracks your own AI coding usage across Claude Code, Codex, Gemini CLI, and Cursor. The web page never reaches into your machine. Instead, a local CLI scans on-disk state, emits a JSON blob, and you paste it into the "Add your AI agent usage" section that appears below the analyzer form. The methodology below is the privacy contract that lets us do this honestly.

Adapter pattern with a strict schema gate

Each supported tool has its own adapter under src/lib/ai-usage/adapters/ that knows where the tool stores its state and which fields are safe to read. Every adapter returns the same UsageRecord shape and nothing else. The shape is enforced by a .strict()zod schema, which means any unknown key — a leaked prompt, a stray cwd, a session UUID — causes the record to be rejected before it ever leaves the CLI. The same schema runs again in the browser before the blob is stored.

Day-level bucketing only

The date field is validated as YYYY-MM-DD(UTC). Anything finer — hours, minutes, timezone-local times — fails schema validation. This is a deliberate guard against work-schedule inference from sub-day timestamps. The CLI takes each event's ISO timestamp, truncates to its UTC date, and aggregates from there.

Allowlist columns for SQLite reads

Cursor stores chat history alongside usage metadata in SQLite at state.vscdb. The Cursor adapter unions two read-only sources via better-sqlite3. Source A globs User/workspaceStorage/*/state.vscdb for per-workspace databases and reads the legacy aiService.prompts and aiService.generations keys from each ItemTable. Source B opens the global User/globalStorage/state.vscdb and streams cursorDiskKV rows where the key matches bubbleId:% — this is where Cursor 0.43+ keeps current-format chat data, including per-call inputTokens/outputTokens. From every row the extractor pulls only the UTC day (from unixMs, createdAt, clientRpcSendTime, clientSettleTime, or clientEndTime), one of modelType / model / modelId / modelName / lastUsedModel (capped at 80 chars), and integer token counts. Every other column and JSON property — chat text, images, file paths, workspace names, conversation IDs — is discarded inside the extractor. The CLI is the only place that touches the file, and the strict schema is the second wall: even if the query were widened, the resulting object would be rejected before serialization.

Browser-local persistence, URL-carried sharing

The Builder section reads and writes a single localStorage key. The dashboard you see is rendered entirely from that key. Nothing is uploaded automatically, and there is no background telemetry. The one way Builder data leaves your browser is when you toggle AI agent metrics on the stats card and copy the share link: a trimmed copy of the aggregated stats (top 5 models, top 4 tools, last 30 daily entries) rides inside the URL itself, deflated and base64url-encoded under ?agent=v1.…. No server persists it — the URL is the data. To be honest about it, that URL ends up in the recipient's browser history, in Vercel's default request logs (no persistence beyond standard retention), and in any link-unfurler the recipient pastes it through. If that's uncomfortable for a given dashboard, leave the AI agent toggles off.

What this methodology cannot tell you

  • Token counts come from each tool's own telemetry. We don't re-tokenize anything — if a tool under-reports cached tokens, so do we.
  • Gemini CLI only writes persistent counts when telemetry is enabled in settings.json. Without it, the adapter detects the install but reports zero records.
  • Prompts and sessions are counted by event shape, not by intent. A retry, a continuation, or a tool-result turn can shift those counts in ways the underlying tools don't always document.
  • Day boundaries are UTC. A late-night session that crosses midnight in UTC will split across two day buckets.