Skip to content

Sync Laravel updates: #57633 → #57698 - #567

Merged
binaryfire merged 25 commits into
0.4from
laravel-parity
Sep 6, 2026
Merged

Sync Laravel updates: #57633 → #57698#567
binaryfire merged 25 commits into
0.4from
laravel-parity

Conversation

@binaryfire

Copy link
Copy Markdown
Member

Laravel updates

  • #57633 — Document query-listener callback types and worker lifetime. Correct the upstream callable annotation to include its return type.
  • #57625 — Complete queued-notification routing test parity, retaining connection/queue fallback cases and adding current container-call expectations. Selected notification and validation expectation updates from #61117 are included; the remainder of that PR is still pending.
  • #57641 — Run the complete Queue and Cache integration directories against Redis, Redis Cluster and Valkey. Correct four queue test environments that forced database queues, preserve driver-specific debounce behavior, and check emptiness through the selected queue connection.
  • #57656 — Complete file-validation parity for Symfony files and uploads in both normal and compiled validation. Correct file-size message classification, upload-error and MIME checks, and stale file boundaries that accepted plain file-info objects. Restore distinct File/upload SVG fixtures and MIME coverage; correct the maximum-dimensions documentation.
  • #57665 — Honor the configuration bootstrap flag and memoize the filesystem fallback. Add real-application coverage and align cached-config test boots with upstream dotenv handling.
  • #57623, #57687 — Complete cached-route bound-state coverage and memoize route-cache detection. Preserve Hypervel's subprocess route compilation, loading and application lifecycle.
  • #57670, #57722, #59780, #60911 — Complete factory insertion behavior, hidden-attribute assertions, model generics and empty-factory handling. Correct repeated mutator application and omitted visible-filtered attributes by using the made models' raw attributes. Preserve supplied/default/null timestamps, unique IDs, one-query insertion and custom builder dispatch; document the public API.
  • #57581, #57688 — Complete Unicode ucwords separator documentation and fix empty separators in both static and fluent APIs using the existing UTF-8 first-letter helper.
  • #57698, #58962 — Complete null-safe comparison routing and upstream tests across supported databases. Correct RHS-subquery compilation and JSON-boolean comparisons while preserving driver casts, child grammars, timeout checks and binding order. SQLite uses numeric boolean literals to preserve equality rather than truthiness. The additional SQLite execution regression was verified and retained for the next checkpoint to keep this PR within the file limit.
  • #61339 — Add queue-worker stop output for CLI and JSON, including all stop descriptions and public documentation. Associate the worker-lifetime listener with the command through the event's existing options.
  • #57918, #61419 — Propagate context through explicit scheduler/process-concurrency boundaries and hydrate it once before command execution. Correct upstream binary-payload loss with serialized/base64 transport and consume the payload before hydration to prevent re-entry or later job reseeding. Coroutine concurrency remains the default.
  • #60945 — Complete collection-operation substitutions for exception exclusions and provider removal. Preserve atomic provider-file writes and permissions; document the affected worker-lifetime configuration methods.
  • #57144, #58177 — Complete Composer package-uninstall integration using named container resolution. Preserve process isolation and minimal bootstrap; cover real Composer events, repeated removals, dev-mode gating and failure output, and document package cleanup callbacks.
  • #61231, #61373 — Add total queue size and pending/delayed/reserved counts across drivers, proxies, fakes and facades. Use one held Redis connection per total and native Beanstalkd server statistics. Preserve Hypervel's disjoint fake states and Laravel extension points.
  • #60916, #61198 — Honor job delay attributes in fake bulk dispatch and complete Redis bulk/discovery coverage. Retain Hypervel's streamed discovery and native batch dispatch instead of Laravel's incompatible helper methods; document the approved extension-point differences.
  • #49572, #60012, #61260 — Complete current static/fluent APA and string-helper coverage, including Unicode splitting and symbol cases. Correct capitalization of hyphenated title/subtitle opening words, use typed Symfony UID fixtures, and restore the previous dump handler after testing.
  • #60814 — Port Unicode-aware word wrapping and its upstream tests. Preserve existing separators and original control bytes, retain the ASCII fast path, remove token-search machinery, and correct the documentation example.
  • #60864 — Use PHP 8.4's native UTF-8 first-letter casing functions and cover their Unicode title-case mappings.
  • #57296 — Add Str::resetFactoryState() with focused documentation and a worker-lifetime warning. Keep framework test cleanup authoritative and preserve macros when only factory state is reset.

