Suprnova v0.7.0
Security
- Upgraded
ammoniato 4.1.4 (RUSTSEC-2026-0213). Versions through 4.1.3
allow XSS via SVGanimateandsetanimation tags.ammoniais the
sanitizer at the end of Suprnova's markdown pipeline
(comrak→syntect→ammonia), so any app rendering user-supplied
Markdown throughcontentwas exposed. The advisory was published
2026-07-21 — after v0.6.5 shipped — so every release up to and including
v0.6.5 is affected. Upgrading the framework is the fix; no application
code changes are required.
Added
- Queue routing. Jobs can be dispatched to a specific queue and connection,
and workers can be dedicated to specific queues — the Laravel 13
Queue::route(...)surface, typed. A job states its own home with
Job::queue()/Job::connection(); an operator overrides it centrally with
Queue::route::<SendInvoice>(Some("redis"), Some("billing"))in
bootstrap::register(), without editing the job. Resolution is route, then
job, then global default, and aNonefield in a route defers rather than
clearing.queue:work --queue=billing,defaultdrains only those queues.
Unrouted jobs belong todefault, so they are never stranded. Chained jobs
resolve routes by name, since a chain link stores its job erased. QueueDriver::pop_from. Filtering pop, with a default implementation that
rejects a filter it cannot honor rather than silently draining every
queue — a worker told to drainbillingthat quietly drains everything is
indistinguishable from a working deployment until the wrong pool eats the
wrong jobs. The memory and database drivers filter natively. Custom drivers
keep compiling and inherit the loud default.- Documented the
jobstable schema.manual/queues.mdnow carries the DDL
DatabaseQueueDriveractually expects, which was previously only discoverable
by reading the driver's SQL. - Documented Inertia's
serverHeadoption. Server-driven<head>elements
(Inertia 3.5.0) need no framework support: the client reads them from an
ordinary prop, so any handler can already supply them. See
manual/frontend-inertia-responses.md.
Changed
Envelopegained aqueue: Option<String>field. It isserde(default)and
skipped when absent, so an unrouted envelope serializes byte-identically to
what previous versions wrote — the frozen wire-format test passes unchanged,
there is noschema_versionbump, and mixed-version fleets interoperate
during a rolling upgrade.WorkerConfiggained aqueues: Vec<String>field (empty = drain everything,
the previous behaviour).- Removed
ROADMAP.md. Its design principles live inmanual/introduction.md,
the working agreement inmanual/contributions.md, and the deployment and
scale-out material inmanual/deployment.md; the shipped/planned checklists
had gone stale.README.md's pointer to it for "the relationship to upstream"
was already dangling — that attribution lives inLICENSE. - Scaffold frontends now pin
@inertiajs/{svelte,react,vue3}at^3.6.1
(from^3.4.0). The 3.4.0 → 3.6.1 range is client-side only — audited against
the upstream changelog and thePagecontract inpackages/core/src/types.ts,
everyX-Inertia-*header the 3.6.1 client sends was already handled. scripts/release.shnow publishes the GitHub release itself, with notes taken
from the version'sCHANGELOG.mdsection. Previously this was a manual
"next step" that got skipped, which is why v0.5.10 and v0.6.1–v0.6.3 are
tag-only and the Releases page sat on a stale version. Preflight runs before
the gate so a missingghor changelog section fails in seconds, and
publishing is skipped automatically unlessoriginis GitHub.
Upgrading
Existing jobs tables on the database queue driver must add the new
column — push names it in its INSERT whether or not the job is routed, so
an un-migrated table fails every push. Migrate first, then roll binaries
(older binaries list their columns explicitly and ignore the new one, so that
order is safe):
ALTER TABLE jobs ADD COLUMN queue TEXT NULL;
CREATE INDEX idx_jobs_queue ON jobs(queue);(Corrected in 0.7.1 — this note originally claimed unfiltered deployments
needed no migration.)