Skip to content

Sync Laravel updates: #57685 → #57882 - #568

Merged
binaryfire merged 29 commits into
0.4from
laravel-parity-57685
Sep 7, 2026
Merged

Sync Laravel updates: #57685 → #57882#568
binaryfire merged 29 commits into
0.4from
laravel-parity-57685

Conversation

@binaryfire

Copy link
Copy Markdown
Member

Laravel updates

  • #57685, #61161, #61214 — Reconnect pooled Redis clients after primary-endpoint failover and connection failures. Invalidate READONLY and MASTERDOWN responses without requiring Sentinel. Preserve the original exception and replace the connection on its next acquisition. Retain Hypervel's no-replay policy: the command-retry feature from #61175 is intentionally omitted because a failed command may already have changed server state. Its applicable no-retry tests are included.
  • #61183 — Complete real-client coverage for exceptions thrown inside Redis transaction and pipeline callbacks. Verify that queued writes are discarded across the supported connection configurations. Keep genuine abandoned-transaction warnings, but stop reporting a handled callback failure as abandonment.
  • #61206, #61297, #61434 — Complete JSON:API request parsing and resource generation updates. Normalize non-string fieldsets and includes before parsing, preserve explicitly empty fieldsets, and clamp remaining include depth at zero. Remove the unused request import from generated resources and update the generated-class documentation to match.
  • #61438 — Release HTTP pending requests without waiting for cyclic garbage collection. Make the internal request, exception and dump callbacks static where they do not use the request instance. Preserve callbacks that intentionally capture user state.
  • #57706, #57709 — Order core service aliases consistently and memoize event-cache detection on the application. Honor explicit container overrides and keep cached event fixtures consistent with application boot state.
  • #57710 — Complete Redis lock compression coverage, including the missing compression levels and key-removal assertions. Run each configuration with a fresh application and pool, using the capabilities exposed by phpredis.
  • #54372, #60821 — Complete serialized Redis counter and enum-key regression coverage. Preserve Hypervel's atomic rate-limiter design and test successive admissions against the same limiter state. Cover enum decrement, reads and tagged-cache flushing through the real Redis store.
  • #57733, #56789, #56790, #56792, #56794, #56795, #56813, #56970 — Complete validation message replacement updates. Route the remaining duplicated rule replacements through the shared implementations so capitalized placeholders work consistently. Preserve mixed-case values, restore the current protected method visibility, and document placeholder capitalization.
  • #60918 — Add the array_keys rule, fluent builder, messages, documentation and upstream tests. Correct accepted-key comparisons for literal dots and asterisks across all four array-key rules. Preserve field identity through message formatting so values, labels and wildcard positions refer to the correct field, without temporary shared state.
  • #57735, #57761 — Document schema:dump prohibition and complete console command resolution coverage. Preserve the identity, aliases and prompt assertions while checking output from the command instance Hypervel actually executes.
  • #57767, #57847, Laravel docs #10912 — Document configuring HTTP exception truncation during provider registration. The callback must be registered before the exception handler is resolved; the existing per-request truncation behavior remains intact.
  • #57797, #48703 — Document middleware filtering in route:list and preserve middleware state when producing collapsed output. Resolve the display list without clearing worker middleware groups or caching group names as executable middleware. Keep normal request dispatch and expanded-listing behavior intact.
  • #57788 — Correct the @hasStack documentation: the block renders when the named stack contains content.
  • #57820, #57230, #58356, #58364, #58365, #58372, #61053 — Complete string-helper type annotations and the current upstream type fixture. Preserve conditional results for string and array inputs, scalar and Stringable inputs, and the narrowing provided by the string inspection helpers. Correct the upstream empty-needle position expectation and align the excerpt radius annotation with its integer contract.
  • #60746 — Return false from containsAll() for an empty set of needles. Preserve the single-pass implementation and the fluent delegates.
  • #60882 — Support Unicode case-insensitive replacement and removal. Preserve native behavior for ASCII and invalid byte sequences, keep the ASCII fast path, and avoid unnecessary validation and intermediate allocations. Include the complete upstream regression coverage.
  • #57856, #59509, #57997, #58006 — Complete date arithmetic and duration helpers. Add explicit overflow control to plus() and minus() for mutable and immutable dates, applying years before months. Preserve fractional durations with native interval fields and carry rounded remainders correctly, without changing global Carbon settings. Keep the integer paths and avoid copying immutable dates for zero calendar units. Document overflow control and the available duration helpers.
  • #57905 — Freeze the array-store test clock before incrementing a missing key so its expiry assertion uses one stable starting time.
  • #59251 — Port the current PHP 8.5 test corrections for encoded multibyte paths, quoted-printable soft breaks and locale-dependent word counts.
  • #57840 — Document fluent request input, including arrays of keys and defaults. Complete the assertions for nonempty defaults when input is absent or null.
  • #60151, #60202 — Reject mail addresses containing Unicode line separators before trimming or handing them to the mailer. Scan string addresses while retaining Symfony's validation for address objects. Port the current mailer and notification assertions using the supported Symfony exception contract.
  • #57800, #61126, #61139, #60023 — Complete global queue pause and resume controls, events, commands and documentation. Check the global pause key separately from per-queue keys to avoid Redis Cluster cross-slot reads. Preserve individually paused queues when global pause ends, batched per-queue checks, and valid queue names such as 0. Include the current command signature fixtures; the remaining changes from #60926 and #60928 are not included.
  • #61142 — Report paused and resumed queues in worker CLI and JSON output. Associate listeners with the active command and construct events only when listeners exist. Keep pause history bounded and reset it for a new worker run or queue selection.
  • #57860 — Complete native Redis backoff coverage for friendly names, numeric algorithms and invalid values. Make invalid Redis option exceptions inherit InvalidArgumentException, preserving the specific Hypervel exception class. Exercise real pooled connection acquisition and leave numeric fallback behavior with phpredis.
  • #57875 — Restore positive-integer annotations for lazy sliding-window size and step, and use a strict comparison between the integer operands. Existing validation and upstream cases are retained.
  • #57882 — Complete password-reset notification integration coverage with and without a default reset route. Cover default URLs, reset-link events, both customization callbacks and the missing-route error. Use Hypervel's guard-declared password brokers and existing callback cleanup.

Additional Hypervel fixes

  • Preserve literal commas, quotes and backslashes in validation rule parameters, and literal pipes when expanding composite rule objects. Apply the same correction to Data validation attributes and both database presence-check paths. Use standard CSV quoting and document the handwritten rule syntax.
  • Prevent wildcard messages and labels from treating literal dotted keys as nested paths. Preserve existing message-key syntax and fix strict-type errors when message or label maps contain numeric keys.
  • Include the Request import in each JSON:API method example, keeping the initial class example consistent with the generator.
  • Honor configured compression for values written through Redis cache Lua scripts. Use the native pack operation on the held connection instead of serialization alone, and preserve numeric values for pack_ignore_numbers. Correct the counter configuration documentation.
  • Initialize HTTP middleware configuration before route:list and Wayfinder inspect routes. This prevents unexpanded middleware groups from entering the dispatch cache and restores middleware-derived URL defaults in generated routes.
  • Treat a Stringable suffix as one value in endsWith() instead of casting its properties to an array. Align the corresponding static and fluent argument annotations.
  • Build Sleep intervals numerically so very small computed durations do not fail when PHP formats them in scientific notation. Preserve chaining, negative-duration handling, millisecond rounding and microsecond truncation.
  • Accept omitted or null names in nested mail recipient records, and allow Symfony address objects through returnPath() without losing their values.
  • Supply worker options during --once queue polling so pop listeners and pause output receive the same context as daemon polling.

Summary by CodeRabbit

  • New Features

    • Pause or resume all queues across connections with queue:pause --all and queue:resume --all.
    • Queue workers now report paused and resumed queue status.
    • Added the array_keys validation rule and fluent request input retrieval.
    • Date helpers support configurable month/year overflow and fractional intervals.
    • Route listings can be filtered by middleware.
  • Bug Fixes

    • Improved Redis compression and numeric handling.
    • Rejected email addresses containing line breaks.
    • Improved JSON:API fieldset and nested-include handling.
    • Strengthened validation for literal dotted and wildcard keys.
  • Documentation

    • Expanded guidance for queues, Redis, requests, routing, validation, dates, and migrations.

Invalidate synchronized READONLY and MASTERDOWN replies regardless of Sentinel configuration. Managed primary endpoints can move while an existing socket remains attached to a replica. Rebuild the native client on its next acquisition and propagate the original command failure without replay.

Port current Laravel reconnection coverage for standalone and Cluster clients, including cluster response errors and the INCR/SET-with-options no-retry cases. Preserve the established Hypervel policy excluding automatic command replay and command_retries; record that difference at the source/test boundaries and in the Laravel porting guide.

Laravel PRs:
laravel/framework#57685
laravel/framework#61161
laravel/framework#61175
laravel/framework#61214

Source: 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Validation: changed test files passed; Redis ParaTest passed (675 tests, 2497 assertions, two existing conditional skips); formatting, full source/types PHPStan and diff checks passed. Self-reviewed and signed off by claude-laravel-parity.
Port the real Redis callback-failure regression tests from Laravel #61183. Both transaction and pipeline cases retain all 13 applicable connection variants and assert that the original exception propagates, queued writes stay unapplied, and the next command succeeds.

Use the existing pooled connection cleanup instead of adding a native DISCARD recovery path. Translate persistent transport to pool ownership, retain compression client names at the top-level configuration boundary, and use the isolated test database and configured credentials.

Also fix misleading CRITICAL abandonment warnings during cleanup of already-invalidated operations (AI-035). Keep connection disposal unconditional and preserve diagnostics for genuinely abandoned MULTI, PIPELINE, and WATCH state. The new unit regression fails before the correction.

Upstream: laravel/framework#61183
Source: Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2
Historical merge: 62a35df888f5fc12efa5784bf3f4c48ea2f1fdaa

Validation: Redis units 676 tests / 2501 assertions (2 existing conditional skips); complete proxy integration class 41 tests / 422 assertions against isolated Redis; changed unit class passed separately; formatting and full source/type PHPStan passed. Self-reviewed and signed off by claude-laravel-parity.
Ignore array-valued JSON:API fieldsets and include parameters instead of
raising server errors, while retaining explicit empty-fieldset semantics.
Clamp the remaining include depth at zero so maxRelationshipDepth(0) does
not select trailing relationship segments through Arr::take's negative limit.

Remove the unused Request import from generated JSON:API resources and
apply native array types to their attribute and relationship properties.
Keep the documented generated class and property examples consistent.

Port all four upstream regression tests with Hypervel's native typing and
existing test lifecycle. Request parsing matches Laravel 13.x at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2; the encountered generator follow-up
uses 2009b316784f29f14e053a47e349c7f51aa1a901. The original #57646 relationship
port is already covered. The separately deferred #61322 remains untouched.

Upstream:
laravel/framework#61206
laravel/framework#61297
laravel/framework#61434

