Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"php",
"symfony",
"component",
"symfony-component",
"limiter",
"rate-limiter"
],
"is_fork": false,
"size_kb": 356,
"has_wiki": false,
"homepage": "https://symfony.com/rate-limiter",
"languages": {
"PHP": 118419
},
"pushed_at": "2026-06-27T09:30:15Z",
"created_at": "2020-09-16T16:15:59Z",
"owner_type": "Organization",
"updated_at": "2026-06-14T09:57:52Z",
"description": "Provides a Token Bucket implementation to rate limit input and output in your application",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "8.2",
"license_spdx_raw": "MIT",
"primary_language": "PHP",
"significant_languages": [
"PHP"
]
},
"owner": {
"blog": "https://symfony.com/",
"name": "Symfony",
"type": "Organization",
"login": "symfony",
"company": null,
"location": "The Internet",
"followers": 2180,
"avatar_url": "https://avatars.githubusercontent.com/u/143937?v=4",
"created_at": "2009-10-24T04:05:23Z",
"is_verified": null,
"public_repos": 414,
"account_age_days": 6121
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v8.1.1",
"kind": "patch",
"published_at": "2026-06-27T09:30:53Z"
},
{
"tag": "v8.0.14",
"kind": "patch",
"published_at": "2026-06-27T09:27:57Z"
},
{
"tag": "v7.4.14",
"kind": "patch",
"published_at": "2026-06-27T09:17:03Z"
},
{
"tag": "v6.4.42",
"kind": "patch",
"published_at": "2026-06-27T09:14:20Z"
},
{
"tag": "v8.1.0",
"kind": "minor",
"published_at": "2026-05-29T08:53:42Z"
},
{
"tag": "v8.1.0-RC1",
"kind": "prerelease",
"published_at": "2026-05-27T11:34:49Z"
},
{
"tag": "v8.0.13",
"kind": "patch",
"published_at": "2026-05-27T10:31:36Z"
},
{
"tag": "v7.4.13",
"kind": "patch",
"published_at": "2026-05-27T08:45:33Z"
},
{
"tag": "v6.4.41",
"kind": "patch",
"published_at": "2026-05-27T08:30:03Z"
},
{
"tag": "v8.1.0-BETA3",
"kind": "prerelease",
"published_at": "2026-05-20T12:11:21Z"
},
{
"tag": "v8.1.0-BETA1",
"kind": "prerelease",
"published_at": "2026-05-06T14:29:08Z"
},
{
"tag": "v6.4.38",
"kind": "patch",
"published_at": "2026-05-06T13:07:09Z"
},
{
"tag": "v8.0.10",
"kind": "patch",
"published_at": "2026-05-06T12:42:37Z"
},
{
"tag": "v7.4.10",
"kind": "patch",
"published_at": "2026-05-06T12:17:13Z"
},
{
"tag": "v8.0.9",
"kind": "patch",
"published_at": "2026-05-01T08:14:50Z"
},
{
"tag": "v7.4.9",
"kind": "patch",
"published_at": "2026-05-01T08:00:38Z"
},
{
"tag": "v6.4.37",
"kind": "patch",
"published_at": "2026-05-01T07:47:53Z"
},
{
"tag": "v8.0.8",
"kind": "patch",
"published_at": "2026-03-31T21:31:55Z"
},
{
"tag": "v7.4.8",
"kind": "patch",
"published_at": "2026-03-31T21:11:35Z"
},
{
"tag": "v8.0.7",
"kind": "patch",
"published_at": "2026-03-06T17:12:35Z"
},
{
"tag": "v7.4.7",
"kind": "patch",
"published_at": "2026-03-06T16:44:57Z"
},
{
"tag": "v6.4.35",
"kind": "patch",
"published_at": "2026-03-06T16:31:00Z"
},
{
"tag": "v8.0.6",
"kind": "patch",
"published_at": "2026-02-26T09:14:11Z"
},
{
"tag": "v7.4.6",
"kind": "patch",
"published_at": "2026-02-26T08:41:58Z"
},
{
"tag": "v6.4.34",
"kind": "patch",
"published_at": "2026-02-26T08:29:00Z"
},
{
"tag": "v8.0.5",
"kind": "patch",
"published_at": "2026-01-28T11:02:41Z"
},
{
"tag": "v7.4.5",
"kind": "patch",
"published_at": "2026-01-28T10:44:50Z"
},
{
"tag": "v7.3.11",
"kind": "patch",
"published_at": "2026-01-28T10:29:25Z"
},
{
"tag": "v6.4.33",
"kind": "patch",
"published_at": "2026-01-28T10:03:07Z"
},
{
"tag": "v8.0.4",
"kind": "patch",
"published_at": "2026-01-25T08:31:08Z"
},
{
"tag": "v7.4.4",
"kind": "patch",
"published_at": "2026-01-24T22:32:04Z"
},
{
"tag": "v7.3.10",
"kind": "patch",
"published_at": "2026-01-24T22:04:13Z"
},
{
"tag": "v6.4.32",
"kind": "patch",
"published_at": "2026-01-24T16:19:37Z"
},
{
"tag": "v6.4.31",
"kind": "patch",
"published_at": "2025-12-31T08:35:27Z"
},
{
"tag": "v7.4.0",
"kind": "minor",
"published_at": "2025-11-27T13:59:59Z"
},
{
"tag": "v7.4.0-RC1",
"kind": "prerelease",
"published_at": "2025-11-13T12:54:00Z"
},
{
"tag": "v8.0.0-BETA1",
"kind": "prerelease",
"published_at": "2025-10-28T10:09:45Z"
},
{
"tag": "v7.4.0-BETA1",
"kind": "prerelease",
"published_at": "2025-10-27T10:53:29Z"
},
{
"tag": "v7.3.2",
"kind": "patch",
"published_at": "2025-07-31T10:56:51Z"
},
{
"tag": "v7.2.9",
"kind": "patch",
"published_at": "2025-07-31T10:45:11Z"
},
{
"tag": "v6.4.24",
"kind": "patch",
"published_at": "2025-07-31T09:38:47Z"
},
{
"tag": "v7.3.0",
"kind": "minor",
"published_at": "2025-05-29T07:54:17Z"
},
{
"tag": "v7.3.0-RC1",
"kind": "prerelease",
"published_at": "2025-05-25T21:10:17Z"
},
{
"tag": "v7.3.0-BETA1",
"kind": "prerelease",
"published_at": "2025-05-02T09:31:03Z"
},
{
"tag": "v7.2.0",
"kind": "minor",
"published_at": "2024-11-29T08:49:12Z"
},
{
"tag": "v7.1.8",
"kind": "patch",
"published_at": "2024-11-13T14:53:08Z"
},
{
"tag": "v6.4.15",
"kind": "patch",
"published_at": "2024-11-13T14:23:24Z"
},
{
"tag": "v5.4.47",
"kind": "patch",
"published_at": "2024-11-13T13:55:16Z"
},
{
"tag": "v7.2.0-BETA2",
"kind": "prerelease",
"published_at": "2024-11-06T10:05:58Z"
},
{
"tag": "v7.1.7",
"kind": "patch",
"published_at": "2024-11-06T10:00:57Z"
},
{
"tag": "v6.4.14",
"kind": "patch",
"published_at": "2024-11-06T09:55:12Z"
},
{
"tag": "v5.4.46",
"kind": "patch",
"published_at": "2024-11-06T09:38:04Z"
},
{
"tag": "v7.2.0-BETA1",
"kind": "prerelease",
"published_at": "2024-10-27T16:16:05Z"
},
{
"tag": "v7.1.6",
"kind": "patch",
"published_at": "2024-10-27T15:21:43Z"
},
{
"tag": "v6.4.13",
"kind": "patch",
"published_at": "2024-10-27T13:56:58Z"
},
{
"tag": "v5.4.45",
"kind": "patch",
"published_at": "2024-10-27T13:02:04Z"
},
{
"tag": "v7.1.1",
"kind": "patch",
"published_at": "2024-06-04T07:37:14Z"
},
{
"tag": "v7.0.8",
"kind": "patch",
"published_at": "2024-06-02T18:03:39Z"
},
{
"tag": "v6.4.8",
"kind": "patch",
"published_at": "2024-06-02T17:03:49Z"
},
{
"tag": "v5.4.40",
"kind": "patch",
"published_at": "2024-06-02T16:03:55Z"
},
{
"tag": "v7.1.0",
"kind": "minor",
"published_at": "2024-05-31T08:22:30Z"
},
{
"tag": "v7.1.0-RC1",
"kind": "prerelease",
"published_at": "2024-05-17T15:50:56Z"
},
{
"tag": "v7.1.0-BETA1",
"kind": "prerelease",
"published_at": "2024-05-02T13:12:37Z"
},
{
"tag": "v7.0.7",
"kind": "patch",
"published_at": "2024-04-29T12:53:42Z"
},
{
"tag": "v6.4.7",
"kind": "patch",
"published_at": "2024-04-29T12:13:14Z"
},
{
"tag": "v5.4.39",
"kind": "patch",
"published_at": "2024-04-29T11:24:04Z"
},
{
"tag": "v7.0.3",
"kind": "patch",
"published_at": "2024-01-31T09:14:05Z"
},
{
"tag": "v6.4.3",
"kind": "patch",
"published_at": "2024-01-31T07:41:33Z"
},
{
"tag": "v6.3.12",
"kind": "patch",
"published_at": "2024-01-31T07:22:06Z"
},
{
"tag": "v5.4.35",
"kind": "patch",
"published_at": "2024-01-30T20:06:06Z"
},
{
"tag": "v7.0.2",
"kind": "patch",
"published_at": "2023-12-30T15:47:20Z"
},
{
"tag": "v6.4.2",
"kind": "patch",
"published_at": "2023-12-30T15:42:08Z"
},
{
"tag": "v6.3.11",
"kind": "patch",
"published_at": "2023-12-30T13:14:49Z"
},
{
"tag": "v7.0.0",
"kind": "major",
"published_at": "2023-11-29T11:06:00Z"
},
{
"tag": "v6.4.0",
"kind": "minor",
"published_at": "2023-11-29T10:51:31Z"
},
{
"tag": "v7.0.0-RC1",
"kind": "prerelease",
"published_at": "2023-11-15T16:36:43Z"
},
{
"tag": "v6.4.0-RC1",
"kind": "prerelease",
"published_at": "2023-11-15T16:14:18Z"
},
{
"tag": "v7.0.0-BETA3",
"kind": "prerelease",
"published_at": "2023-11-10T14:46:32Z"
},
{
"tag": "v6.4.0-BETA3",
"kind": "prerelease",
"published_at": "2023-11-10T14:33:07Z"
},
{
"tag": "v6.3.8",
"kind": "patch",
"published_at": "2023-11-10T13:54:09Z"
},
{
"tag": "v5.4.30",
"kind": "patch",
"published_at": "2023-10-29T00:58:49Z"
},
{
"tag": "v7.0.0-BETA1",
"kind": "prerelease",
"published_at": "2023-10-21T14:37:50Z"
},
{
"tag": "v6.4.0-BETA1",
"kind": "prerelease",
"published_at": "2023-10-21T14:07:27Z"
},
{
"tag": "v6.3.6",
"kind": "patch",
"published_at": "2023-10-21T13:17:51Z"
},
{
"tag": "v6.3.2",
"kind": "patch",
"published_at": "2023-07-30T09:12:10Z"
},
{
"tag": "v6.2.13",
"kind": "patch",
"published_at": "2023-07-30T09:04:56Z"
},
{
"tag": "v5.4.26",
"kind": "patch",
"published_at": "2023-07-29T17:13:06Z"
},
{
"tag": "v6.3.0",
"kind": "minor",
"published_at": "2023-05-30T20:03:24Z"
},
{
"tag": "v6.3.0-RC1",
"kind": "prerelease",
"published_at": "2023-05-22T17:49:14Z"
},
{
"tag": "v6.3.0-BETA1",
"kind": "prerelease",
"published_at": "2023-05-01T07:24:12Z"
},
{
"tag": "v6.2.7",
"kind": "patch",
"published_at": "2023-02-28T14:23:27Z"
},
{
"tag": "v5.4.21",
"kind": "patch",
"published_at": "2023-02-28T13:28:43Z"
},
{
"tag": "v6.2.5",
"kind": "patch",
"published_at": "2023-01-24T15:57:59Z"
},
{
"tag": "v6.0.19",
"kind": "patch",
"published_at": "2023-01-24T15:25:47Z"
},
{
"tag": "v5.4.19",
"kind": "patch",
"published_at": "2023-01-24T13:44:02Z"
},
{
"tag": "v6.1.9",
"kind": "patch",
"published_at": "2022-12-28T15:06:40Z"
},
{
"tag": "v6.0.17",
"kind": "patch",
"published_at": "2022-12-28T15:01:33Z"
},
{
"tag": "v5.4.17",
"kind": "patch",
"published_at": "2022-12-28T14:56:29Z"
},
{
"tag": "v6.2.2",
"kind": "patch",
"published_at": "2022-12-16T20:12:48Z"
},
{
"tag": "v6.2.0",
"kind": "minor",
"published_at": "2022-11-30T17:46:53Z"
}
],
"recent_commits": [
{
"oid": "dd8f48286c000b8511b9413105f4118c8c2a4bd6",
"body": "…rialize calls\n\nRestore allowed_classes on the deep-clone/BC unserialize() in AbstractPhpFileCacheWarmer and Yaml Inline, and reject \\Stringable in CalendarAlignedWindow and Semaphore\\Key __unserialize() (+ trampoline test).",
"is_bot": false,
"headline": "[FrameworkBundle][RateLimiter][Yaml][Semaphore] Harden remaining unse…",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-09T11:06:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9b1fbf073615ce76f1164f27dc310f63d42ee59",
"body": "* 8.0:\n [Mime] Reject \\Stringable in DataPart::__unserialize()\n [Lock][Form][FrameworkBundle][Mailer][HttpKernel] Harden remaining unserialize trampolines and webhook reject paths\n Remove review state from Serbian translations\n Harden __toString trampolines via __unserialize()\n Remove needs-rev\n[…]\ntion/Bridge/Crowdin/Tests/CrowdinProviderTest.php\n#\tsrc/Symfony/Component/VarExporter/Instantiator.php\n#\tsrc/Symfony/Component/VarExporter/Internal/Exporter.php\n#\tsrc/Symfony/Component/Yaml/Inline.php",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-09T10:54:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ebbcbc99afbecbd619f21c0c7e0a3c59760a6248",
"body": "* 7.4:\n [Lock][Form][FrameworkBundle][Mailer][HttpKernel] Harden remaining unserialize trampolines and webhook reject paths\n Remove review state from Serbian translations\n Harden __toString trampolines via __unserialize()\n Remove needs-review-translation flag for Russian validators\n [VarExporte\n[…]\nileLoader.php\n#\tsrc/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php\n#\tsrc/Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-09T10:20:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c0af3fdc93e6115d9b806a6ea73e7de040e711d",
"body": "* 6.4:\n [VarExporter] Fix exporting objects that cannot be instantiated empty\n [Translation] Create Crowdin files before uploading translations\n [Form] reviewed Polish translation unit 129\n [Validator] reviewed Polish translation units 143-145\n Harden TemplatedEmail unserialize and enforce hard\n[…]\nony/Component/Intl/Transliterator/EmojiTransliterator.php\n#\tsrc/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php\n#\tsrc/Symfony/Component/VarExporter/Tests/VarExporterTest.php",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-08T20:24:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "17a8fecc8a4a0fd46bcb96904a4d78bd0831ee15",
"body": null,
"is_bot": false,
"headline": " Unsafe unserialize phpstan rule",
"author_name": "Jack Worman",
"author_login": "jack-worman",
"committed_at": "2026-06-08T07:06:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf13972176747082b63a3fca39b036a68116a56c",
"body": "* 8.0:\n Drop PR warning and auto-closing on subtree splits\n Fix merge\n [Validator] Support SVG dimensions with units\n Remove review state from Serbian translations\n [Translation] Copy domains metadata when moving messages to intl ones\n [Form] Add missing translation for invalid UUID\n fix(tran\n[…]\nlation messages\n [Security][HttpKernel] Add allowed_classes => false to unserialize() in CacheWarmerAggregate, LoggerDataCollector, and HttpCache Store\n Fix XMLHttpRequest URL handling in toolbar JS",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-05T06:23:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2eba89bff56ac523752c611f8233ac3b82e0ef03",
"body": "* 7.4:\n Drop PR warning and auto-closing on subtree splits\n Fix merge\n [Validator] Support SVG dimensions with units\n Remove review state from Serbian translations\n [Translation] Copy domains metadata when moving messages to intl ones\n [Form] Add missing translation for invalid UUID\n fix(tran\n[…]\nlation messages\n [Security][HttpKernel] Add allowed_classes => false to unserialize() in CacheWarmerAggregate, LoggerDataCollector, and HttpCache Store\n Fix XMLHttpRequest URL handling in toolbar JS",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-05T06:22:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "724404c1d4fa7efc991d6ca2262a9d44e3728a7e",
"body": "* 6.4:\n Drop PR warning and auto-closing on subtree splits\n Fix merge\n Remove review state from Serbian translations\n [Translation] Copy domains metadata when moving messages to intl ones\n [Form] Add missing translation for invalid UUID\n fix(translations): fix sr-Latn validation messages and v\n[…]\nlation messages\n [Security][HttpKernel] Add allowed_classes => false to unserialize() in CacheWarmerAggregate, LoggerDataCollector, and HttpCache Store\n Fix XMLHttpRequest URL handling in toolbar JS",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-05T06:22:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2b06d005fc9ac6ec3a263be6c042e1405b11a415",
"body": null,
"is_bot": false,
"headline": "Drop PR warning and auto-closing on subtree splits",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-06-05T06:18:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "657d5b948e913b3989d9cf2f79a84e44e454345a",
"body": null,
"is_bot": false,
"headline": "Add call to backers in README files",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-29T05:06:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2742f0bbb3b4f0d1b9f09dd96b9d5df23f4f7bf7",
"body": "* 8.0: (49 commits)\n [Runtime][FrameworkBundle] Trust argv on CLI-like SAPIs in the remaining QUERY_STRING gates\n Fix tests and merge resolution after merging 6.4 into 7.4\n [FrameworkBundle] Allow to pass `doctrine_open_transaction_logger`’s entity manager name positionally\n Remove protectedHead\n[…]\ntion/Loader/YamlFileLoader.php\n#\tsrc/Symfony/Component/HttpClient/CachingHttpClient.php\n#\tsrc/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php\n#\tsrc/Symfony/Component/HttpKernel/Kernel.php",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-23T18:18:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d9e6bbcc1ea9e0ad21be70d7fbfe0f0b898377a",
"body": "* 7.4: (46 commits)\n [Runtime][FrameworkBundle] Trust argv on CLI-like SAPIs in the remaining QUERY_STRING gates\n Fix tests and merge resolution after merging 6.4 into 7.4\n [FrameworkBundle] Allow to pass `doctrine_open_transaction_logger`’s entity manager name positionally\n Remove protectedHead\n[…]\nLOG-8.0.md\n#\tsrc/Symfony/Component/HttpKernel/Kernel.php\n#\tsrc/Symfony/Component/Mime/Part/SMimePart.php\n#\tsrc/Symfony/Component/Mime/Part/TextPart.php\n#\tsrc/Symfony/Component/String/UnicodeString.php",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-23T18:05:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b162768544e5a8895c52161d63c999aca91f4a9",
"body": "* 6.4:\n [FrameworkBundle] Allow to pass `doctrine_open_transaction_logger`’s entity manager name positionally\n [Scheduler] Recover pending RecurringMessages after consumer stops midway\n [SecurityBundle] Fix Security::login() across firewalls\n [Routing][RateLimiter][Mime][Security] Harden __unser\n[…]\nTests/Generator/MessageGeneratorTest.php\n#\tsrc/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php\n#\tsrc/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-23T16:05:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0aacaea46b248643be3bc974dbca078a28a4fef0",
"body": "…_toString trampolines",
"is_bot": false,
"headline": "[Routing][RateLimiter][Mime][Security] Harden __unserialize against _…",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-23T14:40:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c276062509db304b0c3bd77beaf042a0e2a143ab",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Harden calendar-aligned fixed window mode",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-19T16:33:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "213d17d05d6c47177e655d308e4184aa382a4e5a",
"body": "…Limiter (Crovitche-1623)\n\nThis PR was merged into the 8.1 branch.\n\nDiscussion\n----------\n\n[RateLimiter] Add calendar-aligned mode to FixedWindowLimiter\n\n| Q | A\n| ------------- | ---\n| Branch? | 8.1\n| Bug fix? | no\n| New feature? | yes\n| Deprecations? | no\n| Issues |\n\n[…]\n\n limit: 10000\n interval: 1 month\n anchor_at: '2024-01-05 00:00:00 UTC'\n```\n\nCommits\n-------\n\nae9c2802b1d [RateLimiter] Add calendar-aligned mode to FixedWindowLimiter",
"is_bot": false,
"headline": "feature #62127 [RateLimiter] Add calendar-aligned mode to FixedWindow…",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-05T12:20:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b7468169d3a59bc76838370d5fc4be27fed8731c",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Add calendar-aligned mode to FixedWindowLimiter",
"author_name": "Crovitche-1623",
"author_login": "Crovitche-1623",
"committed_at": "2026-05-05T12:19:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "798e411be677e61047b4dafc513c9bc181387ede",
"body": "* 8.0:\n [AssetMapper] Stop baking CSP nonce into the importmap polyfill body\n [Translation] URL-encode tmp path in XliffUtils::shouldEnableEntityLoader\n [RateLimiter] Carry over reserved tokens past fixed window resets\n [Security] Document that AbstractLoginFormAuthenticator::getLoginUrl() must \n[…]\nny version to 7.4.10\n Update VERSION for 7.4.9\n Update CHANGELOG for 7.4.9\n Bump Symfony version to 6.4.38\n Update VERSION for 6.4.37\n Update CONTRIBUTORS for 6.4.37\n Update CHANGELOG for 6.4.37",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-04T13:43:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81146a00aacbc9f610f22391cc4ea170090dfb8a",
"body": "* 7.4:\n [AssetMapper] Stop baking CSP nonce into the importmap polyfill body\n [Translation] URL-encode tmp path in XliffUtils::shouldEnableEntityLoader\n [RateLimiter] Carry over reserved tokens past fixed window resets\n [Security] Document that AbstractLoginFormAuthenticator::getLoginUrl() must \n[…]\nny version to 7.4.10\n Update VERSION for 7.4.9\n Update CHANGELOG for 7.4.9\n Bump Symfony version to 6.4.38\n Update VERSION for 6.4.37\n Update CONTRIBUTORS for 6.4.37\n Update CHANGELOG for 6.4.37",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-04T13:41:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "778c5239c7fd6bf9b886dedf3d84ddb156ddb888",
"body": "* 6.4:\n [Translation] URL-encode tmp path in XliffUtils::shouldEnableEntityLoader\n [RateLimiter] Carry over reserved tokens past fixed window resets\n [Security] Document that AbstractLoginFormAuthenticator::getLoginUrl() must return a path\n [Ldap] Cast default network_timeout to int\n Bump Symfony version to 6.4.38\n Update VERSION for 6.4.37\n Update CONTRIBUTORS for 6.4.37\n Update CHANGELOG for 6.4.37",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-05-04T13:25:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d6c01a64fa15d08d42b25af16884fb338b3a2909",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Carry over reserved tokens past fixed window resets",
"author_name": "Ousama Ben Younes",
"author_login": "ousamabenyounes",
"committed_at": "2026-05-04T12:52:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b35ba661fc610b96c11ab2824b51f1cecba2356a",
"body": "* 8.0: (24 commits)\n [Validator] Drop PHP < 8.4 compat in PropertyMetadata\n [Form] Preserve collection children added by PRE_SET_DATA listeners\n [Messenger] Keep deduplication lock when handler throws\n [Mailer][Postmark] Handle alternate error payload shapes for Payload Too Large\n CS fix\n [Ser\n[…]\nests/ObjectMapperTest.php\n#\tsrc/Symfony/Component/Security/Http/Tests/EventListener/IsCsrfTokenValidAttributeListenerTest.php\n#\tsrc/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-29T15:16:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6720f250f1e627043439d93754a555662144f883",
"body": "* 7.4: (23 commits)\n [Form] Preserve collection children added by PRE_SET_DATA listeners\n [Messenger] Keep deduplication lock when handler throws\n [Mailer][Postmark] Handle alternate error payload shapes for Payload Too Large\n CS fix\n [Serializer] Catch TypeError when setting an attribute to co\n[…]\nt/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php\n#\tsrc/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php\n#\tsrc/Symfony/Component/TypeInfo/Tests/TypeFactoryTest.php",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-29T15:02:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b0078d29f6e64b8833492e9f76a853f23fb1a81",
"body": null,
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-29T13:21:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "33787e5459c7cdfa10d02c9d25d9a37d0a12c7e6",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Keep token bucket alive while reservation debt is unpaid",
"author_name": "Ousama Ben Younes",
"author_login": "ousamabenyounes",
"committed_at": "2026-04-29T06:49:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc73921bfdf6eba0e4edc10f53ce45ccee09d97f",
"body": "* 8.0:\n [Security] Throw BadCredentialsException on empty JSON login username/password\n [Routing] Honor the Request's method in UrlMatcher::matchRequest()\n [DependencyInjection] Log every build parameter removed during compilation\n [Serializer] Remove @internal from ClassMetadataInterface and At\n[…]\nake `BackedEnumNormalizer` unconditionally return `null` on invalid value if `allow_invalid_values` is set\n [Cache] Ensure internal state is cleared in TagAwareAdapter::reset() even on commit failure",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-18T13:52:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "900d5e2b7d6d9d8eaaa67ae61c5c97e9b851cf96",
"body": "* 7.4:\n [Security] Throw BadCredentialsException on empty JSON login username/password\n [Routing] Honor the Request's method in UrlMatcher::matchRequest()\n [DependencyInjection] Log every build parameter removed during compilation\n [Serializer] Remove @internal from ClassMetadataInterface and At\n[…]\nake `BackedEnumNormalizer` unconditionally return `null` on invalid value if `allow_invalid_values` is set\n [Cache] Ensure internal state is cleared in TagAwareAdapter::reset() even on commit failure",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-18T13:51:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0f2746a294da80ff85d56c879fe6454988c19d7d",
"body": null,
"is_bot": false,
"headline": "Update XSD references in phpunit.xml.dist files",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-18T13:18:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ef2af49f63f909ce2bc64011e7d1f25e71cf954",
"body": "* 7.4:\n CS fixes - native_function_invocation & static_lambda\n Backport some CS fixes from 7.4\n [CS] Back config from 8.1 and apply heredoc_indentation rule\n [Workflow] Fix HTML escaping in GraphvizDumper labels",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-13T14:34:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4a5c90dfba0630ef0758ef6f67501d9f226dd36b",
"body": "* 6.4:\n CS fixes - native_function_invocation & static_lambda\n Backport some CS fixes from 7.4",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-13T14:28:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e24ee0298913e8611e809b9815e3612c5ec4fc50",
"body": null,
"is_bot": false,
"headline": "CS fixes - native_function_invocation & static_lambda",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-13T14:11:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "552f58f9e720c7b897b14e65788898d769ff3f1b",
"body": null,
"is_bot": false,
"headline": "Bump to php >= 8.4.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-07T06:26:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b4c505b837ba47ae6ef9187852c8e38ee3a70af",
"body": "* 8.0:\n Add deprecationTrigger ignoreUndefinedTriggers=\"true\" in phpunit.xml.dist files",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-06T11:11:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18a3d709506624a4f781802beaf4b12e75578d5c",
"body": "* 7.4:\n Add deprecationTrigger ignoreUndefinedTriggers=\"true\" in phpunit.xml.dist files",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-06T11:11:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72f3902fbbe6877add036d002658a5e0b2f7713d",
"body": "…dist files",
"is_bot": false,
"headline": "Add deprecationTrigger ignoreUndefinedTriggers=\"true\" in phpunit.xml.…",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-04-06T11:04:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eacf7a0952ae6294a959d8706cc1625a10123416",
"body": "* 8.0:\n Fix merge\n [Cache] Ensure compatibility with Relay extension 0.21.0\n [Serializer] Fix mixed-typed constructor parameters overriding getter-inferred type\n Fix tests\n [Cache] Ensure compatibility with Relay extension 0.21.0\n [Mime][TwigBridge] Fix merge conflict resolution\n [Ldap] Make \n[…]\nor ASCII content\n [Serializer] Fix can*() prefix support in GetSetMethodNormalizer\n [Cache] Fix Psr16Cache::getMultiple() returning ValueWrapper with TagAwareAdapter\n Configure deprecation triggers",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-03-30T15:21:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48d80b302c58efb369d6f37a389e3c3dcaf8987a",
"body": "* 7.4:\n [Serializer] Fix mixed-typed constructor parameters overriding getter-inferred type\n Fix tests\n [Cache] Ensure compatibility with Relay extension 0.21.0\n [Mime][TwigBridge] Fix merge conflict resolution\n [Ldap] Make the Adapter resettable\n [Serializer] Remove needless line in changelog\n[…]\nor ASCII content\n [Serializer] Fix can*() prefix support in GetSetMethodNormalizer\n [Cache] Fix Psr16Cache::getMultiple() returning ValueWrapper with TagAwareAdapter\n Configure deprecation triggers",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-03-30T15:14:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d55de9ec479418f58464e122e68d33886cf6f1fb",
"body": null,
"is_bot": false,
"headline": "Configure deprecation triggers",
"author_name": "Alexander M. Turek",
"author_login": "derrabus",
"committed_at": "2026-03-24T13:12:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eaa49596d8469ab29b429c442e63b85d4c40c563",
"body": "* 8.0:\n [HttpKernel] Fix int-to-float coercion for JSON #[MapRequestPayload] with pre-parsed array data\n [Messenger] Flush batch handlers after inactivity timeout when worker is busy\n [PhpUnitBridge] fix tests\n [TypeInfo] Fix StringTypeResolver calling Type::enum() on interfaces extending BackedEnum\n [FrameworkBundle] Remove dead code related to removed XML configuration\n [Mailer] [Mailjet] Fix inline attachments with custom Content-ID.\n [RateLimiter] Ensure hit count is always positive",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-03-04T15:01:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f8159c50b55e78810f5a8f60889d0b6b3a11deb",
"body": "* 7.4:\n [HttpKernel] Fix int-to-float coercion for JSON #[MapRequestPayload] with pre-parsed array data\n [Messenger] Flush batch handlers after inactivity timeout when worker is busy\n [PhpUnitBridge] fix tests\n [TypeInfo] Fix StringTypeResolver calling Type::enum() on interfaces extending BackedEnum\n [Mailer] [Mailjet] Fix inline attachments with custom Content-ID.\n [RateLimiter] Ensure hit count is always positive",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-03-04T13:55:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c2ff01c8d5ed54f0721f046fde14a94f2df09666",
"body": "* 6.4:\n [HttpKernel] Fix int-to-float coercion for JSON #[MapRequestPayload] with pre-parsed array data\n [Messenger] Flush batch handlers after inactivity timeout when worker is busy\n [PhpUnitBridge] fix tests\n [Mailer] [Mailjet] Fix inline attachments with custom Content-ID.\n [RateLimiter] Ensure hit count is always positive",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-03-04T13:54:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6540413badbf393692e8d419eb3abccca34b6e25",
"body": "Previously, calling `consume()` with a negative value could cause `hitCount` to become negative. Because it gets serialized with `pack('N')`, an integer underflow would occur.",
"is_bot": false,
"headline": "[RateLimiter] Ensure hit count is always positive",
"author_name": "Jonathan Hogervorst",
"author_login": "jhogervorst",
"committed_at": "2026-03-03T13:58:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "299fdc5915b355e16c56089565e8eec230f49ae8",
"body": "* 8.0: (26 commits)\n Fix merge\n [RateLimiter] Fix retryAfter when consuming exactly all remaining tokens in FixedWindow and TokenBucket\n [RateLimiter] Fix retryAfter value on last token consume (SlidingWindow)\n [RateLimiter] Fix reservations outside the second fixed window\n [Filesystem] makePat\n[…]\nies have mismatched indices\n [Validator] Fix type error for non-array items when Unique::fields is set\n [HttpKernel] Fix default locale ignored when Accept-Language has no enabled-locale match\n ...",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-25T17:08:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6817a912b30744452068d271aba9ec58a98022a6",
"body": "* 7.4: (25 commits)\n [RateLimiter] Fix retryAfter when consuming exactly all remaining tokens in FixedWindow and TokenBucket\n [RateLimiter] Fix retryAfter value on last token consume (SlidingWindow)\n [RateLimiter] Fix reservations outside the second fixed window\n [Filesystem] makePathRelative wi\n[…]\nique::fields is set\n [HttpKernel] Fix default locale ignored when Accept-Language has no enabled-locale match\n [FrameworkBundle] Make `ConfigDebugCommand` use its container to resolve env vars\n ...",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-25T16:59:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7219be81396041c24c1d12241ca7ef1f88b80783",
"body": "* 6.4:\n [RateLimiter] Fix retryAfter when consuming exactly all remaining tokens in FixedWindow and TokenBucket\n [RateLimiter] Fix retryAfter value on last token consume (SlidingWindow)\n [RateLimiter] Fix reservations outside the second fixed window\n [Filesystem] makePathRelative with existing f\n[…]\nke `ConfigDebugCommand` use its container to resolve env vars\n [Console] Fix various completion edge cases\n [Messenger][AmazonSqs] Add test for default queue_name when not set in DSN path or options",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-25T16:50:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ac5269c18a29f9892db8e48296af2793f57527dc",
"body": "…ens in FixedWindow and TokenBucket",
"is_bot": false,
"headline": "[RateLimiter] Fix retryAfter when consuming exactly all remaining tok…",
"author_name": "Evgeny Ruban",
"author_login": "ERuban",
"committed_at": "2026-02-25T10:56:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77040cb38da71655b61b596b0dd3775b2f626b5c",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Fix retryAfter value on last token consume (SlidingWindow)",
"author_name": "Evgeny Ruban",
"author_login": "ERuban",
"committed_at": "2026-02-25T10:18:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6bac475ec20d50bf08ef24eb709cb9383820cbb3",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Fix reservations outside the second fixed window",
"author_name": "SanderSander",
"author_login": "SanderSander",
"committed_at": "2026-02-25T09:53:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12e7210f55ef4fc687518f183e0852ac73a4b9d7",
"body": "* 8.0:\n bump symfony/type-info dependency\n remove usages of the deprecated any() invoked count expectation\n [Console] Fix profiling commands that use #[Ask]\n remove usages of the deprecated any() invoked count expectation\n [Serializer] Fix constructor parameter type override when property type \n[…]\nactor returns a different type\n Minor: Fix Portuguese (pt) translations for validators\n [Serializer] Fix passing context option to property-info\n [CssSelector] Add LRU cache to CssSelectorConverter",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-17T13:08:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e2c445ff24914b767be7acb1c0f9302f3258518e",
"body": "* 7.4:\n bump symfony/type-info dependency\n remove usages of the deprecated any() invoked count expectation\n [Console] Fix profiling commands that use #[Ask]\n remove usages of the deprecated any() invoked count expectation\n [Serializer] Fix constructor parameter type override when property type \n[…]\nactor returns a different type\n Minor: Fix Portuguese (pt) translations for validators\n [Serializer] Fix passing context option to property-info\n [CssSelector] Add LRU cache to CssSelectorConverter",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-17T13:07:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7dd1f6824afc6d854ac41b41d1619afb9a29d7a0",
"body": "* 6.4:\n remove usages of the deprecated any() invoked count expectation\n Minor: Fix Portuguese (pt) translations for validators\n [Serializer] Fix passing context option to property-info\n [CssSelector] Add LRU cache to CssSelectorConverter",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.4",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-02-17T07:53:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d11b8cade06f37031c7d795496760971ec5e06c",
"body": null,
"is_bot": false,
"headline": "remove usages of the deprecated any() invoked count expectation",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-02-16T20:44:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d89665cbeb07b1a6e2bb9266feabe057f409f3d",
"body": "* 8.0:\n [Console] Fix ProgressBar %remaining% and %estimated% placeholder guards\n [Validator] Fix missing null type in ValidatorInterface::validate() phpdoc\n use PHPUnit 13 on PHP 8.4+\n [PropertyInfo] Prioritize property type over is/has/can accessors",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-13T09:59:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e684389c717f8fe9bb39d03936c8727b2e66470",
"body": "* 7.4:\n [Console] Fix ProgressBar %remaining% and %estimated% placeholder guards\n [Validator] Fix missing null type in ValidatorInterface::validate() phpdoc\n use PHPUnit 13 on PHP 8.4+\n [PropertyInfo] Prioritize property type over is/has/can accessors",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-02-13T09:57:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2477a5c8a6ba262e488faab552f1765c011f7856",
"body": null,
"is_bot": false,
"headline": "use PHPUnit 13 on PHP 8.4+",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-02-11T16:03:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1510ea655c3f272e9acd93b7760bea0069abee47",
"body": "* 8.0:\n [DependencyInjection] Fix lazy proxy type resolution for decorated services\n [HttpClient] Fix dealing with truncated streams after headers arrived with CurlHttpClient\n [PropertyInfo] Fix DocBlock resolution for inherited promoted properties\n [HttpFoundation] Fix PdoSessionHandler charset\n[…]\nttpClient] Fix dealing with multiple levels of AsyncResponse decoration\n [Messenger] Only send UNLISTEN query if we are actively listening\n [RateLimiter] Persist state when consuming negative tokens",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-01-27T16:18:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7ae921420913ea0d6e4763e229b839b1d9a99288",
"body": "* 7.4:\n [DependencyInjection] Fix lazy proxy type resolution for decorated services\n [HttpClient] Fix dealing with truncated streams after headers arrived with CurlHttpClient\n [PropertyInfo] Fix DocBlock resolution for inherited promoted properties\n [HttpFoundation] Fix PdoSessionHandler charset\n[…]\nttpClient] Fix dealing with multiple levels of AsyncResponse decoration\n [Messenger] Only send UNLISTEN query if we are actively listening\n [RateLimiter] Persist state when consuming negative tokens",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-01-27T16:18:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7e275c57293cd2d894e126cc68855ecd82bcd173",
"body": "* 7.3:\n [DependencyInjection] Fix lazy proxy type resolution for decorated services\n [HttpClient] Fix dealing with truncated streams after headers arrived with CurlHttpClient\n [PropertyInfo] Fix DocBlock resolution for inherited promoted properties\n [HttpFoundation] Fix PdoSessionHandler charset\n[…]\nttpClient] Fix dealing with multiple levels of AsyncResponse decoration\n [Messenger] Only send UNLISTEN query if we are actively listening\n [RateLimiter] Persist state when consuming negative tokens",
"is_bot": false,
"headline": "Merge branch '7.3' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-01-27T16:16:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "db2a62a57614a905a41b980aafa92dacae8e1ba3",
"body": "* 6.4:\n [HttpClient] Fix dealing with truncated streams after headers arrived with CurlHttpClient\n [PropertyInfo] Fix DocBlock resolution for inherited promoted properties\n [HttpFoundation] Fix PdoSessionHandler charset-collation mismatch with the Doctrine DBAL on MySQL\n [HttpClient] Fix dealing with multiple levels of AsyncResponse decoration\n [Messenger] Only send UNLISTEN query if we are actively listening\n [RateLimiter] Persist state when consuming negative tokens",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.3",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2026-01-27T16:12:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af9b8b74931fcbbb2437a7b283a824447a1e324f",
"body": "Previously, calling `consume()` with a negative value would return a `RateLimit` with the correct increased token count, but the state was not saved to storage. This happened because the save condition only checked for positive token values (0 < $tokens), which was introduced in #46110 to skip unnec\n[…]\naining the performance optimization for zero-token checks.\n\nThis enables \"reserve and release\" patterns where tokens are consumed speculatively and restored upon successful completion of an operation.",
"is_bot": false,
"headline": "[RateLimiter] Persist state when consuming negative tokens",
"author_name": "Jonathan Hogervorst",
"author_login": "jhogervorst",
"committed_at": "2026-01-23T22:00:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ae5092e2fdf1130533f024de23f3092a0f024a9c",
"body": "* 8.0:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n fix CS\n do not use PHPUnit mock objects without configured expectations\n [Scheduler] Fix ar\n[…]\nuse PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n fix merge\n do not use PHPUnit mock objects without configured expectations",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-08T22:37:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9dd88cce95d00b48cfdaa5f4a0e8ca2aedf04796",
"body": "* 7.4:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n fix CS\n do not use PHPUnit mock objects without configured expectations\n [Scheduler] Fix ar\n[…]\nuse PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n fix merge\n do not use PHPUnit mock objects without configured expectations",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-08T22:36:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7337fff8629956d9ffed05c3fd241d2a42ddfa20",
"body": "* 7.3:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations",
"is_bot": false,
"headline": "Merge branch '7.3' into 7.4",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-08T16:12:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "afecbd1a03661189232c7dd4e9397b6eb7193e6c",
"body": null,
"is_bot": false,
"headline": "do not use PHPUnit mock objects without configured expectations",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-08T14:48:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f8ff8447b80581b8d3a3937fc00ff9ac9e864efb",
"body": "* 8.0:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n Configure Twig-CS-Fixer to lint all files and exclude if necessary",
"is_bot": false,
"headline": "Merge branch '8.0' into 8.1",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-05T09:33:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48c7f4222e4479cabb8b4143130144d39a3cac24",
"body": "* 7.4:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n Configure Twig-CS-Fixer to lint all files and exclude if necessary",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-05T09:27:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e80abddc7d6acd99763a2ee32458f3fc2158bb9",
"body": "* 7.3:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations",
"is_bot": false,
"headline": "Merge branch '7.3' into 7.4",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-05T08:47:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ef60e9b25744656290df34423c8dffccb6a64e1",
"body": "* 6.4:\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations\n do not use PHPUnit mock objects without configured expectations",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.3",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-05T08:45:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc44ca63adf1da4bc4290268ab3582fdfb151cf6",
"body": null,
"is_bot": false,
"headline": "do not use PHPUnit mock objects without configured expectations",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2026-01-04T11:59:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37adf635a4760e9043d1140d3a02391adf4ec962",
"body": null,
"is_bot": false,
"headline": " PHP CS Fixer: enable static_lambda",
"author_name": "Dariusz Ruminski",
"author_login": "keradus",
"committed_at": "2025-12-19T08:33:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e4128071df0b0b75617bd51304ccd94c2f1fe04",
"body": null,
"is_bot": false,
"headline": " chore: PHP CS Fixer and protected_to_private",
"author_name": "Dariusz Ruminski",
"author_login": "keradus",
"committed_at": "2025-12-14T07:59:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d4e173cafccecf3fdc167536c33d599f6c1c9e0",
"body": "* 7.4:\n replace PHPUnit annotations with attributes",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-08-04T07:36:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c6df5bc10308505bb0fa8d1388bc6bd8a628ba8",
"body": null,
"is_bot": false,
"headline": "replace PHPUnit annotations with attributes",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2025-08-04T07:05:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9875eeff323736a6b25ed2de0aa6a1127136b2b4",
"body": "* 7.4:\n run tests using PHPUnit 11.5\n make data provider static\n [Lock] Fix using fractional TTLs on all platforms\n [Lock] Fixes an issue with PostgreSQL when using fractional TTLs\n [Console][Table] Fix unnecessary wrapping\n [DependencyInjection] Deprecate registering a service without a class\n[…]\ncache] RedisTrait::doFetch should use pipeline instead of mget for Relay\\Cluster\n relax assertions for forward compatibility with Symfony 7.4\n [Console][Table] Fix invalid UTF-8 due to text wrapping",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-08-01T16:41:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1988624a7e9768e678e0a6ab6801724fe4ab93e",
"body": null,
"is_bot": false,
"headline": "run tests using PHPUnit 11.5",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2025-07-31T09:31:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15a9a10fd0f060243c88ce98d5c29e9cc4b886e7",
"body": null,
"is_bot": false,
"headline": "CS fixes",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-07-10T08:14:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ec2bd3c196468277090999fb77ce29011a1c8e4",
"body": "* 7.4:\n Fix php.net links\n fix version number in deprecation\n configuration for the storage service for the login throttling rate limiter\n chore: PHP CS Fixer fixes\n [ObjectMapper] Correctly manage constructor initialization\n [DoctrineBridge] Restore compatibility with Doctrine ODM by validati\n[…]\nSymfony 7.3\n Fix precision loss when rounding large integers in `NumberToLocalizedStringTransformer`\n [JsonStreamer] Fix nested generated foreach loops\n [TypeInfo] Fix imported-only alias resolving",
"is_bot": false,
"headline": "Merge branch '7.4' into 8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-07-07T08:28:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65622b32ff580a311438740a7f72378445580175",
"body": "* 7.3:\n Fix php.net links\n fix version number in deprecation\n [ObjectMapper] Correctly manage constructor initialization\n [DoctrineBridge] Restore compatibility with Doctrine ODM by validating $class object type\n chore: Increase minimum version of type-info component\n [FrameworkBundle] Add fun\n[…]\nnd` command\n Fix precision loss when rounding large integers in `NumberToLocalizedStringTransformer`\n [JsonStreamer] Fix nested generated foreach loops\n [TypeInfo] Fix imported-only alias resolving",
"is_bot": false,
"headline": "Merge branch '7.3' into 7.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-07-07T08:24:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7e855541d302ba752f86fb0e97932e7969fe9c04",
"body": "* 7.2:\n Fix php.net links\n fix version number in deprecation\n [DoctrineBridge] Restore compatibility with Doctrine ODM by validating $class object type\n chore: Increase minimum version of type-info component\n [FrameworkBundle] Add functional tests for the `ContainerLintCommand` command\n Fix precision loss when rounding large integers in `NumberToLocalizedStringTransformer`",
"is_bot": false,
"headline": "Merge branch '7.2' into 7.3",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-07-07T08:17:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83f71fe4102972ca78a1d2aeed77dfc479ed9af3",
"body": "* 6.4:\n Fix php.net links\n [DoctrineBridge] Restore compatibility with Doctrine ODM by validating $class object type\n [FrameworkBundle] Add functional tests for the `ContainerLintCommand` command\n Fix precision loss when rounding large integers in `NumberToLocalizedStringTransformer`",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.2",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-07-07T08:17:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e3d30e0b979c990b3e630f810a22d818e24dc80",
"body": null,
"is_bot": false,
"headline": "Fix php.net links",
"author_name": "Benjamin Pick",
"author_login": "benjaminpick",
"committed_at": "2025-07-07T06:44:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "336bfc78fd2ab093493b2edd27c6b6f02b97578a",
"body": null,
"is_bot": false,
"headline": "Bump Symfony 8 to PHP >= 8.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-06-03T12:29:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61c208224fe488fb36e970f8d4a39d7f13ab0b2c",
"body": null,
"is_bot": false,
"headline": "Allow Symfony ^8.0",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2025-06-02T14:13:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78a3dbd84386cb0aa7f375e3469294e7048e5a1a",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] add `CompoundRateLimiterFactory`",
"author_name": "Kevin Bond",
"author_login": "kbond",
"committed_at": "2025-03-12T17:05:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d1daf1de983e7a29f5df3454c9ca42d7652bfda",
"body": null,
"is_bot": false,
"headline": "Add setOptions method",
"author_name": "Yonel Ceruto",
"author_login": "yceruto",
"committed_at": "2025-02-20T14:18:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c82c36458a1fbaab2990b9508a34ea3630b7e265",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Add `RateLimiterFactoryInterface`",
"author_name": "Alexandre Daubois",
"author_login": "alexandre-daubois",
"committed_at": "2025-01-18T09:25:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b51fc8391c42a72c9610d12f7855e498067d5573",
"body": null,
"is_bot": false,
"headline": "chore: PHP CS Fixer fixes",
"author_name": "Dariusz Ruminski",
"author_login": "keradus",
"committed_at": "2024-12-12T06:45:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb6b14ee6c1c4d2722a30d46fb92714943526804",
"body": "* 7.1:\n [AssetMapper] Fix `JavaScriptImportPathCompiler` regex for non-latin characters\n Definition::$class may not be class-string\n require Cache component versions compatible with Redis 6.1\n [Twitter][Notifier] Fix post INIT upload\n [Messenger][RateLimiter] fix additional message handled when using a rate limiter\n [Serializer] Revert default groups\n [Serializer] fixed object normalizer for a class with `cancel` method\n Fix bucket size reduce when previously created with bigger size",
"is_bot": false,
"headline": "Merge branch '7.1' into 7.2",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-09T09:29:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1df8f0a40aa60cbd3c546ceb03408ab8f641528",
"body": "* 6.4:\n [AssetMapper] Fix `JavaScriptImportPathCompiler` regex for non-latin characters\n Definition::$class may not be class-string\n require Cache component versions compatible with Redis 6.1\n [Twitter][Notifier] Fix post INIT upload\n [Messenger][RateLimiter] fix additional message handled when using a rate limiter\n [Serializer] fixed object normalizer for a class with `cancel` method\n Fix bucket size reduce when previously created with bigger size",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.1",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-09T09:16:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e250d82fc17b277b97cbce94efef5414aff29bf9",
"body": "…ted with bigger size (Orkin)\n\nThis PR was merged into the 6.4 branch.\n\nDiscussion\n----------\n\n[RateLimiter] Fix bucket size reduced when previously created with bigger size\n\n| Q | A\n| ------------- | ---\n| Branch? | 6.4\n| Bug fix? | yes\n| New feature? | no\n| Deprecations? | \n[…]\nlimit without flushing the cache. The purpose of this PR is to update and use the new configuration limit.\n\nCommits\n-------\n\n6c34c5824fa Fix bucket size reduce when previously created with bigger size",
"is_bot": false,
"headline": "bug #58601 [RateLimiter] Fix bucket size reduced when previously crea…",
"author_name": "Fabien Potencier",
"author_login": "fabpot",
"committed_at": "2024-11-09T07:19:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "83b447a515ad16853a15d716bace38164916977d",
"body": "* 7.1:\n relax format assertions for fstat() results on Windows\n update ICU data from 75.1 to 76.1\n fix referencing the SYMFONY_VERSION env var\n handle error results of DateTime::modify()",
"is_bot": false,
"headline": "Merge branch '7.1' into 7.2",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-08T15:48:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b49bf0b5ee3b83fa5b0dbbefaec251b2ec790d7",
"body": "* 6.4:\n relax format assertions for fstat() results on Windows\n update ICU data from 75.1 to 76.1\n fix referencing the SYMFONY_VERSION env var\n handle error results of DateTime::modify()",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.1",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-08T15:46:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "717121695173796aca7ae7480263440ba097b4ea",
"body": "* 5.4:\n relax format assertions for fstat() results on Windows\n update ICU data from 75.1 to 76.1\n fix referencing the SYMFONY_VERSION env var\n handle error results of DateTime::modify()",
"is_bot": false,
"headline": "Merge branch '5.4' into 6.4",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-08T15:28:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c902bf796ca6c9656c3cc8185b53afb9acbb7c72",
"body": "Depending on the version of PHP the modify() method will either throw an\nexception or issue a warning.",
"is_bot": false,
"headline": "handle error results of DateTime::modify()",
"author_name": "Christian Flothmann",
"author_login": "xabbuh",
"committed_at": "2024-11-07T11:51:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2c6f9d299ac051ec9ba9bbe7d527048ea6204aca",
"body": "* 7.1:\n fix detecting anonymous exception classes on Windows and PHP 7\n skip tests requiring the intl extension if it's not installed\n [RateLimiter] Fix DateInterval normalization\n re-add missing profiler shortcuts on profiler homepage\n Fix support for \\SplTempFileObject in BinaryFileResponse\n [Security] Store original token in token storage when implicitly exiting impersonation\n [Cache] Fix clear() when using Predis",
"is_bot": false,
"headline": "Merge branch '7.1' into 7.2",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2024-11-05T15:35:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a664a5ad219a14dd71afe778cf6cced6411caa26",
"body": "* 6.4:\n fix detecting anonymous exception classes on Windows and PHP 7\n skip tests requiring the intl extension if it's not installed\n [RateLimiter] Fix DateInterval normalization\n [Security] Store original token in token storage when implicitly exiting impersonation\n [Cache] Fix clear() when using Predis",
"is_bot": false,
"headline": "Merge branch '6.4' into 7.1",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2024-11-05T15:34:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5898ab217ee766258ab41aa53556e1a029f7d04",
"body": "* 5.4:\n fix detecting anonymous exception classes on Windows and PHP 7\n skip tests requiring the intl extension if it's not installed\n [RateLimiter] Fix DateInterval normalization\n [Security] Store original token in token storage when implicitly exiting impersonation\n [Cache] Fix clear() when using Predis",
"is_bot": false,
"headline": "Merge branch '5.4' into 6.4",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2024-11-05T15:34:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c739355954f3ffd97d1f789d2c66622996990215",
"body": null,
"is_bot": false,
"headline": "[RateLimiter] Fix DateInterval normalization",
"author_name": "Daniele Orrù",
"author_login": "danydev",
"committed_at": "2024-11-05T13:13:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb40d7f4f7db103da0c5515dee110b689a4f7e0f",
"body": null,
"is_bot": false,
"headline": "Fix bucket size reduce when previously created with bigger size",
"author_name": "Florent Blaison",
"author_login": "Orkin",
"committed_at": "2024-10-18T15:45:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2bdfe85d828f9eef41a4093bbdf5951e36a40c15",
"body": "* 7.1:\n Add PR template and auto-close PR on subtree split repositories",
"is_bot": false,
"headline": "Merge branch '7.1' into 7.2",
"author_name": "Nicolas Grekas",
"author_login": "nicolas-grekas",
"committed_at": "2024-09-25T14:21:43Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 100,
"commits_last_year": 72,
"latest_release_at": "2026-06-27T09:30:53Z",
"latest_release_tag": "v8.1.1",
"releases_from_tags": false,
"days_since_last_push": 31,
"active_weeks_last_year": 24,
"days_since_latest_release": 31,
"mean_days_between_releases": 4.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 75,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "symfony/rate-limiter",
"exists": true,
"license": "MIT",
"keywords": [
"limiter",
"rate-limiter"
],
"ecosystem": "packagist",
"matches_repo": true,
"registry_url": "https://packagist.org/packages/symfony/rate-limiter",
"is_deprecated": false,
"latest_version": "v8.1.1",
"repository_url": "https://github.com/symfony/rate-limiter",
"versions_count": 152,
"total_downloads": 56813854,
"dependents_count": 154,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2723917,
"first_published_at": null,
"latest_published_at": "2026-06-09T11:06:24Z",
"latest_version_yanked": null,
"days_since_latest_publish": 49
}
]
},
"popularity": {
"forks": 13,
"stars": 270,
"watchers": 6,
"fork_history": {
"days": [
{
"date": "2020-09-17",
"count": 1
},
{
"date": "2020-10-07",
"count": 1
},
{
"date": "2021-04-26",
"count": 1
},
{
"date": "2021-08-30",
"count": 1
},
{
"date": "2021-09-10",
"count": 1
},
{
"date": "2021-09-20",
"count": 1
},
{
"date": "2021-12-20",
"count": 1
},
{
"date": "2023-11-20",
"count": 1
},
{
"date": "2023-12-20",
"count": 1
},
{
"date": "2025-01-14",
"count": 1
},
{
"date": "2025-07-04",
"count": 1
},
{
"date": "2026-01-15",
"count": 1
},
{
"date": "2026-03-13",
"count": 1
}
],
"complete": true,
"collected": 13,
"total_forks": 13
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"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": 19953,
"source_files_sampled": 41,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"composer.json"
],
"advisories": {
"error": null,
"scope": null,
"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": [
"packagist"
],
"dependencies": [
{
"name": "symfony/options-resolver",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^7.4|^8.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 2,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "nicolas-grekas",
"commits": 157,
"avatar_url": "https://avatars.githubusercontent.com/u/243674?v=4"
},
{
"type": "User",
"login": "fabpot",
"commits": 42,
"avatar_url": "https://avatars.githubusercontent.com/u/47313?v=4"
},
{
"type": "User",
"login": "xabbuh",
"commits": 24,
"avatar_url": "https://avatars.githubusercontent.com/u/1957048?v=4"
},
{
"type": "User",
"login": "derrabus",
"commits": 17,
"avatar_url": "https://avatars.githubusercontent.com/u/1506493?v=4"
},
{
"type": "User",
"login": "Nyholm",
"commits": 12,
"avatar_url": "https://avatars.githubusercontent.com/u/1275206?v=4"
},
{
"type": "User",
"login": "wouterj",
"commits": 11,
"avatar_url": "https://avatars.githubusercontent.com/u/749025?v=4"
},
{
"type": "User",
"login": "chalasr",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/7502063?v=4"
},
{
"type": "User",
"login": "Seldaek",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/183678?v=4"
},
{
"type": "User",
"login": "jderusse",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/578547?v=4"
},
{
"type": "User",
"login": "keradus",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/2716794?v=4"
}
],
"contributors_sampled": 44,
"top_contributor_share": 0.482
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 44 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": 0,
"reason": "no 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": "23 commit(s) and 0 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": "no SAST tool detected",
"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": "dd8f48286c000b8511b9413105f4118c8c2a4bd6",
"ran_at": "2026-07-28T15:01:10Z",
"aggregate_score": 4.8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/symfony/rate-limiter",
"host": "github.com",
"name": "rate-limiter",
"owner": "symfony"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"security": 48,
"vitality": 77,
"community": 74,
"governance": 58,
"engineering": 44
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"commits_last_year": 72,
"human_commit_share": 1,
"days_since_last_push": 31,
"active_weeks_last_year": 24
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 31 days ago",
"points": 18,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 31
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "24/52 weeks with commits",
"points": 16.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 24
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "72 commits in the last year",
"points": 16.7,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 72
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "23 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 100,
"latest_release_tag": "v8.1.1",
"releases_from_tags": false,
"days_since_latest_release": 31,
"mean_days_between_releases": 4.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "100 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 100
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 31 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 31
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4.2 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4.2
}
}
],
"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": 54,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 54 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 54
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 74,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 52,
"inputs": {
"forks": 13,
"stars": 270,
"watchers": 6,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "270 stars",
"points": 39.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 270
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "13 forks",
"points": 9,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 13
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "6 watchers",
"points": 3.9,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 6
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 85,
"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": "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": 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
}
]
},
{
"key": "ecosystem_adoption",
"band": "excellent",
"name": "Ecosystem adoption (downloads)",
"note": null,
"notes": [],
"value": 95,
"inputs": {
"packages": [
"symfony/rate-limiter"
],
"dependents": 154,
"ecosystems": "packagist",
"total_downloads": 56813854,
"monthly_downloads": 2723917
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,723,917 downloads/month across packagist",
"points": 80,
"status": "met",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2723917,
"ecosystems": "packagist"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "154 packages depend on it",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "registry_dependents",
"params": {
"count": 154
}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 58,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "moderate",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"bus_factor": 2,
"contributors_sampled": 44,
"top_contributor_share": 0.482
},
"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 48% of commits",
"points": 11.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 48
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "44 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 44
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 44 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 79,
"inputs": {
"followers": 2180,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "symfony",
"public_repos": 414,
"account_age_days": 6121
},
"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": "2,180 followers of symfony",
"points": 24,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 2180,
"login": "symfony"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "414 public repos, account ~16 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 414
}
},
{
"code": "account_age_years",
"params": {
"years": 16
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"symfony/rate-limiter"
],
"ecosystems": "packagist",
"any_deprecated": false,
"min_days_since_publish": 49
},
"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 49 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 49
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "152 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 152
}
}
],
"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": "at_risk",
"name": "Engineering Quality",
"value": 44,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [
"php",
"symfony",
"component",
"symfony-component",
"limiter",
"rate-limiter"
],
"has_wiki": false,
"homepage": "https://symfony.com/rate-limiter",
"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://symfony.com/rate-limiter",
"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": "6 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 6
}
}
],
"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": "at_risk",
"name": "Security",
"value": 48,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 48,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 4.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": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 44 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": "no update tool detected",
"points": 0,
"status": "missed",
"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": "23 commit(s) and 0 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": "no SAST tool detected",
"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"
],
"commit_weight_rule": {
"min_commits": 50,
"min_commit_share": 0.1
},
"review_only_matches": 0,
"below_threshold_exposures": [],
"assessed_self_published_locations": 39
},
"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": 33,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 34,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.64,
"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": "64 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 34.1,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 64,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "critical",
"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": 24,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"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": 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": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"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": 19953,
"source_files_sampled": 41,
"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/41 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 41,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"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.14.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T15:01:28.290891Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/symfony/rate-limiter.svg",
"full_name": "symfony/rate-limiter",
"license_state": "standard",
"license_spdx": "MIT"
}