公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-27 20:19 UTC

builtbyberry / laravel-swarm

Multi-agent swarm orchestration for Laravel, built on Laravel AI.

PHPMIT★ 32 星标⑂ 1 复刻始于 2026年4月在 GitHub 上查看 ↗

builtbyberry/laravel-swarm 的健康指数为 100 分中的 65 分,处于「中等」区间。 其得分最高的类别是Vitality(84/100),最低的是Security(50/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

65
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

0 关注者19 个公开仓库始于 2023年8月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
Packagistbuiltbyberry/laravel-swarmv0.23.02,310546 天前laravelagentsaiorchestrationswarm

按类别列示的指标

活力

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

84良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
9.7/36提交节奏 — 52 周中有 14 周有提交
18/18提交量 — 最近一年 926 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year926
human_commit_share1
days_since_last_push0
active_weeks_last_year14

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 36 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 1.9 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count36
latest_release_tagv0.23.0
releases_from_tags
days_since_latest_release6
mean_days_between_releases1.9
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

54中等 · 占总体的 18%
评分方式
24.2/60星标 — 32 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars32
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
13.5/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
评分方式
44.9/80月度下载量 — packagist 合计每月 2,310 次下载
4.7/20注册表被依赖数 — 4 个软件包依赖它
所用输入
packagesbuiltbyberry/laravel-swarm
dependents4
ecosystemspackagist
total_downloads2,891
monthly_downloads2,310

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

55中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
43.5/46.8议题解决 — 93% 的议题已关闭
36.6/38.3PR 接受 — 已裁定的 PR 中 247/258 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/9 approved changesets -- score normalized to 0
所用输入
merged_prs247
open_issues13
closed_issues175
issue_closed_ratio0.931
closed_unmerged_prs11
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — builtbyberry 有 0 位关注者
15.3/25既往记录 — 19 个公开仓库,账户约 2 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginbuiltbyberry
public_repos19
account_age_days1,071
评分方式
25/25已发布且可解析 — packagist 上有 1 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 54 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesbuiltbyberry/laravel-swarm
ecosystemspackagist
any_deprecated
min_days_since_publish6

工程质量

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

80良好 · 占总体的 20%

工程实践

90优秀
评分方式
24/24CI 工作流 — 6 个工作流
24/24存在测试
16/16Linter 配置 — phpstan.neon
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

65中等
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

50中等 · 占总体的 16%

安全态势

50中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/9 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
1/5SAST — SAST tool is not run on all commits -- score normalized to 2
2/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
已排除计分(无数据或不适用):branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

59中等 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes19,794
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — phpstan.neon
0/11静态类型检查
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 18 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.18
toolchain_manifests
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
0/45可类型检查的代码 — PHP,未配置类型检查
54.7/55可控的文件大小 — 采样的 821 个源文件中有 5 个超过 60KB
所用输入
primary_languagePHP
largest_source_bytes138,611
source_files_sampled821
oversized_source_files5

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

32GitHub 星标
1贡献者
926最近 12 个月提交数
0距最近推送天数
36发布版本数
1巴士系数(bus factor)
13开放议题
Packagist软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

OpenSSF Scorecard 5.0 / 10
5.0综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-27 20:19 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests9 out of 9 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/9 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
不适用Pinned-Dependenciesno dependencies found
2SASTSAST tool is not run on all commits -- score normalized to 2
4Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
不适用Token-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 14
注册表软件包版本约束清单文件
Packagistilluminate/bus^13.0composer.json
Packagistilluminate/cache^13.0composer.json
Packagistilluminate/concurrency^13.0composer.json
Packagistilluminate/console^13.0composer.json
Packagistilluminate/container^13.0composer.json
Packagistilluminate/contracts^13.0composer.json
Packagistilluminate/database^13.0composer.json
Packagistilluminate/events^13.0composer.json
Packagistilluminate/filesystem^13.0composer.json
Packagistilluminate/json-schema^13.16composer.json
Packagistilluminate/queue^13.0composer.json
Packagistilluminate/support^13.0composer.json
Packagistilluminate/view^13.0composer.json
Packagistlaravel/ai^0.9composer.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 3962,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "PHP": 4338884,
        "Blade": 4136,
        "Shell": 4404
      },
      "pushed_at": "2026-07-27T20:15:22Z",
      "created_at": "2026-04-22T17:59:30Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T22:35:50Z",
      "description": "Multi-agent swarm orchestration for Laravel, built on Laravel AI.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": "https://builtbyberry.com",
      "name": "Built by Berry",
      "type": "Organization",
      "login": "builtbyberry",
      "company": null,
      "location": "United States of America",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/142772486?v=4",
      "created_at": "2023-08-21T05:12:33Z",
      "is_verified": null,
      "public_repos": 19,
      "account_age_days": 1071
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-07-20T22:39:09Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-07-19T13:15:22Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-07-16T19:45:29Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-13T20:26:08Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-07-11T17:22:37Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-08T15:17:57Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-07-07T20:42:25Z"
        },
        {
          "tag": "v0.17.4",
          "kind": "patch",
          "published_at": "2026-07-07T00:54:01Z"
        },
        {
          "tag": "v0.17.3",
          "kind": "patch",
          "published_at": "2026-07-06T22:24:57Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-07-03T16:35:56Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-07-02T15:52:42Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-07-01T21:33:23Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-01T21:35:57Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-06-24T05:13:56Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-06-23T19:58:45Z"
        },
        {
          "tag": "v0.12.3",
          "kind": "patch",
          "published_at": "2026-06-22T01:44:43Z"
        },
        {
          "tag": "v0.12.2",
          "kind": "patch",
          "published_at": "2026-06-19T12:33:15Z"
        },
        {
          "tag": "v0.12.1",
          "kind": "patch",
          "published_at": "2026-06-18T05:31:37Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-06-18T05:31:07Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-06-18T05:30:24Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:00:46Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-06-04T17:00:45Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:00:43Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:00:42Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:00:41Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:00:39Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-05-19T19:18:48Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-05-19T03:17:37Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-05-19T03:06:49Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-05-19T02:55:40Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-19T02:03:07Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-05-19T02:03:06Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-05-19T02:03:06Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-05-15T21:39:10Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-05-19T12:08:54Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-05-12T22:29:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e3ca8b30af3b50592b2f15e1cc1130ecddad66fb",
          "body": "release: v0.23.0 — laravel/ai drop-in compatibility, plus documentation, dependency and CI corrections",
          "is_bot": false,
          "headline": "Merge pull request #440 from builtbyberry/release/v0.23.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T22:35:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f795ac39eec7e7ddde423ea6cbc63ed616a03a5",
          "body": "Marks the section released as of 2026-07-20. No content change.",
          "is_bot": false,
          "headline": "docs(changelog): stamp v0.23.0 release date",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T22:22:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "479f436e4a8d5104f62c2a31e394a9b77ece8263",
          "body": "Wrap-time corrections from the v0.23.0 readiness pass. This project is tag-mode,\nso there is no release-wrap skill to do these; they are applied by hand.\n\nStop telling applications to loosen their own minimum-stability. README,\nUPGRADING, getting-started and advanced-setup all instructed consumers t\n[…]\nnd, because DocumentedArtisanInvocationTest scans this file and\ncorrectly rejected the first wording -- the guard working as intended.\n\nSuite 1988 passed, pint clean, composer validate --strict clean.",
          "is_bot": false,
          "headline": "docs(release): correct the v0.23.0 release notes and install guidance",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T22:16:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "954eb365b56de2d7e4193339224535fb1808822b",
          "body": "…roperty\"\n\nThis reverts #432 in full. The change was cosmetic and it broke public API.\n\n`readonly class` and per-property `readonly` are semantically identical for\nthese 39 classes -- every property was already readonly. The class-level form\nonly adds two restrictions: non-readonly subclasses become\n[…]\nward, docs -- independently, all four). Reverting\nrather than documenting the break keeps the v0.20 decision intact at zero\nconsumer cost, which a purely stylistic change does not justify overturning.",
          "is_bot": false,
          "headline": "Revert \"chore(events): declare value classes readonly once, not per p…",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T22:04:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e64ed2b26c0cf3c4bc880d0f9213d7d10ecb329a",
          "body": "…-consistency\n\nchore(events): declare value classes readonly once, not per property (#432)",
          "is_bot": false,
          "headline": "Merge pull request #456 from builtbyberry/chore/0.23.0-readonly-class…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T21:47:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "245d66fbeb70d4b5e0bfb4dd9eebfb6998f4a530",
          "body": "39 event and DTO classes across src/Events, src/Responses and src/Support\ndeclared every constructor-promoted property readonly individually. They now\ncarry the modifier on the class, so immutability is stated once and cannot be\nsilently forgotten when someone adds a property later. 13 sibling files\n[…]\nlizesModels or ShouldQueue, and PHP's unserializer treats property writes\nas initialization, so consumer queued listeners are unaffected.\n\nSuite 1988 passed, pint clean, phpstan L7 clean.\n\nCloses #432",
          "is_bot": false,
          "headline": "chore(events): declare value classes readonly once, not per property",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T21:38:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e0b494a7c4cf3a2f492a2d6b46f73e1bebcc06b",
          "body": "…le-instruction\n\ndocs: replace the nonexistent make:swarm:swarm --single instruction (#439)",
          "is_bot": false,
          "headline": "Merge pull request #453 from builtbyberry/docs/0.23.0-make-swarm-sing…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T14:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72325b0f9a2d69b359f9dc64f654453b0f01a6f0",
          "body": "… introduced\n\nThe commit that fixed the first review round was itself unreviewed. Running both\nlenses over it found eight maintainability and seven QA findings. Four of the\nmaintainability ones were false statements in my own comments, and one QA\nfinding is a coverage regression I caused while fixin\n[…]\n a bad flag, a bare\nunknown make: command, and dropping resources/ from the scan were all silent\nbefore and all fail loudly now, naming file and line.\n\nSuite 1988 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(docs): close the delta-review findings, including a regression I…",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T14:40:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb77870c75fe9eb63d9e619e88fbb2eb798e9332",
          "body": "…uard\n\nBoth lenses attacked the new guard rather than the doc corrections, which is\nwhere the value was -- three medium holes, each verified by mutation.\n\nQ2/M1 -- the `artisan` anchor on swarm:* left over half the repo's documented\noption usage unguarded. 106 bare `swarm:* --flag` mentions were out\n[…]\nment instruction is\nindependently covered by MakeSwarmSwarmCommandTest plus four single-agent swarm\nfixtures driven through queue()/dispatchDurable().\n\nSuite 1987 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(docs): close the coverage holes the change review found in the g…",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T11:57:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6c9fd0b1373886a6ba348a9fef1b152f3731ffb",
          "body": "Eight sites told readers to author a one-agent swarm with\n`php artisan make:swarm:swarm --single`. That command has no --single option\nand errors out. The flag exists only on the deprecated make:swarm alias, and\nthere it scaffolds an AGENT, not the swarm class every one of those sites was\npointing a\n[…]\nulse are\nallowlisted with reasons: the first two are scaffolded into the consuming app,\nthe third ships with the Pulse companion package.\n\nSuite 1987 passed, pint clean, phpstan L7 clean.\n\nCloses #439",
          "is_bot": false,
          "headline": "docs: replace the nonexistent make:swarm:swarm --single instruction",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T11:44:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f37a0b2778f663bc16d8046a7edd6646a6a1ce29",
          "body": "…ropin\n\nfix(contracts): accept plain laravel/ai agents at every Swarm surface (#438)",
          "is_bot": false,
          "headline": "Merge pull request #448 from builtbyberry/fix/0.23.0-agent-contract-d…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T05:00:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7a9d5a85a154cc5e2677b8df17e34e9237e3474",
          "body": "…its output\n\nCloses Q4, the last open finding on this component. The test asserted only\nthe final output string, which cannot distinguish 'the planner parsed the\nvendor coordinator's structured plan and routed to writer_node' from 'the\nwriter happened to run' -- and the planner is precisely the vend\n[…]\nePlanner::assertCoordinatorCanPlan is where it fails pre-fix.\n\nNow asserts metadata['executed_node_ids'], matching the idiom in\nHierarchicalSwarmTest.\n\nSuite 1985 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(contracts): assert the hierarchical route was planned, not just …",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T04:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fddd700c2b5f3dc026499784922ab93ce8cac003",
          "body": "The two commits written to satisfy the first review pass were never themselves\nreviewed. Running the same two lenses over them found eight maintainability and\nthree QA findings; this closes them.\n\nThe two that mattered:\n\nDM4 -- another false docblock claim of mine. VendorOnlySequentialSwarm asserted\n[…]\nmits one event and dies. Now asserts the terminal swarm_stream_end, one\nswarm_step_end per agent, and that the vendor agent's text reached the stream.\n\nSuite 1985 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(contracts): address the delta review of the review-fix commits",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T04:34:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b90989e48ce899b17782723285d8ad9d29f7b038",
          "body": "Closes the Q5 gap: the stub fix in e48d9bb corrected 11 files but nothing\nasserted it, so the same drift could return unnoticed. It is invisible to the\nrest of the suite by construction -- it only bites in a consumer's project,\nwhere a scaffolded swarm's docblock contradicts the release that made pl\n[…]\npaths, which a generator test would miss.\n\nVerified by reintroducing the regression into stubs/swarm.stub: both tests fail\nand name the offending file. Suite 1985 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(stubs): guard the shipped stubs against the deprecated agent marker",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T04:02:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11aead4d212abc4d230531c3d0aed51547e502b1",
          "body": "The QA lens disproved a claim I had written into the test file's docblock: that\nthe durable and streaming gates 'need a real provider or a heavier harness to\nfake'. They do not. Both are reachable with the harness patterns already in\ntests/Feature/DurableSwarmTest.php and StreamingSwarmTest.php, and\n[…]\nd against the pre-fix tree: 8 of 10 fail, including all three new ones.\nThe 2 that pass in both directions are deliberate guards -- fixture-rot and BC.\nSuite 1983 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "test(contracts): cover the durable, streaming and trait paths",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T03:30:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e48d9bb013db9a4bcc8e3d0c975e96525ab9802a",
          "body": "M1 (medium) -- the generator stubs and seven shipped example swarms still\ndeclared @return array<int, \\BuiltByBerry\\LaravelSwarm\\Contracts\\Agent>. That\nwas the worst drift in the change: make:swarm:swarm would have generated a class\nwhose docblock contradicts this release, so a consumer putting a pl\n[…]\nhe memory chokepoint.\n\nM5 (low) -- the test file now states what it does NOT cover (the durable and\nstreaming gates), so it is not read as exhaustive.\n\nSuite 1980 passed, pint clean, phpstan L7 clean.",
          "is_bot": false,
          "headline": "fix(contracts): address maintainability review findings",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T03:23:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72e5599c530e2b3166e2b0d8f4fdb5fe1b1dddab",
          "body": "Contracts\\Agent extends Laravel\\Ai\\Contracts\\Agent, so a class implementing\nonly the vendor contract was never an instance of the swarm marker. Every\npublic entry point and runner gate type-hinted the marker, so plain\nlaravel/ai agents were rejected outright -- contradicting the documented\ndrop-in b\n[…]\n policy at\nall. Documented in UPGRADING.md with the one-line fix.\n\nAdds six regression tests; four fail without this change. Nothing previously\nasserted this boundary in either direction.\n\nCloses #438",
          "is_bot": false,
          "headline": "fix(contracts): accept plain laravel/ai agents at every Swarm surface",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T03:16:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac52833e21121c94de7d76f89d25cbe1c6c3ec21",
          "body": "…s-entry\n\ndocs(changelog): backfill v0.23.0 entry for the AGENTS.md drift fix (#444)",
          "is_bot": false,
          "headline": "Merge pull request #447 from builtbyberry/docs/0.23.0-changelog-agent…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T02:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59efdcb8ddc851acc5b5f1c7ee4818306b723755",
          "body": "…se-green\n\nfix(ci): make the nightly lane actually test laravel/framework dev (#441)",
          "is_bot": false,
          "headline": "Merge pull request #446 from builtbyberry/fix/0.23.0-nightly-lane-fal…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T02:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd03802e57c89ad0959c99c679295db67f67c497",
          "body": "The AGENTS.md correction (#444) merged in #445 without a changelog entry.\nDefinition of Done requires one per PR, so this backfills it.",
          "is_bot": false,
          "headline": "docs(changelog): backfill v0.23.0 entry for the AGENTS.md drift fix",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T02:04:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80a288da6ef1ea1e69964c876fecb39626c00892",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): add v0.23.0 entry for the nightly CI lane fix",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T02:03:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7eb2a564807e664f2dbc8c8a17b9e4269802bc8",
          "body": "docs(agents): fix AGENTS.md drift — dead review-skill pointer, ambiguous branch rule, stale duplicated sections (#444)",
          "is_bot": false,
          "headline": "Merge pull request #445 from builtbyberry/docs/0.23.0-agents-md-drift",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T02:00:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2e9722e909e91739d370b5d3d06b7258dc976a3",
          "body": "The lane has never tested anything. It required laravel/framework:dev-main\nplus twelve 'illuminate/*:dev-main as 13.x-dev' aliases, but neither the\nframework nor the splits publish a main branch, so composer update failed\nto resolve on every run. A job-level continue-on-error swallowed that\nfailure,\n[…]\nd locally: framework-only at 13.x-dev resolves clean with no\nilluminate/* locked separately; dev-master conflicts; the new guard\ncorrectly rejects the stable v13.20.0 in the current lock.\n\nCloses #441",
          "is_bot": false,
          "headline": "fix(ci): make the nightly lane actually test laravel/framework dev",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T01:48:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b432769697ba2bb39186c90ccb0a98ee019595e",
          "body": "Two entries were actively wrong:\n\n- Review Method pointed at anthropic-skills:multi-expert-change-review,\n  which is not installed. Repointed at marshall:change-review and\n  marshall:release-readiness.\n- The topic-branch convention did not say whether <version> carries the\n  v prefix. It must not, w\n[…]\ntes that are not derivable -- Pulse is not a core dependency, prune and\nrecover must be scheduled, the Phase column meaning, and the\nDurableSwarmManager / SwarmPersistenceCipher pointers.\n\nCloses #444",
          "is_bot": false,
          "headline": "docs(agents): fix AGENTS.md drift against the codebase",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-20T01:39:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24cdf419ad9e841082e944afdf4de10217e8d60c",
          "body": "…m-stability\n\nchore(deps): tighten minimum-stability from dev to stable",
          "is_bot": false,
          "headline": "Merge pull request #443 from builtbyberry/chore/0.23.0-tighten-minimu…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-20T00:45:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c4aef97e427b3f975e947a6f596d411e8d62a00",
          "body": "The dev floor was inert: prefer-stable already resolved every dependency to\na stable tag, and no package in the tree requires a dev version (the lock\ncarried zero non-stable packages and no stability flags).\n\nVerified before changing: the default and --prefer-lowest resolutions both\nsucceed under a \n[…]\nble floor with no version movement, and an explicit\ndev-branch requirement still resolves because Composer adds its own\nstability flags for those -- so dev-branch CI lanes are unaffected.\n\nCloses #436",
          "is_bot": false,
          "headline": "chore(deps): tighten minimum-stability from dev to stable",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-19T22:43:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c91a729d45dce53a74e60d45f0c62c928f2ce632",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): scaffold v0.23.0 changelog entry",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-19T21:59:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315b654e0f4b65e09389537607b5ce7e9038ec8a",
          "body": "release: v0.22.0 — Developer Experience (DX)",
          "is_bot": false,
          "headline": "Merge pull request #409 from builtbyberry/release/v0.22.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-19T13:09:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b93e9e73662d8c71db889a5b9f9daeb296aa784c",
          "body": "… surface\n\nPint 1.29.3 tightened several fixers (fully_qualified_strict_types,\nsingle_line_empty_body, braces_position, ordered_imports, class_definition,\nunary_operator_spaces, not_operator_with_successor_space). The package commits\nno lockfile, so CI resolves Pint fresh: the stable-latest lane pic\n[…]\nt, while the lowest\nlane (Pint 1.29.0) passed. Reformat the class-free builder surface to satisfy\nthe current Pint. Formatting only — no behavior change; phpstan L7 and the\naffected suites stay green.",
          "is_bot": false,
          "headline": "style: apply Pint 1.29.3 formatting to the v0.22.0 class-free builder…",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-19T12:34:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "730cbb4d9fa3e4edd8e6aa256959846f5964d661",
          "body": "Scope the class-free entry points (Swarm::agent() and the inline\nsequential/parallel/hierarchical builders) to in-process execution\nmodes only, and keep the durable/queued path frictionless via a\none-agent Swarm class. Background execution requires a container-bound\nclass identity that an ad-hoc swa\n[…]\nee builders to the\n  in-process set; fix broken queue()/dispatchDurable() samples.\n- MakeSwarmCommand: import InputOption instead of inline FQN.\n\nCo-authored-by: Daniel Berry <daniel@builtbyberry.com>",
          "is_bot": false,
          "headline": "chore(release): resolve v0.22.0 readiness findings (R1-R12) (#430)",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T22:18:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9c51b7d51901a0ee0e374429f1defc43342e9848",
          "body": "…ess-pass\n\ndocs: v0.22.0 cohesiveness pass (README + UPGRADING reconciliation)",
          "is_bot": false,
          "headline": "Merge pull request #419 from builtbyberry/docs/v0.22.0-docs-cohesiven…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T21:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0ae98934bbd4e80dfc64f0a4719b47d5d29cd65",
          "body": "Cohesiveness pass reconciling the merged v0.22.0 surfaces with the top-level docs:\n- README 'Running a Swarm' now surfaces the class-free front door (Swarm::agent()\n  + inline builders) so the single-agent path is discoverable from the top,\n  cross-linked to the Cookbook and Execution Modes.\n- UPGRA\n[…]\nnks verified consistent across README, execution-modes, cookbook,\ntesting, and the Boost resources. Scoped to reconciliation — stable per-feature\ndocs were left to their own components to avoid churn.",
          "is_bot": false,
          "headline": "docs: reconcile v0.22.0 DX surfaces across README + UPGRADING",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T21:13:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b3572f67a53c57dbe0636f3493df0339d5b255f3",
          "body": "…skills\n\nfeat(boost): ship swarm-development agent skill",
          "is_bot": false,
          "headline": "Merge pull request #418 from builtbyberry/feat/v0.22.0-laravel-boost-…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T21:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aaf150e4d0b13b0d061a171ebaa951bf9a51dbbf",
          "body": "Add resources/boost/skills/swarm-development/SKILL.md (Agent Skills format: name +\ndescription frontmatter, Markdown body), the on-demand companion to the upfront\nBoost guidelines. Covers end-to-end authoring: front door vs inline vs class,\ntopology + execution-mode choice, governed-by-default guard\n[…]\nped): deep-subsystem skills — durable execution, guardrails+audit,\nmemory — are candidates for a later release; the single swarm-development skill covers the\nv0.22.0 DX surface without over-splitting.",
          "is_bot": false,
          "headline": "feat(boost): ship swarm-development agent skill",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T21:10:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ec1946dfdcfca217849e273df55e909b82e5ab9",
          "body": "…guidelines\n\nfeat(boost): ship Laravel Boost AI guidelines",
          "is_bot": false,
          "headline": "Merge pull request #417 from builtbyberry/feat/v0.22.0-laravel-boost-…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T21:08:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20efc895d34dd579c0e972353d5d61101b3f36bf",
          "body": "Add resources/boost/guidelines/core.blade.php, auto-loaded by a consuming app's\nphp artisan boost:install / boost:update --discover. Concise overview + the paved\npath (Swarm::agent(), inline builders, class-based swarms) + governed-by-default,\nusing @verbatim <code-snippet> blocks per Boost convention; points at the\nsearch-docs API and the swarm-development skill for depth. README notes Boost\nsupport. Dogfooding: swarm is itself an AI-orchestration package.",
          "is_bot": false,
          "headline": "feat(boost): ship Laravel Boost AI guidelines for the package",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T21:08:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fae96aae2b4dbd73769b571435ef635803782f62",
          "body": "…nerators\n\nfeat(commands): guided make:swarm front door with single-agent scaffold",
          "is_bot": false,
          "headline": "Merge pull request #416 from builtbyberry/feat/v0.22.0-interactive-ge…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T20:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aee708d76f91146826df692675f6ca211f20ac7",
          "body": "…il-checks\n\nfeat(commands): guardrail/audit/capture sanity checks for swarm:health",
          "is_bot": false,
          "headline": "Merge pull request #415 from builtbyberry/feat/v0.22.0-health-guardra…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T20:59:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dea251be7ebb1b6d0abd2b8ffb0bf84006a50eb7",
          "body": "…-static-analysis\n\nfeat(facade): IDE autocomplete + phpstan-L7 generics for the fluent builders",
          "is_bot": false,
          "headline": "Merge pull request #414 from builtbyberry/feat/v0.22.0-fluent-surface…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T20:59:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c02d2c05355ff4a37038e335b6545b7bfd24d22",
          "body": "docs(cookbook): DX cookbook for class-free entry points",
          "is_bot": false,
          "headline": "Merge pull request #413 from builtbyberry/docs/v0.22.0-dx-cookbook",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T20:59:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fbaf03c4e72201faeb90814d1917145dc58d282",
          "body": "Turn `make:swarm` into a guided entry point layered on top of the existing\ndeprecated-alias behaviour. Run interactively with no flags and it asks\nwhether to scaffold a single agent or a multi-agent swarm:\n\n- Single agent → new `swarm.single-agent.stub` under `app/Ai/Agents/`,\n  whose docblock demon\n[…]\npology resolution in single-agent mode. Extend the Pest feature test to\ncover the interactive prompt, flag honouring, and `--no-interaction`\nsafety, and document the guided flow in docs/generators.md.",
          "is_bot": false,
          "headline": "feat(commands): guided make:swarm front door with single-agent scaffold",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T20:46:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e0f445a315e7be06cd70d612500865605e84fd65",
          "body": "…alth\n\nExtend the existing swarm:health command with three container-only checks\nthat back the governed-by-default promise of the single-agent/inline front\ndoor. They run on a bare `swarm:health` alongside the persistence checks and\nfollow the same row shape (component/driver/store/status/details), \n[…]\nePolicy resolves; failed when the binding\n  is broken.\n\nSkipped under --audit (scoped to the audit-outbox checks). Docs updated in\ndocs/maintenance.md; test coverage added for human and --json output.",
          "is_bot": false,
          "headline": "feat(commands): add guardrail/audit/capture sanity checks to swarm:he…",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T20:30:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da63e9253429eb6cac000eaa4edeb26128748324",
          "body": "Surface the class-free fluent entry points (`agent()`, `sequential()`,\n`parallel()`, `hierarchical()`) as explicit `@method` tags on the `Swarm`\nfacade so IDEs and phpstan autocomplete them directly, rather than relying\non the `@internal` `SwarmRunner` mixin. Each tag carries precise param\ngenerics \n[…]\na)->guardrails([...])->stream($task)`) resolve end to end.\n\nThe `PendingRun` / `PendingAgentRun` / `PendingSwarmRun` / `AdHoc*Swarm`\nclasses already carried correct generics and stay phpstan L7 clean.",
          "is_bot": false,
          "headline": "feat(facade): annotate fluent builder surfaces for IDE autocomplete",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T20:28:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afa8fb238f72ffe0f1d4107d18a911837629c35e",
          "body": "Add docs/cookbook.md pairing with the two merged DX features:\nSwarm::agent() (single agent, fully governed) and the inline\nSwarm::sequential()/parallel()/hierarchical() builders (multi-agent\nswarms without a class). Includes a decision guide on when to use the\nfront door / inline builders vs. authoring a Swarm class.\n\nCross-link the new page from docs/getting-started.md, docs/introduction.md,\nand the docs index (docs/README.md).",
          "is_bot": false,
          "headline": "docs(cookbook): add DX cookbook for class-free entry points",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T20:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55253f8b95ca357d498edce0e3d3fb7f48018b6a",
          "body": "…ssertions\n\nfeat(testing): first-class audit-trail assertions (SwarmFake::interceptSwarmAuditSink)",
          "is_bot": false,
          "headline": "Merge pull request #412 from builtbyberry/feat/0.22.0-testing-audit-a…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T20:18:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42cf59353169fda47896f26a57a290a171de2cb1",
          "body": "Add RecordingSwarmAuditSink to the public Testing\\Audit surface with\nassertAuditChain(), assertEmittedAudit(), assertNotEmittedAudit() and\nassertStepCount(), plus SwarmFake::interceptSwarmAuditSink() to bind it — the\nfourth audit-contract intercept alongside CapturePolicy / SinkFailureHandler /\nSwar\n[…]\n can be asserted in one line\nacross single-agent, multi-agent, sync and queued runs. assertAuditChain()\nmatches its categories as an ordered subsequence. Test-only surface; no runtime\nbehavior change.",
          "is_bot": false,
          "headline": "feat(testing): first-class audit-trail assertions",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T13:26:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4373aed9272076069b19db44a90963c68ea5ac63",
          "body": "…ilders\n\nfeat(runner): inline swarm builders (Swarm::sequential/parallel/hierarchical)",
          "is_bot": false,
          "headline": "Merge pull request #411 from builtbyberry/feat/0.22.0-inline-swarm-bu…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T13:10:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "475d4bb50b02ab58da040ad85a4aa184c99379e4",
          "body": "Swarm::sequential([...]) / parallel([...]) / hierarchical($coordinator, [...])\nrun a multi-agent swarm without authoring a Swarm class, extending the class-free\nergonomics of Swarm::agent() to every topology. Each returns a fluent\nPendingSwarmRun that materializes a topology-pinned AdHocSwarm subcla\n[…]\nit) so guardrails() and the execution modes live in\none place. Governed by default and additive per-call ->guardrails(), consistent\nwith Swarm::agent(). Octane-safe: no container-global mutable state.",
          "is_bot": false,
          "headline": "feat(runner): add inline swarm builders",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T13:06:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "718586ff5e7f1556b449db7b6389148c700b9a9e",
          "body": "…nt-door\n\nfeat(runner): Swarm::agent() single-agent front door",
          "is_bot": false,
          "headline": "Merge pull request #410 from builtbyberry/feat/0.22.0-swarm-agent-fro…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-18T11:40:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe80deffd2267d146296a1c5519807ac53362bfb",
          "body": "Wrap a lone agent in a one-element AdHocSwarm and run it through the real\nSwarmRunner via a fluent PendingAgentRun, so a single agent inherits the full\ngoverned pipeline — audit, guardrails, capture, telemetry, encrypt-at-rest —\nidentically to a multi-agent swarm, across every execution mode. Remove\n[…]\n\nlaravel/ai, which drops all governance. Governed by default: globally\nconfigured guardrails apply automatically; per-call ->guardrails() layers on\ntop without replacing them. No new runner machinery.",
          "is_bot": false,
          "headline": "feat(runner): add Swarm::agent() single-agent front door",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T11:32:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4cf70213fceade000a5e7828630198d7eddae606",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): scaffold v0.22.0 changelog entry",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-18T10:57:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b49c50c161433eaf03598de64e49d1ca4b8d0257",
          "body": "release: v0.21.0 — laravel/ai ^0.9 feature adoption",
          "is_bot": false,
          "headline": "Merge pull request #404 from builtbyberry/release/v0.21.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-16T19:21:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "682d77b22788738d1a9ec0f5752568c3c3e3ddea",
          "body": "prefer-lowest CI caught that RoutePlanSchema (v0.21.0 ③) calls\n$schema->anyOf(), but Illuminate\\JsonSchema\\JsonSchemaTypeFactory::anyOf() first\nships in illuminate/json-schema v13.16.0. The package pulled illuminate/json-schema\nonly transitively via laravel/ai (^13.15), so the dependency floor resol\n[…]\n to where anyOf() exists. Local suite is\nunaffected (installed 13.20.0 already satisfies it); this fixes the prefer-lowest\nmatrix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: require illuminate/json-schema ^13.16 for the anyOf() builder",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T19:12:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e248eeed4a15a41c98ef76cd96ec79b259ec27c3",
          "body": "Follow-up to the v0.21.0 readiness review (R4 / cto+security convergence): several\nlenses flagged that the only thing stopping an operator pointing\nswarm.filesystem.tools.disk at 'local'/'public' (exposing all app storage to LLM\nwrite/delete) was documentation. HasSwarmFilesystemTools now logs a war\n[…]\n recurs each time tools resolve until the disk is scoped. Tests cover\nthe warn (local, public) and no-warn (dedicated disk) paths.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: warn when filesystem tools are bound to a local/public disk",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T19:01:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d2ba6fa895f1ca83dcf6427307c80eba831f950",
          "body": "Readiness review (24 lenses) surfaced five LOW findings, all addressed:\n\n- R1 (semver/package-maintainer): bump composer.json branch-alias dev-main\n  0.20.x-dev -> 0.21.x-dev (was stale for the 0.21 line).\n- R2 (docs): add the new public RoutePlanSchema class to docs/public-surface.md\n  (it was docu\n[…]\na() helper.\n\nNo high or medium findings; no src logic changed (docs, config comment, composer\nmetadata, and a test-only refactor).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: address v0.21.0 readiness findings (R1-R5)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T18:54:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6257b9eed4ed69e414ab676836e253449027a95",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): fill in v0.21.0 release wrap-up (date stamp)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T18:44:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3878b9259ef67a24dd54b4a957a6e2f336b87eee",
          "body": "Change-review (maintainability, qa) surfaced three MEDIUM test-strength gaps:\n\n- F1 (WithoutBroadcasting): the queued sequence-index test asserted only\n  sorted+unique, which contiguous 0,1,2,3 also satisfies — so removing the\n  skip-branch $sequenceIndex++ would not fail. Assert an actual gap\n  (ma\n[…]\nugh the container ($container->make($class, ['disk' => $disk])) so an app\ncan bind a tool subclass, mirroring HasSwarmMemoryTools.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: strengthen v0.21.0 tests per change-review (F1/F2/F3)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T18:43:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "28f6508745bae2600749cc79ad90d79f79f53078",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge ② filesystem-agent-tools into release/v0.21.0 (#408)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:53:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d471927abb2ee7e706191d16070bc283c1cc482c",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge ③ anyof-coordinator-schemas into release/v0.21.0 (#407)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:53:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "defdb8fd8f311dae84381d2c4be0cadc7e0420c5",
          "body": null,
          "is_bot": false,
          "headline": "Merge ④ collection-generics-cleanup into release/v0.21.0 (#406)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "157b0877e842f09e5af763c02f673111bcb1daa4",
          "body": null,
          "is_bot": false,
          "headline": "Merge ① without-broadcasting-honoring into release/v0.21.0 (#405)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a699715c57b6dbb9c8dc8aadc587b2c07ce55b8b",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: pint",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:52:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e7d183d0b0690a443f6d1498b8829cd9e39dae19",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: pint",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:52:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a847f984a3f60d778d3a2721beec3790b20d54d6",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: pint (ordered imports, fully-qualified strict types)",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:52:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84451b98ec3eba814d9fb3c83ea82b948ea0cd4c",
          "body": "Adds HasSwarmFilesystemTools, an opt-in concern that exposes laravel/ai's\nfilesystem tools (ReadFile, WriteFile, ListFiles, DeleteFile, CopyFile,\nFileExists, GetFileMetadata, GetFileUrl) to agents, every operation scoped to a\nsingle configured Filesystem disk.\n\nGoverned by the new swarm.filesystem.t\n[…]\nve and confined to the disk root; the\nmodel cannot traverse out (verified by test).\n\nComponent: filesystem-agent-tools (v0.21.0 ②)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: filesystem agent tools alongside Recall/Remember",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:19:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57d7c007ea3ba1dccbd8399c67ab8b56456350bf",
          "body": "Adds RoutePlanSchema, a reusable helper that types each route-plan node variant\n(worker, rollup, parallel, finish) and combines them with laravel/ai ^0.9's\nnative anyOf, so a coordinator with a known node skeleton constrains the model to\na valid node shape up front instead of relying solely on post-\n[…]\n validator —\nanyOf enriches per-node shape only, not the graph-level invariants.\n\nComponent: anyof-coordinator-schemas (v0.21.0 ③)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: enrich hierarchical coordinator route-plan schema with anyOf",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T17:11:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2d79633bc5ac1b7f1d93f33db2938246c75292a",
          "body": "…generics\n\nTextResponse::$toolCalls / $toolResults are typed Collection<int, ToolCall> /\nCollection<int, ToolResult> in laravel/ai ^0.9, so ->all() is already precisely\ntyped across the boundary. Internal type-annotation cleanup, no behavior change;\nphpstan level 7 stays clean.\n\nComponent: collection-generics-cleanup (v0.21.0 ④)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: drop @var overrides now covered by laravel/ai ^0.9 collection …",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T16:45:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a791aca753f0dc399059412d4e1c46b82c28a0d",
          "body": "Swarm's own broadcast path (BroadcastSwarm queued job + SwarmRunner::broadcast\nsync) now consults laravel/ai's WithoutBroadcasting::eventsFor($swarm) and skips\nexcluded stream-event types. laravel/ai honored the attribute in\nPromptable/BroadcastAgent, but swarm re-wraps events into its own SwarmStre\n[…]\nast.event\ntelemetry (the broadcast sequence index still advances past them).\n\nComponent: without-broadcasting-honoring (v0.21.0 ①)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: honor #[WithoutBroadcasting] in swarm's broadcast path",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T16:42:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4dfd334276a929f80ae3ae811cc94a62225ad57",
          "body": "Bootstraps this repo for the Marshall-native release flow (state.backend=srm,\ntag-mode wrap) and scaffolds the v0.21.0 CHANGELOG section.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): scaffold v0.21.0 changelog + release-config",
          "author_name": "Daniel Berry",
          "author_login": null,
          "committed_at": "2026-07-16T16:38:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8a6fe26cf6222c04d481bab085212d75b8bf174b",
          "body": "release: v0.20.0 — laravel/ai ^0.9",
          "is_bot": false,
          "headline": "Merge pull request #403 from builtbyberry/release/v0.20.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T18:24:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad4dca896674a1ace46b21ce5468d88c55987122",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump branch-alias to 0.20.x-dev",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T17:03:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d88cc29c343852870a4ff28f30537b12ec4d4cf0",
          "body": "… AGENTS, getting-started\n\nLeaves historical references (CHANGELOG, v0.13.0 UPGRADING block, #255 test-guard\ncomments) intact; only forward-looking floor statements move to ^0.9 (v0.20.0).",
          "is_bot": false,
          "headline": "docs: reconcile current-tense laravel/ai floor to ^0.9 across README,…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T16:40:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c2d54e9af5f9c08b45e8faaebbe9196ce30cef",
          "body": null,
          "is_bot": false,
          "headline": "docs: changelog + upgrading entries for v0.20.0 (laravel/ai ^0.9)",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T16:35:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5a583b21cf34c66bc825229302879495528f8aa",
          "body": "Bumps laravel/ai from ^0.8 (v0.8.1) to ^0.9 (v0.9.0). Verified against\nthe full pest suite (1919 passed) and phpstan level 7 (no errors). No\nbreaking changes in swarm's usage surface: the removed TextGateway\ncontract and the Anthropic default-model bump do not touch swarm, and\nall 22 imported laravel/ai symbols still resolve.",
          "is_bot": false,
          "headline": "chore: upgrade laravel/ai constraint to ^0.9",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T14:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fed628dd8ece08e5b6f15d8b5308957fad0a1e4b",
          "body": null,
          "is_bot": false,
          "headline": "chore: pin laravel-swarm Swarm channel in AGENTS.md",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-13T14:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dccb664245a81dc63a2913c1d26925669fe75bee",
          "body": "release: v0.19.1 — Companion packages README section (docs)",
          "is_bot": false,
          "headline": "Merge pull request #401 from builtbyberry/release/v0.19.1",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-11T17:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f181097c5de493374df72ad5627f37b6b2b746f6",
          "body": "…/L4)\n\n- Lowercase articles in section headings (Running a Swarm, Choosing an\n  Execution Mode, Queueing a Swarm, Streaming a Swarm) to match the docs'\n  casing; anchors unchanged, so all cross-links still resolve.\n- Trim the README Documentation section from a partial 18-item list (which\n  duplicated Pulse and omitted several headline docs) to a short set of common\n  entry points plus a pointer to the comprehensive docs/README.md index.",
          "is_bot": false,
          "headline": "docs: README polish — heading casing + trimmed Documentation list (L3…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-11T17:13:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8607f9140c3b2f9cdef43fbee4b087bd46421172",
          "body": "…cosystem\n\nExtends the v0.19.1 docs work from a README companion section into a full\ncohesiveness pass (findings from a docs audit; no code changes):\n\n- docs/README.md (offline index): add a Companion Packages section mirroring the\n  README, plus an MCP pointer in the Observability list — the index \n[…]\ntency (L2).\n- Standardize .env code-fence tags to ```env across four docs (L1).\n\nAudit found no broken links and nothing shipped-but-called-planned; these are\nconsistency/completeness reconciliations.",
          "is_bot": false,
          "headline": "docs: cohesiveness pass — reconcile docs with the shipped companion e…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-11T17:09:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e22909efb495146bb4120353e155157f6ae8649",
          "body": "Surfaces the shipped companion ecosystem from the core README — a new\n'Companion packages' section linking laravel-swarm-filament, laravel-swarm-mcp,\nlaravel-swarm-pulse, and laravel-swarm-memory-vector, plus a ToC entry, so the\ntwo newest companions (the Filament panel and the MCP server) are discoverable\nfrom the core README, not only the docs site. Docs-only; no code, no API impact.",
          "is_bot": false,
          "headline": "docs(readme): add Companion packages section (v0.19.1)",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-11T16:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c1df153aaeb927c1de788b8c7af626aca130c7d",
          "body": "release: v0.19.0 — Public display-read seams for ecosystem companions",
          "is_bot": false,
          "headline": "Merge pull request #394 from builtbyberry/release/v0.19.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T15:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73b7a9fa287523b28bb721e392916e5481622d9c",
          "body": "…owups\n\nchore(release): v0.19.0 readiness gate followups (F1)",
          "is_bot": false,
          "headline": "Merge pull request #399 from builtbyberry/chore/0.19.0-readiness-foll…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T15:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59f296ec3ad94a06aea06dc8bba3360ea2af876f",
          "body": "…diness F1)\n\npublic-surface.md linked the InspectsDurableRuns / DurableRunDetail rows to\ndurable-execution.md#read-only-inspection, which did not exist (4 dead anchors).\nAdd that section — the read counterpart to the operator control contract —\ncovering InspectsDurableRuns, DurableRunDetail, and the\n[…]\ncloses the readiness open gap: an end-to-end test asserting\nInspectsDurableRuns::inspect()->toArray() carries hierarchical_node_outputs.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "docs(durable): add read-only inspection section + inspect() test (rea…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:53:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "520f232372876fc198d90c30950bf7dda4135099",
          "body": "chore(release): v0.19.0",
          "is_bot": false,
          "headline": "Merge pull request #398 from builtbyberry/chore/0.19.0-release-wrap",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0191afd8cc01d0c85b9a9e3d33748c752aa90db2",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): v0.19.0 read-only inspection contracts section",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:18:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96a2d4d74d0f100a5a0cc82c47c90e8cc336ff02",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump branch-alias to 0.19.x-dev",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:18:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3538ff1c0f4e748e968d526d943073754b9fe8c1",
          "body": null,
          "is_bot": false,
          "headline": "docs(upgrading): v0.19.0 upgrade block (no required action)",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:18:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "427c828fac6c9bbe7eb47d3962bfcd5fa022daea",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): finalize v0.19.0 release date",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:18:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77c6e2a814564beea8aa21bff8ae1f0a5b8bf325",
          "body": "chore: v0.19.0 review followups (F1)",
          "is_bot": false,
          "headline": "Merge pull request #397 from builtbyberry/chore/0.19.0-review-followups",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T14:14:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c12ba56763a4e482f20599c1192153d32cd41ee",
          "body": "…view F1)\n\nThe display-decrypt degrade check masked any decrypted plaintext beginning\nwith the sw0: sentinel as ciphertext, so a value that was legitimately sealed\nand decrypts cleanly to e.g. \"sw0:input\" (#212) rendered as unavailable across\nevery display twin (branch/child/hierarchical/step/contex\n[…]\nrbatim) instead of the sw0: prefix, so a genuine decrypt is\nnever mistaken for ciphertext. Fails safe either way; regression test added.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "fix(persistence): openForDisplay preserves a legit sw0: plaintext (re…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T13:58:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79d4cc512263d490db0daba886f4e9e649c78579",
          "body": "…ompleteness\n\nfeat(history,audit): complete the display-seam set + minimize audit payload",
          "is_bot": false,
          "headline": "Merge pull request #396 from builtbyberry/feat/0.19.0-display-seams-c…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T13:53:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6feb88958518f8f1f10e3fda3655823ba0e35221",
          "body": "…ayload\n\nCohesion follow-up to #395 — cover every sealed display surface, not a\nsubset, and tighten audit-evidence exposure.\n\n- ReadableRunHistoryStore: additive display twin of the SHARED\n  RunHistoryStore::find(). findForDisplay() degrades the run context input,\n  run output, and every step's io (\n[…]\ned plaintext (nothing to\ndegrade); signals/waits/progress are JSON; context-store/checkpoints are\noperational-only. Records 629/630/632.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "feat(history,audit): complete the display-seam set + minimize audit p…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T13:26:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d07d6e59fdca26d49ff72da5cf1da917f5b4b2d",
          "body": "…ay-read-seams\n\nfeat(durable,audit): public display read seams for companions",
          "is_bot": false,
          "headline": "Merge pull request #395 from builtbyberry/feat/0.19.0-companion-displ…",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T12:46:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5b6b4c75e44f378ade9dc24144c10b5a7c9398e",
          "body": "- Rename DisplayReadSeamsTest global helpers to a displaySeams* prefix to\n  avoid redeclaring seedDurableRun() (clashed with DatabaseDurableRunStoreTest).\n- openChildContextForDisplay: run the raw sealed input through openForDisplay\n  so a failed decrypt under null_with_log reports context_available\n[…]\nolicy — never leak sw0: ciphertext under legacy, never throw\n  under throw. Operational strict reads (findBranch/branchesFor) unchanged.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "fix(durable): per-row degrade for inspection reads + test collisions",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T11:13:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2becff78a7bd1de0bfe4f83a0c8ac6144c65175",
          "body": "Add separate, additive, read-only contracts so companion packages and\nexternal readers (starting with laravel-swarm-filament) can DISPLAY durable\nrun + audit-outbox data through supported public seams, without binding the\n@internal SwarmPersistenceCipher or the strict-operational resume reads.\n\n- In\n[…]\nay reads route through it. Operational strict reads untouched.\n\nDesign-gated (proceed-to-implement); records 629/630/632. Resolves #630.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "feat(durable,audit): public display read seams for companions",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T03:14:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "100f6e8783135d8ef8cf06d0a50d615ef740870c",
          "body": "Placeholder for the v0.19.0 release wrap-up. Sections will be filled in\nonce all component PRs land on this branch.",
          "is_bot": false,
          "headline": "chore(release): scaffold v0.19.0 changelog entry",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-08T02:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "549f4b110ac22e4b515b5bd5a4480a8e6089e7ea",
          "body": "release: v0.18.0 — Phase 1 blueprint templates (make:swarm:blueprint + tokenized catalog)",
          "is_bot": false,
          "headline": "Merge pull request #384 from builtbyberry/release/v0.18.0",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-07T20:39:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ff6cedde17a9a7be515c230450738e1f365e5ac",
          "body": "chore(release): v0.18.0 wrap-up",
          "is_bot": false,
          "headline": "Merge pull request #392 from builtbyberry/chore/0.18.0-release-wrap",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-07T20:13:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50445d1f1051073efa044dd8a42972197328318d",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump branch-alias to 0.18.x-dev",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-07T20:04:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b642d7969ad6d3465deb2fc55db9ba818deba13e",
          "body": null,
          "is_bot": false,
          "headline": "docs(upgrading): v0.18.0 upgrade block (no required action)",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-07T20:04:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a1e2dce2f4395f1ccbcf68c9af442c22609ffdd",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): finalize v0.18.0 release date",
          "author_name": "Daniel Berry",
          "author_login": "dberry37388",
          "committed_at": "2026-07-07T20:04:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 36,
      "commits_last_year": 926,
      "latest_release_at": "2026-07-20T22:39:09Z",
      "latest_release_tag": "v0.23.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 1.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "builtbyberry/laravel-swarm",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "laravel",
            "agents",
            "ai",
            "orchestration",
            "swarm"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/builtbyberry/laravel-swarm",
          "is_deprecated": false,
          "latest_version": "v0.23.0",
          "repository_url": "https://github.com/builtbyberry/laravel-swarm",
          "versions_count": 54,
          "total_downloads": 2891,
          "dependents_count": 4,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2310,
          "first_published_at": null,
          "latest_published_at": "2026-07-20T22:35:41Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 32,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-05",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 14
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 138611,
      "source_files_sampled": 821,
      "oversized_source_files": 5,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 19794
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "illuminate/bus",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/cache",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/concurrency",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/console",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/container",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/contracts",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/database",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/events",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/filesystem",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/json-schema",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.16"
        },
        {
          "name": "illuminate/queue",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/support",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "illuminate/view",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.0"
        },
        {
          "name": "laravel/ai",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^0.9"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 247,
        "open_issues": 13,
        "closed_ratio": 0.931,
        "closed_issues": 175,
        "closed_unmerged_prs": 11
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "dberry37388",
          "commits": 878,
          "avatar_url": "https://avatars.githubusercontent.com/u/1000887?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "audit.yml",
        "branch-naming.yml",
        "mutation.yml",
        "nightly.yml",
        "tests-real-db.yml",
        "tests.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "phpstan.neon"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/9 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 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": 2,
            "reason": "SAST tool is not run on all commits -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 4,
            "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": "e3ca8b30af3b50592b2f15e1cc1130ecddad66fb",
        "ran_at": "2026-07-27T20:19:41Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T12:50:37Z",
      "oldest_open_prs": [
        {
          "number": 457,
          "created_at": "2026-07-27T20:15:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-20T22:35:42Z",
      "ci_last_conclusion": "CANCELLED",
      "oldest_open_issues": [
        {
          "number": 48,
          "created_at": "2026-05-19T21:37:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 254,
          "created_at": "2026-06-23T02:31:35Z",
          "last_comment_at": "2026-07-01T22:32:54Z",
          "last_comment_author": "dberry37388"
        },
        {
          "number": 400,
          "created_at": "2026-07-09T10:28:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 431,
          "created_at": "2026-07-19T12:24:22Z",
          "last_comment_at": "2026-07-20T20:43:33Z",
          "last_comment_author": "dberry37388"
        },
        {
          "number": 433,
          "created_at": "2026-07-19T12:24:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 434,
          "created_at": "2026-07-19T12:24:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 435,
          "created_at": "2026-07-19T12:24:28Z",
          "last_comment_at": "2026-07-20T02:53:06Z",
          "last_comment_author": "dberry37388"
        },
        {
          "number": 437,
          "created_at": "2026-07-19T18:24:46Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 449,
          "created_at": "2026-07-20T04:24:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 450,
          "created_at": "2026-07-20T04:44:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 452,
          "created_at": "2026-07-20T04:45:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 454,
          "created_at": "2026-07-20T20:47:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 455,
          "created_at": "2026-07-20T21:16:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/builtbyberry/laravel-swarm",
    "host": "github.com",
    "name": "laravel-swarm",
    "owner": "builtbyberry"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 50,
        "vitality": 84,
        "community": 54,
        "governance": 55,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 926,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "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": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "926 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 926
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 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": 36,
              "latest_release_tag": "v0.23.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 1.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "36 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 36
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.9
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 54,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "forks": 1,
              "stars": 32,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "32 stars",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "packages": [
                "builtbyberry/laravel-swarm"
              ],
              "dependents": 4,
              "ecosystems": "packagist",
              "total_downloads": 2891,
              "monthly_downloads": 2310
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,310 downloads/month across packagist",
                "points": 44.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2310,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "4 packages depend on it",
                "points": 4.7,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "merged_prs": 247,
              "open_issues": 13,
              "closed_issues": 175,
              "issue_closed_ratio": 0.931,
              "closed_unmerged_prs": 11
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "93% of issues closed",
                "points": 43.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 93
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "247/258 decided PRs merged",
                "points": 36.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 247,
                      "decided": 258
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/9 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "builtbyberry",
              "public_repos": 19,
              "account_age_days": 1071
            },
            "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": "0 followers of builtbyberry",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "builtbyberry"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "19 public repos, account ~2 yr old",
                "points": 15.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 19
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "builtbyberry/laravel-swarm"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "54 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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": "phpstan.neon",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpstan.neon"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/9 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 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": "SAST tool is not run on all commits -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "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": 2
            },
            "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": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 19794
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.18,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "phpstan.neon",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpstan.neon"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "18 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 18,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 138611,
              "source_files_sampled": 821,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/821 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 821,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T20:19:56.736237Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/builtbyberry/laravel-swarm.svg",
  "full_name": "builtbyberry/laravel-swarm",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Packagist.