Skip to content

Sync Inertia and Slack updates and fix worker lifecycle issues - #61

Merged
binaryfire merged 20 commits into
0.4from
upstream-sync-framework-19
Oct 10, 2026
Merged

binaryfire merged 20 commits into
0.4from
upstream-sync-framework-19

Conversation

@binaryfire

@binaryfire binaryfire commented Oct 10, 2026 •

Copy link
Copy Markdown
Member

Upstream Updates

  • Inertia deferred callbacks — Run deferred callbacks on Inertia redirects. Keep version-mismatch reloads and failed responses from running callbacks that require a successful response.
  • Inertia previous locations — Add opt-in previous-location tracking for Inertia visits, including the previous route name. Exclude prefetches, precognitive requests and same-component partial reloads. Build back redirects before recording the visit so empty responses don't redirect to themselves.
  • Inertia BigInt support — Preserve integers outside JavaScript's safe range as native BigInt values in props and flash data. Add the configuration option and per-response API, and decode the marked values back to ordinary integers in test assertions. Document the matching client requirement.
  • Inertia graceful SSR shutdown — Add inertia:stop-ssr --graceful. An unreachable SSR server can be treated as already stopped, while an unhealthy response or a health check blocked by destination policy still fails. Preserve Hypervel's health check before shutdown and document the option.
  • Compare the Slack notification channel against the current 3.x source and tests. Restore missing routing and Block Kit Builder assertions, align test names, consolidate duplicate select coverage, and correct callback types and validation wording. Update the Slack documentation, package differences and recorded upstream checkpoint.

Additional Hypervel Fixes

  • Pool FTP and SFTP disks so concurrent operations borrow separate connections. Sharing one adapter between coroutines could terminate the worker when two operations used its socket at once. Reuse the existing bounded whole-driver pools, including connection cleanup on purge, and document pool sizing and the callback APIs for raw adapter access.
  • Release pooled connections as soon as a download is fully buffered, including buffered byte ranges. Slow consumers can read their downloaded data without holding an idle connection, and disk-to-disk transfers reuse an existing buffer. Live streams keep their leases until closed; range contents, seeking and sizes are preserved.
  • Cache immutable class metadata in the opt-in big-integer encoder instead of reflecting over each object's class hierarchy repeatedly. The cache holds one boolean per encountered class, never response values or object instances, and participates in the existing test cleanup.
  • Recompute Fortify passkey settings and Horizon's name, Redis connection and prefix when worker configuration is rebuilt. Record the derivation instead of replaying values copied from the server's original configuration.
  • Stop Telescope from forcing cache events on. Respect stores configured with events: false and let failover stores use their backing stores' events, avoiding duplicate cache entries.
  • Preserve a coroutine test's original failure when leftover child coroutines reach the time limit. An expected exception must still fail the test if its children remain blocked; skipped, incomplete and otherwise passing tests retain timeout handling.
  • Give Slack webhook requests bounded connection and request timeouts, with application overrides. Treat attachment field titles such as Date and Count as strings instead of invoking PHP functions with those names. Document webhook URL routing and attachment messages for compatible services separately from Slack's Web API setup.
  • Replace deprecated PHPUnit exception-message assertions with their exact or partial-match equivalents. Keep malformed JWT date tests compatible with the dependency's updated exception handling. Record the remaining test-title and return-type cleanup tasks.
  • Add selective tracking of Hyperf Engine and the Hyperf runtime packages for applicable coroutine, pooling and Swoole fixes, with mappings to Hypervel's independently maintained components.

The affected suites, formatting and static analysis pass. FTP and SFTP were also checked against local servers: concurrent reads succeed with separate pooled connections, and purging the pool closes them.

Note

Add Inertia BigInt preservation and previous-URL storage, pool FTP/SFTP disks, and fix stream lease handling

  • Adds big-integer preservation to Inertia: PHP integers outside JavaScript's safe range become marker objects in props and flash data, with a global preserve_big_integers config (env INERTIA_PRESERVE_BIG_INTEGERS) and a per-response preserveBigIntegers() opt-in/out in Response.php using the new PreservesBigIntegers trait. AssertableInertia decodes the markers back to integers for assertions.
  • Adds optional previous-URL storage for Inertia visits in Middleware.php, controlled by the disabled-by-default store_previous_url setting. Only session-backed GET AJAX route visits are stored; prefetches, Precognition requests, and matching partial reloads are excluded.
  • Registers new EnsureDeferredCallbacksRun middleware, prepended to the global HTTP kernel stack, so deferred callbacks run on 409 client-side redirects.
  • Pools FTP and SFTP disks as whole adapters via FilesystemManager.php, and unifies stream lease handling in releaseOrWrapStream: buffered reads release the driver lease immediately; live streams keep the lease via LeasedStream until closed.
  • Behavioral Changes: inertia:stop-ssr gains a --graceful option and succeeds when the SSR server is unreachable; SlackAttachment.field no longer invokes callable string titles (e.g. Date) as callbacks and callbackId now defaults to null; SlackWebhookChannel gets a bounded HTTP client (10s connect, 30s total); Telescope no longer enables cache-store events via CacheWatcher; the coroutine test runner preserves the original failure when a child coroutine hits the time limit.

Macroscope summarized 2913864.

Ports inertiajs/inertia-laravel #915, #888 and #904. They share the
middleware tests, the Inertia config file and the frontend
documentation, so they land together.

#915: Inertia answers fragment redirects and Inertia::location() with a
409 response that tells the client to perform the redirect itself.
Deferred callbacks only run after responses below 400, so callbacks
registered with defer() were skipped even though the request
succeeded. A new EnsureDeferredCallbacksRun middleware, prepended to
the global middleware stack by the service provider, marks the pending
callbacks to always run on these responses. Asset version mismatch
reloads and failed responses still skip them. The middleware's own
per-request cost is within benchmark noise.

#888: The new store_previous_url option makes the Inertia middleware
store the URL and route name of Inertia visits as the session's
previous location, which the session middleware skips for AJAX
requests. Only GET visits are stored; prefetch requests, precognitive
requests and partial reloads of the rendered component are excluded.
Applications may override shouldStoreCurrentUrl() to change which
visits are stored. Upstream's Laravel 11 compatibility checks are not
ported.

