Звіт у форматі 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"
}