diff --git a/.github/workflows/benchmark-history.yml b/.github/workflows/benchmark-history.yml new file mode 100644 index 0000000..d1d01ff --- /dev/null +++ b/.github/workflows/benchmark-history.yml @@ -0,0 +1,50 @@ +name: Benchmark history + +on: + schedule: + - cron: "0 12 * * 1" + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: benchmark-history-${{ github.ref }} + cancel-in-progress: false + +jobs: + update-history: + name: Update benchmark history + runs-on: ubuntu-latest + timeout-minutes: 60 + env: + HUSKY: 0 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.10 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Refresh rolling benchmark history + run: bun run benchmark:history + + - name: Commit history updates + run: | + if git diff --quiet -- benchmarks/history reports/known-ai-vs-solid-oss-history.md; then + echo "No history changes to commit" + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add benchmarks/history reports/known-ai-vs-solid-oss-history.md + git commit -m "Update benchmark history" + git push diff --git a/AGENTS.md b/AGENTS.md index 11bae53..fa2975a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,40 @@ - Output formats: `src/reporters/*` - Current language scope: `src/languages/javascript-like.ts` +## Rolling benchmark history + +The repo now has **two benchmark modes**: + +1. **Pinned benchmark** for reproducible claims + - manifest: `benchmarks/sets/known-ai-vs-solid-oss.json` + - snapshot: `benchmarks/results/known-ai-vs-solid-oss.json` + - report: `reports/known-ai-vs-solid-oss-benchmark.md` +2. **Rolling history** for default-branch-over-time trend tracking + - runner: `scripts/benchmark-history.ts` + - history logic: `src/benchmarks/history.ts` + - latest-ref parsing: `src/benchmarks/latest-ref.ts` + - report rendering: `src/benchmarks/history-report.ts` + - per-repo JSONL: `benchmarks/history/known-ai-vs-solid-oss/*.jsonl` + - aggregate summary: `benchmarks/history/known-ai-vs-solid-oss/latest.json` + - generated report: `reports/known-ai-vs-solid-oss-history.md` + +Rolling-history flow: + +- resolve each repo's current default branch with `git ls-remote --symref HEAD` +- resolve the commit that existed on that branch at the run's `recordedAt` timestamp +- checkout that commit into `benchmarks/.cache/checkouts-history//` +- analyze with the default registry and default config +- write one history point per repo per **UTC week** +- replace the same week's point on rerun instead of appending duplicates +- use `bun run benchmark:history --recorded-at ` to backfill prior weekly points honestly +- backfills may skip newer repos for older weeks if the repo had no commit on its current default branch yet +- compute two blended scores for each point: + - `vsCurrentCohort` for same-run relative ranking + - `vsPinnedBaseline` for cleaner long-term trend lines +- regenerate `latest.json` and the markdown history report from the JSONL files + +When editing history logic, preserve the separation between pinned and rolling artifacts. Latest-ref scans must not overwrite the pinned snapshot/report used for reproducible benchmark claims. + ## Working rules - Preserve determinism, stable ordering, and explainable evidence. @@ -57,7 +91,5 @@ - Stable self-scan runs the last published package, so newer config features may lag there; use the committed baseline in `tests/fixtures/self-scan-stable-baseline.json` as the source of truth for accepted stable-release behavior. - If rule behavior changes, update focused tests and `tests/fixtures-regression.test.ts`. - If stable self-scan regressions are intentional, refresh `tests/fixtures/self-scan-stable-baseline.json` with `bun run lint:self:update`. -- If benchmark-facing behavior changes materially, rerun `bun run benchmark:update` intentionally. - -terially, rerun `bun run benchmark:update` intentionally. -, rerun `bun run benchmark:update` intentionally. +- If pinned benchmark-facing behavior changes materially, rerun `bun run benchmark:update` intentionally. +- If rolling benchmark-history behavior changes materially, rerun `bun run benchmark:history` intentionally. diff --git a/README.md b/README.md index 30de1db..8fb9444 100644 --- a/README.md +++ b/README.md @@ -141,20 +141,7 @@ Current checks focus on patterns that often show up in unreviewed generated code - [placeholder comments](src/rules/placeholder-comments/README.md) - [duplicated test mock/setup patterns](src/rules/duplicate-mock-setup/README.md) -## What you get back - -- raw repo score -- normalized metrics: - - score / file - - score / KLOC - - score / function - - findings / file - - findings / KLOC - - findings / function -- top file hotspots -- top directory hotspots -- grouped lint-style findings with `--lint` -- full-fidelity findings with evidence in `--json` +`scan` reports raw + normalized scores, hotspot tables, and grouped findings. Use `--json` when you want the full evidence payload. ## Supported files @@ -187,36 +174,48 @@ _Why before Jan 1, 2025?_ Because this cutoff aims to catch mature OSS before AI | Findings / KLOC | **2.96** | **1.38** | **2.14x** | | Findings / function | **0.08** | **0.04** | **2.21x** | -### Pinned benchmark snapshot - -Ordered by blended score. - -| Repository | Cohort | Ref | Blended | Score/file | Score/KLOC | Findings/file | Findings/KLOC | -| --------------------------------------------------------------------- | ---------- | --------- | -------: | ---------: | ---------: | ------------: | ------------: | -| [`garrytan/gstack`](https://github.com/garrytan/gstack) | ai | `6cc094c` | **5.33** | 2.34 | 21.71 | 0.52 | 4.85 | -| [`redwoodjs/agent-ci`](https://github.com/redwoodjs/agent-ci) | ai | `4de00d6` | **3.57** | 0.99 | 10.95 | 0.31 | 3.42 | -| [`jiayun/DevWorkbench`](https://github.com/jiayun/DevWorkbench) | ai | `ea50862` | **3.39** | 1.00 | 10.76 | 0.44 | 4.69 | -| [`openclaw/openclaw`](https://github.com/openclaw/openclaw) | ai | `44cf747` | **3.06** | 1.04 | 10.60 | 0.32 | 3.22 | -| [`robinebers/openusage`](https://github.com/robinebers/openusage) | ai | `857f537` | **3.02** | 1.27 | 7.92 | 0.33 | 2.07 | -| [`emdash-cms/emdash`](https://github.com/emdash-cms/emdash) | ai | `dbaf8c6` | **2.17** | 0.73 | 6.54 | 0.22 | 1.98 | -| [`FullAgent/fulling`](https://github.com/FullAgent/fulling) | ai | `d95060f` | **2.16** | 0.53 | 9.51 | 0.16 | 2.96 | -| [`cloudflare/vinext`](https://github.com/cloudflare/vinext) | ai | `28980b0` | **1.99** | 0.48 | 9.20 | 0.15 | 2.76 | -| [`withastro/astro`](https://github.com/withastro/astro) | mature-oss | `f706899` | **1.58** | 0.28 | 6.75 | 0.10 | 2.31 | -| [`payloadcms/payload`](https://github.com/payloadcms/payload) | mature-oss | `f3f36d8` | **1.47** | 0.24 | 4.04 | 0.08 | 1.38 | -| [`vitejs/vite`](https://github.com/vitejs/vite) | mature-oss | `a492253` | **1.47** | 0.25 | 8.19 | 0.08 | 2.52 | -| [`pmndrs/zustand`](https://github.com/pmndrs/zustand) | mature-oss | `2e6d881` | **1.45** | 0.47 | 3.20 | 0.19 | 1.27 | -| [`modem-dev/hunk`](https://github.com/modem-dev/hunk) | ai | `b37663f` | **1.18** | 0.38 | 4.71 | 0.13 | 1.55 | -| [`umami-software/umami`](https://github.com/umami-software/umami) | mature-oss | `227b255` | **1.00** | 0.17 | 4.36 | 0.07 | 1.66 | -| [`egoist/tsup`](https://github.com/egoist/tsup) | mature-oss | `cd03e1e` | **0.95** | 0.22 | 3.83 | 0.09 | 1.50 | -| [`sindresorhus/execa`](https://github.com/sindresorhus/execa) | mature-oss | `99d1741` | **0.89** | 0.17 | 4.86 | 0.05 | 1.37 | -| [`mikaelbr/node-notifier`](https://github.com/mikaelbr/node-notifier) | mature-oss | `b36c237` | **0.41** | 0.08 | 0.90 | 0.04 | 0.47 | -| [`vercel/hyper`](https://github.com/vercel/hyper) | mature-oss | `2a7bb18` | **0.41** | 0.65 | 1.12 | 0.16 | 0.28 | +### Rolling benchmark snapshot + +Latest default-branch history, still normalized against the frozen pinned baseline. Ordered by latest pinned score. + +| Repository | Cohort | Latest ref | Current blended | Latest pinned | Highest pinned | Δ prev | Δ peak | +| --------------------------------------------------------------------- | ---------- | ---------------- | --------------: | ------------: | -------------: | -----: | -----: | +| [`garrytan/gstack`](https://github.com/garrytan/gstack) | ai | `main@c6e6a21` | **4.59** | **4.77** | **6.37** | -0.64 | -1.60 | +| [`redwoodjs/agent-ci`](https://github.com/redwoodjs/agent-ci) | ai | `main@c61f27d` | **3.76** | **3.91** | **3.91** | +0.51 | 0.00 | +| [`jiayun/DevWorkbench`](https://github.com/jiayun/DevWorkbench) | ai | `main@ea50862` | **3.26** | **3.39** | **3.40** | 0.00 | -0.02 | +| [`robinebers/openusage`](https://github.com/robinebers/openusage) | ai | `main@06113d6` | **2.91** | **3.03** | **3.06** | +0.01 | -0.03 | +| [`openclaw/openclaw`](https://github.com/openclaw/openclaw) | ai | `main@1de5610` | **2.81** | **2.92** | **3.15** | -0.23 | -0.23 | +| [`FullAgent/fulling`](https://github.com/FullAgent/fulling) | ai | `main@d95060f` | **2.07** | **2.16** | **2.16** | 0.00 | 0.00 | +| [`emdash-cms/emdash`](https://github.com/emdash-cms/emdash) | ai | `main@a1dac00` | **1.94** | **2.01** | **2.17** | -0.16 | -0.16 | +| [`cloudflare/vinext`](https://github.com/cloudflare/vinext) | ai | `main@e81a621` | **1.85** | **1.93** | **1.99** | -0.06 | -0.07 | +| [`vitejs/vite`](https://github.com/vitejs/vite) | mature-oss | `main@bc5c6a7` | **1.46** | **1.52** | **1.52** | +0.02 | 0.00 | +| [`modem-dev/hunk`](https://github.com/modem-dev/hunk) | ai | `main@53242b4` | **1.46** | **1.51** | **1.51** | +0.44 | 0.00 | +| [`withastro/astro`](https://github.com/withastro/astro) | mature-oss | `main@7fe40bc` | **1.40** | **1.46** | **1.55** | 0.00 | -0.09 | +| [`pmndrs/zustand`](https://github.com/pmndrs/zustand) | mature-oss | `main@00f96a3` | **1.33** | **1.38** | **1.38** | 0.00 | -0.01 | +| [`payloadcms/payload`](https://github.com/payloadcms/payload) | mature-oss | `main@5afcef5` | **1.29** | **1.34** | **1.34** | +0.02 | 0.00 | +| [`umami-software/umami`](https://github.com/umami-software/umami) | mature-oss | `master@3a31ad3` | **1.00** | **1.04** | **1.04** | +0.00 | 0.00 | +| [`egoist/tsup`](https://github.com/egoist/tsup) | mature-oss | `main@b906f86` | **0.89** | **0.92** | **0.92** | 0.00 | 0.00 | +| [`sindresorhus/execa`](https://github.com/sindresorhus/execa) | mature-oss | `main@f3a2e84` | **0.85** | **0.89** | **0.89** | 0.00 | 0.00 | +| [`mikaelbr/node-notifier`](https://github.com/mikaelbr/node-notifier) | mature-oss | `master@b36c237` | **0.40** | **0.41** | **0.41** | 0.00 | 0.00 | +| [`vercel/hyper`](https://github.com/vercel/hyper) | mature-oss | `canary@2a7bb18` | **0.40** | **0.41** | **0.41** | 0.00 | 0.00 | + +Legend: + +- `Current blended` = latest repo score vs the current mature-OSS medians from the same rolling run +- `Latest pinned` = latest repo score vs the frozen pinned mature-OSS baseline snapshot +- `Highest pinned` = highest stored repo score on that same pinned baseline +- `Δ prev` = latest pinned - previous week's pinned score +- `Δ peak` = latest pinned - highest pinned score, so more negative means the repo is below its own historical high + +For exact pinned SHAs and the full per-metric breakdowns, see the saved snapshot and pinned benchmark report. Full benchmark assets: - manifest: [`benchmarks/sets/known-ai-vs-solid-oss.json`](benchmarks/sets/known-ai-vs-solid-oss.json) -- snapshot: [`benchmarks/results/known-ai-vs-solid-oss.json`](benchmarks/results/known-ai-vs-solid-oss.json) -- report: [`reports/known-ai-vs-solid-oss-benchmark.md`](reports/known-ai-vs-solid-oss-benchmark.md) +- pinned snapshot: [`benchmarks/results/known-ai-vs-solid-oss.json`](benchmarks/results/known-ai-vs-solid-oss.json) +- pinned report: [`reports/known-ai-vs-solid-oss-benchmark.md`](reports/known-ai-vs-solid-oss-benchmark.md) +- rolling latest summary: [`benchmarks/history/known-ai-vs-solid-oss/latest.json`](benchmarks/history/known-ai-vs-solid-oss/latest.json) +- rolling history report: [`reports/known-ai-vs-solid-oss-history.md`](reports/known-ai-vs-solid-oss-history.md) ## Configuration @@ -273,23 +272,13 @@ See also: This repo also commits a root [`slop-scan.config.json`](slop-scan.config.json) for self-scans and local development. It keeps the scan focused on the tool itself by excluding heavyweight benchmark checkouts and intentionally disables directory-structure rules under `src/rules/**`. -## How it works - -`slop-scan` is built as a pluggable engine: - -- language plugins -- fact providers -- rule plugins -- reporters - -That keeps the analyzer deterministic and extensible without turning it into one giant loop of ad hoc checks. - ## Docs - plugin guide: [`docs/plugins.md`](docs/plugins.md) - built-in rule docs: browse [`src/rules/`](src/rules) - benchmark guide: [`benchmarks/README.md`](benchmarks/README.md) - pinned benchmark report: [`reports/known-ai-vs-solid-oss-benchmark.md`](reports/known-ai-vs-solid-oss-benchmark.md) +- rolling benchmark history: [`reports/known-ai-vs-solid-oss-history.md`](reports/known-ai-vs-solid-oss-history.md) - exploratory note on non-JS/TS candidates: [`reports/exploratory-vite-astro-openclaw-beads.md`](reports/exploratory-vite-astro-openclaw-beads.md) - contributing guide: [`CONTRIBUTING.md`](CONTRIBUTING.md) diff --git a/benchmarks/README.md b/benchmarks/README.md index e734f94..9d9392d 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -53,14 +53,46 @@ Or do all three: bun run benchmark:update ``` +## Rolling history + +A separate rolling-history pipeline tracks the same repos at the **default-branch revision that existed at each recorded run time**. + +Refresh it locally with: + +```bash +bun run benchmark:history +``` + +Backfill an earlier weekly point with: + +```bash +bun run benchmark:history --recorded-at 2026-04-06T12:00:00Z +``` + +That writes: + +- per-repo JSONL histories under `benchmarks/history/known-ai-vs-solid-oss/*.jsonl` +- a latest aggregate summary at `benchmarks/history/known-ai-vs-solid-oss/latest.json` +- a generated markdown summary at `reports/known-ai-vs-solid-oss-history.md` + +If a repo did not exist yet for an older backfill date, that weekly point is skipped instead of fabricating a datapoint. + +The rolling history is intentionally separate from the pinned benchmark snapshot so reproducible benchmark claims still point at exact SHAs. + ## Artifacts -For the current set: +For the current pinned set: - manifest: `benchmarks/sets/known-ai-vs-solid-oss.json` - saved snapshot: `benchmarks/results/known-ai-vs-solid-oss.json` - generated report: `reports/known-ai-vs-solid-oss-benchmark.md` +For rolling history: + +- per-repo JSONL: `benchmarks/history/known-ai-vs-solid-oss/*.jsonl` +- latest summary: `benchmarks/history/known-ai-vs-solid-oss/latest.json` +- generated history report: `reports/known-ai-vs-solid-oss-history.md` + ## Notes - Checkouts are stored under `benchmarks/.cache/` and are gitignored. diff --git a/benchmarks/history/known-ai-vs-solid-oss/agent-ci.jsonl b/benchmarks/history/known-ai-vs-solid-oss/agent-ci.jsonl new file mode 100644 index 0000000..9baf4e4 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/agent-ci.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"agent-ci","repo":"redwoodjs/agent-ci","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"54ef949483c4b8d2157b25d17429abb2c202144c","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":67,"directoryCount":14,"findingCount":24,"repoScore":76.88571428571429,"physicalLineCount":13852,"logicalLineCount":6179,"functionCount":184,"normalized":{"scorePerFile":1.147547974413646,"scorePerKloc":12.443067532887891,"scorePerFunction":0.41785714285714287,"findingsPerFile":0.3582089552238806,"findingsPerKloc":3.8841236446026866,"findingsPerFunction":0.13043478260869565}},"blended":{"vsCurrentCohort":3.737832240140092,"vsPinnedBaseline":3.9029448640486573},"ruleCounts":{"defensive.empty-catch":17,"defensive.error-swallowing":3,"defensive.error-obscuring":2,"structure.directory-fanout-hotspot":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"agent-ci","repo":"redwoodjs/agent-ci","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"4326a2b517cf90155e92bea515a04d1dde0b4e8d","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":85,"directoryCount":22,"findingCount":25,"repoScore":79.35714285714288,"physicalLineCount":15268,"logicalLineCount":7373,"functionCount":199,"normalized":{"scorePerFile":0.9336134453781515,"scorePerKloc":10.763209393346381,"scorePerFunction":0.39877961234745163,"findingsPerFile":0.29411764705882354,"findingsPerKloc":3.3907500339075,"findingsPerFunction":0.12562814070351758}},"blended":{"vsCurrentCohort":3.304551337754753,"vsPinnedBaseline":3.4336696742651553},"ruleCounts":{"defensive.empty-catch":17,"defensive.error-obscuring":3,"defensive.error-swallowing":3,"structure.directory-fanout-hotspot":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"agent-ci","repo":"redwoodjs/agent-ci","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"be06e223d1f419565c7e5589bab0f789f1779f60","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":90,"directoryCount":23,"findingCount":26,"repoScore":81.35714285714288,"physicalLineCount":15656,"logicalLineCount":7673,"functionCount":204,"normalized":{"scorePerFile":0.9039682539682542,"scorePerKloc":10.60304220736907,"scorePerFunction":0.3988095238095239,"findingsPerFile":0.28888888888888886,"findingsPerKloc":3.388505147921282,"findingsPerFunction":0.12745098039215685}},"blended":{"vsCurrentCohort":3.277166214819975,"vsPinnedBaseline":3.4043912743913416},"ruleCounts":{"defensive.empty-catch":17,"defensive.error-obscuring":3,"defensive.error-swallowing":3,"structure.directory-fanout-hotspot":2,"structure.barrel-density":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"agent-ci","repo":"redwoodjs/agent-ci","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"c61f27d7734c74a9c0b9efa7bb833ff451c8b61c","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":114,"directoryCount":28,"findingCount":38,"repoScore":140.10000000000005,"physicalLineCount":22952,"logicalLineCount":11687,"functionCount":278,"normalized":{"scorePerFile":1.228947368421053,"scorePerKloc":11.987678617267054,"scorePerFunction":0.5039568345323743,"findingsPerFile":0.3333333333333333,"findingsPerKloc":3.2514759989732185,"findingsPerFunction":0.1366906474820144}},"blended":{"vsCurrentCohort":3.763892950592061,"vsPinnedBaseline":3.913159449141177},"ruleCounts":{"defensive.empty-catch":22,"tests.duplicate-mock-setup":6,"defensive.error-obscuring":5,"defensive.error-swallowing":3,"structure.barrel-density":1,"structure.pass-through-wrappers":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/astro.jsonl b/benchmarks/history/known-ai-vs-solid-oss/astro.jsonl new file mode 100644 index 0000000..6250461 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/astro.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"astro","repo":"withastro/astro","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"15b25e8cf4e00c363ad0fd20c00b0a2af4a33002","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":2739,"directoryCount":1142,"findingCount":270,"repoScore":769.7916666666663,"physicalLineCount":218211,"logicalLineCount":126799,"functionCount":4217,"normalized":{"scorePerFile":0.28104843616891795,"scorePerKloc":6.07096007592068,"scorePerFunction":0.182544858113983,"findingsPerFile":0.09857612267250822,"findingsPerKloc":2.1293543324474165,"findingsPerFunction":0.06402655916528338}},"blended":{"vsCurrentCohort":1.480788259953165,"vsPinnedBaseline":1.546199658685362},"ruleCounts":{"structure.pass-through-wrappers":52,"defensive.empty-catch":47,"structure.directory-fanout-hotspot":39,"structure.duplicate-function-signatures":37,"defensive.error-obscuring":33,"structure.barrel-density":29,"defensive.async-noise":22,"defensive.error-swallowing":10,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"astro","repo":"withastro/astro","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"0d24e3b70c34e9a9b7edbed9a298a9a9da2e4b87","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":2769,"directoryCount":1136,"findingCount":265,"repoScore":742.3111471861466,"physicalLineCount":223917,"logicalLineCount":129814,"functionCount":4307,"normalized":{"scorePerFile":0.2680791430791429,"scorePerKloc":5.718267268446752,"scorePerFunction":0.1723499296926275,"findingsPerFile":0.09570241964608162,"findingsPerKloc":2.04138228542376,"findingsPerFunction":0.06152774553053169}},"blended":{"vsCurrentCohort":1.421120946836393,"vsPinnedBaseline":1.4766482344712326},"ruleCounts":{"structure.pass-through-wrappers":55,"defensive.empty-catch":45,"structure.duplicate-function-signatures":37,"defensive.error-obscuring":34,"structure.directory-fanout-hotspot":32,"structure.barrel-density":29,"defensive.async-noise":22,"defensive.error-swallowing":10,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"astro","repo":"withastro/astro","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"5557dcabbfe70ae06cd39d96f5b52102a740a148","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":2795,"directoryCount":1142,"findingCount":265,"repoScore":745.8540043290039,"physicalLineCount":226500,"logicalLineCount":131194,"functionCount":4358,"normalized":{"scorePerFile":0.26685295324830194,"scorePerKloc":5.685122828246749,"scorePerFunction":0.17114593949724735,"findingsPerFile":0.09481216457960644,"findingsPerKloc":2.0199094470783727,"findingsPerFunction":0.06080770995869665}},"blended":{"vsCurrentCohort":1.4098798004438529,"vsPinnedBaseline":1.4646136863202488},"ruleCounts":{"structure.pass-through-wrappers":55,"defensive.empty-catch":46,"structure.duplicate-function-signatures":37,"defensive.error-obscuring":34,"structure.directory-fanout-hotspot":32,"structure.barrel-density":29,"defensive.async-noise":21,"defensive.error-swallowing":10,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"astro","repo":"withastro/astro","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"7fe40bc7381d981dedad16625d89c00e31cd8fd0","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":2805,"directoryCount":1148,"findingCount":265,"repoScore":745.7111471861468,"physicalLineCount":227080,"logicalLineCount":131581,"functionCount":4367,"normalized":{"scorePerFile":0.26585067635869764,"scorePerKloc":5.667316308480304,"scorePerFunction":0.17076051000369746,"findingsPerFile":0.0944741532976827,"findingsPerKloc":2.0139685820901194,"findingsPerFunction":0.06068239065720174}},"blended":{"vsCurrentCohort":1.4045885875409714,"vsPinnedBaseline":1.46029102730651},"ruleCounts":{"structure.pass-through-wrappers":55,"defensive.empty-catch":46,"structure.duplicate-function-signatures":37,"defensive.error-obscuring":34,"structure.directory-fanout-hotspot":32,"structure.barrel-density":29,"defensive.async-noise":21,"defensive.error-swallowing":10,"structure.over-fragmentation":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/devworkbench.jsonl b/benchmarks/history/known-ai-vs-solid-oss/devworkbench.jsonl new file mode 100644 index 0000000..977efdd --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/devworkbench.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"devworkbench","repo":"jiayun/DevWorkbench","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"39921948fe542c046d16a64af884f05280b9b9b9","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":32,"directoryCount":7,"findingCount":14,"repoScore":32.13333333333333,"physicalLineCount":9360,"logicalLineCount":2957,"functionCount":146,"normalized":{"scorePerFile":1.0041666666666667,"scorePerKloc":10.866869575019727,"scorePerFunction":0.22009132420091324,"findingsPerFile":0.4375,"findingsPerKloc":4.734528238079134,"findingsPerFunction":0.0958904109589041}},"blended":{"vsCurrentCohort":3.2605096227944053,"vsPinnedBaseline":3.404537301007842},"ruleCounts":{"defensive.error-swallowing":10,"defensive.empty-catch":1,"structure.barrel-density":1,"structure.directory-fanout-hotspot":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"devworkbench","repo":"jiayun/DevWorkbench","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"39921948fe542c046d16a64af884f05280b9b9b9","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":32,"directoryCount":7,"findingCount":14,"repoScore":32.13333333333333,"physicalLineCount":9360,"logicalLineCount":2957,"functionCount":146,"normalized":{"scorePerFile":1.0041666666666667,"scorePerKloc":10.866869575019727,"scorePerFunction":0.22009132420091324,"findingsPerFile":0.4375,"findingsPerKloc":4.734528238079134,"findingsPerFunction":0.0958904109589041}},"blended":{"vsCurrentCohort":3.27651444657068,"vsPinnedBaseline":3.404537301007842},"ruleCounts":{"defensive.error-swallowing":10,"defensive.empty-catch":1,"structure.barrel-density":1,"structure.directory-fanout-hotspot":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"devworkbench","repo":"jiayun/DevWorkbench","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"ea50862107c377b0cdd6e508073ad0330b367576","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":32,"directoryCount":7,"findingCount":14,"repoScore":32.13333333333333,"physicalLineCount":9408,"logicalLineCount":2986,"functionCount":147,"normalized":{"scorePerFile":1.0041666666666667,"scorePerKloc":10.761330654163874,"scorePerFunction":0.21859410430839002,"findingsPerFile":0.4375,"findingsPerKloc":4.688546550569323,"findingsPerFunction":0.09523809523809523}},"blended":{"vsCurrentCohort":3.2592382691916306,"vsPinnedBaseline":3.3857673360055234},"ruleCounts":{"defensive.error-swallowing":10,"defensive.empty-catch":1,"structure.barrel-density":1,"structure.directory-fanout-hotspot":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"devworkbench","repo":"jiayun/DevWorkbench","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"ea50862107c377b0cdd6e508073ad0330b367576","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":32,"directoryCount":7,"findingCount":14,"repoScore":32.13333333333333,"physicalLineCount":9408,"logicalLineCount":2986,"functionCount":147,"normalized":{"scorePerFile":1.0041666666666667,"scorePerKloc":10.761330654163874,"scorePerFunction":0.21859410430839002,"findingsPerFile":0.4375,"findingsPerKloc":4.688546550569323,"findingsPerFunction":0.09523809523809523}},"blended":{"vsCurrentCohort":3.256618079064708,"vsPinnedBaseline":3.3857673360055234},"ruleCounts":{"defensive.error-swallowing":10,"defensive.empty-catch":1,"structure.barrel-density":1,"structure.directory-fanout-hotspot":1,"structure.pass-through-wrappers":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/emdash.jsonl b/benchmarks/history/known-ai-vs-solid-oss/emdash.jsonl new file mode 100644 index 0000000..99328d2 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/emdash.jsonl @@ -0,0 +1,2 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"emdash","repo":"emdash-cms/emdash","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"5f448d1035073283fd7435d2f320d1f3c94898a0","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1072,"directoryCount":306,"findingCount":239,"repoScore":787.2525793650789,"physicalLineCount":257919,"logicalLineCount":120412,"functionCount":3513,"normalized":{"scorePerFile":0.7343774061241407,"scorePerKloc":6.537991058740648,"scorePerFunction":0.22409694829635038,"findingsPerFile":0.22294776119402984,"findingsPerKloc":1.9848520081055043,"findingsPerFunction":0.06803302021064617}},"blended":{"vsCurrentCohort":2.0933170174606843,"vsPinnedBaseline":2.1745830762415395},"ruleCounts":{"structure.duplicate-function-signatures":55,"defensive.empty-catch":40,"structure.barrel-density":34,"defensive.error-obscuring":27,"structure.pass-through-wrappers":27,"tests.duplicate-mock-setup":21,"structure.directory-fanout-hotspot":17,"defensive.error-swallowing":13,"defensive.async-noise":5}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"emdash","repo":"emdash-cms/emdash","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"a1dac004da667b101f5a3f6287c8f8ccaf2e6863","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1132,"directoryCount":317,"findingCount":243,"repoScore":795.1484126984125,"physicalLineCount":304059,"logicalLineCount":143660,"functionCount":3658,"normalized":{"scorePerFile":0.7024279264120251,"scorePerKloc":5.5349325678575285,"scorePerFunction":0.2173724474298558,"findingsPerFile":0.2146643109540636,"findingsPerKloc":1.6914938048169288,"findingsPerFunction":0.06642974302897758}},"blended":{"vsCurrentCohort":1.9362549120163848,"vsPinnedBaseline":2.0130418968772985},"ruleCounts":{"structure.duplicate-function-signatures":55,"defensive.empty-catch":39,"structure.barrel-density":34,"defensive.error-obscuring":28,"structure.pass-through-wrappers":28,"tests.duplicate-mock-setup":24,"structure.directory-fanout-hotspot":17,"defensive.error-swallowing":13,"defensive.async-noise":5}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/execa.jsonl b/benchmarks/history/known-ai-vs-solid-oss/execa.jsonl new file mode 100644 index 0000000..3222b98 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/execa.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"execa","repo":"sindresorhus/execa","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"f3a2e8481a1e9138de3895827895c834078b9456","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":581,"directoryCount":46,"findingCount":28,"repoScore":99.01486212489861,"physicalLineCount":36103,"logicalLineCount":20432,"functionCount":1008,"normalized":{"scorePerFile":0.17042144944044513,"scorePerKloc":4.846068036653222,"scorePerFunction":0.09822902988581211,"findingsPerFile":0.04819277108433735,"findingsPerKloc":1.370399373531715,"findingsPerFunction":0.027777777777777776}},"blended":{"vsCurrentCohort":0.8491315796009036,"vsPinnedBaseline":0.8866405779036939},"ruleCounts":{"defensive.empty-catch":11,"structure.directory-fanout-hotspot":7,"structure.duplicate-function-signatures":6,"structure.over-fragmentation":2,"defensive.error-obscuring":1,"structure.barrel-density":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"execa","repo":"sindresorhus/execa","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"f3a2e8481a1e9138de3895827895c834078b9456","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":581,"directoryCount":46,"findingCount":28,"repoScore":99.01486212489861,"physicalLineCount":36103,"logicalLineCount":20432,"functionCount":1008,"normalized":{"scorePerFile":0.17042144944044513,"scorePerKloc":4.846068036653222,"scorePerFunction":0.09822902988581211,"findingsPerFile":0.04819277108433735,"findingsPerKloc":1.370399373531715,"findingsPerFunction":0.027777777777777776}},"blended":{"vsCurrentCohort":0.8532997014182334,"vsPinnedBaseline":0.8866405779036939},"ruleCounts":{"defensive.empty-catch":11,"structure.directory-fanout-hotspot":7,"structure.duplicate-function-signatures":6,"structure.over-fragmentation":2,"defensive.error-obscuring":1,"structure.barrel-density":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"execa","repo":"sindresorhus/execa","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"f3a2e8481a1e9138de3895827895c834078b9456","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":581,"directoryCount":46,"findingCount":28,"repoScore":99.01486212489861,"physicalLineCount":36103,"logicalLineCount":20432,"functionCount":1008,"normalized":{"scorePerFile":0.17042144944044513,"scorePerKloc":4.846068036653222,"scorePerFunction":0.09822902988581211,"findingsPerFile":0.04819277108433735,"findingsPerKloc":1.370399373531715,"findingsPerFunction":0.027777777777777776}},"blended":{"vsCurrentCohort":0.853506049216959,"vsPinnedBaseline":0.8866405779036939},"ruleCounts":{"defensive.empty-catch":11,"structure.directory-fanout-hotspot":7,"structure.duplicate-function-signatures":6,"structure.over-fragmentation":2,"defensive.error-obscuring":1,"structure.barrel-density":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"execa","repo":"sindresorhus/execa","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"f3a2e8481a1e9138de3895827895c834078b9456","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":581,"directoryCount":46,"findingCount":28,"repoScore":99.01486212489861,"physicalLineCount":36103,"logicalLineCount":20432,"functionCount":1008,"normalized":{"scorePerFile":0.17042144944044513,"scorePerKloc":4.846068036653222,"scorePerFunction":0.09822902988581211,"findingsPerFile":0.04819277108433735,"findingsPerKloc":1.370399373531715,"findingsPerFunction":0.027777777777777776}},"blended":{"vsCurrentCohort":0.8528198925328754,"vsPinnedBaseline":0.8866405779036939},"ruleCounts":{"defensive.empty-catch":11,"structure.directory-fanout-hotspot":7,"structure.duplicate-function-signatures":6,"structure.over-fragmentation":2,"defensive.error-obscuring":1,"structure.barrel-density":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/fulling.jsonl b/benchmarks/history/known-ai-vs-solid-oss/fulling.jsonl new file mode 100644 index 0000000..e114eb3 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/fulling.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"fulling","repo":"FullAgent/fulling","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"5cfc59ad3d3b33f58b6579dd8392bcb8ffb18f95","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":205,"directoryCount":78,"findingCount":33,"repoScore":111.09166666666668,"physicalLineCount":25166,"logicalLineCount":10751,"functionCount":571,"normalized":{"scorePerFile":0.5419105691056911,"scorePerKloc":10.33314730412675,"scorePerFunction":0.19455633391710453,"findingsPerFile":0.16097560975609757,"findingsPerKloc":3.0694819086596596,"findingsPerFunction":0.05779334500875657}},"blended":{"vsCurrentCohort":2.068615299810033,"vsPinnedBaseline":2.1599929963104616},"ruleCounts":{"defensive.error-swallowing":11,"defensive.error-obscuring":5,"structure.barrel-density":4,"structure.pass-through-wrappers":4,"defensive.async-noise":3,"defensive.empty-catch":3,"structure.directory-fanout-hotspot":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"fulling","repo":"FullAgent/fulling","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"5cfc59ad3d3b33f58b6579dd8392bcb8ffb18f95","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":205,"directoryCount":78,"findingCount":33,"repoScore":111.09166666666668,"physicalLineCount":25166,"logicalLineCount":10751,"functionCount":571,"normalized":{"scorePerFile":0.5419105691056911,"scorePerKloc":10.33314730412675,"scorePerFunction":0.19455633391710453,"findingsPerFile":0.16097560975609757,"findingsPerKloc":3.0694819086596596,"findingsPerFunction":0.05779334500875657}},"blended":{"vsCurrentCohort":2.078769486475488,"vsPinnedBaseline":2.1599929963104616},"ruleCounts":{"defensive.error-swallowing":11,"defensive.error-obscuring":5,"structure.barrel-density":4,"structure.pass-through-wrappers":4,"defensive.async-noise":3,"defensive.empty-catch":3,"structure.directory-fanout-hotspot":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"fulling","repo":"FullAgent/fulling","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"d95060f8421b5888564fc8517c1fe99ded463985","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":219,"directoryCount":78,"findingCount":36,"repoScore":115.59166666666668,"physicalLineCount":26787,"logicalLineCount":12154,"functionCount":574,"normalized":{"scorePerFile":0.5278158295281584,"scorePerKloc":9.510586363885691,"scorePerFunction":0.20137921022067368,"findingsPerFile":0.1643835616438356,"findingsPerKloc":2.96198782293895,"findingsPerFunction":0.0627177700348432}},"blended":{"vsCurrentCohort":2.076583230796868,"vsPinnedBaseline":2.157199656063399},"ruleCounts":{"defensive.error-swallowing":11,"defensive.error-obscuring":5,"structure.barrel-density":4,"structure.pass-through-wrappers":4,"defensive.async-noise":3,"defensive.empty-catch":3,"structure.directory-fanout-hotspot":3,"tests.duplicate-mock-setup":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"fulling","repo":"FullAgent/fulling","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"d95060f8421b5888564fc8517c1fe99ded463985","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":219,"directoryCount":78,"findingCount":36,"repoScore":115.59166666666668,"physicalLineCount":26787,"logicalLineCount":12154,"functionCount":574,"normalized":{"scorePerFile":0.5278158295281584,"scorePerKloc":9.510586363885691,"scorePerFunction":0.20137921022067368,"findingsPerFile":0.1643835616438356,"findingsPerKloc":2.96198782293895,"findingsPerFunction":0.0627177700348432}},"blended":{"vsCurrentCohort":2.074913809162218,"vsPinnedBaseline":2.157199656063399},"ruleCounts":{"defensive.error-swallowing":11,"defensive.error-obscuring":5,"structure.barrel-density":4,"structure.pass-through-wrappers":4,"defensive.async-noise":3,"defensive.empty-catch":3,"structure.directory-fanout-hotspot":3,"tests.duplicate-mock-setup":3}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/gstack.jsonl b/benchmarks/history/known-ai-vs-solid-oss/gstack.jsonl new file mode 100644 index 0000000..dc32fb4 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/gstack.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"gstack","repo":"garrytan/gstack","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"7fbf68bb3f253ef799f38862fb1cb0b62d756a64","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":78,"directoryCount":10,"findingCount":47,"repoScore":205.10000000000005,"physicalLineCount":30473,"logicalLineCount":9213,"functionCount":291,"normalized":{"scorePerFile":2.6294871794871804,"scorePerKloc":22.26202105720179,"scorePerFunction":0.704810996563574,"findingsPerFile":0.6025641025641025,"findingsPerKloc":5.101487029197873,"findingsPerFunction":0.16151202749140894}},"blended":{"vsCurrentCohort":6.101414127021402,"vsPinnedBaseline":6.370934113832667},"ruleCounts":{"defensive.empty-catch":30,"defensive.error-obscuring":11,"defensive.error-swallowing":3,"structure.pass-through-wrappers":2,"defensive.async-noise":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"gstack","repo":"garrytan/gstack","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"7911b7b974a1cef2794473a77ea93d0ac351b8c2","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":144,"directoryCount":17,"findingCount":72,"repoScore":320.46666666666664,"physicalLineCount":46801,"logicalLineCount":13966,"functionCount":663,"normalized":{"scorePerFile":2.225462962962963,"scorePerKloc":22.946202682705618,"scorePerFunction":0.48335847159376566,"findingsPerFile":0.5,"findingsPerKloc":5.155377344980668,"findingsPerFunction":0.1085972850678733}},"blended":{"vsCurrentCohort":5.11559977530993,"vsPinnedBaseline":5.315480989347836},"ruleCounts":{"defensive.empty-catch":47,"defensive.error-obscuring":13,"defensive.error-swallowing":5,"structure.pass-through-wrappers":5,"defensive.async-noise":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"gstack","repo":"garrytan/gstack","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"03973c2fabfb4988a2a4c2fefc44a7e280804884","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":171,"directoryCount":19,"findingCount":88,"repoScore":402.2999999999998,"physicalLineCount":59303,"logicalLineCount":17808,"functionCount":787,"normalized":{"scorePerFile":2.352631578947367,"scorePerKloc":22.5909703504043,"scorePerFunction":0.5111817026683606,"findingsPerFile":0.5146198830409356,"findingsPerKloc":4.941599281221923,"findingsPerFunction":0.11181702668360864}},"blended":{"vsCurrentCohort":5.212918457407813,"vsPinnedBaseline":5.415292648343023},"ruleCounts":{"defensive.empty-catch":54,"defensive.error-obscuring":19,"defensive.error-swallowing":8,"structure.pass-through-wrappers":5,"defensive.async-noise":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"gstack","repo":"garrytan/gstack","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"c6e6a21d1a9a58e771403260ff6a134898f2dd02","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":186,"directoryCount":19,"findingCount":91,"repoScore":364.1533333333332,"physicalLineCount":64888,"logicalLineCount":19484,"functionCount":875,"normalized":{"scorePerFile":1.9578136200716838,"scorePerKloc":18.689865188530753,"scorePerFunction":0.41617523809523793,"findingsPerFile":0.489247311827957,"findingsPerKloc":4.670498870868404,"findingsPerFunction":0.104}},"blended":{"vsCurrentCohort":4.590293228472618,"vsPinnedBaseline":4.772332677129107},"ruleCounts":{"defensive.empty-catch":52,"defensive.error-obscuring":19,"structure.pass-through-wrappers":9,"defensive.error-swallowing":8,"structure.directory-fanout-hotspot":2,"defensive.async-noise":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/hunk.jsonl b/benchmarks/history/known-ai-vs-solid-oss/hunk.jsonl new file mode 100644 index 0000000..fe18f5f --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/hunk.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"hunk","repo":"modem-dev/hunk","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"4b9a6396dc09ad7408afb715f7448e0dd536c628","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":124,"directoryCount":29,"findingCount":9,"repoScore":29.390909090909087,"physicalLineCount":20091,"logicalLineCount":7812,"functionCount":492,"normalized":{"scorePerFile":0.23702346041055716,"scorePerKloc":3.762277149373923,"scorePerFunction":0.059737620103473756,"findingsPerFile":0.07258064516129033,"findingsPerKloc":1.152073732718894,"findingsPerFunction":0.018292682926829267}},"blended":{"vsCurrentCohort":0.7680209296529915,"vsPinnedBaseline":0.801946997695828},"ruleCounts":{"defensive.error-obscuring":4,"defensive.empty-catch":2,"structure.pass-through-wrappers":2,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"hunk","repo":"modem-dev/hunk","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"bbfacbd79d2562f6c2bab8964da90443cbe29197","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":146,"directoryCount":32,"findingCount":17,"repoScore":50.4,"physicalLineCount":27276,"logicalLineCount":11022,"functionCount":632,"normalized":{"scorePerFile":0.34520547945205476,"scorePerKloc":4.57267283614589,"scorePerFunction":0.07974683544303797,"findingsPerFile":0.11643835616438356,"findingsPerKloc":1.5423698058428597,"findingsPerFunction":0.02689873417721519}},"blended":{"vsCurrentCohort":1.078908251493315,"vsPinnedBaseline":1.1210643036897423},"ruleCounts":{"defensive.error-obscuring":6,"defensive.empty-catch":4,"structure.pass-through-wrappers":4,"defensive.async-noise":1,"defensive.error-swallowing":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"hunk","repo":"modem-dev/hunk","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"90366239381b642fde80aa5b3a350a291eb41282","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":158,"directoryCount":33,"findingCount":18,"repoScore":53.37527472527472,"physicalLineCount":30250,"logicalLineCount":12178,"functionCount":704,"normalized":{"scorePerFile":0.33781819446376404,"scorePerKloc":4.382926155795263,"scorePerFunction":0.07581715159840159,"findingsPerFile":0.11392405063291139,"findingsPerKloc":1.478075217605518,"findingsPerFunction":0.02556818181818182}},"blended":{"vsCurrentCohort":1.0386382637379339,"vsPinnedBaseline":1.078959933838033},"ruleCounts":{"defensive.error-obscuring":6,"defensive.empty-catch":4,"structure.pass-through-wrappers":4,"structure.directory-fanout-hotspot":2,"defensive.async-noise":1,"defensive.error-swallowing":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"hunk","repo":"modem-dev/hunk","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"53242b4b45afc3ee728f2ee10054c4cec83314c8","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":186,"directoryCount":38,"findingCount":31,"repoScore":88.89960317460319,"physicalLineCount":37128,"logicalLineCount":15245,"functionCount":840,"normalized":{"scorePerFile":0.47795485577743646,"scorePerKloc":5.831394107878202,"scorePerFunction":0.10583286092214665,"findingsPerFile":0.16666666666666666,"findingsPerKloc":2.0334535913414236,"findingsPerFunction":0.036904761904761905}},"blended":{"vsCurrentCohort":1.4562462925417925,"vsPinnedBaseline":1.5139973465611831},"ruleCounts":{"defensive.error-obscuring":9,"defensive.empty-catch":6,"structure.pass-through-wrappers":6,"structure.directory-fanout-hotspot":4,"structure.duplicate-function-signatures":3,"defensive.async-noise":1,"defensive.error-swallowing":1,"structure.barrel-density":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/hyper.jsonl b/benchmarks/history/known-ai-vs-solid-oss/hyper.jsonl new file mode 100644 index 0000000..57bca34 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/hyper.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"hyper","repo":"vercel/hyper","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"canary","ref":"2a7bb18259d975f27b30b502af1be7576f6f5656","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":113,"directoryCount":21,"findingCount":18,"repoScore":73.10000000000001,"physicalLineCount":162735,"logicalLineCount":65075,"functionCount":5354,"normalized":{"scorePerFile":0.6469026548672567,"scorePerKloc":1.1233192470226663,"scorePerFunction":0.013653343294732912,"findingsPerFile":0.1592920353982301,"findingsPerKloc":0.27660391855551286,"findingsPerFunction":0.0033619723571161747}},"blended":{"vsCurrentCohort":0.3933081179249411,"vsPinnedBaseline":0.4106818605605101},"ruleCounts":{"defensive.error-swallowing":8,"structure.pass-through-wrappers":5,"defensive.empty-catch":3,"defensive.async-noise":1,"defensive.error-obscuring":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"hyper","repo":"vercel/hyper","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"canary","ref":"2a7bb18259d975f27b30b502af1be7576f6f5656","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":113,"directoryCount":21,"findingCount":18,"repoScore":73.10000000000001,"physicalLineCount":162735,"logicalLineCount":65075,"functionCount":5354,"normalized":{"scorePerFile":0.6469026548672567,"scorePerKloc":1.1233192470226663,"scorePerFunction":0.013653343294732912,"findingsPerFile":0.1592920353982301,"findingsPerKloc":0.27660391855551286,"findingsPerFunction":0.0033619723571161747}},"blended":{"vsCurrentCohort":0.3952387446813107,"vsPinnedBaseline":0.4106818605605101},"ruleCounts":{"defensive.error-swallowing":8,"structure.pass-through-wrappers":5,"defensive.empty-catch":3,"defensive.async-noise":1,"defensive.error-obscuring":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"hyper","repo":"vercel/hyper","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"canary","ref":"2a7bb18259d975f27b30b502af1be7576f6f5656","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":113,"directoryCount":21,"findingCount":18,"repoScore":73.10000000000001,"physicalLineCount":162735,"logicalLineCount":65075,"functionCount":5354,"normalized":{"scorePerFile":0.6469026548672567,"scorePerKloc":1.1233192470226663,"scorePerFunction":0.013653343294732912,"findingsPerFile":0.1592920353982301,"findingsPerKloc":0.27660391855551286,"findingsPerFunction":0.0033619723571161747}},"blended":{"vsCurrentCohort":0.39533432264155205,"vsPinnedBaseline":0.4106818605605101},"ruleCounts":{"defensive.error-swallowing":8,"structure.pass-through-wrappers":5,"defensive.empty-catch":3,"defensive.async-noise":1,"defensive.error-obscuring":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"hyper","repo":"vercel/hyper","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"canary","ref":"2a7bb18259d975f27b30b502af1be7576f6f5656","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":113,"directoryCount":21,"findingCount":18,"repoScore":73.10000000000001,"physicalLineCount":162735,"logicalLineCount":65075,"functionCount":5354,"normalized":{"scorePerFile":0.6469026548672567,"scorePerKloc":1.1233192470226663,"scorePerFunction":0.013653343294732912,"findingsPerFile":0.1592920353982301,"findingsPerKloc":0.27660391855551286,"findingsPerFunction":0.0033619723571161747}},"blended":{"vsCurrentCohort":0.39501650264698135,"vsPinnedBaseline":0.4106818605605101},"ruleCounts":{"defensive.error-swallowing":8,"structure.pass-through-wrappers":5,"defensive.empty-catch":3,"defensive.async-noise":1,"defensive.error-obscuring":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/latest.json b/benchmarks/history/known-ai-vs-solid-oss/latest.json new file mode 100644 index 0000000..26dcbb8 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/latest.json @@ -0,0 +1,3886 @@ +{ + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "generatedAt": "2026-04-13T12:00:00Z", + "baseline": { + "snapshotPath": "benchmarks/results/known-ai-vs-solid-oss.json", + "generatedAt": "2026-04-17T23:32:37.950Z", + "analyzerVersion": "0.3.0", + "matureOssMedians": { + "scorePerFile": 0.24054860905143094, + "scorePerKloc": 4.04172676403917, + "scorePerFunction": 0.09832657609225284, + "findingsPerFile": 0.0824279641001417, + "findingsPerKloc": 1.3849646020508588, + "findingsPerFunction": 0.03732162458836443 + }, + "matureOssRawBlendedMedian": 0.9536302244152335 + }, + "analyzers": [ + { + "version": "0.3.0", + "commit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "repoCount": 18 + } + ], + "cohorts": { + "explicit-ai": { + "repoCount": 9, + "medians": { + "scorePerFile": 0.9902346338394317, + "scorePerKloc": 9.510586363885691, + "scorePerFunction": 0.21859410430839002, + "findingsPerFile": 0.30685317146124746, + "findingsPerKloc": 2.96198782293895, + "findingsPerFunction": 0.0788480231480435 + }, + "blendedScoreMedian": 2.8110941249865755 + }, + "mature-oss": { + "repoCount": 9, + "medians": { + "scorePerFile": 0.2440065689865689, + "scorePerKloc": 3.605708191559595, + "scorePerFunction": 0.09822902988581211, + "findingsPerFile": 0.08208, + "findingsPerKloc": 1.370399373531715, + "findingsPerFunction": 0.03769968051118211 + }, + "blendedScoreMedian": 1 + } + }, + "repos": [ + { + "id": "gstack", + "repo": "garrytan/gstack", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "gstack", + "repo": "garrytan/gstack", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "7fbf68bb3f253ef799f38862fb1cb0b62d756a64", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 78, + "directoryCount": 10, + "findingCount": 47, + "repoScore": 205.10000000000005, + "physicalLineCount": 30473, + "logicalLineCount": 9213, + "functionCount": 291, + "normalized": { + "scorePerFile": 2.6294871794871804, + "scorePerKloc": 22.26202105720179, + "scorePerFunction": 0.704810996563574, + "findingsPerFile": 0.6025641025641025, + "findingsPerKloc": 5.101487029197873, + "findingsPerFunction": 0.16151202749140894 + } + }, + "blended": { + "vsCurrentCohort": 6.101414127021402, + "vsPinnedBaseline": 6.370934113832667 + }, + "ruleCounts": { + "defensive.empty-catch": 30, + "defensive.error-obscuring": 11, + "defensive.error-swallowing": 3, + "structure.pass-through-wrappers": 2, + "defensive.async-noise": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "gstack", + "repo": "garrytan/gstack", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "03973c2fabfb4988a2a4c2fefc44a7e280804884", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 171, + "directoryCount": 19, + "findingCount": 88, + "repoScore": 402.2999999999998, + "physicalLineCount": 59303, + "logicalLineCount": 17808, + "functionCount": 787, + "normalized": { + "scorePerFile": 2.352631578947367, + "scorePerKloc": 22.5909703504043, + "scorePerFunction": 0.5111817026683606, + "findingsPerFile": 0.5146198830409356, + "findingsPerKloc": 4.941599281221923, + "findingsPerFunction": 0.11181702668360864 + } + }, + "blended": { + "vsCurrentCohort": 5.212918457407813, + "vsPinnedBaseline": 5.415292648343023 + }, + "ruleCounts": { + "defensive.empty-catch": 54, + "defensive.error-obscuring": 19, + "defensive.error-swallowing": 8, + "structure.pass-through-wrappers": 5, + "defensive.async-noise": 1, + "structure.directory-fanout-hotspot": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "gstack", + "repo": "garrytan/gstack", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "c6e6a21d1a9a58e771403260ff6a134898f2dd02", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 186, + "directoryCount": 19, + "findingCount": 91, + "repoScore": 364.1533333333332, + "physicalLineCount": 64888, + "logicalLineCount": 19484, + "functionCount": 875, + "normalized": { + "scorePerFile": 1.9578136200716838, + "scorePerKloc": 18.689865188530753, + "scorePerFunction": 0.41617523809523793, + "findingsPerFile": 0.489247311827957, + "findingsPerKloc": 4.670498870868404, + "findingsPerFunction": 0.104 + } + }, + "blended": { + "vsCurrentCohort": 4.590293228472618, + "vsPinnedBaseline": 4.772332677129107 + }, + "ruleCounts": { + "defensive.empty-catch": 52, + "defensive.error-obscuring": 19, + "structure.pass-through-wrappers": 9, + "defensive.error-swallowing": 8, + "structure.directory-fanout-hotspot": 2, + "defensive.async-noise": 1 + } + }, + "highest": { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "defaultBranch": "main", + "ref": "7fbf68bb3f253ef799f38862fb1cb0b62d756a64", + "blendedVsPinnedBaseline": 6.370934113832667 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 6.101414127021402, + "blendedVsPinnedBaseline": 6.370934113832667, + "repoScore": 205.10000000000005, + "findingCount": 47 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 5.11559977530993, + "blendedVsPinnedBaseline": 5.315480989347836, + "repoScore": 320.46666666666664, + "findingCount": 72 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 5.212918457407813, + "blendedVsPinnedBaseline": 5.415292648343023, + "repoScore": 402.2999999999998, + "findingCount": 88 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 4.590293228472618, + "blendedVsPinnedBaseline": 4.772332677129107, + "repoScore": 364.1533333333332, + "findingCount": 91 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -1.5111208985487847, + "blendedVsPinnedBaseline": -1.59860143670356, + "repoScore": 159.05333333333314, + "findingCount": 44, + "fileCount": 108, + "logicalLineCount": 10271, + "functionCount": 584, + "scorePerFile": -0.6716735594154966, + "scorePerKloc": -3.572155868671036, + "scorePerFunction": -0.2886357584683361, + "findingsPerFile": -0.11331679073614553, + "findingsPerKloc": -0.4309881583294688, + "findingsPerFunction": -0.05751202749140895 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.6226252289351955, + "blendedVsPinnedBaseline": -0.6429599712139158, + "repoScore": -38.14666666666659, + "findingCount": 3, + "fileCount": 15, + "logicalLineCount": 1676, + "functionCount": 88, + "scorePerFile": -0.3948179588756833, + "scorePerKloc": -3.9011051618735486, + "scorePerFunction": -0.09500646457312267, + "findingsPerFile": -0.025372571212978645, + "findingsPerKloc": -0.27110041035351884, + "findingsPerFunction": -0.007817026683608647 + } + }, + { + "id": "agent-ci", + "repo": "redwoodjs/agent-ci", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "agent-ci", + "repo": "redwoodjs/agent-ci", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "54ef949483c4b8d2157b25d17429abb2c202144c", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 67, + "directoryCount": 14, + "findingCount": 24, + "repoScore": 76.88571428571429, + "physicalLineCount": 13852, + "logicalLineCount": 6179, + "functionCount": 184, + "normalized": { + "scorePerFile": 1.147547974413646, + "scorePerKloc": 12.443067532887891, + "scorePerFunction": 0.41785714285714287, + "findingsPerFile": 0.3582089552238806, + "findingsPerKloc": 3.8841236446026866, + "findingsPerFunction": 0.13043478260869565 + } + }, + "blended": { + "vsCurrentCohort": 3.737832240140092, + "vsPinnedBaseline": 3.9029448640486573 + }, + "ruleCounts": { + "defensive.empty-catch": 17, + "defensive.error-swallowing": 3, + "defensive.error-obscuring": 2, + "structure.directory-fanout-hotspot": 2 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "agent-ci", + "repo": "redwoodjs/agent-ci", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "be06e223d1f419565c7e5589bab0f789f1779f60", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 90, + "directoryCount": 23, + "findingCount": 26, + "repoScore": 81.35714285714288, + "physicalLineCount": 15656, + "logicalLineCount": 7673, + "functionCount": 204, + "normalized": { + "scorePerFile": 0.9039682539682542, + "scorePerKloc": 10.60304220736907, + "scorePerFunction": 0.3988095238095239, + "findingsPerFile": 0.28888888888888886, + "findingsPerKloc": 3.388505147921282, + "findingsPerFunction": 0.12745098039215685 + } + }, + "blended": { + "vsCurrentCohort": 3.277166214819975, + "vsPinnedBaseline": 3.4043912743913416 + }, + "ruleCounts": { + "defensive.empty-catch": 17, + "defensive.error-obscuring": 3, + "defensive.error-swallowing": 3, + "structure.directory-fanout-hotspot": 2, + "structure.barrel-density": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "agent-ci", + "repo": "redwoodjs/agent-ci", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "c61f27d7734c74a9c0b9efa7bb833ff451c8b61c", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 114, + "directoryCount": 28, + "findingCount": 38, + "repoScore": 140.10000000000005, + "physicalLineCount": 22952, + "logicalLineCount": 11687, + "functionCount": 278, + "normalized": { + "scorePerFile": 1.228947368421053, + "scorePerKloc": 11.987678617267054, + "scorePerFunction": 0.5039568345323743, + "findingsPerFile": 0.3333333333333333, + "findingsPerKloc": 3.2514759989732185, + "findingsPerFunction": 0.1366906474820144 + } + }, + "blended": { + "vsCurrentCohort": 3.763892950592061, + "vsPinnedBaseline": 3.913159449141177 + }, + "ruleCounts": { + "defensive.empty-catch": 22, + "tests.duplicate-mock-setup": 6, + "defensive.error-obscuring": 5, + "defensive.error-swallowing": 3, + "structure.barrel-density": 1, + "structure.pass-through-wrappers": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "main", + "ref": "c61f27d7734c74a9c0b9efa7bb833ff451c8b61c", + "blendedVsPinnedBaseline": 3.913159449141177 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 3.737832240140092, + "blendedVsPinnedBaseline": 3.9029448640486573, + "repoScore": 76.88571428571429, + "findingCount": 24 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 3.304551337754753, + "blendedVsPinnedBaseline": 3.4336696742651553, + "repoScore": 79.35714285714288, + "findingCount": 25 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 3.277166214819975, + "blendedVsPinnedBaseline": 3.4043912743913416, + "repoScore": 81.35714285714288, + "findingCount": 26 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 3.763892950592061, + "blendedVsPinnedBaseline": 3.913159449141177, + "repoScore": 140.10000000000005, + "findingCount": 38 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.026060710451969005, + "blendedVsPinnedBaseline": 0.010214585092519712, + "repoScore": 63.214285714285765, + "findingCount": 14, + "fileCount": 47, + "logicalLineCount": 5508, + "functionCount": 94, + "scorePerFile": 0.08139939400740692, + "scorePerKloc": -0.45538891562083705, + "scorePerFunction": 0.0860996916752314, + "findingsPerFile": -0.02487562189054726, + "findingsPerKloc": -0.6326476456294681, + "findingsPerFunction": 0.0062558648733187505 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0.4867267357720859, + "blendedVsPinnedBaseline": 0.5087681747498354, + "repoScore": 58.742857142857176, + "findingCount": 12, + "fileCount": 24, + "logicalLineCount": 4014, + "functionCount": 74, + "scorePerFile": 0.3249791144527988, + "scorePerKloc": 1.3846364098979844, + "scorePerFunction": 0.10514731072285038, + "findingsPerFile": 0.04444444444444445, + "findingsPerKloc": -0.13702914894806373, + "findingsPerFunction": 0.009239667089857545 + } + }, + { + "id": "devworkbench", + "repo": "jiayun/DevWorkbench", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "devworkbench", + "repo": "jiayun/DevWorkbench", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "39921948fe542c046d16a64af884f05280b9b9b9", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 32, + "directoryCount": 7, + "findingCount": 14, + "repoScore": 32.13333333333333, + "physicalLineCount": 9360, + "logicalLineCount": 2957, + "functionCount": 146, + "normalized": { + "scorePerFile": 1.0041666666666667, + "scorePerKloc": 10.866869575019727, + "scorePerFunction": 0.22009132420091324, + "findingsPerFile": 0.4375, + "findingsPerKloc": 4.734528238079134, + "findingsPerFunction": 0.0958904109589041 + } + }, + "blended": { + "vsCurrentCohort": 3.2605096227944053, + "vsPinnedBaseline": 3.404537301007842 + }, + "ruleCounts": { + "defensive.error-swallowing": 10, + "defensive.empty-catch": 1, + "structure.barrel-density": 1, + "structure.directory-fanout-hotspot": 1, + "structure.pass-through-wrappers": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "devworkbench", + "repo": "jiayun/DevWorkbench", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "ea50862107c377b0cdd6e508073ad0330b367576", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 32, + "directoryCount": 7, + "findingCount": 14, + "repoScore": 32.13333333333333, + "physicalLineCount": 9408, + "logicalLineCount": 2986, + "functionCount": 147, + "normalized": { + "scorePerFile": 1.0041666666666667, + "scorePerKloc": 10.761330654163874, + "scorePerFunction": 0.21859410430839002, + "findingsPerFile": 0.4375, + "findingsPerKloc": 4.688546550569323, + "findingsPerFunction": 0.09523809523809523 + } + }, + "blended": { + "vsCurrentCohort": 3.2592382691916306, + "vsPinnedBaseline": 3.3857673360055234 + }, + "ruleCounts": { + "defensive.error-swallowing": 10, + "defensive.empty-catch": 1, + "structure.barrel-density": 1, + "structure.directory-fanout-hotspot": 1, + "structure.pass-through-wrappers": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "devworkbench", + "repo": "jiayun/DevWorkbench", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "ea50862107c377b0cdd6e508073ad0330b367576", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 32, + "directoryCount": 7, + "findingCount": 14, + "repoScore": 32.13333333333333, + "physicalLineCount": 9408, + "logicalLineCount": 2986, + "functionCount": 147, + "normalized": { + "scorePerFile": 1.0041666666666667, + "scorePerKloc": 10.761330654163874, + "scorePerFunction": 0.21859410430839002, + "findingsPerFile": 0.4375, + "findingsPerKloc": 4.688546550569323, + "findingsPerFunction": 0.09523809523809523 + } + }, + "blended": { + "vsCurrentCohort": 3.256618079064708, + "vsPinnedBaseline": 3.3857673360055234 + }, + "ruleCounts": { + "defensive.error-swallowing": 10, + "defensive.empty-catch": 1, + "structure.barrel-density": 1, + "structure.directory-fanout-hotspot": 1, + "structure.pass-through-wrappers": 1 + } + }, + "highest": { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "defaultBranch": "main", + "ref": "39921948fe542c046d16a64af884f05280b9b9b9", + "blendedVsPinnedBaseline": 3.404537301007842 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 3.2605096227944053, + "blendedVsPinnedBaseline": 3.404537301007842, + "repoScore": 32.13333333333333, + "findingCount": 14 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 3.27651444657068, + "blendedVsPinnedBaseline": 3.404537301007842, + "repoScore": 32.13333333333333, + "findingCount": 14 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 3.2592382691916306, + "blendedVsPinnedBaseline": 3.3857673360055234, + "repoScore": 32.13333333333333, + "findingCount": 14 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 3.256618079064708, + "blendedVsPinnedBaseline": 3.3857673360055234, + "repoScore": 32.13333333333333, + "findingCount": 14 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -0.0038915437296971334, + "blendedVsPinnedBaseline": -0.018769965002318756, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 29, + "functionCount": 1, + "scorePerFile": 0, + "scorePerKloc": -0.10553892085585304, + "scorePerFunction": -0.001497219892523216, + "findingsPerFile": 0, + "findingsPerKloc": -0.04598168750981113, + "findingsPerFunction": -0.0006523157208088715 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.0026201901269224948, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "openusage", + "repo": "robinebers/openusage", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "openusage", + "repo": "robinebers/openusage", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "fa06dbff4fce4f29b788f1c45224e43982d6098e", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 137, + "directoryCount": 29, + "findingCount": 46, + "repoScore": 176.2, + "physicalLineCount": 33319, + "logicalLineCount": 21875, + "functionCount": 485, + "normalized": { + "scorePerFile": 1.2861313868613138, + "scorePerKloc": 8.054857142857143, + "scorePerFunction": 0.3632989690721649, + "findingsPerFile": 0.3357664233576642, + "findingsPerKloc": 2.1028571428571428, + "findingsPerFunction": 0.09484536082474226 + } + }, + "blended": { + "vsCurrentCohort": 2.931613483257123, + "vsPinnedBaseline": 3.0611127125987165 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 25, + "structure.duplicate-function-signatures": 5, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 4, + "defensive.error-swallowing": 3, + "defensive.error-obscuring": 2, + "structure.directory-fanout-hotspot": 2 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "openusage", + "repo": "robinebers/openusage", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "2c278068cdbfbd03937e232428271bc68208d778", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 139, + "directoryCount": 29, + "findingCount": 46, + "repoScore": 176.3111111111111, + "physicalLineCount": 33794, + "logicalLineCount": 22270, + "functionCount": 491, + "normalized": { + "scorePerFile": 1.2684252597921661, + "scorePerKloc": 7.9169784962330985, + "scorePerFunction": 0.3590857660104096, + "findingsPerFile": 0.33093525179856115, + "findingsPerKloc": 2.0655590480466994, + "findingsPerFunction": 0.09368635437881874 + } + }, + "blended": { + "vsCurrentCohort": 2.9040660942565824, + "vsPinnedBaseline": 3.016806784725735 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 25, + "structure.duplicate-function-signatures": 5, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 4, + "defensive.error-swallowing": 3, + "defensive.error-obscuring": 2, + "structure.directory-fanout-hotspot": 2 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "openusage", + "repo": "robinebers/openusage", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "06113d6b94c6f8306e67aedf51b42f3f03d8b3e5", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 143, + "directoryCount": 31, + "findingCount": 50, + "repoScore": 195.3111111111111, + "physicalLineCount": 36980, + "logicalLineCount": 24758, + "functionCount": 562, + "normalized": { + "scorePerFile": 1.3658119658119658, + "scorePerKloc": 7.8888081069194245, + "scorePerFunction": 0.34752866745749306, + "findingsPerFile": 0.34965034965034963, + "findingsPerKloc": 2.0195492366103887, + "findingsPerFunction": 0.08896797153024912 + } + }, + "blended": { + "vsCurrentCohort": 2.9106934453164324, + "vsPinnedBaseline": 3.0261242040110723 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 28, + "structure.duplicate-function-signatures": 5, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 4, + "defensive.error-obscuring": 3, + "defensive.error-swallowing": 3, + "structure.directory-fanout-hotspot": 2 + } + }, + "highest": { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "defaultBranch": "main", + "ref": "fa06dbff4fce4f29b788f1c45224e43982d6098e", + "blendedVsPinnedBaseline": 3.0611127125987165 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 2.931613483257123, + "blendedVsPinnedBaseline": 3.0611127125987165, + "repoScore": 176.2, + "findingCount": 46 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 2.9124251564230508, + "blendedVsPinnedBaseline": 3.0262219938672197, + "repoScore": 176.3111111111111, + "findingCount": 46 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 2.9040660942565824, + "blendedVsPinnedBaseline": 3.016806784725735, + "repoScore": 176.3111111111111, + "findingCount": 46 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 2.9106934453164324, + "blendedVsPinnedBaseline": 3.0261242040110723, + "repoScore": 195.3111111111111, + "findingCount": 50 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -0.020920037940690417, + "blendedVsPinnedBaseline": -0.03498850858764424, + "repoScore": 19.111111111111114, + "findingCount": 4, + "fileCount": 6, + "logicalLineCount": 2883, + "functionCount": 77, + "scorePerFile": 0.07968057895065206, + "scorePerKloc": -0.1660490359377187, + "scorePerFunction": -0.015770301614671856, + "findingsPerFile": 0.013883926292685422, + "findingsPerKloc": -0.0833079062467541, + "findingsPerFunction": -0.005877389294493149 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0.006627351059850017, + "blendedVsPinnedBaseline": 0.009317419285337358, + "repoScore": 19, + "findingCount": 4, + "fileCount": 4, + "logicalLineCount": 2488, + "functionCount": 71, + "scorePerFile": 0.09738670601979971, + "scorePerKloc": -0.028170389313673994, + "scorePerFunction": -0.011557098552916534, + "findingsPerFile": 0.018715097851788487, + "findingsPerKloc": -0.04600981143631078, + "findingsPerFunction": -0.004718382848569624 + } + }, + { + "id": "openclaw", + "repo": "openclaw/openclaw", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "openclaw", + "repo": "openclaw/openclaw", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "47db5abece27d3c9c7edbbd68401f29cb71058ef", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 7690, + "directoryCount": 328, + "findingCount": 2341, + "repoScore": 7722.601888962838, + "physicalLineCount": 1442335, + "logicalLineCount": 759755, + "functionCount": 29852, + "normalized": { + "scorePerFile": 1.004239517420395, + "scorePerKloc": 10.164595019398146, + "scorePerFunction": 0.25869629803573757, + "findingsPerFile": 0.30442132639791936, + "findingsPerKloc": 3.0812564576738555, + "findingsPerFunction": 0.07842020635133325 + } + }, + "blended": { + "vsCurrentCohort": 2.8070687463622503, + "vsPinnedBaseline": 2.9310664157135706 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 639, + "structure.pass-through-wrappers": 435, + "defensive.error-obscuring": 292, + "defensive.empty-catch": 271, + "defensive.async-noise": 236, + "structure.barrel-density": 213, + "structure.duplicate-function-signatures": 187, + "structure.directory-fanout-hotspot": 46, + "defensive.error-swallowing": 16, + "structure.over-fragmentation": 6 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "openclaw", + "repo": "openclaw/openclaw", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "88aa81422653bc123de17550d62e2c4e5ced74fe", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 10219, + "directoryCount": 418, + "findingCount": 3356, + "repoScore": 11102.586696659166, + "physicalLineCount": 1915036, + "logicalLineCount": 1011052, + "functionCount": 40252, + "normalized": { + "scorePerFile": 1.0864650843193233, + "scorePerKloc": 10.981222228588802, + "scorePerFunction": 0.2758269575837018, + "findingsPerFile": 0.32840786769742636, + "findingsPerKloc": 3.319314931378406, + "findingsPerFunction": 0.0833747391433966 + } + }, + "blended": { + "vsCurrentCohort": 3.031981309889982, + "vsPinnedBaseline": 3.149687882423783 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 910, + "structure.pass-through-wrappers": 615, + "structure.barrel-density": 402, + "defensive.error-obscuring": 378, + "structure.duplicate-function-signatures": 318, + "defensive.empty-catch": 316, + "defensive.async-noise": 312, + "structure.directory-fanout-hotspot": 65, + "structure.over-fragmentation": 24, + "defensive.error-swallowing": 16 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "openclaw", + "repo": "openclaw/openclaw", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "1de5610b24dd7642b6412acd4a3035802038f909", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 11367, + "directoryCount": 437, + "findingCount": 3488, + "repoScore": 11255.99708285282, + "physicalLineCount": 2128022, + "logicalLineCount": 1119734, + "functionCount": 44237, + "normalized": { + "scorePerFile": 0.9902346338394317, + "scorePerKloc": 10.052384836803045, + "scorePerFunction": 0.25444756838964716, + "findingsPerFile": 0.30685317146124746, + "findingsPerKloc": 3.1150255328497662, + "findingsPerFunction": 0.0788480231480435 + } + }, + "blended": { + "vsCurrentCohort": 2.8110941249865755, + "vsPinnedBaseline": 2.9225750259146253 + }, + "ruleCounts": { + "tests.duplicate-mock-setup": 976, + "structure.pass-through-wrappers": 677, + "structure.barrel-density": 414, + "defensive.error-obscuring": 408, + "defensive.async-noise": 335, + "defensive.empty-catch": 333, + "structure.duplicate-function-signatures": 230, + "structure.directory-fanout-hotspot": 76, + "structure.over-fragmentation": 24, + "defensive.error-swallowing": 15 + } + }, + "highest": { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "defaultBranch": "main", + "ref": "88aa81422653bc123de17550d62e2c4e5ced74fe", + "blendedVsPinnedBaseline": 3.149687882423783 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 2.8070687463622503, + "blendedVsPinnedBaseline": 2.9310664157135706, + "repoScore": 7722.601888962838, + "findingCount": 2341 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 2.825371225507389, + "blendedVsPinnedBaseline": 2.9357666151912833, + "repoScore": 8799.451719426226, + "findingCount": 2645 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 3.031981309889982, + "blendedVsPinnedBaseline": 3.149687882423783, + "repoScore": 11102.586696659166, + "findingCount": 3356 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 2.8110941249865755, + "blendedVsPinnedBaseline": 2.9225750259146253, + "repoScore": 11255.99708285282, + "findingCount": 3488 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.004025378624325171, + "blendedVsPinnedBaseline": -0.00849138979894537, + "repoScore": 3533.3951938899827, + "findingCount": 1147, + "fileCount": 3677, + "logicalLineCount": 359979, + "functionCount": 14385, + "scorePerFile": -0.014004883580963412, + "scorePerKloc": -0.11221018259510096, + "scorePerFunction": -0.00424872964609041, + "findingsPerFile": 0.0024318450633281086, + "findingsPerKloc": 0.03376907517591077, + "findingsPerFunction": 0.00042781679671025086 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.22088718490340664, + "blendedVsPinnedBaseline": -0.2271128565091578, + "repoScore": 153.41038619365463, + "findingCount": 132, + "fileCount": 1148, + "logicalLineCount": 108682, + "functionCount": 3985, + "scorePerFile": -0.09623045047989165, + "scorePerKloc": -0.9288373917857573, + "scorePerFunction": -0.021379389194054632, + "findingsPerFile": -0.021554696236178894, + "findingsPerKloc": -0.2042893985286396, + "findingsPerFunction": -0.004526715995353106 + } + }, + { + "id": "fulling", + "repo": "FullAgent/fulling", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "fulling", + "repo": "FullAgent/fulling", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "5cfc59ad3d3b33f58b6579dd8392bcb8ffb18f95", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 205, + "directoryCount": 78, + "findingCount": 33, + "repoScore": 111.09166666666668, + "physicalLineCount": 25166, + "logicalLineCount": 10751, + "functionCount": 571, + "normalized": { + "scorePerFile": 0.5419105691056911, + "scorePerKloc": 10.33314730412675, + "scorePerFunction": 0.19455633391710453, + "findingsPerFile": 0.16097560975609757, + "findingsPerKloc": 3.0694819086596596, + "findingsPerFunction": 0.05779334500875657 + } + }, + "blended": { + "vsCurrentCohort": 2.068615299810033, + "vsPinnedBaseline": 2.1599929963104616 + }, + "ruleCounts": { + "defensive.error-swallowing": 11, + "defensive.error-obscuring": 5, + "structure.barrel-density": 4, + "structure.pass-through-wrappers": 4, + "defensive.async-noise": 3, + "defensive.empty-catch": 3, + "structure.directory-fanout-hotspot": 3 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "fulling", + "repo": "FullAgent/fulling", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "d95060f8421b5888564fc8517c1fe99ded463985", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 219, + "directoryCount": 78, + "findingCount": 36, + "repoScore": 115.59166666666668, + "physicalLineCount": 26787, + "logicalLineCount": 12154, + "functionCount": 574, + "normalized": { + "scorePerFile": 0.5278158295281584, + "scorePerKloc": 9.510586363885691, + "scorePerFunction": 0.20137921022067368, + "findingsPerFile": 0.1643835616438356, + "findingsPerKloc": 2.96198782293895, + "findingsPerFunction": 0.0627177700348432 + } + }, + "blended": { + "vsCurrentCohort": 2.076583230796868, + "vsPinnedBaseline": 2.157199656063399 + }, + "ruleCounts": { + "defensive.error-swallowing": 11, + "defensive.error-obscuring": 5, + "structure.barrel-density": 4, + "structure.pass-through-wrappers": 4, + "defensive.async-noise": 3, + "defensive.empty-catch": 3, + "structure.directory-fanout-hotspot": 3, + "tests.duplicate-mock-setup": 3 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "fulling", + "repo": "FullAgent/fulling", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "d95060f8421b5888564fc8517c1fe99ded463985", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 219, + "directoryCount": 78, + "findingCount": 36, + "repoScore": 115.59166666666668, + "physicalLineCount": 26787, + "logicalLineCount": 12154, + "functionCount": 574, + "normalized": { + "scorePerFile": 0.5278158295281584, + "scorePerKloc": 9.510586363885691, + "scorePerFunction": 0.20137921022067368, + "findingsPerFile": 0.1643835616438356, + "findingsPerKloc": 2.96198782293895, + "findingsPerFunction": 0.0627177700348432 + } + }, + "blended": { + "vsCurrentCohort": 2.074913809162218, + "vsPinnedBaseline": 2.157199656063399 + }, + "ruleCounts": { + "defensive.error-swallowing": 11, + "defensive.error-obscuring": 5, + "structure.barrel-density": 4, + "structure.pass-through-wrappers": 4, + "defensive.async-noise": 3, + "defensive.empty-catch": 3, + "structure.directory-fanout-hotspot": 3, + "tests.duplicate-mock-setup": 3 + } + }, + "highest": { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "defaultBranch": "main", + "ref": "5cfc59ad3d3b33f58b6579dd8392bcb8ffb18f95", + "blendedVsPinnedBaseline": 2.1599929963104616 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 2.068615299810033, + "blendedVsPinnedBaseline": 2.1599929963104616, + "repoScore": 111.09166666666668, + "findingCount": 33 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 2.078769486475488, + "blendedVsPinnedBaseline": 2.1599929963104616, + "repoScore": 111.09166666666668, + "findingCount": 33 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 2.076583230796868, + "blendedVsPinnedBaseline": 2.157199656063399, + "repoScore": 115.59166666666668, + "findingCount": 36 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 2.074913809162218, + "blendedVsPinnedBaseline": 2.157199656063399, + "repoScore": 115.59166666666668, + "findingCount": 36 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.006298509352185011, + "blendedVsPinnedBaseline": -0.00279334024706257, + "repoScore": 4.5, + "findingCount": 3, + "fileCount": 14, + "logicalLineCount": 1403, + "functionCount": 3, + "scorePerFile": -0.014094739577532711, + "scorePerKloc": -0.8225609402410594, + "scorePerFunction": 0.0068228763035691475, + "findingsPerFile": 0.003407951887738042, + "findingsPerKloc": -0.10749408572070962, + "findingsPerFunction": 0.004924425026086636 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.0016694216346500035, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "emdash", + "repo": "emdash-cms/emdash", + "cohort": "explicit-ai", + "pointCount": 2, + "firstRecordedAt": "2026-04-06T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "emdash", + "repo": "emdash-cms/emdash", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "5f448d1035073283fd7435d2f320d1f3c94898a0", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1072, + "directoryCount": 306, + "findingCount": 239, + "repoScore": 787.2525793650789, + "physicalLineCount": 257919, + "logicalLineCount": 120412, + "functionCount": 3513, + "normalized": { + "scorePerFile": 0.7343774061241407, + "scorePerKloc": 6.537991058740648, + "scorePerFunction": 0.22409694829635038, + "findingsPerFile": 0.22294776119402984, + "findingsPerKloc": 1.9848520081055043, + "findingsPerFunction": 0.06803302021064617 + } + }, + "blended": { + "vsCurrentCohort": 2.0933170174606843, + "vsPinnedBaseline": 2.1745830762415395 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 55, + "defensive.empty-catch": 40, + "structure.barrel-density": 34, + "defensive.error-obscuring": 27, + "structure.pass-through-wrappers": 27, + "tests.duplicate-mock-setup": 21, + "structure.directory-fanout-hotspot": 17, + "defensive.error-swallowing": 13, + "defensive.async-noise": 5 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "emdash", + "repo": "emdash-cms/emdash", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "5f448d1035073283fd7435d2f320d1f3c94898a0", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1072, + "directoryCount": 306, + "findingCount": 239, + "repoScore": 787.2525793650789, + "physicalLineCount": 257919, + "logicalLineCount": 120412, + "functionCount": 3513, + "normalized": { + "scorePerFile": 0.7343774061241407, + "scorePerKloc": 6.537991058740648, + "scorePerFunction": 0.22409694829635038, + "findingsPerFile": 0.22294776119402984, + "findingsPerKloc": 1.9848520081055043, + "findingsPerFunction": 0.06803302021064617 + } + }, + "blended": { + "vsCurrentCohort": 2.0933170174606843, + "vsPinnedBaseline": 2.1745830762415395 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 55, + "defensive.empty-catch": 40, + "structure.barrel-density": 34, + "defensive.error-obscuring": 27, + "structure.pass-through-wrappers": 27, + "tests.duplicate-mock-setup": 21, + "structure.directory-fanout-hotspot": 17, + "defensive.error-swallowing": 13, + "defensive.async-noise": 5 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "emdash", + "repo": "emdash-cms/emdash", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "a1dac004da667b101f5a3f6287c8f8ccaf2e6863", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1132, + "directoryCount": 317, + "findingCount": 243, + "repoScore": 795.1484126984125, + "physicalLineCount": 304059, + "logicalLineCount": 143660, + "functionCount": 3658, + "normalized": { + "scorePerFile": 0.7024279264120251, + "scorePerKloc": 5.5349325678575285, + "scorePerFunction": 0.2173724474298558, + "findingsPerFile": 0.2146643109540636, + "findingsPerKloc": 1.6914938048169288, + "findingsPerFunction": 0.06642974302897758 + } + }, + "blended": { + "vsCurrentCohort": 1.9362549120163848, + "vsPinnedBaseline": 2.0130418968772985 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 55, + "defensive.empty-catch": 39, + "structure.barrel-density": 34, + "defensive.error-obscuring": 28, + "structure.pass-through-wrappers": 28, + "tests.duplicate-mock-setup": 24, + "structure.directory-fanout-hotspot": 17, + "defensive.error-swallowing": 13, + "defensive.async-noise": 5 + } + }, + "highest": { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "defaultBranch": "main", + "ref": "5f448d1035073283fd7435d2f320d1f3c94898a0", + "blendedVsPinnedBaseline": 2.1745830762415395 + }, + "series": [ + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 2.0933170174606843, + "blendedVsPinnedBaseline": 2.1745830762415395, + "repoScore": 787.2525793650789, + "findingCount": 239 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.9362549120163848, + "blendedVsPinnedBaseline": 2.0130418968772985, + "repoScore": 795.1484126984125, + "findingCount": 243 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -0.15706210544429955, + "blendedVsPinnedBaseline": -0.16154117936424095, + "repoScore": 7.895833333333599, + "findingCount": 4, + "fileCount": 60, + "logicalLineCount": 23248, + "functionCount": 145, + "scorePerFile": -0.03194947971211559, + "scorePerKloc": -1.0030584908831193, + "scorePerFunction": -0.006724500866494593, + "findingsPerFile": -0.008283450239966239, + "findingsPerKloc": -0.29335820328857554, + "findingsPerFunction": -0.0016032771816685831 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.15706210544429955, + "blendedVsPinnedBaseline": -0.16154117936424095, + "repoScore": 7.895833333333599, + "findingCount": 4, + "fileCount": 60, + "logicalLineCount": 23248, + "functionCount": 145, + "scorePerFile": -0.03194947971211559, + "scorePerKloc": -1.0030584908831193, + "scorePerFunction": -0.006724500866494593, + "findingsPerFile": -0.008283450239966239, + "findingsPerKloc": -0.29335820328857554, + "findingsPerFunction": -0.0016032771816685831 + } + }, + { + "id": "vinext", + "repo": "cloudflare/vinext", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "vinext", + "repo": "cloudflare/vinext", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "fd7618c94a407a4841390963989625567d67e77c", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1049, + "directoryCount": 460, + "findingCount": 153, + "repoScore": 499.82379287379285, + "physicalLineCount": 137634, + "logicalLineCount": 55528, + "functionCount": 2642, + "normalized": { + "scorePerFile": 0.47647644697215713, + "scorePerKloc": 9.001292913013126, + "scorePerFunction": 0.18918387315435006, + "findingsPerFile": 0.14585319351763584, + "findingsPerKloc": 2.7553666618642847, + "findingsPerFunction": 0.057910673732021196 + } + }, + "blended": { + "vsCurrentCohort": 1.9034539118643468, + "vsPinnedBaseline": 1.9875358742654106 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 49, + "structure.pass-through-wrappers": 27, + "defensive.error-obscuring": 18, + "defensive.empty-catch": 16, + "tests.duplicate-mock-setup": 16, + "structure.directory-fanout-hotspot": 15, + "defensive.async-noise": 3, + "defensive.error-swallowing": 3, + "structure.barrel-density": 3, + "structure.over-fragmentation": 3 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "vinext", + "repo": "cloudflare/vinext", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "ccb299ab79cbd0749614fc48ce7e1ebcf8e183ae", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1129, + "directoryCount": 486, + "findingCount": 164, + "repoScore": 547.452724726254, + "physicalLineCount": 149555, + "logicalLineCount": 59877, + "functionCount": 2901, + "normalized": { + "scorePerFile": 0.4849005533447777, + "scorePerKloc": 9.142955136801342, + "scorePerFunction": 0.18871172861987384, + "findingsPerFile": 0.14526129317980513, + "findingsPerKloc": 2.738948177096381, + "findingsPerFunction": 0.05653223026542571 + } + }, + "blended": { + "vsCurrentCohort": 1.912146851658272, + "vsPinnedBaseline": 1.9863795823666808 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 50, + "structure.pass-through-wrappers": 29, + "defensive.error-obscuring": 24, + "tests.duplicate-mock-setup": 18, + "defensive.empty-catch": 16, + "structure.directory-fanout-hotspot": 15, + "defensive.async-noise": 4, + "structure.barrel-density": 3, + "structure.over-fragmentation": 3, + "defensive.error-swallowing": 2 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "vinext", + "repo": "cloudflare/vinext", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "e81a6212d5c8c4d3f1cad6186178204cf004db4e", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1174, + "directoryCount": 504, + "findingCount": 167, + "repoScore": 551.8886724386724, + "physicalLineCount": 155384, + "logicalLineCount": 62152, + "functionCount": 3060, + "normalized": { + "scorePerFile": 0.4700925659613905, + "scorePerKloc": 8.87966070985121, + "scorePerFunction": 0.1803557753067557, + "findingsPerFile": 0.14224872231686542, + "findingsPerKloc": 2.6869609988415495, + "findingsPerFunction": 0.05457516339869281 + } + }, + "blended": { + "vsCurrentCohort": 1.853871918339763, + "vsPinnedBaseline": 1.9273918015143312 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 50, + "structure.pass-through-wrappers": 29, + "defensive.error-obscuring": 25, + "defensive.empty-catch": 18, + "tests.duplicate-mock-setup": 18, + "structure.directory-fanout-hotspot": 15, + "defensive.async-noise": 4, + "structure.barrel-density": 3, + "structure.over-fragmentation": 3, + "defensive.error-swallowing": 2 + } + }, + "highest": { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "defaultBranch": "main", + "ref": "a7dd2d56af100ea7c109834d65ec76a3dbcefe32", + "blendedVsPinnedBaseline": 1.9929446040102008 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1.9034539118643468, + "blendedVsPinnedBaseline": 1.9875358742654106, + "repoScore": 499.82379287379285, + "findingCount": 153 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.918002714883301, + "blendedVsPinnedBaseline": 1.9929446040102008, + "repoScore": 518.3082251082251, + "findingCount": 159 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.912146851658272, + "blendedVsPinnedBaseline": 1.9863795823666808, + "repoScore": 547.452724726254, + "findingCount": 164 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.853871918339763, + "blendedVsPinnedBaseline": 1.9273918015143312, + "repoScore": 551.8886724386724, + "findingCount": 167 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -0.04958199352458381, + "blendedVsPinnedBaseline": -0.06014407275107936, + "repoScore": 52.06487956487956, + "findingCount": 14, + "fileCount": 125, + "logicalLineCount": 6624, + "functionCount": 418, + "scorePerFile": -0.0063838810107666455, + "scorePerKloc": -0.1216322031619157, + "scorePerFunction": -0.008828097847594363, + "findingsPerFile": -0.003604471200770426, + "findingsPerKloc": -0.06840566302273521, + "findingsPerFunction": -0.0033355103333283856 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.05827493331850908, + "blendedVsPinnedBaseline": -0.05898778085234957, + "repoScore": 4.435947712418397, + "findingCount": 3, + "fileCount": 45, + "logicalLineCount": 2275, + "functionCount": 159, + "scorePerFile": -0.014807987383387233, + "scorePerKloc": -0.2632944269501323, + "scorePerFunction": -0.008355953313118142, + "findingsPerFile": -0.003012570862939712, + "findingsPerKloc": -0.051987178254831345, + "findingsPerFunction": -0.001957066866732901 + } + }, + { + "id": "hunk", + "repo": "modem-dev/hunk", + "cohort": "explicit-ai", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "hunk", + "repo": "modem-dev/hunk", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "4b9a6396dc09ad7408afb715f7448e0dd536c628", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 124, + "directoryCount": 29, + "findingCount": 9, + "repoScore": 29.390909090909087, + "physicalLineCount": 20091, + "logicalLineCount": 7812, + "functionCount": 492, + "normalized": { + "scorePerFile": 0.23702346041055716, + "scorePerKloc": 3.762277149373923, + "scorePerFunction": 0.059737620103473756, + "findingsPerFile": 0.07258064516129033, + "findingsPerKloc": 1.152073732718894, + "findingsPerFunction": 0.018292682926829267 + } + }, + "blended": { + "vsCurrentCohort": 0.7680209296529915, + "vsPinnedBaseline": 0.801946997695828 + }, + "ruleCounts": { + "defensive.error-obscuring": 4, + "defensive.empty-catch": 2, + "structure.pass-through-wrappers": 2, + "structure.directory-fanout-hotspot": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "hunk", + "repo": "modem-dev/hunk", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "90366239381b642fde80aa5b3a350a291eb41282", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 158, + "directoryCount": 33, + "findingCount": 18, + "repoScore": 53.37527472527472, + "physicalLineCount": 30250, + "logicalLineCount": 12178, + "functionCount": 704, + "normalized": { + "scorePerFile": 0.33781819446376404, + "scorePerKloc": 4.382926155795263, + "scorePerFunction": 0.07581715159840159, + "findingsPerFile": 0.11392405063291139, + "findingsPerKloc": 1.478075217605518, + "findingsPerFunction": 0.02556818181818182 + } + }, + "blended": { + "vsCurrentCohort": 1.0386382637379339, + "vsPinnedBaseline": 1.078959933838033 + }, + "ruleCounts": { + "defensive.error-obscuring": 6, + "defensive.empty-catch": 4, + "structure.pass-through-wrappers": 4, + "structure.directory-fanout-hotspot": 2, + "defensive.async-noise": 1, + "defensive.error-swallowing": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "hunk", + "repo": "modem-dev/hunk", + "cohort": "explicit-ai", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "53242b4b45afc3ee728f2ee10054c4cec83314c8", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 186, + "directoryCount": 38, + "findingCount": 31, + "repoScore": 88.89960317460319, + "physicalLineCount": 37128, + "logicalLineCount": 15245, + "functionCount": 840, + "normalized": { + "scorePerFile": 0.47795485577743646, + "scorePerKloc": 5.831394107878202, + "scorePerFunction": 0.10583286092214665, + "findingsPerFile": 0.16666666666666666, + "findingsPerKloc": 2.0334535913414236, + "findingsPerFunction": 0.036904761904761905 + } + }, + "blended": { + "vsCurrentCohort": 1.4562462925417925, + "vsPinnedBaseline": 1.5139973465611831 + }, + "ruleCounts": { + "defensive.error-obscuring": 9, + "defensive.empty-catch": 6, + "structure.pass-through-wrappers": 6, + "structure.directory-fanout-hotspot": 4, + "structure.duplicate-function-signatures": 3, + "defensive.async-noise": 1, + "defensive.error-swallowing": 1, + "structure.barrel-density": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "main", + "ref": "53242b4b45afc3ee728f2ee10054c4cec83314c8", + "blendedVsPinnedBaseline": 1.5139973465611831 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 0.7680209296529915, + "blendedVsPinnedBaseline": 0.801946997695828, + "repoScore": 29.390909090909087, + "findingCount": 9 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.078908251493315, + "blendedVsPinnedBaseline": 1.1210643036897423, + "repoScore": 50.4, + "findingCount": 17 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.0386382637379339, + "blendedVsPinnedBaseline": 1.078959933838033, + "repoScore": 53.37527472527472, + "findingCount": 18 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.4562462925417925, + "blendedVsPinnedBaseline": 1.5139973465611831, + "repoScore": 88.89960317460319, + "findingCount": 31 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.688225362888801, + "blendedVsPinnedBaseline": 0.7120503488653551, + "repoScore": 59.508694083694095, + "findingCount": 22, + "fileCount": 62, + "logicalLineCount": 7433, + "functionCount": 348, + "scorePerFile": 0.2409313953668793, + "scorePerKloc": 2.069116958504279, + "scorePerFunction": 0.046095240818672896, + "findingsPerFile": 0.09408602150537633, + "findingsPerKloc": 0.8813798586225297, + "findingsPerFunction": 0.01861207897793264 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0.4176080288038586, + "blendedVsPinnedBaseline": 0.4350374127231502, + "repoScore": 35.524328449328465, + "findingCount": 13, + "fileCount": 28, + "logicalLineCount": 3067, + "functionCount": 136, + "scorePerFile": 0.14013666131367242, + "scorePerKloc": 1.4484679520829387, + "scorePerFunction": 0.03001570932374506, + "findingsPerFile": 0.05274261603375527, + "findingsPerKloc": 0.5553783737359055, + "findingsPerFunction": 0.011336580086580086 + } + }, + { + "id": "vite", + "repo": "vitejs/vite", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "vite", + "repo": "vitejs/vite", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "ff91c319facd602dc5eea81ed7e7d79ae7dadb95", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1420, + "directoryCount": 613, + "findingCount": 115, + "repoScore": 380.64387822322607, + "physicalLineCount": 94523, + "logicalLineCount": 45982, + "functionCount": 2288, + "normalized": { + "scorePerFile": 0.26805906917128597, + "scorePerKloc": 8.27810617683498, + "scorePerFunction": 0.16636533139127013, + "findingsPerFile": 0.08098591549295775, + "findingsPerKloc": 2.5009786438171457, + "findingsPerFunction": 0.05026223776223776 + } + }, + "blended": { + "vsCurrentCohort": 1.4544291476328446, + "vsPinnedBaseline": 1.5186761757032523 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 27, + "structure.directory-fanout-hotspot": 21, + "defensive.empty-catch": 14, + "structure.barrel-density": 11, + "defensive.error-obscuring": 10, + "defensive.async-noise": 9, + "structure.over-fragmentation": 8, + "defensive.error-swallowing": 6, + "tests.duplicate-mock-setup": 6, + "structure.duplicate-function-signatures": 3 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "vite", + "repo": "vitejs/vite", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "79f002f2286c03c88c7b74c511c7f9fc6dc46694", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1432, + "directoryCount": 618, + "findingCount": 114, + "repoScore": 377.94093704675544, + "physicalLineCount": 95795, + "logicalLineCount": 46589, + "functionCount": 2299, + "normalized": { + "scorePerFile": 0.26392523536784596, + "scorePerKloc": 8.112235442846067, + "scorePerFunction": 0.16439362202990668, + "findingsPerFile": 0.07960893854748603, + "findingsPerKloc": 2.4469295327223164, + "findingsPerFunction": 0.049586776859504134 + } + }, + "blended": { + "vsCurrentCohort": 1.437702992014066, + "vsPinnedBaseline": 1.4935170206030834 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 27, + "structure.directory-fanout-hotspot": 20, + "defensive.empty-catch": 14, + "structure.barrel-density": 11, + "defensive.error-obscuring": 10, + "defensive.async-noise": 9, + "structure.over-fragmentation": 8, + "defensive.error-swallowing": 6, + "tests.duplicate-mock-setup": 6, + "structure.duplicate-function-signatures": 3 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "vite", + "repo": "vitejs/vite", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "bc5c6a7a498845dff20dc410c395355b79a4b753", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 1438, + "directoryCount": 622, + "findingCount": 117, + "repoScore": 381.69093704675544, + "physicalLineCount": 96023, + "logicalLineCount": 46665, + "functionCount": 2307, + "normalized": { + "scorePerFile": 0.2654318060130427, + "scorePerKloc": 8.179383628988653, + "scorePerFunction": 0.16544904076582376, + "findingsPerFile": 0.08136300417246176, + "findingsPerKloc": 2.507232401157184, + "findingsPerFunction": 0.05071521456436931 + } + }, + "blended": { + "vsCurrentCohort": 1.4580090921548914, + "vsPinnedBaseline": 1.5158300543595955 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 27, + "structure.directory-fanout-hotspot": 20, + "defensive.empty-catch": 14, + "structure.barrel-density": 11, + "defensive.error-obscuring": 10, + "defensive.async-noise": 9, + "structure.over-fragmentation": 8, + "defensive.error-swallowing": 6, + "structure.duplicate-function-signatures": 6, + "tests.duplicate-mock-setup": 6 + } + }, + "highest": { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "defaultBranch": "main", + "ref": "ff91c319facd602dc5eea81ed7e7d79ae7dadb95", + "blendedVsPinnedBaseline": 1.5186761757032523 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1.4544291476328446, + "blendedVsPinnedBaseline": 1.5186761757032523, + "repoScore": 380.64387822322607, + "findingCount": 115 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.456127340215348, + "blendedVsPinnedBaseline": 1.5130224284434717, + "repoScore": 380.64387822322607, + "findingCount": 115 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.437702992014066, + "blendedVsPinnedBaseline": 1.4935170206030834, + "repoScore": 377.94093704675544, + "findingCount": 114 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.4580090921548914, + "blendedVsPinnedBaseline": 1.5158300543595955, + "repoScore": 381.69093704675544, + "findingCount": 117 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.0035799445220467963, + "blendedVsPinnedBaseline": -0.0028461213436568045, + "repoScore": 1.047058823529369, + "findingCount": 2, + "fileCount": 18, + "logicalLineCount": 683, + "functionCount": 19, + "scorePerFile": -0.0026272631582432426, + "scorePerKloc": -0.09872254784632695, + "scorePerFunction": -0.0009162906254463754, + "findingsPerFile": 0.00037708867950400626, + "findingsPerKloc": 0.006253757340038302, + "findingsPerFunction": 0.00045297680213154945 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0.020306100140825345, + "blendedVsPinnedBaseline": 0.022313033756512057, + "repoScore": 3.75, + "findingCount": 3, + "fileCount": 6, + "logicalLineCount": 76, + "functionCount": 8, + "scorePerFile": 0.0015065706451967698, + "scorePerKloc": 0.06714818614258533, + "scorePerFunction": 0.0010554187359170797, + "findingsPerFile": 0.001754065624975723, + "findingsPerKloc": 0.06030286843486765, + "findingsPerFunction": 0.0011284377048651761 + } + }, + { + "id": "astro", + "repo": "withastro/astro", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "astro", + "repo": "withastro/astro", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "15b25e8cf4e00c363ad0fd20c00b0a2af4a33002", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 2739, + "directoryCount": 1142, + "findingCount": 270, + "repoScore": 769.7916666666663, + "physicalLineCount": 218211, + "logicalLineCount": 126799, + "functionCount": 4217, + "normalized": { + "scorePerFile": 0.28104843616891795, + "scorePerKloc": 6.07096007592068, + "scorePerFunction": 0.182544858113983, + "findingsPerFile": 0.09857612267250822, + "findingsPerKloc": 2.1293543324474165, + "findingsPerFunction": 0.06402655916528338 + } + }, + "blended": { + "vsCurrentCohort": 1.480788259953165, + "vsPinnedBaseline": 1.546199658685362 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 52, + "defensive.empty-catch": 47, + "structure.directory-fanout-hotspot": 39, + "structure.duplicate-function-signatures": 37, + "defensive.error-obscuring": 33, + "structure.barrel-density": 29, + "defensive.async-noise": 22, + "defensive.error-swallowing": 10, + "structure.over-fragmentation": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "astro", + "repo": "withastro/astro", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "5557dcabbfe70ae06cd39d96f5b52102a740a148", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 2795, + "directoryCount": 1142, + "findingCount": 265, + "repoScore": 745.8540043290039, + "physicalLineCount": 226500, + "logicalLineCount": 131194, + "functionCount": 4358, + "normalized": { + "scorePerFile": 0.26685295324830194, + "scorePerKloc": 5.685122828246749, + "scorePerFunction": 0.17114593949724735, + "findingsPerFile": 0.09481216457960644, + "findingsPerKloc": 2.0199094470783727, + "findingsPerFunction": 0.06080770995869665 + } + }, + "blended": { + "vsCurrentCohort": 1.4098798004438529, + "vsPinnedBaseline": 1.4646136863202488 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 55, + "defensive.empty-catch": 46, + "structure.duplicate-function-signatures": 37, + "defensive.error-obscuring": 34, + "structure.directory-fanout-hotspot": 32, + "structure.barrel-density": 29, + "defensive.async-noise": 21, + "defensive.error-swallowing": 10, + "structure.over-fragmentation": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "astro", + "repo": "withastro/astro", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "7fe40bc7381d981dedad16625d89c00e31cd8fd0", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 2805, + "directoryCount": 1148, + "findingCount": 265, + "repoScore": 745.7111471861468, + "physicalLineCount": 227080, + "logicalLineCount": 131581, + "functionCount": 4367, + "normalized": { + "scorePerFile": 0.26585067635869764, + "scorePerKloc": 5.667316308480304, + "scorePerFunction": 0.17076051000369746, + "findingsPerFile": 0.0944741532976827, + "findingsPerKloc": 2.0139685820901194, + "findingsPerFunction": 0.06068239065720174 + } + }, + "blended": { + "vsCurrentCohort": 1.4045885875409714, + "vsPinnedBaseline": 1.46029102730651 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 55, + "defensive.empty-catch": 46, + "structure.duplicate-function-signatures": 37, + "defensive.error-obscuring": 34, + "structure.directory-fanout-hotspot": 32, + "structure.barrel-density": 29, + "defensive.async-noise": 21, + "defensive.error-swallowing": 10, + "structure.over-fragmentation": 1 + } + }, + "highest": { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "defaultBranch": "main", + "ref": "15b25e8cf4e00c363ad0fd20c00b0a2af4a33002", + "blendedVsPinnedBaseline": 1.546199658685362 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1.480788259953165, + "blendedVsPinnedBaseline": 1.546199658685362, + "repoScore": 769.7916666666663, + "findingCount": 270 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.421120946836393, + "blendedVsPinnedBaseline": 1.4766482344712326, + "repoScore": 742.3111471861466, + "findingCount": 265 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.4098798004438529, + "blendedVsPinnedBaseline": 1.4646136863202488, + "repoScore": 745.8540043290039, + "findingCount": 265 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.4045885875409714, + "blendedVsPinnedBaseline": 1.46029102730651, + "repoScore": 745.7111471861468, + "findingCount": 265 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": -0.07619967241219361, + "blendedVsPinnedBaseline": -0.08590863137885196, + "repoScore": -24.080519480519456, + "findingCount": -5, + "fileCount": 66, + "logicalLineCount": 4782, + "functionCount": 150, + "scorePerFile": -0.015197759810220313, + "scorePerKloc": -0.4036437674403759, + "scorePerFunction": -0.01178434811028553, + "findingsPerFile": -0.004101969374825515, + "findingsPerKloc": -0.11538575035729703, + "findingsPerFunction": -0.003344168508081641 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.005291212902881481, + "blendedVsPinnedBaseline": -0.00432265901373885, + "repoScore": -0.14285714285711038, + "findingCount": 0, + "fileCount": 10, + "logicalLineCount": 387, + "functionCount": 9, + "scorePerFile": -0.0010022768896043033, + "scorePerKloc": -0.017806519766445206, + "scorePerFunction": -0.0003854294935498881, + "findingsPerFile": -0.00033801128192373353, + "findingsPerKloc": -0.005940864988253303, + "findingsPerFunction": -0.0001253193014949111 + } + }, + { + "id": "zustand", + "repo": "pmndrs/zustand", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "zustand", + "repo": "pmndrs/zustand", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "206012dbd1ae046ea0aefb9cd7bf8bba913c6459", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 49, + "directoryCount": 15, + "findingCount": 9, + "repoScore": 22.866666666666667, + "physicalLineCount": 9464, + "logicalLineCount": 7606, + "functionCount": 171, + "normalized": { + "scorePerFile": 0.4666666666666667, + "scorePerKloc": 3.006398457358226, + "scorePerFunction": 0.13372319688109163, + "findingsPerFile": 0.1836734693877551, + "findingsPerKloc": 1.183276360767815, + "findingsPerFunction": 0.05263157894736842 + } + }, + "blended": { + "vsCurrentCohort": 1.3247526993380319, + "vsPinnedBaseline": 1.3832714824628354 + }, + "ruleCounts": { + "structure.barrel-density": 3, + "structure.directory-fanout-hotspot": 2, + "defensive.empty-catch": 1, + "defensive.error-obscuring": 1, + "defensive.error-swallowing": 1, + "structure.pass-through-wrappers": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "zustand", + "repo": "pmndrs/zustand", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "00f96a389d4015ecf4eadb42aa1e4e0efe14bb95", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 49, + "directoryCount": 15, + "findingCount": 9, + "repoScore": 22.866666666666667, + "physicalLineCount": 9584, + "logicalLineCount": 7699, + "functionCount": 171, + "normalized": { + "scorePerFile": 0.4666666666666667, + "scorePerKloc": 2.9700826947222585, + "scorePerFunction": 0.13372319688109163, + "findingsPerFile": 0.1836734693877551, + "findingsPerKloc": 1.1689829848032212, + "findingsPerFunction": 0.05263157894736842 + } + }, + "blended": { + "vsCurrentCohort": 1.326194098484615, + "vsPinnedBaseline": 1.3776791658028045 + }, + "ruleCounts": { + "structure.barrel-density": 3, + "structure.directory-fanout-hotspot": 2, + "defensive.empty-catch": 1, + "defensive.error-obscuring": 1, + "defensive.error-swallowing": 1, + "structure.pass-through-wrappers": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "zustand", + "repo": "pmndrs/zustand", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "00f96a389d4015ecf4eadb42aa1e4e0efe14bb95", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 49, + "directoryCount": 15, + "findingCount": 9, + "repoScore": 22.866666666666667, + "physicalLineCount": 9584, + "logicalLineCount": 7699, + "functionCount": 171, + "normalized": { + "scorePerFile": 0.4666666666666667, + "scorePerKloc": 2.9700826947222585, + "scorePerFunction": 0.13372319688109163, + "findingsPerFile": 0.1836734693877551, + "findingsPerKloc": 1.1689829848032212, + "findingsPerFunction": 0.05263157894736842 + } + }, + "blended": { + "vsCurrentCohort": 1.3251279350451146, + "vsPinnedBaseline": 1.3776791658028045 + }, + "ruleCounts": { + "structure.barrel-density": 3, + "structure.directory-fanout-hotspot": 2, + "defensive.empty-catch": 1, + "defensive.error-obscuring": 1, + "defensive.error-swallowing": 1, + "structure.pass-through-wrappers": 1 + } + }, + "highest": { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "defaultBranch": "main", + "ref": "206012dbd1ae046ea0aefb9cd7bf8bba913c6459", + "blendedVsPinnedBaseline": 1.3832714824628354 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1.3247526993380319, + "blendedVsPinnedBaseline": 1.3832714824628354, + "repoScore": 22.866666666666667, + "findingCount": 9 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.3312554967387273, + "blendedVsPinnedBaseline": 1.3832714824628354, + "repoScore": 22.866666666666667, + "findingCount": 9 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.326194098484615, + "blendedVsPinnedBaseline": 1.3776791658028045, + "repoScore": 22.866666666666667, + "findingCount": 9 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.3251279350451146, + "blendedVsPinnedBaseline": 1.3776791658028045, + "repoScore": 22.866666666666667, + "findingCount": 9 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.000375235707082755, + "blendedVsPinnedBaseline": -0.005592316660030905, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 93, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": -0.036315762635967364, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": -0.01429337596459379, + "findingsPerFunction": 0 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.0010661634395003894, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "payload", + "repo": "payloadcms/payload", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "payload", + "repo": "payloadcms/payload", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "167a01eb0ca69894bfc44e2f8b605148ab646922", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 6097, + "directoryCount": 2520, + "findingCount": 495, + "repoScore": 1462.67181013431, + "physicalLineCount": 738583, + "logicalLineCount": 461694, + "functionCount": 5432, + "normalized": { + "scorePerFile": 0.23990024768481383, + "scorePerKloc": 3.1680546208837668, + "scorePerFunction": 0.2692694790379805, + "findingsPerFile": 0.08118746924717074, + "findingsPerKloc": 1.0721386892617188, + "findingsPerFunction": 0.09112665684830633 + } + }, + "blended": { + "vsCurrentCohort": 1.264525566857393, + "vsPinnedBaseline": 1.3203839149397734 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 177, + "structure.directory-fanout-hotspot": 95, + "structure.barrel-density": 62, + "defensive.empty-catch": 39, + "defensive.error-obscuring": 37, + "defensive.error-swallowing": 35, + "structure.pass-through-wrappers": 20, + "structure.over-fragmentation": 12, + "tests.duplicate-mock-setup": 10, + "defensive.async-noise": 7, + "comments.placeholder-comments": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "payload", + "repo": "payloadcms/payload", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "2011f28233b38494cdbc1ec3e2eab81386725e20", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 6225, + "directoryCount": 2577, + "findingCount": 506, + "repoScore": 1495.1690323565317, + "physicalLineCount": 749749, + "logicalLineCount": 466942, + "functionCount": 5540, + "normalized": { + "scorePerFile": 0.24018779636249504, + "scorePerKloc": 3.2020444345476133, + "scorePerFunction": 0.2698861069235617, + "findingsPerFile": 0.08128514056224899, + "findingsPerKloc": 1.0836463629315847, + "findingsPerFunction": 0.09133574007220216 + } + }, + "blended": { + "vsCurrentCohort": 1.2770550762355934, + "vsPinnedBaseline": 1.3266324847342088 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 177, + "structure.directory-fanout-hotspot": 97, + "structure.barrel-density": 66, + "defensive.empty-catch": 41, + "defensive.error-obscuring": 39, + "defensive.error-swallowing": 35, + "structure.pass-through-wrappers": 20, + "structure.over-fragmentation": 13, + "tests.duplicate-mock-setup": 10, + "defensive.async-noise": 7, + "comments.placeholder-comments": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "payload", + "repo": "payloadcms/payload", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "5afcef5d85d596b0536d02e10bb3e7d254d48bc8", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 6250, + "directoryCount": 2578, + "findingCount": 513, + "repoScore": 1525.0410561660556, + "physicalLineCount": 754256, + "logicalLineCount": 469447, + "functionCount": 5558, + "normalized": { + "scorePerFile": 0.2440065689865689, + "scorePerKloc": 3.2485904823463683, + "scorePerFunction": 0.274386659979499, + "findingsPerFile": 0.08208, + "findingsPerKloc": 1.092775116253805, + "findingsPerFunction": 0.09229938826916156 + } + }, + "blended": { + "vsCurrentCohort": 1.2921562583044328, + "vsPinnedBaseline": 1.3433999155463558 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 177, + "structure.directory-fanout-hotspot": 102, + "structure.barrel-density": 66, + "defensive.empty-catch": 42, + "defensive.error-obscuring": 40, + "defensive.error-swallowing": 35, + "structure.pass-through-wrappers": 20, + "structure.over-fragmentation": 13, + "tests.duplicate-mock-setup": 10, + "defensive.async-noise": 7, + "comments.placeholder-comments": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "main", + "ref": "5afcef5d85d596b0536d02e10bb3e7d254d48bc8", + "blendedVsPinnedBaseline": 1.3433999155463558 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1.264525566857393, + "blendedVsPinnedBaseline": 1.3203839149397734, + "repoScore": 1462.67181013431, + "findingCount": 495 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1.2750388200492768, + "blendedVsPinnedBaseline": 1.3248582583342952, + "repoScore": 1485.9218101343095, + "findingCount": 504 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1.2770550762355934, + "blendedVsPinnedBaseline": 1.3266324847342088, + "repoScore": 1495.1690323565317, + "findingCount": 506 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1.2921562583044328, + "blendedVsPinnedBaseline": 1.3433999155463558, + "repoScore": 1525.0410561660556, + "findingCount": 513 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.02763069144703989, + "blendedVsPinnedBaseline": 0.023016000606582487, + "repoScore": 62.36924603174566, + "findingCount": 18, + "fileCount": 153, + "logicalLineCount": 7753, + "functionCount": 126, + "scorePerFile": 0.0041063213017550615, + "scorePerKloc": 0.0805358614626015, + "scorePerFunction": 0.005117180941518529, + "findingsPerFile": 0.0008925307528292598, + "findingsPerKloc": 0.020636426992086232, + "findingsPerFunction": 0.0011727314208552359 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0.01510118206883937, + "blendedVsPinnedBaseline": 0.016767430812147044, + "repoScore": 29.872023809523853, + "findingCount": 7, + "fileCount": 25, + "logicalLineCount": 2505, + "functionCount": 18, + "scorePerFile": 0.003818772624073846, + "scorePerKloc": 0.04654604779875493, + "scorePerFunction": 0.004500553055937329, + "findingsPerFile": 0.000794859437751011, + "findingsPerKloc": 0.009128753322220406, + "findingsPerFunction": 0.0009636481969594046 + } + }, + { + "id": "umami", + "repo": "umami-software/umami", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "umami", + "repo": "umami-software/umami", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "60376624db2159acefd91e13bb9498770464c37c", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 832, + "directoryCount": 196, + "findingCount": 59, + "repoScore": 151.86856060606064, + "physicalLineCount": 50570, + "logicalLineCount": 32880, + "functionCount": 1556, + "normalized": { + "scorePerFile": 0.1825343276515152, + "scorePerKloc": 4.618873497751236, + "scorePerFunction": 0.0976019027031238, + "findingsPerFile": 0.07091346153846154, + "findingsPerKloc": 1.7944038929440387, + "findingsPerFunction": 0.037917737789203085 + } + }, + "blended": { + "vsCurrentCohort": 1, + "vsPinnedBaseline": 1.0441733639448667 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 23, + "structure.directory-fanout-hotspot": 11, + "defensive.error-obscuring": 9, + "structure.pass-through-wrappers": 6, + "structure.barrel-density": 5, + "defensive.empty-catch": 3, + "defensive.error-swallowing": 1, + "structure.over-fragmentation": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "umami", + "repo": "umami-software/umami", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "4ca7d53f817cf421dda2172eee1d5bc81fe2dbd7", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 834, + "directoryCount": 196, + "findingCount": 59, + "repoScore": 151.86856060606064, + "physicalLineCount": 51228, + "logicalLineCount": 33098, + "functionCount": 1566, + "normalized": { + "scorePerFile": 0.18209659545091203, + "scorePerKloc": 4.588451284248615, + "scorePerFunction": 0.09697864661945124, + "findingsPerFile": 0.07074340527577938, + "findingsPerKloc": 1.782585050456221, + "findingsPerFunction": 0.037675606641123884 + } + }, + "blended": { + "vsCurrentCohort": 1, + "vsPinnedBaseline": 1.0388216682437506 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 23, + "structure.directory-fanout-hotspot": 11, + "defensive.error-obscuring": 9, + "structure.pass-through-wrappers": 6, + "structure.barrel-density": 5, + "defensive.empty-catch": 3, + "defensive.error-swallowing": 1, + "structure.over-fragmentation": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "umami", + "repo": "umami-software/umami", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "3a31ad35b04b86651a39481bba62b83eda2a2204", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 833, + "directoryCount": 195, + "findingCount": 59, + "repoScore": 151.86856060606064, + "physicalLineCount": 51206, + "logicalLineCount": 33079, + "functionCount": 1565, + "normalized": { + "scorePerFile": 0.18231519880679548, + "scorePerKloc": 4.591086810546288, + "scorePerFunction": 0.09704061380578954, + "findingsPerFile": 0.07082833133253301, + "findingsPerKloc": 1.783608936183077, + "findingsPerFunction": 0.03769968051118211 + } + }, + "blended": { + "vsCurrentCohort": 1, + "vsPinnedBaseline": 1.0396574771143894 + }, + "ruleCounts": { + "structure.duplicate-function-signatures": 23, + "structure.directory-fanout-hotspot": 11, + "defensive.error-obscuring": 9, + "structure.pass-through-wrappers": 6, + "structure.barrel-density": 5, + "defensive.empty-catch": 3, + "defensive.error-swallowing": 1, + "structure.over-fragmentation": 1 + } + }, + "highest": { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "defaultBranch": "master", + "ref": "60376624db2159acefd91e13bb9498770464c37c", + "blendedVsPinnedBaseline": 1.0441733639448667 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 1, + "blendedVsPinnedBaseline": 1.0441733639448667, + "repoScore": 151.86856060606064, + "findingCount": 59 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 1, + "blendedVsPinnedBaseline": 1.0390728795873785, + "repoScore": 151.86856060606064, + "findingCount": 59 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 1, + "blendedVsPinnedBaseline": 1.0388216682437506, + "repoScore": 151.86856060606064, + "findingCount": 59 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 1, + "blendedVsPinnedBaseline": 1.0396574771143894, + "repoScore": 151.86856060606064, + "findingCount": 59 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0, + "blendedVsPinnedBaseline": -0.0045158868304773225, + "repoScore": 0, + "findingCount": 0, + "fileCount": 1, + "logicalLineCount": 199, + "functionCount": 9, + "scorePerFile": -0.00021912884471972371, + "scorePerKloc": -0.027786687204947924, + "scorePerFunction": -0.0005612888973342556, + "findingsPerFile": -0.00008513020592852694, + "findingsPerKloc": -0.01079495676096176, + "findingsPerFunction": -0.00021805727802097497 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": 0, + "blendedVsPinnedBaseline": 0.0008358088706388322, + "repoScore": 0, + "findingCount": 0, + "fileCount": -1, + "logicalLineCount": -19, + "functionCount": -1, + "scorePerFile": 0.00021860335588344548, + "scorePerKloc": 0.002635526297672719, + "scorePerFunction": 0.000061967186338302, + "findingsPerFile": 0.00008492605675362863, + "findingsPerKloc": 0.0010238857268558554, + "findingsPerFunction": 0.00002407387005822631 + } + }, + { + "id": "tsup", + "repo": "egoist/tsup", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "tsup", + "repo": "egoist/tsup", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "b906f86102c02f1ef66ebd4a3f7ff50bdc07af65", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 48, + "directoryCount": 8, + "findingCount": 4, + "repoScore": 10.142857142857142, + "physicalLineCount": 6686, + "logicalLineCount": 2813, + "functionCount": 140, + "normalized": { + "scorePerFile": 0.2113095238095238, + "scorePerKloc": 3.605708191559595, + "scorePerFunction": 0.07244897959183673, + "findingsPerFile": 0.08333333333333333, + "findingsPerKloc": 1.4219694276573054, + "findingsPerFunction": 0.02857142857142857 + } + }, + "blended": { + "vsCurrentCohort": 0.8819800871953896, + "vsPinnedBaseline": 0.9209401145791967 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 2, + "defensive.error-obscuring": 1, + "structure.directory-fanout-hotspot": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "tsup", + "repo": "egoist/tsup", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "b906f86102c02f1ef66ebd4a3f7ff50bdc07af65", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 48, + "directoryCount": 8, + "findingCount": 4, + "repoScore": 10.142857142857142, + "physicalLineCount": 6686, + "logicalLineCount": 2813, + "functionCount": 140, + "normalized": { + "scorePerFile": 0.2113095238095238, + "scorePerKloc": 3.605708191559595, + "scorePerFunction": 0.07244897959183673, + "findingsPerFile": 0.08333333333333333, + "findingsPerKloc": 1.4219694276573054, + "findingsPerFunction": 0.02857142857142857 + } + }, + "blended": { + "vsCurrentCohort": 0.8865237824083452, + "vsPinnedBaseline": 0.9209401145791967 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 2, + "defensive.error-obscuring": 1, + "structure.directory-fanout-hotspot": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "tsup", + "repo": "egoist/tsup", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "b906f86102c02f1ef66ebd4a3f7ff50bdc07af65", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 48, + "directoryCount": 8, + "findingCount": 4, + "repoScore": 10.142857142857142, + "physicalLineCount": 6686, + "logicalLineCount": 2813, + "functionCount": 140, + "normalized": { + "scorePerFile": 0.2113095238095238, + "scorePerKloc": 3.605708191559595, + "scorePerFunction": 0.07244897959183673, + "findingsPerFile": 0.08333333333333333, + "findingsPerKloc": 1.4219694276573054, + "findingsPerFunction": 0.02857142857142857 + } + }, + "blended": { + "vsCurrentCohort": 0.8858110818721784, + "vsPinnedBaseline": 0.9209401145791967 + }, + "ruleCounts": { + "structure.pass-through-wrappers": 2, + "defensive.error-obscuring": 1, + "structure.directory-fanout-hotspot": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "main", + "ref": "b906f86102c02f1ef66ebd4a3f7ff50bdc07af65", + "blendedVsPinnedBaseline": 0.9209401145791967 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 0.8819800871953896, + "blendedVsPinnedBaseline": 0.9209401145791967, + "repoScore": 10.142857142857142, + "findingCount": 4 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 0.8863094520808851, + "blendedVsPinnedBaseline": 0.9209401145791967, + "repoScore": 10.142857142857142, + "findingCount": 4 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 0.8865237824083452, + "blendedVsPinnedBaseline": 0.9209401145791967, + "repoScore": 10.142857142857142, + "findingCount": 4 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 0.8858110818721784, + "blendedVsPinnedBaseline": 0.9209401145791967, + "repoScore": 10.142857142857142, + "findingCount": 4 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.0038309946767888237, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.0007127005361667882, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "execa", + "repo": "sindresorhus/execa", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "execa", + "repo": "sindresorhus/execa", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "f3a2e8481a1e9138de3895827895c834078b9456", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 581, + "directoryCount": 46, + "findingCount": 28, + "repoScore": 99.01486212489861, + "physicalLineCount": 36103, + "logicalLineCount": 20432, + "functionCount": 1008, + "normalized": { + "scorePerFile": 0.17042144944044513, + "scorePerKloc": 4.846068036653222, + "scorePerFunction": 0.09822902988581211, + "findingsPerFile": 0.04819277108433735, + "findingsPerKloc": 1.370399373531715, + "findingsPerFunction": 0.027777777777777776 + } + }, + "blended": { + "vsCurrentCohort": 0.8491315796009036, + "vsPinnedBaseline": 0.8866405779036939 + }, + "ruleCounts": { + "defensive.empty-catch": 11, + "structure.directory-fanout-hotspot": 7, + "structure.duplicate-function-signatures": 6, + "structure.over-fragmentation": 2, + "defensive.error-obscuring": 1, + "structure.barrel-density": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "execa", + "repo": "sindresorhus/execa", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "f3a2e8481a1e9138de3895827895c834078b9456", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 581, + "directoryCount": 46, + "findingCount": 28, + "repoScore": 99.01486212489861, + "physicalLineCount": 36103, + "logicalLineCount": 20432, + "functionCount": 1008, + "normalized": { + "scorePerFile": 0.17042144944044513, + "scorePerKloc": 4.846068036653222, + "scorePerFunction": 0.09822902988581211, + "findingsPerFile": 0.04819277108433735, + "findingsPerKloc": 1.370399373531715, + "findingsPerFunction": 0.027777777777777776 + } + }, + "blended": { + "vsCurrentCohort": 0.853506049216959, + "vsPinnedBaseline": 0.8866405779036939 + }, + "ruleCounts": { + "defensive.empty-catch": 11, + "structure.directory-fanout-hotspot": 7, + "structure.duplicate-function-signatures": 6, + "structure.over-fragmentation": 2, + "defensive.error-obscuring": 1, + "structure.barrel-density": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "execa", + "repo": "sindresorhus/execa", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "main", + "ref": "f3a2e8481a1e9138de3895827895c834078b9456", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 581, + "directoryCount": 46, + "findingCount": 28, + "repoScore": 99.01486212489861, + "physicalLineCount": 36103, + "logicalLineCount": 20432, + "functionCount": 1008, + "normalized": { + "scorePerFile": 0.17042144944044513, + "scorePerKloc": 4.846068036653222, + "scorePerFunction": 0.09822902988581211, + "findingsPerFile": 0.04819277108433735, + "findingsPerKloc": 1.370399373531715, + "findingsPerFunction": 0.027777777777777776 + } + }, + "blended": { + "vsCurrentCohort": 0.8528198925328754, + "vsPinnedBaseline": 0.8866405779036939 + }, + "ruleCounts": { + "defensive.empty-catch": 11, + "structure.directory-fanout-hotspot": 7, + "structure.duplicate-function-signatures": 6, + "structure.over-fragmentation": 2, + "defensive.error-obscuring": 1, + "structure.barrel-density": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "main", + "ref": "f3a2e8481a1e9138de3895827895c834078b9456", + "blendedVsPinnedBaseline": 0.8866405779036939 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 0.8491315796009036, + "blendedVsPinnedBaseline": 0.8866405779036939, + "repoScore": 99.01486212489861, + "findingCount": 28 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 0.8532997014182334, + "blendedVsPinnedBaseline": 0.8866405779036939, + "repoScore": 99.01486212489861, + "findingCount": 28 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 0.853506049216959, + "blendedVsPinnedBaseline": 0.8866405779036939, + "repoScore": 99.01486212489861, + "findingCount": 28 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 0.8528198925328754, + "blendedVsPinnedBaseline": 0.8866405779036939, + "repoScore": 99.01486212489861, + "findingCount": 28 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.0036883129319718044, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.0006861566840836719, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "node-notifier", + "repo": "mikaelbr/node-notifier", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "node-notifier", + "repo": "mikaelbr/node-notifier", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "b36c237f0d913f9df3a2bd45adc08b33ff717f6a", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 24, + "directoryCount": 5, + "findingCount": 1, + "repoScore": 1.9000000000000001, + "physicalLineCount": 2716, + "logicalLineCount": 2114, + "functionCount": 42, + "normalized": { + "scorePerFile": 0.07916666666666668, + "scorePerKloc": 0.8987701040681174, + "scorePerFunction": 0.045238095238095244, + "findingsPerFile": 0.041666666666666664, + "findingsPerKloc": 0.4730368968779565, + "findingsPerFunction": 0.023809523809523808 + } + }, + "blended": { + "vsCurrentCohort": 0.3951087011093225, + "vsPinnedBaseline": 0.41256198156120816 + }, + "ruleCounts": { + "defensive.empty-catch": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "node-notifier", + "repo": "mikaelbr/node-notifier", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "b36c237f0d913f9df3a2bd45adc08b33ff717f6a", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 24, + "directoryCount": 5, + "findingCount": 1, + "repoScore": 1.9000000000000001, + "physicalLineCount": 2716, + "logicalLineCount": 2114, + "functionCount": 42, + "normalized": { + "scorePerFile": 0.07916666666666668, + "scorePerKloc": 0.8987701040681174, + "scorePerFunction": 0.045238095238095244, + "findingsPerFile": 0.041666666666666664, + "findingsPerKloc": 0.4730368968779565, + "findingsPerFunction": 0.023809523809523808 + } + }, + "blended": { + "vsCurrentCohort": 0.3971441818870534, + "vsPinnedBaseline": 0.41256198156120816 + }, + "ruleCounts": { + "defensive.empty-catch": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "node-notifier", + "repo": "mikaelbr/node-notifier", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "master", + "ref": "b36c237f0d913f9df3a2bd45adc08b33ff717f6a", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 24, + "directoryCount": 5, + "findingCount": 1, + "repoScore": 1.9000000000000001, + "physicalLineCount": 2716, + "logicalLineCount": 2114, + "functionCount": 42, + "normalized": { + "scorePerFile": 0.07916666666666668, + "scorePerKloc": 0.8987701040681174, + "scorePerFunction": 0.045238095238095244, + "findingsPerFile": 0.041666666666666664, + "findingsPerKloc": 0.4730368968779565, + "findingsPerFunction": 0.023809523809523808 + } + }, + "blended": { + "vsCurrentCohort": 0.39682490689750083, + "vsPinnedBaseline": 0.41256198156120816 + }, + "ruleCounts": { + "defensive.empty-catch": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "master", + "ref": "b36c237f0d913f9df3a2bd45adc08b33ff717f6a", + "blendedVsPinnedBaseline": 0.41256198156120816 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 0.3951087011093225, + "blendedVsPinnedBaseline": 0.41256198156120816, + "repoScore": 1.9000000000000001, + "findingCount": 1 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 0.397048166366385, + "blendedVsPinnedBaseline": 0.41256198156120816, + "repoScore": 1.9000000000000001, + "findingCount": 1 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 0.3971441818870534, + "blendedVsPinnedBaseline": 0.41256198156120816, + "repoScore": 1.9000000000000001, + "findingCount": 1 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 0.39682490689750083, + "blendedVsPinnedBaseline": 0.41256198156120816, + "repoScore": 1.9000000000000001, + "findingCount": 1 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.0017162057881783266, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.00031927498955258704, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + }, + { + "id": "hyper", + "repo": "vercel/hyper", + "cohort": "mature-oss", + "pointCount": 4, + "firstRecordedAt": "2026-03-23T12:00:00Z", + "latestRecordedAt": "2026-04-13T12:00:00Z", + "first": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-03-23T12:00:00Z", + "periodStart": "2026-03-23", + "repoId": "hyper", + "repo": "vercel/hyper", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "canary", + "ref": "2a7bb18259d975f27b30b502af1be7576f6f5656", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 113, + "directoryCount": 21, + "findingCount": 18, + "repoScore": 73.10000000000001, + "physicalLineCount": 162735, + "logicalLineCount": 65075, + "functionCount": 5354, + "normalized": { + "scorePerFile": 0.6469026548672567, + "scorePerKloc": 1.1233192470226663, + "scorePerFunction": 0.013653343294732912, + "findingsPerFile": 0.1592920353982301, + "findingsPerKloc": 0.27660391855551286, + "findingsPerFunction": 0.0033619723571161747 + } + }, + "blended": { + "vsCurrentCohort": 0.3933081179249411, + "vsPinnedBaseline": 0.4106818605605101 + }, + "ruleCounts": { + "defensive.error-swallowing": 8, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 3, + "defensive.async-noise": 1, + "defensive.error-obscuring": 1 + } + }, + "previous": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-06T12:00:00Z", + "periodStart": "2026-04-06", + "repoId": "hyper", + "repo": "vercel/hyper", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "canary", + "ref": "2a7bb18259d975f27b30b502af1be7576f6f5656", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 113, + "directoryCount": 21, + "findingCount": 18, + "repoScore": 73.10000000000001, + "physicalLineCount": 162735, + "logicalLineCount": 65075, + "functionCount": 5354, + "normalized": { + "scorePerFile": 0.6469026548672567, + "scorePerKloc": 1.1233192470226663, + "scorePerFunction": 0.013653343294732912, + "findingsPerFile": 0.1592920353982301, + "findingsPerKloc": 0.27660391855551286, + "findingsPerFunction": 0.0033619723571161747 + } + }, + "blended": { + "vsCurrentCohort": 0.39533432264155205, + "vsPinnedBaseline": 0.4106818605605101 + }, + "ruleCounts": { + "defensive.error-swallowing": 8, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 3, + "defensive.async-noise": 1, + "defensive.error-obscuring": 1 + } + }, + "latest": { + "schemaVersion": 1, + "benchmarkSetId": "known-ai-vs-solid-oss", + "benchmarkSetName": "Known AI repos vs older solid OSS repos", + "recordedAt": "2026-04-13T12:00:00Z", + "periodStart": "2026-04-13", + "repoId": "hyper", + "repo": "vercel/hyper", + "cohort": "mature-oss", + "scanMode": "default-branch-as-of-recorded-at", + "defaultBranch": "canary", + "ref": "2a7bb18259d975f27b30b502af1be7576f6f5656", + "analyzerVersion": "0.3.0", + "analyzerCommit": "c64455e21d379cfda17f99b37ad7d1160763bef7", + "summary": { + "fileCount": 113, + "directoryCount": 21, + "findingCount": 18, + "repoScore": 73.10000000000001, + "physicalLineCount": 162735, + "logicalLineCount": 65075, + "functionCount": 5354, + "normalized": { + "scorePerFile": 0.6469026548672567, + "scorePerKloc": 1.1233192470226663, + "scorePerFunction": 0.013653343294732912, + "findingsPerFile": 0.1592920353982301, + "findingsPerKloc": 0.27660391855551286, + "findingsPerFunction": 0.0033619723571161747 + } + }, + "blended": { + "vsCurrentCohort": 0.39501650264698135, + "vsPinnedBaseline": 0.4106818605605101 + }, + "ruleCounts": { + "defensive.error-swallowing": 8, + "structure.pass-through-wrappers": 5, + "defensive.empty-catch": 3, + "defensive.async-noise": 1, + "defensive.error-obscuring": 1 + } + }, + "highest": { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "defaultBranch": "canary", + "ref": "2a7bb18259d975f27b30b502af1be7576f6f5656", + "blendedVsPinnedBaseline": 0.4106818605605101 + }, + "series": [ + { + "periodStart": "2026-03-23", + "recordedAt": "2026-03-23T12:00:00Z", + "blendedVsCurrentCohort": 0.3933081179249411, + "blendedVsPinnedBaseline": 0.4106818605605101, + "repoScore": 73.10000000000001, + "findingCount": 18 + }, + { + "periodStart": "2026-03-30", + "recordedAt": "2026-03-30T12:00:00Z", + "blendedVsCurrentCohort": 0.3952387446813107, + "blendedVsPinnedBaseline": 0.4106818605605101, + "repoScore": 73.10000000000001, + "findingCount": 18 + }, + { + "periodStart": "2026-04-06", + "recordedAt": "2026-04-06T12:00:00Z", + "blendedVsCurrentCohort": 0.39533432264155205, + "blendedVsPinnedBaseline": 0.4106818605605101, + "repoScore": 73.10000000000001, + "findingCount": 18 + }, + { + "periodStart": "2026-04-13", + "recordedAt": "2026-04-13T12:00:00Z", + "blendedVsCurrentCohort": 0.39501650264698135, + "blendedVsPinnedBaseline": 0.4106818605605101, + "repoScore": 73.10000000000001, + "findingCount": 18 + } + ], + "deltaFromFirst": { + "blendedVsCurrentCohort": 0.0017083847220402681, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + }, + "deltaFromPrevious": { + "blendedVsCurrentCohort": -0.00031781999457070054, + "blendedVsPinnedBaseline": 0, + "repoScore": 0, + "findingCount": 0, + "fileCount": 0, + "logicalLineCount": 0, + "functionCount": 0, + "scorePerFile": 0, + "scorePerKloc": 0, + "scorePerFunction": 0, + "findingsPerFile": 0, + "findingsPerKloc": 0, + "findingsPerFunction": 0 + } + } + ] +} diff --git a/benchmarks/history/known-ai-vs-solid-oss/node-notifier.jsonl b/benchmarks/history/known-ai-vs-solid-oss/node-notifier.jsonl new file mode 100644 index 0000000..0c3dfb3 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/node-notifier.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"node-notifier","repo":"mikaelbr/node-notifier","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"b36c237f0d913f9df3a2bd45adc08b33ff717f6a","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":24,"directoryCount":5,"findingCount":1,"repoScore":1.9000000000000001,"physicalLineCount":2716,"logicalLineCount":2114,"functionCount":42,"normalized":{"scorePerFile":0.07916666666666668,"scorePerKloc":0.8987701040681174,"scorePerFunction":0.045238095238095244,"findingsPerFile":0.041666666666666664,"findingsPerKloc":0.4730368968779565,"findingsPerFunction":0.023809523809523808}},"blended":{"vsCurrentCohort":0.3951087011093225,"vsPinnedBaseline":0.41256198156120816},"ruleCounts":{"defensive.empty-catch":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"node-notifier","repo":"mikaelbr/node-notifier","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"b36c237f0d913f9df3a2bd45adc08b33ff717f6a","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":24,"directoryCount":5,"findingCount":1,"repoScore":1.9000000000000001,"physicalLineCount":2716,"logicalLineCount":2114,"functionCount":42,"normalized":{"scorePerFile":0.07916666666666668,"scorePerKloc":0.8987701040681174,"scorePerFunction":0.045238095238095244,"findingsPerFile":0.041666666666666664,"findingsPerKloc":0.4730368968779565,"findingsPerFunction":0.023809523809523808}},"blended":{"vsCurrentCohort":0.397048166366385,"vsPinnedBaseline":0.41256198156120816},"ruleCounts":{"defensive.empty-catch":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"node-notifier","repo":"mikaelbr/node-notifier","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"b36c237f0d913f9df3a2bd45adc08b33ff717f6a","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":24,"directoryCount":5,"findingCount":1,"repoScore":1.9000000000000001,"physicalLineCount":2716,"logicalLineCount":2114,"functionCount":42,"normalized":{"scorePerFile":0.07916666666666668,"scorePerKloc":0.8987701040681174,"scorePerFunction":0.045238095238095244,"findingsPerFile":0.041666666666666664,"findingsPerKloc":0.4730368968779565,"findingsPerFunction":0.023809523809523808}},"blended":{"vsCurrentCohort":0.3971441818870534,"vsPinnedBaseline":0.41256198156120816},"ruleCounts":{"defensive.empty-catch":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"node-notifier","repo":"mikaelbr/node-notifier","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"b36c237f0d913f9df3a2bd45adc08b33ff717f6a","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":24,"directoryCount":5,"findingCount":1,"repoScore":1.9000000000000001,"physicalLineCount":2716,"logicalLineCount":2114,"functionCount":42,"normalized":{"scorePerFile":0.07916666666666668,"scorePerKloc":0.8987701040681174,"scorePerFunction":0.045238095238095244,"findingsPerFile":0.041666666666666664,"findingsPerKloc":0.4730368968779565,"findingsPerFunction":0.023809523809523808}},"blended":{"vsCurrentCohort":0.39682490689750083,"vsPinnedBaseline":0.41256198156120816},"ruleCounts":{"defensive.empty-catch":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/openclaw.jsonl b/benchmarks/history/known-ai-vs-solid-oss/openclaw.jsonl new file mode 100644 index 0000000..44f3c07 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/openclaw.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"openclaw","repo":"openclaw/openclaw","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"47db5abece27d3c9c7edbbd68401f29cb71058ef","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":7690,"directoryCount":328,"findingCount":2341,"repoScore":7722.601888962838,"physicalLineCount":1442335,"logicalLineCount":759755,"functionCount":29852,"normalized":{"scorePerFile":1.004239517420395,"scorePerKloc":10.164595019398146,"scorePerFunction":0.25869629803573757,"findingsPerFile":0.30442132639791936,"findingsPerKloc":3.0812564576738555,"findingsPerFunction":0.07842020635133325}},"blended":{"vsCurrentCohort":2.8070687463622503,"vsPinnedBaseline":2.9310664157135706},"ruleCounts":{"tests.duplicate-mock-setup":639,"structure.pass-through-wrappers":435,"defensive.error-obscuring":292,"defensive.empty-catch":271,"defensive.async-noise":236,"structure.barrel-density":213,"structure.duplicate-function-signatures":187,"structure.directory-fanout-hotspot":46,"defensive.error-swallowing":16,"structure.over-fragmentation":6}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"openclaw","repo":"openclaw/openclaw","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"bc3b05dce4b2ecd3534d6f233c9a00ad37afb9ae","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":8678,"directoryCount":379,"findingCount":2645,"repoScore":8799.451719426226,"physicalLineCount":1620383,"logicalLineCount":848724,"functionCount":34425,"normalized":{"scorePerFile":1.013995358311388,"scorePerKloc":10.36786012817621,"scorePerFunction":0.25561225038275165,"findingsPerFile":0.3047937312744872,"findingsPerKloc":3.1164430368411873,"findingsPerFunction":0.07683369644153958}},"blended":{"vsCurrentCohort":2.825371225507389,"vsPinnedBaseline":2.9357666151912833},"ruleCounts":{"tests.duplicate-mock-setup":727,"structure.pass-through-wrappers":495,"defensive.error-obscuring":322,"defensive.empty-catch":293,"structure.barrel-density":265,"defensive.async-noise":256,"structure.duplicate-function-signatures":198,"structure.directory-fanout-hotspot":53,"structure.over-fragmentation":20,"defensive.error-swallowing":16}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"openclaw","repo":"openclaw/openclaw","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"88aa81422653bc123de17550d62e2c4e5ced74fe","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":10219,"directoryCount":418,"findingCount":3356,"repoScore":11102.586696659166,"physicalLineCount":1915036,"logicalLineCount":1011052,"functionCount":40252,"normalized":{"scorePerFile":1.0864650843193233,"scorePerKloc":10.981222228588802,"scorePerFunction":0.2758269575837018,"findingsPerFile":0.32840786769742636,"findingsPerKloc":3.319314931378406,"findingsPerFunction":0.0833747391433966}},"blended":{"vsCurrentCohort":3.031981309889982,"vsPinnedBaseline":3.149687882423783},"ruleCounts":{"tests.duplicate-mock-setup":910,"structure.pass-through-wrappers":615,"structure.barrel-density":402,"defensive.error-obscuring":378,"structure.duplicate-function-signatures":318,"defensive.empty-catch":316,"defensive.async-noise":312,"structure.directory-fanout-hotspot":65,"structure.over-fragmentation":24,"defensive.error-swallowing":16}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"openclaw","repo":"openclaw/openclaw","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"1de5610b24dd7642b6412acd4a3035802038f909","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":11367,"directoryCount":437,"findingCount":3488,"repoScore":11255.99708285282,"physicalLineCount":2128022,"logicalLineCount":1119734,"functionCount":44237,"normalized":{"scorePerFile":0.9902346338394317,"scorePerKloc":10.052384836803045,"scorePerFunction":0.25444756838964716,"findingsPerFile":0.30685317146124746,"findingsPerKloc":3.1150255328497662,"findingsPerFunction":0.0788480231480435}},"blended":{"vsCurrentCohort":2.8110941249865755,"vsPinnedBaseline":2.9225750259146253},"ruleCounts":{"tests.duplicate-mock-setup":976,"structure.pass-through-wrappers":677,"structure.barrel-density":414,"defensive.error-obscuring":408,"defensive.async-noise":335,"defensive.empty-catch":333,"structure.duplicate-function-signatures":230,"structure.directory-fanout-hotspot":76,"structure.over-fragmentation":24,"defensive.error-swallowing":15}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/openusage.jsonl b/benchmarks/history/known-ai-vs-solid-oss/openusage.jsonl new file mode 100644 index 0000000..ff892e4 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/openusage.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"openusage","repo":"robinebers/openusage","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"fa06dbff4fce4f29b788f1c45224e43982d6098e","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":137,"directoryCount":29,"findingCount":46,"repoScore":176.2,"physicalLineCount":33319,"logicalLineCount":21875,"functionCount":485,"normalized":{"scorePerFile":1.2861313868613138,"scorePerKloc":8.054857142857143,"scorePerFunction":0.3632989690721649,"findingsPerFile":0.3357664233576642,"findingsPerKloc":2.1028571428571428,"findingsPerFunction":0.09484536082474226}},"blended":{"vsCurrentCohort":2.931613483257123,"vsPinnedBaseline":3.0611127125987165},"ruleCounts":{"tests.duplicate-mock-setup":25,"structure.duplicate-function-signatures":5,"structure.pass-through-wrappers":5,"defensive.empty-catch":4,"defensive.error-swallowing":3,"defensive.error-obscuring":2,"structure.directory-fanout-hotspot":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"openusage","repo":"robinebers/openusage","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"4e152f7719f29a0e1936eb058df770138b306338","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":139,"directoryCount":29,"findingCount":46,"repoScore":176.3111111111111,"physicalLineCount":33440,"logicalLineCount":22244,"functionCount":487,"normalized":{"scorePerFile":1.2684252597921661,"scorePerKloc":7.926232292353493,"scorePerFunction":0.36203513575176816,"findingsPerFile":0.33093525179856115,"findingsPerKloc":2.06797338608164,"findingsPerFunction":0.0944558521560575}},"blended":{"vsCurrentCohort":2.9124251564230508,"vsPinnedBaseline":3.0262219938672197},"ruleCounts":{"tests.duplicate-mock-setup":25,"structure.duplicate-function-signatures":5,"structure.pass-through-wrappers":5,"defensive.empty-catch":4,"defensive.error-swallowing":3,"defensive.error-obscuring":2,"structure.directory-fanout-hotspot":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"openusage","repo":"robinebers/openusage","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"2c278068cdbfbd03937e232428271bc68208d778","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":139,"directoryCount":29,"findingCount":46,"repoScore":176.3111111111111,"physicalLineCount":33794,"logicalLineCount":22270,"functionCount":491,"normalized":{"scorePerFile":1.2684252597921661,"scorePerKloc":7.9169784962330985,"scorePerFunction":0.3590857660104096,"findingsPerFile":0.33093525179856115,"findingsPerKloc":2.0655590480466994,"findingsPerFunction":0.09368635437881874}},"blended":{"vsCurrentCohort":2.9040660942565824,"vsPinnedBaseline":3.016806784725735},"ruleCounts":{"tests.duplicate-mock-setup":25,"structure.duplicate-function-signatures":5,"structure.pass-through-wrappers":5,"defensive.empty-catch":4,"defensive.error-swallowing":3,"defensive.error-obscuring":2,"structure.directory-fanout-hotspot":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"openusage","repo":"robinebers/openusage","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"06113d6b94c6f8306e67aedf51b42f3f03d8b3e5","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":143,"directoryCount":31,"findingCount":50,"repoScore":195.3111111111111,"physicalLineCount":36980,"logicalLineCount":24758,"functionCount":562,"normalized":{"scorePerFile":1.3658119658119658,"scorePerKloc":7.8888081069194245,"scorePerFunction":0.34752866745749306,"findingsPerFile":0.34965034965034963,"findingsPerKloc":2.0195492366103887,"findingsPerFunction":0.08896797153024912}},"blended":{"vsCurrentCohort":2.9106934453164324,"vsPinnedBaseline":3.0261242040110723},"ruleCounts":{"tests.duplicate-mock-setup":28,"structure.duplicate-function-signatures":5,"structure.pass-through-wrappers":5,"defensive.empty-catch":4,"defensive.error-obscuring":3,"defensive.error-swallowing":3,"structure.directory-fanout-hotspot":2}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/payload.jsonl b/benchmarks/history/known-ai-vs-solid-oss/payload.jsonl new file mode 100644 index 0000000..30f383f --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/payload.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"payload","repo":"payloadcms/payload","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"167a01eb0ca69894bfc44e2f8b605148ab646922","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":6097,"directoryCount":2520,"findingCount":495,"repoScore":1462.67181013431,"physicalLineCount":738583,"logicalLineCount":461694,"functionCount":5432,"normalized":{"scorePerFile":0.23990024768481383,"scorePerKloc":3.1680546208837668,"scorePerFunction":0.2692694790379805,"findingsPerFile":0.08118746924717074,"findingsPerKloc":1.0721386892617188,"findingsPerFunction":0.09112665684830633}},"blended":{"vsCurrentCohort":1.264525566857393,"vsPinnedBaseline":1.3203839149397734},"ruleCounts":{"structure.duplicate-function-signatures":177,"structure.directory-fanout-hotspot":95,"structure.barrel-density":62,"defensive.empty-catch":39,"defensive.error-obscuring":37,"defensive.error-swallowing":35,"structure.pass-through-wrappers":20,"structure.over-fragmentation":12,"tests.duplicate-mock-setup":10,"defensive.async-noise":7,"comments.placeholder-comments":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"payload","repo":"payloadcms/payload","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"727d74eff1476bcd8236f716282275e42f8786ad","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":6202,"directoryCount":2572,"findingCount":504,"repoScore":1485.9218101343095,"physicalLineCount":745564,"logicalLineCount":465034,"functionCount":5521,"normalized":{"scorePerFile":0.23958752178882772,"scorePerKloc":3.1952971398528054,"scorePerFunction":0.269139976477868,"findingsPerFile":0.08126410835214447,"findingsPerKloc":1.0837917227557554,"findingsPerFunction":0.09128781017931534}},"blended":{"vsCurrentCohort":1.2750388200492768,"vsPinnedBaseline":1.3248582583342952},"ruleCounts":{"structure.duplicate-function-signatures":177,"structure.directory-fanout-hotspot":97,"structure.barrel-density":66,"defensive.empty-catch":40,"defensive.error-obscuring":39,"defensive.error-swallowing":35,"structure.pass-through-wrappers":20,"structure.over-fragmentation":12,"tests.duplicate-mock-setup":10,"defensive.async-noise":7,"comments.placeholder-comments":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"payload","repo":"payloadcms/payload","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"2011f28233b38494cdbc1ec3e2eab81386725e20","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":6225,"directoryCount":2577,"findingCount":506,"repoScore":1495.1690323565317,"physicalLineCount":749749,"logicalLineCount":466942,"functionCount":5540,"normalized":{"scorePerFile":0.24018779636249504,"scorePerKloc":3.2020444345476133,"scorePerFunction":0.2698861069235617,"findingsPerFile":0.08128514056224899,"findingsPerKloc":1.0836463629315847,"findingsPerFunction":0.09133574007220216}},"blended":{"vsCurrentCohort":1.2770550762355934,"vsPinnedBaseline":1.3266324847342088},"ruleCounts":{"structure.duplicate-function-signatures":177,"structure.directory-fanout-hotspot":97,"structure.barrel-density":66,"defensive.empty-catch":41,"defensive.error-obscuring":39,"defensive.error-swallowing":35,"structure.pass-through-wrappers":20,"structure.over-fragmentation":13,"tests.duplicate-mock-setup":10,"defensive.async-noise":7,"comments.placeholder-comments":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"payload","repo":"payloadcms/payload","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"5afcef5d85d596b0536d02e10bb3e7d254d48bc8","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":6250,"directoryCount":2578,"findingCount":513,"repoScore":1525.0410561660556,"physicalLineCount":754256,"logicalLineCount":469447,"functionCount":5558,"normalized":{"scorePerFile":0.2440065689865689,"scorePerKloc":3.2485904823463683,"scorePerFunction":0.274386659979499,"findingsPerFile":0.08208,"findingsPerKloc":1.092775116253805,"findingsPerFunction":0.09229938826916156}},"blended":{"vsCurrentCohort":1.2921562583044328,"vsPinnedBaseline":1.3433999155463558},"ruleCounts":{"structure.duplicate-function-signatures":177,"structure.directory-fanout-hotspot":102,"structure.barrel-density":66,"defensive.empty-catch":42,"defensive.error-obscuring":40,"defensive.error-swallowing":35,"structure.pass-through-wrappers":20,"structure.over-fragmentation":13,"tests.duplicate-mock-setup":10,"defensive.async-noise":7,"comments.placeholder-comments":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/tsup.jsonl b/benchmarks/history/known-ai-vs-solid-oss/tsup.jsonl new file mode 100644 index 0000000..5d6786f --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/tsup.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"tsup","repo":"egoist/tsup","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"b906f86102c02f1ef66ebd4a3f7ff50bdc07af65","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":48,"directoryCount":8,"findingCount":4,"repoScore":10.142857142857142,"physicalLineCount":6686,"logicalLineCount":2813,"functionCount":140,"normalized":{"scorePerFile":0.2113095238095238,"scorePerKloc":3.605708191559595,"scorePerFunction":0.07244897959183673,"findingsPerFile":0.08333333333333333,"findingsPerKloc":1.4219694276573054,"findingsPerFunction":0.02857142857142857}},"blended":{"vsCurrentCohort":0.8819800871953896,"vsPinnedBaseline":0.9209401145791967},"ruleCounts":{"structure.pass-through-wrappers":2,"defensive.error-obscuring":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"tsup","repo":"egoist/tsup","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"b906f86102c02f1ef66ebd4a3f7ff50bdc07af65","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":48,"directoryCount":8,"findingCount":4,"repoScore":10.142857142857142,"physicalLineCount":6686,"logicalLineCount":2813,"functionCount":140,"normalized":{"scorePerFile":0.2113095238095238,"scorePerKloc":3.605708191559595,"scorePerFunction":0.07244897959183673,"findingsPerFile":0.08333333333333333,"findingsPerKloc":1.4219694276573054,"findingsPerFunction":0.02857142857142857}},"blended":{"vsCurrentCohort":0.8863094520808851,"vsPinnedBaseline":0.9209401145791967},"ruleCounts":{"structure.pass-through-wrappers":2,"defensive.error-obscuring":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"tsup","repo":"egoist/tsup","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"b906f86102c02f1ef66ebd4a3f7ff50bdc07af65","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":48,"directoryCount":8,"findingCount":4,"repoScore":10.142857142857142,"physicalLineCount":6686,"logicalLineCount":2813,"functionCount":140,"normalized":{"scorePerFile":0.2113095238095238,"scorePerKloc":3.605708191559595,"scorePerFunction":0.07244897959183673,"findingsPerFile":0.08333333333333333,"findingsPerKloc":1.4219694276573054,"findingsPerFunction":0.02857142857142857}},"blended":{"vsCurrentCohort":0.8865237824083452,"vsPinnedBaseline":0.9209401145791967},"ruleCounts":{"structure.pass-through-wrappers":2,"defensive.error-obscuring":1,"structure.directory-fanout-hotspot":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"tsup","repo":"egoist/tsup","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"b906f86102c02f1ef66ebd4a3f7ff50bdc07af65","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":48,"directoryCount":8,"findingCount":4,"repoScore":10.142857142857142,"physicalLineCount":6686,"logicalLineCount":2813,"functionCount":140,"normalized":{"scorePerFile":0.2113095238095238,"scorePerKloc":3.605708191559595,"scorePerFunction":0.07244897959183673,"findingsPerFile":0.08333333333333333,"findingsPerKloc":1.4219694276573054,"findingsPerFunction":0.02857142857142857}},"blended":{"vsCurrentCohort":0.8858110818721784,"vsPinnedBaseline":0.9209401145791967},"ruleCounts":{"structure.pass-through-wrappers":2,"defensive.error-obscuring":1,"structure.directory-fanout-hotspot":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/umami.jsonl b/benchmarks/history/known-ai-vs-solid-oss/umami.jsonl new file mode 100644 index 0000000..783c69b --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/umami.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"umami","repo":"umami-software/umami","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"60376624db2159acefd91e13bb9498770464c37c","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":832,"directoryCount":196,"findingCount":59,"repoScore":151.86856060606064,"physicalLineCount":50570,"logicalLineCount":32880,"functionCount":1556,"normalized":{"scorePerFile":0.1825343276515152,"scorePerKloc":4.618873497751236,"scorePerFunction":0.0976019027031238,"findingsPerFile":0.07091346153846154,"findingsPerKloc":1.7944038929440387,"findingsPerFunction":0.037917737789203085}},"blended":{"vsCurrentCohort":1,"vsPinnedBaseline":1.0441733639448667},"ruleCounts":{"structure.duplicate-function-signatures":23,"structure.directory-fanout-hotspot":11,"defensive.error-obscuring":9,"structure.pass-through-wrappers":6,"structure.barrel-density":5,"defensive.empty-catch":3,"defensive.error-swallowing":1,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"umami","repo":"umami-software/umami","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"3f673557a9575ef8926dbd030ff88f1838db850b","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":834,"directoryCount":196,"findingCount":59,"repoScore":151.86856060606064,"physicalLineCount":51201,"logicalLineCount":33074,"functionCount":1566,"normalized":{"scorePerFile":0.18209659545091203,"scorePerKloc":4.59178087337669,"scorePerFunction":0.09697864661945124,"findingsPerFile":0.07074340527577938,"findingsPerKloc":1.7838785753159583,"findingsPerFunction":0.037675606641123884}},"blended":{"vsCurrentCohort":1,"vsPinnedBaseline":1.0390728795873785},"ruleCounts":{"structure.duplicate-function-signatures":23,"structure.directory-fanout-hotspot":11,"defensive.error-obscuring":9,"structure.pass-through-wrappers":6,"structure.barrel-density":5,"defensive.empty-catch":3,"defensive.error-swallowing":1,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"umami","repo":"umami-software/umami","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"4ca7d53f817cf421dda2172eee1d5bc81fe2dbd7","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":834,"directoryCount":196,"findingCount":59,"repoScore":151.86856060606064,"physicalLineCount":51228,"logicalLineCount":33098,"functionCount":1566,"normalized":{"scorePerFile":0.18209659545091203,"scorePerKloc":4.588451284248615,"scorePerFunction":0.09697864661945124,"findingsPerFile":0.07074340527577938,"findingsPerKloc":1.782585050456221,"findingsPerFunction":0.037675606641123884}},"blended":{"vsCurrentCohort":1,"vsPinnedBaseline":1.0388216682437506},"ruleCounts":{"structure.duplicate-function-signatures":23,"structure.directory-fanout-hotspot":11,"defensive.error-obscuring":9,"structure.pass-through-wrappers":6,"structure.barrel-density":5,"defensive.empty-catch":3,"defensive.error-swallowing":1,"structure.over-fragmentation":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"umami","repo":"umami-software/umami","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"master","ref":"3a31ad35b04b86651a39481bba62b83eda2a2204","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":833,"directoryCount":195,"findingCount":59,"repoScore":151.86856060606064,"physicalLineCount":51206,"logicalLineCount":33079,"functionCount":1565,"normalized":{"scorePerFile":0.18231519880679548,"scorePerKloc":4.591086810546288,"scorePerFunction":0.09704061380578954,"findingsPerFile":0.07082833133253301,"findingsPerKloc":1.783608936183077,"findingsPerFunction":0.03769968051118211}},"blended":{"vsCurrentCohort":1,"vsPinnedBaseline":1.0396574771143894},"ruleCounts":{"structure.duplicate-function-signatures":23,"structure.directory-fanout-hotspot":11,"defensive.error-obscuring":9,"structure.pass-through-wrappers":6,"structure.barrel-density":5,"defensive.empty-catch":3,"defensive.error-swallowing":1,"structure.over-fragmentation":1}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/vinext.jsonl b/benchmarks/history/known-ai-vs-solid-oss/vinext.jsonl new file mode 100644 index 0000000..5e4d64d --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/vinext.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"vinext","repo":"cloudflare/vinext","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"fd7618c94a407a4841390963989625567d67e77c","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1049,"directoryCount":460,"findingCount":153,"repoScore":499.82379287379285,"physicalLineCount":137634,"logicalLineCount":55528,"functionCount":2642,"normalized":{"scorePerFile":0.47647644697215713,"scorePerKloc":9.001292913013126,"scorePerFunction":0.18918387315435006,"findingsPerFile":0.14585319351763584,"findingsPerKloc":2.7553666618642847,"findingsPerFunction":0.057910673732021196}},"blended":{"vsCurrentCohort":1.9034539118643468,"vsPinnedBaseline":1.9875358742654106},"ruleCounts":{"structure.duplicate-function-signatures":49,"structure.pass-through-wrappers":27,"defensive.error-obscuring":18,"defensive.empty-catch":16,"tests.duplicate-mock-setup":16,"structure.directory-fanout-hotspot":15,"defensive.async-noise":3,"defensive.error-swallowing":3,"structure.barrel-density":3,"structure.over-fragmentation":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"vinext","repo":"cloudflare/vinext","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"a7dd2d56af100ea7c109834d65ec76a3dbcefe32","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1090,"directoryCount":470,"findingCount":159,"repoScore":518.3082251082251,"physicalLineCount":141379,"logicalLineCount":57114,"functionCount":2743,"normalized":{"scorePerFile":0.475512133126812,"scorePerKloc":9.074976802679293,"scorePerFunction":0.18895669890930553,"findingsPerFile":0.14587155963302753,"findingsPerKloc":2.783905872465595,"findingsPerFunction":0.057965730951512945}},"blended":{"vsCurrentCohort":1.918002714883301,"vsPinnedBaseline":1.9929446040102008},"ruleCounts":{"structure.duplicate-function-signatures":49,"structure.pass-through-wrappers":28,"defensive.error-obscuring":21,"tests.duplicate-mock-setup":17,"defensive.empty-catch":16,"structure.directory-fanout-hotspot":15,"defensive.async-noise":4,"defensive.error-swallowing":3,"structure.barrel-density":3,"structure.over-fragmentation":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"vinext","repo":"cloudflare/vinext","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"ccb299ab79cbd0749614fc48ce7e1ebcf8e183ae","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1129,"directoryCount":486,"findingCount":164,"repoScore":547.452724726254,"physicalLineCount":149555,"logicalLineCount":59877,"functionCount":2901,"normalized":{"scorePerFile":0.4849005533447777,"scorePerKloc":9.142955136801342,"scorePerFunction":0.18871172861987384,"findingsPerFile":0.14526129317980513,"findingsPerKloc":2.738948177096381,"findingsPerFunction":0.05653223026542571}},"blended":{"vsCurrentCohort":1.912146851658272,"vsPinnedBaseline":1.9863795823666808},"ruleCounts":{"structure.duplicate-function-signatures":50,"structure.pass-through-wrappers":29,"defensive.error-obscuring":24,"tests.duplicate-mock-setup":18,"defensive.empty-catch":16,"structure.directory-fanout-hotspot":15,"defensive.async-noise":4,"structure.barrel-density":3,"structure.over-fragmentation":3,"defensive.error-swallowing":2}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"vinext","repo":"cloudflare/vinext","cohort":"explicit-ai","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"e81a6212d5c8c4d3f1cad6186178204cf004db4e","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1174,"directoryCount":504,"findingCount":167,"repoScore":551.8886724386724,"physicalLineCount":155384,"logicalLineCount":62152,"functionCount":3060,"normalized":{"scorePerFile":0.4700925659613905,"scorePerKloc":8.87966070985121,"scorePerFunction":0.1803557753067557,"findingsPerFile":0.14224872231686542,"findingsPerKloc":2.6869609988415495,"findingsPerFunction":0.05457516339869281}},"blended":{"vsCurrentCohort":1.853871918339763,"vsPinnedBaseline":1.9273918015143312},"ruleCounts":{"structure.duplicate-function-signatures":50,"structure.pass-through-wrappers":29,"defensive.error-obscuring":25,"defensive.empty-catch":18,"tests.duplicate-mock-setup":18,"structure.directory-fanout-hotspot":15,"defensive.async-noise":4,"structure.barrel-density":3,"structure.over-fragmentation":3,"defensive.error-swallowing":2}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/vite.jsonl b/benchmarks/history/known-ai-vs-solid-oss/vite.jsonl new file mode 100644 index 0000000..4ffb9a9 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/vite.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"vite","repo":"vitejs/vite","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"ff91c319facd602dc5eea81ed7e7d79ae7dadb95","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1420,"directoryCount":613,"findingCount":115,"repoScore":380.64387822322607,"physicalLineCount":94523,"logicalLineCount":45982,"functionCount":2288,"normalized":{"scorePerFile":0.26805906917128597,"scorePerKloc":8.27810617683498,"scorePerFunction":0.16636533139127013,"findingsPerFile":0.08098591549295775,"findingsPerKloc":2.5009786438171457,"findingsPerFunction":0.05026223776223776}},"blended":{"vsCurrentCohort":1.4544291476328446,"vsPinnedBaseline":1.5186761757032523},"ruleCounts":{"structure.pass-through-wrappers":27,"structure.directory-fanout-hotspot":21,"defensive.empty-catch":14,"structure.barrel-density":11,"defensive.error-obscuring":10,"defensive.async-noise":9,"structure.over-fragmentation":8,"defensive.error-swallowing":6,"tests.duplicate-mock-setup":6,"structure.duplicate-function-signatures":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"vite","repo":"vitejs/vite","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"6daa10ff1e8d15a90f49d8dd909ff208da85d6d8","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1423,"directoryCount":615,"findingCount":115,"repoScore":380.64387822322607,"physicalLineCount":95066,"logicalLineCount":46280,"functionCount":2294,"normalized":{"scorePerFile":0.2674939411266522,"scorePerKloc":8.224802900242569,"scorePerFunction":0.16593019974857282,"findingsPerFile":0.08081517919887561,"findingsPerKloc":2.4848746758859117,"findingsPerFunction":0.05013077593722755}},"blended":{"vsCurrentCohort":1.456127340215348,"vsPinnedBaseline":1.5130224284434717},"ruleCounts":{"structure.pass-through-wrappers":27,"structure.directory-fanout-hotspot":21,"defensive.empty-catch":14,"structure.barrel-density":11,"defensive.error-obscuring":10,"defensive.async-noise":9,"structure.over-fragmentation":8,"defensive.error-swallowing":6,"tests.duplicate-mock-setup":6,"structure.duplicate-function-signatures":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"vite","repo":"vitejs/vite","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"79f002f2286c03c88c7b74c511c7f9fc6dc46694","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1432,"directoryCount":618,"findingCount":114,"repoScore":377.94093704675544,"physicalLineCount":95795,"logicalLineCount":46589,"functionCount":2299,"normalized":{"scorePerFile":0.26392523536784596,"scorePerKloc":8.112235442846067,"scorePerFunction":0.16439362202990668,"findingsPerFile":0.07960893854748603,"findingsPerKloc":2.4469295327223164,"findingsPerFunction":0.049586776859504134}},"blended":{"vsCurrentCohort":1.437702992014066,"vsPinnedBaseline":1.4935170206030834},"ruleCounts":{"structure.pass-through-wrappers":27,"structure.directory-fanout-hotspot":20,"defensive.empty-catch":14,"structure.barrel-density":11,"defensive.error-obscuring":10,"defensive.async-noise":9,"structure.over-fragmentation":8,"defensive.error-swallowing":6,"tests.duplicate-mock-setup":6,"structure.duplicate-function-signatures":3}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"vite","repo":"vitejs/vite","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"bc5c6a7a498845dff20dc410c395355b79a4b753","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":1438,"directoryCount":622,"findingCount":117,"repoScore":381.69093704675544,"physicalLineCount":96023,"logicalLineCount":46665,"functionCount":2307,"normalized":{"scorePerFile":0.2654318060130427,"scorePerKloc":8.179383628988653,"scorePerFunction":0.16544904076582376,"findingsPerFile":0.08136300417246176,"findingsPerKloc":2.507232401157184,"findingsPerFunction":0.05071521456436931}},"blended":{"vsCurrentCohort":1.4580090921548914,"vsPinnedBaseline":1.5158300543595955},"ruleCounts":{"structure.pass-through-wrappers":27,"structure.directory-fanout-hotspot":20,"defensive.empty-catch":14,"structure.barrel-density":11,"defensive.error-obscuring":10,"defensive.async-noise":9,"structure.over-fragmentation":8,"defensive.error-swallowing":6,"structure.duplicate-function-signatures":6,"tests.duplicate-mock-setup":6}} diff --git a/benchmarks/history/known-ai-vs-solid-oss/zustand.jsonl b/benchmarks/history/known-ai-vs-solid-oss/zustand.jsonl new file mode 100644 index 0000000..4a17e11 --- /dev/null +++ b/benchmarks/history/known-ai-vs-solid-oss/zustand.jsonl @@ -0,0 +1,4 @@ +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-23T12:00:00Z","periodStart":"2026-03-23","repoId":"zustand","repo":"pmndrs/zustand","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"206012dbd1ae046ea0aefb9cd7bf8bba913c6459","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":49,"directoryCount":15,"findingCount":9,"repoScore":22.866666666666667,"physicalLineCount":9464,"logicalLineCount":7606,"functionCount":171,"normalized":{"scorePerFile":0.4666666666666667,"scorePerKloc":3.006398457358226,"scorePerFunction":0.13372319688109163,"findingsPerFile":0.1836734693877551,"findingsPerKloc":1.183276360767815,"findingsPerFunction":0.05263157894736842}},"blended":{"vsCurrentCohort":1.3247526993380319,"vsPinnedBaseline":1.3832714824628354},"ruleCounts":{"structure.barrel-density":3,"structure.directory-fanout-hotspot":2,"defensive.empty-catch":1,"defensive.error-obscuring":1,"defensive.error-swallowing":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-03-30T12:00:00Z","periodStart":"2026-03-30","repoId":"zustand","repo":"pmndrs/zustand","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"206012dbd1ae046ea0aefb9cd7bf8bba913c6459","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":49,"directoryCount":15,"findingCount":9,"repoScore":22.866666666666667,"physicalLineCount":9464,"logicalLineCount":7606,"functionCount":171,"normalized":{"scorePerFile":0.4666666666666667,"scorePerKloc":3.006398457358226,"scorePerFunction":0.13372319688109163,"findingsPerFile":0.1836734693877551,"findingsPerKloc":1.183276360767815,"findingsPerFunction":0.05263157894736842}},"blended":{"vsCurrentCohort":1.3312554967387273,"vsPinnedBaseline":1.3832714824628354},"ruleCounts":{"structure.barrel-density":3,"structure.directory-fanout-hotspot":2,"defensive.empty-catch":1,"defensive.error-obscuring":1,"defensive.error-swallowing":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-06T12:00:00Z","periodStart":"2026-04-06","repoId":"zustand","repo":"pmndrs/zustand","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"00f96a389d4015ecf4eadb42aa1e4e0efe14bb95","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":49,"directoryCount":15,"findingCount":9,"repoScore":22.866666666666667,"physicalLineCount":9584,"logicalLineCount":7699,"functionCount":171,"normalized":{"scorePerFile":0.4666666666666667,"scorePerKloc":2.9700826947222585,"scorePerFunction":0.13372319688109163,"findingsPerFile":0.1836734693877551,"findingsPerKloc":1.1689829848032212,"findingsPerFunction":0.05263157894736842}},"blended":{"vsCurrentCohort":1.326194098484615,"vsPinnedBaseline":1.3776791658028045},"ruleCounts":{"structure.barrel-density":3,"structure.directory-fanout-hotspot":2,"defensive.empty-catch":1,"defensive.error-obscuring":1,"defensive.error-swallowing":1,"structure.pass-through-wrappers":1}} +{"schemaVersion":1,"benchmarkSetId":"known-ai-vs-solid-oss","benchmarkSetName":"Known AI repos vs older solid OSS repos","recordedAt":"2026-04-13T12:00:00Z","periodStart":"2026-04-13","repoId":"zustand","repo":"pmndrs/zustand","cohort":"mature-oss","scanMode":"default-branch-as-of-recorded-at","defaultBranch":"main","ref":"00f96a389d4015ecf4eadb42aa1e4e0efe14bb95","analyzerVersion":"0.3.0","analyzerCommit":"c64455e21d379cfda17f99b37ad7d1160763bef7","summary":{"fileCount":49,"directoryCount":15,"findingCount":9,"repoScore":22.866666666666667,"physicalLineCount":9584,"logicalLineCount":7699,"functionCount":171,"normalized":{"scorePerFile":0.4666666666666667,"scorePerKloc":2.9700826947222585,"scorePerFunction":0.13372319688109163,"findingsPerFile":0.1836734693877551,"findingsPerKloc":1.1689829848032212,"findingsPerFunction":0.05263157894736842}},"blended":{"vsCurrentCohort":1.3251279350451146,"vsPinnedBaseline":1.3776791658028045},"ruleCounts":{"structure.barrel-density":3,"structure.directory-fanout-hotspot":2,"defensive.empty-catch":1,"defensive.error-obscuring":1,"defensive.error-swallowing":1,"structure.pass-through-wrappers":1}} diff --git a/package.json b/package.json index a1d4579..04897b4 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "benchmark:fetch": "bun run scripts/benchmark-fetch.ts", "benchmark:scan": "bun run scripts/benchmark-scan.ts", "benchmark:report": "bun run scripts/benchmark-report.ts", + "benchmark:history": "bun run scripts/benchmark-history.ts", "benchmark:update": "bun run benchmark:fetch && bun run benchmark:scan && bun run benchmark:report" }, "dependencies": { diff --git a/reports/known-ai-vs-solid-oss-history.md b/reports/known-ai-vs-solid-oss-history.md new file mode 100644 index 0000000..09c0e0b --- /dev/null +++ b/reports/known-ai-vs-solid-oss-history.md @@ -0,0 +1,92 @@ +# Rolling benchmark history: Known AI repos vs older solid OSS repos + +Latest update: 2026-04-13 +History dir: `benchmarks/history/known-ai-vs-solid-oss/` +Pinned baseline snapshot: `benchmarks/results/known-ai-vs-solid-oss.json` (2026-04-17) +Pinned baseline analyzer version: 0.3.0 + +## Goal + +Compare a cohort of known AI-generated JavaScript/TypeScript repos against well-regarded OSS repos, with the mature-OSS cohort pinned to the latest default-branch commit on or before 2025-01-01, using exact commit SHAs and normalized analyzer metrics. This rolling history tracks the same repos at the default-branch revision that existed at each recorded run time so the benchmark can show movement over time. + +## Refresh + +```bash +bun run benchmark:history +``` + +To backfill earlier weekly points honestly, rerun the history job with a past timestamp so each repo resolves the default-branch commit that existed at that time: + +```bash +bun run benchmark:history --recorded-at 2026-04-06T12:00:00Z +``` + +## Latest analyzer revisions + +- `0.3.0` @ `c64455e` — 18 latest repo snapshots + +## Latest cohort medians + +| Cohort | Repo count | Median current blended | Median score/file | Median findings/file | +|---|---:|---:|---:|---:| +| explicit-ai | 9 | **2.81** | 0.99 | 0.31 | +| mature-oss | 9 | **1.00** | 0.24 | 0.08 | + +## AI cohort latest standings + +| Repo | Points | Trend (pinned) | Latest ref | Current blended | Latest pinned | Highest pinned | Δ prev (pinned) | Δ first (pinned) | Score/file | Findings/file | +|---|---:|---|---|---:|---:|---:|---:|---:|---:|---:| +| [garrytan/gstack](https://github.com/garrytan/gstack) | 4 | █▃▄▁ | `main@c6e6a21` | **4.59** | **4.77** | **6.37** | -0.64 | -1.60 | 1.96 | 0.49 | +| [redwoodjs/agent-ci](https://github.com/redwoodjs/agent-ci) | 4 | █▁▁█ | `main@c61f27d` | **3.76** | **3.91** | **3.91** | +0.51 | +0.01 | 1.23 | 0.33 | +| [jiayun/DevWorkbench](https://github.com/jiayun/DevWorkbench) | 4 | ██▁▁ | `main@ea50862` | **3.26** | **3.39** | **3.40** | 0.00 | -0.02 | 1.00 | 0.44 | +| [robinebers/openusage](https://github.com/robinebers/openusage) | 4 | █▂▁▂ | `main@06113d6` | **2.91** | **3.03** | **3.06** | +0.01 | -0.03 | 1.37 | 0.35 | +| [openclaw/openclaw](https://github.com/openclaw/openclaw) | 4 | ▁▁█▁ | `main@1de5610` | **2.81** | **2.92** | **3.15** | -0.23 | -0.01 | 0.99 | 0.31 | +| [FullAgent/fulling](https://github.com/FullAgent/fulling) | 4 | ██▁▁ | `main@d95060f` | **2.07** | **2.16** | **2.16** | 0.00 | 0.00 | 0.53 | 0.16 | +| [emdash-cms/emdash](https://github.com/emdash-cms/emdash) | 2 | █▁ | `main@a1dac00` | **1.94** | **2.01** | **2.17** | -0.16 | -0.16 | 0.70 | 0.21 | +| [cloudflare/vinext](https://github.com/cloudflare/vinext) | 4 | ▇█▇▁ | `main@e81a621` | **1.85** | **1.93** | **1.99** | -0.06 | -0.06 | 0.47 | 0.14 | +| [modem-dev/hunk](https://github.com/modem-dev/hunk) | 4 | ▁▄▄█ | `main@53242b4` | **1.46** | **1.51** | **1.51** | +0.44 | +0.71 | 0.48 | 0.17 | + +## Mature OSS cohort latest standings + +| Repo | Points | Trend (pinned) | Latest ref | Current blended | Latest pinned | Highest pinned | Δ prev (pinned) | Δ first (pinned) | Score/file | Findings/file | +|---|---:|---|---|---:|---:|---:|---:|---:|---:|---:| +| [vitejs/vite](https://github.com/vitejs/vite) | 4 | █▆▁▇ | `main@bc5c6a7` | **1.46** | **1.52** | **1.52** | +0.02 | 0.00 | 0.27 | 0.08 | +| [withastro/astro](https://github.com/withastro/astro) | 4 | █▂▁▁ | `main@7fe40bc` | **1.40** | **1.46** | **1.55** | 0.00 | -0.09 | 0.27 | 0.09 | +| [pmndrs/zustand](https://github.com/pmndrs/zustand) | 4 | ██▁▁ | `main@00f96a3` | **1.33** | **1.38** | **1.38** | 0.00 | -0.01 | 0.47 | 0.18 | +| [payloadcms/payload](https://github.com/payloadcms/payload) | 4 | ▁▂▃█ | `main@5afcef5` | **1.29** | **1.34** | **1.34** | +0.02 | +0.02 | 0.24 | 0.08 | +| [umami-software/umami](https://github.com/umami-software/umami) | 4 | █▁▁▂ | `master@3a31ad3` | **1.00** | **1.04** | **1.04** | +0.00 | 0.00 | 0.18 | 0.07 | +| [egoist/tsup](https://github.com/egoist/tsup) | 4 | ▅▅▅▅ | `main@b906f86` | **0.89** | **0.92** | **0.92** | 0.00 | 0.00 | 0.21 | 0.08 | +| [sindresorhus/execa](https://github.com/sindresorhus/execa) | 4 | ▅▅▅▅ | `main@f3a2e84` | **0.85** | **0.89** | **0.89** | 0.00 | 0.00 | 0.17 | 0.05 | +| [mikaelbr/node-notifier](https://github.com/mikaelbr/node-notifier) | 4 | ▅▅▅▅ | `master@b36c237` | **0.40** | **0.41** | **0.41** | 0.00 | 0.00 | 0.08 | 0.04 | +| [vercel/hyper](https://github.com/vercel/hyper) | 4 | ▅▅▅▅ | `canary@2a7bb18` | **0.40** | **0.41** | **0.41** | 0.00 | 0.00 | 0.65 | 0.16 | + +## Table legend + +- `Current blended` = latest repo score vs the current mature-OSS medians from the same rolling run. +- `Latest pinned` = latest repo score vs the frozen pinned mature-OSS baseline snapshot. +- `Highest pinned` = highest stored repo score on that same pinned baseline. +- `Δ prev (pinned)` = latest pinned - previous week's pinned score. +- `Δ first (pinned)` = latest pinned - first stored pinned score for that repo. + +## Biggest increases vs previous week + +- [redwoodjs/agent-ci](https://github.com/redwoodjs/agent-ci) — +0.51 vs previous week (pinned blended) +- [modem-dev/hunk](https://github.com/modem-dev/hunk) — +0.44 vs previous week (pinned blended) +- [vitejs/vite](https://github.com/vitejs/vite) — +0.02 vs previous week (pinned blended) +- [payloadcms/payload](https://github.com/payloadcms/payload) — +0.02 vs previous week (pinned blended) +- [robinebers/openusage](https://github.com/robinebers/openusage) — +0.01 vs previous week (pinned blended) + +## Biggest decreases vs previous week + +- [garrytan/gstack](https://github.com/garrytan/gstack) — -0.64 vs previous week (pinned blended) +- [openclaw/openclaw](https://github.com/openclaw/openclaw) — -0.23 vs previous week (pinned blended) +- [emdash-cms/emdash](https://github.com/emdash-cms/emdash) — -0.16 vs previous week (pinned blended) +- [cloudflare/vinext](https://github.com/cloudflare/vinext) — -0.06 vs previous week (pinned blended) +- [withastro/astro](https://github.com/withastro/astro) — 0.00 vs previous week (pinned blended) + +## Notes + +- `Trend (pinned)` is a mini sparkline of the repo's stored pinned-blended values across recent weekly points. +- Each repo stores one JSONL datapoint per UTC week; reruns in the same week replace that week's datapoint instead of appending duplicates. +- Older backfills can have fewer points for newer repos because the history job skips weeks before a repo had any commit on its current default branch. +- The existing pinned benchmark report remains the reproducible source of truth for exact SHA-based benchmark claims. diff --git a/scripts/benchmark-history.ts b/scripts/benchmark-history.ts new file mode 100644 index 0000000..c5c90a7 --- /dev/null +++ b/scripts/benchmark-history.ts @@ -0,0 +1,218 @@ +import { spawnSync } from "node:child_process"; +import { access, mkdir, readFile, writeFile } from "node:fs/promises"; +import path from "node:path"; +import packageJson from "../package.json"; +import { + createBenchmarkHistoryLatestSummary, + createBenchmarkHistoryPoints, + mergeHistoryPoint, + parseHistoryPoints, + resolveBenchmarkHistoryArtifacts, + serializeHistoryPoints, + type BenchmarkedHistoryAnalysis, + type BenchmarkRepoResolution, +} from "../src/benchmarks/history"; +import { parseLsRemoteDefaultBranch } from "../src/benchmarks/latest-ref"; +import { + DEFAULT_BENCHMARK_SET_PATH, + loadBenchmarkSet, + resolveProjectPath, +} from "../src/benchmarks/manifest"; +import { renderBenchmarkHistoryReport } from "../src/benchmarks/history-report"; +import type { BenchmarkRepoSpec, BenchmarkSnapshot } from "../src/benchmarks/types"; +import { DEFAULT_CONFIG } from "../src/config"; +import { analyzeRepository } from "../src/core/engine"; +import { createDefaultRegistry } from "../src/default-registry"; +import { getOption } from "./lib/get-option"; + +function run(command: string, args: string[], cwd?: string): string { + const result = spawnSync(command, args, { + cwd, + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }); + + if (result.status !== 0) { + throw new Error( + [`Command failed: ${command} ${args.join(" ")}`, result.stdout, result.stderr] + .filter(Boolean) + .join("\n"), + ); + } + + return result.stdout.trim(); +} + +async function pathExists(targetPath: string): Promise { + try { + await access(targetPath); + return true; + } catch { + return false; + } +} + +async function readTextIfExists(targetPath: string): Promise { + return (await pathExists(targetPath)) ? await readFile(targetPath, "utf8") : ""; +} + +async function writeIfChanged(targetPath: string, content: string): Promise { + const currentContent = await readTextIfExists(targetPath); + if (currentContent === content) { + return false; + } + + await mkdir(path.dirname(targetPath), { recursive: true }); + await writeFile(targetPath, content); + return true; +} + +function resolveDefaultBranch(spec: BenchmarkRepoSpec): string { + // Use git itself for default-branch discovery so the history job does not depend on the + // GitHub REST API or repository-specific metadata caching. + const output = run("git", ["ls-remote", "--symref", spec.url, "HEAD"]); + return parseLsRemoteDefaultBranch(output).defaultBranch; +} + +async function prepareCheckout( + checkoutsDir: string, + spec: BenchmarkRepoSpec, + defaultBranch: string, + recordedAt: string, +): Promise<(BenchmarkRepoResolution & { checkoutPath: string }) | null> { + // History checkouts intentionally live in a separate cache from the pinned benchmark cache so + // latest-ref scans cannot disturb the exact-SHA reproducible benchmark workflow. + const checkoutPath = path.join(checkoutsDir, spec.id); + const gitPath = path.join(checkoutPath, ".git"); + + if (!(await pathExists(gitPath))) { + console.log(`cloning ${spec.repo}`); + run("git", ["clone", "--filter=blob:none", "--no-checkout", spec.url, checkoutPath]); + } + + run("git", ["remote", "set-url", "origin", spec.url], checkoutPath); + run("git", ["fetch", "--force", "--prune", "--filter=blob:none", "origin"], checkoutPath); + + // Resolve the commit that was on the default branch at the scheduled run time. This makes + // backfills honest: older weekly points reflect historical branch state, not today's HEAD. + const ref = run( + "git", + ["rev-list", "-1", `--before=${recordedAt}`, `origin/${defaultBranch}`], + checkoutPath, + ); + + if (!ref) { + console.log(`no commit on ${defaultBranch} at or before ${recordedAt}; skipping ${spec.id}`); + return null; + } + + run("git", ["checkout", "--force", "--detach", ref], checkoutPath); + run("git", ["reset", "--hard", ref], checkoutPath); + run("git", ["clean", "-fdx"], checkoutPath); + + const actualRef = run("git", ["rev-parse", "HEAD"], checkoutPath); + if (actualRef !== ref) { + throw new Error(`Resolved ref mismatch for ${spec.id}: expected ${ref}, got ${actualRef}`); + } + + return { + repoId: spec.id, + defaultBranch, + ref, + checkoutPath, + }; +} + +const manifestPath = getOption(process.argv.slice(2), "--manifest", DEFAULT_BENCHMARK_SET_PATH); +const recordedAt = getOption(process.argv.slice(2), "--recorded-at", new Date().toISOString()); +const benchmarkSet = await loadBenchmarkSet(manifestPath); +const baselineSnapshotDisplayPath = benchmarkSet.artifacts.snapshotPath; +const baselineSnapshotPath = resolveProjectPath(baselineSnapshotDisplayPath); + +if (!(await pathExists(baselineSnapshotPath))) { + throw new Error( + `Missing pinned benchmark snapshot at ${baselineSnapshotPath}. Run bun run benchmark:update first.`, + ); +} + +const baselineSnapshot = JSON.parse( + await readFile(baselineSnapshotPath, "utf8"), +) as BenchmarkSnapshot; +const artifacts = resolveBenchmarkHistoryArtifacts(benchmarkSet.id); +const checkoutsDir = resolveProjectPath(artifacts.checkoutsDir); +const historyDir = resolveProjectPath(artifacts.historyDir); +const latestPath = resolveProjectPath(artifacts.latestPath); +const reportPath = resolveProjectPath(artifacts.reportPath); +const analyzerCommit = run("git", ["rev-parse", "HEAD"], process.cwd()); +const registry = createDefaultRegistry(); +const analyses: BenchmarkedHistoryAnalysis[] = []; + +await mkdir(checkoutsDir, { recursive: true }); +await mkdir(historyDir, { recursive: true }); + +for (const repo of benchmarkSet.repos) { + console.log(`\n==> resolving ${repo.id} (${repo.repo})`); + const defaultBranch = resolveDefaultBranch(repo); + const prepared = await prepareCheckout(checkoutsDir, repo, defaultBranch, recordedAt); + + if (!prepared) { + continue; + } + + const { checkoutPath, ...resolution } = prepared; + console.log(`default branch ${resolution.defaultBranch} @ ${resolution.ref.slice(0, 7)}`); + + console.log(`scanning ${repo.id}`); + const result = await analyzeRepository(checkoutPath, DEFAULT_CONFIG, registry); + analyses.push({ spec: repo, resolution, result }); +} + +const points = createBenchmarkHistoryPoints( + benchmarkSet, + analyses, + baselineSnapshot, + baselineSnapshotDisplayPath, + packageJson.version, + analyzerCommit, + recordedAt, +); + +const updatedPointSets = new Map>(); +let changedFiles = 0; + +for (const point of points) { + // Each repo keeps a JSONL append log, but the logical unit is one point per UTC week. + // `mergeHistoryPoint` makes reruns idempotent by replacing an existing point for that week. + const historyPath = path.join(historyDir, `${point.repoId}.jsonl`); + const existingPoints = parseHistoryPoints(await readTextIfExists(historyPath)); + const updatedPoints = mergeHistoryPoint(existingPoints, point); + updatedPointSets.set(point.repoId, updatedPoints); + + if (await writeIfChanged(historyPath, serializeHistoryPoints(updatedPoints))) { + changedFiles += 1; + } +} + +const allPoints = [...updatedPointSets.values()].flat(); +// `latest.json` and the markdown report are derived views over the per-repo JSONL files. They make +// it cheap for docs/UI/reporting code to read current standings without reparsing every file. +const summary = createBenchmarkHistoryLatestSummary( + benchmarkSet, + allPoints, + baselineSnapshot, + baselineSnapshotDisplayPath, +); +const report = renderBenchmarkHistoryReport(benchmarkSet, summary); + +if (await writeIfChanged(latestPath, `${JSON.stringify(summary, null, 2)}\n`)) { + changedFiles += 1; +} + +if (await writeIfChanged(reportPath, `${report}\n`)) { + changedFiles += 1; +} + +console.log(`\nUpdated ${points.length} repo histories (${changedFiles} file changes).`); +console.log(`History dir: ${historyDir}`); +console.log(`Latest summary: ${latestPath}`); +console.log(`Report: ${reportPath}`); diff --git a/src/benchmarks/history-report.ts b/src/benchmarks/history-report.ts new file mode 100644 index 0000000..ebe7ad6 --- /dev/null +++ b/src/benchmarks/history-report.ts @@ -0,0 +1,197 @@ +import type { + BenchmarkHistoryDelta, + BenchmarkHistoryLatestSummary, + BenchmarkHistoryRepoSummary, +} from "./history"; +import type { BenchmarkSet } from "./types"; + +const SPARKLINE_BARS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] as const; + +function formatMetric(value: number | null, digits = 2): string { + return value === null ? "n/a" : value.toFixed(digits); +} + +function formatSigned(value: number | null, digits = 2): string { + if (value === null) { + return "n/a"; + } + + const rounded = value.toFixed(digits); + const normalized = rounded === `-0.${"0".repeat(digits)}` ? `0.${"0".repeat(digits)}` : rounded; + return value > 0 ? `+${normalized}` : normalized; +} + +function shortRef(ref: string): string { + return ref.slice(0, 7); +} + +function renderRepoLink(repo: BenchmarkHistoryRepoSummary): string { + return `[${repo.repo}](https://github.com/${repo.repo})`; +} + +function renderAnalyzerSummary(summary: BenchmarkHistoryLatestSummary): string[] { + return summary.analyzers.map( + (analyzer) => + `- \`${analyzer.version}\` @ \`${shortRef(analyzer.commit)}\` — ${analyzer.repoCount} latest repo snapshots`, + ); +} + +function renderSparkline(values: Array): string { + const presentValues = values.filter((value): value is number => value !== null); + if (presentValues.length === 0) { + return "n/a"; + } + + const min = Math.min(...presentValues); + const max = Math.max(...presentValues); + + if (min === max) { + return values.map((value) => (value === null ? "·" : "▅")).join(""); + } + + return values + .map((value) => { + if (value === null) { + return "·"; + } + + const normalized = (value - min) / (max - min); + const index = Math.min( + SPARKLINE_BARS.length - 1, + Math.max(0, Math.round(normalized * (SPARKLINE_BARS.length - 1))), + ); + return SPARKLINE_BARS[index] ?? "█"; + }) + .join(""); +} + +function renderPinnedTrend(repo: BenchmarkHistoryRepoSummary): string { + return renderSparkline(repo.series.map((point) => point.blendedVsPinnedBaseline).slice(-8)); +} + +function sortByPinnedTrend( + repos: BenchmarkHistoryRepoSummary[], + deltaSelector: (delta: BenchmarkHistoryDelta | null) => number | null, +): BenchmarkHistoryRepoSummary[] { + return [...repos].sort((left, right) => { + const leftValue = deltaSelector(left.deltaFromPrevious) ?? 0; + const rightValue = deltaSelector(right.deltaFromPrevious) ?? 0; + return Math.abs(rightValue) - Math.abs(leftValue) || left.repo.localeCompare(right.repo); + }); +} + +function renderRepoTable(repos: BenchmarkHistoryRepoSummary[]): string[] { + const lines = [ + "| Repo | Points | Trend (pinned) | Latest ref | Current blended | Latest pinned | Highest pinned | Δ prev (pinned) | Δ first (pinned) | Score/file | Findings/file |", + "|---|---:|---|---|---:|---:|---:|---:|---:|---:|---:|", + ]; + + for (const repo of repos) { + lines.push( + `| ${renderRepoLink(repo)} | ${repo.pointCount} | ${renderPinnedTrend(repo)} | \`${repo.latest.defaultBranch}@${shortRef(repo.latest.ref)}\` | **${formatMetric(repo.latest.blended.vsCurrentCohort)}** | **${formatMetric(repo.latest.blended.vsPinnedBaseline)}** | **${formatMetric(repo.highest?.blendedVsPinnedBaseline ?? null)}** | ${formatSigned(repo.deltaFromPrevious?.blendedVsPinnedBaseline ?? null)} | ${formatSigned(repo.deltaFromFirst.blendedVsPinnedBaseline)} | ${formatMetric(repo.latest.summary.normalized.scorePerFile)} | ${formatMetric(repo.latest.summary.normalized.findingsPerFile)} |`, + ); + } + + return lines; +} + +function renderMoverList( + repos: BenchmarkHistoryRepoSummary[], + predicate: (value: number) => boolean, +): string[] { + const movers = sortByPinnedTrend(repos, (delta) => delta?.blendedVsPinnedBaseline) + .map((repo) => ({ + repo, + value: repo.deltaFromPrevious?.blendedVsPinnedBaseline ?? null, + })) + .filter((entry) => entry.value !== null && predicate(entry.value)) + .slice(0, 5); + + if (movers.length === 0) { + return ["- n/a yet (need at least two weekly points with movement)"]; + } + + return movers.map( + ({ repo, value }) => + `- ${renderRepoLink(repo)} — ${formatSigned(value)} vs previous week (pinned blended)`, + ); +} + +export function renderBenchmarkHistoryReport( + set: BenchmarkSet, + summary: BenchmarkHistoryLatestSummary, +): string { + const aiRepos = summary.repos.filter((repo) => repo.cohort === "explicit-ai"); + const matureRepos = summary.repos.filter((repo) => repo.cohort === "mature-oss"); + const aiCohort = summary.cohorts["explicit-ai"]; + const matureCohort = summary.cohorts["mature-oss"]; + + const lines = [ + `# Rolling benchmark history: ${set.name}`, + "", + `Latest update: ${summary.generatedAt.slice(0, 10)}`, + `History dir: \`benchmarks/history/${set.id}/\``, + `Pinned baseline snapshot: \`${summary.baseline.snapshotPath}\` (${summary.baseline.generatedAt.slice(0, 10)})`, + `Pinned baseline analyzer version: ${summary.baseline.analyzerVersion}`, + "", + "## Goal", + "", + `${set.description} This rolling history tracks the same repos at the default-branch revision that existed at each recorded run time so the benchmark can show movement over time.`, + "", + "## Refresh", + "", + "```bash", + "bun run benchmark:history", + "```", + "", + "To backfill earlier weekly points honestly, rerun the history job with a past timestamp so each repo resolves the default-branch commit that existed at that time:", + "", + "```bash", + "bun run benchmark:history --recorded-at 2026-04-06T12:00:00Z", + "```", + "", + "## Latest analyzer revisions", + "", + ...renderAnalyzerSummary(summary), + "", + "## Latest cohort medians", + "", + "| Cohort | Repo count | Median current blended | Median score/file | Median findings/file |", + "|---|---:|---:|---:|---:|", + `| explicit-ai | ${aiCohort.repoCount} | **${formatMetric(aiCohort.blendedScoreMedian)}** | ${formatMetric(aiCohort.medians.scorePerFile)} | ${formatMetric(aiCohort.medians.findingsPerFile)} |`, + `| mature-oss | ${matureCohort.repoCount} | **${formatMetric(matureCohort.blendedScoreMedian)}** | ${formatMetric(matureCohort.medians.scorePerFile)} | ${formatMetric(matureCohort.medians.findingsPerFile)} |`, + "", + "## AI cohort latest standings", + "", + ...renderRepoTable(aiRepos), + "", + "## Mature OSS cohort latest standings", + "", + ...renderRepoTable(matureRepos), + "", + "## Table legend", + "", + "- `Current blended` = latest repo score vs the current mature-OSS medians from the same rolling run.", + "- `Latest pinned` = latest repo score vs the frozen pinned mature-OSS baseline snapshot.", + "- `Highest pinned` = highest stored repo score on that same pinned baseline.", + "- `Δ prev (pinned)` = latest pinned - previous week's pinned score.", + "- `Δ first (pinned)` = latest pinned - first stored pinned score for that repo.", + "", + "## Biggest increases vs previous week", + "", + ...renderMoverList(summary.repos, (value) => value > 0), + "", + "## Biggest decreases vs previous week", + "", + ...renderMoverList(summary.repos, (value) => value < 0), + "", + "## Notes", + "", + "- `Trend (pinned)` is a mini sparkline of the repo's stored pinned-blended values across recent weekly points.", + "- Each repo stores one JSONL datapoint per UTC week; reruns in the same week replace that week's datapoint instead of appending duplicates.", + "- Older backfills can have fewer points for newer repos because the history job skips weeks before a repo had any commit on its current default branch.", + "- The existing pinned benchmark report remains the reproducible source of truth for exact SHA-based benchmark claims.", + ]; + + return lines.join("\n"); +} diff --git a/src/benchmarks/history.ts b/src/benchmarks/history.ts new file mode 100644 index 0000000..b7717fc --- /dev/null +++ b/src/benchmarks/history.ts @@ -0,0 +1,524 @@ +import type { AnalysisResult, AnalysisSummary, Finding, NormalizedMetrics } from "../core/types"; +import { buildMedianMetrics, computeRawBlendedScore, median, rescaleBlendedScore } from "./metrics"; +import type { + BenchmarkCohort, + BenchmarkCohortSnapshot, + BenchmarkRepoSpec, + BenchmarkSet, + BenchmarkSnapshot, +} from "./types"; + +export interface BenchmarkHistoryArtifacts { + checkoutsDir: string; + historyDir: string; + latestPath: string; + reportPath: string; +} + +export interface BenchmarkRepoResolution { + repoId: string; + defaultBranch: string; + ref: string; +} + +export interface BenchmarkedHistoryAnalysis { + spec: BenchmarkRepoSpec; + resolution: BenchmarkRepoResolution; + result: AnalysisResult; +} + +export interface BenchmarkHistoryPoint { + schemaVersion: 1; + benchmarkSetId: string; + benchmarkSetName: string; + recordedAt: string; + periodStart: string; + repoId: string; + repo: string; + cohort: BenchmarkCohort; + scanMode: "default-branch-as-of-recorded-at"; + defaultBranch: string; + ref: string; + analyzerVersion: string; + analyzerCommit: string; + summary: AnalysisSummary; + blended: { + vsCurrentCohort: number | null; + vsPinnedBaseline: number | null; + }; + ruleCounts: Record; +} + +export interface BenchmarkHistorySeriesPoint { + periodStart: string; + recordedAt: string; + blendedVsCurrentCohort: number | null; + blendedVsPinnedBaseline: number | null; + repoScore: number; + findingCount: number; +} + +export interface BenchmarkHistoryDelta { + blendedVsCurrentCohort: number | null; + blendedVsPinnedBaseline: number | null; + repoScore: number; + findingCount: number; + fileCount: number; + logicalLineCount: number; + functionCount: number; + scorePerFile: number | null; + scorePerKloc: number | null; + scorePerFunction: number | null; + findingsPerFile: number | null; + findingsPerKloc: number | null; + findingsPerFunction: number | null; +} + +export interface BenchmarkHistoryPeak { + periodStart: string; + recordedAt: string; + defaultBranch: string; + ref: string; + blendedVsPinnedBaseline: number | null; +} + +export interface BenchmarkHistoryRepoSummary { + id: string; + repo: string; + cohort: BenchmarkCohort; + pointCount: number; + firstRecordedAt: string; + latestRecordedAt: string; + first: BenchmarkHistoryPoint; + previous: BenchmarkHistoryPoint | null; + latest: BenchmarkHistoryPoint; + highest: BenchmarkHistoryPeak | null; + series: BenchmarkHistorySeriesPoint[]; + deltaFromFirst: BenchmarkHistoryDelta; + deltaFromPrevious: BenchmarkHistoryDelta | null; +} + +export interface BenchmarkHistoryBaseline { + snapshotPath: string; + generatedAt: string; + analyzerVersion: string; + matureOssMedians: NormalizedMetrics; + matureOssRawBlendedMedian: number | null; +} + +export interface BenchmarkHistoryAnalyzerSummary { + version: string; + commit: string; + repoCount: number; +} + +export interface BenchmarkHistoryLatestSummary { + schemaVersion: 1; + benchmarkSetId: string; + benchmarkSetName: string; + generatedAt: string; + baseline: BenchmarkHistoryBaseline; + analyzers: BenchmarkHistoryAnalyzerSummary[]; + cohorts: Record; + repos: BenchmarkHistoryRepoSummary[]; +} + +function summarizeRuleCounts(findings: Finding[]): Record { + const counts = new Map(); + + for (const finding of findings) { + counts.set(finding.ruleId, (counts.get(finding.ruleId) ?? 0) + 1); + } + + return Object.fromEntries( + [...counts.entries()].sort( + (left, right) => right[1] - left[1] || left[0].localeCompare(right[0]), + ), + ); +} + +function sortPoints(points: BenchmarkHistoryPoint[]): BenchmarkHistoryPoint[] { + return [...points].sort( + (left, right) => + left.periodStart.localeCompare(right.periodStart) || + left.recordedAt.localeCompare(right.recordedAt) || + left.repoId.localeCompare(right.repoId), + ); +} + +function difference(current: number | null, previous: number | null): number | null { + return current !== null && previous !== null ? current - previous : null; +} + +function buildDelta( + current: BenchmarkHistoryPoint, + previous: BenchmarkHistoryPoint, +): BenchmarkHistoryDelta { + return { + blendedVsCurrentCohort: difference( + current.blended.vsCurrentCohort, + previous.blended.vsCurrentCohort, + ), + blendedVsPinnedBaseline: difference( + current.blended.vsPinnedBaseline, + previous.blended.vsPinnedBaseline, + ), + repoScore: current.summary.repoScore - previous.summary.repoScore, + findingCount: current.summary.findingCount - previous.summary.findingCount, + fileCount: current.summary.fileCount - previous.summary.fileCount, + logicalLineCount: current.summary.logicalLineCount - previous.summary.logicalLineCount, + functionCount: current.summary.functionCount - previous.summary.functionCount, + scorePerFile: difference( + current.summary.normalized.scorePerFile, + previous.summary.normalized.scorePerFile, + ), + scorePerKloc: difference( + current.summary.normalized.scorePerKloc, + previous.summary.normalized.scorePerKloc, + ), + scorePerFunction: difference( + current.summary.normalized.scorePerFunction, + previous.summary.normalized.scorePerFunction, + ), + findingsPerFile: difference( + current.summary.normalized.findingsPerFile, + previous.summary.normalized.findingsPerFile, + ), + findingsPerKloc: difference( + current.summary.normalized.findingsPerKloc, + previous.summary.normalized.findingsPerKloc, + ), + findingsPerFunction: difference( + current.summary.normalized.findingsPerFunction, + previous.summary.normalized.findingsPerFunction, + ), + }; +} + +function findHighestPinnedPoint(points: BenchmarkHistoryPoint[]): BenchmarkHistoryPoint | null { + let highest: BenchmarkHistoryPoint | null = null; + + for (const point of points) { + const value = point.blended.vsPinnedBaseline; + if (value === null) { + continue; + } + + if (!highest) { + highest = point; + continue; + } + + const highestValue = highest.blended.vsPinnedBaseline; + if (highestValue === null || value > highestValue) { + highest = point; + continue; + } + + if (value === highestValue && point.recordedAt > highest.recordedAt) { + highest = point; + } + } + + return highest; +} + +function buildCohortSnapshots( + points: BenchmarkHistoryPoint[], +): Record { + const cohorts: Record = { + "explicit-ai": [], + "mature-oss": [], + }; + + for (const point of points) { + cohorts[point.cohort].push(point); + } + + const buildSnapshot = (cohortPoints: BenchmarkHistoryPoint[]): BenchmarkCohortSnapshot => ({ + repoCount: cohortPoints.length, + medians: buildMedianMetrics(cohortPoints), + blendedScoreMedian: median( + cohortPoints + .map((point) => point.blended.vsCurrentCohort) + .filter((value): value is number => value !== null), + ), + }); + + return { + "explicit-ai": buildSnapshot(cohorts["explicit-ai"]), + "mature-oss": buildSnapshot(cohorts["mature-oss"]), + }; +} + +function buildAnalyzerSummary(points: BenchmarkHistoryPoint[]): BenchmarkHistoryAnalyzerSummary[] { + const counts = new Map(); + + for (const point of points) { + const key = `${point.analyzerVersion}:${point.analyzerCommit}`; + const current = counts.get(key); + if (current) { + current.repoCount += 1; + continue; + } + + counts.set(key, { + version: point.analyzerVersion, + commit: point.analyzerCommit, + repoCount: 1, + }); + } + + return [...counts.values()].sort( + (left, right) => right.repoCount - left.repoCount || left.version.localeCompare(right.version), + ); +} + +export function resolveBenchmarkHistoryArtifacts(setId: string): BenchmarkHistoryArtifacts { + return { + checkoutsDir: `benchmarks/.cache/checkouts-history/${setId}`, + historyDir: `benchmarks/history/${setId}`, + latestPath: `benchmarks/history/${setId}/latest.json`, + reportPath: `reports/${setId}-history.md`, + }; +} + +/** + * Bucket history points by UTC week so scheduled reruns for the same week overwrite the + * existing datapoint instead of endlessly appending near-duplicates. + */ +export function getUtcWeekStartDate(input: string | Date): string { + const date = typeof input === "string" ? new Date(input) : new Date(input.getTime()); + + if (Number.isNaN(date.getTime())) { + throw new Error(`Invalid date: ${String(input)}`); + } + + const day = date.getUTCDay(); + const mondayOffset = (day + 6) % 7; + date.setUTCDate(date.getUTCDate() - mondayOffset); + date.setUTCHours(0, 0, 0, 0); + return date.toISOString().slice(0, 10); +} + +export function derivePinnedBaseline( + snapshot: BenchmarkSnapshot, + snapshotPath: string, +): BenchmarkHistoryBaseline { + const matureRepos = snapshot.repos.filter((repo) => repo.cohort === "mature-oss"); + const matureOssMedians = snapshot.cohorts["mature-oss"].medians; + const matureOssRawBlendedMedian = median( + matureRepos + .map((repo) => computeRawBlendedScore(repo.summary.normalized, matureOssMedians)) + .filter((value): value is number => value !== null), + ); + + return { + snapshotPath, + generatedAt: snapshot.generatedAt, + analyzerVersion: snapshot.analyzerVersion, + matureOssMedians, + matureOssRawBlendedMedian, + }; +} + +/** + * Build one history point per repo for a scheduled run. + * + * We intentionally store two blended scores: + * - `vsCurrentCohort`: relative to the mature-OSS repos scanned in this same run, which is + * useful for weekly ranking. + * - `vsPinnedBaseline`: relative to the frozen pinned benchmark snapshot, which is the cleaner + * time-series for trend charts. + */ +export function createBenchmarkHistoryPoints( + set: BenchmarkSet, + analyses: BenchmarkedHistoryAnalysis[], + pinnedSnapshot: BenchmarkSnapshot, + pinnedSnapshotPath: string, + analyzerVersion: string, + analyzerCommit: string, + recordedAt = new Date().toISOString(), +): BenchmarkHistoryPoint[] { + const periodStart = getUtcWeekStartDate(recordedAt); + const currentMaturePoints = analyses.filter(({ spec }) => spec.cohort === "mature-oss"); + const currentMatureMedians = buildMedianMetrics( + currentMaturePoints.map(({ result }) => ({ summary: result.summary })), + ); + const currentMatureRawBaseline = median( + currentMaturePoints + .map(({ result }) => computeRawBlendedScore(result.summary.normalized, currentMatureMedians)) + .filter((value): value is number => value !== null), + ); + const pinnedBaseline = derivePinnedBaseline(pinnedSnapshot, pinnedSnapshotPath); + + return analyses + .map(({ spec, resolution, result }) => { + if (resolution.repoId !== spec.id) { + throw new Error(`Resolution mismatch for ${spec.id}: got ${resolution.repoId}`); + } + + return { + schemaVersion: 1, + benchmarkSetId: set.id, + benchmarkSetName: set.name, + recordedAt, + periodStart, + repoId: spec.id, + repo: spec.repo, + cohort: spec.cohort, + scanMode: "default-branch-as-of-recorded-at", + defaultBranch: resolution.defaultBranch, + ref: resolution.ref, + analyzerVersion, + analyzerCommit, + summary: result.summary, + blended: { + vsCurrentCohort: rescaleBlendedScore( + computeRawBlendedScore(result.summary.normalized, currentMatureMedians), + currentMatureRawBaseline, + ), + vsPinnedBaseline: rescaleBlendedScore( + computeRawBlendedScore(result.summary.normalized, pinnedBaseline.matureOssMedians), + pinnedBaseline.matureOssRawBlendedMedian, + ), + }, + ruleCounts: summarizeRuleCounts(result.findings), + } satisfies BenchmarkHistoryPoint; + }) + .sort((left, right) => left.repoId.localeCompare(right.repoId)); +} + +export function parseHistoryPoints(raw: string): BenchmarkHistoryPoint[] { + if (!raw.trim()) { + return []; + } + + return sortPoints( + raw + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as BenchmarkHistoryPoint), + ); +} + +export function serializeHistoryPoints(points: BenchmarkHistoryPoint[]): string { + const orderedPoints = sortPoints(points); + return orderedPoints.map((point) => JSON.stringify(point)).join("\n") + "\n"; +} + +/** + * Keep at most one datapoint per repo per UTC week. + * If a workflow is rerun in the same week, replace that week's point instead of appending. + */ +export function mergeHistoryPoint( + existingPoints: BenchmarkHistoryPoint[], + incomingPoint: BenchmarkHistoryPoint, +): BenchmarkHistoryPoint[] { + const index = existingPoints.findIndex( + (point) => point.periodStart === incomingPoint.periodStart, + ); + + if (index === -1) { + return sortPoints([...existingPoints, incomingPoint]); + } + + const existingPoint = existingPoints[index]; + if (existingPoint && JSON.stringify(existingPoint) === JSON.stringify(incomingPoint)) { + return sortPoints(existingPoints); + } + + const updatedPoints = [...existingPoints]; + updatedPoints[index] = incomingPoint; + return sortPoints(updatedPoints); +} + +/** + * Summarize the history files by looking only at the latest point for each repo, then attach + * deltas versus the previous point and the first point so reports can show short- and long-term + * movement without reading every JSONL file downstream. + */ +export function createBenchmarkHistoryLatestSummary( + set: BenchmarkSet, + allPoints: BenchmarkHistoryPoint[], + pinnedSnapshot: BenchmarkSnapshot, + pinnedSnapshotPath: string, +): BenchmarkHistoryLatestSummary { + const pointsByRepo = new Map(); + + for (const point of sortPoints(allPoints)) { + const repoPoints = pointsByRepo.get(point.repoId) ?? []; + repoPoints.push(point); + pointsByRepo.set(point.repoId, repoPoints); + } + + const repos = [...pointsByRepo.values()] + .map((points) => { + const sortedPoints = sortPoints(points); + const first = sortedPoints[0]; + const latest = sortedPoints.at(-1); + const previous = sortedPoints.length > 1 ? (sortedPoints.at(-2) ?? null) : null; + const highest = findHighestPinnedPoint(sortedPoints); + + if (!first || !latest) { + throw new Error("History summary received an empty repo point set"); + } + + return { + id: latest.repoId, + repo: latest.repo, + cohort: latest.cohort, + pointCount: sortedPoints.length, + firstRecordedAt: first.recordedAt, + latestRecordedAt: latest.recordedAt, + first, + previous, + latest, + highest: highest + ? { + periodStart: highest.periodStart, + recordedAt: highest.recordedAt, + defaultBranch: highest.defaultBranch, + ref: highest.ref, + blendedVsPinnedBaseline: highest.blended.vsPinnedBaseline, + } + : null, + series: sortedPoints.map((point) => ({ + periodStart: point.periodStart, + recordedAt: point.recordedAt, + blendedVsCurrentCohort: point.blended.vsCurrentCohort, + blendedVsPinnedBaseline: point.blended.vsPinnedBaseline, + repoScore: point.summary.repoScore, + findingCount: point.summary.findingCount, + })), + deltaFromFirst: buildDelta(latest, first), + deltaFromPrevious: previous ? buildDelta(latest, previous) : null, + } satisfies BenchmarkHistoryRepoSummary; + }) + .sort((left, right) => { + if (left.cohort !== right.cohort) { + return left.cohort.localeCompare(right.cohort); + } + + const leftScore = left.latest.blended.vsPinnedBaseline ?? Number.NEGATIVE_INFINITY; + const rightScore = right.latest.blended.vsPinnedBaseline ?? Number.NEGATIVE_INFINITY; + return rightScore - leftScore || left.repo.localeCompare(right.repo); + }); + + const latestPoints = repos.map((repo) => repo.latest); + const latestRecordedAt = latestPoints + .map((point) => point.recordedAt) + .sort((left, right) => right.localeCompare(left))[0]; + + return { + schemaVersion: 1, + benchmarkSetId: set.id, + benchmarkSetName: set.name, + generatedAt: latestRecordedAt ?? new Date().toISOString(), + baseline: derivePinnedBaseline(pinnedSnapshot, pinnedSnapshotPath), + analyzers: buildAnalyzerSummary(latestPoints), + cohorts: buildCohortSnapshots(latestPoints), + repos, + }; +} diff --git a/src/benchmarks/latest-ref.ts b/src/benchmarks/latest-ref.ts new file mode 100644 index 0000000..8b24c87 --- /dev/null +++ b/src/benchmarks/latest-ref.ts @@ -0,0 +1,30 @@ +export interface LatestDefaultBranchRef { + defaultBranch: string; + ref: string; +} + +/** + * Parse `git ls-remote --symref HEAD` output so the rolling-history job can + * discover the current default branch and its HEAD SHA without calling the GitHub API. + */ +export function parseLsRemoteDefaultBranch(output: string): LatestDefaultBranchRef { + const lines = output + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); + + const branchLine = lines.find((line) => line.startsWith("ref:")); + const headLine = lines.find((line) => /\bHEAD$/.test(line) && !line.startsWith("ref:")); + + const branchMatch = branchLine?.match(/^ref:\s+refs\/heads\/(.+)\s+HEAD$/); + const headMatch = headLine?.match(/^([0-9a-f]{7,40})\s+HEAD$/); + + if (!branchMatch?.[1] || !headMatch?.[1]) { + throw new Error(`Unable to parse default-branch ref from ls-remote output:\n${output}`); + } + + return { + defaultBranch: branchMatch[1], + ref: headMatch[1], + }; +} diff --git a/src/benchmarks/metrics.ts b/src/benchmarks/metrics.ts new file mode 100644 index 0000000..b2fca07 --- /dev/null +++ b/src/benchmarks/metrics.ts @@ -0,0 +1,75 @@ +import type { NormalizedMetrics } from "../core/types"; +import { NORMALIZED_METRIC_KEYS } from "./types"; + +interface MetricsCarrier { + summary: { + normalized: NormalizedMetrics; + }; +} + +export function median(values: number[]): number | null { + if (values.length === 0) { + return null; + } + + const sorted = [...values].sort((left, right) => left - right); + const middle = Math.floor(sorted.length / 2); + + if (sorted.length % 2 === 1) { + return sorted[middle] ?? null; + } + + const left = sorted[middle - 1]; + const right = sorted[middle]; + return left !== undefined && right !== undefined ? (left + right) / 2 : null; +} + +export function buildMedianMetrics(items: MetricsCarrier[]): NormalizedMetrics { + const entries = NORMALIZED_METRIC_KEYS.map((metricKey) => { + const values = items + .map((item) => item.summary.normalized[metricKey]) + .filter((value): value is number => value !== null); + return [metricKey, median(values)]; + }); + + return Object.fromEntries(entries) as NormalizedMetrics; +} + +export function geometricMean(values: number[]): number | null { + if (values.length === 0) { + return null; + } + + if (values.some((value) => value === 0)) { + return 0; + } + + return Math.exp(values.reduce((sum, value) => sum + Math.log(value), 0) / values.length); +} + +export function computeRawBlendedScore( + metrics: NormalizedMetrics, + baseline: NormalizedMetrics, +): number | null { + const ratios = NORMALIZED_METRIC_KEYS.flatMap((metricKey) => { + const value = metrics[metricKey]; + const baselineValue = baseline[metricKey]; + + if (value === null || baselineValue === null || baselineValue <= 0) { + return []; + } + + return [value / baselineValue]; + }); + + return geometricMean(ratios); +} + +export function rescaleBlendedScore( + rawBlendedScore: number | null, + baselineMedian: number | null, +): number | null { + return rawBlendedScore !== null && baselineMedian !== null && baselineMedian > 0 + ? rawBlendedScore / baselineMedian + : rawBlendedScore; +} diff --git a/src/benchmarks/snapshot.ts b/src/benchmarks/snapshot.ts index 7058c36..538dfed 100644 --- a/src/benchmarks/snapshot.ts +++ b/src/benchmarks/snapshot.ts @@ -1,4 +1,5 @@ import type { Finding, NormalizedMetrics } from "../core/types"; +import { buildMedianMetrics, computeRawBlendedScore, median, rescaleBlendedScore } from "./metrics"; import type { BenchmarkCohort, BenchmarkCohortSnapshot, @@ -10,23 +11,6 @@ import type { } from "./types"; import { NORMALIZED_METRIC_KEYS } from "./types"; -function median(values: number[]): number | null { - if (values.length === 0) { - return null; - } - - const sorted = [...values].sort((left, right) => left - right); - const middle = Math.floor(sorted.length / 2); - - if (sorted.length % 2 === 1) { - return sorted[middle] ?? null; - } - - const left = sorted[middle - 1]; - const right = sorted[middle]; - return left !== undefined && right !== undefined ? (left + right) / 2 : null; -} - function divideOrNull(numerator: number | null, denominator: number | null): number | null { return numerator !== null && denominator !== null && denominator !== 0 ? numerator / denominator @@ -61,47 +45,6 @@ function buildRepoSnapshot({ spec, result }: BenchmarkedAnalysis): BenchmarkRepo }; } -function buildMedianMetrics(repos: BenchmarkRepoSnapshot[]): NormalizedMetrics { - const entries = NORMALIZED_METRIC_KEYS.map((metricKey) => { - const values = repos - .map((repo) => repo.summary.normalized[metricKey]) - .filter((value): value is number => value !== null); - return [metricKey, median(values)]; - }); - - return Object.fromEntries(entries) as NormalizedMetrics; -} - -function geometricMean(values: number[]): number | null { - if (values.length === 0) { - return null; - } - - if (values.some((value) => value === 0)) { - return 0; - } - - return Math.exp(values.reduce((sum, value) => sum + Math.log(value), 0) / values.length); -} - -function computeRawBlendedScore( - metrics: NormalizedMetrics, - matureMedian: NormalizedMetrics, -): number | null { - const ratios = NORMALIZED_METRIC_KEYS.flatMap((metricKey) => { - const value = metrics[metricKey]; - const baseline = matureMedian[metricKey]; - - if (value === null || baseline === null || baseline <= 0) { - return []; - } - - return [value / baseline]; - }); - - return geometricMean(ratios); -} - function buildCohortSnapshots( repos: BenchmarkRepoSnapshot[], ): Record { @@ -148,10 +91,7 @@ function applyBlendedScores( return rawScores.map(({ repo, rawBlendedScore }) => ({ ...repo, - blendedScore: - rawBlendedScore !== null && matureBaseline !== null && matureBaseline > 0 - ? rawBlendedScore / matureBaseline - : rawBlendedScore, + blendedScore: rescaleBlendedScore(rawBlendedScore, matureBaseline), })); } diff --git a/tests/benchmark-history.test.ts b/tests/benchmark-history.test.ts new file mode 100644 index 0000000..135a159 --- /dev/null +++ b/tests/benchmark-history.test.ts @@ -0,0 +1,233 @@ +import { describe, expect, test } from "bun:test"; +import path from "node:path"; +import { + createBenchmarkHistoryLatestSummary, + createBenchmarkHistoryPoints, + getUtcWeekStartDate, + mergeHistoryPoint, + parseHistoryPoints, + serializeHistoryPoints, + type BenchmarkedHistoryAnalysis, +} from "../src/benchmarks/history"; +import { renderBenchmarkHistoryReport } from "../src/benchmarks/history-report"; +import { parseLsRemoteDefaultBranch } from "../src/benchmarks/latest-ref"; +import { createBenchmarkSnapshot } from "../src/benchmarks/snapshot"; +import type { BenchmarkSet } from "../src/benchmarks/types"; +import { analyzeRepository } from "../src/core/engine"; +import { DEFAULT_CONFIG } from "../src/config"; +import { createDefaultRegistry } from "../src/default-registry"; + +function fixturePath(name: string): string { + return path.join(process.cwd(), "tests", "fixtures", "repos", name); +} + +function buildFixtureBenchmark(): BenchmarkSet { + return { + schemaVersion: 1, + id: "fixture-benchmark", + name: "Fixture benchmark", + description: "Small local benchmark for unit coverage.", + artifacts: { + checkoutsDir: "benchmarks/.cache/checkouts/fixture-benchmark", + snapshotPath: "benchmarks/results/fixture-benchmark.json", + reportPath: "reports/fixture-benchmark.md", + }, + repos: [ + { + id: "slop-heavy", + repo: "fixtures/slop-heavy", + url: "https://example.invalid/slop-heavy.git", + cohort: "explicit-ai", + ref: "1111111", + createdAt: "2026-01-01T00:00:00Z", + stars: 0, + provenance: "Fixture repo with intentionally slop-heavy code.", + }, + { + id: "mixed", + repo: "fixtures/mixed", + url: "https://example.invalid/mixed.git", + cohort: "mature-oss", + ref: "2222222", + createdAt: "2020-01-01T00:00:00Z", + stars: 0, + provenance: "Fixture repo with localized slop.", + }, + ], + pairings: [ + { + aiRepoId: "slop-heavy", + solidRepoId: "mixed", + notes: "Fixture pairing for unit coverage.", + }, + ], + }; +} + +async function buildFixtureAnalyses( + benchmark: BenchmarkSet, +): Promise { + const registry = createDefaultRegistry(); + const results = [ + await analyzeRepository(fixturePath("slop-heavy"), DEFAULT_CONFIG, registry), + await analyzeRepository(fixturePath("mixed"), DEFAULT_CONFIG, registry), + ]; + + return [ + { + spec: benchmark.repos[0]!, + resolution: { + repoId: "slop-heavy", + defaultBranch: "main", + ref: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + result: results[0], + }, + { + spec: benchmark.repos[1]!, + resolution: { + repoId: "mixed", + defaultBranch: "main", + ref: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + }, + result: results[1], + }, + ]; +} + +describe("benchmark history support", () => { + test("parses default-branch refs from git ls-remote output", () => { + const parsed = parseLsRemoteDefaultBranch( + ["ref: refs/heads/main\tHEAD", "e6e9fc9e4cbefc482e068d03a19401fb7d9226cc\tHEAD"].join("\n"), + ); + + expect(parsed).toEqual({ + defaultBranch: "main", + ref: "e6e9fc9e4cbefc482e068d03a19401fb7d9226cc", + }); + }); + + test("creates weekly history points, upserts by week, and renders a report", async () => { + const benchmark = buildFixtureBenchmark(); + const analyses = await buildFixtureAnalyses(benchmark); + const baselineSnapshot = createBenchmarkSnapshot( + benchmark, + analyses.map(({ spec, result }) => ({ spec, result })), + "0.1.0", + "2026-04-06T00:00:00Z", + ); + + const weekOnePoints = createBenchmarkHistoryPoints( + benchmark, + analyses, + baselineSnapshot, + "benchmarks/results/fixture-benchmark.json", + "0.2.0", + "commit-one", + "2026-04-15T12:00:00Z", + ); + const weekTwoPoints = createBenchmarkHistoryPoints( + benchmark, + analyses, + baselineSnapshot, + "benchmarks/results/fixture-benchmark.json", + "0.2.1", + "commit-two", + "2026-04-22T12:00:00Z", + ); + + expect(getUtcWeekStartDate("2026-04-15T12:00:00Z")).toBe("2026-04-13"); + expect(weekOnePoints).toHaveLength(2); + expect(weekOnePoints[0]?.periodStart).toBe("2026-04-13"); + expect(weekOnePoints[0]?.scanMode).toBe("default-branch-as-of-recorded-at"); + expect(weekOnePoints[0]?.blended.vsPinnedBaseline).not.toBeNull(); + + const slopHeavyWeekOne = weekOnePoints.find((point) => point.repoId === "slop-heavy"); + const slopHeavyWeekTwo = weekTwoPoints.find((point) => point.repoId === "slop-heavy"); + const mixedWeekOne = weekOnePoints.find((point) => point.repoId === "mixed"); + const mixedWeekTwo = weekTwoPoints.find((point) => point.repoId === "mixed"); + + expect(slopHeavyWeekOne).toBeTruthy(); + expect(slopHeavyWeekTwo).toBeTruthy(); + expect(mixedWeekOne).toBeTruthy(); + expect(mixedWeekTwo).toBeTruthy(); + + const adjustedSlopHeavyWeekTwo = { + ...slopHeavyWeekTwo!, + blended: { + ...slopHeavyWeekTwo!.blended, + vsCurrentCohort: (slopHeavyWeekTwo!.blended.vsCurrentCohort ?? 0) + 0.4, + vsPinnedBaseline: (slopHeavyWeekTwo!.blended.vsPinnedBaseline ?? 0) + 0.6, + }, + summary: { + ...slopHeavyWeekTwo!.summary, + repoScore: slopHeavyWeekTwo!.summary.repoScore + 2, + }, + }; + const adjustedMixedWeekTwo = { + ...mixedWeekTwo!, + blended: { + ...mixedWeekTwo!.blended, + vsCurrentCohort: (mixedWeekTwo!.blended.vsCurrentCohort ?? 0) - 0.2, + vsPinnedBaseline: (mixedWeekTwo!.blended.vsPinnedBaseline ?? 0) - 0.3, + }, + summary: { + ...mixedWeekTwo!.summary, + repoScore: mixedWeekTwo!.summary.repoScore - 1, + }, + }; + + let slopHeavyHistory = mergeHistoryPoint([], slopHeavyWeekOne!); + slopHeavyHistory = mergeHistoryPoint(slopHeavyHistory, { + ...slopHeavyWeekOne!, + recordedAt: "2026-04-15T18:00:00Z", + }); + slopHeavyHistory = mergeHistoryPoint(slopHeavyHistory, adjustedSlopHeavyWeekTwo); + + let mixedHistory = mergeHistoryPoint([], mixedWeekOne!); + mixedHistory = mergeHistoryPoint(mixedHistory, adjustedMixedWeekTwo); + + expect(slopHeavyHistory).toHaveLength(2); + expect(slopHeavyHistory[0]?.recordedAt).toBe("2026-04-15T18:00:00Z"); + + const serialized = serializeHistoryPoints(slopHeavyHistory); + const reparsed = parseHistoryPoints(serialized); + expect(reparsed).toHaveLength(2); + expect(reparsed[1]?.periodStart).toBe("2026-04-20"); + + const summary = createBenchmarkHistoryLatestSummary( + benchmark, + [...slopHeavyHistory, ...mixedHistory], + baselineSnapshot, + "benchmarks/results/fixture-benchmark.json", + ); + const report = renderBenchmarkHistoryReport(benchmark, summary); + + expect(summary.repos).toHaveLength(2); + expect(summary.repos.every((repo) => repo.pointCount === 2)).toBe(true); + expect(summary.repos.every((repo) => repo.series.length === 2)).toBe(true); + expect( + summary.repos.find((repo) => repo.id === "slop-heavy")?.deltaFromPrevious?.repoScore, + ).toBe(2); + expect(summary.repos.find((repo) => repo.id === "mixed")?.deltaFromPrevious?.repoScore).toBe( + -1, + ); + expect( + summary.repos.find((repo) => repo.id === "slop-heavy")?.highest?.blendedVsPinnedBaseline, + ).toBe(adjustedSlopHeavyWeekTwo.blended.vsPinnedBaseline); + expect( + summary.repos.find((repo) => repo.id === "mixed")?.highest?.blendedVsPinnedBaseline, + ).toBe(mixedWeekOne!.blended.vsPinnedBaseline); + expect(summary.generatedAt).toBe("2026-04-22T12:00:00Z"); + expect(summary.baseline.snapshotPath).toBe("benchmarks/results/fixture-benchmark.json"); + expect(report).toContain("Rolling benchmark history: Fixture benchmark"); + expect(report).toContain("bun run benchmark:history --recorded-at 2026-04-06T12:00:00Z"); + expect(report).toContain("Trend (pinned)"); + expect(report).toContain("Latest pinned"); + expect(report).toContain("Highest pinned"); + expect(report).toContain("▁█"); + expect(report).toContain("█▁"); + expect(report).toContain("fixtures/slop-heavy"); + expect(report).toContain("fixtures/mixed"); + }); +});