<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.31 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hunt-httpbis-watch-method-00" category="std" consensus="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="WATCH HTTP Method">WATCH: A Proposed HTTP Method for Event-Driven Subscriptions</title>
    <seriesInfo name="Internet-Draft" value="draft-hunt-httpbis-watch-method-00"/>
    <author fullname="Dawson Hunt">
      <organization>Independent Researcher</organization>
      <address>
        <postal>
          <city>Houston, TX</city>
        </postal>
        <email>dawson.t.hunt@gmail.com</email>
      </address>
    </author>
    <author fullname="Quill">
      <organization>AI Research Assistant</organization>
      <address>
        <email>quill.research@yahoo.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="31"/>
    <area>Web and Internet Transport</area>
    <workgroup>httpbis</workgroup>
    <abstract>
      <?line 20?>

<t>This document proposes the addition of a WATCH method to the Hypertext Transfer Protocol (HTTP). The WATCH method enables a client to subscribe to change notifications on a specified resource, shifting the communication model from client-initiated polling to server-initiated event delivery.</t>
      <t>The proposal includes two companion mechanisms: ALIVE, a client-initiated heartbeat protocol that maintains subscription validity and restores economic symmetry between client and server; and UNWATCH, a clean subscription termination method. Together, these introduce an event-driven subscription layer into HTTP while preserving the protocol's existing simplicity and extensibility.</t>
      <t>This document incorporates formal terminology, a setup phase with confirmation handshake, refined jurisdictional compliance guidance, implementation recommendations, and protocol flow diagrams for all defined interaction patterns.</t>
    </abstract>
  </front>
  <middle>
    <?line 28?>

