effx
Architecture decisions

ADR 0010: Explicit Query over POST

accepted (2026-10-03)

Status: accepted (2026-10-03)

Context

ADR 0006 makes Query an observational-semantics claim, not a proof of handler purity. Its default HTTP check rejects non-GET exposure. Some reads accept private inputs such as an exact email address: putting that value in a URL would disclose it through URL logging and history. The unmerged mono-web lookupAppointmentCandidate endpoint uses POST with an explicit request payload for this reason, while retaining snapshot-read authority.

Decision

A Query may use HTTP POST only when its Http.Contract explicitly sets payloadIsQuery: true and declares a payload schema. The flag defaults to false in the contract IR. EFFX2402 rejects the flag on a Command, on any method other than POST, or without an explicit payload; EFFX2401 still rejects every other non-GET Query exposure. The POST payload remains in the HTTP request body, not the URL or the query-string channel.

This is an opt-in declaration of intent, not permission to write, an authorization decision, or a purity guarantee. ADR 0006 continues to govern the semantic claim and its limitations. An application handler remains responsible for honoring read-only semantics and for running authorization within its own read snapshot.

Consequences

  • Existing Query-over-POST declarations without the flag still fail; no method or payload is inferred from an input schema.
  • Explicitly flagged Query POST contracts can carry private lookup inputs without exposing them in a URL.
  • Other mutating methods never inherit this exception.

On this page