Additional Hypervel fixes

  • Make app_path() honor Application::useAppPath() while preserving pre-bootstrap behavior. Correct a pruning-discovery test that passed without discovering any models.
  • Preserve binary UUID/ULID values in factory and fill-and-insert operations through the existing PDO LOB-binding helper, fixing PostgreSQL truncation and SQLite lookup misses.
  • Preserve context dehydration callbacks in fresh coroutines even when no context repository has been allocated; retain the allocation-free path when neither context nor callbacks exist.
  • Correct native Redis scan-prefix handling, including combined flags, and prevent cache member scans from accidentally prefixing their match patterns. Restore the held connection's scan option after success or failure.
  • Preserve numeric Redis queue names as strings during discovery so typed inspection and total-count callbacks accept names such as 0.
  • Remove Testbench's obsolete Composer method guard while retaining its loaded-class check; cover timeout disabling and restore the timeout across lifecycle tests.

Summary by CodeRabbit

  • New Features

    • Added aggregate queue-size metrics for total, pending, delayed, and reserved jobs.
    • Added JSON-formatted worker stop notifications with shutdown reasons and status details.
    • Context now propagates to concurrent processes and scheduled commands.
    • Factory bulk inserts now support binary identifiers, unique IDs, timestamps, and empty input.
    • Added a public string factory-state reset utility.
  • Bug Fixes

    • Improved Redis scanning with prefixed keys and tagged cache cleanup.
    • Corrected null-safe equality handling across supported databases.
    • Expanded file validation compatibility for Symfony file and upload objects.
  • Documentation

    • Added guidance for queue metrics, process context, Redis scanning, package removal, and factory inserts.

Require imported short class names for fully and partially qualified references, with aliases for collisions and no redundant same-namespace imports. Retain the exception for clearer config-style identifier lists.

List the class-import convention explicitly among approved porting adaptations so upstream style preservation does not override it.
Port Laravel framework PR #57633 using the current 13.x implementation at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2:
laravel/framework#57633

Describe the QueryExecuted argument supplied to Connection::listen callbacks. Complete the upstream callable annotation with an explicit mixed return type, which PHPStan requires and which preserves arbitrary callback results, including false to stop event propagation.

Document that registration persists on the worker-global dispatcher and belongs at boot. Use the existing QueryExecuted import as required by the porting convention. Native signatures and runtime behavior remain unchanged.

Validation: scoped PHP-CS-Fixer, full source and type-fixture PHPStan analysis, and scoped ParaTest for DatabaseConnectionTest and DatabaseIntegrationTest passed (97 tests, 419 assertions). The upstream PR changes no tests. Independently reviewed and signed off by claude-laravel-parity.
Clarify the approved exception for test-prefixed methods in test classes. Fixture and helper methods remain covered by the existing method documentation rule.
Hypervel already preserves notification connection and queue defaults when channel maps omit an entry, as required by Laravel #57625. Complete parity with current 13.x by requiring exactly two container accesses in each of its three two-channel cases, incorporating those later assertions from #61117 without claiming the rest of that PR is ported.

Retain all six channel, connection, and queue payload predicates. Apply native SendQueuedNotifications callback types, bool returns, and precise fixture signatures with method-title documentation. Preserve Hypervel event-listener registration at provider boot. This changes tests only and adds no production runtime overhead.

Porting source: laravel/framework 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Upstream: laravel/framework#57625
Partially incorporated: laravel/framework#61117

Validation: NotificationSenderTest passes with 26 tests and 76 assertions; scoped formatting and git diff --check pass. Full source analysis was already clean at the unchanged source revision. Reviewed and signed off by claude-laravel-parity.
Bring in the clarified scope of Laravel porting documentation: document changes that require adaptation or a compatibility check for existing Laravel usage; keep purely additive opt-in enhancements in feature documentation.
Port the remaining CI coverage from Laravel framework PR #57641. The
asynchronous chaining assertions and conditional Redis test lifecycle were
already present, but four queue suites forced the database driver and the
workflow selected only two driver-neutral files.

