Skip to content

Audit and strengthen configuration handling - #28

Closed
binaryfire wants to merge 111 commits into
0.4from
config-access-audit
Closed

Audit and strengthen configuration handling#28
binaryfire wants to merge 111 commits into
0.4from
config-access-audit

Conversation

@binaryfire

Copy link
Copy Markdown
Collaborator

Summary

This PR performs a framework-wide audit of Hypervel's configuration definitions and consumers.

The goal is to make configuration behavior explicit without changing the framework's Laravel-style configuration model. Required values remain in shipped config files. Optional values keep a single default at the boundary that owns them. Values with one non-null type use typed repository access, while meaningful null and mixed behavior stays explicit and tested.

This does not add a schema system, recursive merging, compatibility wrappers, or a new configuration abstraction.

Motivation

The 0.4 rewrite brought together freshly ported Laravel packages, older Hypervel code, and Hypervel-specific packages. Their configuration handling had several inconsistent patterns:

  • non-null values were often read through untyped get() calls;
  • environment-backed booleans and numbers could remain strings until a consumer cast them;
  • defaults were sometimes repeated in config files, factories, connectors, and runtime consumers;
  • replaceable connection, store, guard, and application records did not consistently distinguish required identity from optional tuning;
  • some Laravel compatibility fallbacks and renamed keys remained even though Hypervel does not need their backwards-compatibility behavior;
  • a few consumers depended on incomplete or undocumented record shapes.

These patterns make misspelled keys harder to diagnose, weaken static analysis, and make config behavior harder to understand for both developers and tooling.

Design

The audit applies a small set of rules consistently:

  • Use typed config getters when a value has one non-null type.
  • Use untyped access only when null, a union, or mixed values are part of the contract.
  • Cast environment-backed booleans and numbers in the config file that owns them.
  • Keep required identity, schema, topology, routing, and security members explicit. Missing required members fail at their normal read.
  • Give documented optional members one fallback at the factory, connector, constructor, or normalization boundary that owns the complete record.
  • Normalize caller-created and replaceable records once instead of repeating casts and defaults in downstream consumers.
  • Use constants only for non-obvious defaults shared by multiple production paths. User-facing config keeps readable literals, with focused alignment tests where drift matters.

Hypervel's existing shallow merge behavior is unchanged. Named registries still merge by entry name, matching entries still replace as records, and ordinary nested arrays still replace as a whole.

Configuration changes

The changes cover Foundation config and every standalone first-party package. The main results are:

  • Configuration consumers now use typed repository methods consistently.
  • Shipped config files normalize environment values at declaration time.
  • Required and optional members are documented at their natural config or feature surface.
  • Public builders for cache, filesystem, logging, mail, auth, server, watcher, and similar APIs retain useful partial-record behavior.
  • Auth guards, password brokers, Passkeys, Fortify, JWT, Sanctum, Scout, Permission, Horizon, Telescope, Reverb, Sentry, Saloon, and Rate Limiter now apply optional defaults at their owning boundary.
  • Redis has one topology-aware normalization boundary for standalone, Sentinel, and Cluster records, including explicit retry and backoff behavior.
  • Queue connectors own their operational omission defaults, while queue, table, topology, and credential identity remain explicit where required.
  • Testbench config files now contain only intentional application overrides and inherit framework defaults through the real loader.

The audit also removes compatibility-only or ineffective configuration paths, including the old scheduling cache environment name, the renamed Sentry log-level alias, legacy scalar migration and deprecation shapes, and Redis retry_interval, which was superseded before it could affect a command.

Queue and Redis correctness

The config audit exposed several queue behaviors that needed fixes rather than fallback changes:

  • Async queue connections default to dispatching after commit, while sync and same-database queues retain their useful transaction behavior.
  • A shipped failover connection now documents and applies whole-chain transaction timing.
  • Failover dispatch is canceled when any transaction captured at dispatch time rolls back, and the child attempt chain runs once after all captured transactions commit.
  • Redis multi-queue indexes are forwarded through failover using a narrow capability contract without widening the base queue API.
  • Built-in pooled database, Redis, and SQS queues retain clearability through the pool proxy.
  • Base bulk dispatch preserves job delay attributes for drivers without specialized bulk implementations.
  • Redis retry, migration batching, topology, and optional connection settings have one effective source of truth.

These changes preserve Laravel's public queue APIs while adapting behavior where Hypervel's coroutine and pooling architecture requires it.

Other correctness fixes

The audit also fixes issues found while tracing configuration from declaration to use:

  • Config files are evaluated in isolated closures so local variables cannot leak into later files.
  • Nullable application URLs no longer break supported console, mail, Passkeys, Fortify, and routing behavior through eager fallback evaluation.
  • Horizon normalizes Redis's empty-string representation of a nullable supervisor environment back to null.
  • Reverb application, rate-limit, and webhook records normalize every optional member consumed by their downstream paths.
  • Sentry feature config uses one normalized root for provider and feature consumers, including custom container aliases.
  • Scout, Sanctum, Permission, Inertia, auth, broadcasting, and other replaceable records retain their documented omission behavior without duplicating defaults.

Documentation

The configuration guide now documents typed getters, meaningful null behavior, shallow merging, replaceable records, and required versus optional members.

Feature documentation was updated where configuration behavior is part of normal use, including authentication, passwords, scheduling, queues, Redis, cache, filesystem, logging, mail, Horizon, Reverb, Sentry, Scout, Sanctum, Fortify, Passkeys, Permission, and related packages. The Laravel porting guide only records differences that affect normal porting decisions.

AGENTS.md now applies the same configuration rules to new and ported code so future packages keep the same behavior.

Compatibility

This is an improvement pass over the existing configuration system, not a replacement for it:

  • application config files remain ordinary PHP arrays;
  • package and framework config merging works as before;
  • intentionally optional settings may still be omitted;
  • public array-taking factories continue to support documented partial records;
  • no recursive merge or runtime schema registry was introduced.

The deliberate public differences are documented. Required keys fail clearly when an application replaces a record without its required identity, while optional keys continue to receive their documented defaults.

Testing

The branch adds focused coverage for typed access, environment normalization, meaningful null behavior, optional record normalization, required record failures, config/default alignment, queue transaction boundaries, failover, pooling, Redis topologies, and package-specific behavior.

Validation completed with composer fix, package-focused test runs, Testbench package tests, static analysis, formatting, and diff checks.

Define the configuration access rules, current-only contracts, and nullable behavior that the framework audit will enforce.

Record the retained-access inventory, package-by-package conversion decisions, regression coverage, documentation updates, and final verification workflow.
Define shipped configuration as the authoritative schema for stable first-party settings and require fixed nested records to be complete when applications replace them.

Record the typed-access conversions, legacy Laravel fallback removals, nullable behavior, regression coverage, documentation updates, and residual audit needed for implementation.

Capture the handler-specific validation and Testbench rescue boundaries so missing configuration fails reliably without adding compatibility machinery.
Enable PHPUnit's warning failure mode so undefined config members and similar runtime warnings cannot produce a successful test command. This complements the shipped-record integration tests without changing the treatment of existing deprecations or optional-service skips.
Make the shipped application, auth, broadcasting, cache, database, filesystem, logging, mail, queue, and session records the canonical definitions for stable first-party settings. Document nullable inheritance and disabled states at their owning config sections, and normalize env-backed scalar values before typed consumers read them.

Extend configuration loading coverage for the new schedule store and schema members, including the removal of the legacy schedule cache environment name.
Read required application, view, provider, alias, migration-publishing, and error-rendering settings through typed configuration APIs without duplicate framework defaults. Preserve supported nullable URL, editor, domain, and maintenance-mode behavior at the consumers that own it.

Document the typed getter and shallow merge contracts, update provider examples for pre-merge configuration, and add regressions for missing required values, nullable application URLs, reload behavior, and Testbench integration.
Read logging.deprecations through its current array shape in both runtime and Testbench bootstrappers. Require the nullable channel and boolean trace members, resolve named channels through typed configuration, and keep Testbench's deliberate rescue boundary intact.

Cover null channels, unknown channels, missing members, and rejection of the legacy scalar shape through the real error-handler path.
Resolve schedule timezone and mutex storage from the shipped nullable configuration instead of duplicating application-timezone and legacy environment fallbacks in the console kernel. Null continues to select the scheduler and cache manager defaults, while a configured store is shared by both mutex implementations.

Document SCHEDULE_CACHE_STORE and cover timezone inheritance, default-store selection, and configured mutex stores.
Make built-in guards, user providers, and password brokers consume their selected record shapes directly while preserving partial public guard-creator defaults. Represent password timeout inheritance, broker selection, remember duration, Eloquent provider caching, and JWT guard TTL states explicitly, with clear errors for incomplete or unknown records.

Expand unit and integration coverage for shipped guards, custom providers, cache-backed providers, broker variants, password confirmation, notifications, and remember-me behavior, and update the authentication and password documentation to match.
Use typed configuration for default connections, inspection commands, Faker locale, and the current database.migrations array shape. Remove scalar migration-table normalization while preserving the database command's purpose-built invalid-connection error for dynamic names.

Update truncation, connector, monitor, migration publishing, and command coverage so current records succeed and incomplete or legacy shapes fail at their owning boundary.
Replace the connection class's recursively merged hidden schema with validated standalone, Sentinel, or Cluster records assembled by RedisConfig. Centralize timeout, prefix, event, pool, Sentinel, and PhpRedis option handling while keeping topology discriminators and open option bags explicit.

Align the parallel integration harness with real Cluster records, preserve null timeout and prefix inheritance, cover event overrides and pool behavior, and document complete examples for each supported topology.
Read the required application environment through typed config and derive benchmark recovery commands from the complete selected cache-store record. An explicit null store prefix now inherits the shared cache prefix instead of relying on a duplicate getter fallback.

Add a focused regression proving the generated Redis cleanup guidance uses the inherited prefix.
Use typed access for required session configuration while keeping nullable connection, authentication provider, domain, and lock-store behavior explicit. Ensure blocked requests pass a null block store through to the cache manager so its default-store contract remains intact.

Extend manager, middleware, configuration, and database-backed lifecycle coverage for the shipped record and supported null branches.
Resolve the required hashing driver and option records through typed configuration instead of carrying manager-level defaults. Keep the public hasher constructors' own algorithm defaults for direct construction, avoiding a false requirement that runtime option arrays be complete.

Adjust service-provider and hasher coverage to distinguish named configuration from direct-construction behavior.
Require declared Redis connections and JSONP settings for named built-in broadcasters while retaining the established defaults on the public Pusher construction path. Keep Ably as an open SDK option bag rather than inventing framework-owned members.

Cover shipped Pusher and Reverb logging flags, named record failures, Redis resolution, and partial public Pusher records, and clarify that the connection log flag controls SDK logging.
Have built-in connectors consume complete selected connection records for commit behavior, timeouts, Redis migration batching, and SQS client options. Remove the hidden SQS default record, reject incomplete static credential pairs, preserve the AWS default chain for null credentials, and keep session tokens separate from the SDK's bearer-token option.

Read failed-job configuration once, expand connector and integration coverage for shipped records and missing members, and document complete SQS pooling, credential, timeout, and fingerprint examples.
Read required trim, metrics, Redis, dashboard, notification, and provisioning settings by type while preserving dynamic queue wait thresholds and the documented environment fallback chain. Normalize Redis's empty-string representation back to null so persisted master records continue to inherit app.env correctly.

Add coverage for shipped config, missing nested members, command precedence, null environment persistence through the real repository, Redis connector records, and watcher-path inheritance, and document the advanced HORIZON_ENV override.
Read required Markdown theme, paths, extensions, and application names from canonical configuration while retaining partial public mail transport defaults. Allow the HTML and text message layouts to render when the application has no canonical URL instead of forcing a typed string at view time.

Add integration coverage for null-URL Markdown rendering and missing Markdown members, update notification channel access, and align the mail and notification examples with typed configuration.
Derive relying-party defaults safely when app.url is null and stop eagerly evaluating app.url or app.key fallbacks when dedicated Passkeys settings are present. Move nullable relying-party, origin, and user-handle validation to the domain methods that use them while requiring the configured timeout and verification limiter.

Keep the package config, publishable stub, provider bridge, routes, and documentation aligned, with functional coverage for explicit values, null behavior, missing secrets, omitted throttle middleware, and incomplete fixed blocks.
Cast env-backed blacklist, refresh-issued-at, and subject-lock settings at the config boundary so typed consumers receive real booleans. Give JWT guard records distinct integer, null, and inherit TTL states, validate unsupported values, and require their selected provider.

Cover env normalization, inherited and non-expiring tokens, asymmetric signing with a null secret, malformed guard records, and service-provider wiring, and document the guard-only inherit sentinel.
Read required permission models, table maps, cache settings, teams flags, and resolver configuration through typed APIs. Access nullable pivot and default-model members explicitly before applying their documented role_id, permission_id, or authenticated-model behavior so omission cannot masquerade as null.

Update package migrations and team-upgrade tooling together, with coverage for null pivots, assigned-model fallback, cached roles, team behavior, and partitioned database schemas.
Make config-provider applications and enabled rate-limiting and webhook blocks consume their declared members directly while preserving the public Application constructor's whole-feature off states. Normalize env-backed enablement and request-size values, keep custom-provider truthiness at the constructor boundary, and make null or blank webhook URLs explicitly disabled.

Rebuild unit and server fixtures from the complete shipped record, cover silent rate-limit disablement and webhook member failures, and document complete application, batching, filter, and nullable option semantics.
Normalize env-backed cache and last-used flags, read required routes, prefixes, domains, and token settings through typed access, and treat the middleware block as a complete fixed record. Preserve explicit null middleware removal and the package's nullable expiration, cache-store, and validated timing behavior.

Expand coverage for shipped defaults, null middleware entries, incomplete middleware blocks, token caching, authentication flows, and service-provider registration, and update the stateful-domain documentation example.
Normalize queue and command-concurrency env values, read required Scout settings through typed helpers, and remove the obsolete Hyperf-era getScoutConfig extension helpers from Searchable and CollectionEngine. Keep nullable queue, Algolia timeout, Meilisearch key, and index-setting behavior where downstream workers or SDKs own it.

Add config-file and provider coverage for numeric concurrency, boolean queueing, Algolia SDK defaults and overrides, Meilisearch retries, console commands, and shipped-record resolution.
Replace the hardcoded SdkCapabilities reader with a root-aware SentryConfig service used consistently by the provider, features, aspects, tracing, publishing, and runtime reloads. Reject competing providers before mutation so custom aliases cannot mix configuration roots or duplicate telemetry registration.

Normalize every boolean env declaration and the SQL-origin threshold, add the missing storage feature flags, align Spotlight's string zero state with the SDK, remove the renamed log-level compatibility alias, and require complete internal feature and handler records while retaining open SDK option bags.

Expand config, alias, telemetry, coroutine, event, storage, cache, tracing, and provider coverage, including numeric and boolean env regressions, active-endpoint behavior, cache-event coupling, and complete shipped fixtures; update the Sentry guide for the current env and custom-provider contracts.
Cast env-backed enablement flags at the package boundary and use typed access for fixed watcher, middleware, storage, migration, and dashboard settings. Preserve nullable dashboard paths, queue settings, and polymorphic watcher definitions where omission has supported behavior.

Update route, disabled-watcher, Redis, Reverb, and storage coverage, including a dedicated null-path route case and complete watcher records.
Add the stable class-to-caster map to the package configuration and read required command, alias, exclusion, and caster arrays through typed access. Preserve trust_project's upstream union behavior rather than forcing it into a boolean-only contract.

Cover shipped defaults, configured custom casters, command setup, and service-provider registration.
Read required page flags, response arrays, history settings, and SSR runtime, timeout, backoff, URL, and validation values through typed configuration. Keep nullable SSR bundle discovery and hot-reload URL behavior unchanged.

Remove duplicate source defaults so the shipped Inertia configuration remains the single definition for non-null settings.
Require the shipped view path, cookie same-site value, rate-limiter driver members, server list, and signal handler registry at their existing configuration boundaries. Preserve the rate limiter's validated nullable database connection and dynamic Swoole table-name behavior while removing defaults that previously masked incomplete first-party records.

These conversions complete the residual fixed-record sweep without adding wrappers, compatibility aliases, or new normalization machinery.
Update API client, gRPC, Saloon, and Socialite examples to request the array or string type their constructors require. Keep Socialite's OAuth builder path unchanged where its domain-specific validation deliberately accepts missing configuration.

The examples now teach the same typed configuration conventions used by framework and application code.
Give Laravel porters one concise configuration entry covering complete fixed blocks, selected driver variants, typed missing-key failures, and the public builders that still accept partial runtime records. Name the common auth, cache, queue, Redis, Scout, Fortify, migration, deprecation, and scheduling differences that require an explicit porting decision.

Keep the guidance action-focused and point readers to Hypervel's shipped configuration as the canonical starting shape rather than duplicating every package detail.
Keep guard remember durations, password-broker timing and storage selectors, and Eloquent user-provider caching optional at their existing construction boundaries.

Centralize shared non-obvious defaults, retain strict provider and broker identity, remove padded test records, and document the resulting omission and null behavior.
Let JWT provider and storage records retain their package-owned defaults, and keep guard TTL omission distinct from an explicit null non-expiring token policy.

Own the shared global TTL in JwtGuard, verify config alignment, and update the guard examples and documentation for all three TTL states.
Restore the verification limiter and passkey timeout, throttle, and redirect defaults at their owning runtime boundaries while keeping explicit null behavior intact.

Remove strict-era fixture padding, keep shared timeout alignment coverage, and clarify that Fortify email verification remains rate limited when its nested setting is omitted.
Keep jsonp and compatible client options optional through the public Pusher factory rather than requiring named records to repeat factory defaults.

Exercise the real manager with a partial record so named and runtime-built clients continue to share the same omission behavior.
Keep replaceable SSR, page, history, and testing records compatible with documented partial configuration while preserving typed validation for configured values.

Test each meaningful boundary and remove the earlier requirement that applications repeat every nested Inertia default.
Keep fundamental model, table, morph, and teams schema choices explicit while allowing conventional pivot, team, cache-key, and feature settings to be omitted.

Share non-obvious defaults across the registrar and both migration paths, retain readable published config, remove strict-era fixtures, and document the supported customization boundaries.
Keep sync and database dispatch immediate while async drivers defer by default, and restore documented omission defaults for database, Beanstalkd, Redis, and SQS connector records.

Give database and Redis queues independent retry constants, reject an unusable null database retry duration, centralize Delay attribute lookup, and strengthen connector/config alignment coverage without abstracting distinct batch paths.
Make RedisConfig the single owner for optional advanced connection members across standalone, Sentinel, and Cluster topologies.

Preserve strict topology identity, restore documented timeout and pool inheritance, remove duplicate low-level assumptions from fixtures, and describe the effective retry and connection behavior.
Normalize optional application, rate-limit, and webhook members once when constructing a Reverb application while keeping credentials and protocol security fields strict.

Use the safer members-only client-event default, cover partial runtime records and shipped alignment, and document omission, filtering, delivery, and batching behavior without adding schema machinery.
Normalize replaceable middleware records and retain package-owned cache enablement, store, prefix, TTL, and update-interval defaults at every supported consumer.

Keep routes and enabled prefixes strict, fail on invalid expiration before pruning data, remove repeated casts and padded fixtures, and document the effective optional behavior.
Retain optional queue, chunk, and Meilisearch settings at their owning source boundaries while keeping active engine credentials and schema strict.

Share chunk defaults across production paths, replace weak file-only checks with effective client alignment coverage, and clarify the distinction between an omitted driver value and the shipped environment default.
Route provider and feature consumers through one SentryConfig boundary that fills documented breadcrumb and tracing defaults while preserving open SDK options.

Keep custom config aliases coherent, cover partial nested records through the real provider, and document endpoint, telemetry, and removed compatibility-alias behavior.
Let database-backed stores omit or explicitly null their connection selector so the database manager chooses its configured default.

Keep table and driver identity strict and cover omission through the real rate-limiter store construction path.
Keep fixture path and missing-fixture policy optional at the Saloon manager boundary so partial configuration continues to use the package convention.

Verify omission through the registered manager while preserving explicit replay-only behavior and required connection configuration.
Exercise Markdown, migration publishing, and Telescope Redis instrumentation through their real optional-default boundaries instead of rebuilding full framework records inside tests.

Replace the obsolete missing-setting failure with the supported omission behavior and keep fixtures focused on the values each scenario actually controls.
Rename the shipped Redis schema coverage and its local inventories so the test distinguishes visible canonical settings from members that are required only after normalization.

Keep the assertions unchanged: shipped records remain useful examples while RedisConfig supplies documented optional members.
State that typed getters throw for missing keys only when no default is supplied, matching the final required-versus-optional contract.

This keeps the configuration guide accurate for both strict application settings and documented optional records.
Describe wholesale nested and named-record replacement in terms of required and documented optional members, without exposing internal factory details.

Keep only the password-broker, queue timing, Beanstalkd port, and scheduling-store differences that change normal Laravel porting decisions.
Require named and nested records to apply documented optional defaults at the boundary that consumes the complete record while leaving required members strict.

Keep the guidance concise and general so it applies equally to first-party and ported packages without adding package-specific policy bloat.
Reconcile the implementation specification with the final practical contract: strict required identity, documented optional defaults, one raw-record normalization boundary, and no recursive merge or schema machinery.

Record the completed package decisions, regression coverage, documentation scope, DatabaseQueue retry contract, and final verification requirements without retaining superseded strict-era history.
Replace the ambiguous statement that required record members remain strict with explicit guidance that missing required members must still fail.

This keeps the existing normalization policy unchanged while making the expected behavior immediately clear to maintainers and coding agents.
@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 868f5ff7-24f6-439a-bcae-774f3e6aa934

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@binaryfire

Copy link
Copy Markdown
Collaborator Author

@greptile-apps review

@greptile-apps

greptile-apps Bot commented Aug 20, 2026

Copy link
Copy Markdown

Greptile Summary

This PR standardizes configuration typing, normalization, required-key handling, and replaceable-record defaults across the framework. It also strengthens queue transaction behavior and centralizes Redis topology normalization.

  • Replaces untyped configuration reads with typed access where values have a single non-null type.
  • Moves environment coercion and optional-record normalization to their owning boundaries.
  • Adds coordinated failover queue dispatch across captured transactions, preserving rollback cancellation.
  • Consolidates standalone, Sentinel, Cluster, retry, and backoff configuration handling for Redis.
  • Isolates configuration-file evaluation and expands tests and documentation for configuration contracts.

Confidence Score: 5/5

The PR appears safe to merge because no concrete changed-code failure remained after tracing the highest-risk configuration, transaction, and Redis topology paths.

Required configuration failures are intentional and tested, failover transaction coordination preserves commit and rollback invariants for established callers, and Redis Cluster records avoid standalone database access on supported command paths.

Important Files Changed

Filename Overview
src/queue/src/FailoverQueue.php Coordinates failover dispatch after all captured transactions commit and cancels dispatch when any captured transaction rolls back; no actionable defect was established.
src/foundation/src/Bootstrap/LoadConfiguration.php Isolates configuration-file evaluation and makes required application environment and timezone reads explicit, with intentional failure behavior covered by tests.
src/redis/src/RedisConfig.php Centralizes topology-aware Redis normalization while intentionally omitting standalone-only database metadata from Cluster records.
src/redis/src/RedisConnection.php Updates connection release and retry handling to consume normalized records; the investigated missing-database path is not reachable through supported Cluster command usage.
src/queue/src/Queue.php Preserves delay attributes in generic bulk dispatch and supports rollback cleanup used by coordinated failover dispatch.
src/queue/src/Connectors/FailoverConnector.php Normalizes optional failover connection settings at the connector boundary without masking required connection identity.
src/testbench/src/Bootstrap/LoadConfiguration.php Retains framework-loader behavior while normalizing Testbench database environment values at declaration time.

Reviews (1): Last reviewed commit: "docs: clarify required config member fai..." | Re-trigger Greptile

Keep email-verification link generation usable when the optional verification expiry setting is omitted.

The shipped config still exposes the 60-minute value, while the notification remains the owning runtime boundary for partial or replaced verification records.
Use the package's Lcobucci implementation when a replaceable providers record omits the JWT provider member.

This matches the documented optional-provider contract and the existing TaggedCache storage fallback without weakening validation of explicitly configured provider classes.
Remove the dispatcher test that expected an omitted webhook timeout to fail.

Application now owns webhook record normalization and supplies the documented five-second default. ApplicationProviderTest already covers that complete normalized record, so retaining the old assertion contradicted the supported partial-record behavior.
@greptile-apps

greptile-apps Bot commented Aug 20, 2026

Copy link
Copy Markdown

Too many files changed for review (430 files, 300 file limit).

Bypass the limit by tagging @greptile-apps to review.

@binaryfire binaryfire closed this Aug 20, 2026
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