Part of #49 (WebhookSink epic). Slice S1. One agent run, samples/** only.
Acceptance criteria
- Catch-all
POST /in/{bucket} (accept any verb) records method, headers, raw body, bucket, received-at into a bounded in-memory ring buffer (fixed capacity, oldest evicted; capacity configurable with a safe default).
GET /api/hooks returns captured hooks as JSON (newest first); GET /api/hooks/{id} returns one (404 if absent).
- WebApplicationFactory test proves capture + retrieval + ring eviction at capacity.
Definition of done
- Builds net10.0, 0 warnings; tests green; changes confined to
samples/**.
Design: docs/design/webhook-sink-design.md (Architecture, S1). Builds on the merged S0 scaffold.
Part of #49 (WebhookSink epic). Slice S1. One agent run,
samples/**only.Acceptance criteria
POST /in/{bucket}(accept any verb) records method, headers, raw body, bucket, received-at into a bounded in-memory ring buffer (fixed capacity, oldest evicted; capacity configurable with a safe default).GET /api/hooksreturns captured hooks as JSON (newest first);GET /api/hooks/{id}returns one (404 if absent).Definition of done
samples/**.Design: docs/design/webhook-sink-design.md (Architecture, S1). Builds on the merged S0 scaffold.