Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-27 05:53 UTC

mezzio / mezzio-tooling

Migration and development tooling for Mezzio

PHPBSD-3-Clause★ 19 зірок⑂ 17 форківз груд. 2019 р.Переглянути на GitHub ↗

mezzio/mezzio-tooling має індекс здоров’я 72 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (83/100), найнижчий — AI Readiness (44/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконують 2 учасники.

72
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

72
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Mezzio, by LaminasОрганізація
74 підписники36 публічних репозиторіївз лист. 2019 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
Packagistmezzio/mezzio-tooling2.13.011 6164726 днів томуhttpmiddlewarepsrpsr-7laminasmezzio

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

83Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
22.2/36Ритм комітів — 32/52 тижнів із комітами
14.9/18Обсяг комітів — 45 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year45
human_commit_share0,41
days_since_last_push0
active_weeks_last_year32
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 18 релізів
36/36Свіжість релізів — останній реліз 26 дн. тому
12.6/27Ритм релізів — реліз кожні ~157,8 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count18
latest_release_tag2.13.0
releases_from_tagsні
days_since_latest_release26
mean_days_between_releases157,8
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

62Помірний · 18% загального індексу
Як обчислюється оцінка
20.4/60Зірки — 19 зірок
10/25Форки — 17 форків
5.6/15Спостерігачі — 11 спостерігачів
Використані вхідні дані
forks17
stars19
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (BSD-3-Clause)
18/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductтак
has_pull_request_templateтак
Як обчислюється оцінка
54.2/80Щомісячні завантаження — 11 616 завантажень/місяць у packagist
8.9/20Залежні пакети в реєстрі — залежних пакетів: 21
Використані вхідні дані
packagesmezzio/mezzio-tooling
dependents21
ecosystemspackagist
total_downloads1 184 522
monthly_downloads11 616

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

70Добрий · 24% загального індексу
Як обчислюється оцінка
25.2/54Бас-фактор — на 2 контриб’ютор(ів) припадає половина всіх комітів
11.3/22.5Розподіл комітів — головний контриб’ютор — автор 50% комітів
13.5/13.5Широта контриб’юторів — 27 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 48 contributing companies or organizations
Використані вхідні дані
bus_factor2
contributors_sampled27
top_contributor_share0,497
Як обчислюється оцінка
33.4/46.8Вирішення issue — закрито 71% issue
23.8/38.3Прийняття PR — злито 38/61 вирішених PR
3/15OpenSSF Scorecard: Code-Review — Found 2/7 approved changesets -- score normalized to 2
Використані вхідні дані
merged_prs38
open_issues4
closed_issues10
issue_closed_ratio0,714
closed_unmerged_prs23
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
13.5/25Охоплення власника — 74 підписників у mezzio
23.4/25Послужний список — 36 публічних репозиторіїв, вік облікового запису ~6 р.
Використані вхідні дані
followers74
owner_typeOrganization
is_verified
owner_loginmezzio
public_repos36
account_age_days2 438

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у packagist
35/35Свіжість публікацій — остання публікація 26 дн. тому
20/20Історія версій — 47 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesmezzio/mezzio-tooling
ecosystemspackagist
any_deprecatedні
min_days_since_publish26

Інженерна якість

Чи наявні базові інженерні практики та документація?

67Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

65Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
15/15Сайт документації / домашня сторінка — https://docs.mezzio.dev/mezzio/
10/10Опис репозиторію
10/10Теми — 3 тем
0/10Wiki
Використані вхідні дані
topicscli, mezzio, tooling
has_wikiні
homepagehttps://docs.mezzio.dev/mezzio/
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

76Добрий · 16% загального індексу
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
2.5/2.5CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 2/7 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 48 contributing companies or organizations
0/10Dangerous-Workflow — немає даних
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — немає даних
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — немає даних
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate7
Виключено з оцінювання (немає даних або не застосовно): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages85
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 85 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

44У зоні ризику · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
39/40Читабельна історія комітів — намір зазначено у 30 з 41 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,732
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
8/8Автоматизоване супроводження — 59 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilescomposer.lock
has_dockerfileні
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,59
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
0/45Типізований код — PHP без конфігурації перевірки типів
55/55Керовані розміри файлів — 0/171 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePHP
largest_source_bytes18 101
source_files_sampled171
oversized_source_files0

Ключові факти

19зірок GitHub
27контриб'юторів
45комітів за останні 12 місяців
0днів від останнього пушу
18релізів
2бас-фактор
4відкритих issue
Packagistпакетних екосистем

Попередження щодо збору даних

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

Докладніше

Історія зірок і форків 0 ★ / 17 ⇿
0Зірки
17Форки
17Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

0481216201712020-012023-042026-06
Мажорні 1Мінорні 13Патчі 3

Кожна точка охоплює 6 днів.

OpenSSF Scorecard 7.0 / 10
7.0сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-27 05:53 UTC

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 2/7 approved changesets -- score normalized to 2
10Contributorsproject has 48 contributing companies or organizations
н/дDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
н/дPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
н/дSigned-Releasesno releases found
н/дToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 4
РеєстрПакетОбмеження версіїМаніфест
Packagistlaminas/laminas-cli^1.7.0composer.json
Packagistmezzio/mezzio^3.13.0composer.json
Packagistmezzio/mezzio-router^3.9.0composer.json
Packagistsymfony/process^6.0.11composer.json
Усі залежності 85

Повний розв'язаний набір залежностей із графа залежностей GitHub: 4 прямих і 81 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Packagistlaminas/laminas-cli1.12.0пряма
Packagistmezzio/mezzio3.22.1пряма
Packagistmezzio/mezzio-router3.18.0пряма
Packagistsymfony/process6.4.41пряма
Packagistamphp/amp2.6.5непряма
Packagistamphp/byte-stream1.8.2непряма
Packagistcomposer/package-versions-deprecated1.11.99.5непряма
Packagistcomposer/pcre3.4.0непряма
Packagistcomposer/semver3.4.4непряма
Packagistcomposer/xdebug-handler3.0.5непряма
Packagistdealerdirect/phpcodesniffer-composer-installer0.7.2непряма
Packagistdnoegel/php-xdg-base-dir0.1.1непряма
Packagistfelixfbecker/advanced-json-rpc3.2.1непряма
Packagistfelixfbecker/language-server-protocol1.5.3непряма
Packagistfidry/cpu-core-counter1.3.0непряма
Packagistfig/http-message-util1.1.5непряма
Packagisthamcrest/hamcrest-php2.1.1непряма
Packagistlaminas/laminas-coding-standard2.5.0непряма
Packagistlaminas/laminas-diactoros3.7.0непряма
Packagistlaminas/laminas-escaper2.17.0непряма
Packagistlaminas/laminas-httphandlerrunner2.13.0непряма
Packagistlaminas/laminas-stratigility3.13.0непряма
Packagistmezzio/mezzio-template2.12.0непряма
Packagistmikey179/vfsstream1.6.12непряма
Packagistmockery/mockery1.6.12непряма
Packagistmyclabs/deep-copy1.13.4непряма
Packagistnetresearch/jsonmapper4.5.0непряма
Packagistnikic/php-parser4.19.5непряма
Packagistphar-io/manifest2.0.4непряма
Packagistphar-io/version3.2.1непряма
Packagistphp-mock/php-mock2.7.0непряма
Packagistphp-mock/php-mock-integration3.1.0непряма
Packagistphp-mock/php-mock-phpunit2.15.0непряма
Packagistphpdocumentor/reflection-common2.2.0непряма
Packagistphpdocumentor/reflection-docblock5.3.0непряма
Packagistphpdocumentor/type-resolver1.6.2непряма
Packagistphpstan/phpdoc-parser1.5.1непряма
Packagistphpunit/php-code-coverage10.1.16непряма
Packagistphpunit/php-file-iterator4.1.0непряма
Packagistphpunit/php-invoker4.0.0непряма
Packagistphpunit/php-text-template3.0.1непряма
Packagistphpunit/php-timer6.0.0непряма
Packagistphpunit/phpunit10.5.64непряма
Packagistpsalm/plugin-mockery0.11.0непряма
Packagistpsalm/plugin-phpunit0.18.4непряма
Packagistpsr/container2.0.2непряма
Packagistpsr/event-dispatcher1.0.0непряма
Packagistpsr/http-factory1.1.0непряма
Packagistpsr/http-message2.0непряма
Packagistpsr/http-server-handler1.0.2непряма
Packagistpsr/http-server-middleware1.0.2непряма
Packagistpsr/log3.0.2непряма
Packagistsebastian/cli-parser2.0.1непряма
Packagistsebastian/code-unit2.0.0непряма
Packagistsebastian/code-unit-reverse-lookup3.0.0непряма
Packagistsebastian/comparator5.0.5непряма
Packagistsebastian/complexity3.2.0непряма
Packagistsebastian/diff5.1.1непряма
Packagistsebastian/environment6.1.0непряма
Packagistsebastian/exporter5.1.4непряма
Packagistsebastian/global-state6.0.2непряма
Packagistsebastian/lines-of-code2.0.2непряма
Packagistsebastian/object-enumerator5.0.0непряма
Packagistsebastian/object-reflector3.0.0непряма
Packagistsebastian/recursion-context5.0.1непряма
Packagistsebastian/type4.0.0непряма
Packagistsebastian/version4.0.1непряма
Packagistslevomat/coding-standard7.2.1непряма
Packagistspatie/array-to-xml3.4.4непряма
Packagistsquizlabs/php_codesniffer3.13.5непряма
Packagistsymfony/console6.4.42непряма
Packagistsymfony/deprecation-contracts3.7.1непряма
Packagistsymfony/event-dispatcher6.4.37непряма
Packagistsymfony/event-dispatcher-contracts3.7.1непряма
Packagistsymfony/filesystem6.4.39непряма
Packagistsymfony/polyfill-ctype1.37.0непряма
Packagistsymfony/polyfill-intl-grapheme1.38.1непряма
Packagistsymfony/polyfill-intl-normalizer1.38.0непряма
Packagistsymfony/polyfill-mbstring1.38.2непряма
Packagistsymfony/service-contracts3.7.1непряма
Packagistsymfony/string6.4.39непряма
Packagisttheseer/tokenizer1.3.1непряма
Packagistvimeo/psalm5.26.1непряма
Packagistwebimpress/coding-standard1.4.0непряма
Packagistwebmozart/assert1.12.1непряма
Сповіщення про залежності 0

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 85 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 0 мають відомі сповіщення, з них 0 прямі.

Жодне відоме сповіщення не стосується оцінених залежностей.

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "mezzio",
        "tooling"
      ],
      "is_fork": false,
      "size_kb": 1587,
      "has_wiki": false,
      "homepage": "https://docs.mezzio.dev/mezzio/",
      "languages": {
        "PHP": 377086
      },
      "pushed_at": "2026-07-27T05:52:44Z",
      "created_at": "2019-12-31T21:03:25Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T05:51:41Z",
      "description": "Migration and development tooling for Mezzio",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "BSD-3-Clause",
      "default_branch": "2.14.x",
      "license_spdx_raw": "BSD-3-Clause",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": "https://docs.mezzio.dev",
      "name": "Mezzio, by Laminas",
      "type": "Organization",
      "login": "mezzio",
      "company": null,
      "location": null,
      "followers": 74,
      "avatar_url": "https://avatars.githubusercontent.com/u/58085692?v=4",
      "created_at": "2019-11-22T17:30:17Z",
      "is_verified": null,
      "public_repos": 36,
      "account_age_days": 2438
    },
    "license": {
      "state": "standard",
      "spdx_id": "BSD-3-Clause",
      "raw_spdx": "BSD-3-Clause",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "2.13.0",
          "kind": "minor",
          "published_at": "2026-06-30T15:18:53Z"
        },
        {
          "tag": "2.12.1",
          "kind": "patch",
          "published_at": "2026-05-18T07:31:07Z"
        },
        {
          "tag": "2.12.0",
          "kind": "minor",
          "published_at": "2025-09-12T08:41:50Z"
        },
        {
          "tag": "2.11.0",
          "kind": "minor",
          "published_at": "2025-08-07T10:05:38Z"
        },
        {
          "tag": "2.10.1",
          "kind": "patch",
          "published_at": "2025-03-05T09:38:13Z"
        },
        {
          "tag": "2.10.0",
          "kind": "minor",
          "published_at": "2025-03-04T10:09:04Z"
        },
        {
          "tag": "2.9.0",
          "kind": "minor",
          "published_at": "2023-12-12T16:19:11Z"
        },
        {
          "tag": "2.8.0",
          "kind": "minor",
          "published_at": "2022-12-01T11:42:43Z"
        },
        {
          "tag": "2.7.0",
          "kind": "minor",
          "published_at": "2022-11-25T15:49:36Z"
        },
        {
          "tag": "2.6.0",
          "kind": "minor",
          "published_at": "2022-08-10T08:18:32Z"
        },
        {
          "tag": "2.5.0",
          "kind": "minor",
          "published_at": "2022-01-20T18:22:29Z"
        },
        {
          "tag": "2.4.0",
          "kind": "minor",
          "published_at": "2021-12-13T17:50:19Z"
        },
        {
          "tag": "2.3.0",
          "kind": "minor",
          "published_at": "2021-12-06T04:40:28Z"
        },
        {
          "tag": "2.2.0",
          "kind": "minor",
          "published_at": "2021-10-11T14:24:05Z"
        },
        {
          "tag": "2.1.0",
          "kind": "minor",
          "published_at": "2021-10-05T08:14:06Z"
        },
        {
          "tag": "2.0.0",
          "kind": "major",
          "published_at": "2021-08-09T22:23:47Z"
        },
        {
          "tag": "1.4.0",
          "kind": "minor",
          "published_at": "2021-05-10T18:41:42Z"
        },
        {
          "tag": "1.3.1",
          "kind": "patch",
          "published_at": "2021-04-20T15:35:32Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d223f845fd9384348eb0934493b945fda46bcdbc",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-07-27T01:38:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7875384c2840faf51c94f8e3fe0990caf011c0e9",
          "body": "Remove unused dependencies",
          "is_bot": false,
          "headline": "Merge pull request #84 from gregtyler/remove-unused-dependencies",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2026-06-30T15:17:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39dc9e41680b2754b6134a9d7f53259fc50983dc",
          "body": "mezzio-tooling does not use laminas-code, laminas-stdlib or laminas-stratigility.\n\nlaminas-stratigility remains in the lockfile because mezzio still depends on it, but making the dependency indirect means it can be updated without mezzio-tooling imposing any restrictions.",
          "is_bot": false,
          "headline": "Remove unused dependencies",
          "author_name": "Greg Tyler",
          "author_login": "gregtyler",
          "committed_at": "2026-06-30T15:09:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a494eae576d8c9d79fa7bfb238a4d4cb6d43b90",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-06-29T03:07:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6e6c9ee739ccf16a562e5259b43ac2483642b1a",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-06-15T02:34:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb99b8d8a215e5e7f0eb3600ff1cd43b393141fd",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-06-08T00:45:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "177b35534edb220494e9af30c2357835d52020cb",
          "body": "Merge release 2.12.1 into 2.13.x",
          "is_bot": false,
          "headline": "Merge pull request #82 from mezzio/2.12.x-merge-up-into-2.13.x_SgeIPYnz",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2026-05-18T07:32:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38c6ae0fac6de3456fd7198c5a89032277042baf",
          "body": "…tor-bugfix\n\nFix malformed root namespace class names in generated factories",
          "is_bot": false,
          "headline": "Merge pull request #81 from gnatsnapper/root-namespace-factory-genera…",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2026-05-18T07:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5c7cf8b486b2e053214d3ed9cfed0eef65e4b08",
          "body": "Signed-off-by: Piers Hobson <piers@gnatsnapper.com>",
          "is_bot": false,
          "headline": "Updated doc block to remove psalm issue",
          "author_name": "Piers Hobson",
          "author_login": "gnatsnapper",
          "committed_at": "2026-05-18T06:54:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4d46276b0787b3aee64cdf00f5c08cc0e58994d",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-05-18T01:02:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05e37520ce69f468800d60938b4e7cbae63891d1",
          "body": "…classes in the root php namespace\n\nSigned-off-by: Piers Hobson <piers@groupia.com>",
          "is_bot": false,
          "headline": "Fix and unit test for bug in FactoryClassGenerator::getClassName for …",
          "author_name": "Piers Hobson",
          "author_login": null,
          "committed_at": "2026-05-17T11:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd0731d8223687128fdb699211a1fd7d155c17dd",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-05-11T01:16:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e52fa044d60042cf843232b5416c236ede210b00",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-05-04T02:32:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "408c6e0c2cb6637faeb78de391fd8f9f7da03468",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-04-27T01:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d638cd685aa969f8edc79f148b70f4e966d69c2",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-04-20T01:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf40cb1a1f31c7a601dd7fb289e6c6200afced54",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-04-13T01:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fc14292adc8d1e260c373f9c67398ee68986cf6",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-04-06T01:02:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b3d0851aa4062b35e9dd4eac88fc913efc909de",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-03-09T01:33:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0c5af8c5fa923005eb97ad16504fe1940dd9778",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-03-02T02:14:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cd2e2862733ff1bc425d898034d369d835d8782",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-02-09T00:46:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5114800fd3b3631b4bca98892ab1c74e3b124b7b",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-02-02T00:58:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16b05ebe8d0f0c48b785f562c9fcec43d46cc8d2",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-01-26T00:53:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3a4ae57467354fcdbdc992133fd82bb61655906",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2026-01-05T01:45:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "861972a39104ae5b0ea0f94ba7dfef098104a65b",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-12-22T01:58:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "295066c6213115e17c642e874dae0fca32267c40",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-11-17T02:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ee24e15e15bca1959ae43de71e7920de90b714",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-11-10T01:00:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b03eaa39da84d084645e726807a8d6e09925d36e",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-11-03T00:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c76c20824e3dc6ff8e3bc2186f3ad4c5949fe65",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-10-27T03:03:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b480b8d3aa4c71759c248f9116c2658b33bb7f1",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-10-20T01:39:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b371e5ebd87459d0fb3e88bf74cdddb929b153c",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-10-13T01:37:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79f62beb8333338105ea9c28e4d45ead9a3134de",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-10-06T01:08:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3809a7e7281e8f2f60807dda10ed564f3f95ffc9",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-09-29T01:50:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "952bd1902d529aea94661ae3f0ad8a6e5c8f3b88",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-09-22T00:25:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "689959c98f75c0db19417a65e7950a80225e7dd2",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-09-15T00:54:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41e8242b27398d0511223d48bbd9efc97d6a2e40",
          "body": "Coding Standard Fixes for the PSR-15 Handler and Middleware class skeletons",
          "is_bot": false,
          "headline": "Merge pull request #72 from tyrsson/fix-class-templates",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-09-12T08:39:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86ce1763422a80d17baefbbda4e13aacf9ca3d5f",
          "body": "Update strings in the related unit test to correctly check the generated classes.\nSigned-off-by: Joey Smith <jsmith@webinertia.net>\n\nSigned-off-by: Joey Smith <jsmith@webinertia.net>",
          "is_bot": false,
          "headline": "Correct the class skeleton strings.",
          "author_name": "Joey Smith",
          "author_login": "tyrsson",
          "committed_at": "2025-09-12T06:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6debf20c01fa7ad03b318312416370c0516913d2",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-09-08T01:12:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34abe6b30fc69ac5bb5a59044381ab83e943be32",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-08-25T01:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01588f5eaa19882430e63d49829ebb6682c57fa6",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-08-18T01:02:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fea11acfe0fd7e537c7b2e6573a9b387369dd59",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-08-11T00:23:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc7f93fb7ad9dd9fb710be22dc892fd8a34d655d",
          "body": "Lock file maintenance",
          "is_bot": false,
          "headline": "Merge pull request #65 from mezzio/renovate/lock-file-maintenance",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-08-07T10:03:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dcf795c301083fac8c1948bf99f2c12c89ff37e",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-08-07T09:58:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3385f91506fb0e58eb6bbb791170a5f95de48aa7",
          "body": "Fix psr-4 empty array being serialized as [] instead of {} in composer.json",
          "is_bot": false,
          "headline": "Merge pull request #71 from eguvenc/fix-empty-psr4-test",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-08-07T09:56:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2af3fc8798614b17443e4630f270578b9104163",
          "body": "Signed-off-by: eguvenc <eguvenc@gmail.com>",
          "is_bot": false,
          "headline": "Fix Psalm mixed type issue in test",
          "author_name": "eguvenc",
          "author_login": "eguvenc",
          "committed_at": "2025-08-07T09:44:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "874fd43a831f98ffcf72c024b7c8fc440fcb33a5",
          "body": "Signed-off-by: eguvenc <eguvenc@gmail.com>",
          "is_bot": false,
          "headline": "fixed psalm errors",
          "author_name": "eguvenc",
          "author_login": "eguvenc",
          "committed_at": "2025-08-07T09:39:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbb9118300e18442c1ff445d5626d446a306dcf7",
          "body": "…r.json\n\nSigned-off-by: eguvenc <eguvenc@gmail.com>",
          "is_bot": false,
          "headline": "Fix psr-4 empty array being serialized as [] instead of {} in compose…",
          "author_name": "eguvenc",
          "author_login": "eguvenc",
          "committed_at": "2025-08-07T08:52:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1d35ed7abee053e9919040c96b6babfc1c514f9",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-06-30T02:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53bc0e6b2a95431eec42d49d26ed57ae9fd204f5",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-06-23T02:33:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "767a7124ac57785204f12997e0ecf4240e501652",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-06-16T00:45:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f00b18d8a3af1a867c9a5639bafc00c8f6b7a182",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-06-09T02:48:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8bde473be77ad79e1fb4e11fd8ab4038c79332c",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-05-26T03:07:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc30ff41525cb4c92c817d85d3584ec7e0844e4d",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-05-19T03:52:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c88a9bf43a9ea30a4ae1e80a07a2924604b6ee37",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-05-12T03:32:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d89e6ac9cdb72e708780cb203e22000781fd87c4",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-05-05T02:46:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1af8f85d9f9a67a29540820e16d4fe5a6e041217",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-04-28T02:08:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "731a6e6719870c5238941d50f8e82f2ad8a7fa6f",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-04-14T03:10:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa5d1a47dbe7a6c76210df8a3a20bffb008bbac8",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-04-07T02:42:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17b726c026d9762baa481d538b7d8198c1b7b166",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-03-31T02:22:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "949b3e953c08c343c0d11b85f943c9143f373545",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-03-24T03:52:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1e1b182463f5717fb857eea7b9990a165e2dddb",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-03-17T02:31:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "480af31b527fe55c82481ba63bf9f2eaad33c0c0",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-03-10T02:21:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd2908140f90fc450efd95224a462bd339d5dd43",
          "body": "Merge release 2.10.1 into 2.11.x",
          "is_bot": false,
          "headline": "Merge pull request #63 from mezzio/2.10.x-merge-up-into-2.11.x_YoVvGHEg",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T09:40:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fcc2d4ebe5c99685b73920b6ec7259c46d4a3e0",
          "body": "Refine routes list functionality",
          "is_bot": false,
          "headline": "Merge pull request #58 from settermjd/refine-routes-list-functionality",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T09:37:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5189f2e91cc56ae5b7702731687da56135e7442",
          "body": "Signed-off-by: George Steel <george@net-glue.co.uk>",
          "is_bot": false,
          "headline": "Fix minor docs linting issues",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T09:15:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc3574fa9515dd051cc0b3618fcde087415d114c",
          "body": "Signed-off-by: George Steel <george@net-glue.co.uk>",
          "is_bot": false,
          "headline": "Tighten up PHPUnit config",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T00:05:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cac4ba0a6409082c293e468296c69afa249ace5",
          "body": "Signed-off-by: George Steel <george@net-glue.co.uk>",
          "is_bot": false,
          "headline": "Refactor list routes command and improve tests by reducing mocking",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T00:05:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0bceb4194eb24109ac4ffd5815165dfa19ffae15",
          "body": "Signed-off-by: George Steel <george@net-glue.co.uk>",
          "is_bot": false,
          "headline": "Remove unnecessary classes",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2025-03-05T00:03:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "687370156aad5c3ee2a40b501240e685bb3fa747",
          "body": "This change updates the packages ConfigProvider class to register a\nConfigLoaderInterface service with the DI container provided by\nDefaultRoutesConfigLoaderFactory. If a user needs to override this\nimplementation, they can do so as per the additional documentation in\nthe package's README.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Load the DefaultRoutesConfigLoaderFactory with Mezzio Tooling",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba5ebab142e47ecff501db70ad19851360c1fb85",
          "body": "This change provides a default implementation for retrieving an\napplication's routes configuration. It uses the stock approach of\nsearching for routes in config/routes.php and any registered with the\nApplication object in any of the loaded ConfigProvider classes. It also\nprovides a simplistic example for building a custom implementation,\nshould it be required.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Add a default way of retrieving routes from the application",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d330bef96a3ee42453543a00661c6d5b0d5ccf94",
          "body": "This change refactors ListRoutesCommandFactory to retrieve a\nConfigLoaderInterface object from the application's DiC instead of\ninstantiating a RoutesFileConfigLoader object directly. The main reason\nfor this is to provide flexibility to the user, should they have the\nneed to retrieve routes in a different way than the default\nimplementation, which searches in config/routes.php and in any routes\nregistered through ConfigProvider classes.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Refactor how ListRoutesCommandFactory retrieves a ConfigLoaderInterface",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22345cae0fc852bdf7d8b4672f189be37689e894",
          "body": "Signed-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Minor code clean up",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c602760121a7a8b05a1bbc4a25831f8c8bcf6b23",
          "body": "I'm not sure why I didn't do this originally. Perhaps I was\nexperimenting to learn how routing works in Mezzio more deeply.\nRegardless, this change refactors ListRoutesCommand to take a\nRouteCollector object instead of a ContainerInterface and from that\nContainerInterface fetching a RouteCollector.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Refactor ListRoutesCommand to take a RouteCollector directly",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "414d38ace577f5982bfafa36e582b8b2daa6e276",
          "body": "This is to ensure that any possible type of error is caught and handled.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Replace the Exception with a Throwable in RoutesFilter",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83411cc61cbe2c9a0e1facf8589fa429bb96deb2",
          "body": "This change removes the class' default options, replacing them with\nunions of non-empty-string|null. In doing so it's explicit that\nnull means the option is unset and should be ignored.\n\nThis change was motivated by @gsteel's comment\nhttps://github.com/mezzio/mezzio-tooling/pull/52#discussion_r1808661057.\nI believe that I've implemented it correctly.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Refactor RouteFilterOptions to require specific types without defaults",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:29:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d0dc84b6b6e69bb66c37054b43bd06e4b64e5cc",
          "body": "This change stores the filter options as member variables so that\nthey're more readily reusable and so that it should be less likely to\nmake a mistake with using them at some point in the future.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Refactor filter options as class member variables",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:28:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc3daabeb771205552fd4f1f2df071ac8d294f60",
          "body": "Signed-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Add docblock comments for RouteFilterOptionsInterface methods",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:28:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53aa4382dd4cdcb1005179c12fe224feb9e2f962",
          "body": "Previously, RoutesFilter was taking an array with the filter options\n(i.e., method, path, name, etc) but, as @gsteel noted, there was a\nperfectly good RouteFilterOptions class available. I don't know why I\ndeveloped it, but overlooked it. This change refactors RoutesFilter to\nuse it instead, then go\n[…]\nt, when no filter options are\navailable, an EmptyRouteFilterOptions can be supplied, hopefully making\nthe code easier to intuit and maintain.\n\nSigned-off-by: Matthew Setter <matthew@matthewsetter.com>",
          "is_bot": false,
          "headline": "Refactor RoutesFilter to use a RouteFilterOptionsInterface object",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2025-03-04T21:28:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "375ea79ded5816f55147dacc785d5625a898cc5d",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-03-03T03:28:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "864b427bc08c254c9b88000f2084913e89360921",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-02-24T01:30:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90dfc9cf1d2c66e82b93b1129c160a5f2431a830",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-02-17T01:51:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9171fd84bf79f9941e6c19c7a0b7059a849b40cf",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-02-10T00:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "011b5defc6e2f4203c464e53448dd713022c4a40",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-02-03T01:15:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f77a3223b8a005eeb00e9e2ce6207b798bee721",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-01-20T01:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb82327aacf65ecc09b1056cdaa6eed71a04b001",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2025-01-06T01:45:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af35f8f4bcd4c57ab3723dc5ce188ea9734a30ce",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2024-12-30T01:18:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e2b3f5c13fecefece2b2aa3f9db3e06514e6b32",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2024-12-16T01:08:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38b20ccf49af86c9add9aeab932f61e75c48b79b",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2024-12-09T02:19:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8d82d4728a4bf4dca511f49dd722913f4ee32fe",
          "body": "Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Lock file maintenance",
          "author_name": "renovate[bot]",
          "author_login": "renovate[bot]",
          "committed_at": "2024-12-02T02:00:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6aa569fecf98bcf620e9e7784f73c08d7966ea9",
          "body": "Add support for PHP 8.4",
          "is_bot": false,
          "headline": "Merge pull request #59 from weierophinney/feature/php-8.4",
          "author_name": "George Steel",
          "author_login": "gsteel",
          "committed_at": "2024-11-26T21:19:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab833e6df675a3e39422dbf1627666e1b4c40665",
          "body": "- Conflict with older versions of symfony 5 components\n- Bump vfsStream to latest\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: ensure dependencies work on lowest",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T14:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97345be1e9e3507c12a6f0f7e21100e9c3d1717a",
          "body": "Ensures deprecations will be resolved.\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: add a conflict on amp < 2.6.4",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T14:01:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a92b8c9222bcb823491c1d09edfff15859ef5077",
          "body": "First version fixing nullable argument handling.\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: bump mockery to 1.6.10",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T13:53:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b984317c70e29164fc0ab689a4bdfbe3db135b71",
          "body": "Signed-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: toggle the ignore_platform_reqs flag to see if that solves 8.4 runs",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T13:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5025bab0ee55b1f4846552bfc8119a7091a5c68c",
          "body": "Signed-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: do not ignore platform requirements on 8.4",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T13:46:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7dc6856cd7d3c2033279d1d5e686ef65810a692",
          "body": "- Primarily changing `?:` to `??` when the left side is testing against null\n- Adds some typehints where expectations are known\n- Adds `=== null` checks to validate a value is present\n- Indents a heredoc\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: resolve warnings flagged by psalm",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-26T13:42:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2430125d7a81117a12eee382826763cfba7fd668",
          "body": "- Adds 8.4 to PHP constraint\n- Bumps PHPUnit to 10.5\n- Fixes a number of PHPUnit deprecations\n- Resolves an issue in the RoutesFilter when performing a regex against a FQCN.\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "feat: allow using with PHP 8.4",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-25T23:26:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26484e0fe6efa8c67c27fdf961a882b00d00c31a",
          "body": "willReturnOnConsecutiveCalls was missing the call to the sort option, and raising an error due to being called more than 5 times.\n\nSigned-off-by: Matthew Weier O'Phinney <matthew@weierophinney.net>",
          "is_bot": false,
          "headline": "qa: fix expectation",
          "author_name": "Matthew Weier O'Phinney",
          "author_login": "weierophinney",
          "committed_at": "2024-11-25T22:41:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a45b5857ab265bc527127a5b2e5de9960df0e86c",
          "body": "Update to use PHP 8.1 syntax",
          "is_bot": false,
          "headline": "Merge pull request #55 from samsonasik/update-to-usephp81",
          "author_name": "Abdul Malik Ikhsan",
          "author_login": "samsonasik",
          "committed_at": "2024-11-16T07:22:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a762941c032da58a6ad116597bc4af81c727fab",
          "body": "Signed-off-by: Abdul Malik Ikhsan <samsonasik@gmail.com>",
          "is_bot": false,
          "headline": "Update to use PHP 8.1 syntax",
          "author_name": "Abdul Malik Ikhsan",
          "author_login": "samsonasik",
          "committed_at": "2024-11-03T06:40:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef0267345cd0966550e15fff23ab2c9e14ac09cd",
          "body": "Format previous versions note as an admonition",
          "is_bot": false,
          "headline": "Merge pull request #53 from settermjd/update-readme",
          "author_name": "Matthew Setter",
          "author_login": "settermjd",
          "committed_at": "2024-10-25T21:44:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 45,
      "latest_release_at": "2026-06-30T15:18:53Z",
      "latest_release_tag": "2.13.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 26,
      "mean_days_between_releases": 157.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "mezzio/mezzio-tooling",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "http",
            "middleware",
            "psr",
            "psr-7",
            "laminas",
            "mezzio"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/mezzio/mezzio-tooling",
          "is_deprecated": false,
          "latest_version": "2.13.0",
          "repository_url": "https://github.com/mezzio/mezzio-tooling",
          "versions_count": 47,
          "total_downloads": 1184522,
          "dependents_count": 21,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 11616,
          "first_published_at": null,
          "latest_published_at": "2026-06-30T15:17:55Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 26
        }
      ]
    },
    "popularity": {
      "forks": 17,
      "stars": 19,
      "watchers": 11,
      "fork_history": {
        "days": [
          {
            "date": "2020-01-07",
            "count": 1
          },
          {
            "date": "2020-04-14",
            "count": 1
          },
          {
            "date": "2020-09-15",
            "count": 1
          },
          {
            "date": "2021-07-26",
            "count": 1
          },
          {
            "date": "2021-12-05",
            "count": 1
          },
          {
            "date": "2022-01-03",
            "count": 1
          },
          {
            "date": "2022-01-20",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 1
          },
          {
            "date": "2022-09-13",
            "count": 1
          },
          {
            "date": "2025-08-07",
            "count": 1
          },
          {
            "date": "2025-09-12",
            "count": 1
          },
          {
            "date": "2026-01-08",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 17,
        "total_forks": 17
      },
      "star_history": null,
      "open_issues_and_prs": 12
    },
    "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": 18101,
      "source_files_sampled": 171,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 85,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "laminas/laminas-cli",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^1.7.0"
        },
        {
          "name": "mezzio/mezzio",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^3.13.0"
        },
        {
          "name": "mezzio/mezzio-router",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^3.9.0"
        },
        {
          "name": "symfony/process",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^6.0.11"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "laminas/laminas-cli",
            "direct": true,
            "version": "1.12.0",
            "ecosystem": "packagist"
          },
          {
            "name": "mezzio/mezzio",
            "direct": true,
            "version": "3.22.1",
            "ecosystem": "packagist"
          },
          {
            "name": "mezzio/mezzio-router",
            "direct": true,
            "version": "3.18.0",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/process",
            "direct": true,
            "version": "6.4.41",
            "ecosystem": "packagist"
          },
          {
            "name": "amphp/amp",
            "direct": false,
            "version": "2.6.5",
            "ecosystem": "packagist"
          },
          {
            "name": "amphp/byte-stream",
            "direct": false,
            "version": "1.8.2",
            "ecosystem": "packagist"
          },
          {
            "name": "composer/package-versions-deprecated",
            "direct": false,
            "version": "1.11.99.5",
            "ecosystem": "packagist"
          },
          {
            "name": "composer/pcre",
            "direct": false,
            "version": "3.4.0",
            "ecosystem": "packagist"
          },
          {
            "name": "composer/semver",
            "direct": false,
            "version": "3.4.4",
            "ecosystem": "packagist"
          },
          {
            "name": "composer/xdebug-handler",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "packagist"
          },
          {
            "name": "dealerdirect/phpcodesniffer-composer-installer",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "packagist"
          },
          {
            "name": "dnoegel/php-xdg-base-dir",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "packagist"
          },
          {
            "name": "felixfbecker/advanced-json-rpc",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "packagist"
          },
          {
            "name": "felixfbecker/language-server-protocol",
            "direct": false,
            "version": "1.5.3",
            "ecosystem": "packagist"
          },
          {
            "name": "fidry/cpu-core-counter",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "packagist"
          },
          {
            "name": "fig/http-message-util",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "packagist"
          },
          {
            "name": "hamcrest/hamcrest-php",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "packagist"
          },
          {
            "name": "laminas/laminas-coding-standard",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "packagist"
          },
          {
            "name": "laminas/laminas-diactoros",
            "direct": false,
            "version": "3.7.0",
            "ecosystem": "packagist"
          },
          {
            "name": "laminas/laminas-escaper",
            "direct": false,
            "version": "2.17.0",
            "ecosystem": "packagist"
          },
          {
            "name": "laminas/laminas-httphandlerrunner",
            "direct": false,
            "version": "2.13.0",
            "ecosystem": "packagist"
          },
          {
            "name": "laminas/laminas-stratigility",
            "direct": false,
            "version": "3.13.0",
            "ecosystem": "packagist"
          },
          {
            "name": "mezzio/mezzio-template",
            "direct": false,
            "version": "2.12.0",
            "ecosystem": "packagist"
          },
          {
            "name": "mikey179/vfsstream",
            "direct": false,
            "version": "1.6.12",
            "ecosystem": "packagist"
          },
          {
            "name": "mockery/mockery",
            "direct": false,
            "version": "1.6.12",
            "ecosystem": "packagist"
          },
          {
            "name": "myclabs/deep-copy",
            "direct": false,
            "version": "1.13.4",
            "ecosystem": "packagist"
          },
          {
            "name": "netresearch/jsonmapper",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "packagist"
          },
          {
            "name": "nikic/php-parser",
            "direct": false,
            "version": "4.19.5",
            "ecosystem": "packagist"
          },
          {
            "name": "phar-io/manifest",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "packagist"
          },
          {
            "name": "phar-io/version",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "packagist"
          },
          {
            "name": "php-mock/php-mock",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "packagist"
          },
          {
            "name": "php-mock/php-mock-integration",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "packagist"
          },
          {
            "name": "php-mock/php-mock-phpunit",
            "direct": false,
            "version": "2.15.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpdocumentor/reflection-common",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpdocumentor/reflection-docblock",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpdocumentor/type-resolver",
            "direct": false,
            "version": "1.6.2",
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/phpdoc-parser",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/php-code-coverage",
            "direct": false,
            "version": "10.1.16",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/php-file-iterator",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/php-invoker",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/php-text-template",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/php-timer",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/phpunit",
            "direct": false,
            "version": "10.5.64",
            "ecosystem": "packagist"
          },
          {
            "name": "psalm/plugin-mockery",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "packagist"
          },
          {
            "name": "psalm/plugin-phpunit",
            "direct": false,
            "version": "0.18.4",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/container",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/event-dispatcher",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/http-factory",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/http-message",
            "direct": false,
            "version": "2.0",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/http-server-handler",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/http-server-middleware",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "psr/log",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/cli-parser",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/code-unit",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/code-unit-reverse-lookup",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/comparator",
            "direct": false,
            "version": "5.0.5",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/complexity",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/diff",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/environment",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/exporter",
            "direct": false,
            "version": "5.1.4",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/global-state",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/lines-of-code",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/object-enumerator",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/object-reflector",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/recursion-context",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/type",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "packagist"
          },
          {
            "name": "sebastian/version",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "packagist"
          },
          {
            "name": "slevomat/coding-standard",
            "direct": false,
            "version": "7.2.1",
            "ecosystem": "packagist"
          },
          {
            "name": "spatie/array-to-xml",
            "direct": false,
            "version": "3.4.4",
            "ecosystem": "packagist"
          },
          {
            "name": "squizlabs/php_codesniffer",
            "direct": false,
            "version": "3.13.5",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/console",
            "direct": false,
            "version": "6.4.42",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/deprecation-contracts",
            "direct": false,
            "version": "3.7.1",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/event-dispatcher",
            "direct": false,
            "version": "6.4.37",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/event-dispatcher-contracts",
            "direct": false,
            "version": "3.7.1",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/filesystem",
            "direct": false,
            "version": "6.4.39",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/polyfill-ctype",
            "direct": false,
            "version": "1.37.0",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/polyfill-intl-grapheme",
            "direct": false,
            "version": "1.38.1",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/polyfill-intl-normalizer",
            "direct": false,
            "version": "1.38.0",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/polyfill-mbstring",
            "direct": false,
            "version": "1.38.2",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/service-contracts",
            "direct": false,
            "version": "3.7.1",
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/string",
            "direct": false,
            "version": "6.4.39",
            "ecosystem": "packagist"
          },
          {
            "name": "theseer/tokenizer",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "packagist"
          },
          {
            "name": "vimeo/psalm",
            "direct": false,
            "version": "5.26.1",
            "ecosystem": "packagist"
          },
          {
            "name": "webimpress/coding-standard",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "packagist"
          },
          {
            "name": "webmozart/assert",
            "direct": false,
            "version": "1.12.1",
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 85,
        "direct_count": 4,
        "indirect_count": 81
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 8,
        "merged_prs": 38,
        "open_issues": 4,
        "closed_ratio": 0.714,
        "closed_issues": 10,
        "closed_unmerged_prs": 23
      },
      "bus_factor": 2,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "weierophinney",
          "commits": 341,
          "avatar_url": "https://avatars.githubusercontent.com/u/25943?v=4"
        },
        {
          "type": "User",
          "login": "michalbundyra",
          "commits": 142,
          "avatar_url": "https://avatars.githubusercontent.com/u/7423207?v=4"
        },
        {
          "type": "User",
          "login": "geerteltink",
          "commits": 36,
          "avatar_url": "https://avatars.githubusercontent.com/u/9497586?v=4"
        },
        {
          "type": "User",
          "login": "settermjd",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/196801?v=4"
        },
        {
          "type": "User",
          "login": "arueckauer",
          "commits": 30,
          "avatar_url": "https://avatars.githubusercontent.com/u/1815979?v=4"
        },
        {
          "type": "User",
          "login": "gsteel",
          "commits": 24,
          "avatar_url": "https://avatars.githubusercontent.com/u/2803720?v=4"
        },
        {
          "type": "User",
          "login": "Ocramius",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/154256?v=4"
        },
        {
          "type": "User",
          "login": "ghostwriter",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/9754361?v=4"
        },
        {
          "type": "User",
          "login": "jbh",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/5510679?v=4"
        },
        {
          "type": "User",
          "login": "samsonasik",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/459648?v=4"
        }
      ],
      "contributors_sampled": 27,
      "top_contributor_share": 0.497
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "continuous-integration.yml",
        "release-on-milestone-closed.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "composer.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 2,
            "reason": "Found 2/7 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 48 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d223f845fd9384348eb0934493b945fda46bcdbc",
        "ran_at": "2026-07-27T05:53:30Z",
        "aggregate_score": 7,
        "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": "2026-07-27T05:52:55Z",
      "oldest_open_prs": [
        {
          "number": 49,
          "created_at": "2024-03-15T18:55:21Z",
          "last_comment_at": "2025-02-03T05:20:42Z",
          "last_comment_author": "renovate"
        },
        {
          "number": 50,
          "created_at": "2024-07-17T22:03:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 54,
          "created_at": "2024-10-23T12:06:00Z",
          "last_comment_at": "2024-10-23T12:21:41Z",
          "last_comment_author": "gsteel"
        },
        {
          "number": 61,
          "created_at": "2025-01-27T23:49:54Z",
          "last_comment_at": "2025-01-27T23:49:55Z",
          "last_comment_author": "renovate"
        },
        {
          "number": 64,
          "created_at": "2025-04-26T22:53:42Z",
          "last_comment_at": "2025-04-26T22:53:43Z",
          "last_comment_author": "renovate"
        },
        {
          "number": 75,
          "created_at": "2025-11-27T11:42:03Z",
          "last_comment_at": "2026-02-03T08:15:04Z",
          "last_comment_author": "s-kond"
        },
        {
          "number": 76,
          "created_at": "2026-01-08T02:01:40Z",
          "last_comment_at": "2026-01-08T02:01:41Z",
          "last_comment_author": "renovate"
        },
        {
          "number": 79,
          "created_at": "2026-02-06T08:25:12Z",
          "last_comment_at": "2026-02-06T08:25:15Z",
          "last_comment_author": "renovate"
        }
      ],
      "last_merged_pr_at": "2026-06-30T15:17:55Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 21,
          "created_at": "2022-01-08T11:39:36Z",
          "last_comment_at": "2022-01-14T21:27:04Z",
          "last_comment_author": "weierophinney"
        },
        {
          "number": 33,
          "created_at": "2022-09-13T23:08:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 73,
          "created_at": "2025-09-19T08:43:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 74,
          "created_at": "2025-10-13T09:55:58Z",
          "last_comment_at": "2025-12-07T08:06:32Z",
          "last_comment_author": "tyrsson"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mezzio/mezzio-tooling",
    "host": "github.com",
    "name": "mezzio-tooling",
    "owner": "mezzio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 72,
      "inputs": {
        "security": 76,
        "vitality": 83,
        "community": 62,
        "governance": 70,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 45,
              "human_commit_share": 0.41,
              "days_since_last_push": 0,
              "active_weeks_last_year": 32
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "45 commits in the last year",
                "points": 14.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "2.13.0",
              "releases_from_tags": false,
              "days_since_latest_release": 26,
              "mean_days_between_releases": 157.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 26 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~157.8 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 157.8
                    }
                  }
                ],
                "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": 26,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 26 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 62,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "forks": 17,
              "stars": 19,
              "watchers": 11,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "19 stars",
                "points": 20.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "17 forks",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "11 watchers",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (BSD-3-Clause)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "BSD-3-Clause"
                    }
                  }
                ],
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "packages": [
                "mezzio/mezzio-tooling"
              ],
              "dependents": 21,
              "ecosystems": "packagist",
              "total_downloads": 1184522,
              "monthly_downloads": 11616
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "11,616 downloads/month across packagist",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 11616,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "21 packages depend on it",
                "points": 8.9,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 70,
        "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": 27,
              "top_contributor_share": 0.497
            },
            "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 50% of commits",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 50
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "27 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 48 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "merged_prs": 38,
              "open_issues": 4,
              "closed_issues": 10,
              "issue_closed_ratio": 0.714,
              "closed_unmerged_prs": 23
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "71% of issues closed",
                "points": 33.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "38/61 decided PRs merged",
                "points": 23.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 38,
                      "decided": 61
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/7 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "followers": 74,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "mezzio",
              "public_repos": 36,
              "account_age_days": 2438
            },
            "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": "74 followers of mezzio",
                "points": 13.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 74,
                      "login": "mezzio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "36 public repos, account ~6 yr old",
                "points": 23.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 36
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "mezzio/mezzio-tooling"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 26
            },
            "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 26 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "47 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [
                "cli",
                "mezzio",
                "tooling"
              ],
              "has_wiki": false,
              "homepage": "https://docs.mezzio.dev/mezzio/",
              "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://docs.mezzio.dev/mezzio/",
                "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": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "good",
        "name": "Security",
        "value": 76,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/7 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 48 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 85 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 85
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 85,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 85,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 29
            },
            "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": 44,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.732,
              "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": "30 of 41 human commits state their intent (structured subject or explanatory body)",
                "points": 39,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 30,
                      "sampled": 41
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "composer.lock"
              ],
              "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.59
            },
            "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "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": "59 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 59,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 18101,
              "source_files_sampled": 171,
              "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/171 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 171,
                      "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.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T05:53:53.635331Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mezzio/mezzio-tooling.svg",
  "full_name": "mezzio/mezzio-tooling",
  "license_state": "standard",
  "license_spdx": "BSD-3-Clause"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаPackagist.