公开记录
软件健康报告模式 0.31.0 · 指标 2.5.0 · 2026-08-05 08:28 UTC

danfry1 / vitest-native

Test React Native with Vitest — against real React Native, or a fast mock. One plugin, zero config.

TypeScript · JavaScriptMIT★ 39 星标⑂ 0 复刻始于 2026年3月在 GitHub 上查看 ↗
类型命令行工具插件如何判定

danfry1/vitest-native 的健康指数为 100 分中的 80 分,处于「优秀」区间。 其得分最高的类别是Vitality(83/100),最低的是AI Readiness(57/100)。 最近一次更新在 2 天前。 近期的大部分工作由 1 位贡献者完成。

80
总分 / 100
优秀

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

80
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

加权总体分 68 经校准后在公布的指数量表上为 80(记录校准 2026-08-02)。

所有权

Daniel Fry个人账户
143 关注者33 个公开仓库始于 2021年12月@jpmorganchase

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmvitest-native0.9.041,3021511 天前vitestreact-nativetestingmockvitepluginexporeact

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

83优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 2 天前
6.9/36提交节奏 — 52 周中有 10 周有提交
18/18提交量 — 最近一年 141 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year141
human_commit_share0.94
days_since_last_push2
active_weeks_last_year10

发布纪律

100卓越
评分方式
27/27有发布版本 — 已发布 12 个发布版本
36/36发布时效 — 最近一次发布版本于 11 天前
27/27发布节奏 — 约每 15.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count12
latest_release_tagv0.9.0
releases_from_tags
days_since_latest_release11
mean_days_between_releases15.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

57中等 · 占总体的 17%

流行度与采用

26存在风险
评分方式
25.6/60星标 — 39 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars39
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

77良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
readme_badges0
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template
评分方式
61.5/80月度下载量 — npm 合计每月 41,302 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesvitest-native
dependents
ecosystemsnpm
total_downloads
monthly_downloads41,302
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

58中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.5/22.5提交分布 — 头号贡献者编写了 98% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.978
评分方式
42/42议题解决 — 100% 的议题已关闭
22.6/30PR 接受 — 已裁定的 PR 中 92/122 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs92
open_issues0
closed_issues5
prs_merged_7d12
prs_decided_7d14
prs_merged_30d42
prs_decided_30d49
issue_closed_ratio1
closed_unmerged_prs30
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
15.5/25所有者影响力 — danfry1 有 143 位关注者
20.5/25既往记录 — 33 个公开仓库,账户约 4 年
所用输入
followers143
owner_typeUser
is_verified
owner_logindanfry1
public_repos33
account_age_days1,702
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 11 天前
20/20版本历史 — 15 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesvitest-native
ecosystemsnpm
any_deprecated
min_days_since_publish11

工程质量

基础的工程与文档实践是否到位?

71良好 · 占总体的 19%

工程实践

68良好
评分方式
24/24CI 工作流 — 8 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

75良好
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://danfry1.github.io/vitest-native/
10/10仓库描述
10/10主题标签 — 12 个主题标签
10/10Wiki
所用输入
topicsexpo, jest, mocking, react, react-native, react-native-testing-library, testing, testing-library, typescript, unit-testing, vite, vitest
has_wiki
homepagehttps://danfry1.github.io/vitest-native/
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

74良好 · 占总体的 16%

安全态势

67良好
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
3.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6.7
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages8
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:vitest-native@0.9.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 8 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

57中等 · 占总体的 4%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
15/15机器可读文档(llms.txt) — 存在 llms.txt
40/40可读的提交历史 — 94 次人类提交中有 94 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — apps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 6 次为自动依赖更新
7/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsapps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0.06
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.9/55可控的文件大小 — 采样的 389 个源文件中有 1 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes63,039
source_files_sampled389
oversized_source_files1
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example
所用输入
example_dirsexample
has_mcp_signal
api_schema_files

关键数据

39GitHub 星标
3贡献者
141最近 12 个月提交数
2距最近推送天数
12发布版本数
1巴士系数(bus factor)
0开放议题
npm软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

更多细节

OpenSSF Scorecard 6.7 / 10
6.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-08-05 08:27 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
7Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 7
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
1Vulnerabilities9 existing vulnerabilities detected
直接依赖 2
注册表软件包版本约束清单文件
npmflow-remove-types^2.322.0packages/vitest-native/package.json
npmmagic-string^0.30.21packages/vitest-native/package.json
全部依赖 61

来自 GitHub 依赖图的完整解析依赖集合:2 个直接依赖与 59 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
npmflow-remove-types^2.322.0直接
npmmagic-string^0.30.21直接
npm@babel/core7.29.7间接
npm@babel/core^7.29.7间接
npm@babel/runtime7.29.7间接
npm@changesets/cli2.30.0间接
npm@consumer/ui*间接
npm@gorhom/bottom-sheet5.2.14间接
npm@react-native-vector-icons/common13.0.1间接
npm@react-native-vector-icons/material-icons13.1.2间接
npm@react-native/babel-preset0.83.9间接
npm@react-native/babel-preset0.85.3间接
npm@react-native/babel-preset0.86.0间接
npm@react-native/babel-preset^0.85.3间接
npm@react-navigation/native7.2.5间接
npm@react-navigation/native-stack7.16.0间接
npm@shopify/flash-list2.3.2间接
npm@testing-library/react-native12.9.0间接
npm@testing-library/react-native13.3.3间接
npm@testing-library/react-native14.0.0间接
npm@testing-library/react-native^12.9.0间接
npm@types/node25.3.5间接
npm@types/react19.2.14间接
npm@vitest/coverage-v84.1.9间接
npmbabel-jest29.7.0间接
npmexpo56.0.11间接
npmexpo-constants56.0.16间接
npmexpo-constants56.0.18间接
npmexpo-status-bar56.0.4间接
npmjest29.7.0间接
npmjest-environment-node29.7.0间接
npmoxc-minify0.134.0间接
npmoxfmt0.36.0间接
npmoxlint1.51.0间接
npmreact19.2.4间接
npmreact^19.2.3间接
npmreact-native*间接
npmreact-native0.83.9间接
npmreact-native0.84.1间接
npmreact-native0.85.3间接
npmreact-native0.86.0间接
npmreact-native^0.86.0间接
npmreact-native-gesture-handler3.0.0间接
npmreact-native-keyboard-controller1.21.11间接
npmreact-native-reanimated4.3.1间接
npmreact-native-safe-area-context5.8.0间接
npmreact-native-worklets0.9.1间接
npmreact-test-renderer19.2.4间接
npmreact-test-renderer^19.2.3间接
npmsyncpack15.3.1间接
npmtest-renderer1.2.0间接
npmtest-renderer^1.2.0间接
npmtsdown0.21.10间接
npmtypescript6.0.3间接
npmvite6.4.3间接
npmvite^6.4.2间接
npmvite^7.3.2间接
npmvite^8.0.5间接
npmvitepress2.0.0-alpha.17间接
npmvitest4.1.8间接
npmvitest4.1.9间接
依赖安全公告 0

