Problem
op_pi needs a closed-by-default HTTP intake for Linear webhooks so signed Linear events can enter the existing routing pipeline without accepting spoofed, stale, oversized, or unbounded traffic.
Requested contract
- add signed
POST /linear
- verify
Linear-Signature as HMAC-SHA256 over the exact raw request body
- reject missing/invalid signatures and stale/future timestamps outside the documented window
- bound body size, body-read concurrency/time, request rate, delivery-header size, and replay state
- admit to the internal event queue before returning success; fail closed when configuration or queue capacity is unavailable
- emit deterministic generic
linear.<type>-<action> events while preserving the signed payload and correlation metadata
- keep Linear configuration optional and redact credentials from
config show
- document response/retry semantics, delivery limitations, and required reverse-proxy controls
Acceptance checks
Scope boundaries
No Linear polling, OAuth, webhook provisioning, persistent deduplication, exactly-once delivery, or proxy/tunnel provisioning.
Implementation
PR #19
Problem
op_pi needs a closed-by-default HTTP intake for Linear webhooks so signed Linear events can enter the existing routing pipeline without accepting spoofed, stale, oversized, or unbounded traffic.
Requested contract
POST /linearLinear-Signatureas HMAC-SHA256 over the exact raw request bodylinear.<type>-<action>events while preserving the signed payload and correlation metadataconfig showAcceptance checks
cargo fmt --all -- --check,cargo clippy --all-targets --all-features,cargo test, and release build passScope boundaries
No Linear polling, OAuth, webhook provisioning, persistent deduplication, exactly-once delivery, or proxy/tunnel provisioning.
Implementation
PR #19