<section anchor="terminology">
      <name>Terminology</name>
      <t>The following terms are used throughout this document with specific technical meaning. Each term maps to exactly one concept within the WATCH protocol.</t>
      <dl>
        <dt><strong>WATCH Connection</strong></dt>
        <dd>
          <t>The persistent client-server relationship established when a client subscribes to change notifications on a resource via the WATCH method. A WATCH connection is stateful: the server maintains subscription state for the duration of the connection.</t>
        </dd>
        <dt><strong>ALIVE Interval</strong></dt>
        <dd>
          <t>The maximum duration, in seconds, between consecutive Heartbeats. Established by the server and communicated to the client during the Setup Phase. The client MUST send Heartbeats at intervals not exceeding this value to maintain the WATCH connection.</t>
        </dd>
        <dt><strong>Heartbeat</strong></dt>
        <dd>
          <t>A lightweight message sent by the client to the server at regular intervals, confirming the client's continued presence and readiness to receive Dispatches. A Heartbeat carries no body -- its purpose is purely existential: "I am still here."</t>
        </dd>
        <dt><strong>Echo</strong></dt>
        <dd>
          <t>The server's response to a Heartbeat, confirming that the WATCH connection remains active and the Heartbeat was recorded. The Echo contains no new data; it is the Heartbeat reflected back. This allows the client to verify the server is still honoring the connection.</t>
        </dd>
        <dt><strong>Dispatch</strong></dt>
        <dd>
          <t>An event payload pushed from the server to the client when the watched resource changes. A Dispatch is the core deliverable of the WATCH protocol -- the data the client subscribed to receive. Dispatches do not affect the WATCH connection's persistence; the connection continues after each Dispatch until explicitly terminated.</t>
        </dd>
        <dt><strong>Setup Phase</strong></dt>
        <dd>
          <t>The initialization window between the server's acceptance of a WATCH request and the activation of the WATCH connection. During the Setup Phase, the server communicates the ALIVE Interval and other parameters. The connection activates only upon receipt of the Confirmation Heartbeat.</t>
        </dd>
        <dt><strong>Confirmation Heartbeat</strong></dt>
        <dd>
          <t>The first Heartbeat sent by the client after receiving Setup Phase parameters. It confirms the client has received and accepted the ALIVE Interval terms, and triggers activation of the WATCH connection. The eviction clock does not start until this Heartbeat is received.</t>
        </dd>
      </dl>
      <ul empty="true">
        <li>
          <t><strong>Terminology design note:</strong> Each term is intentionally distinct and non-overlapping. "Heartbeat" and "Echo" form a directional pair (client-to-server and server-to-client). "Dispatch" is reserved exclusively for event data delivery, preventing confusion with protocol maintenance messages.</t>
        </li>
      </ul>
    </section>
    <section anchor="problem-statement">
      <name>Problem Statement</name>
      <t>HTTP's request/response model requires the client to initiate every interaction. When a client needs to monitor a resource for changes, the only native mechanism available within the HTTP method specification is repeated GET requests at regular intervals -- a pattern known as <strong>polling</strong>. While non-native extensions exist (see Section 2.2), no standard HTTP method provides subscription semantics.</t>
      <section anchor="the-polling-tax">
        <name>The Polling Tax</name>
        <t>In a polling model, each request/response cycle carries the full weight of HTTP overhead: headers (often 500+ bytes), authentication tokens, content-type negotiation, payload serialization, and status codes. The vast majority of these cycles return identical data.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Axis</th>
              <th align="left">Impact</th>
              <th align="left">Scale Factor</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Bandwidth</td>
              <td align="left">~1KB+ overhead per poll, most returning "no change"</td>
              <td align="left">N clients x F polls/sec x 1KB</td>
            </tr>
            <tr>
              <td align="left">Compute</td>
              <td align="left">Server queries data store, serializes response, executes middleware on every request</td>
              <td align="left">CPU scales linearly with client count</td>
            </tr>
            <tr>
              <td align="left">Latency</td>
              <td align="left">Changes detected only at next poll interval; average delay = interval / 2</td>
              <td align="left">Faster detection compounds axes 1 and 2</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="existing-workarounds">
        <name>Existing Workarounds</name>
        <t>Several mechanisms have been developed to work around HTTP's pull-based limitation. <strong>WebSockets</strong> (RFC 6455) establish a persistent, full-duplex connection but abandon HTTP request/response semantics once upgraded. <strong>Server-Sent Events</strong> (SSE) allow server-to-client push over HTTP but lack a standardized subscription and heartbeat contract. <strong>Long-polling</strong> holds a connection open until data is available but reintroduces per-change overhead when the response triggers a new request. <strong>Webhooks</strong> reverse the flow by having the server POST to a client-provided URL, but require the client to operate its own HTTP server.</t>
        <t>Each approach solves part of the problem while introducing new complexity. None provides a native, first-class HTTP verb for subscription semantics with built-in connection maintenance.</t>
      </section>
    </section>
    <section anchor="the-watch-method">
      <name>The WATCH Method</name>
      <t>The WATCH method allows a client to express ongoing interest in a resource. Upon receiving a WATCH request, the server validates the request, establishes a subscription, and begins delivering Dispatches to the client as changes occur.</t>
      <section anchor="connection-lifecycle-overview">
        <name>Connection Lifecycle Overview</name>
        <t>A WATCH connection proceeds through four distinct phases:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Phase</th>
              <th align="left">Initiator</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <strong>1. Request</strong></td>
              <td align="left">Client</td>
              <td align="left">Client sends WATCH /resource with authentication credentials (transmitted via the standard <tt>Authorization: Bearer TOKEN</tt> header, commonly referred to as an API key). Server validates credentials, checks jurisdictional compliance, and registers the pending subscription.</td>
            </tr>
            <tr>
              <td align="left">
                <strong>2. Setup</strong></td>
              <td align="left">Server</td>
              <td align="left">Server responds with ALIVE Interval, subscriber ID, and connection parameters. The eviction clock is NOT yet running. Client has a setup window to configure its Heartbeat timer and evaluate the terms.</td>
            </tr>
            <tr>
              <td align="left">
                <strong>3. Active</strong></td>
              <td align="left">Both</td>
              <td align="left">Client sends Confirmation Heartbeat, activating the connection and starting the eviction clock. Client maintains Heartbeats at the ALIVE Interval. Server sends Echoes and Dispatches. Connection persists through multiple Dispatches.</td>
            </tr>
            <tr>
              <td align="left">
                <strong>4. Termination</strong></td>
              <td align="left">Either</td>
              <td align="left">Connection ends via: client UNWATCH, missed ALIVE deadline (automatic eviction), server-initiated termination with reason, or connection failure.</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="setup-phase-and-confirmation-heartbeat">
        <name>Setup Phase and Confirmation Heartbeat</name>
        <t>The Setup Phase addresses a critical race condition: without it, the server would communicate the ALIVE Interval and simultaneously start the eviction clock. A client receiving a short interval might be evicted before it can parse the confirmation, configure its timer, and send its first Heartbeat.</t>
        <t>The Setup Phase decouples term delivery from connection activation. The server sends connection parameters without starting the eviction clock. The client reads the terms, configures its Heartbeat process, and sends a Confirmation Heartbeat to signal readiness. Only upon receipt of this Confirmation Heartbeat does the server consider the WATCH connection active and begin the eviction clock.</t>
        <t>This also gives the client an opportunity to silently reject terms -- if the ALIVE Interval is too aggressive for the client's capabilities, it simply does not send the Confirmation Heartbeat, and the connection never activates. No resources are wasted.</t>
        <section anchor="successful-watch-connection-with-setup-phase">
          <name>Successful WATCH connection with Setup Phase</name>
          <table>
            <thead>
              <tr>
                <th align="left">Client</th>
                <th align="left">Direction</th>
                <th align="left">Server</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">WATCH /api/resource, Authorization: Bearer TOKEN</td>
                <td align="left">WATCH -&gt;</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- SETUP</td>
                <td align="left">200 OK, subscriber_id: c7f2a91b, alive_interval: 15s, status: awaiting_confirmation</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">* Setup window -- client configures Heartbeat timer</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">POST /api/alive/c7f2a91b (Confirmation Heartbeat)</td>
                <td align="left">CONFIRM -&gt;</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- ECHO</td>
                <td align="left">200 OK, status: active, ALIVE interval: 15s, OK - Eviction clock starts</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="server-sent-events-transport">
        <name>Server-Sent Events Transport</name>
        <t>The WATCH response uses the <tt>text/event-stream</tt> content type (Server-Sent Events), providing a persistent, unidirectional channel from server to client over standard HTTP. This transport is used for Dispatches and server-initiated messages. Heartbeats and Echoes use separate HTTP request/response cycles on dedicated endpoints.</t>
        <t>The authentication token in the Authorization header (commonly referred to as an API key) is the same credential used throughout the WATCH connection lifecycle. This token is validated during the initial WATCH request and is referenced for rate limiting, subscription caps, and jurisdictional compliance (see Section 8).</t>
        <t>```
WATCH /api/tasks/3a8f HTTP/1.1
Host: example.com
Authorization: Bearer TOKEN</t>
        <t>HTTP/1.1 200 OK
Content-Type: text/event-stream
X-Subscriber-Id: c7f2a91b
X-Alive-Interval: 15
```</t>
      </section>
    </section>
    <section anchor="the-alive-mechanism">
      <name>The ALIVE Mechanism</name>
      <t>The ALIVE mechanism makes WATCH economically and operationally viable. It solves three problems simultaneously: connection liveness verification, cost asymmetry mitigation, and malicious actor deterrence.</t>
      <section anchor="client-initiated-heartbeats">
        <name>Client-Initiated Heartbeats</name>
        <t>Unlike traditional heartbeat protocols where the server pings the client and awaits a response (two messages, server-initiated), ALIVE shifts initiation to the client (one message, client-initiated). The client MUST send a Heartbeat to its assigned endpoint at intervals not exceeding the ALIVE Interval:</t>
        <t>```
POST /api/alive/c7f2a91b HTTP/1.1
Host: example.com</t>
        <t>HTTP/1.1 200 OK
{"status": "alive", "alive_interval_seconds": 15}
```</t>
        <ul empty="true">
          <li>
            <t><strong>Key design decision:</strong> The Heartbeat carries no body. Its purpose is purely existential. This makes the round-trip cost approximately 200 bytes, compared to 1KB+ for a typical GET polling cycle. Even at identical frequencies, Heartbeat-based maintenance represents an ~80% bandwidth reduction over polling.</t>
          </li>
        </ul>
        <section anchor="heartbeat-echo-maintenance-cycle">
          <name>Heartbeat / Echo maintenance cycle</name>
          <table>
            <thead>
              <tr>
                <th align="left">Client</th>
                <th align="left">Direction</th>
                <th align="left">Server</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">POST /api/alive/c7f2a91b (empty body)</td>
                <td align="left">HEARTBEAT -&gt;</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- ECHO</td>
                <td align="left">200 OK, ALIVE interval: 15s</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">* ~15 seconds pass</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">POST /api/alive/c7f2a91b (empty body)</td>
                <td align="left">HEARTBEAT -&gt;</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- ECHO</td>
                <td align="left">200 OK, ALIVE interval: 15s</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="economic-equilibrium">
        <name>Economic Equilibrium</name>
        <t>In a standard polling model, each request/response cycle imposes roughly symmetric costs on client and server. WATCH without ALIVE breaks this symmetry: the client pays once while the server bears all ongoing costs.</t>
        <t>ALIVE restores equilibrium by imposing an ongoing cost on the client proportional to the number of active WATCH connections. A client watching one resource sends one Heartbeat per interval. A client watching one thousand resources sends one thousand Heartbeats per interval. The cost of maintaining connections scales linearly with the burden placed on the server.</t>
        <ul empty="true">
          <li>
            <t><strong>Security implication:</strong> A malicious actor attempting to exhaust server resources by opening many WATCH connections must sustain a corresponding volume of Heartbeat traffic -- burning their own bandwidth and compute proportionally to the load they impose.</t>
          </li>
        </ul>
      </section>
      <section anchor="dead-client-eviction">
        <name>Dead Client Eviction</name>
        <t>The server maintains a last-seen timestamp for each subscriber. A background process periodically compares each timestamp against the current time. If the elapsed time exceeds the ALIVE Interval multiplied by a configurable grace multiplier (default: 1.5x), the WATCH connection is terminated and all associated state is released.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Defined by</th>
              <th align="left">Purpose</th>
              <th align="left">Example</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ALIVE Interval</td>
              <td align="left">Server</td>
              <td align="left">Maximum seconds between Heartbeats</td>
              <td align="left">15s</td>
            </tr>
            <tr>
              <td align="left">Grace multiplier</td>
              <td align="left">Server</td>
              <td align="left">Tolerance factor before eviction</td>
              <td align="left">1.5x</td>
            </tr>
            <tr>
              <td align="left">Effective deadline</td>
              <td align="left">Derived</td>
              <td align="left">Interval x multiplier = actual cutoff</td>
              <td align="left">22.5s</td>
            </tr>
            <tr>
              <td align="left">Eviction sweep</td>
              <td align="left">Server</td>
              <td align="left">Frequency of the eviction check</td>
              <td align="left">5s</td>
            </tr>
          </tbody>
        </table>
        <section anchor="automatic-eviction-after-missed-alive-deadline">
          <name>Automatic eviction after missed ALIVE deadline</name>
          <table>
            <thead>
              <tr>
                <th align="left">Client</th>
                <th align="left">Direction</th>
                <th align="left">Server</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">POST /api/alive/c7f2a91b</td>
                <td align="left">HEARTBEAT -&gt;</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- ECHO</td>
                <td align="left">200 OK, ALIVE interval: 15s</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">* Client goes silent (crash, network loss, etc.)</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">* 22.5s pass with no Heartbeat received</td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left">&lt;- EVICTION</td>
                <td align="left">Server ends WATCH connection. Subscriber state removed</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="dispatches-server-to-client-event-delivery">
      <name>Dispatches: Server-to-Client Event Delivery</name>
      <t>A Dispatch is the core deliverable of the WATCH protocol. When the watched resource changes, the server pushes an event to all active subscribers whose ALIVE status is current. The WATCH connection persists after each Dispatch -- delivering an event does not terminate the subscription.</t>
      <t>A Dispatch payload includes the event type, relevant data, and a timestamp:</t>
      <t><tt>
data: {
  "event": "file_modified",
  "data": {
    "file": "config.yaml",
    "size_bytes": 2048,
    "modified_by": "dawson"
  },
  "timestamp": "2026-03-28T14:32:07Z"
}
</tt></t>
      <t><em>Figure 1: Example Dispatch payload</em></t>
      <section anchor="dispatch-delivery-with-continued-watch-connection">
        <name>Dispatch delivery with continued WATCH connection</name>
        <table>
          <thead>
            <tr>
              <th align="left">Client</th>
              <th align="left">Direction</th>
              <th align="left">Server</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">POST /api/alive/c7f2a91b</td>
              <td align="left">HEARTBEAT -&gt;</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- ECHO</td>
              <td align="left">200 OK, ALIVE interval: 15s</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">* Watched resource changes</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- DISPATCH</td>
              <td align="left">SSE event: file_modified, config.yaml, 2048 bytes</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">* Connection persists -- not terminated</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">POST /api/alive/c7f2a91b (confirms client still active)</td>
              <td align="left">HEARTBEAT -&gt;</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- ECHO</td>
              <td align="left">200 OK, ALIVE interval: 15s</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="unwatch-clean-termination">
      <name>UNWATCH: Clean Termination</name>
      <t>The UNWATCH method provides a mechanism for clients to explicitly terminate WATCH connections. While dead client eviction handles involuntary disconnections, UNWATCH enables graceful teardown with immediate resource release.</t>
      <section anchor="client-initiated-unwatch">
        <name>Client-initiated UNWATCH</name>
        <table>
          <thead>
            <tr>
              <th align="left">Client</th>
              <th align="left">Direction</th>
              <th align="left">Server</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">POST /api/alive/c7f2a91b</td>
              <td align="left">HEARTBEAT -&gt;</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- ECHO</td>
              <td align="left">200 OK, ALIVE interval: 15s</td>
            </tr>
            <tr>
              <td align="left">POST /api/unwatch/c7f2a91b</td>
              <td align="left">UNWATCH -&gt;</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- CONFIRMED</td>
              <td align="left">200 OK, status: unsubscribed. Connection terminated cleanly</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="server-initiated-termination">
      <name>Server-Initiated Termination</name>
      <t>The server MUST be able to terminate WATCH connections unilaterally for rate limiting, authentication revocation, resource deprecation, jurisdictional policy changes, or administrative action. In such cases, the server pushes a final event with type <tt>subscription_terminated</tt> and a reason field before closing the event stream.</t>
      <t><tt>