Honor QUEUE_CONNECTION in the debounce, listener, unique-job, and worker
test environments while retaining database for unconfigured local runs.
Restore applicable current upstream debounce driver conditions and assert
chain emptiness through the selected queue, including delayed and reserved
Redis jobs, instead of inspecting the database jobs table.

Run the entire Queue directory with Redis selected on Redis 8, Redis
Cluster, and Valkey 9. Also adopt the current Laravel workflow's whole
Cache directory selection, as requested, with CACHE_STORE=redis. Preserve
Hypervel's capped standalone parallelism and serial Cluster isolation;
the nested Redis test directories are discovered once. No production
source or public API changes are needed.

Upstream: laravel/framework#57641
Current debounce test conditions: laravel/framework#59507
Redis workflow pattern: laravel/framework#57710
Porting source: Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Later PR references identify incorporated behavior, not full dispositions.

Validation: each changed test file passes database, Redis, and applicable
sync cases. Complete Queue suite passes standalone and Cluster with 277
tests and 1,254 assertions each; Cache passes with 569 tests and 2,603 /
2,614 assertions. Scoped formatting, YAML parsing, shell syntax, and diff
checks pass. Local runs use PHP 8.4 and Redis 8.8; Valkey and PHP 8.5 remain
covered by CI configuration rather than these local runs.

Reviewed and signed off by claude-laravel-parity.
Port the current Laravel 13.x behavior associated with:
laravel/framework#57656
Source revision: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2

The custom File-rule message guard already existed, but its file-type
classification recognized only Hypervel uploads. Symfony files and uploads
therefore selected string-size messages or the generic File-rule error.
Recognize Symfony File consistently across message selection, required
checks, size calculation, and file validation.

Complete the earlier Hyperf-to-HttpFoundation migration: Symfony uploads
must receive the same failed-upload checks and PHP client-filename checks
as Hypervel's subclass. Update both compiled and delegated validation while
preserving the optimized size-comparison and presence-preflight paths.

Restore upstream File fixtures and all intended SVG File/upload and MIME
cases. Correct upstream SVG constructor arguments and ineffective MIME
fixtures, retain existing assertions, and add focused coverage for the
reproduced message, invalid-upload, and PHP-filename failures. Incorporate
the current failed-upload test call counts from part of:
laravel/framework#61117
The remainder of that PR is still tracked for its own parity review.

Correct the maximum-image-dimensions example from "at least" to "at most";
the same wording defect is present in Laravel docs at
2914ba0b06c6be40c2f1f992555853f6266707d6.

Validation: all four edited test files pass individually. Validation unit
ParaTest passes 1682 tests / 5812 assertions. Integration validation with
SQLite passes 263 cases / 271 assertions, with 167 other-driver skips.
Full source/type PHPStan, scoped PHP-CS-Fixer, and diff checks pass.
Peer review: claude-laravel-parity signed off the complete nine-file diff.
Report why queue:work stops in both console and JSON output. Preserve all
nine upstream reason descriptions, the stop status and exit code, nullable
metrics, memory rounding, timestamps, and quiet/silent suppression.

Port Laravel PR #61339 from the current 13.x implementation:
laravel/framework#61339
Source revision: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2

Resolve the command through the stopping event's existing worker options.
Graceful stopping runs outside the configured job coroutine context, and
the once-registered static listener must not retain the first command.
Reuse existing ownership without adding worker state or per-job work.
Keep native types, imported names, and the immutable clock.

Port both upstream integration tests and add focused coverage for distinct
command instances, nullable and zero metrics, JSON formatting, suppression,
and events without command-owned options. Document stop output and --json
at the worker command's public documentation surface.

Validation: integration file 18 tests / 58 assertions; new command file
6 / 29; Queue ParaTest suite 650 / 2724; affected Horizon, SQLite worker
lifetime, and Sentry tests 16 / 76. Scoped formatting, full source/type
PHPStan analysis, and diff checks pass. Database checks use SQLite.

