<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-vandemeent-mux-status-frame-00"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="MUX Status Frame">MUX Status Frame: Two-Way Reachability Signalling without an Enumeration Oracle</title>

    <seriesInfo name="Internet-Draft" value="draft-vandemeent-mux-status-frame-00"/>

    <author fullname="Jasper van de Meent" initials="J." surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal><country>Netherlands</country></postal>
        <email>jasper@humotica.nl</email>
        <uri>https://humotica.nl</uri>
      </address>
    </author>

    <author fullname="Root AI" surname="Root AI">
      <organization>Humotica</organization>
      <address>
        <email>root_idd@humotica.nl</email>
        <uri>https://humotica.nl</uri>
      </address>
    </author>

    <date year="2026" month="June" day="17"/>

    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>reachability</keyword>
    <keyword>liveness</keyword>
    <keyword>revocation</keyword>
    <keyword>enumeration</keyword>
    <keyword>routing</keyword>

    <abstract>
      <t>This document defines the MUX Status Frame, a two-octet,
      relationship-scoped signal that lets a multiplexing routing layer tell a
      proven, related peer that a destination is unavailable - offline, not in
      session, superseded, or permanently revoked (tombstoned) - while
      disclosing nothing to the open network. It resolves the tension between
      two failure modes of a null-routing mux: silently dropping traffic to a
      dead peer (a false positive - the sender believes it landed) and
      answering honestly to everyone (an enumeration oracle mapping who is
      alive, dead, or revoked). Honest status travels only on a
      relationship-scoped trusted path; to the world, and to any merely
      authenticated but unrelated peer, the entire frame is zero. Status is
      derived from the canonical naming record and session liveness, not from a
      separate blocklist. The encoding is deterministic so independent
      implementations agree byte-for-byte. This protocol is transport-agnostic
      and complements JIS <xref target="JIS"/>, AINS <xref target="AINS"/>,
      TIBET <xref target="TIBET"/>, and RVP <xref target="RVP"/>.</t>
    </abstract>
  </front>

  <middle>
    <section><name>Introduction</name>
      <t>A multiplexing routing layer ("mux") that protects a host commonly
      absorbs abnormal traffic into silence (a null route). Silence is the
      correct posture toward an unknown scanner. It is the wrong posture toward
      a legitimate sender whose destination is genuinely gone: the sender (a
      human or an autonomous agent) believes its message landed when in fact it
      fell into a black hole.</t>
      <t>The naive fix - reply "dead" - is worse. Any response that varies with
      the state of a name turns the mux into an enumeration oracle: an attacker
      can map which identities exist, which are alive, and which have been
      revoked. The honest signal and the leak are the same signal.</t>
      <t>This document resolves the tension by scoping honesty to a prior
      relationship. The mux emits a real status only to a peer that is both
      cryptographically proven and already had a binding with the destination;
      to everyone else the frame is indistinguishable from the silent default.
      The distinction is the entire mechanism.</t>

      <section><name>Problem Statement</name>
        <t>Two failure modes must be eliminated simultaneously:</t>
        <ul>
          <li>False-positive delivery: a sender to a dead or revoked peer must
          not believe it succeeded.</li>
          <li>Enumeration oracle: the network at large must not learn the
          liveness or revocation state of any name from a differential
          response.</li>
        </ul>
      </section>

      <section><name>Design Principles</name>
        <ul>
          <li>Relationship-scoped, not auth-scoped. Authentication alone does
          not earn a status; a prior binding does.</li>
          <li>No separate blocklist. Status is read off the canonical naming
          record that the resolver already verifies.</li>
          <li>Silence is the floor. Unknown caller, no relationship, or any
          computation error yields a zero frame.</li>
          <li>Deterministic. The two octets are a pure function of inputs, so a
          second implementation matches byte-for-byte.</li>
          <li>Reachability only. The mux reports whether a destination can be
          reached, never whether a recipient consented or acted.</li>
        </ul>
      </section>
    </section>

    <section><name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "SHOULD", and "MAY" in this document
      are to be interpreted as described in BCP&nbsp;14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when,
      they appear in all capitals.</t>
      <dl>
        <dt>Caller:</dt><dd>the party whose traffic reaches the mux.</dd>
        <dt>Target:</dt><dd>the named destination the caller is trying to
        reach, expressed as a JIS actor or AINS name.</dd>
        <dt>Proven peer:</dt><dd>a caller whose identity is cryptographically
        verified (e.g. a JIS Ed25519 challenge-response).</dd>
        <dt>Relationship:</dt><dd>a prior bilateral binding between caller and
        target (<xref target="rel"/>).</dd>
        <dt>Tombstone:</dt><dd>a canonical, self-verifiable record that an
        identity has been permanently revoked.</dd>
      </dl>
    </section>

    <section><name>The Status Frame</name>
      <t>The frame is two octets carried in a reserved field of the mux
      envelope. Octet 0 is the status; octet 1 is a hint.</t>

      <section><name>Octet 0 - Status</name>
        <artwork><![CDATA[
bits 7-6  disclosure
  00 silent / no disclosure (the world)   01 trusted
  10 policy / security                    11 reserved
bits 5-4  state class
  00 accepted / alive       01 transient / degraded
  10 unavailable / dead     11 policy / quarantine
bits 3-0  reason
  0000 none            0001 heartbeat-dead    0010 not-in-session
  0011 not-registered  0100 consent-missing   0101 tombstone-confirmed
  0110 successor-available                     0111 assurance-expired
  1000-1111 reserved
]]></artwork>
      </section>

      <section><name>Octet 1 - Hint</name>
        <artwork><![CDATA[
bits 7-6  retry
  00 no-hint  01 retry-soon  10 retry-later  11 do-not-retry-auto
bits 5-4  detail source
  00 none  01 local-mux  10 local-cache/last-known
  11 signed-external / canonical-ref
bits 3-0  detail code
  0000 none            0001 route-missing    0010 endpoint-inactive
  0011 runtime-wrapper-missing              0100 session-expired
  0101 local-tombstone 0110 canonical-tombstone
  0111 successor/ref-available             1000-1111 reserved
]]></artwork>
      </section>

      <section><name>Encoding</name>
        <artwork><![CDATA[
octet0 = (disclosure << 6) | (state_class << 4) | reason
octet1 = (retry << 6) | (detail_source << 4) | detail_code
]]></artwork>
        <t>The two octets are the contract. Implementations MUST sign, verify,
        and compare over exactly these octets.</t>
      </section>
    </section>

    <section><name>The Anti-Enumeration Invariant</name>
      <t>If disclosure is 00 (the world), or the caller has no relationship
      with the target (<xref target="rel"/>), the entire frame MUST be 0x0000.
      An implementation MUST NOT leak state class or reason through the lower
      bits when disclosure is 00; doing so reconstitutes the enumeration oracle
      through the nibbles. Honest status travels only at disclosure 01
      (trusted) or 10 (policy/security).</t>
      <t>Alive is implicit by routing. A reachable endpoint simply forwards
      traffic; an implementation MUST NOT broadcast an unsolicited "alive"
      frame, which is itself enumerable. An explicit alive acknowledgement
      (0x40nn) is OPTIONAL and is only a response to an explicit status query
      on the trusted path.</t>
    </section>

    <section anchor="rel"><name>Relationship Scoping</name>
      <t>The security of the frame depends on the relationship predicate, so
      independent implementations MUST decide it identically. A relationship
      exists when the target can verify a prior bilateral binding with the
      caller. At least one of the following MUST hold:</t>
      <ul>
        <li>an active session between caller and target;</li>
        <li>a local mux-lane registration linking the two;</li>
        <li>a prior AINS/JIS binding recorded between them;</li>
        <li>recorded bilateral consent;</li>
        <li>an existing tombstone-relation (the caller previously held a
        binding now revoked).</li>
      </ul>
      <t>Authentication alone - a valid signature from an otherwise unknown
      peer - is NOT a relationship. Treating it as one would make every trusted
      peer an enumeration oracle for every name. When the predicate cannot be
      established, the implementation MUST treat it as absent and emit
      0x0000.</t>
    </section>

    <section><name>Status Resolution</name>
      <t>The status fields are derived from the canonical naming record (AINS)
      and session liveness, in this order:</t>
      <ul>
        <li>record marks revocation/tombstone: dead, tombstone-confirmed,
        do-not-retry, signed-canonical, canonical-tombstone (0x65 0xF6);</li>
        <li>record has a successor/alias: dead, successor-available,
        do-not-retry, signed-canonical, successor/ref (0x66 0xF7);</li>
        <li>record reserved/pending or absent: transient, not-registered;</li>
        <li>positive evidence the lane is quiet: transient, not-in-session;</li>
        <li>otherwise: alive (implicit; silent on the wire).</li>
      </ul>
      <t>An implementation MUST NOT assert not-in-session without positive
      evidence that the lane is quiet; absent such evidence a registered name
      resolves as alive.</t>
    </section>

    <section><name>Sender Behaviour</name>
      <t>A receiving sender keys on the state class: alive means proceed;
      transient means retry per the retry bits; dead means stop or follow the
      hint; quarantine means stop. On successor-available the sender SHOULD
      re-resolve the target to its successor and retry there. The detail-source
      field is a confidence gradient on the evidence (local-mux &lt;
      local-cache &lt; signed-canonical-ref); a sender MAY weight automated
      action by it. A canonical tombstone with detail-source
      signed-canonical-ref is self-verifiable offline.</t>
    </section>

    <section><name>Layer Boundary</name>
      <t>The frame is a reachability/liveness posture, not a delivery or read
      receipt. A live actor that refuses an action is a consent decision (for
      example an authorization failure), and MUST NOT be encoded as a mux
      status. Whether a recipient read or acted on a message is a separate,
      higher-layer signed receipt <xref target="TIBET"/>, never these
      octets.</t>
      <t>Informatively, the frame maps onto familiar messaging semantics: a
      single check (queued, lane not live) corresponds to transient; a double
      check (delivered to a live lane) to alive; "blocked" to dead or
      quarantine. A read/acted indication is not derivable from the mux and
      belongs to the receipt layer.</t>
    </section>

    <section><name>Fail-Safe and Determinism</name>
      <t>Silence is the absolute floor. If status cannot be computed - the
      naming record is unreachable, a lookup times out, or any error occurs -
      the implementation MUST emit 0x0000 and MUST NOT fail open to a
      permissive state. Status resolution SHOULD be performed against a local
      replica of the canonical record to avoid network-dependent stalls; where
      a remote lookup is unavoidable it MUST be bounded by a timeout whose
      expiry yields 0x0000. The encoding is deterministic: identical inputs
      yield identical octets.</t>
    </section>

    <section><name>Security Considerations</name>
      <t>The central property is non-enumerability: the frame MUST reveal
      nothing to a caller that is not a proven, related peer. The relationship
      predicate (<xref target="rel"/>) is the load-bearing control; weakening
      it to authentication alone reintroduces the oracle. Context extraction at
      the mux MUST be bounded and MUST NOT parse unbounded request bodies, so
      the resolution step cannot itself become a denial-of-service surface; a
      length-capped, shape-checked target identifier from a header or path is
      the intended input. A bad or missing identity proof MUST NOT earn status.
      Because status derives from the canonical record, revocation propagates
      without a distributable blocklist; an attacker cannot enumerate the
      blocklist because there is none.</t>
    </section>

    <section><name>IANA Considerations</name>
      <t>This document requests, on adoption, three registries with reserved
      ranges for future allocation: "MUX Status Reason Codes" (octet 0, bits
      3-0), "MUX Hint Retry/Source" (octet 1, bits 7-4), and "MUX Detail Codes"
      (octet 1, bits 3-0). Code points 1000-1111 in each nibble are Reserved.
      The allocation policy is Specification Required.</t>
    </section>

    <section><name>Worked Vectors</name>
      <artwork><![CDATA[
caller = world / unproven, ANY target            -> 0x0000
caller = trusted, NO relationship, ANY target    -> 0x0000
trusted + relationship, alive (explicit ack)     -> 0x4000
trusted + relationship, heartbeat-dead           -> 0x5152
trusted + relationship, not-in-session           -> 0x5293
trusted + relationship, not-registered           -> 0x5351
trusted + relationship, canonical tombstone      -> 0x65F6
trusted + relationship, successor available      -> 0x66F7
]]></artwork>
      <t>The two negatives - world and trusted-without-relationship over a
      tombstoned target both yielding 0x0000 - are the conformance guarantee:
      an implementation that "honestly" returns the dead nibble to the world
      fails them. A runnable interoperability vector set and reference verifier
      exist as "mux_status_v10" in the TIBET communications conformance kit;
      implementations SHOULD verify against the published vectors, including
      the anti-enumeration negatives, rather than against any single reference
      implementation.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="Scott Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="Barry Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>
      <reference anchor="JIS">
        <front>
          <title>JIS: JTel Identity System</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-jis-identity"/>
      </reference>
      <reference anchor="AINS">
        <front>
          <title>AINS: AInternet Naming and Discovery</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-ains-discovery"/>
      </reference>
      <reference anchor="TIBET">
        <front>
          <title>TIBET: Transaction/Interaction-Based Evidence Trail</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-provenance"/>
      </reference>
      <reference anchor="RVP">
        <front>
          <title>RVP: Continuous Verification Protocol</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-rvp-continuous-verification"/>
      </reference>
    </references>
  </back>
</rfc>