安装 npm:vitest-native@0.9.0 会引入 8 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "icon": {
      "bytes": 553,
      "width": 64,
      "height": 64,
      "rejected": [],
      "collected": true,
      "media_type": "image/svg+xml",
      "source_url": "https://danfry1.github.io/vitest-native/favicon.svg",
      "source_type": "homepage",
      "content_hash": "cb47013a4e817f67ecb7d04d62493dfc60fa75d17cba945e4cc06d3d40b9566d",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [
        "expo",
        "jest",
        "mocking",
        "react",
        "react-native",
        "react-native-testing-library",
        "testing",
        "testing-library",
        "typescript",
        "unit-testing",
        "vite",
        "vitest"
      ],
      "is_fork": false,
      "size_kb": 1546,
      "has_wiki": true,
      "homepage": "https://danfry1.github.io/vitest-native/",
      "languages": {
        "CSS": 2020,
        "JavaScript": 255629,
        "TypeScript": 1366256
      },
      "pushed_at": "2026-08-03T04:33:01Z",
      "created_at": "2026-03-07T20:54:06Z",
      "owner_type": "User",
      "updated_at": "2026-08-02T21:20:47Z",
      "description": "Test React Native with Vitest — against real React Native, or a fast mock. One plugin, zero config.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://danfry.dev",
      "name": "Daniel Fry",
      "type": "User",
      "login": "danfry1",
      "company": "@jpmorganchase",
      "location": "London",
      "followers": 143,
      "avatar_url": "https://avatars.githubusercontent.com/u/95628792?v=4",
      "created_at": "2021-12-06T13:17:36Z",
      "is_verified": null,
      "public_repos": 33,
      "account_age_days": 1702
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-24T22:10:41Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-26T11:44:29Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-21T20:02:13Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-14T16:32:39Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-14T15:33:37Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-13T17:23:31Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-11T20:46:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-11T20:39:48Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-03-10T21:45:43Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-03-08T14:03:48Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-03-08T13:04:33Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-07T22:47:58Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4285a779ceb7e2e61ced85de28cca2b679030845",
          "body": "Package auto-detection walked manifests UPWARDS from the run root. In a\nworkspace the run root is frequently above the package under test — Nx invokes\ntasks from the workspace root, and Vitest's root follows the working directory —\nso the app's own dependencies live in a manifest that walking up nev\n[…]\noot being the member itself, and a\nworkspace with no members configured. Removing the member expansion fails three\nof them and both root-run fixture assertions; ignoring pnpm-workspace.yaml fails\none.",
          "is_bot": false,
          "headline": "fix(native): detect the packages a workspace member declares (#127)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T21:20:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccf588a312c1a8d1bf0f161df152f7d0aad1fa46",
          "body": "…nge (#126)\n\n* fix(native): restore the full named-export surface of auto-detected packages\n\nNode decides a CommonJS module's named exports with cjs-module-lexer, which\nreads the source statically and stops at shapes it cannot follow. For ordinary\nhand-written CommonJS:\n\n  module.exports = { Banner(\n[…]\n13 back-compat legs:\nthe markers themselves, waitFor under vi.useFakeTimers, findBy* under\njest.useFakeTimers, and waitFor when the timer is never advanced. Verified\npassing on RNTL 13.3.3 and 14.0.0.",
          "is_bot": false,
          "headline": "test(native): pin RNTL's fake-timer behaviour across the supported ra…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T21:05:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b773a2d95d2181ed2d053ccce621355f67624a77",
          "body": "…ackages (#125)\n\nNode decides a CommonJS module's named exports with cjs-module-lexer, which\nreads the source statically and stops at shapes it cannot follow. For ordinary\nhand-written CommonJS:\n\n  module.exports = { Banner({ label }) {}, renderCount: () => n };\n\nNode reports [\"Banner\", \"default\", \"\n[…]\nees — test graph \"mocked-os\", library \"ios\".\n\nThe package budget is re-baselined to ~5% above the measured artifact, which is\nwhat its own policy asks for, rather than left to fail on the next change.",
          "is_bot": false,
          "headline": "fix(native): restore the full named-export surface of auto-detected p…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T21:04:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6cb4583a020566001a6f22f2d22d38dd107719e",
          "body": "…odule (#122)\n\n`jestMockTransform()` wraps each `jest.mock` factory so its return passes\nthrough Jest's CommonJS interop, and the wrapper handled a synchronous return\nonly. An async factory — or any factory returning a promise — handed the promise\nitself to the interop, where it matched the object b\n[…]\nexporting shapes, and two\nintegration cases in the hoisting suite — a declared-async factory and one\nreturning a promise without being declared async, since the latter cannot be\ndetected from the AST.",
          "is_bot": false,
          "headline": "fix(jest-compat): apply mock interop to an async factory's resolved m…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1c973da6fce2ca221dcfe86a1f6b81e2e724a40",
          "body": "`resolve.extensions` replaces Vite's default list wholesale, so anything\nmissing from it stops resolving. `json` was missing while Metro treats it as a\nsource extension: `import config from './config'` beside a `config.json` worked\nin the app and failed in the test with \"Cannot find module\".\n\nThe or\n[…]\n presets, which import vitest at module scope, and vitest\ncannot be required from CommonJS. Every declared runtime entry is now loaded,\nwith those three recorded explicitly and a stale record failing.",
          "is_bot": false,
          "headline": "fix(native): resolve .json, and try extensions in Metro's order (#121)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0bee72639f7b062bb8bc603b96433f8b881ef15e",
          "body": "…#120)\n\nA preset shadows a package: under the native engine the real source never\nloads, so whatever the preset lists in `exports` becomes that module's\nnamed-export surface. Four presets declared names the real package has never\nexported, making the mock more permissive than reality — code importin\n[…]\nrather than\nproducing false violations, and the set of packages the gate must measure is\nnamed rather than counted, so a package that stops resolving fails instead of\nquietly dropping out of coverage.",
          "is_bot": false,
          "headline": "fix(presets): stop declaring exports the real package does not have (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a0dc69a14ed103f1930a08ae419d04c345b17e1",
          "body": "…#119)\n\n* feat(presets): cover the native-stack surface in the screens preset\n\nA real native-stack never reached onReady, so the screen stayed empty with nothing\nthrown, until the reporting project shipped its own mock. The preset declared 12\nexports where the package has 26.\n\nThe gap was closed aga\n[…]\nl's flags — found 27 runtime exports where the\nregex found 26, and separated 76 type-only exports the regex would have reported\nas missing surface.\n\nSo the count in this PR was seventeen, not sixteen.",
          "is_bot": false,
          "headline": "feat(presets): cover the native-stack surface in the screens preset (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b62e24ffaa5de4044659fcf98a3385f983ef06fc",
          "body": "…ry (#118)\n\n* fix(cli): resolve doctor from the run's root, not the working directory\n\nPeers and engine detection resolved from wherever the command was typed. In a\nworkspace that is frequently not where the Vitest config lives, and under pnpm a\npackage's node_modules holds only its declared depende\n[…]\nd pnpm's isolation, and a hand-built pnpm-shaped layout showed that a\nworkspace package CAN still reach a root-declared dependency by walking up. The\ndirection that actually fails is the opposite one.",
          "is_bot": false,
          "headline": "fix(cli): resolve doctor from the run's root, not the working directo…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4be3eabbedc52c492c19ba8f7a1f91d938d75dff",
          "body": "…e rest (#117)\n\n`presets` accepted only an array, and providing one replaced auto-detection\nentirely. A project needing to drop a single preset — the navigation one, say,\nbecause its stub means a real NavigationContainer never fires onReady — had to\nenumerate every other detected preset by hand. Tha\n[…]\nto\nknow what was switched off, since detection happens there — it now receives the\ndisabled names and subtracts them.\n\nCeilings match the ones in the resolver-alignment branch so the two do not drift.",
          "is_bot": false,
          "headline": "feat(presets): switch one auto-detected preset off without listing th…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44432f0b59df6b7d926180edeee6005bf646d211",
          "body": "…#116)\n\nJest resolves `jest.requireActual('../thing')` against the calling module. The shim\nbacked it with one createRequire anchored at the project root, so bare specifiers\nworked and relative ones escaped the source tree entirely — MODULE_NOT_FOUND with a\nrequireStack pointing at <projectRoot>/pac\n[…]\nserted the old behaviour, with a comment describing the root\nanchoring as a property rather than the bug it was. It now uses a path relative to\nitself, which is what the same code would do under Jest.",
          "is_bot": false,
          "headline": "fix(jest-compat): resolve relative requireActual against the caller (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:41:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "415070d9f0b10a3feffe2dc8696d1895b3745077",
          "body": "* fix(ci): run the hot soak from the root its configs declare\n\nThe soak generates test files under the package root, writes configs that set\n`root` to the package root, and ran vitest with the working directory set to the\ngenerated directory instead. The include globs are written relative to the\npac\n[…]\ntripping a latent npm bug. npm 11\ninstalls every fixture.\n\nReproduced locally against npm 10.9.2 and confirmed fixed against npm 11, on\nboth the fixture with the packed tarball and the one without it.",
          "is_bot": false,
          "headline": "fix(ci): repair two upstream-drift failures on main (#124)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:40:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "599d0e044951552ef7d0c55e3d225a17f435326a",
          "body": "* fix(native): make Vite resolve format-only fields the way Node does\n\nThe native engine runs two module systems, and a package can end up in both with\nseparate module-level state. Vitest forwards resolve.conditions to the worker's\nNode, so `exports`-based packages already agree; legacy top-level fi\n[…]\n mine has reached CI without the static\ngates being re-run after the last edit. They take seconds; the loop that misses\nthem is running the suites, deciding the change is good, and then editing again.",
          "is_bot": false,
          "headline": "fix(native): give React Native ecosystem packages a single owner (#115)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-08-02T20:02:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69c761b1b2838f4fed5ec5b388800e0a5263cfd9",
          "body": "…#113)\n\nThe native engine runs two module systems. Vite resolves the test graph, and\nNode's CJS resolver serves everything externalized. The plugin points Vite at\nReact Native's fields — react-native, module, jsnext:main, jsnext — and `main`,\nwhich is all Node's resolver consults, is not among them.\n[…]\nssed the case entirely, since the\nreproducing package is not a declared dependency and so is never a candidate for\ninlining.\n\nThis is a diagnostic. Making the two resolvers agree is a separate change.",
          "is_bot": false,
          "headline": "feat(native): report a package that resolves to two different files (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-27T20:26:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9360e8191ab5c39c1d3e005ace8f83a873d34bf9",
          "body": "…umer (#111)\n\nThe entry said the classes were \"exported for typed use alongside an\nisVitestNativeError guard\". They are not: there is no vitest-native/errors entry\npoint and src/index.ts does not re-export them, so nothing in that sentence is\nreachable from an installed package.\n\nIt also implied `co\n[…]\ne main process.\n\nWhat a consumer actually gets is the error `name`, which does survive that\ncrossing. The entry now says that, and records the export as an open decision\nrather than a shipped feature.",
          "is_bot": false,
          "headline": "docs(changeset): describe what the error classes actually give a cons…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-27T20:26:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddc9a85c256c7c3097153a3626a226cb933f77aa",
          "body": "Releases are cut from the changeset queue, so a change under\npackages/vitest-native/src/ with no entry reaches users with no changelog line and\ncontributes nothing to the version bump. Nothing checked for it.\n\nThe gap was measured, not supposed. Of thirteen pull requests opened in one\nsession, exact\n[…]\ncases that\nmatter are unit-tested — including that neither .changeset/README.md nor\nconfig.json counts as a changeset, since those live there permanently and would\notherwise satisfy the check forever.",
          "is_bot": false,
          "headline": "ci: require a changeset when shipped source changes (#109)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:35:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44679003b00afc16157faa8acb7ae92c84834162",
          "body": "* fix(ci): keep the resolution check active where it matters\n\nThe published surface is eleven `exports` subpaths; the consumer gate imports\nthree. The rest were covered only by `@arethetypeswrong/cli`, which ran with\n`--ignore-rules no-resolution`.\n\nThat ignore was there for node10 — TypeScript's pr\n[…]\nrmittently is worse than one that is merely narrow: a\npackage whose ./presets points at a non-existent file exits 1 and reports \"node16\n(from ESM): Resolution failed\", and the current package exits 0.",
          "is_bot": false,
          "headline": "fix(ci): keep the resolution check active where it matters (#107)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:34:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3189ff915f9543cd2e78de139d1e3df9c9a1b3c8",
          "body": "* feat(errors): give thrown errors a class and a stable code\n\nThe only way to tell a vitest-native failure from an arbitrary crash was a\n`[vitest-native]` prefix in the message, and 12 of 33 throws did not carry one. Failures\nnow raise VitestNativeError or VitestNativeTypeError with a stable `code`,\n[…]\ne position, reaching 839470\nagainst a ceiling of 840000.\n\nPull request CI tests the branch merged into the base as it stood when the run\nstarted, so two branches open at once never measure each other.",
          "is_bot": false,
          "headline": "feat(errors): give thrown errors a class and a stable code (#110)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:34:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04a2fdad8f535fa94a085f1586ee388ff4e8e398",
          "body": "…exactly (#108)\n\n* fix(build): give the package budget floors, and check the export map exactly\n\nEvery limit in package-budget.json was an upper bound, so the check only noticed\nthe package growing.\n\nRun against an unbuilt tree it reported \"OK files: 8 / 85\" and exited 0 — a budget\nthat passes while\n[…]\ny left thin for exactly this\nreason. Unpacked was in the same position at 828154 against 830000.\n\nBoth raised once, keeping the same small headroom rather than buying room for\nchanges not yet written.",
          "is_bot": false,
          "headline": "fix(build): give the package budget floors, and check the export map …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a027071a3ec0c1f9dc064a4fa12b62861b7bf1c2",
          "body": "…text (#105)\n\n* test(native): execute the remediation advice instead of matching its text\n\nWhen Node cannot parse an untranspiled node_modules file, the native engine\nreplaces the bare \"Unexpected token '<'\" with an explanation naming the package\nand the fix:\n\n    reactNative({ transform: ['<pkg>'] \n[…]\ned \"No test\nfiles found, exiting with code 1\".\n\nEvery other config in this directory uses a relative glob for that reason, and\ncrosscheck/vitest.config.mts carries a comment recording the same hazard.",
          "is_bot": false,
          "headline": "test(native): execute the remediation advice instead of matching its …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:19:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33c5dda55778a1d56d3a51b81100894a66123733",
          "body": "The release workflow fires on any v* tag from any commit, and the documented flow tags a\nSHA by hand after merging the release PR. Tagging the wrong one — a commit still on a\nbranch, or a stale commit from before a fix landed — publishes it. Nothing else catches\nthat: the tag/version check only comp\n[…]\nheckout takes full history,\nbecause the comparison is invisible to the default shallow fetch.\n\nVerified against real commits in this repository: a branch head is rejected, a commit on\nmain is allowed.",
          "is_bot": false,
          "headline": "ci(release): refuse to publish a tag that is not on main (#98)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:18:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79e8b163d6ea40da5de921f748b144e1a22104da",
          "body": "…tually used (#106)\n\n* fix(cli): make doctor's config check reflect whether the plugin is actually used\n\n`doctor` exists to diagnose broken projects, so reporting \"No blocking problems\nfound\" on one that cannot run a test is its worst failure mode. The config check\nwas the substring test `content.in\n[…]\nesbuild does not\nresolve from a project root under the current Vite. That failure is loud on the\nfirst run, unlike the ones above, which are silent.\n\n* chore: add changeset for the doctor config check",
          "is_bot": false,
          "headline": "fix(cli): make doctor's config check reflect whether the plugin is ac…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:18:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "942811933c5e7d0b7b7cc7b686678c0c980abe76",
          "body": "* fix(native): report when the precompiled registry cannot be built\n\nThe registry collapses React Native's ~440 per-file module loads into one\ncompiled file. When it cannot be built the engine falls back to per-file\nloading, which is correct — nothing fails and no result changes — and that is\nwhat m\n[…]\nthe test passed with the\ncollapse deleted. It now drives the warning directly with a multi-line cause,\nand fails when the collapse is removed.\n\n* chore: add changeset for the registry fallback warning",
          "is_bot": false,
          "headline": "fix(native): report when the precompiled registry cannot be built (#104)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:18:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e599ad0d2204cce32032a6efe5b3dc6cf6c96780",
          "body": "…#103)\n\nplugin-options.md opens with \"All options are optional. `reactNative()` with no\narguments works for any real RN app\" and then shows every option written out, which\nreads as the defaults spelled in full. One line made it materially different:\n\n    presets: [],           // Third-party library\n[…]\nuto-detection to find something first, so it cannot pass by both sides being empty,\nand requires the block to stay literal-only — a defaults reference a reader cannot\ncopy verbatim is itself a defect.",
          "is_bot": false,
          "headline": "docs(options): stop documenting a config that disables every preset (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:18:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee3208384a78cf7b351a5ab5ac27d8d51d4eb57a",
          "body": "…ne (#102)\n\nThree pages tell readers to verify the fidelity claim themselves:\n\n  index.md       \"Anyone can run it (`bun run crosscheck`)\"\n  fidelity.md    \"Reproduce it yourself: `bun run crosscheck`.\"\n  comparison.md  \"It's reproducible — clone the repo and run `bun run crosscheck`.\"\n\nNone of them\n[…]\nith instructions rather than falling through to the unresolved import.\n\nThe decision is split into scripts/ensure-built.mjs with its dependencies injected,\nso it can be tested without running a build.",
          "is_bot": false,
          "headline": "fix(crosscheck): make the published reproduce command work from a clo…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:17:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "daa3e207caae1eda35a1b29c0e453b713bfb9c71",
          "body": "…m (#101)\n\nThree ways the published matrix page misstated what CI had gated.\n\nRows rendered only the RESOLVED Vitest version. The `locked` and `latest-supported`\ncells normally resolve to the same version, so the two rows came out byte-identical:\nthe live page listed every React Native version twice\n[…]\names the missing cells, and\nexplains why they can be absent.\n\nThe resolved-version fallback no longer restates the axis name when a report body\nlacks a version, since the flavor is now its own column.",
          "is_bot": false,
          "headline": "fix(fidelity): make the matrix page describe the run it was built fro…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:17:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a2fe905b739fe0dabc4aa0091d92d4ca512fd66",
          "body": "…#100)\n\nThe published fidelity numbers are generated from however many probes reported,\nwith no floor. Probes can stop registering without anything going red — an import\nthat throws, a describe that never runs, a helper that returns early — and the\narithmetic downstream stays honest while the eviden\n[…]\nlished number an\nexplicit and reviewable act rather than a side effect of regenerating.\n\nThe floor lives in the badge rather than a new file so it cannot drift away from\nthe number actually published.",
          "is_bot": false,
          "headline": "fix(fidelity): treat a shrinking cross-check corpus as a regression (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:17:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da5c8cc083ea3d6c88af0f32571d86a4d2cc415c",
          "body": "…(#99)\n\nThe external-app ratchet has failed on its last two scheduled runs, and the tracking\nissue it opened says \"(infra?)\" — with the question mark — because the workflow could not\ntell what had happened.\n\ncollectCounts returns null when a run produces no JSON to measure, and the caller never\nchec\n[…]\n blank line within 400 characters of the call and so matched only one of the two sites,\nwhich would have reported success while half the code went unchecked. It now fails when\neither guard is removed.",
          "is_bot": false,
          "headline": "fix(bakeoff): classify an unmeasurable run instead of crashing on it …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:17:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f21986f629777b11446f6c2491088405609b2853",
          "body": "… (#96)\n\n* fix(mocks): close the Animated surface gaps against real React Native\n\nDiffing the mock's member list against real React Native's, rather than testing\nbehaviour, found fourteen differences in the Animated surface. A behavioural probe\ncannot catch an absent member: nothing exercises it, so\n[…]\nady\ncommitted, so this only changes what Windows produces. Confirmed by comparing the two\norderings directly rather than by inference: they differ, and the sorted order is the\none already on the page.",
          "is_bot": false,
          "headline": "fix(mocks): close the Animated surface gaps against real React Native…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-26T20:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a70c9f232ab04b2e975df8a46d09001aa6803923",
          "body": "…rk found reviewing it (#95)\n\n* feat(native): give the hot runtime real per-file module isolation\n\nThe hot runtime kept externalized modules resident across test files and undid their\ndamage afterwards, from a boot snapshot plus a call-stack heuristic attributing each\nlistener to import or test phas\n[…]\nification ran from inside the package, which is the one place the\nomission is invisible.\n\nAlso checks the other direction: all 17 `bun run` invocations in ci.yml now resolve\nagainst the root manifest.",
          "is_bot": false,
          "headline": "fix(native): per-file hot isolation, plus the correctness and gate wo…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-25T14:38:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a2cd63607d4da0093d88cdb4562dabe34a7cfa2",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.9.0 (#94)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T22:04:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac70decbae2582c5b20299eeaad400ddb561a94a",
          "body": "…') work (#93)\n\n* perf(native): precompile React Native's require graph into a lazy module registry\n\nThe native engine re-instantiated React Native's ~440-module graph for every\nisolated test file. Measured on RN 0.86, that cost ~59ms for a typical test's\nslice of RN and ~110ms for the full public s\n[…]\n roughly 10% above the new actuals. The guardrail's purpose is to\ncatch unintended growth, which it still does; it is not meant to pin the artifact to\na size measured before a reviewed feature landed.",
          "is_bot": false,
          "headline": "perf(native): precompile React Native, and make vi.mock('react-native…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T22:00:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4a4ec0731615e492fac8170757b8f48165bd95e",
          "body": null,
          "is_bot": false,
          "headline": "harden validation signals and package budgets (#90)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T21:55:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e35583450e80e96c9f31d415b21ade19b1466e7",
          "body": "…ry file read/execute) (#80)",
          "is_bot": false,
          "headline": "fix(deps): bump bench vitest 4.0.18 -> 4.1.9 (GHSA: UI server arbitra…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T18:26:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e47c10bb0c1287bbf83de428ab899aaccbb6036f",
          "body": "Bumps the production-dependencies group with 1 update in the / directory: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types).\n\n\nUpdates `flow-remove-types` from 2.321.0 to 2.322.0\n- [Release notes](https://github.com/facebook/flow/releases)\n- [Changelog](https\n[…]\nte:semver-minor\n  dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump flow-remove-types (#91)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-24T18:26:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3b08c194b2c49380b6524bc7e6d095e3f2ca2799",
          "body": "…ure points (#87)\n\n* feat(dx): actionable errors + engine transparency at migration failure points\n\nUntransformed node_modules JSX/Flow/TS SyntaxErrors now name the owning\npackage and the transform:[...] fix; Babel transform crashes are decorated\nwith file/platform/package at the single choke point;\n[…]\nanspiled JSX and asserts the explained error (package name, the\ntransform:[...] fix, chained cause) — the require-hook wiring was previously\ncovered only by unit tests of the pure explainer functions.",
          "is_bot": false,
          "headline": "feat(dx): actionable errors and engine transparency at migration fail…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T18:26:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbbfc5d7359dfc3cf2e627d06600f5d2f3dd9b82",
          "body": "…s) (#89)\n\nexpo's Expo.fx requires async-require/messageSocket whenever\n__DEV__ && globalThis.expo, and the module throws at load time when the\nbundle wasn't served over HTTP — taking down any suite that imports an\nexpo-* package under the native engine. Its only job is a devtools\nwebsocket to a liv\n[…]\nlate bake-off: login-form suite goes\nfrom import-time failure to passing; 34/40 → 38/40 overall (the two\nremaining failures pre-date this change and are bottom-sheet mock\ncompleteness, not Expo-init).",
          "is_bot": false,
          "headline": "feat(native): stub Expo's dev-server messageSocket (unblocks Expo app…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T18:23:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19fc38175e0339a1dfbc46b4ba98fb5c1002480f",
          "body": "Split PRs break lockstep-versioned actions: github/codeql-action\ninit/analyze/upload-sarif must move together, or each individual PR\nfails Analyze with a config/runner version mismatch (seen on #81/#82).\nGrouping also collapses the weekly actions noise into a single PR.",
          "is_bot": false,
          "headline": "ci: group all github-actions dependabot bumps into one PR (#88)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-24T18:23:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d313e71115f0d92bf49f432ecae5291743c130d9",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#57)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:32:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bec216c09bbf144de27a8a17f1ed4539834f3d0e",
          "body": "Bumps the production-dependencies group with 1 update in the / directory: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types).\n\n\nUpdates `flow-remove-types` from 2.318.0 to 2.321.0\n- [Release notes](https://github.com/facebook/flow/releases)\n- [Changelog](https\n[…]\nte:semver-minor\n  dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump flow-remove-types (#56)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-09T21:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ce2b31123d4b762aef49f873fa519ddb7ce527a",
          "body": null,
          "is_bot": false,
          "headline": "feat(trust): weekly real-app bake-off ratchet (stock + hot) (#78)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:31:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a3bceadef37b20f11d2c12fb6937eda381513c5",
          "body": "* feat(cli): npx vitest-native init | doctor | migrate\n\nThe docs previously asked migrating users to be the codemod: the jest-compat\nconfig block was copy-pasted across four doc pages, environment problems\n(missing babel preset, RNTL 14 on Node < 22.13, absent peers) surfaced as raw\nruntime failures\n[…]\nle-character alternatives keep the repetition\nunambiguous and linear while preserving the no-early-close property for\nleading nested groups. Verified: 50k-char unclosed input resolves in\nmilliseconds.",
          "is_bot": false,
          "headline": "feat(cli): npx vitest-native init | doctor | migrate (#75)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:31:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c0d5f6770d2b4a905ce3348164579858f2ff7472",
          "body": "…ports (#74)",
          "is_bot": false,
          "headline": "feat(trust): publish the per-version fidelity matrix from CI's own re…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:30:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6a6ae3f2f48b3711a442cb879235ea3a3462b92",
          "body": "…#76)\n\n* feat(mock): Animated as a live node graph with subscribing wrappers\n\nThe mock's Animated was a snapshot system: numeric interpolate() returned a\ndead value computed at call time (string interpolation was live via closure —\nthe two paths disagreed), add/multiply/&c coerced node operands to 0\n[…]\ndren ≤ 1 after five re-renders),\npost-unmount consumer emptiness, removeAllListeners keeps the mounted\ncomponent updating while user listeners stop. 158 Animated tests + 78/78\ncrosscheck probes green.",
          "is_bot": false,
          "headline": "feat(mock): Animated as a live node graph with subscribing wrappers (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:28:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9531800cf1ea5b0d08f3a5b17b2d446ede5998af",
          "body": "… bound matrix cells (#72)",
          "is_bot": false,
          "headline": "ci: cancel superseded runs, cache bun downloads and transform output,…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:25:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b1c39692fa831bdabe12eb171dcdf8d9bba6497",
          "body": "…l/core (#73)\n\n* perf(native): project-local content-keyed transform cache, lazy @babel/core\n\n- Move the transform disk cache from os.tmpdir() to the project's\n  node_modules/.cache/vitest-native/ (tmpdir fallback when node_modules is\n  absent/unwritable). tmpdir is ephemeral on CI runners — every j\n[…]\n subprocess\n\nWindows absolute paths (D:\\...) are rejected by Node's ESM loader as an\nunsupported URL scheme; pathToFileURL makes the inline script portable.\nCaught by the Windows leg of the full gate.",
          "is_bot": false,
          "headline": "perf(native): project-local content-keyed transform cache, lazy @babe…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:24:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c567c15000106d691a4f1d920c0c6f77aa75763",
          "body": "…ride clearing (#70)\n\nUnmocked native modules were served by a Proxy that minted a fresh stub\nobject on every property access and whose get trap never consulted the\ntarget. Consequences: NativeModules.Foo !== NativeModules.Foo, and\nvi.spyOn(NativeModules.Foo, 'method') silently recorded nothing — th\n[…]\nThe leak's expression is environment-dependent, but\n  the clear-then-restore order is strictly safer.\n\nUnder the default engine each file gets a fresh process, so the reset\nregistry never fires there.",
          "is_bot": false,
          "headline": "fix(native): identity-stable, spy-able turboStubs with hot-reset over…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:23:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "091a57276bb1c53a1227b36bcc373842ff8a25ab",
          "body": "…trip guard (#71)\n\n* fix(hardening): prerelease peer versions, asset-stub escaping, Flow-strip guard\n\n- validate.ts: strip prerelease/build metadata before version comparison —\n  \"4.0.0-beta.3\" parsed to [4, NaN, …] and failed the minimum check, throwing\n  the unsupported-peer startup error for inst\n[…]\nnly prereleases sharing the minimum's major.minor failed, not all\nprereleases); the quote-escaping test now asserts the emitted literal\nround-trips rather than mirroring the implementation expression.",
          "is_bot": false,
          "headline": "fix(hardening): prerelease peer versions, asset-stub escaping, Flow-s…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:23:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "373a55cb05b33ba0c1702bcef1e9f1ccabc08a1e",
          "body": "…ine reality (#69)\n\n- native-rn-matrix.yml: add the RN 0.86 row. The lockfile has shipped RN 0.86\n  since #38, so the full gate already ran it on every push, but the matrix —\n  which the published fidelity page derives its claim from — still stopped at\n  0.85, publishing an understated range. Add a \n[…]\ns the engine caveat and documents the previously-undocumented\n  setInsets(), plugin-options.md documents the per-project alternative and adds\n  the missing mock-engine-only caveat on the mocks option.",
          "is_bot": false,
          "headline": "docs+ci: sync trust surfaces with the actually-gated RN range and eng…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-09T21:22:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57f155d6090a60e9ce1c1bfd315a7a1d23eacd4c",
          "body": "…t subpath shadowing (#68)\n\n* fix(resolution): leaf-aware subpath imports, real package.json, preset subpath shadowing\n\nThree resolution-fidelity gaps around deep (subpath) imports, all silent\nfailures:\n\n- react-native subpath default exports (mock engine): import Platform from\n  'react-native/Libra\n[…]\nty subpaths are never shadowed — is now\nasserted at the loader and plugin resolution layers, with both packages\nregistered as presets so the pass-through is attributable to the\nutility-leaf exemption.",
          "is_bot": false,
          "headline": "fix(resolution): leaf-aware subpath imports, real package.json, prese…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-02T21:13:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24c5c3c22b8eba7eded35fdf3c019b234222074e",
          "body": "…(#67)\n\nThe fidelity report is rendered by VitePress, which parses Markdown as\nVue. A known-difference description contained a bare `<Text>`, which\nVitePress read as an unclosed HTML element — breaking `vitepress build`\n(and the Pages deploy) since the report began publishing that row.\n\nEscape free-\n[…]\no probe reasons and known-difference rows. The one currently-affected\ncell (<Text>) is updated in the committed page to match the fixed\ngenerator's deterministic output, keeping the drift check green.",
          "is_bot": false,
          "headline": "fix(fidelity): escape Markdown/Vue hazards in generated report cells …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T19:47:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c295660786e2f4e8e1ec5cfb42203873b8de68e",
          "body": "…l runs (#66)\n\nExpand the Migrating from Jest guide with the empirically-derived reality\nof a real migration:\n\n- A 'Known limits' section: assertions coupled to Jest's RN mock internals\n  that can't port under a real-RN engine (jest.spyOn(View.prototype, …),\n  mocks of RN internal submodules, raw so\n[…]\nse error and adding the package to transform (the transformIgnorePatterns\n  replacement), plus vi.mock needing the lib in the Vite graph.\n\nApplied to both the website guide and the packaged docs copy.",
          "is_bot": false,
          "headline": "docs(migration): document known limits + transform-allowlist from rea…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T19:42:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6c4c5b1e70b4958b38db987cf0c7a52789cceec",
          "body": "RN's getDevServer (Libraries/Core/Devtools/getDevServer.js) reads\nSourceCode.getConstants().scriptURL and calls .match() on it. Under the\nnative engine the value was undefined, so getDevServer threw and took down\nany test whose module graph reached it.\n\nReturn a file:// (bundled) URL for the SourceC\n[…]\nsymbolicateStackTrace, DevTools) and third-party SDKs\nfrom believing they're connected to a packager and attempting real network\nI/O against localhost:8081, mirroring the intent of RN's own jest mock.",
          "is_bot": false,
          "headline": "fix(native): provide SourceCode.scriptURL so getDevServer resolves (#65)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T19:30:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a756f6a522974730e73414130e8ed6e94d02a160",
          "body": "Jest suites commonly clone-and-override React Native:\n  const RN = jest.requireActual('react-native'); RN.Platform = {...}\nUnder the native engine RN's index is a facade of lazy getters with no\nsetters, so the assignment threw \"Cannot set property … which has only a\ngetter\" and failed to load the wh\n[…]\ny) facade, assignments are captured so the override\nwins on later reads — matching Jest's mutable module. Only react-native is\nwrapped; its submodules and other packages are ordinary mutable CommonJS.",
          "is_bot": false,
          "headline": "fix(jest-compat): make requireActual('react-native') writable (#64)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T18:32:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d07b7a885c7999b9e7a2177a00c47c8500a3e9e",
          "body": "react-native-worklets is Reanimated's low-level runtime and is also\nimported directly by apps (e.g. `import { scheduleOnUI } from\n'react-native-worklets'`). It ships a Jest mock at\n`react-native-worklets/lib/module/mock` that is ESM ending in\n`module.exports = …`; under the native engine React Nativ\n[…]\nheir worklet synchronously,\nmatching the Reanimated preset's runOnJS/runOnUI convention — and register\nit in the auto-detect map. Worklets-using suites now load and render\nwithout a hand-written mock.",
          "is_bot": false,
          "headline": "feat(native): add react-native-worklets preset (auto-detected) (#63)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T18:20:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e49168ef584c48497efaa750e1d405f00f570175",
          "body": "…ing (#62)\n\n* feat(native): bound hot-runtime memory with a default per-worker ceiling\n\nHot workers keep React Native resident and accumulate ~4 MB per test file\n(RNTL's resident render trees can't be reclaimed across files), so an enabled\nhot runtime with no configured recycling could grow toward O\n[…]\neaking\nthe precedence in plugin.ts would pass unit tests silently. Assert that\nplain hotRuntime:true turns on worker heap reporting (memoryLimit > 0),\nguarding the default-application path end to end.",
          "is_bot": false,
          "headline": "feat(native): bound hot-runtime memory with a default per-worker ceil…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-07-01T17:39:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3dee081170fd4f02a5c390f43696ee7577e830f",
          "body": "… design (#61)\n\n* test(validation): add idiomatic hot-parity oracle (proves hot == default at scale)\n\nAdds a vitest-first validation suite representing how a normal app uses\nvitest-native — host-element queries, userEvent, real Animated, Context,\nFlatList, Switch, real listener/timer hooks — with NO\n[…]\nworkers, so a worker-count cap is still needed (m4).\n- README reframed to lead with parity (the load-bearing evidence) and to note the\n  hand-written suite is a manual snapshot, not yet CI-wired (M4).",
          "is_bot": false,
          "headline": "test(validation): idiomatic hot-parity oracle + de-risk + hot-default…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-30T21:43:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d3840152cd08ff1b765a9d1d3f1b364aec19cfa",
          "body": "…+ corpus 56→75, 3 mock fixes) (#59)\n\n* feat(fidelity): publish the cross-check as a living fidelity report\n\nTurns the behavioral cross-check from an internal CI gate into a published,\nself-updating proof of mock-vs-real-React-Native parity.\n\n- crosscheck.mjs writes an ephemeral combined report (RN \n[…]\ner-facing mock behavior fixes (Pressable function\nstyle/children, processColor undefined for unparseable input) and the new\nfidelity report so they appear in the changelog and trigger a patch release.",
          "is_bot": false,
          "headline": "feat(fidelity): publish the cross-check as a living fidelity report (…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-30T20:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ec60b637fc9af6984295ba3062a027870ffb380",
          "body": "…resident-state limitation (#55)\n\n* fix(native): bound hot-runtime memory and surface inactive recycling\n\nUnder the hot runtime, React Native Testing Library is loaded once and\nstays resident, so its auto-registered `afterEach(cleanup)` only takes\neffect for the first test file. Every later file's m\n[…]\nuites back to\nthe default engine, and explains why the mode stays opt-in and experimental\n(a per-file module reset inside a persistent worker is an upstream Vitest\ncapability that does not yet exist).",
          "is_bot": false,
          "headline": "fix(native): surface inactive hot-runtime recycling and document its …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-28T16:36:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9cbee0ec93b4d38f1cc7e90995f0330c37e0735",
          "body": "* docs: use reliable GitHub-hosted avatars for contributors section\n\ncontrib.rocks was timing out (broken image on the README). Replace it with\nGitHub-hosted contributor avatars (always reachable) linking to each profile,\nplus an auto-current link to the contributors graph for the full list.\n\n* docs: drop the heart emoji from the contributors line",
          "is_bot": false,
          "headline": "docs: fix broken contributors image (use GitHub-hosted avatars) (#54)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-26T12:21:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54f3e4c3ba538e172a079d493f4118df1645e8e8",
          "body": null,
          "is_bot": false,
          "headline": "docs: add auto-updating contributors section to the README (#53)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-26T12:11:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04bf9085068c3e220961d185cef6371b537d70eb",
          "body": "* chore: release 0.8.0\n\n* docs: credit @Doko-Demo-Doa for the node_modules path fix in the changelog",
          "is_bot": false,
          "headline": "chore: release 0.8.0 (#52)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-26T11:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b31e3d9c634d6ac7fc094faff958d7e4b553639f",
          "body": "* test: await RNTL render/fireEvent/act for RNTL 14 async APIs\n\nRNTL 14 makes render/renderHook/fireEvent/act/rerender/unmount async.\nAwait them across the test suites (back-compatible with RNTL 12/13, where\nawait on a non-Promise is a no-op). Bump devDep RNTL to 14 + add the new\ntest-renderer/react\n[…]\n=12 <15, so test the floor too: add an RNTL 12 Node 20\nleg alongside RNTL 13. Continuously proving the full declared range (12, 13, 14)\nkeeps the compatibility claim backed by CI rather than asserted.",
          "is_bot": false,
          "headline": "feat: support @testing-library/react-native 14 (range 12–14) (#51)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-26T11:17:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "489a5360930cdaec06b5848527ca229f97ea87eb",
          "body": "…older (#50)\n\n* fix: update regex patterns to include node_modules for react-native paths\n\n* test(native): guard node_modules-scoped RN path detection + changeset\n\nAdd a regression test asserting React Native is externalized only under\nnode_modules (not in a project named react-native), and a changeset for\nthe fix.\n\n* style: apply oxfmt to native external config\n\n---------\n\nCo-authored-by: Daniel Fry <danf@hotmail.co.za>",
          "is_bot": false,
          "headline": "fix: update regex patterns to include node_modules for react-native f…",
          "author_name": "Quan Pham",
          "author_login": "Doko-Demo-Doa",
          "committed_at": "2026-06-26T10:06:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "067e2aab5fbc6100feda4015a82da0c1fff88081",
          "body": "* feat(presets): add flash-list, bottom-sheet, keyboard-controller\n\nThree native-module libraries the migration bake-offs repeatedly had to mock by\nhand. Each is now auto-detected when installed and shadowed by a self-contained\npreset under both engines:\n\n- @shopify/flash-list: renders its data thro\n[…]\nonstants and assert the full shape. Also clarify the comment: the scrollable\nmembers are backed by the engine's own RN component mocks (equivalent behavior),\nnot literally the library's RN components.",
          "is_bot": false,
          "headline": "feat(presets): flash-list, bottom-sheet, keyboard-controller (#48)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-24T21:15:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0554e5522cb5c147d984d2efce8f9ba0d15859cc",
          "body": "Bumps the production-dependencies group with 2 updates: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types) and [react-native](https://github.com/facebook/react-native/tree/HEAD/packages/react-native).\n\n\nUpdates `flow-remove-types` from 2.317.0 to 2.318.0\n- [Re\n[…]\nte:semver-minor\n  dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump the production-dependencies group with 2 updates (#45)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-24T21:00:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5eaf8cb344aff58807cef24340fe7f617de7c682",
          "body": "…mpile cache (#47)\n\n* perf(native): cache the RN graph's compiled bytecode via Node's V8 compile cache\n\nUnder engine:'native' with per-file isolation, React Native's module graph is\nre-instantiated per test file, recompiling its source to V8 bytecode each time.\nEnable Node's on-disk compile cache (N\n[…]\nve-internals coverage.\n- Note in the source why no atomic-write handling is needed: Node CRC32-validates\n  each compile-cache entry, so a raced write is a cache miss and recompile, never\n  corruption.",
          "is_bot": false,
          "headline": "perf(native): cache the RN graph's compiled bytecode via Node's V8 co…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-24T20:59:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7353f0c118fd3b345cf80a96c1bbc1554cb1c01",
          "body": "changeset version: bump 0.6.1 → 0.7.0, consuming the externalized-resolution\n(minor) and react-native 0.86 exports (patch) changesets into the package\nchangelog.",
          "is_bot": false,
          "headline": "chore: release 0.7.0 (#44)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-21T19:56:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03ea0969a73bcf637d7b7ee5b8d51bdf00789e9b",
          "body": "…rides (#42)\n\nAdds the runtime-issue Troubleshooting entries migrators most commonly hit:\n\n- Large native suites can exhaust a worker's heap (every file loads a full RN\n  renderer); document `poolOptions.threads.memoryLimit` (Vitest recycles a worker\n  once it exceeds the limit) and the experimental\n[…]\nd.\n- How to override an auto-detected preset's mock (vi.mock + spread importOriginal),\n  since presets expose the module to Vitest's graph.\n\nLinks the migration guide's triage step to Troubleshooting.",
          "is_bot": false,
          "headline": "docs: cover large-suite memory, error-boundary noise, and preset over…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-21T19:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b368b19a75529859a6feea0cbfd40953b3a0fa2",
          "body": "…bals, a11y (#40)\n\nFills the remaining native-engine integration gaps (the unit layer in tests/\nalready covers transform/resolve/boundary/preset factories; tests-native covers\ncomponent + preset integration):\n\n- resetAllMocks() actually restores driven Dimensions / color scheme / injected\n  native m\n[…]\n-environment flags, the batched-bridge config).\n- Accessibility queries (getByRole/getByLabelText) and toHaveStyle resolving a\n  StyleSheet ref — core RNTL paths not previously exercised under native.",
          "is_bot": false,
          "headline": "test(native): cover control surface, platform-extension priority, glo…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-21T19:46:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c355c15e8f5274dbac87656c934efb580ab9a40",
          "body": "The module holds module-level state (the in-memory `mem` cache, lazy babel\nhandles) plus a shared disk cache, so 'stateless' was inaccurate. The real point\nis that the loader and require hooks run in separate threads, each with its own\nmodule instance (per-thread in-memory cache), with the disk cache shared across\nthem. State the accurate model.",
          "is_bot": false,
          "headline": "docs(transform): correct the misleading 'stateless' module comment (#41)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-21T19:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37c8123061ac5dbbd4fc5c859d1156f8a8eab092",
          "body": "…ps (#39)\n\n* feat(native): Metro-style resolution for externalized node_modules deps\n\nVitest externalizes node_modules dependencies that Node can import natively, so\nthey load through Node rather than Vite — and Node's resolver has no notion of\nReact Native's Metro conventions. The native engine now\n[…]\nyout, and the cache lifetime matches Vite's own resolution cache (a newly added\nplatform variant is picked up on restart). Behavior is unchanged; only repeated\nresolution of the same base is now O(1).",
          "is_bot": false,
          "headline": "feat(native): Metro-style resolution for externalized node_modules de…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-21T19:46:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a868728cdbca1a50ca51cb4dfc8e66b3fb6afa4",
          "body": "The weekly compatibility check found 10 new stable exports in\nreact-native 0.86 that were not covered by the mock registry.\n\nMock the three real exports so named imports resolve under the mock\nengine:\n- EventEmitter (generic base event-emitter class)\n- useAnimatedColor (returns an Animated.Color)\n- \n[…]\nnd\nrelated) to the compatibility check's known-skipped list, alongside\nthe existing unstable_VirtualView family.\n\nVerified against the real react-native 0.86.0 index: no missing\nstable exports remain.",
          "is_bot": false,
          "headline": "fix(compat): mock react-native 0.86 top-level exports (#38)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-16T18:15:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ebe480c82bf66fe3f81189ed67be5143f1ff906",
          "body": "- changeset version: bump to 0.6.1, add the #32 getter-export ESM facade\n  fix to the package changelog.\n- docs: point the Changelog nav link at the real, changesets-maintained\n  packages/vitest-native/CHANGELOG.md (was pointing at the stale root\n  CHANGELOG.md that only listed 0.1.0).\n- root CHANGELOG.md: replace stale content with a pointer to the package\n  changelog.",
          "is_bot": false,
          "headline": "chore: release 0.6.1 + fix changelog link (#34)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T16:28:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77164e972a143fb47d191ca39b57db4630109215",
          "body": "The #32 merge landed before the Full gate finished and failed format:check\n(loader.mjs not oxfmt-formatted). Formatting only — no logic change.",
          "is_bot": false,
          "headline": "style: oxfmt loader.mjs (fix format:check on main) (#33)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T16:18:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40a51476aa675bba25842a0097b2f5a4416344f0",
          "body": "…med-import getter exports (#32)\n\nReact Native's index exports via lazy getters (module.exports = { get\nAppearance() {…} }), which cjs-module-lexer can't see when Node imports\nthe CJS from the ESM graph — so an externalized ESM dep doing\n'import { Appearance } from \"react-native\"' threw 'does not pr\n[…]\ndule._extensions hook).\n\nRemoves the need for the manual transform:['uniwind'] workaround.\nSurfaced by the obytes bake-off. Regression test + externalized fixture\nincluded (negative-control verified).",
          "is_bot": false,
          "headline": "fix(native): serve RN index as ESM facade so externalized libs can na…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T16:10:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29118357d1e71813f82bb8cf595bae580e0ad402",
          "body": "* docs: update paper bake-off to 625/734 (~85%)\n\nReflects the improved bake-off (runtime monkeypatch of resident RN's\nAnimated/Dimensions recovered ~23 tests). Tighten the remaining-failures\nexamples to the irreducible jest-mock-internal cases.\n\n* docs: add obytes bake-off (34/40) as a second reproducible data point",
          "is_bot": false,
          "headline": "docs: bake-off updates (paper 625/734, obytes 34/40) (#31)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T15:54:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44c217787582444ce7ba050dd3a9ef1c98d08291",
          "body": "Consume pending changesets: vectorIcons preset (minor), Animated host/\nstyle fidelity, native asset require() stub, and the hot-runner Vitest\n4.0.x compat fix (patches).",
          "is_bot": false,
          "headline": "chore: release 0.6.0 (#30)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T15:25:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "476fa6a8659a35de59c4f31ccc23728a8aaa09ae",
          "body": "* docs: add VitePress documentation website\n\nA full docs site under website/, deployed to GitHub Pages, matching the\nVitePress setup used by bonsai-js and reflow-ts.\n\n- Home page with hero, two-engine pitch, and Jest comparison\n- Guide: intro, install, quick-start, engines, how-it-works, plugin\n  op\n[…]\nom/danfry1/vitest-native-bakeoffs): paper's own suite runs\n602/734 (~82%) under engine:native with a config swap + RNTL bump; the\nrest are jest-mock-coupled tests, not bugs. README + homepage + guide.",
          "is_bot": false,
          "headline": "docs: add VitePress documentation website (#28)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T15:22:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50ffc49f3b501369f2122340c8e659f0da74613e",
          "body": "PR #27 switched the hot runner to import TestRunner from \"vitest\" to drop\na 4.1 deprecation warning — but vitest 4.0.x doesn't export TestRunner\nfrom the main entry (only VitestTestRunner via the now-deprecated\n\"vitest/runners\"). That made the hot runner 4.1-only while the package\ndeclares vitest >=\n[…]\n on vitest 4.1 (this repo) and 4.0.18 (bench).\n\nbench: bump vite 6.4.1 -> 6.4.3 to satisfy the package's peer floor\n(>=6.4.2), which is what exposed the regression when re-running the\nscale benchmark.",
          "is_bot": false,
          "headline": "fix(native): restore vitest 4.0.x compatibility in hot runner (#29)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T15:22:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2d78a0d077f7f1755f92243981ac6b5d05761ec",
          "body": "…r (#27)\n\nvitest/runners is deprecated since Vitest 4.1, emitting a warning once per\nworker spawn under the hot runtime. Vitest 4.1 re-exports the identical\nclass as TestRunner from the main entry, so import that instead.",
          "is_bot": false,
          "headline": "fix(native): use non-deprecated vitest TestRunner import in hot runne…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-14T08:54:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3297e5bc628875c3428de126fa40c32ce6f61736",
          "body": "* fix(native): stub asset require() on Node's CJS loader path\n\nA literal require('./logo.png') in an RN component escapes Vite's asset\nhandling and reaches Node's CJS loader, where the binary was compiled as JS\nand threw 'SyntaxError: Invalid or unexpected token', failing the whole file.\n\nThe native\n[…]\n311 -> 317\n(entire vector-icons failure category resolved). vitest-native gates: native 97,\nmock 1240, crosscheck 43/43, typecheck/lint clean.\n\n* chore(deps): exact-pin vector-icons devDeps (syncpack)",
          "is_bot": false,
          "headline": "feat(native): asset require() stubbing + vectorIcons preset (#26)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T21:51:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e333954dca037871c49191a939b5b6f3693a770a",
          "body": "Two fidelity gaps surfaced by the mock-vs-real-RN cross-check:\n\n- Animated.Text rendered a host literally named \"Animated.Text\", so RNTL's\n  queryByText (which only descends into Text hosts) couldn't see its children.\n  createAnimatedWrapper now strips the Animated. prefix and renders the base\n  hos\n[…]\n within(), getAllByRole, toHaveProp, accessibility-value,\nActivityIndicator/KeyboardAvoidingView), which is what caught both bugs.\n\nGates: crosscheck 56/56, mock 1240, native 93, typecheck/lint clean.",
          "is_bot": false,
          "headline": "fix(mock): Animated.* host name + Animated.Value style resolution (#25)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T21:50:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "baaf491f777f4a7d442259b58c5e2e27aaa938cf",
          "body": "…-permissions) (#24)\n\nCodeQL (js/polynomial-redos): the rgb()/rgba() color parsers in Animated.ts\nused overlapping \\\\s* groups (\\\\s*(\\\\d+)\\\\s*,...), which backtrack\npolynomially on malformed input like 'rgb(9,9,9' + many spaces. Strip\nwhitespace once (linear) then match without \\\\s* — verified ~1058\n[…]\n, native-rn-matrix.yml and compat-check.yml\nhad no top-level permissions. Add 'permissions: contents: read'; compat-check's\njob keeps 'issues: write' for the github-script edge-failure tracking issue.",
          "is_bot": false,
          "headline": "fix(security): resolve code-scanning findings (ReDoS + workflow token…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T18:09:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c9ce3816c9928009bfe75d8e75c48b97d24f180",
          "body": "Bumps [actions/github-script](https://github.com/actions/github-script) from 7.0.1 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/60a0d83039c74a4aee543508d2ffcb1c3799cdea...3a2844b7e9c422d3c10d287c895573f710\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/github-script from 7.0.1 to 9.0.0 (#10)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T17:41:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b022e6892cf002d31c60d7a133dcb895ec8fd67",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.1 to 4.36.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/8\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github/codeql-action from 4.36.1 to 4.36.2 (#11)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T17:41:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39ef7f9fc4bf920caf0a24fe109ab0eec08a0428",
          "body": "Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 6.0.3.\n- [Release notes](https://github.com/microsoft/TypeScript/releases)\n- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v6.0.3)\n\n---\nupdated-dependencies:\n- dependency-name: typescript\n  dependency-vers\n[…]\nrect:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump typescript from 5.9.3 to 6.0.3 (#15)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T17:41:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4771469642a660bbe305bde49768c0a9a1d8316",
          "body": "…(#23)\n\nFold the post-#19 fixes into the unreleased 0.5.0 entry and drop the stray\nchangeset:\n- #18 disabled-press fix (pointerEvents:\"none\" under RNTL >=14)\n- #22 hostComponentNames configure-warning fix\n- #21 mock-engine RNTL 14 consumer fixture noted in the validation matrix\n\nRemoves .changeset/disabled-press-pointer-events.md (this repo documents\nreleases manually in CHANGELOG.md; the changeset would otherwise linger\nunconsumed). No version bump — 0.5.0 is unreleased, so these fold in.",
          "is_bot": false,
          "headline": "docs(release): document mock-engine RNTL 14 fixes in 0.5.0 changelog …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T17:13:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39a5b3596963347c1e8ca17011b4b3cb3c55b5d0",
          "body": "RNTL 14 removed the hostComponentNames configure option (it auto-detects host\ncomponents by rendering a probe, which works with the mock's host names).\nPassing it on RNTL >=14 is a no-op that logs an 'Unknown option(s) passed to\nconfigure' warning on every run. Detect the RNTL major version and only\n[…]\ntorical behavior, required by older RNTL).\n\nVerified: warning gone under the mock + RNTL 14 consumer fixture (still 7/7),\nand the RNTL 12.9 mock unit suite still configures hostComponentNames (57/57).",
          "is_bot": false,
          "headline": "fix(mock): skip hostComponentNames configure on RNTL >=14 (#22)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T14:22:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a714dbf4f6d85d306b568efff44f30220254b8c1",
          "body": "…re (#21)\n\nFollow-up to #18. The disabled-press fix lives in the mock engine, but nothing\nin CI paired the mock engine with RNTL 14 — unit tests run RNTL 12.9 (where the\nbug doesn't reproduce) and the other consumer fixtures use the native engine.\nThis adds the missing combination as a packed consum\n[…]\ns disabled\nPressable/Touchable*/Button do not fire onPress while enabled controls still do.\n\nVerified the fixture fails on the pre-#18 build (disabled Pressable + Button\nfire) and passes with the fix.",
          "is_bot": false,
          "headline": "test(consumers): guard disabled-press fix with a mock + RNTL 14 fixtu…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T14:11:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f996dc2c284d54d92aab5df7f363ea0121998758",
          "body": null,
          "is_bot": false,
          "headline": "fix: block press on disabled mocks under RNTL v14 (#18)",
          "author_name": "Jake Boone",
          "author_login": "jakeboone02",
          "committed_at": "2026-06-13T14:05:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a566712cf0f2743e579a5e3bc3ec0098a486478",
          "body": "* feat: harden native runtime and release gates\n\n* fix: restore Vite and RN 0.81 CI compatibility\n\n* ci: enforce LF line endings via .gitattributes\n\nThe Windows full-gate job failed at the formatting step: GitHub's Windows\nrunners check out with core.autocrlf=true, rewriting every tracked file to\nCR\n[…]\n Windows, so the absolute include never matched and the\ncrosscheck reported 'No test files found' (0/0 probes) on the Windows gate.\nNormalize to forward slashes — a no-op on POSIX, correct on Windows.",
          "is_bot": false,
          "headline": "Harden native runtime reliability and release gates (#19)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-13T13:43:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2b9415f221af1286bc618cc8d3c793ec515ad88",
          "body": "- Installation: note the companion deps the examples need (@testing-library/\n  react-native; real RN apps already have react-native + babel-preset + @babel/core).\n- Correct the RN-conformance count (118 ported: 115 pass, 3 documented skips).\n- (Quick Start vitest import + Maintained-successor wording already on main.)\n\nPatch release to get the corrected README onto npm.",
          "is_bot": false,
          "headline": "docs(readme): improve consumer onboarding (0.4.1)",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-11T20:45:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dff1ed09de766a5bfddba093d65b2ec28458cf2a",
          "body": "- Quick Start used bare test()/expect() with no import, but the plugin does NOT\n  enable Vitest globals (every real test in the repo imports from 'vitest'), so a\n  consumer copying it hit \"test is not defined\". Add the import; note the\n  globals:true alternative.\n- \"Spiritual successor\" -> \"Maintained successor\" (matches the root README and the\n  actual positioning) + link the migration guide.",
          "is_bot": false,
          "headline": "docs(readme): fix the Quick Start example + strengthen lineage wording",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-11T20:42:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcdbdca9b3f0b83d05bdfb55ce2934d077e6b76f",
          "body": "…../dist)",
          "is_bot": false,
          "headline": "fix(release): build before running tests (native test config imports …",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-11T20:38:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17ce31045110843caee62b7009c41163f7cf8d0f",
          "body": "…taged publish, CodeQL, Scorecard)\n\nHardens the supply chain ahead of the 0.4.0 release, mirroring danfry1/reflow-ts,\nadapted for this bun-workspace monorepo. The 7-day install-age gate is respected\neverywhere (no bypass).\n\n- syncpack (.syncpackrc.json): devDeps pinned exact; runtime/peer deps keep \n[…]\nPR limits.\n- release.yml: npm stage publish (npm >= 11.15) — staged tarball not installable\n  until a maintainer 2FA-approves; keeps OIDC provenance.\n- CodeQL + OpenSSF Scorecard (pinned action SHAs).",
          "is_bot": false,
          "headline": "chore(security): supply-chain hardening (syncpack, min-release-age, s…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-11T20:35:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10de37f0a3fa239979f8f67114e422f744ae4e4a",
          "body": "…4.0)\n\nvitest-native 0.4.0 — the native engine (real React Native, mocking only the\n~7-module native boundary) is now the zero-config default; the pure-JS mock\nengine is demoted to an opt-in escape hatch. Maintained successor to\nvitest-community/vitest-react-native.\n\n- engine: 'auto' (default) resol\n[…]\nest×RN matrix (0.81–0.84)\n- jest + vitest-react-native migration tooling and guides\n- two-engine example app; mock fidelity fixes\n\nSee packages/vitest-native/CHANGELOG.md for the full 0.4.0 narrative.",
          "is_bot": false,
          "headline": "feat(engine)!: native (real-RN) engine as the zero-config default (0.…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-11T20:13:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21efdf14f552c56c1a995786400f1efee2c98684",
          "body": "…rs (#6)\n\nResolves two enhancement requests:\n\n- #5: The react-native-gesture-handler preset now exports `Pressable`,\n  reusing the RN Pressable mock so it mirrors real RN behavior (including\n  not firing press handlers when `disabled`).\n- #2: Register reanimated-compatible `toHaveAnimatedStyle` and\n\n[…]\now \"Invalid Chai property\" under Vitest. Types ship via the\n  `vitest-native/matchers` subpath. README gains an Animated Matchers\n  section with a Reanimated + RNGH example that needs no manual mocks.",
          "is_bot": false,
          "headline": "feat: add RNGH Pressable preset export and reanimated animated matche…",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-06-03T21:03:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca2ed512345d699f75a88594b39f0fc7acb4d97b",
          "body": "…s (#4)\n\nWhen `disabled={true}`, `onPress`, `onPressIn`, `onPressOut`, and `onLongPress` are now stripped from Pressable, TouchableOpacity, TouchableHighlight, TouchableWithoutFeedback, and TouchableNativeFeedback mocks, matching real React Native behavior.\n\nCloses #3",
          "is_bot": false,
          "headline": "fix: suppress press handlers on disabled Pressable and Touchable mock…",
          "author_name": "Jake Boone",
          "author_login": "jakeboone02",
          "committed_at": "2026-06-03T20:51:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "962a8ad5cfa82d6b1f017ddc216f04c3d5cf6233",
          "body": "Adds a validate module with peer dep version checks (vitest, vite, react, optional RNTL) logged on configResolved, and Levenshtein-based typo suggestions for unknown plugin options.",
          "is_bot": false,
          "headline": "feat: add runtime peer dependency validation and unknown option warnings",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-03-22T22:03:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d98cb28b9d35a6703455a2e1643685387e3356b",
          "body": "RN defaults to 'extend' extrapolation, not 'clamp'. The test was\nmissing the explicit extrapolate option.",
          "is_bot": false,
          "headline": "fix: add extrapolate clamp to interpolation test",
          "author_name": "Daniel Fry",
          "author_login": "danfry1",
          "committed_at": "2026-03-10T22:30:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 12,
      "commits_last_year": 141,
      "latest_release_at": "2026-07-24T22:10:41Z",
      "latest_release_tag": "v0.9.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 11,
      "mean_days_between_releases": 15.4
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": null,
          "path": "bench/package.json",
          "tokens": [
            "npm.private"
          ],
          "ecosystem": "npm"
        },
        {
          "name": null,
          "path": "package.json",
          "tokens": [
            "npm.private",
            "npm.workspaces"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "vitest-native",
          "path": "packages/vitest-native/package.json",
          "tokens": [
            "npm.bin",
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [],
        "total": 0,
        "header": 0,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "vitest-native",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "vitest",
            "react-native",
            "testing",
            "mock",
            "vite",
            "plugin",
            "expo",
            "react"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/vitest-native",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.9.0",
          "repository_url": "https://github.com/danfry1/vitest-native",
          "versions_count": 15,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 41302,
          "first_published_at": "2026-03-07T20:48:33.193000Z",
          "latest_published_at": "2026-07-24T22:20:06.833000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 11
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 39,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "apps/example/tsconfig.json",
        "packages/vitest-native/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 63039,
      "source_files_sampled": 389,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "bench/package.json",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 8,
        "malicious_count": 0,
        "assessed_package": "npm:vitest-native@0.9.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "flow-remove-types",
          "manifest": "packages/vitest-native/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.322.0"
        },
        {
          "name": "magic-string",
          "manifest": "packages/vitest-native/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.30.21"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "flow-remove-types",
            "direct": true,
            "version": "^2.322.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": true,
            "version": "^0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "^7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@changesets/cli",
            "direct": false,
            "version": "2.30.0",
            "ecosystem": "npm"
          },
          {
            "name": "@consumer/ui",
            "direct": false,
            "version": "*",
            "ecosystem": "npm"
          },
          {
            "name": "@gorhom/bottom-sheet",
            "direct": false,
            "version": "5.2.14",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native-vector-icons/common",
            "direct": false,
            "version": "13.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native-vector-icons/material-icons",
            "direct": false,
            "version": "13.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native/babel-preset",
            "direct": false,
            "version": "0.83.9",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native/babel-preset",
            "direct": false,
            "version": "0.85.3",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native/babel-preset",
            "direct": false,
            "version": "0.86.0",
            "ecosystem": "npm"
          },
          {
            "name": "@react-native/babel-preset",
            "direct": false,
            "version": "^0.85.3",
            "ecosystem": "npm"
          },
          {
            "name": "@react-navigation/native",
            "direct": false,
            "version": "7.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "@react-navigation/native-stack",
            "direct": false,
            "version": "7.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shopify/flash-list",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react-native",
            "direct": false,
            "version": "12.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react-native",
            "direct": false,
            "version": "13.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react-native",
            "direct": false,
            "version": "14.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react-native",
            "direct": false,
            "version": "^12.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "25.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react",
            "direct": false,
            "version": "19.2.14",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/coverage-v8",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "babel-jest",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "expo",
            "direct": false,
            "version": "56.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "expo-constants",
            "direct": false,
            "version": "56.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "expo-constants",
            "direct": false,
            "version": "56.0.18",
            "ecosystem": "npm"
          },
          {
            "name": "expo-status-bar",
            "direct": false,
            "version": "56.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "jest",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-environment-node",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "oxc-minify",
            "direct": false,
            "version": "0.134.0",
            "ecosystem": "npm"
          },
          {
            "name": "oxfmt",
            "direct": false,
            "version": "0.36.0",
            "ecosystem": "npm"
          },
          {
            "name": "oxlint",
            "direct": false,
            "version": "1.51.0",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "19.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "^19.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "*",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "0.83.9",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "0.84.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "0.85.3",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "0.86.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-native",
            "direct": false,
            "version": "^0.86.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-native-gesture-handler",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-native-keyboard-controller",
            "direct": false,
            "version": "1.21.11",
            "ecosystem": "npm"
          },
          {
            "name": "react-native-reanimated",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-native-safe-area-context",
            "direct": false,
            "version": "5.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-native-worklets",
            "direct": false,
            "version": "0.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-test-renderer",
            "direct": false,
            "version": "19.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "react-test-renderer",
            "direct": false,
            "version": "^19.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "syncpack",
            "direct": false,
            "version": "15.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "test-renderer",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "test-renderer",
            "direct": false,
            "version": "^1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "tsdown",
            "direct": false,
            "version": "0.21.10",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "6.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^6.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^7.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^8.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "vitepress",
            "direct": false,
            "version": "2.0.0-alpha.17",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 61,
        "direct_count": 2,
        "indirect_count": 59
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 4,
        "merged_prs": 92,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 5,
        "closed_unmerged_prs": 30
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "danfry1",
          "commits": 132,
          "avatar_url": "https://avatars.githubusercontent.com/u/95628792?v=4"
        },
        {
          "type": "User",
          "login": "jakeboone02",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/366438?v=4"
        },
        {
          "type": "User",
          "login": "Doko-Demo-Doa",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/7723097?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.978
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "bakeoff-ratchet.yml",
        "ci.yml",
        "codeql.yml",
        "compat-check.yml",
        "native-rn-matrix.yml",
        "pages.yml",
        "release.yml",
        "scorecard.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 7,
            "reason": "dependency not pinned by hash detected -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4285a779ceb7e2e61ced85de28cca2b679030845",
        "ran_at": "2026-08-05T08:27:55Z",
        "aggregate_score": 6.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 12,
        "decided_7d": 14,
        "merged_30d": 42,
        "authors_30d": 1,
        "decided_30d": 49,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": true,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 11,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-08-04T09:58:13Z",
      "oldest_open_prs": [
        {
          "number": 128,
          "created_at": "2026-08-03T04:29:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 129,
          "created_at": "2026-08-03T04:29:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 130,
          "created_at": "2026-08-03T04:30:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 131,
          "created_at": "2026-08-03T04:33:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-08-02T21:20:08Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/danfry1/vitest-native",
    "host": "github.com",
    "name": "vitest-native",
    "owner": "danfry1"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 68 is calibrated to 80 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 68,
            "calibrated": 80,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 80,
      "inputs": {
        "security": 74,
        "vitality": 83,
        "community": 57,
        "governance": 58,
        "calibration": "2026-08-02",
        "engineering": 71,
        "ai_readiness": 57,
        "weighted_overall_raw": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 83,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 141,
              "human_commit_share": 0.94,
              "days_since_last_push": 2,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "141 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 141
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 12,
              "latest_release_tag": "v0.9.0",
              "releases_from_tags": false,
              "days_since_latest_release": 11,
              "mean_days_between_releases": 15.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "12 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 11 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~15.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 15.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 57,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "forks": 0,
              "stars": 39,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "39 stars",
                "points": 25.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 0,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 77,
            "inputs": {
              "packages": [
                "vitest-native"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 41302
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "41,302 downloads/month across npm",
                "points": 61.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 41302,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 58,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 17,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.978
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 98% of commits",
                "points": 0.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 74,
            "inputs": {
              "merged_prs": 92,
              "open_issues": 0,
              "closed_issues": 5,
              "prs_merged_7d": 12,
              "prs_decided_7d": 14,
              "prs_merged_30d": 42,
              "prs_decided_30d": 49,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 30,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "92/122 decided PRs merged",
                "points": 22.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 92,
                      "decided": 122
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "followers": 143,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "danfry1",
              "public_repos": 33,
              "account_age_days": 1702
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "143 followers of danfry1",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 143,
                      "login": "danfry1"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "33 public repos, account ~4 yr old",
                "points": 20.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 33
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "vitest-native"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 11
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 11 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 11
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "15 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "8 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "expo",
                "jest",
                "mocking",
                "react",
                "react-native",
                "react-native-testing-library",
                "testing",
                "testing-library",
                "typescript",
                "unit-testing",
                "vite",
                "vitest"
              ],
              "has_wiki": true,
              "homepage": "https://danfry1.github.io/vitest-native/",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://danfry1.github.io/vitest-native/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "good",
        "name": "Security",
        "value": 74,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 67,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 3.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:vitest-native@0.9.0 runtime dependency closure — what installing the published package pulls in — 8 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:vitest-native@0.9.0",
                  "assessed": 8
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 8,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 8,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "moderate",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "94 of 94 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 94
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "weak",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "apps/example/tsconfig.json",
                "packages/vitest-native/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.06
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "apps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "apps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "6 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 6,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 7,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 63039,
              "source_files_sampled": 389,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/389 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 389,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application",
        "host-extension"
      ],
      "labels": [
        "library",
        "cli",
        "plugin"
      ],
      "scores": {
        "cli": 6,
        "plugin": 4,
        "library": 6.6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "declared",
          "label": "cli",
          "source": "npm.bin",
          "weight": 6
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.private",
          "weight": -6
        },
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.entry",
          "weight": 4.8
        },
        {
          "tier": "description",
          "label": "plugin",
          "source": "description:plugin",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "plugin",
          "source": "tag:plugin",
          "weight": 2
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.peer_dependencies",
          "weight": 1.8
        }
      ],
      "artifacts": [
        {
          "path": "bench/package.json",
          "labels": [],
          "ecosystem": "npm"
        },
        {
          "path": "package.json",
          "labels": [],
          "ecosystem": "npm"
        },
        {
          "path": "packages/vitest-native/package.json",
          "labels": [
            "library",
            "cli"
          ],
          "ecosystem": "npm"
        }
      ],
      "confidence": "high",
      "host_extension": true,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-05T08:28:13.257426Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/danfry1/vitest-native.svg",
  "full_name": "danfry1/vitest-native",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v2.5.0、模式 v0.31.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.