Self-reviewed and signed off by claude-laravel-parity.
Port Laravel framework PR #61419 and its receiving/scheduler dependency
#57918 from the pinned 13.x source at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2:

laravel/framework#61419
laravel/framework#57918

Propagate visible and hidden context to process-driver tasks, including
deferred tasks, and to explicitly scheduled system commands. Preserve
Hypervel's coroutine driver as the default and its native in-worker
scheduling and background execution paths.

Use a base64-encoded serialized dehydration payload because upstream's
JSON encoding silently drops valid binary context. Receive the payload
in ConsoleServiceProvider before command handling, where the repository
belongs to the executing coroutine. Claim the startup payload before
hydrating so callbacks can invoke nested commands without hydrating
twice, and later worker-job coroutines cannot restore startup context.
Skip receiver registration for empty payloads and non-console startup.

Fix AI-020: the queue payload hook must run registered dehydration hooks
in fresh coroutines even when no context repository exists yet. Retain
the allocation-free path when neither context nor listeners exist and
capture the worker-safe dispatcher once during provider boot.

Declare concurrency's direct log dependency, port both upstream tests,
add focused binary transport, receiver lifecycle, eligibility, scheduler,
and fresh-coroutine regressions, and document the public context behavior.
Update transport-hook comments that incorrectly restricted them to jobs.

Validation: immediate changed-file PHPUnit runs; affected ParaTest suites
passed with 1616 tests and 5700 assertions before review-only corrections.
Final review checks passed: Concurrency 40/76, ConsoleServiceProvider 4/26,
ContextQueue 17/64. Full source/type PHPStan, scoped PHP-CS-Fixer,
concurrency Composer validation and git diff --check passed.

Self-reviewed and signed off by claude-laravel-parity.
Use Collection::diff() to remove exception classes from both reporting
exclusion lists and to remove exact provider names from the bootstrap file.
This replaces callback-based membership scans while preserving class-name
matching, reindexing, fluent returns and fuzzy provider removal.

Complete Laravel PR #60945 from the pinned current 13.x source:
laravel/framework#60945
Upstream source: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2

The PR's DefaultProviders::except() and JSON:API relationship-selection
changes are already present. Preserve Hypervel's resolved paths, atomic
provider-file replacement and permissions. Apply native callback types and
document the shared exception configuration's boot-time lifetime on both
the handler and its configuration wrapper.

Validation: affected ParaTest suite passes 104 tests / 316 assertions;
full source and type-fixture PHPStan, scoped formatting and diff checks pass.
No tests were added upstream; existing coverage includes exact/fuzzy
provider removal, file permissions and string/array exception inputs.
Peer review: claude-laravel-parity signed off on the final three-file diff.
The pre-package-uninstall callback retained Laravel's container array
access after Hypervel removed that API. Its child process failed before
dispatching the package event, and the best-effort warning allowed removal
to continue without running package cleanup such as Telescope's provider
removal.

Resolve the event dispatcher through the named container API and retain
the current Laravel process isolation, development-mode gate and failure
reporting. Preserve the dispatcher contract's mixed result. Narrow the
Composer operation to the UninstallOperation supplied by this event,
without adding runtime guards or changing public signatures.

Complete the current-source disposition of the full uninstall history:
- laravel/framework#57144 introduces the callback
  and provider-removal API; the provider implementation and all three
  upstream test assertions were already present.
- laravel/framework#57222 and
  laravel/framework#57226 are bootstrap fixes
  superseded by the process-based implementation, so no legacy branches
  are reintroduced.
- laravel/framework#58177 owns process isolation.
- laravel/framework#58338 owns the dev-mode gate.
- laravel/framework#58609 owns encompassing error
  reporting so cleanup failures do not prevent package removal.

Porting source: Laravel 13.x at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Add Composer as a development dependency for real package-event tests and
restore static analysis of ComposerScripts. Tests exercise successive
package removals, non-dev mode, normal and verbose failure output, and
suppression of the deliberate fixture exception through the bound handler.
Use an isolated Testbench runtime and restore all owned files and cwd.
Document the public script and package-listener APIs.

