Repository navigation
AshHooks 2.0.1
2.0.1 — October 6, 2026
Delivery rows now retain declaration and queue ownership, fence each send attempt,
and recover unfinished work after queue exhaustion or an interrupted endpoint disable.
HubSpot retries use a stable batch identity, and the default transport bounds the
complete HTTP operation.
Existing installations require the ordered schema and identity migration in
UPGRADING.md before running 2.0 workers or ingress.
Changed
- Outbound rows persist declaration ownership and queue route. A declaration
cannot recover another declaration's rows. Named callbacks have stable routes;
anonymous callbacks can supplyenqueue_keyfor durable recovery. - Send and recovery admission use separate UUID tokens and expiring leases.
Every result is fenced to the live attempt; retry ceilings are checked before
sending. The complete ledger primary key is used throughout. - A 410 response records
:disable_pendingbefore disabling the matching endpoint
configuration. Recovery completes that obligation without another HTTP request. - Oban uniqueness covers runnable jobs and the durable route/tenant identity.
Completed or discarded jobs do not strand recoverable rows; an unpersisted
conflict is an admission error. - HubSpot's default dedup identity canonicalizes the complete batch, ignoring only
each outer event'sattemptNumber. The optional providerevent_identity/1
callback follows an explicit declaration extractor in precedence. Retained
legacy rows are adopted explicitly, preserving payloads and an audit map. - Ash's supported floor is 3.34.3, including its security correction and the tenant
inverse API used by workers. The lock resolves Ash 3.34.4, AshPostgres 2.14.2,
and Spark 2.7.6.
Fixed
- Minimal production consumers start
:public_keyand:sslthrough the package's
application dependencies; optional packages are unnecessary for default HTTPS. - Direct delivery calls apply the documented retry defaults for omitted or
nil
settings, including the attempt ceiling and boundedRetry-After, without
requiring an Oban worker. - Required keyset pagination, bounded retention deletion, custom ledger keys,
renamed UUID endpoint/subscription keys, and aliased worker HTTP-option resolvers. - Endpoint status values are cast and constrained at compile time; empty enabled
sets, overlapping states, and primary-key mappings are rejected. - IDs on direct event structs and HTTP headers reject control bytes and malformed UTF-8.
Telemetry reasons use a fixed vocabulary, preventing arbitrary tokens from escaping. - SSRF classification covers special-purpose address ranges; IPv6 Host values are
bracketed. Bounded HTTP follows interim responses to the final response, stops
at its body cap, and uses one deadline across resolution and transport. - HubSpot's finite event taxonomy includes generic object events.
Documentation and delivery
- Current install/version pins, terminal inbound acknowledgments, generated DSL
references, migration instructions, and an executable 2.0.1 Livebook. - Candidate archive inspection and notebook execution precede publication; the
normal notebook then executes against the exact published version. - Documentation changes trigger Linux CI. The minimum-consumer leg pins Ash
3.34.3; package, PostgreSQL, coverage, and Livebook checks feedall-checks-pass. - Keep notebook protocols unconsolidated so dynamically defined resources use their custom display without consolidation warnings.