<?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.39 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jennings-moq-mocha-pab-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="mocha-pab">MOCHA Personal Address Book</title>
    <seriesInfo name="Internet-Draft" value="draft-jennings-moq-mocha-pab-00"/>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Applications and Real-Time</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>MoQ</keyword>
    <keyword>MOQT</keyword>
    <keyword>MOCHA</keyword>
    <keyword>Address Book</keyword>
    <keyword>Contacts</keyword>
    <abstract>
      <?line 50?>

<t>This document defines how a set of devices owned by a common
user synchronize a Personal Address Book (PAB) over MOQT. The
address book maps identities to human-readable names and contact
information, enabling users to maintain a trusted contact list
that is consistent across all their devices.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jennings-moq-mocha-pab/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 58?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>MOCHA users need to maintain a personal directory of contacts
— mapping user identities (e.g., alice@provider.example) to
display names and other metadata they trust. This address book
must synchronize across all devices belonging to the same user
without requiring a centralized contacts server.</t>
      <t>This document specifies:</t>
      <ul spacing="normal">
        <li>
          <t>The MOQT namespace and track structure for address book data</t>
        </li>
        <li>
          <t>The contact card format (based on jCard <xref target="RFC7095"/>)</t>
        </li>
        <li>
          <t>The synchronization model across a user's devices</t>
        </li>
        <li>
          <t>Group and object organization for efficient retrieval</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>See BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>.</t>
      <t>This document uses terminology defined in <xref target="MOCHA-ARCH"/>,
including Provider, Organization, UserID, and Device.
HDevID is defined in <xref target="MOCHA-IDENTITY"/>.</t>
      <t>The following additional terms are used:</t>
      <dl>
        <dt>Personal Address Book (PAB):</dt>
        <dd>
          <t>A per-user collection of contact cards synchronized across
all of the user's devices via MOQT.</t>
        </dd>
        <dt>Contact Card:</dt>
        <dd>
          <t>A single entry in the address book, encoded as a jCard
<xref target="RFC7095"/> object. Each card maps an identity to a
human-readable name and optional metadata.</t>
        </dd>
      </dl>
    </section>
    <section anchor="namespace">
      <name>Namespace and Track Structure</name>
      <section anchor="pab-namespace">
        <name>Namespace</name>
        <t>The MOQT tracks carrying address book contact cards use the
following namespace tuple:</t>
        <artwork><![CDATA[
  ("mocha_v1", <Provider>, <OrgID>, "pab", <UserID>)
]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Provider</tt>: The user's home provider domain</t>
          </li>
          <li>
            <t><tt>OrgID</tt>: The organization the user belongs to</t>
          </li>
          <li>
            <t><tt>pab</tt>: Literal string identifying this as a Personal Address
Book namespace</t>
          </li>
          <li>
            <t><tt>UserID</tt>: The identity of the user who owns this address book</t>
          </li>
        </ul>
      </section>
      <section anchor="track-name">
        <name>Track Name</name>
        <t>Each device publishes its address book updates on its own track:</t>
        <artwork><![CDATA[
  Track Name: ("msg", <HDevID>)
]]></artwork>
        <t>Where <tt>HDevID</tt> identifies the publishing device. Each device
maintains its own track to avoid write conflicts between
devices.</t>
      </section>
      <section anchor="example">
        <name>Example</name>
        <artwork><![CDATA[
  Namespace: ("mocha_v1", "example.com", "acme", "pab", "alice")
  Track:     ("msg", "device-a3f2")
]]></artwork>
        <t>This represents the address book updates published by Alice's
device "device-a3f2" within the "acme" organization on
provider "example.com".</t>
      </section>
    </section>
    <section anchor="groups">
      <name>Group and Object Organization</name>
      <section anchor="pab-groups">
        <name>Groups</name>
        <t>There is one group per calendar month. This provides a natural
time-based partitioning that allows devices to efficiently
fetch recent changes without downloading the entire history.</t>
        <t>Groups are numbered sequentially, with the group ID derived
from the month:</t>
        <artwork><![CDATA[
  Group ID = (year - 2024) * 12 + (month - 1)

  Example: June 2026 = (2026 - 2024) * 12 + (6 - 1) = 29
]]></artwork>
      </section>
      <section anchor="objects">
        <name>Objects</name>
        <t>Each object within a group represents a single contact card
operation (add, update, or delete). Objects are sequentially
numbered within each group.</t>
        <artwork><![CDATA[
  Namespace: ("mocha_v1", "example.com", "acme", "pab", "alice")
  Track:     ("msg", "device-a3f2")
  Group:     29 (June 2026)
  Object:    0, 1, 2, ... (sequential operations)
]]></artwork>
      </section>
    </section>
    <section anchor="card-format">
      <name>Contact Card Format</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>Each object payload is a JSON <xref target="RFC8259"/> document containing
a contact card operation. The card data follows the jCard
format defined in <xref target="RFC7095"/>.</t>
      </section>
      <section anchor="operation-types">
        <name>Operation Types</name>
        <artwork><![CDATA[
{
  "op": "add" | "update" | "delete",
  "id": "<contact identity>",
  "timestamp": <unix timestamp>,
  "card": <jCard object (for add/update)>
}
]]></artwork>
      </section>
      <section anchor="example-adding-a-contact">
        <name>Example: Adding a Contact</name>
        <artwork><![CDATA[
{
  "op": "add",
  "id": "bob@example.com",
  "timestamp": 1751000000,
  "card": ["vcard", [
    ["version", {}, "text", "4.0"],
    ["fn", {}, "text", "Bob Smith"],
    ["email", {}, "text", "bob@example.com"]
  ]]
}
]]></artwork>
      </section>
      <section anchor="example-deleting-a-contact">
        <name>Example: Deleting a Contact</name>
        <artwork><![CDATA[
{
  "op": "delete",
  "id": "bob@example.com",
  "timestamp": 1751100000
}
]]></artwork>
      </section>
    </section>
    <section anchor="sync">
      <name>Synchronization Model</name>
      <section anchor="device-publishing">
        <name>Device Publishing</name>
        <t>Each device publishes contact card operations to its own track.
When a user adds, modifies, or deletes a contact on any device,
that device publishes a new object to the current month's group
on its track.</t>
      </section>
      <section anchor="device-subscribing">
        <name>Device Subscribing</name>
        <t>Each device subscribes to the tracks of all other devices
belonging to the same user. This is achieved by subscribing to
the PAB namespace:</t>
        <artwork><![CDATA[
  SUBSCRIBE_NAMESPACE ("mocha_v1", <Provider>, <OrgID>,
                       "pab", <UserID>)
]]></artwork>
        <t>The relay delivers objects from all device tracks within this
namespace, allowing each device to learn of changes made on
other devices.</t>
      </section>
      <section anchor="conflict-resolution">
        <name>Conflict Resolution</name>
        <t>When multiple devices publish conflicting operations (e.g.,
both update the same contact), the operation with the latest
timestamp wins. If timestamps are equal, the operation from
the lexicographically greater HDevID takes precedence.</t>
      </section>
      <section anchor="initial-sync">
        <name>Initial Sync</name>
        <t>A newly added device subscribes starting from the earliest
available group to reconstruct the full address book state.
The device applies all operations in group and object order,
with later operations overriding earlier ones for the same
contact identity.</t>
      </section>
    </section>
    <section anchor="auth">
      <name>Authorization</name>
      <t>Access to a user's PAB namespace is restricted to that user's
own devices. The Token Service issues C4M tokens (or Privacy
Pass tokens) scoped to the user's PAB namespace:</t>
      <artwork><![CDATA[
  publish:   ["mocha_v1/<provider>/<org>/pab/<user_id>/msg/<own-device>"]
  subscribe: ["mocha_v1/<provider>/<org>/pab/<user_id>/*"]
]]></artwork>
      <t>Each device can only publish to its own track but can subscribe
to all tracks within the user's PAB namespace.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="MoQTransport">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
            <organization>Google</organization>
          </author>
          <author fullname="Ian Swett" initials="I." surname="Swett">
            <organization>Google</organization>
          </author>
          <author fullname="Alan Frindell" initials="A." surname="Frindell">
            <organization>Meta</organization>
          </author>
          <date day="12" month="May" year="2026"/>
          <abstract>
            <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-18"/>
      </reference>
      <reference anchor="MOCHA-ARCH">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <date/>
        </front>
      </reference>
      <reference anchor="MOCHA-IDENTITY">
        <front>
          <title>MOCHA Identity: Authentication, Authorization, and Federation</title>
          <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
            <organization>Cisco</organization>
          </author>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <date day="6" month="July" year="2026"/>
          <abstract>
            <t>   This document specifies identity, authentication, authorization, and
   federation for MOCHA (MoQ Open Communication &amp; Hosting Architecture).
   It defines how users authenticate with Identity Providers (IdPs), how
   authorization tokens (C4M and Privacy Pass) are issued and validated
   at relays, how permissions map to MOQT namespaces, and how users from
   one Provider obtain access to resources on a federated Provider.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-jennings-moq-mocha-identity-00"/>
      </reference>
      <reference anchor="RFC7095">
        <front>
          <title>jCard: The JSON Format for vCard</title>
          <author fullname="P. Kewisch" initials="P." surname="Kewisch"/>
          <date month="January" year="2014"/>
          <abstract>
            <t>This specification defines "jCard", a JSON format for vCard data. The vCard data format is a text format for representing and exchanging information about individuals and other entities, for example, telephone numbers, email addresses, structured names, and delivery addresses. JSON is a lightweight, text-based, language- independent data interchange format commonly used in Internet applications.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7095"/>
        <seriesInfo name="DOI" value="10.17487/RFC7095"/>
      </reference>
      <reference anchor="RFC8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
          <date month="December" year="2017"/>
          <abstract>
            <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
            <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIALxATGoAA71Y63ITORb+r6fQmh+TzNrOZWAYXGwK44QhU0MScKiprSkK
5G45Fmm3jNTt4MmG2ofYJ9wn2e8cqdvdjhl2/yxVVNrSkc7tOzf1ej1RmCLT
A9l5dT56OZQX2nmbq0wO09Rp7+Vza687Qk0mTi9BNbfJTPUWatIRiSr0lXWr
gfRFKkRqk1zNcVPq1LTofdR5bvIr35vbT736VG9/X/hyMjfeG5sXqwXoT08u
X4i8nE+0G4gUlw5EYnOvc1/6gSxcqQU4/yCU0woSDBeLzIA3znup8lS+0Srr
XZq57ogb666vnC0XpI9OjZLnS+3k67eno4641ivspwMhe/KVfc1/zl9fhr/Q
nT6aWtPvEYRUSeHFUuclBJPyq9dLGdTp/AYhoLn8mShpfa5Mxqb79MzoYtq3
7oqWlUtmWJ4VxcIP9vaIipbMUvcrsj1a2Js4e+P1Hs7vdYRQZTGzjkTp4b+U
0zLLguFH+NK5/CVanndNbgqjMhhy1OcFX7pA3SIDL5WbP9iqIDU+sbyug+zT
rJxOV8+MMf1EiS2sx+VMeXkGd6jrcq7cBu/xBu8Nwm9w93kgf5bQTj+xcyFy
6+agX7JP4M1Lp3K/sK4AnnrH/YBBMiPjr6h2iZh83Ru+Gb1skm6BK9m+pj89
Pjm7PL38+zfOmFTnCKgVzr15MXq8/+TRIHz+dPjoyUAIk0/XgoteryfVxEO6
pBDicma8RBSVc9whUz01ufZyZm+kkl4X0k6xuDQJFu1NrlM5WWEH1pjbXJQe
QPSrPJk5C1Nq7GwNZblzMXy+Ky3hltDfl5czLVSkmBDFXC28jIoYMCusnMFV
eQ/xl6pJpiU5McReEuJjrZfNu1LnoKIIIKH4PPwIOpNDKsSzL3R9UmbGF6KY
qUJCe4p7/Cb9VeIsJFJZJouZNq7SvR/MNjdpmmkhHsjTvHA2LRPiLUTIYoFx
rsGnzX1R2SQ1TicFsheZNami/N///Bepv6iEb5phR/ev+l0IBCmeLZxdYs/1
9Wc1X2R6F3xEavwiU6uGeSxEd3KuCxiuUKTIKhiAzA59m3YXc6y3Xbg2QeX4
ic5sfkXiQS9cJz14sajixiAvlIV0+lNpHJEAHJDeQeI/1gb3wJKD9/ubgPML
nZgpNCVgEioYH0GZhUo0K0RQvUa+d7B36bSE11tKSNIzHq88nCiXygAPuTNR
HrLYXH4c0fLtbQyTu7vdeGxtAYaTnNtUZ7UtWNfvfGUQnOE0G6w9+QiftrIJ
C6inU5MY0tHpwhm9VBkBB7l9Sd6t6sgxRZzh30KMtZbPRxfy4CFk/AuEPDw4
eHJ3F3/8dPD44d3dPRNCNsBdu7nJbWavVjGIU2RCHFwnnru7LiImycqU3HQR
sdSV5w3Ju/ItND097kbZSN2+eImP02MKlS1XVzkqSkbeyTJ7w1BIU9YMyCf5
oLBj2KAaij/JEwMxkEMKmh5HQ4L7NAdaI2rYv74J3DR6i2ocsAtSQmrbcXKJ
6skJSIhYZCUhInD0kBl5htC7Ig3pfBNmlGMS4AKcCBOMJXBroCmCoS9PVDIL
EOS8pvIqplcUQgqntiS3AKdFtFgVv31CzVkrHi45HsZ1PNw+qOPlDtRN8tsH
1P80t+sY46jyJKVbRW+tI6ptZliRrCHWrl0HaFEiE8GhX758gVo7oVd7vzzo
dOXTCmRH+AbMTo/x0aE2Dr8D0I52+aD4DSmLi5P8UB36MODIjB6cWRioSoAA
P6VXouZrI2krBivvx+xFFYHowR3UvxoAEkZGTiFtgnOmbIaCU6TfUsqgHoO0
1p3uC2pEAWonN9Anb2aWSqePNzeTL/kqOJM8JgTDJmBVLkqUMz8DaE3RPibL
BTWsnhIa7eHy4MzaC+s7B+QRf0UGD1HcMrj8EBY/VBbgyjurmZM9gjgR0uGH
qGqbb/NnbC+tSeWNg4EJRFMUroIqSHGjdS7W5RSan4QqVgldg3bQRlEnVjtq
weinStB01zjqcGns7FZaD6iFq5XuBIY99cP0sBM15+zp9AL2hM7+XpjX5q08
wD3PkNh856MG7YslVcGYMIJ4bSiiRaiR29KGY3tdSs5DKWkmZAQw9/4+BDbT
+hjV9cYl+9IQIHQYFSh7InbRmKcKrQCCeRaLfxSE8J0rZA9UpQJTTC+UyIVy
BafsEAmonYoifp1A4eG6sGUrMdUFUIGmhgoRPJZfgabqCVIAI7MqDXdxYkX/
IyEFtUDQPWpDVSFMYpDAo5EgQvBddfkqPhu0QhGCDdHGpmLq7Jx3WLka+T9X
dH+TOysN3XvycP/w4a78Xh4cyr/KHSbH6sEuTRQRgphLSpgOlD/SQf67efBH
PoTtwycBR3BHcJiPgRs7gQgGFWVuIE1VJaaZXYWFr4KvdwDDboRfFxCCspku
9G6/YsSmalpI1HaLXDUJwoz7/8e4inYPNIdP5E5tTtoLwvPmflcedOVhV/b7
fbmz1kTWRvAxSh/IZoGWL0Ind/uATNYLfV0ICRqGl0bftJ2wUCuCHgWFkr+M
z89CmaaBCGW67p3YEYbQLlS7dawF6oe2kta4nQ41MKSN0ALELrPVG9UtQUh1
57WPLzGu++CaW9imYxcdjONwfEf+Q3aC7/kz+L7TJSKTEtHTSsCqzByFXYpf
X8CXIHpa5uazrFeOmICEp73Q/UYL7cQuei/w3D0SdzWu67BA5Qs9fXTGVsEb
Ik7s5FkLVpvyHTx+dLDP/5qS/d5Z8ldX/s4jOH6j9sJcWLm9A9wK/bkg2D3s
73fedSPN9N72czuR4zkiYU3E0/wm3aaY70D87t02AxyTF/7cBPcd9V9ZIZih
5inHGxPIK55Abh9QixuQHtpxeVHX5q81DNuBzMm7Va/71AXkcbwhLPguDT7c
BjTyj5fr2IBgKl9Flt0wQt/jj9KibyqcxZExKZ2jiOP8i36Oc5SIHUyUpqHk
uJz4xJnJPS193Ai1iG6OfSxaLu77efitBrWvT66xHFJ+SGaYzkKV92u21C/S
CUwk646vrjPjt8/Hozenz0/enw1fnYwvhqOTb/e+DMkt/7a3xJR2nKbRHm4w
FBDRpF5y8VtP6JUJ6jbEeFGL3A0lnDTSDTvCHhnqY5ipYuGeq1RTs9KyYXDL
KLZy8o32NivDswejZ15mhQHS6xYh4qDu/ohzA4ThRUNMwCSWurVjIsp2u7y0
Lox1G5BRY1aIOpawk/u+PJ2uU14okqgsKtu8hszGPs30Z5PYK6cWM5NQHQUc
Na52Mo66hbomTaixQa6lGZiMcBqeFjlUhRgSynEUcQPw3IcnpHGsfN2qwN6Z
IfnVkp5dae4LPQKcAVawDo90TEuvnO22FPcVEIRgEZkpepTW4a2mYWFA4Or+
8wTN+vxcw0Z0zQP0LudMGiBCIjrqJD0/Y1S+EZvFh3vXIT8Lr3tVeiZGshom
CYlN40A1v7XCSHIHTsNXUoTXMk4kgVRQfqrAx8X30l4DaGOq83zWlxBu9PAV
DmIDkIKcF2gLVbISF4oZ0/qu9Am0TKvY3yZJHdARtQMuGlUc7z2t+vajvado
6Y/2EKl7T+mi9yY92kMzhPWbvBfEPeJCUkNg8D/c9D2OctQ3c12iaHYAxKqQ
2kzgclIWTFXzFGRzer3cyAjbtWcfjjVyMw2tI3oHTStUIAGdH5/zW+fwbHh/
s/UGNed4yS2/A8KxnI7pXHw4nUAa8R+tuhTa+BkAAA==

-->

</rfc>