data: {
  "event": "subscription_terminated",
  "reason": "rate_limit_exceeded",
  "message": "Subscription limit reached for this API key.",
  "timestamp": "2026-03-28T15:01:44Z"
}
</tt></t>
      <t><em>Figure 2: Server-initiated termination payload</em></t>
      <section anchor="server-initiated-termination-with-reason">
        <name>Server-initiated termination with reason</name>
        <table>
          <thead>
            <tr>
              <th align="left">Client</th>
              <th align="left">Direction</th>
              <th align="left">Server</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">POST /api/alive/c7f2a91b</td>
              <td align="left">HEARTBEAT -&gt;</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- ECHO</td>
              <td align="left">200 OK, ALIVE interval: 15s</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">* Server decides to terminate (policy, rate limit, etc.)</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- TERMINATED</td>
              <td align="left">SSE: subscription_terminated, reason: rate_limit_exceeded, "Subscription limit reached."</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">&lt;- CLOSED</td>
              <td align="left">Event stream closed. Subscriber state removed</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="cost-asymmetry-attacks">
        <name>Cost Asymmetry Attacks</name>
        <t>Without ALIVE, WATCH creates an asymmetric cost profile exploitable for denial-of-service. An attacker subscribing to N resources forces the server to maintain N subscription states and deliver events to N queues, at the one-time cost of N WATCH requests. ALIVE mitigates this by requiring N Heartbeats per ALIVE Interval, making the attacker's ongoing cost proportional to the server's burden.</t>
        <t>Servers SHOULD additionally enforce per-API-key subscription caps (using the Bearer token from the Authorization header to identify and rate-limit individual clients), and MAY implement graduated ALIVE Interval requirements that increase with subscription count.</t>
      </section>
      <section anchor="ghost-subscriber-mitigation">
        <name>Ghost Subscriber Mitigation</name>
        <t>Ghost subscribers -- clients that subscribe and then become unreachable without sending UNWATCH -- represent a resource leak. The ALIVE eviction mechanism ensures ghost subscribers are automatically cleaned up within one grace period. Servers MUST NOT rely solely on TCP connection state for liveness detection, as intermediary proxies and load balancers may maintain connections beyond the client's actual availability.</t>
      </section>
      <section anchor="jurisdictional-compliance-in-persistent-connections">
        <name>Jurisdictional Compliance in Persistent Connections</name>
        <t>WATCH connections differ fundamentally from transactional GET requests in their compliance implications. A single GET request is a discrete act of data transfer: if a server inadvertently serves one response to a restricted jurisdiction, the exposure is limited to that single exchange. A WATCH connection, however, is an ongoing relationship in which <strong>every Dispatch constitutes a separate act of data transfer</strong> that must independently satisfy applicable legal frameworks.</t>
        <t>This persistent nature means that standard jurisdictional verification practices -- IP-based geolocation, API key registration with identity verification, and sanctions list screening -- become more consequential for WATCH than for transactional verbs. A server that performs geolocation checks only at request time for GET requests SHOULD perform them at subscription time for WATCH requests and SHOULD periodically re-validate for long-lived connections, as clients may change networks during an active WATCH connection (e.g. VPN activation, physical travel across jurisdictions).</t>
        <ul empty="true">
          <li>
            <t><strong>Rationale:</strong> Regulations including GDPR, U.S. sanctions law (OFAC), and national data sovereignty frameworks impose jurisdiction-dependent constraints on data transfer. A WATCH connection persisting for hours or days may span regulatory changes, client network transitions, or evolving sanctions lists -- making point-in-time validation alone insufficient. Implementors should leverage existing geolocation infrastructure rather than introducing new client-declared headers, which are trivially spoofable and add overhead without meaningfully improving security.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="implementation-guidance">
      <name>Implementation Guidance</name>
      <section anchor="heartbeat-independence-from-dispatch-processing">
        <name>Heartbeat Independence from Dispatch Processing</name>
        <t>Client implementations SHOULD maintain the Heartbeat timer on an independent thread or asynchronous process that is not blocked by Dispatch processing. If a Dispatch delivers a large payload that takes significant time to parse or act upon, a single-threaded client processing events synchronously may miss its ALIVE deadline and be evicted.</t>
        <t>The Heartbeat is an existential signal, not a data operation. It should never compete with application logic for execution time. Implementations that cannot guarantee independent Heartbeat maintenance should evaluate the server's ALIVE Interval during the Setup Phase and decline the connection if it is not sustainable.</t>
      </section>
      <section anchor="subscriber-state-storage">
        <name>Subscriber State Storage</name>
        <t>The WATCH protocol requires the server to maintain state for each active subscriber (subscriber ID, last-seen timestamp, event queue). The storage mechanism for this state is an implementation concern and is deliberately left unspecified. Servers MAY use in-memory structures, in-memory data stores such as Redis, or durable databases depending on scale and reliability requirements.</t>
        <t>Notably, the state lookup burden of WATCH is lighter than that of polling. In a polling model, the server authenticates and processes a full API key lookup on every request -- potentially thousands of times per second per client. With WATCH, full authentication occurs once (at subscription time), and subsequent state lookups are limited to Heartbeat checks at the ALIVE Interval. A server handling one thousand clients polling every second performs one thousand lookups per second; the same server with WATCH performs approximately sixty-seven (1000 / 15s interval). Servers operating at scale should consider durable or distributed state management, but the per-client overhead is lower than the infrastructure it replaces.</t>
      </section>
      <section anchor="alive-interval-sizing">
        <name>ALIVE Interval Sizing</name>
        <t>Servers should set the ALIVE Interval with consideration for the expected size and frequency of Dispatches (larger payloads warrant longer intervals), expected client capabilities (IoT devices may need longer intervals than desktop applications), and the server's own resource constraints (shorter intervals detect dead clients faster but increase Heartbeat traffic).</t>
        <t>For most applications, ALIVE Intervals between 10 and 60 seconds provide a reasonable balance between dead-client detection speed and Heartbeat overhead.</t>
      </section>
    </section>
    <section anchor="comparison-with-existing-protocols">
      <name>Comparison with Existing Protocols</name>
      <table>
        <thead>
          <tr>
            <th align="left">Feature</th>
            <th align="left">WATCH</th>
            <th align="left">WebSocket</th>
            <th align="left">MQTT</th>
            <th align="left">Polling</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">HTTP native</td>
            <td align="left">Yes</td>
            <td align="left">Upgrade</td>
            <td align="left">No</td>
            <td align="left">Yes</td>
          </tr>
          <tr>
            <td align="left">Server push</td>
            <td align="left">Yes</td>
            <td align="left">Yes</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
          <tr>
            <td align="left">Heartbeat model</td>
            <td align="left">Client-initiated</td>
            <td align="left">Ping/Pong</td>
            <td align="left">Client PINGREQ</td>
            <td align="left">N/A</td>
          </tr>
          <tr>
            <td align="left">Bidirectional</td>
            <td align="left">No</td>
            <td align="left">Yes</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
          </tr>
          <tr>
            <td align="left">Auto-eviction</td>
            <td align="left">Yes</td>
            <td align="left">Timeout</td>
            <td align="left">Yes</td>
            <td align="left">N/A</td>
          </tr>
          <tr>
            <td align="left">REST compatible</td>
            <td align="left">Yes</td>
            <td align="left">No</td>
            <td align="left">No</td>
            <td align="left">Yes</td>
          </tr>
          <tr>
            <td align="left">Cost symmetry</td>
            <td align="left">Yes (ALIVE)</td>
            <td align="left">Partial</td>
            <td align="left">Partial</td>
            <td align="left">Yes</td>
          </tr>
          <tr>
            <td align="left">Setup handshake</td>
            <td align="left">Yes</td>
            <td align="left">Upgrade</td>
            <td align="left">CONNECT</td>
            <td align="left">No</td>
          </tr>
        </tbody>
      </table>
      <ul empty="true">
        <li>
          <t><strong>Note:</strong> WATCH is most closely analogous to MQTT's subscribe/keep-alive pattern but operates natively within the HTTP ecosystem, preserving compatibility with existing infrastructure (proxies, load balancers, CDNs, API gateways) without requiring protocol upgrades or separate broker services.</t>
        </li>
      </ul>
    </section>
    <section anchor="reference-implementation">
      <name>Reference Implementation</name>
      <t>A reference implementation has been developed to validate the protocol design described in this draft. The implementation consists of two Python programs, available at https://github.com/dawsonhunt/watch-http-method :</t>
      <t><strong>watch_server.py</strong> -- A Flask-based HTTP server implementing WATCH, ALIVE, and UNWATCH endpoints with filesystem monitoring (via the <tt>watchdog</tt> library), background eviction, a real-time web dashboard, and the complete Setup Phase including Confirmation Heartbeat handling.</t>
      <t><strong>watch_client.py</strong> -- A command-line client that subscribes to the server's event stream, displays incoming Dispatches, and maintains the Heartbeat on an independent background thread. A <tt>--skip-alive</tt> flag demonstrates automatic eviction when Heartbeats cease.</t>
      <t>The implementation demonstrates the complete WATCH connection lifecycle: request, Setup Phase, Confirmation Heartbeat, active Dispatch delivery, and termination via both UNWATCH and eviction.</t>
    </section>
    <section anchor="conclusion">
      <name>Conclusion</name>
      <t>The WATCH method addresses a fundamental gap in the HTTP specification: the absence of a native subscription mechanism. By pairing server-push event delivery with client-initiated Heartbeats, the proposal achieves event-driven efficiency while maintaining the economic equilibrium and security properties that make HTTP's stateless model robust.</t>
      <t>The key insight underlying this proposal is that introducing statefulness into a stateless protocol is viable if and only if the cost of maintaining that state is distributed fairly between client and server. ALIVE achieves this through what we term <strong>subscription as economic contract</strong>: the client pays ongoing costs (Heartbeats) proportional to the obligations it imposes on the server, and failure to pay results in automatic eviction. The Setup Phase ensures both parties agree to terms before resources are committed, and elevated jurisdictional scrutiny addresses the regulatory exposure inherent in persistent data relationships.</t>
      <t>The authors invite discussion, review, and critique from the IETF community, and welcome collaboration on formal specification of the WATCH, ALIVE, and UNWATCH semantics toward an eventual Proposed Standard.</t>
    </section>
  </middle>
  <back>
    <?line 327?>



  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81cbXMbx5H+jl8xRddVSAYAKdlOHOSSCk1RFs8WxYhUnNwX