Validation: all four regressions failed before their fixes and pass after;
focused JSON:API and generator ParaTest suites pass (148 tests, 824
assertions); composer lint:fix, composer analyse and git diff --check pass.
Self-reviewed and independently signed off by claude-laravel-parity.
Port Laravel framework PR #61438 from 13.x at
cdbd17f7e3257e8ae4207d3c3bef6058452d5f72:
laravel/framework#61438

Make the constructor's stored request callback static so it does not
retain the PendingRequest through an implicit receiver binding. Correct
the same retention in default throw, callable throwUnless, dump and dd
callbacks; their bodies use explicit arguments or captures, not $this.
Preserve user-supplied callables, protected access and fluent APIs, and
apply native closure return types without adding cleanup machinery.

Add one deterministic regression based on the upstream PR's reproduction.
With cyclic GC disabled, a completed stubbed request using throwUnless
must be freed immediately after its owning references are unset. Restore
GC in finally. The test failed before the source correction and passes
afterward; existing callback, event and coroutine behavior stays covered.

Validation: HttpClientTest 368 tests / 842 assertions; focused client and
connection ParaTest 413 tests / 957 assertions; composer lint:fix,
composer analyse and git diff --check pass. Independently reviewed and
signed off by claude-laravel-parity.
Complete Laravel framework PRs:
laravel/framework#57706
laravel/framework#57709

Original merges: a6e9bb5287d3ec7b1c9a7d7e172460e6a0c1ec0b and
f0841232d3bd708b5282eefd468887549c7ff27e. Port from current 13.x source
at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Honor the events.cached container override and retain the first filesystem
result on the Application, matching config and route cache inspection.
Keep Hypervel's direct is_file path and application-owned lifetime; this
provides consistent boot state without adding invalidation machinery or
changing event cache publication and clearing commands.

Sort core service keys while preserving every alias mapping and inner
array order. Keep the Response class-key at its semantic service position.
Runtime aliases and abstractAliases are identical before and after sorting.

Port both upstream event-cache tests using real isolated files, retaining
all applicable assertions and checking false/true overrides, memoization,
fresh applications and file deletion. Reuse existing cleanup for the two
file-presence tests. Explicitly select cached state in two provider tests
whose fixture files are created after the application has booted. Preserve
the six upstream alias assertions with imported contracts and native types.

Validation: both new regressions failed before the source fix. Focused
application/event/container ParaTest: 454 tests, 1065 assertions, 10 existing
PHP 8.5-only skips on PHP 8.4. Changed test files pass individually; formatting,
full source/type PHPStan and diff checks pass. Independently reviewed and
signed off by claude-laravel-parity.
Complete the current Laravel lock-test surface for framework PR #57710. Restore Zstd maximum compression, Lz4 levels 3 and 12, and the assertions that force release and release remove the lock key. Preserve all Hypervel refresh and reacquisition coverage.

Use independent PHPUnit datasets so each compression level gets a fresh application and pool. Reuse the existing topology-aware connection fixture helper. Keep native phpredis capability guards: separate PECL compression extensions are not required. Whole Cache and Queue workflow coverage was already incorporated in 494aeff.

Upstream: laravel/framework#57710
Merge: ae006118ae027c86e3b34a47287114ceebb5eb03
Current 13.x source: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2

Validation: edited file 12 tests / 99 assertions on standalone Redis and three-node Cluster, with one unavailable-msgpack skip; focused standalone ParaTest 57 / 216; existing Cluster lock tests 14 / 40. Formatting and diff checks pass. Independently reviewed and signed off by claude-laravel-parity.
Use the existing held-connection pack helper for Lua cache values when compression is enabled without a native serializer. PhpRedis _serialize does not compress, so putMany and the three Any-tag writers stored uncompressed payloads despite configured compression. Raw-byte fallback during reads concealed the mismatch.

Preserve numeric types when packing so pack_ignore_numbers retains incrementable counters. Keep native-serializer handling, the uncompressed fast path, pooling and command counts unchanged. Correct the two misleading mock expectations, add real standalone/Cluster regressions for all four writers and numeric packing, and clarify both documented counter configuration alternatives.

Discovered while reconciling laravel/framework#53940. The current Laravel RedisStore::pack implementation at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2 supplies the same packing boundary; this fixes the Hypervel Lua adaptation. Full reconciliation of related PR #54372 remains separately tracked.

Validation: changed unit file 17 tests/35 assertions; new integration file 5/15 on standalone and Cluster; cache operation ParaTest 479/2312; focused integration ParaTest 41/133; RedisStore integration 22/45 with four existing skips. Full source/types PHPStan, repository formatting and diff checks passed. Self-reviewed and signed off by claude-laravel-parity.
Port the applicable current Laravel tests from PRs #54372 and #60821. Hypervel already normalizes tagged enum keys and uses a dedicated atomic rate limiter, so no production change is required.

Preserve the limiter admission assertions on one stored counter by varying policy cost instead of identity-defining capacity. Point the omitted cache-backed fixture to its native limiter test. Restore serialized increment coverage through a fresh pooled connection with the supported pack_ignore_numbers option, and port the enum decrement/read/tag-flush regression with its file-local fixture.

Upstream: laravel/framework#54372 (2d10f2aeddc94e57529a2fb33a50bed8810e3923) and laravel/framework#60821 (31a10a802f925098284d56e1f2bfddddfdd95811). Reconciled with 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Validation: immediate per-file tests and focused three-worker ParaTest passed (57 tests, 263 assertions, three existing separate-lock-store skips). All three files passed on Redis Cluster with identical counts. Formatting and diff checks passed; peer independently verified both topologies and signed off.
Route related validation message replacers through their shared upstream owners so all ten affected rules preserve original mixed-case values and expand uppercase and capitalized placeholders. Complete the related comparison and present-unless delegations and restore the two protected extension-point visibilities from current Laravel 13.x.

Port the complete remaining source changes from Laravel PRs:
laravel/framework#56789
laravel/framework#56790
laravel/framework#56792
laravel/framework#56794
laravel/framework#56795
laravel/framework#56813
laravel/framework#56970

Discovered while reconciling the already-present casing implementation and tests from:
laravel/framework#57556
laravel/framework#57564
laravel/framework#57733

Source reference: Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Keep Hypervel native types, useful array annotations and the strict string boundary in the shared comparison replacer. Both compiled and normal validation retain their existing failure-formatting path. Add ten real-validator regression cases without duplicating the existing upstream casing suite, and document supported placeholder capitalization using adapted Laravel localization prose.

Validation: ten regressions reproduced before the source fix; ValidationValidatorTest passes 795 tests / 2628 assertions; Validation ParaTest passes 1692 tests / 5832 assertions. Full source and type-fixture PHPStan, formatting and diff checks pass. Independently reviewed and signed off by claude-laravel-parity.
Port Laravel framework PR #60918 and documentation PR #11310 using
current 13.x source and tests:
laravel/framework#60918
laravel/docs#11310
Source baseline: 01d008c9b5f32cb7c5e50a9a22273113d810b2a2

Add the array_keys rule, fluent builder, unexpected-key replacements,
English translation and upstream documentation. Preserve every upstream
test assertion with Hypervel types, imports and existing enum fixtures.

Correct literal dot/asterisk key comparisons in all four array-key rules.
Accept encoded validator keys and literal direct-call keys, retaining
short-circuit lookups and inline bulk key encoding. Normalize empty parsed
parameters in the new fallback consistently with Arr::exists.

Keep encoded field identity throughout validation message formatting.
Premature decoding made supported literal names resolve as nested fields,
select incorrect numeric messages, lose wildcard labels and misreport
positions. Decode only for display, message keys, failed-rule output and
registered custom callbacks. Preserve custom rules' redirected messages.
No temporary state or compatibility machinery is introduced.

The owner approved the internal subclass-extension argument difference.
Document that contract in source; omit rare internal override guidance
from user documentation per the owner's explicit direction.

Validation: Validation ParaTest 1722 tests / 5903 assertions; integration
263 tests / 271 assertions with 167 service-dependent skips. Full source
and type PHPStan passed, formatting and diff checks passed. Independently
reviewed and signed off by claude-laravel-parity.
Port the remaining current Laravel assertions for eager command identity,
absent aliases, missing-input prompting and command-object execution.

Hypervel executes cloned command instances, so report the prompt flag and
exact argument values through the existing fixture output instead of
inspecting the original command. Preserve exit-code assertions and all
Hypervel-specific clone coverage without adding runtime hooks or shared
recorders.

Document DumpCommand::prohibit at schema squashing's public usage surface.
Its source implementation already prevents both dumping and pruning before
connection resolution. Current Laravel docs contain no corresponding guide.

Upstream:
laravel/framework#57761
laravel/framework#57735
Compared with current Laravel 13.x at
cdbd17f7e3257e8ae4207d3c3bef6058452d5f72.

Validation: ConsoleApplicationResolveTest (34 tests, 92 assertions), Console
ParaTest (521 tests, 1596 assertions), composer lint:fix and diff check pass.
Self-reviewed and signed off by claude-laravel-parity.
Port Laravel's current registered callback example so global truncation
settings take effect during bootstrap before lazy exception-handler
resolution. Preserve the per-request truncation example.

The source and complete current tests for immediate exception summaries,
once-only report-time recomputation and continued exception logging are
already present. Only the corresponding documentation correction was
missing.

Upstream:
laravel/framework#57767
laravel/framework#57847
laravel/docs#10912
Docs source: 2914ba0b06c6be40c2f1f992555853f6266707d6.

Verified the callback/setter APIs and bootstrap/reporting lifecycle. The
complete section matches current Laravel docs after namespace adaptation;
git diff --check passes. Self-reviewed and signed off by
claude-laravel-parity. No source or tests changed.
Route listing at normal or verbose output flushed the shared Router's
middleware groups and could cache group names as executable middleware.
Later listings and HTTP requests then reused corrupted worker state.
Resolve collapsed display middleware with an explicit empty group map,
sharing the existing alias, exclusion and priority resolution without
mutating the router or the route's executable caches.

Keep resolveMiddleware's existing signature and normal dispatch hooks.
Add the stateless no-group resolver and its facade annotation. Apply the
required native void type to the touched command handler without changing
its exit result. Document the existing --middleware substring filter and
how verbosity controls matching middleware within groups.

Complete the current-source assessment of Laravel PRs:
laravel/framework#57797
laravel/framework#48703
Source reference: 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Their current upstream tests already exist and remain intact; add a real
application regression for both cold and previously dispatched routes.

Validation: regression 2 tests/21 assertions; existing route-list tests
13/115; Foundation console 129/476; Routing 533/1738; route warmup 15/46.
Full source/type PHPStan, formatting and diff checks pass. Peer review
signed off the complete five-file change.
Console bootstrap does not resolve the HTTP kernel, which installs the
application's middleware groups, aliases and priority on the router.
route:list could therefore display unexpanded groups, miss middleware
filters and cache unresolved group names that break a later HTTP request.
Wayfinder likewise missed URL defaults supplied by grouped or aliased
middleware and generated required parameters instead of optional ones.

