Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 20:19 UTC

builtbyberry / laravel-swarm

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

PHPMIT★ 32 Sterne⑂ 1 Forkseit Apr. 2026Auf GitHub ansehen ↗

builtbyberry/laravel-swarm erreicht einen Gesundheitsindex von 65 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (84/100) ab, am schwächsten bei Security (50/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

65
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

65
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Built by BerryOrganisation
0 Follower19 öffentliche Reposseit Aug. 2023

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
Packagistbuiltbyberry/laravel-swarmv0.23.02.31054vor 6 Tagenlaravelagentsaiorchestrationswarm

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

84Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
9.7/36Commit-Rhythmus — 14/52 Wochen mit Commits
18/18Commit-Volumen — 926 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year926
human_commit_share1
days_since_last_push0
active_weeks_last_year14

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 36 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count36
latest_release_tagv0.23.0
releases_from_tagsnein
days_since_latest_release6
mean_days_between_releases1,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

54Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
24.2/60Stars — 32 Stars
0/25Forks — 1 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks1
stars32
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templateja
Wie die Bewertung erfolgt
44.9/80Downloads pro Monat — 2.310 Downloads/Monat über packagist
4.7/20Abhängige in der Registry — 4 Pakete hängen davon ab
Verwendete Eingangsdaten
packagesbuiltbyberry/laravel-swarm
dependents4
ecosystemspackagist
total_downloads2.891
monthly_downloads2.310

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

55Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
43.5/46.8Issue-Lösungsquote — 93 % der Issues geschlossen
36.6/38.3PR-Annahme — 247/258 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/9 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs247
open_issues13
closed_issues175
issue_closed_ratio0,931
closed_unmerged_prs11
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
0/25Reichweite des Inhabers — 0 Follower von builtbyberry
15.3/25Kontohistorie — 19 öffentliche Repos, Kontoalter ca. 2 Jahre
Verwendete Eingangsdaten
followers0
owner_typeOrganization
is_verified
owner_loginbuiltbyberry
public_repos19
account_age_days1.071

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf packagist
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 6 Tagen
20/20Versionshistorie — 54 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesbuiltbyberry/laravel-swarm
ecosystemspackagist
any_deprecatednein
min_days_since_publish6

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

80Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 6 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — phpstan.neon
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

50Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
2.5/2.5CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/9 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
1/5SAST — SAST tool is not run on all commits -- score normalized to 2
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

59Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes19.794
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — phpstan.neon
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
10/10Belegte Agentenpraxis — 18 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,18
toolchain_manifests
dependency_bot_commit_share0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — PHP ohne Typprüfungs-Konfiguration
54.7/55Handhabbare Dateigrößen — 5/821 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePHP
largest_source_bytes138.611
source_files_sampled821
oversized_source_files5
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

32GitHub-Sterne
1Mitwirkende
926Commits, letzte 12 Monate
0Tage seit letztem Push
36Releases
1Bus-Faktor
13offene Issues
PackagistPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 5.0 / 10
5.0Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-27 20:19 UTC

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

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPackagist.