Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 16:10 UTC

r-lib / lintr

Static Code Analysis for R

RCustom license★ 1,288 stars⑂ 200 forkssince Sep 2014View on GitHub ↗

r-lib/lintr holds a health index of 73 out of 100, placing it in the Good band. It scores highest on Vitality (86/100) and lowest on AI Readiness (34/100). It was last updated today. 2 contributors account for most of its recent work.

73
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

73
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

R infrastructureOrganization
748 followers165 public repossince Oct 2016

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

86Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
24.2/36Commit cadence — 35/52 weeks with commits
18/18Commit volume — 113 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year113
human_commit_share0.89
days_since_last_push0
active_weeks_last_year35
How it's scored
27/27Ships releases — 17 releases published
36/36Release recency — latest release 7 days ago
12.6/27Release cadence — a release every ~227.6 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count17
latest_release_tagv3.4.0
releases_from_tagsno
days_since_latest_release7
mean_days_between_releases227.6
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

78Good · 18% of overall
How it's scored
50.4/60Stars — 1,288 stars
19.2/25Forks — 200 forks
7/15Watchers — 19 watchers
Inputs used
forks200
stars1,288
watchers19
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

71Good · 24% of overall
How it's scored
25.2/54Bus factor — 2 contributor(s) cover half of all commits
14.4/22.5Commit distribution — top contributor authored 36% of commits
13.5/13.5Contributor breadth — 99 contributors
10/10OpenSSF Scorecard: Contributors — project has 42 contributing companies or organizations
Inputs used
bus_factor2
contributors_sampled99
top_contributor_share0.36
How it's scored
38/46.8Issue resolution — 81% of issues closed
34.8/38.3PR acceptance — 1,382/1,517 decided PRs merged
4.5/15OpenSSF Scorecard: Code-Review — Found 10/28 approved changesets -- score normalized to 3
Inputs used
merged_prs1,382
open_issues293
closed_issues1,274
issue_closed_ratio0.813
closed_unmerged_prs135
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
20.7/25Owner reach — 748 followers of r-lib
25/25Track record — 165 public repos, account ~9 yr old
Inputs used
followers748
owner_typeOrganization
is_verified
owner_loginr-lib
public_repos165
account_age_days3,579

Engineering Quality

Are baseline engineering and documentation practices in place?

71Good · 20% of overall
How it's scored
24/24CI workflows — 10 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 27 out of 27 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — https://lintr.r-lib.org
10/10Repository description
10/10Topics — 2 topics
10/10Wiki
Inputs used
topicslinter, r
has_wikiyes
homepagehttps://lintr.r-lib.org
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

58Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2.5/2.5CI-Tests — 27 out of 27 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
2.2/7.5Code-Review — Found 10/28 approved changesets -- score normalized to 3
2.5/2.5Contributors — project has 42 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate5.8
Excluded from scoring (no data or not applicable): branch_protection, packaging, signed_releases. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

34At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 83 of 89 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.933
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
0/11Static type checking
10/10Reproducible environment — devcontainer, Dockerfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
8/8Automated maintenance — 11 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontaineryes
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0.11
How it's scored
0/45Type-checkable code — R without a type-check config
0/55Manageable file sizes — no source files detected
Inputs used
primary_languageR
largest_source_bytes
source_files_sampled0
oversized_source_files0
Excluded from scoring (no data or not applicable): Manageable file sizes. Remaining weights renormalized.
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — example
Inputs used
example_dirsexample
has_mcp_signalno
api_schema_files

Key facts

1,288GitHub stars
99contributors
113commits, last 12 months
0days since last push
17releases
2bus factor
293open issues
package ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 200 ⇿
0Stars
200Forks
16Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0408012016020019842014-092020-082026-07
Major 3Minor 3Patch 9

Each point covers 11 days.

OpenSSF Scorecard 5.8 / 10
5.8aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 16:09 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests27 out of 27 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
3Code-ReviewFound 10/28 approved changesets -- score normalized to 3
10Contributorsproject has 42 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
All dependencies 0