The newly available Composer types also exposed an obsolete Testbench
method-availability check. Keep its loaded-class check, remove the dead
compatibility condition and ignore, and extend the existing serve test to
verify timeout disabling while restoring Composer's timeout for every case.

Validation:
- Uninstall tests: 4 tests, 10 assertions.
- Affected ParaTest suites: 120 tests, 353 assertions.
- Serve command tests: 3 tests, 26 assertions.
- Testbench contract suite: 543 tests, 1655 assertions, 3 skips.
- Full source and type PHPStan checks, scoped formatting, Composer
  validation and git diff checks pass.

Peer-reviewed and signed off by claude-laravel-parity. Resolves parity
issues AI-019 and AI-022.
Expand the existing testing follow-up with the combined exception-object assertion and explicit matching semantics. Link the PHPUnit soft-deprecation so the later cleanup has its upstream rationale.

The parity session modernizes only test code it modifies; the suite-wide cleanup remains a follow-up. No source or tests changed. Validation: git diff --check.
Add totalSize(), totalPendingSize(), totalDelayedSize() and
totalReservedSize() across the supported queue drivers, QueueFake,
QueuePoolProxy and the generated Queue facade. Database totals use the
upstream state predicates. Redis totals retain virtual discovery and
per-queue size methods while pinning one pooled connection per operation.
With owner approval, Beanstalkd reads native server stats rather than
returning zero; buried jobs remain excluded consistently with size().

Complete the QueueFake bulk delay-attribute fix using Hypervel's existing
attribute resolver. Count its three disjoint inspection states without
duplicating delayed jobs in the aggregate.

Port all Redis Cluster bulk/discovery tests against Hypervel's existing
unified Lua batch dispatch and streamed key discovery. The owner approved
omitting scanQueueKeys(), bulkOnClusterConnection() and bulkPush(); record
those specific extension-point differences in source and the queue README.
Preserve numeric queue names as strings when deduplicating discovery.

Fix confirmed scan-prefix failures exposed by the port. SafeScan honors
the native prefix bit, including combined retry/prefix settings, without
double-prefixing key patterns. Cache member scans temporarily disable
prefix matching on their held connection and restore it in finally.
Keep native member-filtering behavior elsewhere, preserve the retry bit,
and exclude this connection-bound scope from proxy/facade forwarding.

Port every applicable upstream test and add focused coverage for pooled
extension-point dispatch, native Beanstalkd totals, queue-name identity,
scan flag combinations, exception cleanup and multi-page cache scans.
Document the public totals and scan behavior concisely.

Upstream PRs:
laravel/framework#61231
laravel/framework#61373
laravel/framework#60916
laravel/framework#61198
Ported from Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Validation: Queue units 659/2799; QueueFake 63/204; Redis units 671/2377
(two existing skips); Redis cache units 479/2312. Redis queue integration
46/269 on both standalone and Cluster; permanent cache flush/prune
integration 32/1279 on Cluster, with both files also passing standalone.
SafeScan regressions pass on both topologies. Full source/type PHPStan,
scoped project formatter, Queue/Redis facade lint and diff checks pass.
Beanstalkd uses real ServerStats fixtures; no local server is available.

Full combined diff independently reviewed and signed off by
claude-laravel-parity in Codesonic message
2026-09-06-191511-claude-laravel-parity-to-codex-laravel-parity-pr-61231-61373-60916-61198-combined-diff-approved.md.
Application::configurationIsCached() now honors the existing
config_loaded_from_cache binding and stores the first filesystem result.
This reflects the configuration actually loaded by bootstrap and avoids
repeated disk checks without adding another cache or invalidation mechanism.

Port Laravel PR laravel/framework#57665 using the
current 13.x implementation at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Preserve Hypervel's named container API and native boolean return type.

Verify bound true/false state and both filesystem memoization outcomes with
real applications and isolated files. Extend cached-state integration
coverage to assert the public helper agrees with the bootstrap flag.
Use the existing parallel temp-directory pattern and replace deprecated
exception expectations in the touched application tests.