Resolve the application's HTTP kernel contract once when each command
runs, before inspecting middleware. Preserve custom kernel bindings,
existing signatures, route caches and the application-wide boot order.
This uses the existing configuration path without per-route resolution,
request overhead, cache invalidation or a new initialization mechanism.

Add a real-application route-list regression for kernel-configured aliases
inside groups, filtering and subsequent HTTP dispatch. Extend Wayfinder's
existing defaults coverage with kernel initialization and grouped routes,
preserving every original assertion. Bind the kernel contract in the
hand-built route-list fixtures and complete the touched fixture docblocks.

Found while reviewing the adaptation of Laravel route-list PRs:
laravel/framework#57797
laravel/framework#48703
The peer independently reproduced the console configuration gap in current
Laravel 13.x; Hypervel's persistent route cache also exposes a request
failure after listing. This is an adjacent correction, not another port.

Validation: route-list regression 3 tests/28 assertions, existing tests
13/115, Wayfinder defaults 10/28; Foundation console ParaTest 130/483 and
Wayfinder ParaTest 36/127. Full PHPStan source/type checks, formatting and
diff checks pass. Peer signed off with the fixture-title cleanup applied.
Port current Laravel 13.x string annotations and the complete Str type
fixture from 01d008c9b5f32cb7c5e50a9a22273113d810b2a2. Preserve native
Hypervel signatures, scalar and Stringable inputs, cache-free casing,
Symfony UUID types and existing worker-state behavior.

Return false when containsAll receives no needles, retaining one-pass
iteration and early failure. Treat a non-iterable endsWith needle as a
single value so Stringable objects use their string value, not properties.
Carry the complete numbers annotation and equivalent regex update.

Correct upstream position types to reflect mb_strpos's integer result
for empty needles. Keep prefix narrowing accurate for numeric inputs and
align fluent wrapper annotations. Describe excerpt radius as an integer:
fractional coercion is deprecated upstream and rejected by strict PHP;
do not introduce truncation behavior or a compatibility cast.

Retain all applicable upstream type assertions, correct the wrong position
expectation and cover scalar/Stringable inference, object suffix matching,
empty needles and the array/string numbers return types.

Laravel PRs:
laravel/framework#57230
laravel/framework#57820
laravel/framework#58356
laravel/framework#58364
laravel/framework#58372
laravel/framework#58365
laravel/framework#60746
laravel/framework#61053

Validation: SupportStrTest 228 tests / 1292 assertions; Support ParaTest
2647 tests / 8638 assertions; full source and 27 type-fixture analysis;
formatting and diff checks pass. Independently reviewed and signed off by
claude-laravel-parity, including the final numbers correction.
Explain that hasStack renders its body when the stack has content. The
previous sentence described the opposite condition. Source and every
current upstream test are already covered by the coroutine-backed stack
implementation; retain the existing example and runtime behavior.

Correct the upstream wording while reconciling:
laravel/framework#57788
laravel/docs#10913

Compared the current Laravel docs and compiler/stack tests, traced the
compiled negation and coroutine-local stack reads, and obtained final
peer signoff with the reviewed string-helper batch. Diff checks pass.
Port Laravel framework PR #60882 from 13.x source
01d008c9b5f32cb7c5e50a9a22273113d810b2a2:
laravel/framework#60882

Route case-insensitive replace() and remove() through the shared upstream
helper so Unicode case pairs match. Preserve positional replacements,
subject keys, literal replacement text, sequential matching, native ASCII
folding and whole-call byte behavior for malformed UTF-8 inputs.

Keep Hypervel's Traversable normalization and native typing. Check the
ASCII fast path before allocating normalized search arrays, and validate
input groups without copying every subject into a flattened array. Keep
the native PCRE failure behavior without fallback machinery.

Port all upstream assertions and the scalar-search/array-replacement error
test. Add regression coverage for malformed searches and replacements,
quoted patterns, literal replacement bytes, keyed inputs and missing
replacement values.

Validation: SupportStrTest (229 tests), Support ParaTest (2648 tests),
full source/type-fixture PHPStan, formatting and diff checks pass.
The final helper was benchmarked against current upstream and independently
reviewed and signed off by claude-laravel-parity.
Complete the current Laravel time-helper behavior in Hypervel's shared
mutable/immutable DateHelpers trait. Add the nullable overflow argument,
apply years before months, and preserve returned immutable instances.
Skip zero year/month operations to avoid unnecessary immutable copies.

Correct fractional seconds, minutes, hours and days that Carbon's default
fluent setters silently truncate. Construct whole units and rounded lower
fields with native calendar constants, carrying rounding into the requested
unit. Preserve calendar-day arithmetic, negative values, formatting and
microsecond precision without changing process-global Carbon settings.
Keep the existing integer construction paths.

Build Sleep selector intervals numerically so computed tiny durations do
not fail when Carbon parses PHP's scientific notation. Preserve chained
durations, negative clamping, millisecond rounding and microsecond
truncation. Native interval copying adds about 2-4 microseconds per Sleep
construction; avoid custom parsing or duplicated interval accumulation.

Port every current upstream plus/minus assertion and add focused immutable,
fractional-field, rounding, formatting and DST regressions. Extend existing
Sleep cases instead of duplicating them. Correct factual interval docblocks
and document the public overflow option and fractional duration helpers.

Upstream PRs:
laravel/framework#57856
laravel/framework#59509
laravel/framework#57997
laravel/framework#58006
Porting source: Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Additional corrections: AI-044 (fractional intervals), AI-045 (Sleep).

Validation: Support ParaTest 2683 tests / 8717 assertions; Cache ParaTest
1462 tests / 5434 assertions with two unavailable-msgpack skips. All changed
test classes pass individually. Full PHPStan source and type fixtures,
formatting and diff checks pass. Self-reviewed and peer signed off.
Port the current Laravel regression setup for incrementing a missing cache
key. Freeze time before construction and retain the captured immutable date
when advancing ten years, preserving every upstream assertion.

Hypervel's permanent-entry sentinel already bypasses expiration checks;
this completes upstream test parity without changing cache source behavior.

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

Validation: CacheArrayStoreTest 55 tests / 110 assertions; Cache ParaTest
1462 tests / 5434 assertions with two unavailable-msgpack skips. Formatting
and diff checks pass. Self-reviewed and peer signed off with the time batch.
Port all three test corrections from Laravel framework PR #59251 using
13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2:
laravel/framework#59251

Use the percent-encoded multibyte path fixture, discard the quoted-printable
soft-break marker when extracting an embedded image Content-ID, and compare
locale-dependent Cyrillic word counts with the native PHP result. Preserve
all other cases and assertions, including explicit character-list counts.
Add native return types to the touched path test methods and callbacks.

The mail correction completes current test fidelity for the embedded-image
fix in laravel/framework#57726. Its later CID-based
rendering and in-memory attachment corrections are already implemented and
covered: laravel/framework#58173 and
laravel/framework#60361.

Validation: each changed test file passed immediately; the combined request,
path, string, mail and notification run passed 441 tests / 2126 assertions.
Full formatter changed zero files; git diff --check passed. Peer review
signed off on the complete five-file tests/documentation batch. No source
behavior changed; local validation used PHP 8.4.23.
Complete the public documentation and default-value coverage for Laravel
framework PR #57840:
laravel/framework#57840

The current 13.x implementation at
01d008c9b5f32cb7c5e50a9a22273113d810b2a2 and all three upstream assertions
were already present. Add two assertions showing that a nonempty default
is used for both null and absent input, preserving the existing assertions.

Document property access, default values and selecting an array of input
keys beside the other request input getters. Laravel's local documentation
at 2914ba0b06c6be40c2f1f992555853f6266707d6 has no corresponding section;
use concise public-facing prose without framework implementation details.

Validation: HttpRequestTest passed 152 tests / 624 assertions. The combined
six-class selection passed 441 tests / 2126 assertions; full formatter and
git diff --check passed. Peer reviewed and signed off on the final batch.
No production code or API behavior changed.
Reject line breaks in raw mail addresses before Symfony normalizes them,
including array recipients, sender overrides, return paths and mailable
address construction. Preserve the current Laravel helper boundaries and
all applicable upstream mailer and validator regression assertions.

Port Laravel PRs:
laravel/framework#60151
laravel/framework#60202
Source: Laravel 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Adapt the guard to scan strings only: required Symfony Mime ^8.1 already
validates immutable Address objects. Keep the exact current Symfony test
exception instead of compatibility expectations for unsupported releases.
Use native types and correctly typed view mocks with ArrayTransport.

Also fix AI-046: nested recipient records with omitted or null names now
use the shared nullable-name construction path, and returnPath accepts and
preserves supported Symfony Address instances. Add focused regressions for
these type defects and independently normalized address entry points.

Validation: each changed test file passes; ParaTest Mail 277 tests/1161
assertions, Validation 1722/5904, and mail integration consumers 23/57.
Full source/type PHPStan and formatting pass on PHP 8.4.23. Self-reviewed
and signed off by claude-laravel-parity; no user-documentation changes.
Add pauseAll/resumeAll and queue:pause/queue:resume --all using the current
Laravel 13.x implementation at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.
Global resume leaves individually paused queues unchanged. Read the global
cache key separately before the existing per-queue batch so cluster proxies
do not receive the cross-slot batch fixed upstream. Keep Laravel cache keys
for interoperability, pooled cache access, native types, named container
resolution and listener guards without adding worker-held pause state.

Preserve the supported queue name "0" with explicit null/empty argument
checks instead of upstream's truthiness check. Keep the queue:continue alias,
disabled-pause gate and existing worker interruption behavior.

Port every applicable current manager/command regression and both command
signature fixtures, including Hypervel's existing dispatcher option. Add
focused global/individual state, alias, disabled-global and zero-name checks.
Import the public --all documentation from the pinned Laravel docs, retaining
Hypervel's established primary command spelling.

Upstream PRs:
laravel/framework#57800
laravel/framework#61126
laravel/framework#61139
laravel/framework#60023

Validation: Queue and Console ParaTest suites pass (1198 tests, 4464
assertions), full WorkCommand integration class passes with SQLite
(18 tests, 58 assertions), and the final command-test correction passes
(11 tests, 44 assertions). Full source/type-fixture PHPStan and formatting
pass on PHP 8.4.23. Self-reviewed and signed off by claude-laravel-parity.
Port Laravel #61142 from 13.x at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2:
laravel/framework#61142

Add worker pause/resume events and CLI/JSON status output with native types,
guarded dispatch, and static listeners resolving the current command.
Keep pause history on the worker across fresh polling coroutines and reset
it for each daemon run. Limit history to the current connection and queue
selection so programmatic reuse cannot falsely report another queue resumed.
Returning to a previous selection reports its current paused state again.

Seed WorkerOptions coroutine context during once-mode polling, matching the
daemon and job paths while preserving caller context through finally cleanup.
This also corrects JobPopping and JobPopped listener context under --once.
Document the public output behavior and cover selection transitions, listener
absence, daemon reuse, command cloning, output formats and suppression.

