原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 250,
"has_wiki": false,
"homepage": null,
"languages": {
"PHP": 209053
},
"pushed_at": "2026-06-27T18:40:20Z",
"created_at": "2021-10-13T20:49:48Z",
"owner_type": "Organization",
"updated_at": "2026-07-20T14:34:01Z",
"description": "Revolt is a rock-solid event loop for concurrent PHP applications.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "PHP",
"significant_languages": [
"PHP"
]
},
"owner": {
"blog": "https://revolt.run",
"name": "Revolt PHP",
"type": "Organization",
"login": "revoltphp",
"company": null,
"location": null,
"followers": 73,
"avatar_url": "https://avatars.githubusercontent.com/u/81093196?v=4",
"created_at": "2021-03-21T14:11:27Z",
"is_verified": null,
"public_repos": 3,
"account_age_days": 1949
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2026-05-16T18:05:37Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2025-11-27T07:07:17Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2025-02-15T00:46:22Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2023-12-01T04:58:26Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2023-11-19T14:50:50Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2023-10-22T03:29:24Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2023-07-29T17:09:44Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2023-07-21T22:44:15Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2023-04-02T16:36:17Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2022-11-03T19:03:30Z"
},
{
"tag": "v0.2.5",
"kind": "patch",
"published_at": "2022-08-01T14:16:13Z"
},
{
"tag": "v0.2.4",
"kind": "patch",
"published_at": "2022-03-13T21:25:28Z"
},
{
"tag": "v0.2.3",
"kind": "patch",
"published_at": "2022-03-04T19:51:52Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2022-02-20T17:38:18Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2022-02-03T19:07:10Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2022-01-14T17:53:34Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2021-12-10T00:58:20Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2021-12-01T22:03:31Z"
}
],
"recent_commits": [
{
"oid": "7b2ce25ca927194808d9f330ccfdbc8244ce65a5",
"body": "Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n dependency-version: '6'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/cache from 5 to 6",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-27T18:40:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "084cf2a9af205c79aba8ac120956004f18481132",
"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[…]\n:\n- dependency-name: actions/checkout\n dependency-version: '7'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/checkout from 6 to 7",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-20T20:11:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9a4a33ff699626630b4fcd18025e40e967d060e2",
"body": null,
"is_bot": false,
"headline": "Move type getter into callback classes",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-06-02T23:13:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "988b79ba19c3906899eb7c676791a5565fd297ff",
"body": null,
"is_bot": false,
"headline": "Add helper method for creating socket pair",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-06-02T23:04:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bb6cea4b48b4b7f07d57c871709879911ed009f",
"body": "…about closed stream resources",
"is_bot": false,
"headline": "Catch ValueError from stream_select and rethrow with additional note …",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-06-02T00:17:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44061cf513e53c6200372fc935ac42271566295d",
"body": null,
"is_bot": false,
"headline": "Suppress additional false-positives",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-05-16T17:55:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7aa454094c79b1f50d9af007d783c103acd0874c",
"body": null,
"is_bot": false,
"headline": "Skip Psalm on 8.1, add to 8.4 and 8.5",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-05-16T17:48:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ea6a5d4cef7d54e2737b053fb7374f2df44bc8b",
"body": null,
"is_bot": false,
"headline": "Fix or suppress Psalm 6 issues",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-05-16T17:45:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ee4a3d31b206888bce006f859d5b359a21a8aa2",
"body": null,
"is_bot": false,
"headline": "Add #[Override] attributes",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-05-16T17:27:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b83e22384f25ea697f80a70dd6571d4131aecaf",
"body": null,
"is_bot": false,
"headline": "Upgrade to Psalm 6",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2026-05-16T17:25:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5330d42c850483d7a9ecaf18836552700e222f98",
"body": "Co-authored-by: Bob Weinand <bobwei9@hotmail.com>\nCo-authored-by: Aaron Piotrowski <aaron@trowski.com>",
"is_bot": false,
"headline": "Fix #105 (#121)",
"author_name": "Daniil Gentili",
"author_login": "danog",
"committed_at": "2026-05-16T17:22:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1cb5ce8a92b931cf80d7936e1b36b171418f3749",
"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[…]\n:\n- dependency-name: actions/checkout\n dependency-version: '6'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/checkout from 5 to 6",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-09T18:03:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "70722c506cdf530081711e81707c8ed20f0e6322",
"body": "Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n dependency-version: '5'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/cache from 4 to 5",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-09T18:03:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d061c4bad8df10fd253c3554bbb545d81bd72153",
"body": null,
"is_bot": false,
"headline": "Add dependabot config",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2026-05-09T18:01:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41f9c458c096aaf0ccc2cdc8e8f6f42dee3c8322",
"body": null,
"is_bot": false,
"headline": "Remove nick-invision/retry@v2",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2025-11-27T07:04:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8201f5b7c637284f4874624b6e5d3850d63e990",
"body": null,
"is_bot": false,
"headline": "Add PHP 8.5 to build pipeline",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2025-11-27T07:04:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6fc06dce8e9b523c9946138fa5e62181934f91c",
"body": null,
"is_bot": false,
"headline": "Update actions/checkout to v5",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2025-08-27T21:33:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31e5e9f7c8f62f235c96ebdca21d31fc94e88dad",
"body": "…110)\n\nCo-authored-by: Niklas Keller <me@kelunik.com>\nCo-authored-by: Nicolas Grekas <nicolas.grekas@gmail.com>",
"is_bot": false,
"headline": "Use str_increment() when possible to increment non-numeric strings (#…",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2025-08-27T09:53:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd97bc9d9eeee5eba5055637df70a654b1294bde",
"body": null,
"is_bot": false,
"headline": "Update CI build",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2025-03-13T00:55:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09bf1bf7f7f574453efe43044b06fafe12216eb3",
"body": null,
"is_bot": false,
"headline": "Explicitly forbid serialization and deserialization of driver",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2025-01-25T19:27:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f0e16e48eb3c679bd3f6ebcc651b22d6a537d731",
"body": null,
"is_bot": false,
"headline": "Remove outdated strict_types statement",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2025-01-25T19:26:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2d24481108ec1ccf65c024fca9cd4063c39602e",
"body": null,
"is_bot": false,
"headline": "Alternative fix for callbacks queued in destructors (#100)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2025-01-25T19:20:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "358572ca31647df7dbe930f13c8567136beffa33",
"body": "See https://github.com/JetBrains/phpstorm-stubs/pull/1627.",
"is_bot": false,
"headline": "Suppress PossiblyInvalidArgument for uv due to outdated stubs",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2024-03-19T22:02:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83367335d42728fe7ed2d8097626e8fdd0f1c174",
"body": null,
"is_bot": false,
"headline": "Skip psalm on PHP 8.4",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2024-03-19T20:52:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "402bd909a94bb4cfb915f7d21530bf74d2cfcd45",
"body": null,
"is_bot": false,
"headline": "Fix / suppress psalm issues",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2024-03-19T20:50:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be1891fa6a80721accaf987ac58d12f96ea777b1",
"body": null,
"is_bot": false,
"headline": "Add PHP 8.3 / 8.4",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2024-03-19T20:39:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "25de49af7223ba039f64da4ae9a28ec2d10d0254",
"body": null,
"is_bot": false,
"headline": "Fix unsetting {main} suspension",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-11-30T05:34:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fce6063869513de56f639aa522b2ef2fedbf8d73",
"body": null,
"is_bot": false,
"headline": "Cleanup memory leak test",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-11-19T14:45:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad46c9445d60ebc7be3f3b0587f126b861a50ed7",
"body": "Co-authored-by: Daniil Gentili <daniil@daniil.it>",
"is_bot": false,
"headline": "Discard {main} suspension on uncaught exception from loop (#71)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-11-19T14:06:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c29e0300a2befdb0fa5f3392d902f2ca483fa90f",
"body": null,
"is_bot": false,
"headline": "Upgrade Psalm to 5.x",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-11-18T16:21:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "136e9736450e1ae6dc58e93c486e2c21a11a1214",
"body": null,
"is_bot": false,
"headline": "Add link to Github docs",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-10-31T12:54:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dcc7ef86f1e0897674e8df10f02bec07c5ddde8e",
"body": null,
"is_bot": false,
"headline": "Add SECURITY.md",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-10-31T12:50:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "40292c18e53d9a1b7e6c807f4fda5908552e1ba5",
"body": null,
"is_bot": false,
"headline": "Rename property to avoid JIT bug",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-10-22T03:19:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0fe2d31e1cddd26664e55d383d3d5da613334c03",
"body": null,
"is_bot": false,
"headline": "Update date in license",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-07-29T17:07:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4a69379827b9209db33da563fbfb57348967b0a9",
"body": "Do not set $suspendedFiber to null when fiber is destroyed.",
"is_bot": false,
"headline": "Check if fiber was destroyed before resuming (#84)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-07-29T17:02:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5a663bc9057d7b1a525184d2c32cd58a08ca43f",
"body": "The check is added to the constructor instead of EventLoop::getDriver() or similar to ensure it only fails if Revolt is used, but without affecting hot code paths.",
"is_bot": false,
"headline": "Add runtime check for serious GC bugs in PHP (#85)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-07-24T14:29:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b018d0ff141636d69a8054194675fe0050cf3aa9",
"body": null,
"is_bot": false,
"headline": "Fix Fiber leaks if Suspension never resumed, v2 (#82)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2023-07-20T20:16:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8405671049cc023b7d846690b51d1caf169d0a25",
"body": null,
"is_bot": false,
"headline": "Clarify event loop terminated error (#83)",
"author_name": "Daniil Gentili",
"author_login": "danog",
"committed_at": "2023-07-20T18:03:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ac31d36635c60a9b28bb2a476384c5ec55c95cc",
"body": null,
"is_bot": false,
"headline": "Run tests on PHP 8.2",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-04-02T16:25:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "873d784878e30b5bbf383b46552ec077f7c3d2d7",
"body": null,
"is_bot": false,
"headline": "Combine test run without pcntl into one job",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2023-04-02T16:22:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e638121aa6e19a0b702abf3e9d63375591e42fd6",
"body": "…ty (#77)\n\nEnsure that these functions aren't disabled before enabling signal handling.",
"is_bot": false,
"headline": "Check for pcntl_signal_dispatch and pcntl_signal functions availabili…",
"author_name": "Daniil Gentili",
"author_login": "danog",
"committed_at": "2023-04-02T16:17:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "afd3673e4de1eb7551f84639b9489597bcbd4e01",
"body": "https://docs.phpdoc.org/3.0/guide/references/phpdoc/tags/throws.html#throws",
"is_bot": false,
"headline": "Use @throws (#76)",
"author_name": "Simon Podlipsky",
"author_login": "simPod",
"committed_at": "2023-03-08T15:34:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b67a5b4ac7ece2238e5e19fec2b0631dadaa04a",
"body": null,
"is_bot": false,
"headline": "Skip FD_SETSIZE test on Windows (#74)",
"author_name": "xjaja",
"author_login": "xjaja",
"committed_at": "2023-02-24T18:47:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81dd825a0a7fa7a39cae25ef731bb944f3e18295",
"body": null,
"is_bot": false,
"headline": "Add CHANGELOG",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-11-02T21:46:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2671dfffcdb03b957e6cadf8fe4e35208d09c65",
"body": null,
"is_bot": false,
"headline": "Remove deprecated createSuspension alias",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-11-02T21:44:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e6a235bd7bbce01e13dad50b7bd7d03c81cb27cb",
"body": null,
"is_bot": false,
"headline": "Update LICENSE date",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-11-02T21:18:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "256596a879270e970594cca29902eaa63d7cd056",
"body": null,
"is_bot": false,
"headline": "Add missing strict types declaration",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-11-02T20:50:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6eca0517b05fed5e51dc0d2edb6cf2cdbba436b7",
"body": null,
"is_bot": false,
"headline": "Declare strict types (#64)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-11-02T20:00:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a515d20fbaa9bbe66226de1a520d9d24c2f3154f",
"body": null,
"is_bot": false,
"headline": "Replace getInfo with reflection API (#62)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-10-25T19:42:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0c1f51754f549d76caa90acc727bb45124a9ad0",
"body": "Allows driver decorators to report the original callable as error cause.",
"is_bot": false,
"headline": "Rethrow UncaughtThrowable without wrapping (#61)",
"author_name": "Tobias Bachert",
"author_login": "Nevay",
"committed_at": "2022-10-24T16:53:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00f99a1084cca530367216a2d49e28a741bac6eb",
"body": null,
"is_bot": false,
"headline": "Fix psalm errors (#63)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-10-13T18:42:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ba90c2a3056adcedf71a6c3ce0d83e533018bd1",
"body": null,
"is_bot": false,
"headline": "Add missing static keyword to getErrorHandler",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-10-13T18:08:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e7455506d9ff61f3705b76a20a8f12ad4dc1552",
"body": null,
"is_bot": false,
"headline": "Allow GC of arguments during microtask execution (#60)",
"author_name": "Tobias Bachert",
"author_login": "Nevay",
"committed_at": "2022-08-01T03:01:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cce7416e70e60073c5f9f87db3ec7a816080382d",
"body": "Psalm now includes these stubs itself.",
"is_bot": false,
"headline": "Remove Fiber stubs",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-07-29T18:32:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b80504287af6622d7afc549abd531a49bca1906b",
"body": "Updated docblocks with new syntax supported by PhpStorm and Psalm.",
"is_bot": false,
"headline": "Update docblock type annotations",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-07-29T18:20:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b80a2586121cc8bdcee21105b09a5872ccdab901",
"body": null,
"is_bot": false,
"headline": "Fix compatibility with PHP 8.2 (#58)",
"author_name": "Saif Eddin Gmati",
"author_login": "azjezz",
"committed_at": "2022-06-13T14:34:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf1dda6152dba76219c6132650afca0a2e9e75c4",
"body": null,
"is_bot": false,
"headline": "Require PHP 8.1 and use features (#55)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-05-31T22:55:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e14f0a6391d2913174fa9f0c14b309931fe4de6",
"body": null,
"is_bot": false,
"headline": "Fix overflow on large timers (#49)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-05-31T22:54:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ea748ac5a689df72e760f657a8cff629e1e1fa4",
"body": "Turns out this was not the correct source of the circular reference.",
"is_bot": false,
"headline": "Revert early returns in callback fiber",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-05-31T18:42:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cc0ba9c20c99204e868a8804d81295d0b2e8eae",
"body": null,
"is_bot": false,
"headline": "Add annotation for Psalm",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-05-31T15:55:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b689788668fdfc69e7aba5ed21bc66959ea7219",
"body": "…s replaced\n\nThis",
"is_bot": false,
"headline": "Early return out of callback fiber instead of suspending when fiber i…",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-05-31T14:55:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae8162e3de46ab754cdf0b3fc39ea24c56df47b1",
"body": null,
"is_bot": false,
"headline": "Remove deprecated psalm config option",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-03-04T20:47:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ea6f60ac86e3417c3c4b9b4cef9dd4b4f0f79f9",
"body": null,
"is_bot": false,
"headline": "Fix suspended fiber reference being null during destruction",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-03-04T20:43:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13ca2bac4d4470f2ac4530565c74fc719370dad9",
"body": null,
"is_bot": false,
"headline": "Fix fiber reference in error path",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-02-24T04:29:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "accd1fbb0826645c0565ad6063cda9b43a7bab56",
"body": null,
"is_bot": false,
"headline": "Allow some initial memory allocations",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-20T17:19:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "566f5d787b8d1612066858249d1e61a148a6b342",
"body": null,
"is_bot": false,
"headline": "Add suspension memory leak test",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-20T15:20:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f8c96fe37ae8f22b80da10ffa65180bdfdea8d5f",
"body": null,
"is_bot": false,
"headline": "Document expected leak for suspended fibers",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-20T13:13:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f3cb23760399b09700888a4a35b39efbbf97bb3",
"body": "* Fix Fiber reference in Suspension preventing GC\r\n\r\n* Remove unnecessary temp var and add annotation for Psalm",
"is_bot": false,
"headline": "Fix reference to Fiber in Suspension causing memory leak (#52)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-02-19T21:30:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5a268ff319347a9022f24623280adf694b6b23c",
"body": "* Add .idea folder to .gitignore\r\n\r\n* Fix seconds value of argument in example/benchmark-memory.php\r\n\r\n* Make repeat interval value to 1 millisecond\r\n\r\n* Set 1 second interval for repeating internal closure",
"is_bot": false,
"headline": "Fix value of seconds unit in example/benchmark-memory.php (#50)",
"author_name": "tnsoftbear",
"author_login": "tnsoftbear",
"committed_at": "2022-02-13T19:30:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5ddad3364d8834faa34b5d523ec670fd306e595",
"body": null,
"is_bot": false,
"headline": "Improve return type of UvDriver",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-08T19:43:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c896a6120ad5a518ade695b8b344680ac2bc8b5a",
"body": null,
"is_bot": false,
"headline": "Remove unnecessary export-ignore (#48)",
"author_name": "Nicolas Hedger",
"author_login": "nhedger",
"committed_at": "2022-02-03T22:04:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "985d23912a8d7c3af879638922d6b83aed6acb1d",
"body": null,
"is_bot": false,
"headline": "Add stack trace to all current suspensions on early exit (#46)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-03T18:58:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "487dfb432f42377cf571d5195b7cf6225738c836",
"body": null,
"is_bot": false,
"headline": "Add FiberLocal::unset (#45)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-02-02T22:21:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "223c2bd937ab6bdce91f079eee034ef5f7bd9a2b",
"body": null,
"is_bot": false,
"headline": "Add template type to Suspension (#44)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-01-21T16:45:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db42a2a0adb99a0255000a6f091bcf857d933699",
"body": "Co-authored-by: Aaron Piotrowski <aaron@trowski.com>",
"is_bot": false,
"headline": "Implement fiber local storage (#40)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-14T17:27:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d64a6ac20846433923936e30f940139c2820649",
"body": null,
"is_bot": false,
"headline": "Mark suspension as not pending after an error",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-01-14T17:09:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c7b81c550344fcacc6157bc0de0674471e2bcd9",
"body": null,
"is_bot": false,
"headline": "Fix multiple interrupts on double resumption (#41)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-14T12:00:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab798127e5dffd9e1102828678d30deaede63759",
"body": "getSuspension no longer creates a new object, but returns the same object within a fiber.\r\n\r\ncreateSuspension is only kept for BC in EventLoop for consuming libraries.",
"is_bot": false,
"headline": "Cache suspensions (#37)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-14T11:58:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5decc50235b8952ec617f16e0bd13b8c4afa3149",
"body": null,
"is_bot": false,
"headline": "Introduce separate getErrorHandler method (#35)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-11T20:05:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3778614288ff256629a6aea5cb5a955f5117a574",
"body": null,
"is_bot": false,
"headline": "Throw UnhandledThrowable if event loop stops due to an exception (#32)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-11T19:31:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1120c8785c57d32927803e786beabdeec8020549",
"body": null,
"is_bot": false,
"headline": "Also avoid re-creating callback fiber for throwing microtasks",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2022-01-11T17:21:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "138349e2114f32c1fff5f47c686fcafa4377e226",
"body": "There's no need to create a new fiber if we catch the exception, as the error method will never throw.",
"is_bot": false,
"headline": "Avoid re-creating callback fiber on exceptions",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-11T08:13:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9823c23be8b3d8323b2bfbcf7b91221b88f48ea1",
"body": null,
"is_bot": false,
"headline": "Remove fiber switches on callback fiber creation",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-11T08:13:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a581d607a19b50a295618d30da6035d962bca53b",
"body": null,
"is_bot": false,
"headline": "Install extensions on GitHub Actions (#26)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-10T20:28:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b20b0f2c53552b48089e85990532acf3b0950b0",
"body": null,
"is_bot": false,
"headline": "Remove default value for setErrorHandler (#30)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-10T19:57:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb2d6f8334bde375e2a92ba8eeb25f5d6fe18e3d",
"body": "Runs non-blocking ticks until idle. This fixes one delay callback triggering a signal and the next tick hanging then without dispatching the signal.",
"is_bot": false,
"headline": "Reduce fiber switches by queuing callbacks for each tick (#34)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2022-01-10T19:56:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a928073cc74501c1852fd9d8c8b02e550cb56517",
"body": "There are also situations where the event loop simply terminates.",
"is_bot": false,
"headline": "Unwrap exception only if suspended by interrupt",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-12-10T00:49:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4bc85e8591d66e76ef67fcb88884f8b765bd7ed",
"body": null,
"is_bot": false,
"headline": "Always rethrow errors in DriverSuspension (#31)",
"author_name": "Bob Weinand",
"author_login": "bwoebi",
"committed_at": "2021-12-09T20:42:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "498362a78884eb3bdb0a4389d01111d8d250c397",
"body": null,
"is_bot": false,
"headline": "Use \\Closure instead of callable (#27)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-12-01T22:00:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2683b2eb2d2f8f5a1a29eabcb7aefd0e6b0c0809",
"body": null,
"is_bot": false,
"headline": "Explicitly close resources, so they don't affect further tests",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-25T21:02:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "359aa98b5584af31e0b08a974edc5f061ed91e4d",
"body": "If a callback suspends while handling signals, no further signals will be processed.\n\nSee https://github.com/php/php-src/blob/d312a0c8007ffd398cbbb3cf9340db2654513cd6/ext/pcntl/pcntl.c#L1356.",
"is_bot": false,
"headline": "Fix signal handlers if callback suspends",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-25T21:02:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f4560fee912efd46720c1e8a12e7ce342634943a",
"body": null,
"is_bot": false,
"headline": "Fix AbstractDriver::isRunning",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-25T21:02:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31c8c776a8981394835dd5d2f1a4465ccfd76fde",
"body": "There shouldn't be logic in Revolt\\EventLoop, as it should just be an accessor.",
"is_bot": false,
"headline": "Move fiber handling into Driver",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-25T21:02:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ab37ad3864b28acc50f3052306e26b0fe40b1f7",
"body": null,
"is_bot": false,
"headline": "Disable signal handlers in StreamSelectDriver::__destruct",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-25T21:02:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bfd2be0049be5c1432be96393dbec77ba97101c",
"body": null,
"is_bot": false,
"headline": "Enable PHP 8.1 on GitHub Actions",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-24T23:33:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "531a57ffe3a8a7c3e5e0cf471e1f8e5da695e006",
"body": "This is equivalent to the interface change in https://github.com/reactphp/async/pull/15 to allow different implementations.\n\nThis also allows decorating `Suspension` to implement listeners like proposed in https://github.com/revoltphp/event-loop/pull/2.",
"is_bot": false,
"headline": "Turn Suspension into an interface",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-22T21:32:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc9fbe7102ba80aafff970e4940e43dd18921b7e",
"body": null,
"is_bot": false,
"headline": "Ignore new psalm false-positives",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-22T19:07:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38bda203b222911bf98e4a9aa8a62d378a4862a3",
"body": "Often there's no need for a value, and we just want to resume at the suspension point.\r\n\r\nFixes #11.",
"is_bot": false,
"headline": "Default $value to null in Suspension::resume (#19)",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-10T07:40:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8580bcc7c1f6b44aea26f7d3d231315e12144b6e",
"body": "This is due to a bug in earlier PHP versions on mixed variance rules.\n\nSee https://3v4l.org/Uc6TM.\n\nFixes #15.",
"is_bot": false,
"headline": "Restrict supported PHP versions to >= 8.0.7",
"author_name": "Niklas Keller",
"author_login": "kelunik",
"committed_at": "2021-11-09T19:07:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67ac41314e846f270a757e90d13160f4ef2d8aa7",
"body": null,
"is_bot": false,
"headline": "Fiberize error handler (#10)",
"author_name": "Aaron Piotrowski",
"author_login": "trowski",
"committed_at": "2021-11-09T19:03:58Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 18,
"commits_last_year": 18,
"latest_release_at": "2026-05-16T18:05:37Z",
"latest_release_tag": "v1.0.9",
"releases_from_tags": false,
"days_since_last_push": 24,
"active_weeks_last_year": 8,
"days_since_latest_release": 66,
"mean_days_between_releases": 143.3
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "revolt/event-loop",
"exists": true,
"license": "MIT",
"keywords": [
"event",
"event-loop",
"async",
"asynchronous",
"scheduler",
"concurrency",
"non-blocking"
],
"ecosystem": "packagist",
"matches_repo": true,
"registry_url": "https://packagist.org/packages/revolt/event-loop",
"is_deprecated": false,
"latest_version": "v1.0.9",
"repository_url": "https://github.com/revoltphp/event-loop",
"versions_count": 18,
"total_downloads": 56449634,
"dependents_count": 175,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 3668384,
"first_published_at": null,
"latest_published_at": "2026-05-16T17:55:38Z",
"latest_version_yanked": null,
"days_since_latest_publish": 66
}
]
},
"popularity": {
"forks": 38,
"stars": 926,
"watchers": 26,
"fork_history": {
"days": [
{
"date": "2021-10-27",
"count": 1
},
{
"date": "2021-10-30",
"count": 1
},
{
"date": "2021-12-02",
"count": 1
},
{
"date": "2021-12-09",
"count": 1
},
{
"date": "2021-12-28",
"count": 1
},
{
"date": "2022-01-14",
"count": 1
},
{
"date": "2022-02-01",
"count": 1
},
{
"date": "2022-02-08",
"count": 1
},
{
"date": "2022-02-11",
"count": 1
},
{
"date": "2022-02-13",
"count": 1
},
{
"date": "2022-03-08",
"count": 1
},
{
"date": "2022-04-18",
"count": 1
},
{
"date": "2022-05-17",
"count": 1
},
{
"date": "2022-06-22",
"count": 1
},
{
"date": "2022-08-31",
"count": 1
},
{
"date": "2022-10-14",
"count": 1
},
{
"date": "2022-12-01",
"count": 1
},
{
"date": "2023-01-28",
"count": 1
},
{
"date": "2023-02-23",
"count": 1
},
{
"date": "2023-03-08",
"count": 1
},
{
"date": "2023-05-06",
"count": 1
},
{
"date": "2023-05-17",
"count": 1
},
{
"date": "2023-08-02",
"count": 1
},
{
"date": "2023-10-12",
"count": 1
},
{
"date": "2023-10-30",
"count": 1
},
{
"date": "2023-10-31",
"count": 1
},
{
"date": "2023-12-20",
"count": 1
},
{
"date": "2024-12-09",
"count": 1
},
{
"date": "2025-01-26",
"count": 1
},
{
"date": "2025-03-14",
"count": 1
},
{
"date": "2025-08-25",
"count": 1
},
{
"date": "2025-08-27",
"count": 1
},
{
"date": "2025-09-16",
"count": 1
},
{
"date": "2025-10-24",
"count": 1
},
{
"date": "2025-11-27",
"count": 1
},
{
"date": "2026-02-09",
"count": 1
},
{
"date": "2026-03-16",
"count": 1
},
{
"date": "2026-03-18",
"count": 1
}
],
"complete": true,
"collected": 38,
"total_forks": 38
},
"star_history": null,
"open_issues_and_prs": 14
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 55901,
"source_files_sampled": 54,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"composer.json"
],
"advisories": {
"error": "No resolved dependencies carried a version and a supported ecosystem",
"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": 6,
"direct_affected_count": 0
},
"ecosystems": [
"packagist"
],
"dependencies": [],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "ext-json",
"direct": false,
"version": null,
"ecosystem": "packagist"
},
{
"name": "friendsofphp/php-cs-fixer",
"direct": false,
"version": null,
"ecosystem": "packagist"
},
{
"name": "jetbrains/phpstorm-stubs",
"direct": false,
"version": null,
"ecosystem": "packagist"
},
{
"name": "php",
"direct": false,
"version": null,
"ecosystem": "packagist"
},
{
"name": "phpunit/phpunit",
"direct": false,
"version": null,
"ecosystem": "packagist"
},
{
"name": "psalm/phar",
"direct": false,
"version": null,
"ecosystem": "packagist"
}
],
"collected": true,
"truncated": false,
"total_count": 6,
"direct_count": 0,
"indirect_count": 6
}
},
"maintainership": {
"issues": {
"open_prs": 5,
"merged_prs": 52,
"open_issues": 9,
"closed_ratio": 0.8,
"closed_issues": 36,
"closed_unmerged_prs": 12
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "kelunik",
"commits": 67,
"avatar_url": "https://avatars.githubusercontent.com/u/2743004?v=4"
},
{
"type": "User",
"login": "trowski",
"commits": 37,
"avatar_url": "https://avatars.githubusercontent.com/u/1628287?v=4"
},
{
"type": "User",
"login": "danog",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/7339644?v=4"
},
{
"type": "User",
"login": "Nevay",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/22509671?v=4"
},
{
"type": "User",
"login": "bwoebi",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/3154871?v=4"
},
{
"type": "User",
"login": "xabbuh",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/1957048?v=4"
},
{
"type": "User",
"login": "nhedger",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/649677?v=4"
},
{
"type": "User",
"login": "azjezz",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/29315886?v=4"
},
{
"type": "User",
"login": "simPod",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/327717?v=4"
},
{
"type": "User",
"login": "tnsoftbear",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/2427839?v=4"
}
],
"contributors_sampled": 11,
"top_contributor_share": 0.578
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml"
],
"has_docs_dir": false,
"linter_configs": [
".php-cs-fixer.dist.php"
],
"has_editorconfig": true,
"has_linter_config": true,
"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": 4,
"reason": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
"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": 1,
"reason": "Found 3/25 approved changesets -- score normalized to 1",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 6 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "14 commit(s) and 2 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": null,
"reason": "no dependencies found",
"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": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"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": "7b2ce25ca927194808d9f330ccfdbc8244ce65a5",
"ran_at": "2026-07-22T17:02:31Z",
"aggregate_score": 6.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-18T18:02:39Z",
"oldest_open_prs": [
{
"number": 72,
"created_at": "2023-01-28T19:50:00Z",
"last_comment_at": "2023-07-24T06:45:07Z",
"last_comment_author": "danog"
},
{
"number": 79,
"created_at": "2023-06-14T19:13:36Z",
"last_comment_at": "2023-08-07T15:09:06Z",
"last_comment_author": "kelunik"
},
{
"number": 102,
"created_at": "2025-01-26T02:27:31Z",
"last_comment_at": "2025-01-26T19:24:47Z",
"last_comment_author": "sellrock-de"
},
{
"number": 112,
"created_at": "2025-09-16T09:26:07Z",
"last_comment_at": "2026-05-15T23:21:59Z",
"last_comment_author": "trowski"
},
{
"number": 120,
"created_at": "2026-05-09T18:02:39Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-06-27T18:40:19Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 70,
"created_at": "2022-12-29T12:50:17Z",
"last_comment_at": "2022-12-30T00:42:02Z",
"last_comment_author": "kocoten1992"
},
{
"number": 81,
"created_at": "2023-06-25T06:33:48Z",
"last_comment_at": "2024-12-06T12:21:56Z",
"last_comment_author": "danog"
},
{
"number": 89,
"created_at": "2023-11-19T15:59:00Z",
"last_comment_at": "2023-11-26T14:17:06Z",
"last_comment_author": "ging-dev"
},
{
"number": 90,
"created_at": "2023-12-23T14:11:35Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 91,
"created_at": "2024-03-12T21:32:20Z",
"last_comment_at": "2024-03-15T16:20:05Z",
"last_comment_author": "trowski"
},
{
"number": 98,
"created_at": "2024-11-06T09:33:38Z",
"last_comment_at": "2025-01-25T22:00:36Z",
"last_comment_author": "sellrock-de"
},
{
"number": 104,
"created_at": "2025-02-25T18:25:56Z",
"last_comment_at": "2025-02-28T11:25:46Z",
"last_comment_author": "georgebarbarosie"
},
{
"number": 108,
"created_at": "2025-03-18T10:44:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 125,
"created_at": "2026-07-20T07:48:31Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/revoltphp/event-loop",
"host": "github.com",
"name": "event-loop",
"owner": "revoltphp"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 67,
"inputs": {
"security": 67,
"vitality": 67,
"community": 76,
"governance": 65,
"engineering": 63
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 67,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"commits_last_year": 18,
"human_commit_share": 0.96,
"days_since_last_push": 24,
"active_weeks_last_year": 8
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 24 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 24
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "8/52 weeks with commits",
"points": 5.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 8
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "18 commits in the last year",
"points": 11.5,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 18
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "14 commit(s) and 2 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": 18,
"latest_release_tag": "v1.0.9",
"releases_from_tags": false,
"days_since_latest_release": 66,
"mean_days_between_releases": 143.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "18 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 18
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 66 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 66
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~143.3 days",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 143.3
}
}
],
"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": 49,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 49 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 49
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 76,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"forks": 38,
"stars": 926,
"watchers": 26,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "926 stars",
"points": 48.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 926
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "38 forks",
"points": 13.1,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 38
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "26 watchers",
"points": 7.8,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 26
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"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": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "excellent",
"name": "Ecosystem adoption (downloads)",
"note": null,
"notes": [],
"value": 95,
"inputs": {
"packages": [
"revolt/event-loop"
],
"dependents": 175,
"ecosystems": "packagist",
"total_downloads": 56449634,
"monthly_downloads": 3668384
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "3,668,384 downloads/month across packagist",
"points": 80,
"status": "met",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 3668384,
"ecosystems": "packagist"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "175 packages depend on it",
"points": 15,
"status": "partial",
"details": [
{
"code": "registry_dependents",
"params": {
"count": 175
}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 65,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 42,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 11,
"top_contributor_share": 0.578
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 58% of commits",
"points": 9.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 58
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "11 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 11
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"merged_prs": 52,
"open_issues": 9,
"closed_issues": 36,
"issue_closed_ratio": 0.8,
"closed_unmerged_prs": 12
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "80% of issues closed",
"points": 37.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 80
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "52/64 decided PRs merged",
"points": 31.1,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 52,
"decided": 64
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 3/25 approved changesets -- score normalized to 1",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"followers": 73,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "revoltphp",
"public_repos": 3,
"account_age_days": 1949
},
"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": "73 followers of revoltphp",
"points": 13.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 73,
"login": "revoltphp"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "3 public repos, account ~5 yr old",
"points": 15.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 3
}
},
{
"code": "account_age_years",
"params": {
"years": 5
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"revolt/event-loop"
],
"ecosystems": "packagist",
"any_deprecated": false,
"min_days_since_publish": 66
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on packagist",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "packagist"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 66 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 66
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "18 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 18
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 63,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"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": ".php-cs-fixer.dist.php",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".php-cs-fixer.dist.php"
}
}
],
"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": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
"points": 8,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"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": null,
"points": 0,
"status": "missed",
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 67,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 67,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 6.7
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "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": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
"points": 1,
"status": "partial",
"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 3/25 approved changesets -- score normalized to 1",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "14 commit(s) and 2 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": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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 detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": 16
},
"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": 40,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "critical",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 23,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.427,
"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": "41 of 96 human commits state their intent (structured subject or explanatory body)",
"points": 22.8,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 41,
"sampled": 96
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 46,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0.04
},
"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": ".php-cs-fixer.dist.php",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".php-cs-fixer.dist.php"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "4 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 4,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "PHP",
"largest_source_bytes": 55901,
"source_files_sampled": 54,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "PHP without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "PHP"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/54 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 54,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"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": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"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",
"No resolved dependencies carried a version and a supported ecosystem"
],
"report_type": "repository",
"generated_at": "2026-07-22T17:02:47.387647Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/revoltphp/event-loop.svg",
"full_name": "revoltphp/event-loop",
"license_state": "standard",
"license_spdx": "MIT"
}