WithCachedConfig test boots now take the environment bootstrap's cached
configuration early return and skip .env loading, matching Laravel and the
existing configuration documentation. Global test cleanup still clears
dotenv state between test methods; no environment-persistence assumption
or workaround is introduced.

Validation: Foundation suite (1412 tests), service providers, Testbench
cached state, config cache/clear commands, both changed test files,
full composer analyse, scoped composer lint:fix and git diff --check pass.
Reviewed and approved by claude-laravel-parity.
app_path() always appended app to the base directory, ignoring the
application's useAppPath() configuration. Model suggestions, generator
namespace selection, pruning and provider publish destinations could
therefore use the wrong directory.

Delegate to Application::path() when the application is available, matching
Laravel's helper. Preserve Hypervel's pre-bootstrap BASE_PATH fallback and
its existing failure message using the same pattern as sibling path helpers.
No new state, cache or consumer-specific workaround is introduced.

Discovered while revalidating the complete model-discovery port from
laravel/framework#57671 against Laravel 13.x source
01d008c9b5f32cb7c5e50a9a22273113d810b2a2. All six source changes in that PR
were already present; this fixes the shared Hypervel helper they consume.

Add real-application coverage for default/custom paths and suffixes, plus
the pre-bootstrap fallback with exception-safe container restoration.
Correct the pruning discovery test's false positive: its invalid class
names previously yielded no models and satisfied only negative assertions.
Exclude its database-dependent soft-delete fixture, which has dedicated
tests, and assert a real model and pruning count alongside every upstream
negative assertion. This also removes reliance on earlier tests' database
state. Modernize the touched file's deprecated exception expectation.

Validation: changed helper tests 41/75; pruning tests 10/27; affected
Foundation, Console and generator tests via ParaTest 2030/6350 (one skip);
SQLite model inspection 2/192; full composer analyse, scoped formatting,
missing-BASE_PATH failure probe and git diff --check pass.
Reviewed and approved by claude-laravel-parity. Tracks AI-026.
Complete the current Laravel factory insertion changes, including the
zero-count early return and test, generic model annotations, and current
hidden-attribute and array-cast assertions. Preserve the existing factory
relationship, callback, connection, and custom Eloquent builder behavior.

Fix two defects in the upstream insertion path: serializing made models can
omit visible-filtered attributes, and filling those values again applies
mutators twice. Prepare the made models directly, generate their unique IDs,
and merge one batch of timestamp defaults underneath their raw attributes.
Supplied timestamps, including null and values equal to model defaults,
remain intact. Retain virtual Eloquent insert dispatch for custom builders.

Share Hypervel's existing binary binding preparation with factories and all
three fill-and-insert methods. Without PDO LOB binding, PostgreSQL truncates
binary UUID values and SQLite binary lookups miss inserted rows. Expose the
existing Hypervel-owned helper without changing Laravel protected APIs or
the explicit BinaryParameter contract of raw query builder operations.

Add targeted regressions for setter and visibility corruption, timestamps,
unique IDs, custom builder dispatch and one-query insertion. Verify bulk
UUID/ULID writes and generated/supplied binary primary keys on SQLite and
PostgreSQL. Document the public factory insert behavior and binary support.

Upstream PRs:
laravel/framework#57670
laravel/framework#57600
laravel/framework#57722
laravel/framework#57794
laravel/framework#59780
laravel/framework#60911
Port source: Laravel 13.x 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Additional issue records: AI-027 and AI-028.

Validation: Database ParaTest 3507 tests; final factory file 78 tests;
binary integration 6 tests each on SQLite and PostgreSQL; full composer
analyse, scoped formatting, and git diff --check pass. Independently
reviewed and approved by claude-laravel-parity.
Remember the route-cache filesystem result on the application so repeated
bootstrap consumers use the same cached state. Preserve explicit true and
false bindings and Hypervel's native is_file() check, subprocess compilation,
and cached-route loading lifecycle.

Port the upstream bound-state test and cover both memoized outcomes across
filesystem changes and fresh application instances. Retain existing real-file
and path coverage, and share the isolated cache-directory fixture between
configuration and route tests with exception-safe cleanup.