Validation: Queue ParaTest 671 tests / 2839 assertions; SQLite command
integration 18 / 58; worker resource-lifetime integration 3 / 25. Full source
and type-fixture PHPStan checks, formatting and diff checks pass. Independently
reviewed and approved by claude-laravel-parity.
Port Laravel framework PR #57860 from 13.x source 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

InvalidRedisOptionException now extends InvalidArgumentException, restoring the upstream invalid-backoff contract while retaining the specific exception for all invalid Redis option configuration. Document the parser exception without changing its mapping or native retry policy.

Merge all current PhpRedisBackoffTest cases into the existing pooled RedisConnectorTest: six friendly names, six numeric algorithms, invalid numeric fallback and invalid-name failure. Acquire the pooled connection to exercise native client creation, preserve per-worker database isolation, and skip the standalone-only class for Cluster. Existing Redis-backed cache workflow and cache tests already cover the rest of the PR.

Validation: real standalone connector tests 22/49; Redis unit ParaTest 676/2501 (two existing skips); full source/type PHPStan and formatting pass. Self-reviewed and approved by claude-laravel-parity.

Upstream: laravel/framework#57860
Complete Laravel framework PR #57875 using 13.x source 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

Restore positive-int annotations for LazyCollection::sliding size and step, which native int types cannot express. Use a strict comparison for the two integer operands while retaining the existing lazy generator and newInstance behavior. Collection validation and every upstream invalid-argument test were already present.

Validation: Collection and LazyCollection ParaTest 784 tests / 2451 assertions; full source/type PHPStan and formatting pass. Self-reviewed and approved by claude-laravel-parity.

Upstream: laravel/framework#57875
Complete Laravel framework PR #57882 using 13.x source 01d008c9b5f32cb7c5e50a9a22273113d810b2a2. The notification subject was already current; integration coverage was missing.

Merge all four default-route tests and port the full three-test class without a default route. Verify default reset URLs, reset-link events, both notification callbacks, and the missing-route exception. Both upstream fixtures register routes explicitly and apply to Hypervel despite the absence of Auth::routes().

Preserve the existing Hypervel event-rebinding tests, use AuthTestUser with the guard-declared password broker, compare the actual user identifier, and let the framework subscriber reset global callbacks. Retain upstream message text and URL assertions without adding a shared fixture base or compatibility code.

Validation: immediate SQLite tests 6/15 and 3/5; Auth integration ParaTest 56/140 (seven unconfigured-service skips); formatting and full source/type analysis pass for the batch. Self-reviewed and approved by claude-laravel-parity.

Upstream: laravel/framework#57882
Keep encoded attribute identity through inline, fallback and translated
message matching, and decode only for exact lookup and final display.
Wildcard-bearing segments must match whole attribute segments, so foo.*
cannot select the literal key foo.bar. Preserve existing literal-parent,
partial-wildcard and translated multi-segment matching without introducing
new message-key syntax or mutable lookup state.

Normalize numeric source keys before string matching in both local lookup
loops. PHP converts numeric array keys to integers; strict string calls
previously threw for root-list custom messages and wildcard labels.

Extend regression coverage for all message sources, literal parents,
partial wildcards, numeric keys, labels, positions and size-message types.
Add Request imports to all four JSON:API method examples while preserving
the generated-class example and stub.

Follow-up to the array_keys and attribute-identity port:
laravel/framework#60918
Addresses the message-matching and documentation findings on backup PR #36.
The separately proposed rule-serialization changes are not included.

Validation: changed test file and full Validation ParaTest suite pass;
both composer analyse configurations, composer lint:fix and diff checks
pass. The two numeric-key regressions failed before the correction.
Array keys, date formats and bounds, numeric field references, and string
prefixes or suffixes could be split at commas. Existing quoted builders
also lost parameter boundaries when a value ended with a backslash.
Composite rule expansion split literal pipes into additional rules.

Use standard CSV with doubled quotes and literal backslashes throughout
the builders and native parser. Align Unique's ignored-ID serialization
and remove backslash stripping from both the delegated and compiled
presence-check consumers. Existing where filters now retain their values.

Expand Date, Numeric and StringRule through their constraint arrays rather
than joining and splitting strings. Preserve constraint ordering and
deduplication without adding an iterator or collection contract.

Fix the same writer defect in Data validation attributes: retain normalized
parameter boundaries until serialization, prefix named fields before
quoting, and preserve regex, reference, enum, date and null handling.

Document the approved handwritten CSV syntax change. Quotes inside quoted
parameters are doubled rather than backslash-escaped. Composite subclasses
that customize only __toString() must customize the constraint-array path
when changing the rules consumed by Validator.

This completes the literal-key correction found while reviewing the port
of laravel/framework#60918. No additional upstream
PR is claimed by these fixes.

Validation: focused changed tests, the Validation and Data ParaTest suites,
SQLite compiled/delegated presence-check integration tests, both PHPStan
configurations, formatting and diff checks pass. Other database drivers
receive the inherited regression cases in CI; they were not run locally.
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 110 files, which is 10 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: f3482624-a150-4d7e-9154-7e92800bef8f

📥 Commits

Reviewing files that changed from the base of the PR and between 13e00fd and 859ea23.

📒 Files selected for processing (110)
  • src/cache/src/Redis/Support/Serialization.php
  • src/collections/src/LazyCollection.php
  • src/data/src/Support/Validation/RuleDenormalizer.php
  • src/docs/blade.md
  • src/docs/cache.md
  • src/docs/eloquent-resources.md
  • src/docs/helpers.md
  • src/docs/http-client.md
  • src/docs/migrations.md
  • src/docs/porting-from-laravel.md
  • src/docs/queues.md
  • src/docs/redis.md
  • src/docs/requests.md
  • src/docs/routing.md
  • src/docs/validation.md
  • src/foundation/src/Application.php
  • src/foundation/src/Console/RouteListCommand.php
  • src/foundation/src/Console/stubs/resource-json-api.stub
  • src/http/src/Client/PendingRequest.php
  • src/http/src/Resources/JsonApi/JsonApiRequest.php
  • src/mail/src/Mailables/Address.php
  • src/mail/src/Message.php
  • src/queue/src/Console/PauseCommand.php
  • src/queue/src/Console/ResumeCommand.php
  • src/queue/src/Console/WorkCommand.php
  • src/queue/src/Events/QueuesPaused.php
  • src/queue/src/Events/QueuesResumed.php
  • src/queue/src/Events/WorkerQueuePaused.php
  • src/queue/src/Events/WorkerQueueResumed.php
  • src/queue/src/QueueManager.php
  • src/queue/src/Worker.php
  • src/redis/src/Exceptions/InvalidRedisOptionException.php
  • src/redis/src/RedisConnection.php
  • src/routing/src/Router.php
  • src/support/src/Facades/Queue.php
  • src/support/src/Facades/Route.php
  • src/support/src/Sleep.php
  • src/support/src/Str.php
  • src/support/src/Stringable.php
  • src/support/src/Traits/DateHelpers.php
  • src/support/src/functions.php
  • src/translation/lang/en/validation.php
  • src/validation/README.md
  • src/validation/src/Concerns/FormatsMessages.php
  • src/validation/src/Concerns/ReplacesAttributes.php
  • src/validation/src/Concerns/ValidatesAttributes.php
  • src/validation/src/Rule.php
  • src/validation/src/Rules/ArrayKeys.php
  • src/validation/src/Rules/ArrayRule.php
  • src/validation/src/Rules/Date.php
  • src/validation/src/Rules/Numeric.php
  • src/validation/src/Rules/StringRule.php
  • src/validation/src/Rules/Unique.php
  • src/validation/src/ValidationData.php
  • src/validation/src/ValidationRuleParser.php
  • src/validation/src/Validator.php
  • src/wayfinder/src/GenerateCommand.php
  • tests/Cache/CacheArrayStoreTest.php
  • tests/Cache/Redis/Support/SerializationTest.php
  • tests/Console/CommandSignatureTest.php
  • tests/Console/ConsoleApplicationResolveTest.php
  • tests/Console/Fixtures/FakeCommandWithArrayInputPrompting.php
  • tests/Console/Fixtures/FakeCommandWithInputPrompting.php
  • tests/Console/Fixtures/command_signatures.php
  • tests/Console/Scheduling/QueuePauseCommandTest.php
  • tests/Data/Attributes/Validation/ValidationAttributeTest.php
  • tests/Foundation/Console/RouteListCommandMiddlewareTest.php
  • tests/Foundation/Console/RouteListCommandTest.php
  • tests/Foundation/FoundationApplicationTest.php
  • tests/Foundation/Http/Middleware/ValidatePathEncodingTest.php
  • tests/Foundation/Support/Providers/EventServiceProviderTest.php
  • tests/Http/HttpClientTest.php
  • tests/Http/HttpRequestTest.php
  • tests/Integration/Auth/ForgotPasswordTest.php
  • tests/Integration/Auth/ForgotPasswordWithoutDefaultRoutesTest.php
  • tests/Integration/Cache/Redis/PhpRedisCacheLockTest.php
  • tests/Integration/Cache/Redis/RedisCacheIntegrationTest.php
  • tests/Integration/Cache/Redis/RedisStoreTest.php
  • tests/Integration/Cache/Redis/SerializationIntegrationTest.php
  • tests/Integration/Generators/ResourceMakeCommandTest.php
  • tests/Integration/Http/Resources/JsonApi/JsonApiRequestTest.php
  • tests/Integration/Mail/SendingMarkdownMailTest.php
  • tests/Integration/Queue/WorkCommandTest.php
  • tests/Integration/RateLimiter/Redis/RedisStoreTest.php
  • tests/Integration/Redis/RedisConnectorTest.php
  • tests/Integration/Redis/RedisProxyIntegrationTest.php
  • tests/Integration/Validation/Database/ValidationBatchDatabaseCheckerTestCase.php
  • tests/Mail/MailMailerTest.php
  • tests/Mail/MailMessageTest.php
  • tests/Mail/MailableAlternativeSyntaxTest.php
  • tests/Queue/QueuePauseResumeTest.php
  • tests/Queue/QueueWorkerTest.php
  • tests/Queue/WorkCommandTest.php
  • tests/Redis/PhpRedisClusterConnectionTest.php
  • tests/Redis/RedisConnectionTest.php
  • tests/Support/SleepTest.php
  • tests/Support/SupportCarbonImmutableTest.php
  • tests/Support/SupportCarbonTest.php
  • tests/Support/SupportIntervalFunctionsTest.php
  • tests/Support/SupportStrTest.php
  • tests/Validation/ValidationArrayKeysRuleTest.php
  • tests/Validation/ValidationArrayRuleTest.php
  • tests/Validation/ValidationDateRuleTest.php
  • tests/Validation/ValidationNumericRuleTest.php
  • tests/Validation/ValidationRuleParserTest.php
  • tests/Validation/ValidationStringRuleTest.php
  • tests/Validation/ValidationUniqueRuleTest.php
  • tests/Validation/ValidationValidatorTest.php
  • tests/Wayfinder/GenerateCommandTest.php
  • types/Support/Str.php

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


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

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped: 110 files exceed the limit of 100.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@binaryfire
binaryfire merged commit 586ef3b into 0.4 Sep 7, 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