aYAdABsudpGdXZJImPz266e7Z3YWAJXcla8qqYoMArvz0tOvT3fPaDQaNHlT
uIk5+PHs9vzNxJyZ67paV95l5s3t7bV565pllZl5VZuLe1c2o1d1Tv81N+3U
z+p83eRV6Q8Gdjqt3X0YJn31YJBVs9KuaI6stvNmtGxplGXTrKe5Hz3YZrYc
rfjJ0enpYGYbt6jqzcT4Jhvk63pimrr1zcvT01+dvhzY2tmJ+dFNjS0zc1k2
ri5dY25rW/p1VTeDh6q+W9RVu54YnWKQ0ZAT8/L05S9Gp1+OvnwxGNiWpqsn
A2NGZt4WhazulX3wVWne0PLoF2OqemHL/K8WO5zQXJlbO/qnbMx7552tZ0tX
84OzvKH1vqlomVU5NLd/5G/dyuYF7ZlHHTdjbPt3C3w5nlWrrbl/3+ZFsWfW
s8s4mTnzPveN1dXp8H/Bi+Nan/ndxi6riscfjEYjY6e+qe2sGQxul7k3dBDt
ChtYyxF70yydsVmWYzZTzY01cn5yIKap+Ik3m7WrG/eohJ67GkzSVLOqMIc4
6qOxuaXneu+60k4LmsKaWZFjUhrMC9NMHf6YLW25cKasmnyez3jD3tAyrPFr
N6PviAVpY1Vbz9zQ+GU+b/JywQuiDa7aUl8yqypzhZnX1UqnGuUl7YiOPTPr
qij4LZrc1feuTn5z4GdD7xJD15sxiOSUNLYweTkr2gw0eqgw4ZqOBZM5rDv3
K0+n88PlHy6GcYfJ0Es6jmbqLJNaCNUs6S86tLKh//tACpYfc2+LnA5hw1xN
e24q+se4WVVWq3xm/GZFRK03ZuqaB0fCpxTF07KrX/PnD1d8ArIiZ8v+JCQr
q7xUkvEZ0alVC/rk6iHI6h1tuqmrrJ0RV5RCn1Em8t4bqrAb4gF6uBJJf1jm
BUjnsJpwSGHnP6OdPBLn4nufr9ZFPgtbJZZypc+neUHfjLe5lE6gqkmqiaIe
CmhFpyKbqIpqscE2vWvatVkvLa39IW+WdFDlPKcneZl0UJlf2jtin9rN85IO
5s9tnfssn+F3Gg7nWuS2pA0v2jzDh6HBGh1WIKPUDuxGoi8sOuSVx2OdF9WD
yXK7qO2KV2lsURBTyXQ5NJTl2czaNlBXfiyyucqzrHCDwRfmttuT8OCcmLZ6
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

-->

</rfc>
