公开记录
软件健康报告模式 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年5月在 GitHub 上查看 ↗

flarum/tags 的健康指数为 100 分中的 61 分,处于「中等」区间。 其得分最高的类别是Vitality(87/100),最低的是Engineering Quality(26/100)。 最近一次更新在今天。 近期的大部分工作由 2 位贡献者完成。

61
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

61
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Flarum组织
798 关注者53 个公开仓库始于 2013年9月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
Packagistflarum/tagsv2.0.0-rc.522,6175320 天前discussion

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

87优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
17.3/36提交节奏 — 52 周中有 25 周有提交
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

发布纪律

100优秀
评分方式
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%

流行度与采用

46存在风险
评分方式
25.4/60星标 — 38 个星标
15.8/25复刻 — 80 个复刻
5.3/15关注者 — 10 位关注者
所用输入
forks80
stars38
watchers10
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

52中等
评分方式
0/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
58.1/80月度下载量 — packagist 合计每月 22,617 次下载
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议题解决 — 没有议题或无数据
28.8/38.3PR 接受 — 已裁定的 PR 中 110/146 已合并
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
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
20.9/25所有者影响力 — flarum 有 798 位关注者
24.6/25既往记录 — 53 个公开仓库,账户约 12 年
所用输入
followers798
owner_typeOrganization
is_verified
owner_loginflarum
public_repos53
account_age_days4,688
评分方式
25/25已发布且可解析 — packagist 上有 1 个软件包
35/35发布时效 — 最近一次发布于 20 天前
20/20版本历史 — 53 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesflarum/tags
ecosystemspackagist
any_deprecated
min_days_since_publish20

工程质量

基础的工程与文档实践是否到位?

26危急 · 占总体的 20%

工程实践

30存在风险
评分方式
0/24CI 工作流
24/24存在测试
0/16Linter 配置
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。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 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/11Lint / 格式化配置
11/11静态类型检查 — js/tsconfig.json
0/10可复现环境
8/10已体现的代理实践 — 最近 100 次提交中有 4 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
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可控的文件大小 — 采样的 151 个源文件中有 0 个超过 60KB
所用输入
primary_languagePHP
largest_source_bytes17,325
source_files_sampled151
oversized_source_files0

关键数据

38GitHub 星标
44贡献者
53最近 12 个月提交数
0距最近推送天数
50发布版本数
2巴士系数(bus factor)
0开放议题
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

更多细节

Star 与 Fork 历史 0 ★ / 80 ⇿
0Star
80Fork
44发布

每颗 star 和每个 fork 的添加时间,来自 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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.