#904: The new preserve_big_integers option, or preserveBigIntegers()
on a single response, sends integers outside JavaScript's safe range
in props and flash data as {"$bigint": "..."} markers and flags the
page, so the Inertia client (3.8 or later) revives them as native
BigInt values. It is disabled by default.

Hypervel adaptations:

- Hypervel encodes the root view's page JSON with JSON_THROW_ON_ERROR,
  so the self-referencing object and pure enum tests expect that JSON
  error where upstream renders false.
- frontend.md gains Previous URL and Big Integers sections, adapted
  from inertiajs/docs cf513d8ffc.

Upstream reference: inertiajs/inertia-laravel 3.x at 4da52b72da.

Validation: upstream tests ported to MiddlewareTest,
InertiaServiceProviderTest, PropsResolverTest and ResponseFactoryTest,
plus the Inertia suite and PHPStan.
Ports inertiajs/inertia-laravel #917. inertia:stop-ssr fails when the
SSR server is not running, which breaks deployment scripts that stop
the server before it has ever started. With --graceful, the command
reports that the server is not running and exits successfully instead.

Only an unreachable server counts as not running. When something
answers on the SSR URL with an unhealthy response, the command still
fails, with or without --graceful, as upstream's tests require.

Hypervel adaptation: the command already checks health before shutting
the server down, because the HTTP client cannot tell a refused
connection from the official SSR server closing the connection without
replying to /shutdown. A new HttpGateway::checkHealth() returns the
health result and throws ConnectionException when the server cannot be
reached, so the command can tell an unreachable server from an
unhealthy response. isHealthy() wraps it and still returns false for
both.

vite.md documents stopping the SSR server and the --graceful option,
adapted from inertiajs/docs cf513d8ffc.

Upstream reference: inertiajs/inertia-laravel 3.x at 4da52b72da.

Validation: upstream tests ported to StopSsrTest, plus the Inertia
suite and PHPStan.
Ports inertiajs/inertia-laravel #918. When a page preserves big
integers, its props and flash data carry {"$bigint": "..."} markers, so
assertInertia() and inertiaProps() saw the markers rather than the
integers passed to the response. AssertableInertia now turns the
markers back into integers when the page sets preserveBigIntegers, so
tests assert against the original values. Pages without the flag keep
any marker-shaped data the application sends itself.

Upstream reference: inertiajs/inertia-laravel 3.x at 4da52b72da.

Validation: upstream tests ported to AssertableInertiaTest, plus the
Inertia suite and PHPStan.
Give prepareMockEndpoint() the required method title, describing the
given or example middleware it registers.
AGENTS.md requires a title docblock on every method except test* methods
and a native return type on test methods, but most older tests omit them.
Agents follow the surrounding code over the written rule, so new tests
keep reproducing the gap until review catches it. Record the owner's
request for one sweep of each, about 8,400 untitled methods in 1,600
files and 5,600 untyped test methods in 490 files, followed by an
automated check that keeps the code and the rule aligned.
Bring the isolated Inertia changes onto the current framework baseline before reconciling Slack. Keep the pending test title and return-type follow-ups, while retaining 0.4's removal of the completed exception-message migration task.
PHPUnit deprecates expectExceptionMessage(), which matches any
substring. Replace the eight remaining calls with the explicit
alternatives, keeping what each test meant to check.

Use expectExceptionMessageIs() for the notification serialization and
streaming timeout messages, which the tests expect in full. Keep partial
matching with expectExceptionMessageIsOrContains() where the expected
text is part of a longer message: the Inertia view wrapper, the two
database read pool messages and the Curl host fragments.

Validation: each changed test file passes on its own.
Compare the Block Kit contracts, blocks, composites, elements and
default ID generation with laravel/slack-notification-channel 3.x at
7b7c3e220a4f7a45cd88d65069f28d4fb4b67281, together with their unit
tests.

Every remaining source difference is a deliberate Hypervel fix or
adaptation: static return types, Slack limits counted in characters,
filters that keep '0' values, UTF-8-safe truncation, verbatim select
option values, the select placeholder and option count limits, select
action IDs seeded from their text, and generated IDs capped at 255
characters.

Correct inherited wording: imperative titles for TextObject::markdown()
and ConfirmObject::danger(), the PlainTextOnlyTextObject::$text
docblock copied from $type, and the SectionBlock error, which now asks
for at least one field rather than one block. Type the remaining
callbacks.

Every upstream unit test case and assertion is present. Rename the
upstream-derived test methods to the camelCase form of their upstream
names so later syncs can match them, which also fixes a header text
length test that was named after the block ID. Remove two
UsersSelectElementTest cases already covered by StaticSelectElementTest,
and add titles to SelectOptionTest's data providers.

Validation: the Slack suite (208 tests), the Horizon LongWaitDetected
test, composer lint:fix and composer analyse pass.
Compare the webhook and Web API channels, messages, router, provider,
tests and documentation with laravel/slack-notification-channel 3.x
(7b7c3e220a4f7a45cd88d65069f28d4fb4b67281) and Laravel docs 13.x
(226b0649c77e1d6fe739a20e1da654e94ccc718f).

Fixes:
- SlackAttachment::field() used is_callable(), so titles that name PHP
  functions, such as "Date" or "Count", were called instead of used as
  titles. Only closures are now treated as field builders.
- Webhook sends used a Guzzle client with no request timeout, so a
  stalled host held the send indefinitely. The provider now gives the
  webhook channel 10-second connect and 30-second request timeouts;
  applications can replace the client and attachment messages can
  override options with http().

Upstream alignment:
- Restore the legacy message docblock, the nullable callback ID default
  and the inlined Web API URL; type the remaining callbacks.
- Rename upstream-derived tests to upstream's names and order, restore
  the router's channel-string case, the Block Kit Builder URL
  assertions and the shared helper's Content-Type check, and reuse the
  shared notifiable fixture in the router tests.

Documentation:
- Restore Laravel's installation and Slack App wording, document the
  webhook URL and false routes with an Incoming Webhooks section, and
  label the scopes, token and HTTP connection as Web API settings.
- Record the verbatim select option value difference in the README and
  set the Slack sync checkpoint.

Validated with the Slack suite, Horizon's LongWaitDetectedTest,
composer lint:fix and composer analyse.
Add Engine followed by the Hyperf monorepo with the owner-selected November 1, 2025 history boundary. Record selective runtime review scope and source mappings while preserving Hypervel architecture and Laravel-style APIs. Consult Engine Contract only when an Engine change requires it.
Bring the unpublished Inertia and Slack improvements onto the current framework base before adding independent framework fixes. Preserve both branches' Testing TODO entries and retain the updated HTTP streaming tests with their exact exception assertions.

Validated with the affected Inertia, Slack, notifications, HTTP streaming and database read-pool tests: 1,139 tests, 3,922 assertions and six skips. The branch remains at 66 changed files against 0.4.
When a coroutine test threw while child coroutines it started were still
blocked, the runner waited for those children until the test's time
limit and then reported only "This test was aborted after N seconds".
The assertion failure or error that caused the problem was lost.

If the test method returned or threw before the deadline and its
children are what reached the limit, the runner now rethrows the test's
own exception. Failures and errors are reported with their original
message. An exception the test expected would otherwise make PHPUnit
pass the test, so the runner keeps it and a post-condition fails the
test, naming the leftover children with the expected exception as the
cause. Skipped and incomplete tests never reach post-conditions, so
they keep the time-limit abort. Passing tests that leave children
running still time out, and children are not cancelled earlier than
before.

The time-limit fixture covers failures, errors, expected exceptions
and assertion failures, and skipped and incomplete tests, each with
children still running at the limit, and checks that tearDown() still
runs. Expected-exception tests whose children finish in time still
pass, with the children completing normally.

Verified with TimeLimitTest, composer lint:fix, composer analyse and
the full composer test:parallel suite, plus mutation checks that
disabling the rethrow or the skipped/incomplete exclusion fails the
new cases.
Fortify derived its passkey settings from the application URL and key, and Horizon filled a missing name from the application name. Both wrote the results into configuration while the server booted, and the configuration tracker replayed those values literally into every worker. A worker whose environment changed the URL, key or application name kept the server's values. Horizon also selected its Redis connection once from the boot-time configuration.

Run each through configureUsing() so every worker derives it again from its rebuilt configuration. Values the application sets explicitly still take precedence.

Add regression tests that replay the boot-time mutations into rebuilt configurations. Each fails before the fix. Formatting, static analysis and the Fortify and Horizon suites pass.
Cache repositories dispatch events by default. A store opts out with "events" set to false, and the failover repository turns off its outer events because its backing stores dispatch them. When the cache watcher was enabled, Telescope instead set "events" to true on every configured store while the application registered. That re-enabled stores the application had deliberately quieted and recorded every failover operation twice. The change was also boot-time configuration that workers did not derive again, and it relied on a static flag.

Register the watcher's listeners directly and leave store configuration alone. Remove the static flag and its test-state cleanup.

Add regression tests for a failover store recording each operation once and for a store with events disabled recording nothing. Both fail before the fix. The disabled-watcher test now asserts that no cache entries are recorded instead of inspecting configuration. Formatting, static analysis and the Telescope suite pass.
Each FTP and SFTP adapter holds one open connection. Under Swoole's
coroutine hooks, two coroutines using the same disk at once read or write
the same socket, and Swoole kills the worker with "Socket#N has already
been bound to another coroutine". Separate adapters do not interfere.

Add both drivers to the whole-driver pooled drivers, so each operation
borrows a disk with its own connection. The existing pool proxy already
keeps streams leased until closed, loads listings inside the borrow and
blocks raw access outside it. Purging the pools destroys idle disks, and
the adapters' destructors close their connections.

The filesystem docs explain the pooling and the per-worker connection
count, the README records the difference from Laravel, and the porting
guide now covers raw access on every pooled disk, including S3 and GCS.

Validated against local FTP and SFTP servers: eight concurrent reads
through a shared disk crash the worker before this change and all
succeed after it, and purging closes every connection. The filesystem
suite, lint and static analysis pass.
@coderabbitai

coderabbitai Bot commented Oct 10, 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: Repository: hypervel/components-backup/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 17f40295-0912-40b7-b56c-6db70ff0db37

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
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Sync Inertia and Slack behavior; fix pooled disks and worker lifecycle

🐞 Bug fix ✨ Enhancement 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Add Inertia redirect callbacks, previous-location tracking, BigInt preservation, and graceful SSR
 shutdown.
• Reconcile Slack behavior and coverage; bound webhook timeouts and document webhook routing.
• Fix connection sharing, rebuilt worker configuration, cache-event recording, and coroutine test
 failures.
Diagram

graph TD
  A["Inertia request"] --> B["Inertia middleware"] --> C{"Response type"}
  C -->|client redirect| D["Deferred callbacks"]
  C -->|page response| E["Response encoding"] --> F["Client page"]
  B -->|eligible visit| G["Session location"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Handle redirects in the deferred-callback runner
  • ➕ Centralizes callback execution decisions for every response.
  • ➖ Requires changing shared framework behavior for an Inertia-specific 409 response and its headers.
2. Pool FTP and SFTP connections inside adapters
  • ➕ Could preserve an unpooled disk wrapper.
  • ➖ Requires adapter-specific leasing and cleanup instead of reusing bounded whole-driver pools.

Recommendation: Keep the scoped changes: Inertia middleware recognizes its own redirect protocol, while whole-driver pooling matches FTP/SFTP adapters' connection ownership. Review the BigInt serialization boundary and PHPUnit post-condition particularly closely because both alter behavior across multiple representation or failure paths.

Files changed (83) +2152 / -513

Enhancement (7) +293 / -5
StopSsr.phpAllow graceful shutdown of an absent SSR server +16/-2

Allow graceful shutdown of an absent SSR server

• Adds --graceful and succeeds only when the SSR health request cannot connect; an unhealthy response still fails.

src/inertia/src/Commands/StopSsr.php

Middleware.phpStore eligible Inertia visits as previous locations +53/-0

Store eligible Inertia visits as previous locations

• Stores the full URL and route name for eligible GET visits. Excludes prefetch, precognitive, and same-component partial requests and exposes an override point.

src/inertia/src/Middleware.php

PreservesBigIntegers.phpEncode unsafe JavaScript integers without precision loss +148/-0

Encode unsafe JavaScript integers without precision loss

• Recursively marks out-of-range integers in arrays and serializable objects while preserving JSON shapes and avoiding infinite traversal of object cycles.

src/inertia/src/PreservesBigIntegers.php

Response.phpApply BigInt preservation to page responses +33/-1

Apply BigInt preservation to page responses

• Adds a per-response override, encodes resolved props and flash data when enabled, and signals preservation in the page payload.

src/inertia/src/Response.php

ResponseFactory.phpPass the BigInt setting into rendered responses +1/-0

Pass the BigInt setting into rendered responses

• Uses the configured preservation default when constructing an Inertia response.

src/inertia/src/ResponseFactory.php

HttpGateway.phpDistinguish unreachable SSR from unhealthy SSR +15/-2

Distinguish unreachable SSR from unhealthy SSR

• Adds a health check that propagates connection failures while treating HTTP request failures as unhealthy; the existing boolean health API remains available.

src/inertia/src/Ssr/HttpGateway.php

AssertableInertia.phpDecode BigInt markers for test assertions +27/-0

Decode BigInt markers for test assertions

• Converts marked props and flash data back to PHP integers when asserting a preservation-enabled response.

src/inertia/src/Testing/AssertableInertia.php

Bug fix (11) +140 / -78
FilesystemManager.phpPool FTP and SFTP drivers +1/-1

Pool FTP and SFTP drivers

• Adds FTP and SFTP to the existing whole-driver proxy pool selection, preventing concurrent coroutines from sharing an adapter connection.

src/filesystem/src/FilesystemManager.php

FortifyServiceProvider.phpRecompute passkey settings on configuration rebuild +13/-13

Recompute passkey settings on configuration rebuild

• Registers passkey derivation as a configuration mutation callback so rebuilt workers use their current URL, key, and Fortify settings.

src/fortify/src/FortifyServiceProvider.php

RunTestsInCoroutine.phpPreserve test failures when child coroutines time out +45/-4

Preserve test failures when child coroutines time out

• Retains an original thrown failure after the test root completes; a post-condition fails tests whose expected exception otherwise matched despite blocked children. Skipped, incomplete, and normally passing tests retain timeout reporting.

src/foundation/src/Testing/Concerns/RunTestsInCoroutine.php

HorizonServiceProvider.phpReplay Horizon configuration derivation +9/-6

Replay Horizon configuration derivation

• Recomputes the default Horizon name and Redis selection when worker configuration is rebuilt rather than replaying server-derived values.

src/horizon/src/HorizonServiceProvider.php

InertiaServiceProvider.phpWrap global requests with deferred-callback middleware +3/-2

Wrap global requests with deferred-callback middleware

• Prepends the new callback middleware to the HTTP kernel while retaining the existing redirect-method middleware.

src/inertia/src/InertiaServiceProvider.php

EnsureDeferredCallbacksRun.phpRun deferred callbacks after client-directed redirects +57/-0

Run deferred callbacks after client-directed redirects

• Marks pending callbacks to run for Inertia's successful 409 redirect responses, excluding version-mismatch reloads and unrelated failures.

src/inertia/src/Middleware/EnsureDeferredCallbacksRun.php

SlackAttachment.phpAvoid invoking attachment titles as PHP functions +3/-2

Avoid invoking attachment titles as PHP functions

• Treats only Closure field titles as builders, so strings such as Date and Count remain field titles; makes an unset callback ID nullable.

src/slack-notification-channel/src/Messages/SlackAttachment.php

SectionBlock.phpCorrect section validation wording +2/-2

Correct section validation wording

• Changes the missing-content error to refer to fields rather than blocks and types field serialization.

src/slack-notification-channel/src/Slack/BlockKit/Blocks/SectionBlock.php

SlackChannelServiceProvider.phpBound Slack webhook request durations +7/-0

Bound Slack webhook request durations

• Provides webhook channels with a Guzzle client configured for 10-second connection and 30-second request timeouts, subject to application replacement.

src/slack-notification-channel/src/SlackChannelServiceProvider.php

TelescopeServiceProvider.phpStop Telescope from overriding cache event settings +0/-14

Stop Telescope from overriding cache event settings

• Removes registration-time cache configuration mutation so stores retain their configured event behavior.

src/telescope/src/TelescopeServiceProvider.php

CacheWatcher.phpObserve cache events without forcing them on +0/-34

Observe cache events without forcing them on

• Registers cache listeners without a process-global enable flag and removes the method that enabled events on every store.

src/telescope/src/Watchers/CacheWatcher.php

Refactor (10) +19 / -21
LongWaitDetected.phpType the legacy Slack attachment callback +2/-1

Type the legacy Slack attachment callback

• Adds the concrete attachment parameter and void callback return type to Horizon's long-wait notification.

src/horizon/src/Notifications/LongWaitDetected.php

SlackWebhookChannel.phpType webhook payload transformation callbacks +2/-2

Type webhook payload transformation callbacks

• Specifies attachment and field callback inputs and array results without changing webhook payload structure.

src/slack-notification-channel/src/Channels/SlackWebhookChannel.php

ActionsBlock.phpType Actions Block builder callbacks +4/-4

Type Actions Block builder callbacks

• Adds explicit callback return types for buttons, selects, and serialized elements.

src/slack-notification-channel/src/Slack/BlockKit/Blocks/ActionsBlock.php

ContextBlock.phpType Context Block builder callbacks +3/-3

Type Context Block builder callbacks

• Adds explicit callback return types for image, text, and element serialization.

src/slack-notification-channel/src/Slack/BlockKit/Blocks/ContextBlock.php

SelectElement.phpType select payload filter input +1/-1

Type select payload filter input

• Adds an explicit mixed input type to the select element's optional-field filter.

src/slack-notification-channel/src/Slack/BlockKit/Elements/Selects/SelectElement.php

StaticSelectElement.phpType static-select serialization callbacks +2/-2

Type static-select serialization callbacks

• Adds explicit types to option mapping and optional-field filtering.

src/slack-notification-channel/src/Slack/BlockKit/Elements/Selects/StaticSelectElement.php

UsersSelectElement.phpType users-select payload filter input +1/-1

Type users-select payload filter input

• Adds an explicit mixed input type to optional-field filtering.

src/slack-notification-channel/src/Slack/BlockKit/Elements/Selects/UsersSelectElement.php

SlackChannel.phpAlign Slack Web API endpoint use +1/-3

Align Slack Web API endpoint use

• Inlines the chat.postMessage URL while retaining the named HTTP connection and its request behavior.

src/slack-notification-channel/src/Slack/SlackChannel.php

SlackMessage.phpType Block Kit message serialization +3/-3

Type Block Kit message serialization

• Adds types to block serialization and optional-field filtering and clarifies the Block Kit Builder URL description.

src/slack-notification-channel/src/Slack/SlackMessage.php

AfterEachTestSubscriber.phpRemove obsolete cache watcher state reset +0/-1

Remove obsolete cache watcher state reset

• Stops calling the removed CacheWatcher static-state flush after tests.

src/testing/src/PHPUnit/AfterEachTestSubscriber.php

Tests (41) +1485 / -396
DatabaseReadPoolTest.phpModernize database pool exception assertions +2/-2

Modernize database pool exception assertions

• Uses partial-message assertions for errors that include additional context.

tests/Database/DatabaseReadPoolTest.php

FilesystemManagerTest.phpVerify FTP and SFTP use disk pool proxies +18/-0

Verify FTP and SFTP use disk pool proxies

• Adds parameterized coverage that both connection-holding drivers resolve through whole-driver pooling.

tests/Filesystem/FilesystemManagerTest.php

FortifyServiceProviderTest.phpTest passkey settings after configuration replay +33/-0

Test passkey settings after configuration replay

• Verifies rebuilt worker settings derive from the new application URL and key while honoring explicit Fortify values.

tests/Fortify/FortifyServiceProviderTest.php

HorizonConfigTest.phpTest Horizon defaults against rebuilt configuration +84/-0

Test Horizon defaults against rebuilt configuration

• Checks that name, Redis host, and prefix are recalculated for worker configuration and explicit names remain intact.

tests/Horizon/HorizonConfigTest.php

CurlStreamingHandlerTest.phpModernize connection-error message assertion +1/-1

Modernize connection-error message assertion

• Uses PHPUnit's partial-message assertion for variable connection error text.

tests/Http/Client/CurlStreamingHandlerTest.php

HttpClientStreamingTest.phpUse exact streaming timeout assertions +2/-2

Use exact streaming timeout assertions

• Replaces deprecated exception-message assertions with exact matches for header timeout errors.

tests/Http/HttpClientStreamingTest.php

StopSsrTest.phpCover graceful and unhealthy SSR shutdown cases +46/-2

Cover graceful and unhealthy SSR shutdown cases

• Distinguishes unreachable servers from servers returning unhealthy responses and checks graceful exit codes and console output.

tests/Inertia/Commands/StopSsrTest.php

PrecognitiveRequestMiddleware.phpAdd precognitive visit test fixture +27/-0

Add precognitive visit test fixture

• Marks requests with the Precognition header so previous-location exclusion can be exercised.

tests/Inertia/Fixtures/PrecognitiveRequestMiddleware.php

StorePartialReloadsMiddleware.phpAdd partial-reload override fixture +20/-0

Add partial-reload override fixture

• Overrides partial-reload detection to test that applications can include these visits.

tests/Inertia/Fixtures/StorePartialReloadsMiddleware.php

WithoutPreviousLocationMiddleware.phpAdd previous-location opt-out fixture +20/-0

Add previous-location opt-out fixture

• Overrides visit eligibility to test application-level suppression of previous-location storage.

tests/Inertia/Fixtures/WithoutPreviousLocationMiddleware.php

InertiaServiceProviderTest.phpVerify global deferred-callback middleware registration +16/-3

Verify global deferred-callback middleware registration

• Checks that the callback middleware precedes other global middleware and the existing redirect middleware remains registered.

tests/Inertia/InertiaServiceProviderTest.php

MiddlewareTest.phpCover visit tracking and redirect callback boundaries +349/-0

Cover visit tracking and redirect callback boundaries

• Tests previous URL and route storage, excluded visit types, and override hooks. Also verifies callbacks run for client redirects but not version reloads or failures.

tests/Inertia/MiddlewareTest.php

PropsResolverTest.phpExercise BigInt encoding across JSON representations +150/-2

Exercise BigInt encoding across JSON representations

• Covers integer boundaries, nested and shared objects, serializable values, internal classes, cycles, and disabled preservation.

tests/Inertia/PropsResolverTest.php

ResponseFactoryTest.phpTest BigInt defaults, overrides, and flash data +92/-4

Test BigInt defaults, overrides, and flash data

• Checks marked flash values, per-response opt-in and opt-out, and the preservation flag on initial pages.

tests/Inertia/ResponseFactoryTest.php

AssertableInertiaTest.phpVerify BigInt assertion decoding +28/-0

Verify BigInt assertion decoding

• Confirms marked props and flash assert as integers, while application-created markers remain unchanged without preservation.

tests/Inertia/Testing/AssertableInertiaTest.php

NotificationTransportSerializationTest.phpModernize transport exception assertions +2/-2

Modernize transport exception assertions

• Uses exact PHPUnit exception-message checks for detached streams and unsupported notification bodies.

tests/Notifications/NotificationTransportSerializationTest.php

NotificationSlackChannelTest.phpProtect webhook attachment field titles +50/-6

Protect webhook attachment field titles

• Adds a regression test for Date and Count field titles and types existing webhook test callbacks and helpers.

tests/SlackNotificationChannel/NotificationSlackChannelTest.php

NotificationTransportQueueTest.phpType notification queue test helpers +5/-3

Type notification queue test helpers

• Adds an application parameter type, callback return type, and documentation for queued transport fixtures.

tests/SlackNotificationChannel/NotificationTransportQueueTest.php

SlackChannelTest.phpAlign Web API feature callback types and route names +18/-17

Align Web API feature callback types and route names

• Types feature-test callbacks and clarifies the configured-route test name without changing delivery expectations.

tests/SlackNotificationChannel/Slack/Feature/SlackChannelTest.php

SlackMessageTest.phpRestore and align Block Kit message assertions +144/-181

Restore and align Block Kit message assertions

• Aligns feature test names and assertions with upstream coverage, including copied templates, mixed block ordering, and Builder URLs without channel or username data.

tests/SlackNotificationChannel/Slack/Feature/SlackMessageTest.php

SlackChannelTestNotifiable.phpShare a notifiable across Slack route tests +11/-6

Share a notifiable across Slack route tests

• Expands the fixture's route types to include webhook URIs and disabled routes, allowing router and Web API tests to share it.

tests/SlackNotificationChannel/Slack/Fixtures/SlackChannelTestNotifiable.php

SlackChannelTestNotification.phpDocument and type the Slack notification fixture +10/-1

Document and type the Slack notification fixture

• Adds fixture method descriptions and a void return type for its default builder callback.

tests/SlackNotificationChannel/Slack/Fixtures/SlackChannelTestNotification.php

TestCase.phpAssert Slack requests include JSON content type +10/-3

Assert Slack requests include JSON content type

• Extends the shared Web API request assertion to check the Content-Type header and documents test properties.

tests/SlackNotificationChannel/Slack/TestCase.php

ActionsBlockTest.phpAlign Actions Block test names +7/-7

Align Actions Block test names

• Renames existing serialization, validation, and element tests to describe their assertions.

tests/SlackNotificationChannel/Slack/Unit/Blocks/ActionsBlockTest.php

ContextBlockTest.phpAlign Context Block test names +7/-7

Align Context Block test names

• Renames existing element and validation tests to match their behavior.

tests/SlackNotificationChannel/Slack/Unit/Blocks/ContextBlockTest.php

DividerBlockTest.phpClarify Divider Block test names +3/-3

Clarify Divider Block test names

• Renames serialization and block-ID tests without changing their assertions.

tests/SlackNotificationChannel/Slack/Unit/Blocks/DividerBlockTest.php

HeaderBlockTest.phpClarify Header Block test names +4/-4

Clarify Header Block test names

• Corrects names for heading-length and block-ID assertions.

tests/SlackNotificationChannel/Slack/Unit/Blocks/HeaderBlockTest.php

ImageBlockTest.phpAlign Image Block test names +8/-8

Align Image Block test names

• Renames image URL, alt-text, title, and block-ID tests for their actual constraints.

tests/SlackNotificationChannel/Slack/Unit/Blocks/ImageBlockTest.php

SectionBlockTest.phpAlign Section Block tests with validation wording +12/-12

Align Section Block tests with validation wording

• Updates the expected missing-field error and clarifies names for field, text, accessory, and block-ID tests.

tests/SlackNotificationChannel/Slack/Unit/Blocks/SectionBlockTest.php

ConfirmObjectTest.phpClarify confirmation object test names +10/-10

Clarify confirmation object test names

• Renames existing confirmation text, button, truncation, and style tests.

tests/SlackNotificationChannel/Slack/Unit/Composites/ConfirmObjectTest.php

PlainTextOnlyTextObjectTest.phpClarify plain-text object test names +4/-4

Clarify plain-text object test names

• Renames serialization, length, and emoji behavior tests.

tests/SlackNotificationChannel/Slack/Unit/Composites/PlainTextOnlyTextObjectTest.php

TextObjectTest.phpClarify text object formatting tests +8/-8

Clarify text object formatting tests

• Renames existing Markdown, emoji, length, and verbatim-format tests.

tests/SlackNotificationChannel/Slack/Unit/Composites/TextObjectTest.php

ButtonElementTest.phpClarify button element tests and callback types +17/-17

Clarify button element tests and callback types

• Renames button limit, styling, and confirmation tests and types builder callbacks.

tests/SlackNotificationChannel/Slack/Unit/Elements/ButtonElementTest.php

SelectOptionTest.phpDocument select option data providers +9/-0

Document select option data providers

• Adds descriptions for valid and invalid option value providers.

tests/SlackNotificationChannel/Slack/Unit/Elements/Selects/SelectOptionTest.php

UsersSelectElementTest.phpRemove duplicate generated-ID coverage +0/-15

Remove duplicate generated-ID coverage

• Drops generated action-ID tests already covered in the shared select element suite.

tests/SlackNotificationChannel/Slack/Unit/Elements/Selects/UsersSelectElementTest.php

SlackChannelServiceProviderTest.phpTest webhook timeout defaults and overrides +31/-0

Test webhook timeout defaults and overrides

• Verifies the registered webhook client's bounded timeouts and that applications can replace the client binding.

tests/SlackNotificationChannel/SlackChannelServiceProviderTest.php

SlackNotificationRouterChannelTest.phpReuse Slack route fixtures in router tests +9/-28

Reuse Slack route fixtures in router tests

• Uses the shared notifiable for webhook, URI, Web API, and disabled routes and removes a duplicate fixture.

tests/SlackNotificationChannel/SlackNotificationRouterChannelTest.php

CacheWatcherTest.phpTest quiet and failover cache stores +19/-19

Test quiet and failover cache stores

• Replaces static event-enable tests with checks that quiet stores produce no entries and failover operations produce one.

tests/Telescope/Watchers/CacheWatcherTest.php

DisabledWatcherTest.phpAssert disabled cache watchers record nothing +8/-13

Assert disabled cache watchers record nothing

• Tests observable recording behavior rather than the removed cache configuration mutation.

tests/Telescope/Watchers/DisabledWatcherTest.php

TimeLimitFixture.phpExercise test failures with pending child coroutines +101/-3

Exercise test failures with pending child coroutines

• Adds fixture cases for skips, incomplete tests, original failures, expected exceptions, and children that finish after the root.

tests/Testing/PHPUnit/Fixtures/TimeLimitFixture.php

TimeLimitTest.phpVerify timeout cause and teardown behavior +90/-3

Verify timeout cause and teardown behavior

• Runs expanded PHPUnit fixtures in subprocesses, checking reported failures, successful child completion, and teardown events.

tests/Testing/PHPUnit/TimeLimitTest.php

Documentation (12) +142 / -11
todo.mdRecord remaining test convention sweeps +2/-0

Record remaining test convention sweeps

• Adds follow-up tasks to title existing helper methods, add missing test return types, and enforce both conventions automatically.

docs/todo.md

filesystem.mdDocument connection-holding disk pools +4/-2

Document connection-holding disk pools

• Explains whole-disk FTP/SFTP pooling, per-worker connection limits, and lease and purge behavior.

src/docs/filesystem.md

frontend.mdDocument Inertia previous locations and BigInt values +58/-0

Document Inertia previous locations and BigInt values

• Explains opt-in previous-location tracking, visit exclusions, BigInt configuration and response overrides, client requirements, and assertions.

src/docs/frontend.md

notifications.mdSeparate Slack webhook guidance from Web API setup +54/-4

Separate Slack webhook guidance from Web API setup

• Documents URL and disabled routing, incoming webhooks, legacy attachment messages, and webhook timeout overrides.

src/docs/notifications.md

porting-from-laravel.mdExplain borrow-scoped filesystem adapter access +2/-0

Explain borrow-scoped filesystem adapter access

• Identifies pooled drivers and directs applications to callback-based access instead of retaining raw drivers, adapters, or clients.

src/docs/porting-from-laravel.md

vite.mdDocument graceful SSR shutdown +6/-0

Document graceful SSR shutdown

• Describes inertia:stop-ssr and its --graceful behavior for deployment scripts.

src/docs/vite.md

README.mdDescribe FTP and SFTP whole-disk pooling +1/-1

Describe FTP and SFTP whole-disk pooling

• Clarifies why connection-holding adapters are pooled whole and why raw access remains borrow-scoped.

src/filesystem/README.md

README.mdRecord intentional Slack select-value difference +4/-0

Record intentional Slack select-value difference

• Documents that Hypervel preserves select option values instead of normalizing them as upstream does.

src/slack-notification-channel/README.md

SlackMessage.phpIdentify the legacy attachment message type +8/-1

Identify the legacy attachment message type

• Adds documentation distinguishing attachment-based messages from Block Kit messages.

src/slack-notification-channel/src/Messages/SlackMessage.php

ConfirmObject.phpClarify danger-style documentation +1/-1

Clarify danger-style documentation

• Corrects the confirmation object's danger-method description.

src/slack-notification-channel/src/Slack/BlockKit/Composites/ConfirmObject.php

PlainTextOnlyTextObject.phpCorrect plain-text property documentation +1/-1

Correct plain-text property documentation

• Describes the property as text rather than formatting.

src/slack-notification-channel/src/Slack/BlockKit/Composites/PlainTextOnlyTextObject.php

TextObject.phpClarify Markdown-method documentation +1/-1

Clarify Markdown-method documentation

• Rewords the Markdown formatting method description.

src/slack-notification-channel/src/Slack/BlockKit/Composites/TextObject.php

Other (2) +73 / -2
sync.yamlRecord Slack checkpoint and selective Hyperf tracking +47/-2

Record Slack checkpoint and selective Hyperf tracking

• Records the reviewed Slack 3.x revision and porting guidance. Adds selective Hyperf Engine and runtime tracking with mappings to Hypervel components.

docs/upstream-sync/sync.yaml

inertia.phpAdd previous-location and BigInt options +26/-0

Add previous-location and BigInt options

• Introduces disabled-by-default store_previous_url and preserve_big_integers settings, including an environment override for BigInt preservation.

src/inertia/config/inertia.php

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Empty visits can redirect to themselves ✓ Resolved
Description
Middleware::handle() calls storeCurrentUrl() before onEmptyResponse() builds its redirect,
replacing the session’s previous URL with the current request URL. When previous-location tracking
is enabled and an Inertia GET returns an empty successful response without a Referer header,
Redirect::back() reads that newly stored URL and points back to the empty endpoint.
Code

src/inertia/src/Middleware.php[179]

+        $this->storeCurrentUrl($request, $response);
Evidence
The new write occurs before empty-response handling; that handler calls back(), which falls back to
the session previous URL when Referer is absent. The session setter writes exactly the value the
fallback reads.

src/inertia/src/Middleware.php[179-189]
src/inertia/src/Middleware.php[208-218]
src/inertia/src/Middleware.php[285-290]
src/routing/src/Redirector.php[37-41]
src/routing/src/UrlGenerator.php[157-169]
src/session/src/Store.php[797-808]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
An empty Inertia response can redirect back to its own URL because the middleware stores that URL before constructing the redirect.
## Fix Focus Areas
- src/inertia/src/Middleware.php[179-189]
- src/inertia/src/Middleware.php[208-218]
## Recommended Fix
Do not replace the session’s previous location for an empty response that will become a back redirect. Add a test with tracking enabled and no Referer header that checks the redirect destination.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Cyclic props can exhaust the worker 🐞 Bug ☼ Reliability
Description
encodeBigIntegers() recurses through arrays without tracking array cycles; its cycle guard tracks
only objects. With big-integer preservation enabled, a prop containing a self-referential PHP array
repeatedly enters the encoder before JSON serialization can reject the recursive value.
Code

src/inertia/src/PreservesBigIntegers.php[R56-58]

+        if (is_array($value)) {
+            return $this->encodeBigIntegersInArray($value, $seen);
+        }
Evidence
Response rendering invokes the new encoder for resolved props. Array dispatch does not enter the
object-only cycle guard, and every nested array value is passed back to the same encoder, making a
self-reference non-terminating.

src/inertia/src/Response.php[189-193]
src/inertia/src/PreservesBigIntegers.php[48-79]
src/inertia/src/PreservesBigIntegers.php[89-95]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Big-integer preservation recursively traverses self-referential arrays without terminating, rather than allowing JSON serialization to reject them.
## Fix Focus Areas
- src/inertia/src/PreservesBigIntegers.php[48-79]
- src/inertia/src/PreservesBigIntegers.php[89-95]
## Recommended Fix
Detect array-reference cycles during traversal and stop descending into them so response serialization can report a recursion error. Add a test using an array that references itself.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. SSR health checks crash on blocked destinations ✓ Resolved
Description
HttpGateway::checkHealth() now catches only RequestException, and isHealthy() adds only
ConnectionException, so the other HttpClientException subclasses
(DisallowedDestinationException, DestinationPolicyException) are no longer turned into false.
When the SSR connection or its request configurator applies a destination restriction,
inertia:check-ssr and inertia:stop-ssr (graceful or not) fail with an uncaught exception instead
of reporting an unreachable server and exiting with a normal failure code.
Code

src/inertia/src/Ssr/HttpGateway.php[R259-262]

      try {
          return $pendingRequest->get($this->getProductionUrl('/health'))->successful();
-        } catch (HttpClientException) {
+        } catch (RequestException) {
          return false;
Evidence
Previously the catch was HttpClientException. Four classes extend it: ConnectionException,
RequestException, DestinationPolicyException and DisallowedDestinationException. PendingRequest
throws the last two when destinations are restricted. The new code catches only the first two, so
the other two propagate from isHealthy() (used by CheckSsr) and from checkHealth() (used by
StopSsr).

src/http/src/Client/Destinations/DestinationPolicyException.php[9-9]
src/http/src/Client/Destinations/DisallowedDestinationException.php[9-9]
src/http/src/Client/PendingRequest.php[2035-2054]
src/inertia/src/Ssr/HttpGateway.php[241-264]
src/inertia/src/Commands/CheckSsr.php[36-36]
src/inertia/src/Ssr/HttpGateway.php[169-179]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`HttpGateway::checkHealth()` narrowed its catch from `HttpClientException` to `RequestException`. As a result, `DisallowedDestinationException` and `DestinationPolicyException` now escape `isHealthy()` and `checkHealth()`, and the inertia:check-ssr and inertia:stop-ssr commands crash.
## Fix Focus Areas
- src/inertia/src/Ssr/HttpGateway.php[241-264]
## Recommended Fix
In `checkHealth()`, catch `RequestException | DisallowedDestinationException | DestinationPolicyException` and return false. Keep `ConnectionException` propagating so `--graceful` can still detect an unreachable server. Add a test that throws a `DisallowedDestinationException` from a configured request.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can copy the agent prompt from any finding and feed it to your IDE agent

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/inertia/src/Middleware.php Outdated
Comment thread src/inertia/src/PreservesBigIntegers.php
Comment thread src/inertia/src/Ssr/HttpGateway.php
@greptile-apps

greptile-apps Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[High impact] Adds FTP and SFTP to pooled filesystem drivers and updates Inertia and Slack packages.

The PR should not merge until the previously reported array-cycle failure in big-integer encoding is fixed.

Fix All in Claude CodeFindings

  1. P1 Array cycles stop the worker ▶

Summary

This PR updates Inertia and Slack behavior and fixes worker configuration, filesystem pooling, cache recording, and coroutine-test cleanup.

Since the previous review:

  • Inertia visits can save eligible previous locations and run callbacks on redirects.
  • Inertia can preserve large PHP integers as native JavaScript BigInts.
  • The SSR stop command can treat an unreachable server as already stopped.
  • FTP and SFTP operations borrow separate connections from a shared pool.
  • Rebuilt workers refresh their settings, and tests keep their original failures.
  • Slack webhooks have bounded timeouts, and attachment fields keep literal titles.
  • Upstream tracking and test wording are refreshed without changing app behavior.

No new actionable issues were found.

Reviews (2) · Last reviewed commit: "Accept dependency-specific causes for ma..." · Reviewed by Greptile

Comment on lines +89 to +93
protected function encodeBigIntegersInArray(array $value, ?SplObjectStorage $seen): array
{
foreach ($value as $key => $nested) {
$value[$key] = $this->encodeBigIntegers($nested, $seen);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Array cycles stop the worker

With preserveBigIntegers() enabled, a self-referencing array inside a plain-object prop or flash data makes encodeBigIntegersInArray() recurse endlessly. For example, $data['self'] = &$data passed inside (object) ['data' => $data] reaches this loop without being walked by PropsResolver. SplObjectStorage only guards objects, so the response exhausts memory or the stack instead of letting json_encode() reject the cycle.

Add a cycle or depth guard, with tests for arrays inside objects and flash data.

Fix in Claude Code Fix in Codex

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving this unchanged: reference-cyclic arrays are not supported JSON props. The existing props resolver recursively processes arrays before the encoder even when bigint preservation is disabled. Object backreferences remain separately handled and tested. Adding another traversal mechanism here would not make cyclic arrays supported.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is true for a cyclic array supplied directly as a prop: PropsResolver::resolveProps() walks that array before this encoder runs. It does not cover the reported case, though. When the array is held by a plain object ((object) ['data' => $data]), resolveProps() leaves the object untouched because it only recurses when is_array($value) is true.

With preservation enabled, encodeBigIntegers() then unwraps the object via get_object_vars() and enters encodeBigIntegersInArray(). Since arrays have no cycle guard, the self-reference recurses indefinitely before json_encode() can reject it. Thus the opt-in path changes a prompt serialization failure into memory or stack exhaustion for object-contained cyclic arrays. The existing SplObjectStorage guard does not help because the cycle is through an array, not an object.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for correcting that path: an array inside a plain object bypasses the props resolver's array traversal. That comparison does not apply to your example. The disposition remains unchanged because an explicitly reference-cyclic array is unsupported JSON input, whether used directly or wrapped in an object. We aren't adding a separate cycle-tracking mechanism for that unsupported input.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Understood. Given that reference-cyclic arrays are intentionally unsupported JSON input, regardless of whether they are nested directly or inside a plain object, I’m closing this finding without requesting a change.

Return pooled connections as soon as a stream is fully buffered, including bounded ranges over temporary streams. Keep live and unmarked decorated streams borrowed until close, without copying buffers or changing range seeking and size semantics.

Share the ownership decision across whole-driver and client pools. Preserve live S3 read-through coverage and document when downloads release their connections. Filesystem, Inertia, JWT and object-pool suites, formatting and static analysis pass.
An empty Inertia response without a Referer could redirect back to itself after previous-location tracking overwrote the session URL. Store the visit after constructing the redirect, while preserving the original controller response for partial-reload detection and application eligibility overrides.

Add a regression for empty visits without a referrer. Middleware tests, formatting and static analysis pass.
Treat destination-policy failures as failed health checks while keeping connection failures distinct for graceful shutdown. A blocked health check must not report a successful stop.

Cover both policy exception types through health and shutdown commands, and assert captured Artisan output as well as raw output. Command tests and affected suites pass.
Avoid repeating reflection over each object class hierarchy when preserving big integers. Retain one boolean per encountered class, never payload values or object instances, and clear the map through the existing response test cleanup.

Extend the arbitrary-object test to verify changed values across responses. Clarify opt-in examples and the reserved client marker. Encoder prototype measurements show 26–29% savings for DTO payloads with a fixed 392-byte increase for the tested one- and two-class maps. Props tests, affected suites, formatting and static analysis pass.
Lcobucci JWT 5.6.1 reports malformed registered dates through InvalidTokenStructure rather than TypeError. Assert the public token exception, message and retained Throwable cause without depending on an internal exception class.

All malformed-date cases pass with both dependency versions 5.6.0 and 5.6.1. Production decoding behavior is unchanged.
@binaryfire
binaryfire merged commit 8899d55 into 0.4 Oct 10, 2026
50 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