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

flarum / tags

[READ ONLY] Subtree split of Flarum tags extension.

PHP · TypeScriptMIT★ 38 зірок⑂ 80 форківз трав. 2015 р.Переглянути на GitHub ↗

flarum/tags має індекс здоров’я 61 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (87/100), найнижчий — Engineering Quality (26/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконують 2 учасники.

61
загалом / 100
Помірний

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

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

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

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

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

Власність

FlarumОрганізація
798 підписників53 публічні репозиторіїз вер. 2013 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
Packagistflarum/tagsv2.0.0-rc.522 6175320 днів томуdiscussion

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

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

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

87Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
17.3/36Ритм комітів — 25/52 тижнів із комітами
15.6/18Обсяг комітів — 53 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year53
human_commit_share0,99
days_since_last_push0
active_weeks_last_year25
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 50 релізів
36/36Свіжість релізів — останній реліз 19 дн. тому
27/27Ритм релізів — реліз кожні ~20,2 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count50
latest_release_tagv2.0.0-rc.5
releases_from_tagsні
days_since_latest_release19
mean_days_between_releases20,2
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

55Помірний · 18% загального індексу
Як обчислюється оцінка
25.4/60Зірки — 38 зірок
15.8/25Форки — 80 форків
5.3/15Спостерігачі — 10 спостерігачів
Використані вхідні дані
forks80
stars38
watchers10
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
0/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/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так
Як обчислюється оцінка
58.1/80Щомісячні завантаження — 22 617 завантажень/місяць у packagist
13.9/20Залежні пакети в реєстрі — залежних пакетів: 121
Використані вхідні дані
packagesflarum/tags
dependents121
ecosystemspackagist
total_downloads789 950
monthly_downloads22 617

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

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

72Добрий · 24% загального індексу
Як обчислюється оцінка
25.2/54Бас-фактор — на 2 контриб’ютор(ів) припадає половина всіх комітів
15.1/22.5Розподіл комітів — головний контриб’ютор — автор 33% комітів
13.5/13.5Широта контриб’юторів — 44 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 38 contributing companies or organizations
Використані вхідні дані
bus_factor2
contributors_sampled44
top_contributor_share0,33
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
28.8/38.3Прийняття PR — злито 110/146 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs110
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs36
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
20.9/25Охоплення власника — 798 підписників у flarum
24.6/25Послужний список — 53 публічних репозиторіїв, вік облікового запису ~12 р.
Використані вхідні дані
followers798
owner_typeOrganization
is_verified
owner_loginflarum
public_repos53
account_age_days4 688

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

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

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

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

26Критичний · 20% загального індексу

Інженерні практики

30У зоні ризику
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciні
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

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

20Критичний
Як обчислюється оцінка
0/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 2 тем
0/10Wiki
Використані вхідні дані
topicsflarum, hacktoberfest
has_wikiні
homepage
has_readmeні
has_docs_dirні
has_descriptionтак

Безпека

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

59Помірний · 16% загального індексу

Стан безпеки

59Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 38 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 — 22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — немає даних
0/5SAST — no SAST tool detected
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_aggregate5,9
Виключено з оцінювання (немає даних або не застосовно): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Залишкові ваги перенормовано.

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

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

54Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 99 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — js/tsconfig.json
0/10Відтворюване середовище
8/10Підтверджена практика роботи з агентами — 4 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 1 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configsjs/tsconfig.json
agent_commit_share0,04
toolchain_manifests
dependency_bot_commit_share0,01
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
27/45Типізований код — PHP з конфігурацією перевірки типів (js/tsconfig.json)
55/55Керовані розміри файлів — 0/151 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePHP
largest_source_bytes17 325
source_files_sampled151
oversized_source_files0

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

38зірок GitHub
44контриб'юторів
53комітів за останні 12 місяців
0днів від останнього пушу
50релізів
2бас-фактор
0відкритих issue
npm, Packagistпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Докладніше

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

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

0204060807932015-092020-122026-04
Мажорні 1Мінорні 8Патчі 12

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

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 38 contributing companies or organizations
н/дDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
н/дPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
н/дSigned-Releasesno releases found
н/дToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 2
РеєстрПакетОбмеження версіїМаніфест
Packagistflarum/core^2.0.0-rc.5composer.json
npmsortablejs^1.14.0js/package.json
Усі залежності 12

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

РеєстрПакетВерсіяЗв'язок
npmsortablejs^1.14.0пряма
Packagistflarum/coreпряма
npmflarum-tsconfig^2.0.0непряма
npmflarum-webpack-config^3.0.0непряма
npmprettier^2.7.1непряма
npmtypescript^4.5.4непряма
npmtypescript-coverage-report^0.6.1непряма
npmwebpack^5.104.1непряма
npmwebpack-cli^4.9.1непряма
Packagistflarum/auditнепряма
Packagistflarum/suspendнепряма
Packagistflarum/testingнепряма
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies carried a version and a supported ecosystem

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "flarum",
        "hacktoberfest"
      ],
      "is_fork": false,
      "size_kb": 4387,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "PHP": 206377,
        "Less": 11875,
        "Blade": 2239,
        "JavaScript": 24652,
        "TypeScript": 56217
      },
      "pushed_at": "2026-07-28T13:27:14Z",
      "created_at": "2015-05-07T12:56:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T13:29:49Z",
      "description": "[READ ONLY] Subtree split of Flarum tags extension.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "2.x",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "http://flarum.org",
      "name": "Flarum",
      "type": "Organization",
      "login": "flarum",
      "company": null,
      "location": null,
      "followers": 798,
      "avatar_url": "https://avatars.githubusercontent.com/u/5549034?v=4",
      "created_at": "2013-09-26T11:15:45Z",
      "is_verified": null,
      "public_repos": 53,
      "account_age_days": 4688
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.0.0-rc.5",
          "kind": "prerelease",
          "published_at": "2026-07-08T15:55:01Z"
        },
        {
          "tag": "v2.0.0-rc.4",
          "kind": "prerelease",
          "published_at": "2026-06-18T11:59:52Z"
        },
        {
          "tag": "v2.0.0-rc.3",
          "kind": "prerelease",
          "published_at": "2026-06-09T18:54:03Z"
        },
        {
          "tag": "v2.0.0-rc.2",
          "kind": "prerelease",
          "published_at": "2026-06-01T18:15:58Z"
        },
        {
          "tag": "v2.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2026-04-20T10:25:37Z"
        },
        {
          "tag": "v1.8.8",
          "kind": "patch",
          "published_at": "2026-04-18T21:01:26Z"
        },
        {
          "tag": "v1.8.7",
          "kind": "patch",
          "published_at": "2026-04-10T19:01:53Z"
        },
        {
          "tag": "v2.0.0-beta.7",
          "kind": "prerelease",
          "published_at": "2026-02-22T17:16:16Z"
        },
        {
          "tag": "v2.0.0-beta.6",
          "kind": "prerelease",
          "published_at": "2026-01-30T09:26:56Z"
        },
        {
          "tag": "v1.8.6",
          "kind": "patch",
          "published_at": "2026-01-07T19:15:20Z"
        },
        {
          "tag": "v2.0.0-beta.5",
          "kind": "prerelease",
          "published_at": "2025-12-20T22:43:48Z"
        },
        {
          "tag": "v2.0.0-beta.4",
          "kind": "prerelease",
          "published_at": "2025-11-25T18:05:58Z"
        },
        {
          "tag": "v1.8.5",
          "kind": "patch",
          "published_at": "2025-10-09T09:17:39Z"
        },
        {
          "tag": "v2.0.0-beta.3",
          "kind": "prerelease",
          "published_at": "2025-05-02T08:30:25Z"
        },
        {
          "tag": "v1.8.4",
          "kind": "patch",
          "published_at": "2025-03-12T10:44:17Z"
        },
        {
          "tag": "v2.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2025-01-17T09:16:42Z"
        },
        {
          "tag": "v2.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2024-12-11T17:09:28Z"
        },
        {
          "tag": "v1.8.3",
          "kind": "patch",
          "published_at": "2024-11-20T20:04:31Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2024-10-08T07:05:06Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2024-08-10T18:05:24Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2023-05-20T17:49:53Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2023-03-11T08:31:41Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2023-03-10T13:42:26Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2022-11-16T11:15:51Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2022-11-15T11:48:13Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2022-09-13T09:34:02Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2022-07-13T12:33:16Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2022-05-12T10:34:57Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2022-01-20T11:02:04Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2021-10-12T23:40:08Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2021-06-10T22:28:20Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2021-06-07T10:13:26Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2021-06-02T06:57:20Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2021-05-27T08:28:44Z"
        },
        {
          "tag": "v0.1.0-beta.16",
          "kind": "prerelease",
          "published_at": "2021-03-15T16:04:05Z"
        },
        {
          "tag": "v0.1.0-beta.15",
          "kind": "prerelease",
          "published_at": "2020-12-20T20:14:22Z"
        },
        {
          "tag": "v0.1.0-beta.14",
          "kind": "prerelease",
          "published_at": "2020-10-15T18:10:38Z"
        },
        {
          "tag": "v0.1.0-beta.13.2",
          "kind": "prerelease",
          "published_at": "2020-10-06T19:44:04Z"
        },
        {
          "tag": "v0.1.0-beta.13",
          "kind": "prerelease",
          "published_at": "2020-05-04T08:50:13Z"
        },
        {
          "tag": "v0.1.0-beta.12",
          "kind": "prerelease",
          "published_at": "2020-03-03T14:00:09Z"
        },
        {
          "tag": "v0.1.0-beta.11",
          "kind": "prerelease",
          "published_at": "2019-11-26T15:31:56Z"
        },
        {
          "tag": "v0.1.0-beta.10",
          "kind": "prerelease",
          "published_at": "2019-09-16T07:38:06Z"
        },
        {
          "tag": "v0.1.0-beta.9",
          "kind": "prerelease",
          "published_at": "2019-07-05T11:01:08Z"
        },
        {
          "tag": "v0.1.0-beta.8.1",
          "kind": "prerelease",
          "published_at": "2018-11-29T07:04:10Z"
        },
        {
          "tag": "v0.1.0-beta.8",
          "kind": "prerelease",
          "published_at": "2017-07-22T03:23:32Z"
        },
        {
          "tag": "v0.1.0-beta.7",
          "kind": "prerelease",
          "published_at": "2016-11-10T21:46:52Z"
        },
        {
          "tag": "v0.1.0-beta.6",
          "kind": "prerelease",
          "published_at": "2016-10-19T10:47:21Z"
        },
        {
          "tag": "v0.1.0-beta.5",
          "kind": "prerelease",
          "published_at": "2016-03-29T08:23:17Z"
        },
        {
          "tag": "v0.1.0-beta.4",
          "kind": "prerelease",
          "published_at": "2015-11-05T06:14:01Z"
        },
        {
          "tag": "v0.1.0-beta.3",
          "kind": "prerelease",
          "published_at": "2015-11-02T23:36:39Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "1dd4ac109c4d46255eaf6b9d9065b967a78db95a",
          "body": "…ce (#4839)\n\n* Cache permissions per group set instead of per User instance\n\nA user's permissions are fully determined by the set of group IDs they belong\nto, but they were loaded and memoized per User instance. Any code that checks\nan ability against each serialized user — extension serializer flag\n[…]\nsolution queries themselves and assert exactly one per\nrequest regardless of slug count, which is the behaviour the test guards.\n\n* Account for the table prefix when matching the slug-resolution query",
          "is_bot": false,
          "headline": "[2.x] fix: Cache permissions per group set instead of per User instan…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-07-26T13:20:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bf65f518743d1c2747188521a9588550ce48cb7",
          "body": "* docs: add changelog for 2.0.0-rc.5\n\n* docs: add #4806 to rc.5 changelog\n\n* docs: add #4807 to rc.5 changelog\n\n* chore: bump version and dependency constraints to 2.0.0-rc.5",
          "is_bot": false,
          "headline": "[2.x] chore: prepare 2.0.0-rc.5 (#4805)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-07-08T15:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "613d1485b221c6a9a1fec2b0a7d49186c7dea312",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 6a6f41e5bd1d0aea001a61b333d7f9e2a3c03088",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-07-07T11:07:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f587ab7fe9e8602906d6222bc994e322e45c5454",
          "body": "… (#4793)\n\nThe tag slug driver setting rendered its heading as the raw model class\nname (\"Slug Driver: Flarum\\Tags\\Tag\") because AdminPage.modelLocale()\nonly maps the core Discussion/User/Post models, and the tags extension\nonly extended driverLocale (the option labels), never the model label.\n\nExtend AdminPage.modelLocale so the tag model resolves to \"Tags\",\nconsistent with the core slug driver settings. This also corrects the\nsearch driver heading, which uses the same lookup.",
          "is_bot": false,
          "headline": "[2.x] fix(tags): show friendly model name for tag slug driver setting…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-07-07T11:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "455b9c5409ba9ca8e9e5ce86df1685a98c10acde",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b4388c5fdb119ddaf770724a5cb17d9893c7c7aa",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-06-17T23:10:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af82507f51f63d23dbc63db0fef77f69f04221ba",
          "body": "…tems list (#4755)\n\nTagLinkButton built its link contents (icon + label) inline in `view`,\ngiving extensions no clean seam to add to a tag link short of overriding\nthe whole component or mutating the returned vnode (fragile — the returned\nLink's children aren't reliably a mutable array at extend tim\n[…]\non', 'linkItems', ...)`.\n\nNo behaviour change: the icon and label render as before, and the children\npassed by addTagList (the tag name, read by SelectDropdown to label the\nactive item) are untouched.",
          "is_bot": false,
          "headline": "refactor(tags): convert TagLinkButton to TSX with an extensible linkI…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-17T23:06:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c40b1de2b9d0dace306d6ffbfb2ae7fdeb8064c8",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 900be16cf16e6f096cfe7ca1b6d39e28f7e8e5a8",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-06-17T19:50:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ead5f24d5787af0a02594b15ac3bc4bfc6d34cb9",
          "body": "sortablejs (~120KB raw / ~14KB gzip) was statically imported by core's\nGroupBar (permissions page) and the tags extension's TagsPage, so it\nshipped in every admin pageload even though drag-reorder is only used on\ntwo pages. This pushed core admin.js to the edge of the 150KB bundlewatch\nbudget.\n\nMove\n[…]\n a stopgap).\n\nGroupBar now attaches sortable from whichever of the lazy import and\noncreate completes last, guarding on element.isConnected so a late-\nresolving import can't attach to a detached node.",
          "is_bot": false,
          "headline": "perf(admin): lazy-load sortablejs to shrink admin bundles (#4754)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-17T19:46:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d947fec51ab16956bb8c5d1cb3d7e7e081a47b7a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 3597d6a7dace8a59ec35d5fb8e1d55eb24ae0a3a",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-06-16T21:42:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcf915c603058211c7c0e64257a295603a71aecd",
          "body": null,
          "is_bot": false,
          "headline": "fix(tags): serialize unslugged tag slug to API (#4746)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2026-06-16T21:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "675df2719830faa6495591c05eefa2adec0698ff",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep 2.0.0-rc.4 (#4741)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-16T10:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e95ce445c41dcc509d3d10e2248fe152b3a8a55c",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 83b81a466238851deec5a73f23914115492f5fce",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-06-15T22:46:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "047cb2b484d9868cfe4baff3fdc58638dbe4ef92",
          "body": "…er (#4739)\n\n* fix(tags): delegate tag slug resolution to the active slug driver\n\nThe tag filter resolved slugs by querying the literal `slug` column, so\ncustom slug drivers that don't use that column returned no results. Resolve\nslugs through the active driver instead, with an optional batch interf\n[…]\nan id_with_slug driver producing /t/1-general style URLs (resolved\nby the leading id, like the discussion slugger).\n\n* Apply fixes from StyleCI\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] fix(tags): delegate tag slug resolution to the active slug driv…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-15T22:42:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86219a95acc97b9804c893e5f96ce76ac31f2d48",
          "body": "… coverage (#4711)\n\n* [1.x] Add first-party Audit extension (#4704)\n\n* [1.x] Add first-party Audit extension\n\nAdds flarum/audit, a first-party audit log extension, to the monorepo.\n\nIt records moderation and administration actions (user, discussion, post,\nsetting, permission, extension lifecycle and\n[…]\nons_first_post_id_foreign during the approve flow (MySQL/SQLite tolerated it). Point it at the seeded post.\n\n* chore: add composer link to docs\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] Audit extension 2.x migration, integration split, and GDPR/core…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-12T01:16:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60a8665af0c9816046d8321b917163161de2e03f",
          "body": "…not a constructor) (#4699)\n\n* [2.x] Fix realtime extender load order for tags and sticky\n\nflarum/realtime registers its Realtime JS extender on the export registry\nat module-evaluation time, and consumers read it back via flarum.reg.get().\nThe combined forum.js concatenates extensions in resolveExt\n[…]\nn\noptional dependency; declare it on tags and sticky too (and normalise\nsticky's flarum-tags to flarum/tags).\n\nFixes https://discuss.flarum.org/d/39359\n\n* Add changelog entry for realtime ordering fix",
          "is_bot": false,
          "headline": "[2.x] Fix realtime extender load order for tags & sticky (TypeError: …",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-09T18:18:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca141b89427cd572d42ca4274d22f6d7c6c4c00d",
          "body": "* chore: prep rc.3\n\n* chore: bump composer reqs",
          "is_bot": false,
          "headline": "chore: prep `2.0.0-rc.3` (#4698)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-09T12:39:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5c3dbd7b641a70ca76c6c2cc6bbefcbb4803885",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep rc2 (#4676)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-05-30T22:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37c760a21a2f276bf3bff5a8e73d3eae98dea06a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 4c2e44fc00e8881f8090b07fdce3cb4d9e806355",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-05-13T10:05:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d03d28d38daab6c4a51055409436d5334eea40dc",
          "body": "… route title via rename() (#4658)\n\n* [2.x] fix(api): surface event posts in discussion PATCH responses and route title via rename()\n\nFixes two related 2.x regressions where discussion changes silently\nfail to surface in the UI:\n\n1. Event posts created via `mergePost()` (sticky/tags/lock) were absen\n[…]\nort from `ext:flarum/realtime/forum/extenders/Realtime`, but\nneither extension's tsconfig.json mapped that module specifier to\nrealtime's dist-typings. Mirror the mapping that flarum-lock already\nhas.",
          "is_bot": false,
          "headline": "[2.x] fix(api): surface event posts in discussion PATCH responses and…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-05-13T10:01:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9eaa06e827bedc3a795adf54ede233c8d058079b",
          "body": "…rom #4502) (#4649)\n\n* fix(tags): restore subquery for permitted tag IDs to fix per-instance cache miss\n\nPR #4502 replaced the SQL subquery in Tag::scopeWhereHasPermission with\na PHP-side filter cached on the actor User instance via WeakMap. The\nintent was to avoid re-running a correlated subquery p\n[…]\nission — must be visible (the orWhereNull('parent_id')\n  branch).\n\nThese pin the contract of the parent/child clause in\nTag::scopeWhereHasPermission so any future refactor that breaks it\nfails loudly.",
          "is_bot": false,
          "headline": "[2.x] fix(tags): restore subquery for permitted tag IDs (regression f…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-05-11T08:14:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26a2098295514f40b2045ba69bb9ac29bd9dfd5b",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 44b72ae22e23557bd1a744f071620540f764a850",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-05-09T06:05:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eecb0ca649b38e00db08c66027313ae1500e430",
          "body": "…4529)\n\n* tags: drop legacy background columns from tags table\n\n* tags: remove legacy background attributes",
          "is_bot": false,
          "headline": "[2.x] [Tags] Drop legacy unused background columns from tags table (#…",
          "author_name": "abdalrhman",
          "author_login": "Abdooo2235",
          "committed_at": "2026-05-09T06:00:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19f331d3ee70a8b9dbac4c520035c84cb37cbac1",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep rc.1 (#4581)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-17T12:43:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "789040ecc5260dcfcb6bf227390daeda7b1829cd",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5c5e3ef24be8c691642846723752e48eeef78973",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-15T11:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bf1ddfc0422fd4af63d96843d438443ed84c9a4",
          "body": "…#4575)\n\nFont Awesome 7's Kit JS dynamically injects a stylesheet after the\ncompiled forum.css. The Kit's .fas { display: var(--fa-display, …) }\nat specificity (0,1,0) wins the cascade over any application\ndisplay: none rule at the same specificity — purely by source order.",
          "is_bot": false,
          "headline": "fix: prevent FA Kit from overriding display on hidden icon elements (…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-15T11:12:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b2ce2959413c126ed7d74c2fbe0a705d5d6e1a",
          "body": "…4563)\n\nPreviously, each slug in a tag filter triggered a separate SELECT against\nthe tags table (one per slug via SlugManager/Utf8SlugDriver). With N tags\nin an OR filter, that meant N round-trips before the discussion query ran.\n\nReplace the per-slug loop with a single whereIn query that resolves \n[…]\nt map, producing the same null-ID / no-match behaviour as\nbefore. urldecode() parity with Utf8SlugDriver is also maintained.\n\nSlugManager is no longer needed and has been removed from the constructor.",
          "is_bot": false,
          "headline": "perf(tags): resolve tag slugs in a single batch query in TagFilter (#…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-12T12:25:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d28e688fc43aed6c8796d947fb1fbc3a21f0c1ac",
          "body": "…e (#4558)",
          "is_bot": false,
          "headline": "fix(tags): use forum description for meta description on tags homepag…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-11T19:53:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c33cae5f8cbd9fdf17c624fe2889462621fc74e",
          "body": "…icted-tag policy interference (#4539)\n\n* test(tags): add failing test for bypassTagCounts with restricted tags\n\nNon-admin users granted bypassTagCounts cannot exceed the primary tag\nlimit when the discussion is in a restricted tag, due to the catch-all\nDiscussionPolicy::can() intercepting the meta-\n[…]\nused `DiscussionPolicy::can()`\nto check for a non-existent per-tag variant (`tag{id}.discussion.bypassTagCounts`)\non restricted tags, always denying non-admin users even when they held the permission.",
          "is_bot": false,
          "headline": "[2.x] fix(tags): use hasPermission for bypassTagCounts to avoid restr…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-09T22:40:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06148aac8c26d1f938861d8d4317d75651c608b4",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit bd6eaecb05155051640514dad064d8425a73e5e3",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-03T11:55:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4353bb38557a68eb85dbd9e8f2406d2d7647863",
          "body": "* feat: add reset settings button to extension admin pages\n\nAdds a \"Reset Settings\" button alongside the save button on extension\nadmin pages. Clicking it opens a confirmation modal listing the setting\nkeys to be deleted, then calls a new DELETE /api/settings endpoint which\nremoves the rows from the\n[…]\noltip overflow for long unbreakable strings\n- Integration tests for DeleteSettingsController\n\n* fix(mentions): resolve TagMention TypeScript errors in build-typings\n\n* chore: apply prettier formatting",
          "is_bot": false,
          "headline": "[2.x] feat: add reset settings button to extension admin pages (#4522)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-03T11:51:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "92b1226f6edcbd57eecfeea59eb878c9f502b297",
          "body": "* perf: eliminate N+1 queries on discussion list (#4502)\n\nThe /api/discussions endpoint was firing ~144 queries for a page of 20\ndiscussions. This reduces it to ~33 queries regardless of how many\nunique users or liked posts appear in the response.\n\nFour sources of N+1 were fixed:\n\n**tags: replace co\n[…]\nerge calls with direct key assignment to preserve types.\n\n* style(likes): move flarum-tags conditional adjacent to related code and add comment\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] perf: eliminate N+1 queries on discussion list (#4508)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-31T22:28:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb63001082b4c4c4531e02d587a6adabe21c6587",
          "body": "…ons page (#4492)\n\nPinStickiedDiscussionsToTop clones the raw query builder to create a\nUNION for the unread-sticky path. If HideHiddenTagsFromAllDiscussionsPage\nran after the clone, the whereNotIn exclusion was never applied to the\n$sticky subquery, letting hidden-tag discussions leak through via t\n[…]\nefore the clone happens.\n- Defensively apply the whereNotIn to any existing union queries in\n  HideHiddenTagsFromAllDiscussionsPage, covering cases where ordering\n  cannot be guaranteed.\n\nCloses #4487",
          "is_bot": false,
          "headline": "fix(sticky): sticky discussions in hidden tags appear on all-discussi…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-22T19:43:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "78aadd1f274e52a6e3b98a930c544c9066a029b3",
          "body": "* prep for beta.8\n\n* chore: update changelog for beta.8 (#4480, #4481)",
          "is_bot": false,
          "headline": "[2.x] prep for beta.8 (#4478)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-21T22:45:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d84a7495f2dd995868f9d5a7a9e1cca5de775ece",
          "body": "… 3-section sidebar (#4446)\n\n* revert(admin): remove collapsible extension categories, restore 3-section sidebar\n\nThe collapsible category groups introduced in #4392 added too much\nfriction — everything collapsed by default, count badges read like\nnotification counts, and single-item categories (Inf\n[…]\nrestoring\n\"feature\" keeps the data consistent with the rendering logic.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] revert(admin): remove collapsible extension categories, restore…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-14T22:59:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c65f8d249b941fedfd11f5fafe2421ac15d4b161",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit ea4dd67e139a23450c6b827f594536be0197203a",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-08T14:40:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88ae99be6deb9aea416f3258939a1882c9d02574",
          "body": "…h improvements (#4393)\n\n* Dynamic loading tags list\n\n* Add loading height for tagged discussion posts\n\n* Add import for TagPost in forum.less\n\n* This looks better\n\n* Error handling\n\n* Apply yarn format to DiscussionTaggedPost.js\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: IanM <ian@morland.me>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] Fixed tags mutation shows [deleted] in some cases, together wit…",
          "author_name": "EdgeInfinity",
          "author_login": "edgeinfinity1",
          "committed_at": "2026-03-08T14:37:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e11bd9f3d7e9ff6ece6b15607d532a5d934d90c7",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 2fb580229c58b3b27de7c9dd5c26711a688f8491",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-07T23:12:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffdd90cc005236c788b35ed944eb00ebf6793efc",
          "body": "* feat: wip reusable hero component\n\n* refactor: adjust implementation of `DiscussionHero`\n\n* refactor: adjust implementation of `WelcomeHero`\n\n* refactor(tags): use new reusable hero\n\n* refactor(messages): use new reusable hero\n\n* chore: make style method public\n\n* chore: reorder, comments\n\n* chore: remove unused import, extend ComponentAttrs\n\n* refactor: simplify style definition expression\n\n* refactor: change return type of `Hero` `view`\n\n* docs: documentation candy",
          "is_bot": false,
          "headline": "[2.x] feat: create reusable `Hero` component (#4215)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2026-03-07T23:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b674f453c255866e52a1351723b1325f938d87d",
          "body": "…abandoned package support (#4392)\n\n* feat(admin): collapsible extension categories, health widget, abandoned package support\n\n- AdminNav: replace static category headers with collapsible groups; each group\n  shows a count badge, category icon, and expand/collapse chevron. Categories\n  default to co\n[…]\ning directly to an\nextension URL (e.g. /admin#/extension/flarum-flags).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] feat(admin): collapsible extension categories, health widget & …",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-02T06:56:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "76a8e87a29f0f9f543e3c02b6b895bc08af0b4c2",
          "body": "* fix(tags): authors can rename/hide own discussions in restricted tags\n\nFixes #3692. When a discussion is in a restricted tag, `can()` in tags'\nDiscussionPolicy would deny ALL abilities (including rename and hide) for\nusers who lack the explicit tag-specific permission — even when core\nDiscussionPo\n[…]\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n* Apply fixes from StyleCI\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x][tags] fix: tag restricted discussion own abilities (#4379)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-02-21T14:54:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f14d37b6b8d353369ec1c49b3095d62bdd1c66ec",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.7 (#4377)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-02-21T13:40:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7554afb88bf03d49a089af2d7af2196bc9f67d5f",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 6402e639bb64b06ecdc92ea69e6dacb3655504f7",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-02-15T21:46:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e440bc5e0a539152b10f85ab2d0e61b94466547",
          "body": "Bumps [webpack](https://github.com/webpack/webpack) from 5.95.0 to 5.104.1.\n- [Release notes](https://github.com/webpack/webpack/releases)\n- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/webpack/webpack/compare/v5.95.0...v5.104.1)\n\n---\nupdated-\n[…]\ndency-version: 5.104.1\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump webpack from 5.95.0 to 5.104.1 (#4354)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-02-15T21:42:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90ad5b075776da1d57e04b291f1a3ec0a6584add",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.6 (#4343)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-24T08:00:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a3181ec0154cdc168839d85614550a7b2711de9",
          "body": "* bump laravel - let's see what the tests do...\n\n* chore: upgrade phpstan to 2.x, larastan to 3.x\n\n* Apply fixes from StyleCI\n\n* fix: phpstan 8.4 property hooks compat\n\n* chore: phpstan fixes after rebase\n\n* fix: test expectation\n\n* fix: flag query pgsql\n\n* fix: pgsql flag query\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] feat: upgrade to Laravel 12 (#4268)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-14T08:05:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c05a146e5779c2f878cde1b6ed19304e55d72e0c",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.5 (#4313)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-12-20T10:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d6411edc870ba9c323fe00660a107f94319bd3c",
          "body": "* fix: tags page edit, preload fa kit\n\n* chore: update tests",
          "is_bot": false,
          "headline": "[2.x] fix: tags page edit icon position, preload fa kit (#4305)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-12-03T10:23:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36f3a17edebbefba49a4ff40902a5eb03f0076f4",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep beta.4 (#4291)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-11-25T08:50:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82aea0f7c89793c2a5cee9599b7a6f939bf03996",
          "body": "* test(tags): implement forum attribute tests\n\n* fix(tags): defer policy if min primary & secondary tags 0\n\n* style(tags): change formatting\n\n* Update extensions/tags/composer.json\n\n---------\n\nCo-authored-by: IanM <16573496+imorland@users.noreply.github.com>",
          "is_bot": false,
          "headline": "[2.x] fix(tags): defer policy if min primary & secondary tags 0 (#4279)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2025-11-24T21:39:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41ae86e5c50b5b89b0cff4b54604814f1eb7b69c",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 10e769988d6e553ee0e2a1cdb1bd4645f42763b9",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-11-02T11:44:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8facc557a0fe47f23114137b7134ae5a09b74d6",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 43f7a68f2b88f8e5f0a82bab581296f84cd2f8ef",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-27T05:25:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22189233746555bd5b0b10994353b756e852e54b",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 005706bdb4f7fd02ca100131ccc27d4053d099ee",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-18T21:13:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7818af3571234c022a3fdc856e6967eb96155c56",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 83318e51cfeed66f92b938c7aca481ac0fb14126",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-17T17:14:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbb356b5a327f77eb29a29685584ed4fa307a797",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare 2.0.0-beta.3",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-04-25T09:19:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50392118cb7d438b07802f7c19657cc2abc4b630",
          "body": null,
          "is_bot": false,
          "headline": "Sanitize page in `Tag` (#4170)",
          "author_name": "Robert Korulczyk",
          "author_login": "rob006",
          "committed_at": "2025-04-18T08:45:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d2582c03b0bd3679f247d349172221b4ed07bb8",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 0ca99dcba5f116e499072b3fcb9c8564a80b5a5c",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-02-22T09:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b349d5352772bf3deace05010e7b285c96345be8",
          "body": null,
          "is_bot": false,
          "headline": "feat(tags): improve extensibility of `TagHero` (#4198)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2025-02-22T09:49:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9558f4d3e2b4d30d08c6367c791b73873f30b7b8",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit f13dc058667540ce14f58eb25eef151ba14f524b",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-02-11T19:28:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6992b23af7692ab6fff3350efc0c5c58c1f1d8a",
          "body": null,
          "is_bot": false,
          "headline": "fix: resolve `a11y` warnings in Admin Frontend (#4184)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2025-02-11T19:24:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39da88d08379ee6bfcf3c713aa74c2f6f65cbe28",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 89ff98444640b13ffbd79faf91f1363dafbc5d6b",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-01-31T12:00:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d341f8b798f85a228800ecd391f5f4862c4d60c",
          "body": "* fix: messages inconsistencies\r\n\r\n* fix\r\n\r\n* chore: message at the page\r\n\r\n* fix: permission grid styling broken\r\n\r\n* fix",
          "is_bot": false,
          "headline": "fix: messages inconsistencies (#4174)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-31T11:57:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b28a2a5035825f24879a45562f73857d21376c38",
          "body": null,
          "is_bot": false,
          "headline": "chore: v2.0.0-beta.2",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-17T08:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e8ce26532ff5a9e2e9e71d89d94172e387de08d",
          "body": null,
          "is_bot": false,
          "headline": "chore: extensibility improvements",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-12T12:02:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11ca980e0c4bdbbbcc9cf4e6d18ceacbffc69820",
          "body": null,
          "is_bot": false,
          "headline": "fix: tag selection icon alignment (#4153)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-03T16:06:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e70add2bbd083145a6604ed15b4a8bfd117fac79",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare `2.0.0-beta.1`",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-12-07T08:50:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3106cb684e7533d9414742b330cc689604c534ef",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 33a72f5c14c00671eedcee5d64a0edf5d6db3441",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-11-29T09:57:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a672d18823da4e031f051c533e3de7d0e53041c",
          "body": null,
          "is_bot": false,
          "headline": "fix(tags): wrong tag input width with CJK chars (#4127)",
          "author_name": "雨",
          "author_login": "YUCLing",
          "committed_at": "2024-11-29T09:55:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c1fb0ff041c9bdbd476b205e4ada4d5b4e2d36e",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit dd45d75cd8b9c1789b093562eb312db1ad333c9c",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-11-09T10:10:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f200394b45b0ebaed4a71135cc7bd9a2d908681c",
          "body": "* test: php 8.4\r\n\r\n* fix: php 8.4 deprecations\r\n\r\n* fix: make argument required\r\n\r\n* chore: review changes",
          "is_bot": false,
          "headline": "test: php 8.4 (#4103)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-11-08T16:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b33d99b3d9956c6733e2c3684c87aa68c43492e9",
          "body": null,
          "is_bot": false,
          "headline": "chore: update tsconfig version",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-25T08:39:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d8b5d755ca6d5707b62586b819019d6cc1b5ab9",
          "body": null,
          "is_bot": false,
          "headline": "test: prevent false negatives",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-24T19:09:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0852db27433de959af99e44d9a669ccef909e2a7",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 3b66925a666ad1f5e3e0ba2c1513bd501d6470e2",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-24T17:49:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "701ed324f147e2172fdfd0931500f84211f03c8a",
          "body": null,
          "is_bot": false,
          "headline": "test: prevent false negatives",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-21T18:16:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1e585b56c946bb8c238dfd4d34c6130cd653662",
          "body": null,
          "is_bot": false,
          "headline": "test: prevent false negatives",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-21T15:09:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7552ef852beda2cfe1789a3663e8b4077bcaf282",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix typos (#4021)",
          "author_name": "Viktor Szépe",
          "author_login": "szepeviktor",
          "committed_at": "2024-10-21T15:00:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34dd9826d0b4a89d0be6e69d4c8a354728f6f677",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b9b52d85a77dffb1423211ad4a9ce8a6a662e749",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-21T10:52:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf694c1af49609e163a19e34381d860056bbd3e7",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a3333320d71863b2596e0886a6eb6a81a9db61ad",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-19T19:34:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "764aece4cc4f57d053c907bea22d3ad6ee708b9a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 6f823731caa95439526ab7d8ec7dba13cd98e91b",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-19T18:12:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70fd7c813289b49bf6940f4695c2eaf24c689598",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a47bd2d45730f004e739d91c290f22330ab93dc4",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-19T17:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a5544525b6b7b71c3b41d8ba192c9d6ab899630",
          "body": null,
          "is_bot": false,
          "headline": "feat: extension list UI (#4066)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-16T17:12:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d52bd4dd34073beaadad9a423918b10f43e19ae",
          "body": "…067)",
          "is_bot": false,
          "headline": "refactor: remove listing of posts in the show discussion endpoint (#4…",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-16T17:02:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65d96a9bf614cf737c62ed9f84292ff096705e52",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 1a12209fdcde19e3cdbbb3ec483ca29793057991",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-29T08:17:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc403b2e24c521e65827d54501883d6f0810ea97",
          "body": null,
          "is_bot": false,
          "headline": "chore: update FontAwesome v6 icon search link (#4036)",
          "author_name": "Ngô Quốc Đạt",
          "author_login": null,
          "committed_at": "2024-09-29T08:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd7535fb09d09e2f12c7f9aa80b2c9c7ce456257",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 257be2b9db6f5365faa017bd9cc4a0e870efb449",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T14:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa8176a809657416ce8ed2ad831c7a82dd5c653f",
          "body": null,
          "is_bot": false,
          "headline": "test: add frontend tests (#3991)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T14:47:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07bbd64e7d5a7644dfa9ce3649e39757d0fae491",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit feca3d0da6c7e6780a42c6e34b474c7a4268a704",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T13:00:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e778a232358c11cae3e3390d8d3aac3e6fc964e4",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5ff66fd033ad64efa7ae16575ec868eed6cabadf",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T12:41:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cd6b06207d7f2861a6413c5fc9021822dfc12de",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit e5389acd6e85dc392676609d9a895f3a6e368e26",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T10:42:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86da69ff60c26b4f02bfb6a1a7981702e77844a5",
          "body": null,
          "is_bot": false,
          "headline": "fix: js errors",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T10:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f68e2c2ee37d6a21b03e5633cb434fd3018011f4",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b74ecbfacf684eb0dc70e708c4763d36ebd93405",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T10:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ddd58bd983c036328ac8ddd107723a0b2ea8cd76",
          "body": "* feat: private messages",
          "is_bot": false,
          "headline": "feat: messages extension (#4028)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T10:12:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e96b729aa711c0d6448198227459d2ed2084de57",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5cea3d3b9bc4c5c6ae751bc4920a37bf032931af",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T08:38:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45215db165626cbf00e6346058e9268668f0772a",
          "body": null,
          "is_bot": false,
          "headline": "feat: admin search UI (#4022)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T08:35:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48b0ebc7a4cabaaa644f8da4adcaf094297d6be2",
          "body": null,
          "is_bot": false,
          "headline": "fix: tag state loaded for wrong user (#4009)",
          "author_name": "Rafał Całka",
          "author_login": "rafaucau",
          "committed_at": "2024-09-20T07:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "202fb36efa8f6d404ee398eca0bdac9520597a24",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 2204157ac04daaa09fe9a15bcac48d9e21c32d9c",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-19T21:38:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbd1f4a9a92d7774e50eb5977b074d172b21aaff",
          "body": null,
          "is_bot": false,
          "headline": "fix(a11y): convert empty links to buttons (#3926)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-19T21:35:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce5d8614a83ad7a90abf671e53cbb039beca88a3",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b9037df05c456cec78fa4509dd06c45dc75befc4",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-11T10:33:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c20a640b14b0ccbc0e4c31b14aab441194a58353",
          "body": "* chore: phpunit 10\r\n\r\n* chore: config\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* chore: phpunit 11 (php 8.2 minimum requirement)\r\n\r\n* feat: laravel 11\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* feat: carbon v3\r\n\r\n* fixes",
          "is_bot": false,
          "headline": "chore: update dependencies (#4012)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-08-06T15:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2400544827e020e5f199c6b44de731b77269357f",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 770f9370af178e08da4e8ca2ebb9407f184e7de2",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-08-02T11:52:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0f4e08773acfce59c8132ba24e140d7daabe8e1",
          "body": null,
          "is_bot": false,
          "headline": "fix: 2.0 bugs (#4011)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-08-02T11:49:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 50,
      "commits_last_year": 53,
      "latest_release_at": "2026-07-08T15:55:01Z",
      "latest_release_tag": "v2.0.0-rc.5",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 25,
      "days_since_latest_release": 19,
      "mean_days_between_releases": 20.2
    },
    "community": {
      "has_readme": false,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "flarum/tags",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "discussion"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/flarum/tags",
          "is_deprecated": false,
          "latest_version": "v2.0.0-rc.5",
          "repository_url": "https://github.com/flarum/tags",
          "versions_count": 53,
          "total_downloads": 789950,
          "dependents_count": 121,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 22617,
          "first_published_at": null,
          "latest_published_at": "2026-07-08T15:08:06Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 20
        }
      ]
    },
    "popularity": {
      "forks": 80,
      "stars": 38,
      "watchers": 10,
      "fork_history": {
        "days": [
          {
            "date": "2015-09-03",
            "count": 1
          },
          {
            "date": "2015-09-23",
            "count": 1
          },
          {
            "date": "2015-11-08",
            "count": 1
          },
          {
            "date": "2016-01-25",
            "count": 1
          },
          {
            "date": "2016-02-10",
            "count": 1
          },
          {
            "date": "2016-08-26",
            "count": 1
          },
          {
            "date": "2016-10-01",
            "count": 1
          },
          {
            "date": "2016-12-13",
            "count": 1
          },
          {
            "date": "2017-02-12",
            "count": 1
          },
          {
            "date": "2017-02-20",
            "count": 1
          },
          {
            "date": "2017-04-06",
            "count": 1
          },
          {
            "date": "2017-06-28",
            "count": 1
          },
          {
            "date": "2017-11-06",
            "count": 1
          },
          {
            "date": "2018-02-01",
            "count": 1
          },
          {
            "date": "2018-03-13",
            "count": 1
          },
          {
            "date": "2018-05-07",
            "count": 1
          },
          {
            "date": "2018-05-20",
            "count": 1
          },
          {
            "date": "2018-05-24",
            "count": 1
          },
          {
            "date": "2018-07-15",
            "count": 1
          },
          {
            "date": "2018-09-20",
            "count": 1
          },
          {
            "date": "2018-11-21",
            "count": 1
          },
          {
            "date": "2018-11-27",
            "count": 1
          },
          {
            "date": "2018-12-08",
            "count": 1
          },
          {
            "date": "2018-12-11",
            "count": 1
          },
          {
            "date": "2019-01-21",
            "count": 1
          },
          {
            "date": "2019-05-09",
            "count": 1
          },
          {
            "date": "2019-05-25",
            "count": 1
          },
          {
            "date": "2019-06-14",
            "count": 1
          },
          {
            "date": "2019-07-16",
            "count": 1
          },
          {
            "date": "2019-08-19",
            "count": 1
          },
          {
            "date": "2019-09-03",
            "count": 1
          },
          {
            "date": "2019-12-03",
            "count": 1
          },
          {
            "date": "2019-12-05",
            "count": 1
          },
          {
            "date": "2019-12-09",
            "count": 1
          },
          {
            "date": "2020-01-04",
            "count": 1
          },
          {
            "date": "2020-01-31",
            "count": 1
          },
          {
            "date": "2020-02-13",
            "count": 1
          },
          {
            "date": "2020-02-19",
            "count": 1
          },
          {
            "date": "2020-03-02",
            "count": 1
          },
          {
            "date": "2020-03-11",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-17",
            "count": 1
          },
          {
            "date": "2020-04-18",
            "count": 1
          },
          {
            "date": "2020-04-19",
            "count": 1
          },
          {
            "date": "2020-04-22",
            "count": 1
          },
          {
            "date": "2020-05-12",
            "count": 1
          },
          {
            "date": "2020-05-21",
            "count": 1
          },
          {
            "date": "2020-05-22",
            "count": 1
          },
          {
            "date": "2020-06-27",
            "count": 1
          },
          {
            "date": "2020-07-26",
            "count": 1
          },
          {
            "date": "2020-08-06",
            "count": 1
          },
          {
            "date": "2020-08-08",
            "count": 1
          },
          {
            "date": "2020-09-20",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-10-08",
            "count": 1
          },
          {
            "date": "2020-10-13",
            "count": 1
          },
          {
            "date": "2020-10-27",
            "count": 1
          },
          {
            "date": "2020-11-12",
            "count": 1
          },
          {
            "date": "2020-11-28",
            "count": 1
          },
          {
            "date": "2021-01-24",
            "count": 1
          },
          {
            "date": "2021-02-02",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 1
          },
          {
            "date": "2021-04-27",
            "count": 1
          },
          {
            "date": "2021-05-05",
            "count": 1
          },
          {
            "date": "2021-08-02",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-09-22",
            "count": 1
          },
          {
            "date": "2021-12-03",
            "count": 1
          },
          {
            "date": "2021-12-15",
            "count": 1
          },
          {
            "date": "2022-01-28",
            "count": 1
          },
          {
            "date": "2022-01-31",
            "count": 1
          },
          {
            "date": "2022-09-27",
            "count": 1
          },
          {
            "date": "2024-02-29",
            "count": 1
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-05-06",
            "count": 1
          },
          {
            "date": "2025-05-14",
            "count": 1
          },
          {
            "date": "2025-10-24",
            "count": 1
          },
          {
            "date": "2026-04-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 79,
        "total_forks": 80
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "js/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 17325,
      "source_files_sampled": 151,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json",
        "js/package.json"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 12,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "packagist"
      ],
      "dependencies": [
        {
          "name": "flarum/core",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.0.0-rc.5"
        },
        {
          "name": "sortablejs",
          "manifest": "js/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.14.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "sortablejs",
            "direct": true,
            "version": "^1.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "flarum/core",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum-tsconfig",
            "direct": false,
            "version": "^2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flarum-webpack-config",
            "direct": false,
            "version": "^3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "^2.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "^4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-coverage-report",
            "direct": false,
            "version": "^0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack",
            "direct": false,
            "version": "^5.104.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-cli",
            "direct": false,
            "version": "^4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "flarum/audit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/suspend",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/testing",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 12,
        "direct_count": 2,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 110,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 36
      },
      "bus_factor": 2,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "tobyzerner",
          "commits": 258,
          "avatar_url": "https://avatars.githubusercontent.com/u/128862?v=4"
        },
        {
          "type": "User",
          "login": "flarum-bot",
          "commits": 145,
          "avatar_url": "https://avatars.githubusercontent.com/u/39334649?v=4"
        },
        {
          "type": "User",
          "login": "SychO9",
          "commits": 98,
          "avatar_url": "https://avatars.githubusercontent.com/u/20267363?v=4"
        },
        {
          "type": "User",
          "login": "askvortsov1",
          "commits": 56,
          "avatar_url": "https://avatars.githubusercontent.com/u/38059171?v=4"
        },
        {
          "type": "User",
          "login": "franzliedke",
          "commits": 53,
          "avatar_url": "https://avatars.githubusercontent.com/u/249125?v=4"
        },
        {
          "type": "User",
          "login": "luceos",
          "commits": 45,
          "avatar_url": "https://avatars.githubusercontent.com/u/504687?v=4"
        },
        {
          "type": "User",
          "login": "imorland",
          "commits": 39,
          "avatar_url": "https://avatars.githubusercontent.com/u/16573496?v=4"
        },
        {
          "type": "User",
          "login": "davwheat",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/7406822?v=4"
        },
        {
          "type": "User",
          "login": "dsevillamartin",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/6401250?v=4"
        },
        {
          "type": "User",
          "login": "clarkwinkelmann",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/5264300?v=4"
        }
      ],
      "contributors_sampled": 44,
      "top_contributor_share": 0.33
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 38 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": "22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "1dd4ac109c4d46255eaf6b9d9065b967a78db95a",
        "ran_at": "2026-07-28T15:16:27Z",
        "aggregate_score": 5.9,
        "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-28T13:27:15Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2022-03-10T20:06:50Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/flarum/tags",
    "host": "github.com",
    "name": "tags",
    "owner": "flarum"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 61,
      "inputs": {
        "security": 59,
        "vitality": 87,
        "community": 55,
        "governance": 72,
        "engineering": 26
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "commits_last_year": 53,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 25
            },
            "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": "25/52 weeks with commits",
                "points": 17.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 25
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "53 commits in the last year",
                "points": 15.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 50,
              "latest_release_tag": "v2.0.0-rc.5",
              "releases_from_tags": false,
              "days_since_latest_release": 19,
              "mean_days_between_releases": 20.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "50 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 50
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 19 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~20.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 20.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 55,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "forks": 80,
              "stars": 38,
              "watchers": 10,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "38 stars",
                "points": 25.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "80 forks",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 80
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "10 watchers",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "has_readme": false,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "packages": [
                "flarum/tags"
              ],
              "dependents": 121,
              "ecosystems": "packagist",
              "total_downloads": 789950,
              "monthly_downloads": 22617
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "22,617 downloads/month across packagist",
                "points": 58.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 22617,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "121 packages depend on it",
                "points": 13.9,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 121
                    }
                  }
                ],
                "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": 72,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 44,
              "top_contributor_share": 0.33
            },
            "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 33% of commits",
                "points": 15.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 33
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "44 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 44
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 38 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 54,
            "inputs": {
              "merged_prs": 110,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 36
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "110/146 decided PRs merged",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 110,
                      "decided": 146
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "followers": 798,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "flarum",
              "public_repos": 53,
              "account_age_days": 4688
            },
            "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": "798 followers of flarum",
                "points": 20.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 798,
                      "login": "flarum"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "53 public repos, account ~12 yr old",
                "points": 24.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 53
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "flarum/tags"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 20
            },
            "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 20 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 20
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "53 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "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": "critical",
        "name": "Engineering Quality",
        "value": 26,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "critical",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "topics": [
                "flarum",
                "hacktoberfest"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": false,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 59,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 5.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 38 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": "22 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 25
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 54,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "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": 54,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "js/tsconfig.json"
              ],
              "agent_commit_share": 0.04,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "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": "js/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "js/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "4 of the last 100 commits agent-authored or agent-credited",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 4,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "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": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 17325,
              "source_files_sampled": 151,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP with type-check config (js/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "js/tsconfig.json",
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/151 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 151,
                      "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",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T15:16:44.809379Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/f/flarum/tags.svg",
  "full_name": "flarum/tags",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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