Upstream:
laravel/framework#57623
laravel/framework#57687
Porting source: Laravel 13.x at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Related cached-config, nullable-state, cleanup, and parallel-database
follow-ups (#57663, #57708, #57785, #57826) were fully investigated and are
already covered by Hypervel's existing implementations and tests.

Validation: Application PHPUnit 60 tests / 197 assertions; affected
cached-state, route compilation/loading/reload, and parallel-database
ParaTest coverage 78 tests / 295 assertions. Full composer analyse passes
for source and type fixtures; scoped formatting and git diff --check pass.
Self-reviewed and approved by claude-laravel-parity.
Reconcile Laravel's original Unicode ucwords helper and its fluent
separator argument against current 13.x source. Both APIs and all six
upstream assertions per API are already present in Hypervel.

Correct the shared upstream defect where an empty separator string builds
an invalid regex character class. Delegate this supported no-delimiter
case to the existing UTF-8 ucfirst helper, capitalizing only the first
character without adding state or changing the normal separator path.

Extend the existing static and fluent tests with Unicode-sentence and
empty-input regressions. Add concise custom-separator examples to both
public documentation sections after checking the current Laravel docs.

Upstream PRs:
laravel/framework#57581
laravel/framework#57688
Source: laravel/framework 13.x at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Validation: both changed PHPUnit classes pass (354 tests, 1951 assertions);
Support ParaTest passes (2630 tests, 8568 assertions); full PHPStan source
and type checks, scoped formatting and git diff checks pass. Self-reviewed
and approved by claude-laravel-parity. Tracks parity issue AI-029.
Reconcile the APA and word-splitting helpers with Laravel 13.x at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2, including the complete current
Str and Stringable test additions discovered through that history.

Port Unicode-aware word wrapping, native PHP 8.4 first-letter casing,
and the public resetFactoryState API. Preserve Hypervel's native types,
Symfony UID factories, separate finite-input StrCache, and authoritative
test cleanup: flushState delegates to the narrow reset before flushing
macros. Document the reset's worker-wide effect and its testing usage.

Correct two defects shared by current Laravel:
- Hyphenated title and subtitle openings must receive the same APA
  capitalization exception as nonhyphenated opening words.
- Unicode word wrapping must encode existing separators before wrapping,
  and escape literal NUL/SUB bytes so the native break token cannot be
  confused with input. Keep the ASCII fast path and native wrapping
  primitive; remove the variable-length token search.

Merge all sixteen upstream test methods, the missing headline/studly
symbol assertions, and focused regressions. Restore the previous dump
handler in finally and use valid typed Symfony UUID/ULID fixtures.
Correct the missing semicolon in the documented word-wrap example.

Upstream PRs:
laravel/framework#49572
laravel/framework#56338
laravel/framework#60012
laravel/framework#60814
laravel/framework#60864
laravel/framework#57296
laravel/framework#61260

Verified existing follow-up source and test coverage:
laravel/framework#50114
laravel/framework#50335
laravel/framework#51428
laravel/framework#56796
laravel/framework#57254
laravel/framework#60056

Validation: changed test files pass 370 tests / 2,015 assertions;
Support, Translation, and Validation ParaTest pass 4,499 tests / 14,900
assertions. Full source and type-fixture PHPStan, scoped formatting,
and git diff --check pass. Independently reviewed and signed off by
claude-laravel-parity.
Port the current Laravel 13.x implementation and tests identified by:
laravel/framework#57698
laravel/framework#58962
Source revision: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Route the <=> operator through each driver's null-safe equality compiler
and remove SQLite's obsolete basic-clause override. Preserve all supported
morph relationship cases and merge the seven applicable upstream query
builder tests with existing null and raw-expression coverage.

Correct two upstream gaps during adaptation: RHS subqueries bypassed the
null-safe compiler, and JSON booleans either lost their driver-specific
casts or compared against an incorrectly bound scalar. Reuse the existing
dialect compilers with prepared expressions, preserving Hypervel's child
grammar, embedded timeout checks and binding order. Normalize SQLite's
literal booleans to 1/0 so IS compares equality instead of truthiness.

Keep Laravel public/protected APIs and Hypervel's pooled architecture;
no new worker state or database round trips. SQL Server remains unsupported.

Validation: Database ParaTest 3518 tests / 12464 assertions; both changed
files pass individually; full source/type PHPStan, scoped formatter and
diff check pass. Real SQLite execution also passes (1 test / 8 assertions).
The owner deferred committing that additional integration test to the next
checkpoint to keep this PR at 100 files; its source is preserved in
/tmp/hypervel-laravel-parity-57698/NullSafeEqualityTest.php.

Reviewed and approved by claude-laravel-parity.
Preserve logical SafeScan patterns even when their first segment matches
OPT_PREFIX. Only prepend the connection prefix when phpredis does not do
so; continue stripping physical result prefixes for subsequent commands.
The old input guess could scan and delete unrelated keys. Correct its
unit expectation and cover overlapping prefixes, option preservation and
wrong-key deletion on standalone Redis and Redis Cluster.

Consume __HYPERVEL_CONTEXT during console boot so descendants cannot
inherit a stale startup payload. Clear both configured environment
adapters and the native environment, including when PutenvAdapter is
disabled. Preserve initial-command hydration, callback reentry handling
and coroutine isolation; verify inheritance using a real subprocess.

Clarify logical scan patterns and the topology-specific Redis queue-name
storage suffixes. Document the reproduced PhpRedis 6.3.0 Cluster
tcp_keepalive crash without adding a Hypervel workaround. Its upstream
fix is 997d564521b3b95866c7747a971c4e357d8046e4.

Restore the real SQLite null-safe JSON comparison regression previously
held outside the checkpoint for the initial review's file limit. It
checks both APIs, selector forms, boolean/integer equality and null or
missing values. The owner lifted the limit for incremental review fixes.

Follow-up to these Laravel ports:
laravel/framework#61198
laravel/framework#57918
laravel/framework#61419
laravel/framework#57698
laravel/framework#58962

Reviewed by claude-laravel-parity after both external bot reviews.
Validation: full source/type PHPStan and formatting; 1456 focused unit
tests (2 skips), 238 standalone Redis consumer tests (8 skips), 90
Cluster consumer tests, and the restored SQLite regression. No committed
tests were skipped or weakened for the native extension failure found
when a standalone-only connector test was initially selected on Cluster.
The route-cache memoization port correctly retains the application boot decision, but the gRPC provider test created a placeholder cache file only after Testbench had booted without cached routes. This caused deterministic failures in both PHP 8.4 and PHP 8.5 CI.

Use Testbench defineCacheRoutes() to compile HTTP routes and reload the application before registering the gRPC provider. Preserve all assertions for bootstrap-owned isolated gRPC routes and verify the cached HTTP route still dispatches afterward. Let the existing helper own cache files and cleanup; remove the manual environment mutation and scratch directory.

Follow-up to the route-cache detection ports: laravel/framework#57623 and laravel/framework#57687. No framework source behavior changes.

Validation: changed class passes 26 tests / 78 assertions. Full composer test:parallel passes 34,814 tests / 125,524 assertions with 2,238 service/platform skips on PHP 8.4. Formatting and git diff --check pass. Self-reviewed and approved by claude-laravel-parity.
Describe execute() input as a logical key pattern whose bytes are preserved, including when they match OPT_PREFIX. The connection prefix is added separately. Replace ambiguous wording that could be read as forbidding supported overlapping logical prefixes.

Addresses the CodeRabbit outside-diff follow-up on backup PR #35. Documentation only; checked against execute() and the existing overlapping-prefix regression test. Scoped formatting and git diff --check pass.
Clarify that safeScan() and flushByPattern() accept logical key patterns and preserve their bytes even when they begin with OPT_PREFIX. Apply the same contract at the connection, proxy, and flush operation boundaries, and qualify the native SCAN prefix description for SCAN_PREFIX.

Completes the review follow-up to the SafeScan parameter clarification. Documentation only; verified against the forwarding paths and SafeScan implementation. Scoped formatting and git diff --check pass.
@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: 99ee0860-ada6-43c5-81e9-96754a757a14

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@binaryfire
binaryfire merged commit 13e00fd into 0.4 Sep 6, 2026
37 of 38 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant