You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
test: cover the gaps a sibling plugin's live-test inventory exposed
Their framing is the useful part: a suite that fakes the transport agrees
with itself by construction, and every defect they found survived a green
suite. Working through their inventory against ours.
Three gaps were real and are now closed.
The published artifact was never loaded. `npm pack` honours the `files`
field, so a file needed at runtime that nobody listed is invisible to
every other test here — they all read the source tree, where it is
present. `npm run test:package` packs, extracts OUTSIDE the repo (inside,
the working tree shadows the install and the test passes without loading
what shipped), boots a real Gateway from the extracted package, and
requires 8 tools and a verified delivery. It passes: 104K, no test
directory, nothing missing.
A burst past the concurrency cap was untested. Admission defers rather
than queues and a deferred event is held nowhere, so the surviving burst
is maxConcurrent x the retry count. Now pinned: six concurrent deliveries
against a cap of two admit exactly two, defer four with the configured
Retry-After, and record a ledger row for none of the deferred ones —
recording one would make Hookdeck's redelivery look like a duplicate and
the event would vanish.
A deliberate operator retry was untested. Admission is attempt-count
based and does not read the trigger, which is right — the trigger arrives
in an unsigned header, so honouring it would let anyone able to replay a
body bypass deduplication. What matters is that Hookdeck's own increment
admits a MANUAL retry, including of an event that already succeeded. All
three cases now have tests.
Added from their finding about provider verification: a source's type
does not enable it, and a source with a secret is byte-identical to one
without over the API — so `hookdeck_doctor` now reads `verified` on
recent inbound requests, which is the only evidence there is.
Already covered here: malformed and non-ASCII signatures (their 500 case
— ours refuses cleanly, checked last round), duplicate suppression,
crash-recovery orphan reconciliation, and driving the tools with a real
model, which is how this plugin's tool surface was found broken twice.
659 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/agent-tools.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -93,3 +93,12 @@ A status tool that returns a page and lets the reader infer a total is worse tha
93
93
-`hookdeck_status.openIssues` and `hookdeck_issues`' `total` come from Hookdeck's count endpoint, not from the length of a page.
94
94
-`hookdeck_recent_deliveries` returns `openIssuesTotal` beside the page it shows, and an `openIssuesTruncated` note whenever the two differ. The local records get the same treatment via `localTruncated`.
95
95
-`hookdeck_status.deadLetters` is the local log's true size, but the log evicts oldest-first at its cap — so once it is full, `deadLettersIsAtLeast: true` says the number is a floor. A floor reported as a floor beats a ceiling reported as a total.
96
+
97
+
## What `hookdeck_doctor` checks
98
+
99
+
Beyond the obvious config validation:
100
+
101
+
-**Provider verification is actually in force.** Setting a source's *type* to STRIPE or GITHUB does not enable signature verification — the provider's signing secret has to be set on the source as well. A source with one is byte-identical to a source without it over the API, because the secret is never returned. So the only evidence is whether the requests that arrived were verified, and that is what this check reads.
102
+
-**The retry rule still covers every status the plugin emits.** A rule narrower than the emitted codes turns admission control into silent data loss.
103
+
-**The CLI and the API key point at the same project.** See [Transport](transport.md#the-two-projects-problem).
104
+
-**The burst each route can absorb**, from `maxConcurrent` and the connection's retry count.
0 commit comments