One breaking change. Custom
MemoryPropagationPolicyimplementations must re-type thepresent()agent parameter toLaravel\Ai\Contracts\Agent. PHP forbids narrowing a parameter type, so a policy left on the old type raises a fatal error when the class loads, before any call. One-line fix — swap theusestatement. See UPGRADING.md.Everything else is backward compatible:
BuiltByBerry\LaravelSwarm\Contracts\Agentremains as a@deprecatedalias, so agents written against it since v0.5.0 keep working unchanged.
v0.23.0 - 2026-07-20
Compatibility and correctness: laravel/ai agents drop in unchanged, plus
documentation, dependency and CI fixes that close gaps between what this
repository says and what it does.
Added
Nothing. This release adds no public API, configuration key, or command. Its
one new test (the documented-Artisan-invocation guard) ships with the fix it
protects, under Fixed below.
Changed
- Tightened
minimum-stabilityfromdevtostableincomposer.json, and
stopped telling applications to loosen their own. Thedevfloor was inert —
prefer-stable: truealready resolved every dependency to a stable tag, and no
package in the tree requires a dev version. Composer readsminimum-stability
from the root package only, so this is hygiene for Swarm's own resolution
and has no direct effect on a consuming application. The consumer-facing half
is documentation:README.md,UPGRADING.md,docs/getting-started.mdand
docs/advanced-setup.mdinstructed applications to set
"minimum-stability": "dev"in their owncomposer.jsonon the premise that
laravel/aiships dev-tagged releases. It ships stable tags on the 0.9 line —
a strictly-stable root resolveslaravel/ai ^0.9tov0.9.1with no stability
flags — so that instruction was needlessly loosening the resolution floor of
every consumer's entire dependency tree. All four sites now say no special
stability configuration is required. Verified against both the default and
--prefer-lowestresolutions, and against an explicit dev-branch requirement
(Composer adds its own stability flags for those, so dev-branch CI lanes are
unaffected). No dependency versions changed. - Bumped
extra.branch-alias.dev-mainfrom0.22.x-devto0.23.x-dev, so an
application trackingdev-mainresolves under a^0.23constraint. AGENTS.mdcorrected against the codebase. The contributor/agent guidance
had drifted: it pointed at a code-review skill that is not installed, and left
the topic-branch convention ambiguous about thevprefix (topic branches drop
it, the release branch keeps it). Both are now stated correctly. Five sections
that duplicated the codebase — pinned dependency versions, an Artisan command
list covering 8 of 24 commands, asrc/directory tree, the checkout path, and
a capability summary — were replaced with pointers to the source of truth, so
they cannot silently go stale again. No runtime or public-API change.
Fixed
-
The documented
--singleflag formake:swarm:swarmnever existed. Eight
sites — thePendingRundocblock, the execution-modes and cookbook docs, the
Laravel Boost guidelines and skill, andUPGRADING.md— told you to author a
one-agent swarm by passing--singleto that command. It has no such option
and errors out. The flag exists only on the deprecatedmake:swarm
alias, where it scaffolds an agent rather than the swarm class every one of
those sites was pointing at. All eight now say what actually works:
php artisan make:swarm:swarm YourSwarm, returning a single agent from
agents()— the default sequential scaffold is already the one-agent shape,
and no dedicated flag is needed.The v0.22.0 CHANGELOG entry below still carries the original wording; released
entries are historical record and are not rewritten.A new test asserts that every package Artisan command and option this repo
documents actually exists, so a documented-but-nonexistent invocation now
fails on the pull request that introduces it. -
Plain
laravel/aiagents work with Swarm again. Every public entry point
and runner gate type-hinted the swarm-ownedContracts\Agentmarker. Because
interface inheritance runs one way, a class implementing only
Laravel\Ai\Contracts\Agentwas not an instance of that marker, so Swarm
rejected it — atSwarm::agent(), in the parallel and hierarchical runner
gates, in the hierarchical route planner, and inside the memory view. This
contradicted the documented "drop in unchanged" behaviour. Swarm now
type-hints the vendor contract throughout, so existing Laravel AI agents run
through a swarm without modification.BuiltByBerry\LaravelSwarm\Contracts\Agentremains as a@deprecatedalias
and still extends the vendor contract, so agents written against it since
v0.5.0 keep working unchanged; it is slated for removal in v1.0. The v0.5.0
upgrade note that required migrating to the marker is reversed. One
breaking change: customMemoryPropagationPolicyimplementations must
re-type theirpresent()agent parameter to the vendor contract — see
UPGRADING.md. -
Nightly Laravel-dev CI lane now actually runs. The
nightlyworkflow
requiredlaravel/framework:dev-mainplus twelveilluminate/*:dev-main
aliases, but no such branch is published — every run failed to resolve
dependencies, and a job-levelcontinue-on-errorreported those runs as
successful, so the lane installed nothing and executed no tests from the day it
was added. It now requireslaravel/framework:13.x-dev(the framework
replaces theilluminate/*splits, so the individual requires were
unnecessary), no longer swallows failures, and fails loudly if the resolved
framework is not a dev build. This lane is CI-only and does not affect the
published package.