Full resolved dependency set from the GitHub dependency graph: 0 direct and 0 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies to assess

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "linter",
        "r"
      ],
      "is_fork": false,
      "size_kb": 33890,
      "has_wiki": true,
      "homepage": "https://lintr.r-lib.org",
      "languages": {
        "R": 1353938,
        "Rez": 52,
        "TeX": 4798,
        "HTML": 1728,
        "Dockerfile": 1068,
        "Vim Script": 3139
      },
      "pushed_at": "2026-07-23T00:05:23Z",
      "created_at": "2014-09-28T02:48:15Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T05:51:31Z",
      "description": "Static Code Analysis for R",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "R",
      "significant_languages": [
        "R"
      ]
    },
    "owner": {
      "blog": null,
      "name": "R infrastructure",
      "type": "Organization",
      "login": "r-lib",
      "company": null,
      "location": null,
      "followers": 748,
      "avatar_url": "https://avatars.githubusercontent.com/u/22618716?v=4",
      "created_at": "2016-10-04T14:31:21Z",
      "is_verified": null,
      "public_repos": 165,
      "account_age_days": 3579
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2026-07-16T04:57:25Z"
        },
        {
          "tag": "v3.3.0-1",
          "kind": "prerelease",
          "published_at": "2025-11-27T15:19:42Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2025-02-12T17:32:17Z"
        },
        {
          "tag": "v3.1.2",
          "kind": "patch",
          "published_at": "2024-03-25T17:42:03Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2023-11-09T19:18:01Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2023-07-19T18:05:38Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2022-10-20T12:48:13Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2022-09-16T15:58:22Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2022-06-14T12:35:38Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2020-12-05T13:07:05Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2019-10-01T18:51:02Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2019-09-27T14:40:43Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2017-11-13T17:10:55Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2017-08-14T20:14:47Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2019-09-27T14:40:16Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2019-09-27T14:46:18Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2014-12-01T14:34:38Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "199d40a3ea79833318faadb72e0a527e5b6ad8a4",
          "body": "* First pass at XPath style skill\n\n* incorporate insights from the 'robustness' wiki\n\n* more insights from #3003 round\n\n* insights from #2860\n\n* Incorporate insights from #3092\n\n* Restore xml_find_function_calls guidance in xpath-style skill",
          "is_bot": false,
          "headline": "Add an xpath-style SKILL, and other skill/subagent refinements (#3094)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-21T05:51:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4038b123a156b0132bc4fb833999e3a4db9417c",
          "body": "* Gemini: initial implementation\n\n* tweaks\n\n* Headings in NEWS\n\n* fix-up NEWS merge\n\n* fix our own lints",
          "is_bot": false,
          "headline": "New expect_shape_linter (#3089)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-20T16:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "708e0475e028e56673c98a645781155a3b04f28d",
          "body": "* Gemini: fix\n\n* XPath style, NEWS entry\n\n* return() not needed in tests\n\n* extra test case for 2nd issue fixed here",
          "is_bot": false,
          "headline": "Require unreachable expression parent to be '{' (#3085)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-20T14:49:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "257424b6c899f2f4f4c69faa0319ac566d0f6085",
          "body": "* Gemini: proposed fix\n\n* Gemini: try a more direct approach\n\n* NEWS\n\n* Gemini: handling of another observed false positive",
          "is_bot": false,
          "headline": "Restore vector_logic_linter() working inside function bodies (#3086)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-19T06:33:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de7b1e81452f60cdab14d1f6f732c3fa1ff9c21a",
          "body": null,
          "is_bot": false,
          "headline": "iterate .agents testing rules (#3081)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-16T21:36:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b5201f285be6b4e1445f3e7de91425d1ac746d0",
          "body": "* Gemini-authored tests for 100% coverage\n\n* Gemini: force tests to use the public API\n\n* fix Gemini lints\n\n* diff shrinking\n\n* style pass\n\n* initial round of feedback+tidying\n\n* just delete unreachable code, better comment\n\n* Gemini: avoid mocking if possible\n\n* Gemini: better + more tests\n\n* style\n[…]\node\n\n* Gemini: public API tests\n\n* nocov whole range for build-time-only unexported code\n\n* Gemini: another test for last uncovered line of get_encoding_from_dcf\n\n* one final nocov with internal error",
          "is_bot": false,
          "headline": "Tests for 100% code coverage (#3080)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-16T21:09:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "178882ff24dc887de0b1c482ca5c2eb932a17c1c",
          "body": null,
          "is_bot": false,
          "headline": "correct backport_linter configuration",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-16T05:55:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd7322a391db87d92a578a8627783c6c9c4246af",
          "body": null,
          "is_bot": false,
          "headline": "bump to dev",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-16T04:58:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae8cda850cbbd07191ed7fbd12d7e967353ebe45",
          "body": "url fix\n\ndont include empty directory\n\nbehavioral fix for old ...names behavior\n\nexhaustive backports check",
          "is_bot": false,
          "headline": "->CRAN version, tidy NEWS",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-16T04:54:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbfc2d6691e200f2d124314e5adc49b4e760fdd7",
          "body": "* Add developing-linters and testing-linters skills to .agents\n\n* ignore the new folder in R CMD build\n\n* Another round of agents\n\n* revise the takeaway from %:::% change\n\n* PR review agent\n\n* clarify the reviewer is read-only-ish\n\n* more learnings summarized\n\n* kill 'cyclocomp' directive (hyperfocused)\n\n* manual edits to improve poor review quality\n\n* refinement\n\n* fix description of rex::rex escaping",
          "is_bot": false,
          "headline": "Add some SKILLs and agents (#3074)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-15T06:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eeceb8e9e7ee61f6f2b60da2e71879d91523f71",
          "body": "Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Lint `paste(deparse(x), collapse)` in favor of `deparse1()` (#3041)",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2026-07-15T06:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cf31dcbeeb98f64bd5807b4ad30af2fb019c521",
          "body": "* Gemini initial pass\n\n* restore \"complies\" example with updated syntax\n\n* NEWS\n\n* Gemini 2nd pass addressing expect_lint->expect_no_lint change\n\n* restore specific indentation request to test\n\n* Gemini 3rd pass improving lint metadata in ambiguous cases\n\n* Small style pass\n\n* use a lookup map\n\n* Ge\n[…]\nctor to get more from lint_metadata, better naming\n\n* avoid repeated setdiff in loop\n\n* shrink diff: restore xp_multiline_string\n\n* Consistently check for terminal '.' in lint_message\n\n* tweak comment",
          "is_bot": false,
          "headline": "Update for single-indentation function definitions (#3076)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-15T06:21:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "468f9606be92171db409676b659e1c810e719de4",
          "body": "* Gemini implementation\n\n* simplify\n\n* NEWS\n\n* avoid ::: for xfun wrapper\n\n* avoid another ::: simple wrapper\n\n* another ::: avoided\n\n* file_ext is now an xfun export\n\n* another xfun export since we dont use $label\n\n* proper citation\n\n* better naming, rm unreachable\n\n* more superfluous\n\n* superfluou\n[…]\nperfluity (pt 2)\n\n* simplify tests\n\n* fix for 0-chunk files\n\n* nolint\n\n* Use vapply() not Map\n\n* Avoid double-negation\n\n* new tests for review edge cases\n\n* minimal suppression for new tests\n\n* delint",
          "is_bot": false,
          "headline": "Skip linting eval=FALSE chunks (#3072)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-14T18:22:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "262580d440e8ef1777c68638524aa72a448ba465",
          "body": "… aroud trailing newlines (#3070)\n\n* remove now-obsolete test\n\n* Revert \"remove now-obsolete test\"\n\nThis reverts commit 2cf71227881e013785097582dc45df732303bf92.\n\n* rather, use expect_no_error\n\n* warn=0 is required for this to work\n\n* delint\n\n* test exact behavior in all versions\n\n* all=TRUE required for the warning",
          "is_bot": false,
          "headline": "Amend test to work before+after r-devel change about read.dcf warning…",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-14T17:03:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4579471b57baeca4edfefbcde7495427efd2113d",
          "body": "…r already-imported symbols (#3073)\n\n* Gemini initial pass\n\n* not optional, on by default\n\n* fix existing lints\n\n* reverting towards smaller diff\n\n* complete shrinking diff, simplify+shrink tests\n\n* simplify: no need for FALSE vector\n\n* helper is just a wrapper, overkill\n\n* no effect\n\n* NULL case is already handled\n\n* another unneeded helper\n\n* style on second test\n\n* nofuzz\n\n* sub > gsub\n\nCo-authored-by: Hugo Gruson <git@hugogruson.fr>\n\n---------\n\nCo-authored-by: Hugo Gruson <git@hugogruson.fr>",
          "is_bot": false,
          "headline": "namespace_linter() extended for finding redundant '::'/':::' usage fo…",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-10T16:15:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "603ab79e6db25d380c5ee96f35ffd6ba16d223aa",
          "body": null,
          "is_bot": false,
          "headline": "catch an uncaught message() (#3071)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-07T18:01:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64df3da87d0cf9cdbb6f98f0a6f18c7c960ed37a",
          "body": "* Document difference of NA %in% x and anyNA(x)\n\n* document",
          "is_bot": false,
          "headline": "Document difference of NA %in% x and anyNA(x) (#3069)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-07T17:11:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8f1fdad8a36dea54de698994982466a56b6dc0c",
          "body": "Co-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Lint rev(sort()) calls (#3066)",
          "author_name": "Hugo Gruson",
          "author_login": "Bisaloo",
          "committed_at": "2026-07-06T15:56:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c390ae1c9ff2c3d19c3b84eab8f53f7f5bbf9e1",
          "body": "…h_linter (#3060)\n\n* gemini implementation\n\n* style\n\n* NEWS\n\n* bump xml2 version requirement",
          "is_bot": false,
          "headline": "Handle un-braced ('{') expressions in if/switch correctly in if_switc…",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-07-01T23:01:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7118190118a71346c1b16b4444caa4f307aee482",
          "body": "* custom linter for expect_no_lint\n\n* more consistency with other tests",
          "is_bot": false,
          "headline": "Custom linter for expect_no_lint (#3063)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-22T22:42:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f727df160447ad01dfda4af18457183e7ee65f07",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\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": "Bump actions/checkout from 6 to 7 (#3064)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T22:31:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f1d9b3954774b6e27a4c83f8726a0b52f49dbae",
          "body": "* minimal: change : to <-\n\n* style tweaks",
          "is_bot": false,
          "headline": "Finish switch to R style config (#3062)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-18T22:42:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8f121e61916862d13d34b976ec08c3ba1e79c98",
          "body": null,
          "is_bot": false,
          "headline": "Rename: .lintr -> .lintr.R (#3061)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-18T22:38:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ea1df1b9941a14e887aba3f6f20c26fc39ad2c1",
          "body": "* perf(utils): optimize flatten_list for common cases\n\nOptimize the core flatten_list utility to bypass expensive recursive\nenvironment creation for the most common inputs:\n- Empty lists (returns list() immediately)\n- Single objects (returns list(x))\n- Flat lists of the target class (returns unname(\n[…]\neric optimization yields significant speedups across all linters,\nespecially when they return empty results.\n\nTAG=agy\nCONV=3167de05-de65-467a-876c-a7dcf1003aab\n\n* cyclocomp linter\n\n* skip maybe_unname",
          "is_bot": false,
          "headline": "Optimize flatten_list for common cases (#3051)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-09T20:40:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6126ca9399a6908147a2e05d972d99f33bb374e",
          "body": "* minimal diff\n\n* back off of xml_parent() in other cases\n\n* simplify diff\n\n* xml_find_all_\n\nCo-authored-by: Michael Chirico <michaelchirico4@gmail.com>\n\n* more finagling around avoiding xml_parent\n\n* mark undesirable, allowing only by exception",
          "is_bot": false,
          "headline": "Optimize the use of xml_parent() vs. xml_find_all(\"parent::*\") (#3011)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-09T17:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b39dee4b2889f547d690f6deb8e987b255dc8be1",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\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": "Bump codecov/codecov-action from 6 to 7 (#3055)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T16:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "77e258eb44013351a215704ee7286939794beb93",
          "body": "* Don't lint expression(paste(., sep = \"\")) in paste_linter.\n\n* Reworked to fix a false negative.\n\n* Lint expression(paste(., sep = \"\")) differently in paste_linter.\n\n* Fix lints.\n\n* XPath style\n\n* Move example under the right section.\n\n* new tests\n\n* test refinement\n\n* add an OK example correspondi\n[…]\nseness\n\n* more test refinement\n\n* fix bad copy-paste, typo, and add more extensive vectorization test\n\n* revert NEWS\n\n* restore NEWS\n\n---------\n\nCo-authored-by: Marco Colombo <mar.colombo13@gmail.com>",
          "is_bot": false,
          "headline": "Don't lint expression(paste(., sep = \"\")) in paste_linter (#3054)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-04T23:21:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3d1dc5baaba6469a1e9edd50be8419faca8ec44",
          "body": "* skip outer ! in lambda\n\n* other unary operators\n\n* fine-tune NEWS\n\n* further test cases\n\n* ! is unary\n\n* fix for functions with { or ( initially",
          "is_bot": false,
          "headline": "Ignore outer unary operators in unnecessary_lambda_linter (#3026)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-04T17:50:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e31244f3c4a487a02dddf6953f5532770d57edc8",
          "body": "* initial pass via Gemini\n\n* tweak name\n\n* more tests\n\n* delint\n\n* nofuzz\n\n* update lint message\n\n* nolint start/next coverage tests\n\n* also nofuzz for comments",
          "is_bot": false,
          "headline": "Don't trip over capture groups in lint(exclude=) regex (#3025)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-04T06:34:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e571f0b8df4e8d8aad39f935f3f39e7318e04638",
          "body": "* use static gif in CRAN README\n\n* docs: knit README.Rmd to README.md\n\n* parameterized approach\n\n* remove gif altogether\n\n* try unwrapping the lines\n\n* encode option in YAML frontmatter\n\n* shrink diff\n\n* restore\n\n* lint from tempdir for less randomness in output\n\n* improve to only show 'bad.R' filen\n[…]\n class to get the right print method\n\n* update to latest\n\n* use comment=\"\" for nicer output and knit_code$get to reduce duplication\n\n---------\n\nCo-authored-by: Hugo Gruson <hugo.gruson@protonmail.com>",
          "is_bot": false,
          "headline": "Replace .gif in README with equivalent code (#3021)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-03T20:52:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6a277210338b7d2b549c560e9829394fce4c173",
          "body": "* handle unencoded raw text correctly\n\n* simplify (?)\n\n* vestigial\n\n* rm ,\n\n* coverage\n\n* tests skipped outside UTF-8 locale",
          "is_bot": false,
          "headline": "Handle unencoded raw text correctly (#3047)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-06-03T17:34:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb9550198324915ffc08fbc3d9a393216086b16a",
          "body": "* remove <<- as a default operator\n\n* other affected test files\n\n* two more files\n\n* typo: missing \"-\"",
          "is_bot": false,
          "headline": "Remove <<- from assignment_linter defaults (#3022)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-05-26T22:18:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6320c21bb3de8bb3127bc272d39d58c52bdceee",
          "body": "…calls (#3050)\n\n* force ns=empty_ns to skip xml_ns() overhead\n\n* NEWS\n\n* 30% improvement on {utils}\n\n* xml2:: for unimported name\n\n* rm unused\n\n* add linters to prevent regression\n\n* other xml imports using ns=empty_ns\n\n* feedback\n\n* import xml_missing while were at it\n\n* as_list not needed",
          "is_bot": false,
          "headline": "Supply 'ns=empty_ns' to avoid expensive xml_ns() lookup on most xml2 …",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-05-26T21:32:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f140c02e22efd674a59e8559abb8ccdd59472ce",
          "body": null,
          "is_bot": false,
          "headline": "require UTF-8 in zh_CN (#3049)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-05-20T02:38:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4db5e1a07655d08fc8a310c8322424b259bfd5d",
          "body": "Other CI failures can be addressed in other PRs",
          "is_bot": false,
          "headline": "roxygen 8.0.0 (#3048)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-05-19T23:48:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cea9a1f5ddc42a92044248bcdc214330b2bc692",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\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": "Bump codecov/codecov-action from 5 to 6 (#3040)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-30T05:07:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6de7b4e16c65ea83ad27a453f42ba9a19a7b4212",
          "body": null,
          "is_bot": false,
          "headline": "add personal website link for Indrajeet Patil (#3039)",
          "author_name": "Indrajeet Patil",
          "author_login": "IndrajeetPatil",
          "committed_at": "2026-03-29T07:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd016a02869dcec525d516bd63654f5b14cd4b01",
          "body": "* init\n\n* remove styling change\n\n* more cases",
          "is_bot": false,
          "headline": "Fix docs where part of 'Description' ends up in 'Details'  (#3024)",
          "author_name": "Etienne Bacher",
          "author_login": "etiennebacher",
          "committed_at": "2026-03-10T14:20:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3df637d136872b56bb2489c7bd1c42bff0536c37",
          "body": "* Gather all failures in roxygen_test.R\n\n* Gather all failures in roxygen_test.R\n\n* unnest\n\n* more verbose for readability\n\n* invert logic for readability",
          "is_bot": false,
          "headline": "Gather all failures in roxygen_test.R (#3012)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-03-09T01:56:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccad66a6e4acec6656e2299766b82ab1142f3420",
          "body": "* Fix false positive in `if_switch_linter()` for empty strings\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* Fix false positive in `if_switch_linter()` for empty strings\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* Fix false positive in `if_switch_linter()` for e\n[…]\npty strings\n\n* rename helpers\n\n* include negative cases in multi-lint test\n\n---------\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Fix false positive in `if_switch_linter()` for empty strings (#3018)",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2026-03-02T19:36:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f185cf10fede6836d7ab07ba8816ca08de2658de",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\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": "Bump actions/upload-artifact from 6 to 7 (#3019)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-02T17:08:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6afb72de7d73a805cfc7f02ba24091f178ccd983",
          "body": "* Add Emmanuel as a contributor\n\n* roxygenize",
          "is_bot": false,
          "headline": "Add Emmanuel as a contributor (#3016)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-02-24T00:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbbbd2e491cd8ad37ff842ffb62b83b9c80ce188",
          "body": "…ter (#3015)\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>",
          "is_bot": false,
          "headline": "Implement `call_is_undesirable` parameter in undesirable_operator_lin…",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2026-02-23T16:19:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6b2834306846da0a8ed03d7f2a168574b1e0527",
          "body": "* use maybe_write_content for easier 'mocking'\n\n* initial progress\n\n* getting very close i think...\n\n* skip Rmd files\n\n* caught a live one!\n\n* need to match original file extension?\n\n* caught another one!\n\n* simpler approach, avoid rex() due to bug\n\n* also ignore warnings\n\n* finally getting somewher\n[…]\nts\n\n* expect_lint thing\n\n* another nofuzz for comments\n\n* another false positive\n\n* fix xml_find_first robustness issue\n\n* one level further up needed for three parent::expr in XPath\n\n* finish comment",
          "is_bot": false,
          "headline": "Improve the nofuzz system to allow specific exclusions (#2832)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-22T21:33:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "689d6fe85695e6445b5d97a01942ace859360053",
          "body": null,
          "is_bot": false,
          "headline": "combine XPath filters (#3008)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-22T20:59:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1b041f1058d1d2a6ce11b499e43a398cd1e7f8",
          "body": "…)` (#3009)\n\n* init\n\n* revert unrelated style change\n\n* fix lint\n\n* fmt stuff\n\n* space, trim_some, etc.\n\n* revert tribble change\n\n* more trim_some usage\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Replace all `expect_lint(..., NULL, ...)` by `expect_no_lint(..., ...…",
          "author_name": "Etienne Bacher",
          "author_login": "etiennebacher",
          "committed_at": "2026-01-20T23:10:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f478a0048ea37f55374281cd20d536654d811d28",
          "body": "…004)\n\n* Allow scalar logic in anonymous functions within subsetting calls\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* Allow scalar logic in anonymous functions within subsetting calls\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* tweak NEWS\n\n* Allow scalar logi\n[…]\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* XPath style\n\n---------\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Allow scalar logic in anonymous functions within subsetting calls (#3…",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2026-01-20T18:32:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6ad11803f1e157997b0f88ebf6905a291a66924",
          "body": "* use maybe_write_content for easier 'mocking'\n\n* initial progress\n\n* getting very close i think...\n\n* skip Rmd files\n\n* caught a live one!\n\n* need to match original file extension?\n\n* caught another one!\n\n* simpler approach, avoid rex() due to bug\n\n* also ignore warnings\n\n* finally getting somewher\n[…]\nint in touched files\n\n* quieter by using ListReporter\n\n* tidy+comment\n\n* better tracing\n\n* missing ','\n\n* fix-up merge\n\n* more fix-up\n\n* final fix-up: delint\n\n* one comment about approach for count(*)",
          "is_bot": false,
          "headline": "Add a fifth fuzzer for '='/'<-' equivalency (#2829)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-17T23:58:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1859e5c6255bdadf5acb040323f09422a76224d",
          "body": "* Add tests for is.unsorted() recommendation on identical()\n\n* Add new XPath components for identical()\n\n* Split XPaths for idential() and ==\n\n* Add NEWS item\n\n* Use expect_no_lint() for false positives\n\n* Add false positive tests for is.unsorted\n\n* Add one expression matching test\n\n* Work around comments\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Lint `identical(x, sort(x))` in `sort_linter()` (#2921)",
          "author_name": "Hugo Gruson",
          "author_login": "Bisaloo",
          "committed_at": "2026-01-14T20:07:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d64422e30b0ac615d381485aee2e5b3d878bd8f",
          "body": "* move paren_body_linter hit onto )\n\n* remove testthat:: in more places\n\n* revert chagnes b/c of new lint",
          "is_bot": false,
          "headline": "Move paren_body_linter hit onto ) (#2991)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-13T17:45:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f5ffc141aeb8a770e60549283051ac09c85a1fb",
          "body": "* use maybe_write_content for easier 'mocking'\n\n* initial progress\n\n* getting very close i think...\n\n* skip Rmd files\n\n* caught a live one!\n\n* need to match original file extension?\n\n* caught another one!\n\n* simpler approach, avoid rex() due to bug\n\n* also ignore warnings\n\n* finally getting somewher\n[…]\nofuzz\n\n* another one\n\n* more nofuzz in expect_lint suite\n\n* Increas max_reports to ensure more is shown in the logs\n\n* another nofuzz\n\n---------\n\nCo-authored-by: AshesITR <alexander.rosenstock@web.de>",
          "is_bot": false,
          "headline": "Add a fuzzer for injecting comments (#2899)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-12T18:14:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e08c3210e4af9f8c1dc7999dcc21021c5fcd31b8",
          "body": "* stopifnot -> cli_abort\n\n* obj_simple_type_name->obj_type_friendly\n\n* fix up tests for new errors\n\n* coverage tests\n\n* fix-up\n\n* apply suggestion\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>\n\n* apply suggestion\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply\n[…]\nithub.com>\n\n* apply suggestion\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>\n\n* fix tests\n\n---------\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Refactor stopifnot into cli_abort (#2998)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-12T15:34:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0927b61a56175be8beb95bc2ab18a8ef88b6747f",
          "body": "Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.6 to 4.8.0.\n- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)\n- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.6...v4.8.0)\n\n[…]\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Michael Chirico <michaelchirico4@gmail.com>",
          "is_bot": true,
          "headline": "Bump JamesIves/github-pages-deploy-action from 4.7.6 to 4.8.0 (#3002)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-12T07:32:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2066c38d29eca321a0c4fe5fb21262bc321d664c",
          "body": "Co-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Mention writeLines() in ?print_linter (#2997)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-12T06:44:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6cdb2ac810a03a65c8712fe76301c5b92913148",
          "body": "* dont warn if cyclocomp is missing\n\n* revert\n\n* Delay evaluation of linter factories until modify_defaults\n\n* fix delayedAssign issue\n\n* simplify by using a helper over local()\n\n* append _ to avoid regex for linter$\n\n* add a case generating the expected warning\n\n* remove blank line\n\n* NEWS\n\n* fix mocking to get warning if cyclocomp is installed",
          "is_bot": false,
          "headline": "Delay calling linter factories until modify_defaults (#2912)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-08T06:46:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9957a3f11032c84a7e179070f4620188883bbf33",
          "body": null,
          "is_bot": false,
          "headline": "Delete obsolete tests/testthat/lints (#3000)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2026-01-07T23:31:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a72dfbfbd25a0547eb507d96fbf02de01bb5d3ad",
          "body": "* handle comments\n\n* ws\n\n* attempt to merge XPaths\n\n* helper not needed\n\n* helper rename of variable\n\n* Kneading tests\n\n* simpler wording fix\n\n* one more\n\n* preceding-sibling, not parent\n\n* simplify, extract to factory\n\n* comment purpose of intermediate XPath",
          "is_bot": false,
          "headline": "Handle comments in unreachable_code_linter (#2900)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-30T23:07:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "131ae89f31c112e77db75eebb430c058efc96d6a",
          "body": "Co-authored-by: Indrajeet Patil <patilindrajeet.science@gmail.com>",
          "is_bot": false,
          "headline": "drop escape valve (#2989)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-17T10:26:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "823728b5e708a47f46aa39641e7c674ceabdd8e2",
          "body": "Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.4 to 4.7.6.\n- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)\n- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.4...v4.7.6)\n\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": "Bump JamesIves/github-pages-deploy-action from 4.7.4 to 4.7.6 (#2993)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-17T06:03:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81a02c42063cc6f49355699f30fdd96d2cc625d8",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\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": "Bump actions/upload-artifact from 5 to 6 (#2992)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-15T05:48:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e4c9437725b8ec23a289335e2abf9c3cb288613",
          "body": null,
          "is_bot": false,
          "headline": "Use simpler apply() approach (#2990)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-08T07:49:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39fb754d0be6b66e7d13901448580d47c89026a0",
          "body": null,
          "is_bot": false,
          "headline": "Drop skip_if_not_r_version for skip_unless_r (#2988)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-07T15:01:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba88540396d7f36586cd128fe0f707815cceec23",
          "body": null,
          "is_bot": false,
          "headline": "tweak: use native lambda, don't keep source (#2984)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-06T13:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6afa5216de77579f952f688644bf9ef68d701fc",
          "body": "* Progress deprecations of function arguments\n\n* match autoformatting of \\usage\n\n* yuck\n\n* blurb about workarounds\n\n---------\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Progress deprecations of function arguments (#2979)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-12-01T13:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "085c1a1d034a7037da2312f51ff7e5fff25dfe88",
          "body": "* Initial call site selection for |>\n\n* follow-up pass\n\n* restore",
          "is_bot": false,
          "headline": "Use native pipe |> in a few places (#2982)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-30T13:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6769a6e27d86adde673aec0db4ee133746b5dc5",
          "body": "* Require R 4.1.0, use shorthand lambdas\n\n* removing backports fixed this link",
          "is_bot": false,
          "headline": "Require R 4.1.0, use shorthand lambdas (#2977)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-30T06:20:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "118e7647fd263e7fa0628a3181abee5f04f435ac",
          "body": "* Delete defunct linters\n\n* remove entry for deleted file\n\n* Remove other references to lintr-deprecated",
          "is_bot": false,
          "headline": "Delete defunct linters (#2978)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-29T17:15:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb43341f3257c4617e0166abc800134b8c23ccf7",
          "body": null,
          "is_bot": false,
          "headline": "bump to devel",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-27T15:16:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58a5c4431702e3ecea75197d38ca7e125358894b",
          "body": "commit d66d4c591398165d66fcf09962da12c6cfb89203\nAuthor: Michael Chirico <chiricom@google.com>\nDate:   Wed Nov 26 15:36:53 2025 +0000\n\n    3.3.0-1 -- downgrade to warning\n\ncommit c03d46605b2f248defebb5d3127ff0ade1d551bf\nAuthor: Michael Chirico <chiricom@google.com>\nDate:   Tue Nov 25 20:25:12 2025 +0\n[…]\n5:18:08 2025 +0000\n\n    NEWS version\n\ncommit 15022a814ee04ea3834c1953def4bcdb1f3d12ee\nAuthor: Michael Chirico <chiricom@google.com>\nDate:   Tue Nov 25 15:16:40 2025 +0000\n\n    bump DESCRIPTION version",
          "is_bot": false,
          "headline": "Squashed commit of the following:",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-27T15:14:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "564bd57bd8236d28cdf109174fa9c48e7b919557",
          "body": "This reverts commit ff97a388ad42e5869ec53a2e3720f66dc83157af.",
          "is_bot": false,
          "headline": "Revert \"re-generate docs from roxygen2 (#2973)\" (#2974)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-25T16:49:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff97a388ad42e5869ec53a2e3720f66dc83157af",
          "body": null,
          "is_bot": false,
          "headline": "re-generate docs from roxygen2 (#2973)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-25T16:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37d533b515ac50654cd6ea369ae6d0c2d7e8b963",
          "body": null,
          "is_bot": false,
          "headline": "set repos permanently (#2971)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-25T15:37:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a26331bbfff52a568cb273327856d7ca8dcfa190",
          "body": "* lint(text=) finds local settings again\n\n* Add a comment\n\n* Annotate issue # too\n\n* explicitly disable cyclocomp_linter under \"hard mode\"\n\n* also need explicit parse_settings=FALSE in cyclocomp test\n\n* More explicit parse_settings=FALSE\n\n* must parse .Rproj settings\n\n* revert config edit\n\n* revert\n\n[…]\nn <10783929+Bisaloo@users.noreply.github.com>\n\n* inline\n\n* rm off-kilter Emacs reference\n\n* logic in formals instead\n\n---------\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "lint(text=) finds local settings again (#2863)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-25T14:42:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eec3d4177f7f37651d01809c84e47e22b78f4652",
          "body": "…969)\n\n* Revert \"brace_linter() covers test_that() without braces (#2808)\"\n\nThis reverts commit b9c4205cfb178af8cd8aa5a432cc1696262c2905.\n\n* restore nufuzz end\n\n* remove NEWS too",
          "is_bot": false,
          "headline": "Revert \"brace_linter() covers test_that() without braces (#2808)\" (#2…",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-25T03:56:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20404c2f847040875facf24b35bca1c606e8e276",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v5...v6)\n\n---\nupdated-dependenc\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": "Bump actions/checkout from 5 to 6 (#2970)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-11-25T02:52:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "367db02fdf7a974d797a1c42335261adee23d702",
          "body": "* logic to make linters robust to adversarial comments\n\n* remove those under #2827\n\n* more in sync with #2827 in/out rule\n\n* need known_safe\n\n* delint\n\n* add a comment\n\n* spurious ws\n\n* review feedback\n\n* update / improve comment about needs_braces=TRUE\n\n* bad merge: needs to be following-sibling",
          "is_bot": false,
          "headline": "Logic to make linters robust to adversarial comments (#2901)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-19T15:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e67713de922675d77a62d71280de79a449ab1ad6",
          "body": "* further normalization of expect_lint\n\n* rm vestigial ws\n\n* caller_env is from rlang",
          "is_bot": false,
          "headline": "Further normalization of expect_lint (#2967)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-18T18:34:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "132a6dd48353fd135706ef44ec7b45df8ea5cdc2",
          "body": null,
          "is_bot": false,
          "headline": "fix for testthat 3.3.0 (#2966)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-16T06:25:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "252b4f40358ee96046529d89d02ee84100d28017",
          "body": "…2799)\n\n* ignore string contents optionally\n\n* expect_no_lint\n\n* test with no string input\n\n* revert as.integer()\n\n* more tests against off-by-one issue\n\n* typo: with->width\n\n* try simpler version\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>\n\n* Revert \"try simpler version\n[…]\nverts commit b7ff1e31ecd8642913c4b3dd4c519416ee1f9240.\n\n* new test\n\n* example\n\n* another example of an inline string\n\n---------\n\nCo-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Ignore multi-line string contents optionally in line_length_linter (#…",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-11-11T15:27:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57ced9c2d802e63430a251d430423fe11592177e",
          "body": "Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.3 to 4.7.4.\n- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)\n- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.3...v4.7.4)\n\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": "Bump JamesIves/github-pages-deploy-action from 4.7.3 to 4.7.4 (#2965)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-11-10T09:00:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81eba81f1744c2107c66c2fd3e2afed6e4e6ad06",
          "body": "* Fix `package_hooks_linter` to validate `.onUnload()` arguments\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* more generic wording for test title\n\n* extraneous test\n\n* extraneous test\n\n* vestigial whitespace\n\n* use 'teardown' again\n\n* use expect_no_lint for unrelated tests too\n\n---------\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\nCo-authored-by: Michael Chirico <michaelchirico4@gmail.com>\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Fix `package_hooks_linter` to validate `.onUnload()` arguments (#2964)",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2025-11-03T18:23:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec332f1bddab45bc763bffb046c6fb337def9fa0",
          "body": "Co-authored-by: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Fix duplicate entry for undesirable operators (#2961)",
          "author_name": "clerousset",
          "author_login": "clerousset",
          "committed_at": "2025-11-01T11:47:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6ac90b98a8b8f9817182d7ce9c08a491252e08f",
          "body": "* feat: argument to disable linting of ( for auto-printing\n\ncloses r-lib#2916\n\nsupersedes r-lib#2919\n\n* update NEWS\n\n* tweak argument description",
          "is_bot": false,
          "headline": "feat: argument to disable linting of `(` for auto-printing (#2962)",
          "author_name": "Tim Taylor",
          "author_login": "TimTaylor",
          "committed_at": "2025-10-29T17:01:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65229d888910108efd03504b00eed11440938776",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\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": "Bump actions/upload-artifact from 4 to 5 (#2959)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-10-28T21:37:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "23ebb17f8c95b5ec4f21e0ea86a6190446037558",
          "body": "…2958)",
          "is_bot": false,
          "headline": "Note potential danger if argument can be NA in scalar_in_linter(). (#…",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-22T20:34:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "975c916b6e5d0dfeb85b1a93db85f322dab88ca8",
          "body": "* Make the message from cyclocomp_linter() more actionable.\n\n* Revert output changes.\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Make the message from cyclocomp_linter() more actionable (#2953)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-20T18:37:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eaf3aae2c08b8c85d2ad163939409e2c9c39463a",
          "body": null,
          "is_bot": false,
          "headline": "Remove duplicated condition from paren_body_linter(). (#2954)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-20T06:59:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27a959dc4ff9b87aced19e0adf0ecd8896c4e853",
          "body": "* Lint nrow, ncol, NROW and NCOL with logical expressions.\n\n* Address review comments.\n\n* Fix indentation.\n\n* tidy up tests\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Lint nrow, ncol, NROW and NCOL with logical expressions (#2952)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-17T22:27:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aff43f12390b9a093652585ba9d79e695e55bec8",
          "body": "Co-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Use expect_no_lint() instead of expect_lint(., NULL). (#2950)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-17T17:29:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae6b6a766383f37da915f38fc3a7d36bfb309673",
          "body": null,
          "is_bot": false,
          "headline": "init (#2948)",
          "author_name": "Etienne Bacher",
          "author_login": "etiennebacher",
          "committed_at": "2025-10-17T14:34:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "552668b6706f5d4151955265ad9e46f953aae7a8",
          "body": "* Don't lint T and F if followed by `[`.\n\n* Address review comments.\n\n* subsume into same expr[] as $ and @\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Don't lint T and F if followed by `[` (#2947)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-16T20:34:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77f0dae6f580eeab8a53f5375d8ab3b783169500",
          "body": null,
          "is_bot": false,
          "headline": "Report a helpful error if linters_with_tags() specifies no tags. (#2942)",
          "author_name": "Marco Colombo",
          "author_login": "mcol",
          "committed_at": "2025-10-16T16:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ecf0c5885a27a4cf766e7926bba133fbfeb9de1",
          "body": null,
          "is_bot": false,
          "headline": "clarify reasoning for repeat{} vs. while(TRUE){}",
          "author_name": "Etienne Bacher",
          "author_login": "etiennebacher",
          "committed_at": "2025-10-15T22:30:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eba33997dbcdf6651f82743d58d0d74a88b935dc",
          "body": "* Partial fix for upcoming testthat release\n\n`expect_success()` and `expect_failure()` now test that you have exactly one success/failure and zero failures/successes. I can't quite figure out why the tests are still failing here; maybe it's something to do with recycling? I'm happy to help but I unf\n[…]\n CRAN on Nov 10.\n\n* simple delint\n\n* extract to helper for cyclo complexity\n\n* avoid testthat::expect() again\n\n* fail() needs return()\n\n---------\n\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Partial fix for upcoming testthat release (#2937)",
          "author_name": "Hadley Wickham",
          "author_login": "hadley",
          "committed_at": "2025-10-08T16:36:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "275ed7dcd109eea7349ecd58fe90f447e1a48b4f",
          "body": "* Fix false positive for null coalescing without else clause\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\n\n* cite in NEWS\n\n---------\n\nSigned-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>\nCo-authored-by: Michael Chirico <chiricom@google.com>",
          "is_bot": false,
          "headline": "Fix false positive for null coalescing without else clause (#2938)",
          "author_name": "Emmanuel Ferdman",
          "author_login": "emmanuel-ferdman",
          "committed_at": "2025-10-07T04:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b70b522191e153a1ee47e87e1d3fa90022285dd",
          "body": "* Use base:: qualification to avoid linking backports in roxygen2\n\n* continuing...\n\n* stopifnot\n\n* stopifnot, again\n\n* try a regex approach\n\n* use roxygen2 7.3.3\n\n* remove TODO",
          "is_bot": false,
          "headline": "Update roxygen2 to 7.3.3 (#2930)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-09-16T20:34:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cab403fc917f0cc8db315582ea015d6e8668562",
          "body": null,
          "is_bot": false,
          "headline": "Skip quarto installation in CI (#2928)",
          "author_name": "Michael Chirico",
          "author_login": "MichaelChirico",
          "committed_at": "2025-09-16T13:05:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33efecf7f4aee58fbc9d4f2e1f3fda5ae908ed42",
          "body": null,
          "is_bot": false,
          "headline": "Add .lintr to .Rbuildignore in use_lintr() (#2926)",
          "author_name": "Hugo Gruson",
          "author_login": "Bisaloo",
          "committed_at": "2025-08-25T09:21:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcb12d2656bfcf29f45b2326fe078aea673689fb",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v5)\n\n---\nupdated-dependenc\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": "Bump actions/checkout from 4 to 5 (#2925)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-08-18T17:34:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1939058487c6e4b25353c3f8d51298029d8042bd",
          "body": null,
          "is_bot": false,
          "headline": "Removed sentenced about vectorized path argumented in lint_dir() (#2924)",
          "author_name": "Steve Martin",
          "author_login": "marberts",
          "committed_at": "2025-08-07T18:16:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 113,
      "latest_release_at": "2026-07-16T04:57:25Z",
      "latest_release_tag": "v3.4.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 35,
      "days_since_latest_release": 7,
      "mean_days_between_releases": 227.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 200,
      "stars": 1288,
      "watchers": 19,
      "fork_history": {
        "days": [
          {
            "date": "2014-09-28",
            "count": 1
          },
          {
            "date": "2015-01-04",
            "count": 1
          },
          {
            "date": "2015-01-23",
            "count": 1
          },
          {
            "date": "2015-02-04",
            "count": 2
          },
          {
            "date": "2015-02-06",
            "count": 1
          },
          {
            "date": "2015-03-06",
            "count": 1
          },
          {
            "date": "2015-03-09",
            "count": 1
          },
          {
            "date": "2015-03-31",
            "count": 1
          },
          {
            "date": "2015-05-04",
            "count": 1
          },
          {
            "date": "2015-05-16",
            "count": 1
          },
          {
            "date": "2015-05-18",
            "count": 1
          },
          {
            "date": "2015-09-09",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2015-10-21",
            "count": 1
          },
          {
            "date": "2015-10-27",
            "count": 1
          },
          {
            "date": "2015-12-29",
            "count": 1
          },
          {
            "date": "2016-02-24",
            "count": 1
          },
          {
            "date": "2016-03-15",
            "count": 1
          },
          {
            "date": "2016-03-16",
            "count": 1
          },
          {
            "date": "2016-04-13",
            "count": 1
          },
          {
            "date": "2016-05-06",
            "count": 1
          },
          {
            "date": "2016-05-20",
            "count": 1
          },
          {
            "date": "2016-05-23",
            "count": 1
          },
          {
            "date": "2016-07-19",
            "count": 1
          },
          {
            "date": "2016-08-09",
            "count": 1
          },
          {
            "date": "2016-09-08",
            "count": 1
          },
          {
            "date": "2016-10-17",
            "count": 1
          },
          {
            "date": "2016-11-06",
            "count": 1
          },
          {
            "date": "2016-11-08",
            "count": 1
          },
          {
            "date": "2017-01-08",
            "count": 1
          },
          {
            "date": "2017-01-13",
            "count": 1
          },
          {
            "date": "2017-02-02",
            "count": 1
          },
          {
            "date": "2017-02-14",
            "count": 1
          },
          {
            "date": "2017-03-06",
            "count": 1
          },
          {
            "date": "2017-03-26",
            "count": 1
          },
          {
            "date": "2017-04-19",
            "count": 1
          },
          {
            "date": "2017-05-08",
            "count": 1
          },
          {
            "date": "2017-05-17",
            "count": 1
          },
          {
            "date": "2017-05-24",
            "count": 1
          },
          {
            "date": "2017-06-18",
            "count": 1
          },
          {
            "date": "2017-06-30",
            "count": 1
          },
          {
            "date": "2017-07-03",
            "count": 1
          },
          {
            "date": "2017-07-13",
            "count": 1
          },
          {
            "date": "2017-08-18",
            "count": 1
          },
          {
            "date": "2017-09-01",
            "count": 1
          },
          {
            "date": "2017-09-05",
            "count": 1
          },
          {
            "date": "2017-09-12",
            "count": 1
          },
          {
            "date": "2017-09-22",
            "count": 1
          },
          {
            "date": "2017-10-16",
            "count": 1
          },
          {
            "date": "2017-11-26",
            "count": 1
          },
          {
            "date": "2017-12-05",
            "count": 1
          },
          {
            "date": "2017-12-15",
            "count": 1
          },
          {
            "date": "2017-12-21",
            "count": 1
          },
          {
            "date": "2018-01-08",
            "count": 1
          },
          {
            "date": "2018-02-08",
            "count": 1
          },
          {
            "date": "2018-02-14",
            "count": 1
          },
          {
            "date": "2018-02-22",
            "count": 2
          },
          {
            "date": "2018-02-23",
            "count": 1
          },
          {
            "date": "2018-03-12",
            "count": 1
          },
          {
            "date": "2018-04-08",
            "count": 1
          },
          {
            "date": "2018-05-17",
            "count": 1
          },
          {
            "date": "2018-05-19",
            "count": 1
          },
          {
            "date": "2018-06-02",
            "count": 1
          },
          {
            "date": "2018-06-07",
            "count": 1
          },
          {
            "date": "2018-06-12",
            "count": 1
          },
          {
            "date": "2018-06-19",
            "count": 1
          },
          {
            "date": "2018-06-21",
            "count": 1
          },
          {
            "date": "2018-07-25",
            "count": 1
          },
          {
            "date": "2018-08-13",
            "count": 1
          },
          {
            "date": "2018-08-21",
            "count": 1
          },
          {
            "date": "2018-09-18",
            "count": 1
          },
          {
            "date": "2018-09-27",
            "count": 1
          },
          {
            "date": "2018-12-18",
            "count": 1
          },
          {
            "date": "2019-01-15",
            "count": 1
          },
          {
            "date": "2019-01-19",
            "count": 1
          },
          {
            "date": "2019-01-24",
            "count": 1
          },
          {
            "date": "2019-01-30",
            "count": 1
          },
          {
            "date": "2019-03-12",
            "count": 1
          },
          {
            "date": "2019-04-23",
            "count": 1
          },
          {
            "date": "2019-05-22",
            "count": 1
          },
          {
            "date": "2019-06-02",
            "count": 1
          },
          {
            "date": "2019-06-03",
            "count": 1
          },
          {
            "date": "2019-06-08",
            "count": 1
          },
          {
            "date": "2019-06-27",
            "count": 1
          },
          {
            "date": "2019-07-01",
            "count": 1
          },
          {
            "date": "2019-08-09",
            "count": 1
          },
          {
            "date": "2019-08-31",
            "count": 1
          },
          {
            "date": "2019-09-20",
            "count": 1
          },
          {
            "date": "2019-10-09",
            "count": 1
          },
          {
            "date": "2019-10-19",
            "count": 1
          },
          {
            "date": "2019-10-21",
            "count": 1
          },
          {
            "date": "2019-11-04",
            "count": 1
          },
          {
            "date": "2019-11-18",
            "count": 1
          },
          {
            "date": "2019-12-11",
            "count": 1
          },
          {
            "date": "2019-12-29",
            "count": 1
          },
          {
            "date": "2020-02-04",
            "count": 1
          },
          {
            "date": "2020-02-11",
            "count": 1
          },
          {
            "date": "2020-02-13",
            "count": 1
          },
          {
            "date": "2020-02-20",
            "count": 1
          },
          {
            "date": "2020-02-21",
            "count": 1
          },
          {
            "date": "2020-02-24",
            "count": 1
          },
          {
            "date": "2020-02-25",
            "count": 1
          },
          {
            "date": "2020-03-06",
            "count": 1
          },
          {
            "date": "2020-03-18",
            "count": 2
          },
          {
            "date": "2020-04-30",
            "count": 1
          },
          {
            "date": "2020-05-11",
            "count": 1
          },
          {
            "date": "2020-05-22",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-06-20",
            "count": 1
          },
          {
            "date": "2020-08-18",
            "count": 1
          },
          {
            "date": "2020-09-03",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-10-08",
            "count": 1
          },
          {
            "date": "2020-10-21",
            "count": 1
          },
          {
            "date": "2020-11-22",
            "count": 1
          },
          {
            "date": "2020-12-27",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-03-14",
            "count": 1
          },
          {
            "date": "2021-03-16",
            "count": 2
          },
          {
            "date": "2021-03-31",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 1
          },
          {
            "date": "2021-04-11",
            "count": 1
          },
          {
            "date": "2021-04-30",
            "count": 1
          },
          {
            "date": "2021-05-08",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 1
          },
          {
            "date": "2021-05-13",
            "count": 1
          },
          {
            "date": "2021-06-08",
            "count": 1
          },
          {
            "date": "2021-06-26",
            "count": 1
          },
          {
            "date": "2021-07-19",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-09-21",
            "count": 1
          },
          {
            "date": "2021-09-27",
            "count": 1
          },
          {
            "date": "2021-12-27",
            "count": 1
          },
          {
            "date": "2022-01-01",
            "count": 1
          },
          {
            "date": "2022-03-02",
            "count": 1
          },
          {
            "date": "2022-03-21",
            "count": 1
          },
          {
            "date": "2022-03-23",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-05-10",
            "count": 1
          },
          {
            "date": "2022-05-31",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 1
          },
          {
            "date": "2022-06-19",
            "count": 1
          },
          {
            "date": "2022-07-21",
            "count": 1
          },
          {
            "date": "2022-08-07",
            "count": 1
          },
          {
            "date": "2022-08-25",
            "count": 1
          },
          {
            "date": "2022-10-20",
            "count": 1
          },
          {
            "date": "2022-10-28",
            "count": 1
          },
          {
            "date": "2022-11-26",
            "count": 1
          },
          {
            "date": "2022-12-11",
            "count": 1
          },
          {
            "date": "2022-12-18",
            "count": 1
          },
          {
            "date": "2022-12-22",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 1
          },
          {
            "date": "2023-04-06",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-05-31",
            "count": 1
          },
          {
            "date": "2023-07-05",
            "count": 1
          },
          {
            "date": "2023-07-24",
            "count": 1
          },
          {
            "date": "2023-07-27",
            "count": 1
          },
          {
            "date": "2023-07-28",
            "count": 1
          },
          {
            "date": "2023-08-24",
            "count": 1
          },
          {
            "date": "2023-09-04",
            "count": 1
          },
          {
            "date": "2023-10-15",
            "count": 1
          },
          {
            "date": "2023-12-09",
            "count": 1
          },
          {
            "date": "2023-12-18",
            "count": 1
          },
          {
            "date": "2023-12-23",
            "count": 1
          },
          {
            "date": "2024-01-11",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-05-23",
            "count": 1
          },
          {
            "date": "2024-07-29",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-09-30",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-11-07",
            "count": 1
          },
          {
            "date": "2025-03-14",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 1
          },
          {
            "date": "2025-06-07",
            "count": 1
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-31",
            "count": 1
          },
          {
            "date": "2025-08-03",
            "count": 1
          },
          {
            "date": "2025-08-04",
            "count": 1
          },
          {
            "date": "2025-08-07",
            "count": 1
          },
          {
            "date": "2025-08-26",
            "count": 1
          },
          {
            "date": "2025-10-16",
            "count": 2
          },
          {
            "date": "2025-10-28",
            "count": 1
          },
          {
            "date": "2025-12-02",
            "count": 1
          },
          {
            "date": "2026-02-26",
            "count": 1
          },
          {
            "date": "2026-02-27",
            "count": 1
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 198,
        "total_forks": 200
      },
      "star_history": null,
      "open_issues_and_prs": 304
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": true,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": null,
      "source_files_sampled": 0,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 11,
        "merged_prs": 1382,
        "open_issues": 293,
        "closed_ratio": 0.813,
        "closed_issues": 1274,
        "closed_unmerged_prs": 135
      },
      "bus_factor": 2,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "MichaelChirico",
          "commits": 766,
          "avatar_url": "https://avatars.githubusercontent.com/u/7606389?v=4"
        },
        {
          "type": "User",
          "login": "jimhester",
          "commits": 432,
          "avatar_url": "https://avatars.githubusercontent.com/u/205275?v=4"
        },
        {
          "type": "User",
          "login": "AshesITR",
          "commits": 325,
          "avatar_url": "https://avatars.githubusercontent.com/u/2363178?v=4"
        },
        {
          "type": "User",
          "login": "IndrajeetPatil",
          "commits": 229,
          "avatar_url": "https://avatars.githubusercontent.com/u/11330453?v=4"
        },
        {
          "type": "User",
          "login": "fangly",
          "commits": 58,
          "avatar_url": "https://avatars.githubusercontent.com/u/231905?v=4"
        },
        {
          "type": "User",
          "login": "renkun-ken",
          "commits": 52,
          "avatar_url": "https://avatars.githubusercontent.com/u/4662568?v=4"
        },
        {
          "type": "User",
          "login": "russHyde",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/7734886?v=4"
        },
        {
          "type": "User",
          "login": "Bisaloo",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/10783929?v=4"
        },
        {
          "type": "User",
          "login": "dragosmg",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/13176361?v=4"
        },
        {
          "type": "User",
          "login": "gaborcsardi",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/660288?v=4"
        }
      ],
      "contributors_sampled": 99,
      "top_contributor_share": 0.36
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "R-CMD-check-hard.yaml",
        "R-CMD-check.yaml",
        "ast-fuzz.yaml",
        "check-all-examples.yaml",
        "lint.yaml",
        "pkgdown.yaml",
        "repo-meta-tests.yaml",
        "test-coverage-examples.yaml",
        "test-coverage.yaml",
        "test-package-vigilant.yaml"
      ],
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "27 out of 27 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": 3,
            "reason": "Found 10/28 approved changesets -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 42 contributing companies or organizations",
            "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": 9,
            "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 20 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not 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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "199d40a3ea79833318faadb72e0a527e5b6ad8a4",
        "ran_at": "2026-07-23T16:09:40Z",
        "aggregate_score": 5.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T05:56:15Z",
      "oldest_open_prs": [
        {
          "number": 2449,
          "created_at": "2023-12-15T06:53:02Z",
          "last_comment_at": "2023-12-16T17:03:54Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 2621,
          "created_at": "2024-06-22T12:54:28Z",
          "last_comment_at": "2026-07-06T14:52:08Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 2907,
          "created_at": "2025-07-30T12:43:08Z",
          "last_comment_at": "2026-07-06T14:38:38Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 3017,
          "created_at": "2026-02-26T12:09:14Z",
          "last_comment_at": "2026-07-06T14:39:10Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 3052,
          "created_at": "2026-05-27T14:36:54Z",
          "last_comment_at": "2026-05-27T14:40:45Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 3056,
          "created_at": "2026-06-09T10:19:16Z",
          "last_comment_at": "2026-07-06T14:39:22Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 3088,
          "created_at": "2026-07-19T06:05:54Z",
          "last_comment_at": "2026-07-19T06:09:16Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 3090,
          "created_at": "2026-07-20T17:10:09Z",
          "last_comment_at": "2026-07-20T17:28:01Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 3092,
          "created_at": "2026-07-20T22:01:01Z",
          "last_comment_at": "2026-07-20T22:04:35Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 3093,
          "created_at": "2026-07-21T05:49:47Z",
          "last_comment_at": "2026-07-21T05:53:53Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 3095,
          "created_at": "2026-07-23T00:05:43Z",
          "last_comment_at": "2026-07-23T00:09:26Z",
          "last_comment_author": "codecov"
        }
      ],
      "last_merged_pr_at": "2026-07-21T05:51:23Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 104,
          "created_at": "2015-07-24T04:51:58Z",
          "last_comment_at": "2023-11-14T23:36:40Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 131,
          "created_at": "2016-01-05T14:58:03Z",
          "last_comment_at": "2023-08-11T02:50:00Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 265,
          "created_at": "2017-09-11T15:38:12Z",
          "last_comment_at": "2023-08-11T02:52:53Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 295,
          "created_at": "2018-02-19T15:04:42Z",
          "last_comment_at": "2022-06-19T14:39:54Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 383,
          "created_at": "2019-05-05T16:18:31Z",
          "last_comment_at": "2021-10-04T17:45:10Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 436,
          "created_at": "2019-12-12T13:28:37Z",
          "last_comment_at": "2022-06-19T15:26:46Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 454,
          "created_at": "2020-02-04T16:10:48Z",
          "last_comment_at": "2025-02-24T22:28:06Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 459,
          "created_at": "2020-02-20T08:20:20Z",
          "last_comment_at": "2025-02-20T20:47:54Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 468,
          "created_at": "2020-03-16T13:57:42Z",
          "last_comment_at": "2024-01-19T08:44:24Z",
          "last_comment_author": "ssh352"
        },
        {
          "number": 485,
          "created_at": "2020-04-26T09:46:00Z",
          "last_comment_at": "2022-06-19T16:44:28Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 504,
          "created_at": "2020-06-30T10:17:32Z",
          "last_comment_at": "2024-04-02T05:09:35Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 512,
          "created_at": "2020-08-19T09:21:45Z",
          "last_comment_at": "2022-09-24T15:50:24Z",
          "last_comment_author": "IndrajeetPatil"
        },
        {
          "number": 577,
          "created_at": "2020-11-23T00:54:45Z",
          "last_comment_at": "2023-09-11T22:09:30Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 580,
          "created_at": "2020-11-23T12:26:37Z",
          "last_comment_at": "2020-12-03T13:16:53Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 690,
          "created_at": "2020-12-06T18:07:05Z",
          "last_comment_at": "2021-01-31T22:12:08Z",
          "last_comment_author": "AshesITR"
        },
        {
          "number": 741,
          "created_at": "2021-02-08T18:42:43Z",
          "last_comment_at": "2022-10-04T16:02:01Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 764,
          "created_at": "2021-02-17T22:55:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 773,
          "created_at": "2021-03-05T03:42:08Z",
          "last_comment_at": "2024-10-05T14:58:10Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 784,
          "created_at": "2021-03-21T03:07:29Z",
          "last_comment_at": "2021-04-04T06:16:48Z",
          "last_comment_author": "MichaelChirico"
        },
        {
          "number": 797,
          "created_at": "2021-05-10T06:05:01Z",
          "last_comment_at": "2021-06-10T13:31:09Z",
          "last_comment_author": "jimhester"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/r-lib/lintr",
    "host": "github.com",
    "name": "lintr",
    "owner": "r-lib"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 73,
      "inputs": {
        "security": 58,
        "vitality": 86,
        "community": 78,
        "governance": 71,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "commits_last_year": 113,
              "human_commit_share": 0.89,
              "days_since_last_push": 0,
              "active_weeks_last_year": 35
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "35/52 weeks with commits",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 35
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "113 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 113
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "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": 84,
            "inputs": {
              "releases_count": 17,
              "latest_release_tag": "v3.4.0",
              "releases_from_tags": false,
              "days_since_latest_release": 7,
              "mean_days_between_releases": 227.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~227.6 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 227.6
                    }
                  }
                ],
                "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": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 78,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "forks": 200,
              "stars": 1288,
              "watchers": 19,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1,288 stars",
                "points": 50.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1288
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "200 forks",
                "points": 19.2,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 200
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "19 watchers",
                "points": 7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "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": 13.5,
                "status": "met",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 71,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 99,
              "top_contributor_share": 0.36
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 36% of commits",
                "points": 14.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 36
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "99 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 42 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "merged_prs": 1382,
              "open_issues": 293,
              "closed_issues": 1274,
              "issue_closed_ratio": 0.813,
              "closed_unmerged_prs": 135
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "81% of issues closed",
                "points": 38,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1382/1517 decided PRs merged",
                "points": 34.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1382,
                      "decided": 1517
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 10/28 approved changesets -- score normalized to 3",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "followers": 748,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "r-lib",
              "public_repos": 165,
              "account_age_days": 3579
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "748 followers of r-lib",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 748,
                      "login": "r-lib"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "165 public repos, account ~9 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 165
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "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.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "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": "10 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "27 out of 27 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": [
                "linter",
                "r"
              ],
              "has_wiki": true,
              "homepage": "https://lintr.r-lib.org",
              "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://lintr.r-lib.org",
                "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": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 5.8
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "27 out of 27 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 10/28 approved changesets -- score normalized to 3",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 42 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 20 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "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"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 11
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 34,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.933,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "83 of 89 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 83,
                      "sampled": 89
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": true,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.11
            },
            "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "devcontainer, Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "devcontainer, Dockerfile"
                    }
                  }
                ],
                "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": "11 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 11,
                      "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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "critical",
            "name": "Code legibility for models",
            "note": "Excluded from scoring (no data or not applicable): Manageable file sizes. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "manageable_file_sizes"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "primary_language": "R",
              "largest_source_bytes": null,
              "source_files_sampled": 0,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "R without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "R"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "no source files detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_source_files",
                    "params": {}
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "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? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:10:11.290636Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/r-lib/lintr.svg",
  "full_name": "r-lib/lintr",
  "license_state": "custom",
  "license_spdx": null
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statistics.