<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netconf-yang-push-2-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="YANG-Push v2">YANG Datastore Telemetry (YANG Push version 2)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-yang-push-2-01"/>
    <author fullname="Robert Wilton" role="editor">
      <organization>Cisco Systems</organization>
      <address>
        <email>rwilton@cisco.com</email>
      </address>
    </author>
    <author fullname="Holger Keller">
      <organization>Deutsche Telekom</organization>
      <address>
        <email>Holger.Keller@telekom.de</email>
      </address>
    </author>
    <author fullname="Benoit Claise">
      <organization>Everything OPS</organization>
      <address>
        <email>benoit@everything-ops.net</email>
      </address>
    </author>
    <author fullname="Ebben Aries">
      <organization>HPE</organization>
      <address>
        <email>exa@hpe.com</email>
      </address>
    </author>
    <author fullname="James Cumming">
      <organization>Nokia</organization>
      <address>
        <email>james.cumming@nokia.com</email>
      </address>
    </author>
    <author fullname="Thomas Graf">
      <organization>Swisscom</organization>
      <address>
        <email>Thomas.Graf@swisscom.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Operations and Management</area>
    <workgroup>Network Configuration</workgroup>
    <keyword>YANG Push</keyword>
    <keyword>Observability</keyword>
    <keyword>Network Telemetry</keyword>
    <keyword>Operational Data</keyword>
    <abstract>
      <?line 137?>

<t>YANG Push version 2 is a YANG datastore telemetry solution, as an alternative lightweight specification to the Subscribed Notifications and YANG Push solution, specifically optimized for the efficient observability of operational data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rgwilton.github.io/draft-yp-observability/draft-ietf-netconf-yang-push-2.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-netconf-yang-push-2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network Configuration Working Group mailing list (<eref target="mailto:netconf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netconf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/netconf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rgwilton/draft-yp-observability"/>.</t>
    </note>
  </front>
  <middle>
    <?line 141?>

<section anchor="document-status">
      <name>Document Status</name>
      <t><em>RFC Editor: If present, please remove this section before publication.</em>
        <em>RFC Editor: Please replace 'RFC XXXX' with the RFC number for this RFC.</em></t>
      <t>Based on the feedback received during the IETF 121 NETCONF session, this document has currently been written as a self-contained lightweight protocol and document replacement for <xref target="RFC8639"/> and <xref target="RFC8641"/>, defining a separate configuration data model.</t>
      <t><strong>The comparison between YANG Push and YANG Push v2 is now in <xref target="DifferencesFromYangPush"/>.</strong></t>
      <t><strong>Open issues are either now being tracked inline in the text or in <xref target="OpenIssuesTracker"/> for the higher level issues.</strong></t>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>All <em>YANG tree diagrams</em> used in this document follow the notation
defined in <xref target="RFC8340"/>.</t>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="I-D.ietf-nmop-yang-message-broker-integration"/> describes an architecture for how YANG datastore telemetry, e.g., <xref target="RFC8641"/>, can be integrated effectively with message brokers, e.g., <xref target="Kafka"/>, that forms part of a wider architecture for a <em>Network Anomaly Detection Framework</em>, specified in <xref target="I-D.ietf-nmop-network-anomaly-architecture"/>.</t>
      <t>This document specifies "YANG Push v2", an lightweight alternative to Subscribed Notifications <xref target="RFC8639"/> and YANG Push <xref target="RFC8641"/>. YANG Push v2 is a separate YANG datastore telemetry solution, which can be implemented independently or, if desired, alongside <xref target="RFC8639"/> and <xref target="RFC8641"/>.</t>
      <t>At a high level, YANG Push v2 is designed to solve a similar set of requirements as YANG Push, and it reuses a significant subset of the ideas and base solution from YANG Push.  YANG Push v2 defines a separate data model to allow concurrent implementation of both protocols and to facilitate more significant changes in behavior, but many of the data nodes are taken from YANG Push and have the same, or very similar definitions.</t>
      <t>The following sections give the background for the solution, and highlight the key ways that this specification differs from the specifications that it is derived from.</t>
      <section anchor="background-and-motivation-for-yang-push-v2">
        <name>Background and Motivation for YANG Push v2</name>
        <t>A push based telemetry solution, as described both in this document and also the YANG Push solution described by <xref target="RFC8639"/> and <xref target="RFC8641"/>, is beneficial because it allows operational data to be exported by publishers more immediately and efficiently compared to legacy poll based mechanisms, such as SNMP <xref target="RFC3411"/>.  Some further background information on the general motivations for push based telemetry, which equally apply here, can be found in the <em>Motivation</em> (section 1.1) of <xref target="RFC8639"/> and the Introduction (section 1) of <xref target="RFC8641"/>.  The remainder of this section is focused on the reasons why a new lightweight version of YANG Push has been specified, and what problems is aims to solve.</t>
        <t>Early implementation efforts of the <xref target="I-D.ietf-nmop-yang-message-broker-integration"/> architecture hit issues with using either of the two common YANG datastore telemetry solutions that have been specified, i.e., <xref target="gNMI"/> or YANG Push <xref target="RFC8641"/>.</t>
        <t>gNMI is specified by the OpenConfig Industry Consortium.  It is more widely implemented, but operators report that some inter-operability issues between device implementations cause problems.  Many of the OpenConfig protocols and data models are also expected to evolve more rapidly than IETF protocols and models - that are expected to have a more gradual pace of evolution once an RFC has been published.</t>
        <t>YANG Push <xref target="RFC8641"/> was standardized by the IETF in 2019, but market adoption has been rather slow.  During 2023/2024, when vendors started implementing, or considering implementing, YANG Push, it was seen that some design choices for how particular features have been specified in the solution make it expensive and difficult to write performant implementations, particularly when considering the complexities and distributed nature of operational data.  In addition, some design choices of how the data is encoded (e.g., YANG Patch <xref target="RFC8072"/>) make more sense when considering changes in configuration data but less sense when the goal is to export a subset of the operational data off the device in an efficient fashion for both devices (publishers) and clients (receivers).</t>
        <t>Hence, during 2024, the vendors and operators working towards YANG telemetry solutions agreed to a plan to implement a subset of <xref target="RFC8639"/> and <xref target="RFC8641"/>, including common agreements of features that are not needed and would not be implemented, and deviations from the standards for some aspects of encoding YANG data.  In addition, the implementation efforts identified the minimal subset of functionality needed to support the initial telemetry use cases, and areas of potential improvement and optimization to the overall YANG Push telemetry solution (which has been written up as a set of small internet drafts that augment or extend the base YANG Push solution).</t>
        <t>Out of this work, consensus was building to specify a cut down version of Subscribed Notifications <xref target="RFC8639"/> and YANG Push <xref target="RFC8641"/> that is both more focussed on the operational telemetry use case and is also easier to implement, achieved by relaxing some of the constraints on consistency on the device, and removing, or simplifying some of the operational features.  This has resulted in this specification, YANG Push v2.</t>
        <t>The implementation efforts also gave rise to potential improvements to the protocol and encoding of notification messages.</t>
      </section>
      <section anchor="OperationalModellingComplexities">
        <name>Complexities in Modelling the Operational State Datastore</name>
        <t>The YANG abstraction of a single datastore of related consistent data works very well for configuration that has a strong requirement to be self consistent, and that is always updated, and validated, in a transactional way.  But for producers of telemetry data, the YANG abstraction of a single operational datastore is not really possible for devices managing a non-trivial quantity of operational data.</t>
        <t>Some systems may store their operational data in a single logical database, yet it is less likely that the operational data can always be updated in a transactional way, and often for memory efficiency reasons such a database does not store individual leaves, but instead semi-consistent records of data at a container or list entry level.</t>
        <t>For other systems, the operational information may be distributed across multiple internal nodes (e.g., linecards), and potentially many different process daemons within those distributed nodes.  Such systems generally do not, and cannot, exhibit full consistency <xref target="Consistency"/> of the operational data (which would require transactional semantics across all daemons and internal nodes), only offering an eventually consistent <xref target="EventualConsistency"/> view of the data instead.</t>
        <t>In practice, many network devices will manage their operational data as a combination of some data being stored in a central operational datastore, and other, higher scale, and potentially more frequently changing data (e.g., statistics or FIB information) being stored elsewhere in a more memory efficient and performant way.</t>
      </section>
      <section anchor="complexities-for-consumers-of-yang-push-data">
        <name>Complexities for Consumers of YANG Push Data</name>
        <t>For the consumer of the telemetry data, there is a requirement to associate a schema with the instance-data that will be provided by a subscription.  One approach is to fetch and build the entire schema for the device, e.g., by fetching YANG library, and then use the subscription XPath to select the relevant subtree of the schema that applies only to the subscription.  The problem with this approach is that if the schema ever changes, e.g., after a software update, then it is reasonably likely of some changes occurring with the global device schema even if there are no changes to the schema subtree under the subscription path.  Hence, it would be helpful to identify and version the schema associated with a particular subscription path, and also to encoded the instance data relatively to the subscription path rather than as an absolute path from the root of the operational datastore.</t>
        <t><strong>TODO More needs to be added here, e.g., encoding, on-change considerations.  Splitting subscriptions up.</strong></t>
        <t>This document proposes a new opt-in YANG-Push encoding format to use instead of the "push-update" and "push-change-update" notifications defined in <xref target="RFC8641"/>.</t>
        <ol spacing="normal" type="1"><li>
            <t>To allow the device to split a subscription into smaller child subscriptions for more efficient independent and concurrent processing.  I.e., reusing the ideas from <xref target="I-D.ietf-netconf-distributed-notif"/>.  However, all child subscriptions are still encoded from the same subscription point.</t>
          </li>
        </ol>
        <section anchor="combined-periodic-and-on-change-subscription">
          <name>Combined periodic and on-change subscription</name>
          <t>Sometimes it is helpful to have a single subscription that covers both periodic and on-change notifications.</t>
          <t>There are two ways in which this may be useful:</t>
          <ol spacing="normal" type="1"><li>
              <t>For generally slow changing data (e.g., a device's physical inventory), then on-change notifications may be most appropriate.  However, in case there is any lost notification that isn't always detected, for any reason, then it may also be helpful to have a slow cadence periodic backup notification of the data (e.g., once every 24 hours), to ensure that the management systems should always eventually converge on the current state in the network.</t>
            </li>
            <li>
              <t>For data that is generally polled on a periodic basis (e.g., once every 10 minutes) and put into a time series database, then it may be helpful for some data trees to also get more immediate notifications that the data has changed.  Hence, a combined periodic and on-change subscription, would facilitate more frequent notifications of changes of the state, to reduce the need of having to always wait for the next periodic event.</t>
            </li>
          </ol>
          <t>Hence, this document allows a single subscription to be configured as both periodic and on-change.</t>
        </section>
      </section>
      <section anchor="DraftRelationships">
        <name>Relationships to existing RFCs and Internet Drafts</name>
        <t>This document, specifying YANG Push v2, is intended to be a lightweight alternative for <xref target="RFC8639"/> and <xref target="RFC8641"/>, but that also incorporates various extensions since those RFCs were written.  Often substantial parts of those documents and models have been incorporated almost verbatim, but modified to fit the YANG Push v2 functionality and module structure.</t>
        <t>Hence, the authors of this draft would like to sincerely thank and acknowledge the very significant effort put into those RFCs and drafts by authors, contributors and reviewers.  In particular, We would like to thank the listed authors of these documents: Eric Voit, Alex Clemm, Alberto Gonzalez Prieto, Einar Nilsen-Nygaard, Ambika Prasad Tripathy, Balazs Lengyel, Alexander Clemm, Benoit Claise, Qin Wu, Qiufang Ma, Alex Huang Feng, Thomas Graf, Pierre Francois.</t>
        <section anchor="rfc-8639-and-rfc-8641">
          <name>RFC 8639 and RFC 8641</name>
          <t>This document is primarily intended to be a lightweight alternative for <xref target="RFC8639"/> and <xref target="RFC8641"/>, but it intentionally reuses substantial parts of the design and data model of those RFCs.</t>
          <t>YANG Push v2 is defined using a separate module namespace, and hence can be implemented independently or, if desired, alongside <xref target="RFC8639"/> and <xref target="RFC8641"/>, and the various extensions to YANG Push.</t>
          <t>A more complete description of the main differences in YANG Push v2 compares to <xref target="RFC8639"/> and <xref target="RFC8641"/> is given in <xref target="DifferencesFromYangPush"/>.</t>
        </section>
        <section anchor="i-dietf-netconf-notif-envelope-and-rfc-5277">
          <name><xref target="I-D.ietf-netconf-notif-envelope"/> and RFC 5277</name>
          <t>All of the notifications defined in this specification, i.e., both the datastore update message and subscription lifecycle update notifications (<xref target="LifecycleNotifications"/>), use the notification envelope defined in <xref target="NotificationEnvelope"/> and the <tt>ietf-yang-push-2</tt> YANG module (<xref target="yang-push-2-yang-module"/>).  This envelope is derived from the work in <xref target="I-D.ietf-netconf-notif-envelope"/>, but is defined independently in this document.</t>
          <t>As such, this specification does not make any use of the notification format defined in <xref target="RFC5277"/>, but this does not prevent implementations using <xref target="RFC5277"/> format notifications for other YANG notifications, e.g., for the "NETCONF" event stream defined in <xref target="RFC5277"/>.</t>
        </section>
        <section anchor="rfc-9196-and-i-dnetana-netconf-yp-transport-capabilities">
          <name>RFC 9196 and <xref target="I-D.netana-netconf-yp-transport-capabilities"/></name>
          <t><xref target="RFC9196"/> defines the <tt>ietf-system-capabilities</tt> module as a common structure that other modules can augment with capability data.  It also defines the <tt>ietf-notification-capabilities</tt> module, which describes capabilities for YANG Push as specified in <xref target="RFC8641"/>, but those capabilities do not apply to YANG Push v2.  Instead, this document defines YANG Push v2 capabilities in the <tt>ietf-yang-push-2-capabilities</tt> module, which augments <tt>ietf-system-capabilities</tt> directly (see <xref target="Capabilities"/>).</t>
          <t>The generic transport capabilities defined in <xref target="I-D.netana-netconf-yp-transport-capabilities"/> have been incorporated into the ietf-yang-push-2 YANG module, to augment YANG Push v2 transport capabilities and to use the different identities.</t>
        </section>
        <section anchor="i-dietf-netconf-https-notif-and-i-dietf-netconf-udp-notif">
          <name><xref target="I-D.ietf-netconf-https-notif"/> and <xref target="I-D.ietf-netconf-udp-notif"/></name>
          <t>The ietf-yang-push-2 YANG module has subsumed and extended the <em>receivers</em> data model defined in the ietf-subscribed-notif-receivers YANG module defined in <xref target="I-D.ietf-netconf-https-notif"/>.</t>
          <t>The overall YANG Push v2 solution anticipates and requires new bis versions of both of these transports documents that augment into the <em>receivers/receiver/transport-type</em> choice statement, and also augment the transport identity defined in the ietf-yang-push-2 data model.</t>
        </section>
        <section anchor="i-dietf-netconf-distributed-notif">
          <name><xref target="I-D.ietf-netconf-distributed-notif"/></name>
          <t>This document builds on the architecture of <xref target="I-D.ietf-netconf-distributed-notif"/>.  The YANG Push v2 distributed-notification behavior is fully defined in <xref target="distributed-notifications"/>, with changes to the message structure and tighter restrictions on publisher ID allocation.</t>
        </section>
      </section>
    </section>
    <section anchor="overview">
      <name>YANG Push v2 Overview</name>
      <t>This document specifies a lightweight telemetry solution that provides a subscription service for updates to the state and changes in state from a chosen datastore.</t>
      <t>Subscriptions specify when notification messages (also referred to as <em>updates</em>) should be sent, what data to include in the update records, and where those notifications should be sent.</t>
      <t>A YANG Push v2 subscription comprises:</t>
      <ul spacing="normal">
        <li>
          <t>a target datastore for the subscription, where the monitored subscription data is logically sourced from.</t>
        </li>
        <li>
          <t>a set of selection filters to choose which datastore nodes from the target datastore the subscription is monitoring or sampling, as described in <xref target="pathsAndFilters"/>.</t>
        </li>
        <li>
          <t>a choice of how update event notifications for the datastore's data nodes are triggered.  I.e., either periodic sampling of the current state, on-change event-driven, or both.  These are described in <xref target="UpdateTriggers"/>.</t>
        </li>
        <li>
          <t>a choice of encoding for notification messages, including both the envelope and its contents, e.g., JSON or CBOR (<xref target="Encodings"/>).</t>
        </li>
        <li>
          <t>a receiver to which datastore updates and subscription notifications are sent, as described in <xref target="receivers"/>;  </t>
          <ul spacing="normal">
            <li>
              <t>for configured subscriptions, the receivers parameters are configured, and specify transport, receiver, and encoding parameters.</t>
            </li>
            <li>
              <t>for dynamic subscriptions, the receiver uses the same transport session on which the dynamic subscription has been created.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>If a subscription is valid and acceptable to the publisher, and if a suitable connection can be made to the receiver associated with a subscription, then the publisher will enact the subscription, periodically sampling or monitoring changes to the chosen datastore's data nodes that match the selection filter.  Push updates are subsequently sent by the publisher to the receiver, as per the terms of the subscription.</t>
      <t>Subscriptions may be set up in two ways: either through configuration - or YANG RPCs to create and manage dynamic subscriptions.  These two mechanisms are described in <xref target="ConfiguredAndDynamic"/>.</t>
      <t>Changes to the state of subscription are notified to receivers as subscription lifecycle notifications.  These are described in <xref target="LifecycleNotifications"/>.</t>
      <t>Security access control mechanisms, e.g., NACM {RFC8341}} can be used to ensure the receivers only get access to the information for which they are allowed.  This is further described in <xref target="security"/>.</t>
      <t>While the functionality defined in this document is transport agnostic, transports like the Network Configuration Protocol (NETCONF) <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/> can be used to configure or dynamically signal subscriptions.  In the case of configured subscription, the transport used for carrying the subscription notifications is entirely independent from the protocol used to configure the subscription, and other transports, e.g., <xref target="I-D.ietf-netconf-udp-notif"/> defines a simple UDP based transport for Push notifications. Transport considerations are described in <xref target="transports"/>. <strong>TODO the reference to draft-ietf-netconf-udp-notif isn't right, it wouldn't be that draft, but a -bis version of it.  James is querying whether we need this at all</strong></t>
      <t><strong>TODO Introduce capabilities and operational monitoring</strong></t>
      <t>This document defines a YANG data model, that includes RPCs and notifications, for configuring and managing subscriptions and associated configuration, and to define the format of a <em>update</em> notification message.  The YANG model is defined in <xref target="yang-push-2-yang-module"/> and associated tree view in <xref target="yang-push-2-tree"/>.  The YANG data model defined in this document conforms to the Network Management Datastore Architecture defined in <xref target="RFC8342"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Definitions</name>
      <t>This document reuses the terminology defined in <xref target="RFC7950"/>, <xref target="RFC8341"/>, <xref target="RFC8342"/>, <xref target="RFC8639"/> and <xref target="RFC8641"/>.</t>
      <t>The following terms are taken from <xref target="RFC8342"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Datastore</em>: A conceptual place to store and access information.  A datastore might be implemented, for example, using files, a database, flash memory locations, or combinations thereof.  A datastore maps to an instantiated YANG data tree.</t>
        </li>
        <li>
          <t><em>Client</em>: An entity that can access YANG-defined data on a server, over some network management protocol.</t>
        </li>
        <li>
          <t><em>Configuration</em>: Data that is required to get a device from its initial default state into a desired operational state.  This data is modeled in YANG using "config true" nodes.  Configuration can originate from different sources.</t>
        </li>
        <li>
          <t><em>Configuration datastore</em>: A datastore holding configuration.</t>
        </li>
      </ul>
      <t>The following terms are taken from <xref target="RFC8639"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Configured subscription</em>: A subscription installed via configuration into a configuration datastore.</t>
        </li>
        <li>
          <t><em>Dynamic subscription</em>: A subscription created dynamically by a subscriber via a Remote Procedure Call (RPC).</t>
        </li>
        <li>
          <t><em>Event</em>: An occurrence of something that may be of interest.  Examples include a configuration change, a fault, a change in status, crossing a threshold, or an external input to the system.</t>
        </li>
        <li>
          <t><em>Event occurrence time</em>: A timestamp matching the time an originating process identified as when an event happened.</t>
        </li>
        <li>
          <t><em>Event record</em>: A set of information detailing an event.</t>
        </li>
        <li>
          <t><em>Event stream</em>: A continuous, chronologically ordered set of events aggregated under some context.</t>
        </li>
        <li>
          <t><em>Event stream filter</em>: Evaluation criteria that may be applied against event records in an event stream.  Event records pass the filter when specified criteria are met.</t>
        </li>
        <li>
          <t><em>Notification message</em>: Information intended for a receiver indicating that one or more events have occurred.</t>
        </li>
        <li>
          <t><em>Publisher</em>: An entity responsible for streaming notification messages per the terms of a subscription.</t>
        </li>
        <li>
          <t><em>Receiver</em>: A target to which a publisher pushes subscribed event records.  For dynamic subscriptions, the receiver and subscriber are the same entity.</t>
        </li>
        <li>
          <t><em>Subscriber</em>: A client able to request and negotiate a contract for the generation and push of event records from a publisher.  For dynamic subscriptions, the receiver and subscriber are the same entity.</t>
        </li>
      </ul>
      <t>The following terms are taken from <xref target="RFC8641"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Datastore node</em>: A node in the instantiated YANG data tree associated with a datastore.  In this document, datastore nodes are often also simply referred to as "objects".</t>
        </li>
        <li>
          <t><em>Datastore node update</em>: A data item containing the current value of a datastore node at the time the datastore node update was created, as well as the path to the datastore node.</t>
        </li>
        <li>
          <t><em>Datastore subscription</em>: A subscription to a stream of datastore node updates.</t>
        </li>
        <li>
          <t><em>Datastore subtree</em>: A datastore node and all its descendant datastore nodes.</t>
        </li>
        <li>
          <t><em>On-change subscription</em>: A datastore subscription with updates that are triggered when changes in subscribed datastore nodes are detected.</t>
        </li>
        <li>
          <t><em>Periodic subscription</em>: A datastore subscription with updates that are triggered periodically according to some time interval.</t>
        </li>
        <li>
          <t><em>Selection filter</em>: Evaluation and/or selection criteria that may be applied against a targeted set of objects.</t>
        </li>
        <li>
          <t><em>Update record</em>: A representation of one or more datastore node updates.  In addition, an update record may contain which type of update led to the datastore node update (e.g., whether the datastore node was added, changed, or deleted).  Also included in the update record may be other metadata, such as a subscription id of the subscription for which the update record was generated.  In this document, update records are often also simply referred to as "updates".</t>
        </li>
        <li>
          <t><em>Update trigger</em>: A mechanism that determines when an update record needs to be generated.</t>
        </li>
        <li>
          <t><em>YANG-Push</em>: The subscription and push mechanism for datastore updates that is specified in <xref target="RFC8641"/>.</t>
        </li>
      </ul>
      <t>This document introduces the following terms:</t>
      <ul spacing="normal">
        <li>
          <t><em>Subscription</em>: A registration with a publisher, stipulating the information the receiver wishes to have pushed from the publisher without the need for further solicitation.</t>
        </li>
        <li>
          <t><em>Subscription Identifier</em>: A numerical identifier for a configured or dynamic subscription.  Also referred to as the subscription-id.</t>
        </li>
        <li>
          <t><em>YANG-Push-Lite</em>: The light weight subscription and push mechanism for datastore updates that is specified in this document. <strong>Add comment</strong></t>
        </li>
      </ul>
      <t>The following terms from <xref target="I-D.ietf-netconf-distributed-notif"/> are reused here; their definitions are given below for completeness:</t>
      <ul spacing="normal">
        <li>
          <t><em>Network Node</em>: The device containing the publishing processes.</t>
        </li>
        <li>
          <t><em>Publisher Parent</em> (also referred to as the Publisher Parent Process): The component that manages the overall subscription and coordinates its decomposition among Publisher Agents.</t>
        </li>
        <li>
          <t><em>Publisher Agent</em>: The component that handles an assigned part of the subscription and sends its data to the receiver.</t>
        </li>
        <li>
          <t><em>Message Publisher</em>: A publisher that sends notification messages to the receiver.</t>
        </li>
        <li>
          <t><em>Message Publisher ID</em>: A 32-bit identifier of a publishing process that is locally unique within the Network Node.</t>
        </li>
      </ul>
    </section>
    <section anchor="pathsAndFilters">
      <name>Subscription paths and selection filters</name>
      <t>A key part of a subscription is to select which data nodes should be monitored, and so a subscription must specify both the selection filters and the datastore against which these selection filters will be applied.  This information is used to choose, and subsequently push, <em>update</em> notifications from the publisher's datastore(s) to the subscription's receiver.</t>
      <t>Filters can either be defined inline within a configured subscription (<xref target="SubscriptionYangTree"/>), a dynamic subscription's <em>establish-subscription</em> RPC (<xref target="EstablishSubscriptionYangTree"/>), or as part of the <em>datastore-telemetry/filters</em> container (<xref target="FilterContainerYangTree"/>) which can then be referenced from a configured or dynamic subscription.</t>
      <t>The following selection filter types are included in the YANG Push v2 data model and may be applied against a datastore:</t>
      <ul spacing="normal">
        <li>
          <t><em>YPaths</em>: A list of basic YANG path selection filters that defines a path to a subtree of data nodes in the data tree, with some simple constraints on keys. See <xref target="YPaths"/>.</t>
        </li>
        <li>
          <t><em>subtree</em>: A subtree selection filter identifies one or more datastore subtrees.  When specified, <em>update</em> records will only include the datastore nodes of selected datastore subtree(s).  The syntax and semantics correspond to those specified in <xref target="RFC6241"/>, Section 6.</t>
        </li>
        <li>
          <t><em>XPaths</em>: A list of <em>XPath</em> (<xref target="XPATH"/>) selection filter expressions.  When specified, updates will only come from the selected datastore nodes that match the node set associated with the XPath expression.</t>
        </li>
      </ul>
      <t>These filters are used as selectors that define which data nodes fall within the scope of a subscription.  A publisher <bcp14>MUST</bcp14> support YPath filters, and <bcp14>MAY</bcp14> also support subtree or XPath filters.</t>
      <t>For both YPath and XPath based filters, each filter may define a list of path expressions.  Each of these filter path expressions <bcp14>MAY</bcp14> be processed by the publisher independently, and if two or more filter path expressions end up selecting overlapping data nodes then the publisher <bcp14>MAY</bcp14> notify duplicate values for those data nodes, but the encoded data that is returned <bcp14>MUST</bcp14> always be syntactically valid, i.e., as per section 5.3 of <xref target="RFC8342"/>.</t>
      <section anchor="YPaths">
        <name><em>YPath</em> definition</name>
        <t>A <em>YPath</em> represents a simple path into a YANG schema tree, where some of the list key values may be constrained.</t>
        <t>A general YPath format is proposed in <xref target="I-D.jgc-netmod-yang-path"/>.  The syntax defined below remains the current syntax used by this document, but the intention is to align it with the general YPath format.  Alignment requires resolving differences in string quoting, multi-key predicate syntax, relative paths, and regular-expression semantics.</t>
        <t>It is encoded in the similar format to the YANG JSON encoding for instance-identifier, section 6.11 of <xref target="RFC7951"/>, except with more flexibility on the keys, in that keys may be left-out or be bound to a regular expression filter.</t>
        <t>The rules for constructing a YPath are:</t>
        <ul spacing="normal">
          <li>
            <t>A YPath is a sequence of data tree path segment separated by a '/' character.  If the path starts with a '/' then it is absolute path from the root of the schema, otherwise it is a relative path, where the context of the relative path must be declared.</t>
          </li>
          <li>
            <t>Constraints on key values may be specified within a single pair of '[' ']' brackets, where:  </t>
            <ul spacing="normal">
              <li>
                <t>keys may be given in any order, and may be omitted, in which case they match any value.  Key matches are separated by a comma (,) with optional space character either side.</t>
              </li>
              <li>
                <t>key match is given by <em>&lt;key&gt;=&lt;value&gt;</em>, with optional space characters either side of the equals (=), and value is specified as:      </t>
                <ul spacing="normal">
                  <li>
                    <t>'&lt;value&gt;', for an exact match of the key's value.  Single quote characters (') must be escaped with a backslash (\).</t>
                  </li>
                  <li>
                    <t>r'&lt;reg-expr&gt;', for a regex match of the key value using <xref target="RFC9485"/>, and where the regular-expression is a full match of the string, i.e, it implicit anchors to the start and end of the value.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <t>Some examples of YPaths:</t>
        <ul spacing="normal">
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[name='eth0']/ietf-ip:ipv6/ip</em> - which identifies is 'ipv6/ip' data node in the ietf-ip module for the 'eth0' interface.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[name=r'eth.*']/ietf-ip:ipv6/ip</em> - which identifies all interfaces with a name that start with "eth".</t>
          </li>
          <li>
            <t><em>/example:multi-keys-list[first-key='foo', second-key=r'bar.*']</em> - which identifies all entries in the 'multi-keys-list, where the first-key matches foo, and the second-key starts with bar.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface</em> - which identifies the <em>interface</em> list data node in the ietf-interfaces module for all interfaces.  I.e., the interface list 'name' key is unrestricted.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[]</em> - alternative form of the previous YPath.</t>
          </li>
        </ul>
      </section>
      <section anchor="the-filters-container">
        <name>The "filters" Container</name>
        <t>The "filters" container maintains a list of all datastore subscription filters that persist outside the lifecycle of a single subscription.  This enables predefined filters that may be referenced by more than one configured or dynamic subscription.</t>
        <t>Below is a tree diagram for the "filters" container.  All objects contained in this tree are described in the YANG module in <xref target="ietf-yang-push-2-yang"/>.</t>
        <figure anchor="FilterContainerYangTree">
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw filters
        +--rw filter* [name]
           +--rw name             string
           +--rw (filter)
              +--:(path)
              |  +--rw path       ypath
              +--:(subtree)
              |  +--rw subtree    <anydata> {yp2:subtree}?
              +--:(xpath)
                 +--rw xpath      yang:xpath1.0 {yp2:xpath}?

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
      </section>
      <section anchor="decomposing-subscription-filters">
        <name>Decomposing Subscription Filters</name>
        <t>In order to address the issues described in <xref target="OperationalModellingComplexities"/>, YANG Push v2 allows for publishers to send subtrees of data nodes in separate <em>update</em> notifications, rather than requiring that the subscription data be returned as a single datastore <em>update</em> notification covering all data nodes matched by the subscription filter.  This better facilitates publishers that internally group some of their operational data fields together into larger structures for efficiency, and avoids publishers or receivers having to consume potentially very large notification messages.  For example, each entry in the <em>/ietf-interfaces:interface/interface</em> list could be represented as an object of data internally within the publisher.  In essence, a client specified subscription filter can be decomposed by a publisher into more specific non-overlapping filters that are then used to return the data.</t>
        <t>In particular:</t>
        <ol spacing="normal" type="1"><li>
            <t>A Publisher <bcp14>MAY</bcp14> decompose a client specified subscription filter path into a set of non-overlapping subscription filter paths that collectively cover the same data.  The publisher is allowed to return data for each of these decomposed subscription filter paths in separate <em>update</em> notification messages, each with separate, perhaps more precise, <em>observation-time</em> timestamps, but all using the same notification <em>event-time</em>.</t>
          </li>
          <li>
            <t>A Publisher <bcp14>MAY</bcp14> split large lists into multiple separate update messages, each with separate <em>observation-time</em> timestamps, but all using the same notification <em>event-time</em>.  E.g., if a device has 10,000 entries in a list, it may return them in a single response, or it may split them into multiple smaller messages, perhaps for 500 interfaces at a time.</t>
          </li>
        </ol>
        <!--
1. A Publisher is allowed to generate on-change notifications at an *object* level, which hence may contain other associated fields that may not have changed state, rather than restricting the on-change notifications strictly to only those specific fields that have changed state.  E.g., if a subscribers registers on the path */ietf-interfaces:interfaces/interface\[name = \*\]/oper-status*, and if interface *eth1* had a change in the *oper-status* leaf state, then rather than just publishing the updated *oper-status* leaf, the publisher may instead publish all the data associated with that interface entry object, i.e., everything under */ietf-interfaces:interface/interface\[name = eth1\]*.  **TODO Does it have to be the entire subtree that is published?  Do we need to add a capability annotation to indicate the object publication paths?**
-->

<t>To ensure that clients can reasonably process data returned via decomposed filters then:</t>
        <ol spacing="normal" type="1"><li>
            <t><em>update</em> notifications <bcp14>MUST</bcp14> identify the target paths of the supplied data.  When a periodic or resync collection is split across messages, receivers <bcp14>MUST</bcp14> wait for <em>complete</em> or <em>update-complete</em> before inferring deletions from the absence of subscribed data in that collection.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="events">
      <name>Datastore Event Streams</name>
      <t>In YANG Push v2, a subscription, based on the selected filters, will generate a ordered stream of datastore <em>update</em> records that is referred to as an event stream.  Each subscription logically has a different event stream of update records, even if multiple subscriptions use the same filters to select datastore nodes.</t>
      <t>As YANG-defined event records are created by a system, they may be assigned to one or more streams.  The event record is distributed to a subscription's receiver where (1) a subscription includes the identified stream and (2) subscription filtering does not exclude the event record from that receiver.</t>
      <t>Access control permissions may be used to silently exclude event records from an event stream for which the receiver has no read access.  See <xref target="RFC8341"/>, Section 3.4.6 for an example of how this might be accomplished.  Note that per Section 2.7 of this document, subscription state change notifications are never filtered out. <strong>TODO, filtering and NACM filtering should be dependent on whether it is a configured or dynamic subscription.</strong></t>
      <t>If subscriber permissions change during the lifecycle of a subscription and event stream access is no longer permitted, then the subscription <bcp14>MUST</bcp14> be terminated. <strong>TODO, check this</strong></t>
      <t>Event records <bcp14>SHALL</bcp14> be sent to a receiver in the order in which they were generated.  I.e., the publisher <bcp14>MUST</bcp14> not reorder the events when enqueuing notifications on the transport session, but there is no guarantee of delivery order.</t>
      <t>Event records <bcp14>MUST NOT</bcp14> be sent before a <em>subscription-started</em> notification (<xref target="SubscriptionStartedNotification"/>) or after a <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>).</t>
      <section anchor="NotificationEnvelope">
        <name>Notification Envelope</name>
        <t>All YANG Push v2 notification messages <bcp14>MUST</bcp14> use the <em>envelope</em> structure defined in the <tt>ietf-yang-push-2</tt> YANG module (<xref target="yang-push-2-yang-module"/>).  This applies to <em>update</em>, <em>update-complete</em>, and all subscription lifecycle notifications (<xref target="LifecycleNotifications"/>).  All messages <bcp14>MUST</bcp14> include the <em>event-time</em>, <em>hostname</em>, <em>sequence-number</em>, and <em>contents</em> nodes.  The <em>publisher-id</em> <bcp14>MAY</bcp14> be excluded if it matches the default value (0), otherwise it <bcp14>MUST</bcp14> be included.</t>
        <figure>
          <name>YANG Push v2 notification envelope</name>
          <sourcecode type="yangtree"><![CDATA[
  structure envelope:
    +-- event-time         yang:date-and-time
    +-- hostname           inet:host-name
    +-- publisher-id?      uint32
    +-- sequence-number    yang:counter32
    +-- extensions
    +-- contents           <anydata>
]]></sourcecode>
        </figure>
        <t>Publishers <bcp14>SHOULD</bcp14> encode the envelope fields in the order in which they are defined in the <tt>ietf-yang-push-2</tt> YANG module, placing all envelope header fields, including the <em>extensions</em> container and its fields, before <em>contents</em>.  However, some encodings, such as JSON <xref target="RFC7951"/>, do not guarantee field ordering.  For example, reprocessing JSON within a telemetry data pipeline may reorder the fields.  Receivers <bcp14>SHOULD NOT</bcp14> rely on the order of envelope fields unless they can be confident that the ordering has not changed since publication.</t>
        <t>The normative field definitions are given in the YANG module.  The fields can be summarized as:</t>
        <ul spacing="normal">
          <li>
            <t><em>event-time</em> - the time the telemetry infrastructure began processing the collection, on-change event, or subscription lifecycle event.</t>
          </li>
          <li>
            <t><em>hostname</em> - the hostname identifying the network node that published the notification.</t>
          </li>
          <li>
            <t><em>publisher-id</em> - identifies the publishing process within the network node.  The default is 0, which identifies the Publisher Parent (<xref target="distributed-notifications"/>).</t>
          </li>
          <li>
            <t><em>sequence-number</em> - a counter maintained independently for each publisher within a subscription.  It starts at 1, increments by 1 for each notification from that publisher for that subscription, and wraps from 4294967295 to 0 and continues.</t>
          </li>
          <li>
            <t><em>extensions</em> - a container reserved for future envelope metadata extensions.</t>
          </li>
          <li>
            <t><em>contents</em> - the notification carried by the envelope.</t>
          </li>
        </ul>
        <t>The <em>contents</em> anydata node <bcp14>MUST</bcp14> contain exactly one notification, identified by the name of its YANG <em>notification</em> statement and the namespace of the module defining that statement.  The notification's data node values are carried unchanged.</t>
        <t>Sequence numbers are tracked separately for each combination of <em>hostname</em>, subscription <em>id</em>, and <em>publisher-id</em> (including the default publisher ID of 0).  The counter covers all notification types sent by that publisher for that subscription, including lifecycle and <em>update-complete</em> notifications.  It continues across collections and subscription modifications without resetting while that publisher remains part of the subscription.  A newly created publisher starts its own counter at 1.  A publisher removed from and subsequently re-added to a subscription <bcp14>MUST</bcp14> be allocated a new <em>publisher-id</em>.  A removed <em>publisher-id</em> <bcp14>MUST NOT</bcp14> be reused within that subscription's lifetime.  Terminating and recreating a subscription starts a new lifetime and new counters, even if the subscription ID is reused.</t>
        <t>For periodic and resynchronization collections, <em>event-time</em> records when the telemetry infrastructure starts processing the collection.  For an on-change event, it records when the telemetry infrastructure starts processing the notification of that change.  All notification messages belonging to the same collection or on-change event <bcp14>MUST</bcp14> carry the same <em>event-time</em>, including messages from different publishing processes.  Any <em>update-complete</em> notification for a periodic or resynchronization collection <bcp14>MUST</bcp14> carry that collection's <em>event-time</em>.  For a subscription lifecycle notification, <em>event-time</em> records when processing of that lifecycle event began.</t>
        <t>The common <em>event-time</em> correlates messages from one collection or on-change event.  It does not imply that the reported data was read or changed at that instant.  A completed periodic or resynchronization collection comprises data collected for that operation, potentially at different observation times.</t>
        <t>The following example illustrates a fully encoded <em>update</em> notification defined in the <tt>ietf-yang-push-2</tt> YANG module and carried in the <em>contents</em> node.</t>
        <figure anchor="FullNotificationExample">
          <name>Example of update notification including notification envelope</name>
          <sourcecode type="json"><![CDATA[
{
  "ietf-yang-push-2:envelope": {
    "event-time": "2024-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "sequence-number": 3219,
    "contents": {
      "update": {
        "id": "interfaces",
        "path-prefix": "/ietf-interfaces:interfaces",
        "snapshot-type": "periodic",
        "observation-time": "2024-10-10T08:00:05.11Z",
        "updates": [
          {
            "target": "interface",
            "update": {
              "interface": [
                {
                  "name": "eth0",
                  "type": "iana-if-type:ethernetCsmacd",
                  "enabled": true,
                  "oper-status": "up",
                  "admin-status": "up"
                },
                {
                  "name": "eth1",
                  "type": "iana-if-type:ethernetCsmacd",
                  "enabled": true,
                  "oper-status": "up",
                  "admin-status": "up"
                }
              ]
            }
          }
        ],
        "complete": true
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>Encoding rules for the envelope and its contents are specified in <xref target="Encodings"/>.</t>
      </section>
      <section anchor="EventRecords">
        <name>Event Records</name>
        <t>A single <em>update</em> record is used for all datastore notifications.  It is used to report the current state of a set of data nodes at a given target path for either periodic, on-change, or resync notifications, and also for on-change notifications to indicate that the data node at the given target path has been deleted.</t>
        <t>All notification types use the same <em>updates</em> list.  For periodic and resync snapshots, each entry in the <em>updates</em> list <bcp14>MUST</bcp14> contain an <em>update</em> element and <bcp14>MUST NOT</bcp14> contain a <em>delete</em> element.  The <em>delete</em> operation <bcp14>MUST</bcp14> only be used for on-change notifications.  This restriction also applies to resync snapshots for on-change subscriptions.</t>
        <t>The schema for this notifications is given in the following tree diagram:</t>
        <figure>
          <name>'update' notification</name>
          <sourcecode type="yangtree"><![CDATA[
    +---n update
    |  +--ro id?                 subscription-id
    |  +--ro path-prefix?        string
    |  +--ro snapshot-type       enumeration
    |  +--ro observation-time?   yang:date-and-time
    |  +--ro updates* [target]
    |  |  +--ro target          string
    |  |  +--ro (data)
    |  |     +--:(update)
    |  |     |  +--ro update?   <anydata>
    |  |     +--:(delete)
    |  |        +--ro delete?   boolean
    |  +--ro complete?           boolean
]]></sourcecode>
        </figure>
        <t>The normative definitions for the notifications fields are given in the YANG module in <xref target="ietf-yang-push-2-yang"/>.  The fields can be informatively summarized as:</t>
        <ul spacing="normal">
          <li>
            <t><em>id</em> - identifies the subscription the notification relates to.</t>
          </li>
          <li>
            <t><em>path-prefix</em> - provides the common prefix for all <em>target</em> values in the notification.  If present, it <bcp14>MUST</bcp14> be an absolute path from the schema root, <bcp14>MUST</bcp14> start with '/', and <bcp14>MUST</bcp14> contain at least one path segment.  Neither an empty string nor '/' is a valid <em>path-prefix</em>.</t>
          </li>
          <li>
            <t><em>snapshot-type</em> - this indicates what type of event causes the update message to be sent.  I.e., a periodic collection, an on-change event, or a resync collection.</t>
          </li>
          <li>
            <t><em>observation-time</em> - the time that the data was sampled for a periodic or resynchronization update, or when the on-change event occurred that caused the message to be published.</t>
          </li>
          <li>
            <t><em>target</em> - identifies the data being updated or deleted.  It <bcp14>MUST</bcp14> be present in every <em>updates</em> entry and <bcp14>MUST NOT</bcp14> be empty.  If <em>path-prefix</em> is absent, <em>target</em> <bcp14>MUST</bcp14> be an absolute path from the schema root, starting with '/'.  Otherwise, <em>target</em> <bcp14>MUST</bcp14> be a relative path and <bcp14>MUST NOT</bcp14> start with '/'.  To act on the entire datastore, <em>path-prefix</em> is omitted and <em>target</em> is '/'.</t>
          </li>
          <li>
            <t><em>data</em> - A mandatory choice of exactly one operation, with <em>delete</em> available only for on-change notifications:  </t>
            <ul spacing="normal">
              <li>
                <t><em>update</em> - supplies current values to create or update in the receiver's view.  Existing leaf and leaf-list values supplied in the payload are replaced; containers and list entries are updated recursively, with keyed list entries identified by their keys.  Required list keys are included.  For on-change notifications, omitted descendants remain unchanged and absence of a data node does not implicitly imply deletion of that data node.</t>
              </li>
              <li>
                <t><em>delete</em> - a boolean with a default value of <tt>false</tt>.  When <tt>true</tt>, it indicates that the data node at <em>target</em> and all its descendants no longer exist and should be removed from the receiver's view.  When <tt>false</tt>, no deletion is indicated.  Deleting data that is already absent has no effect.  This operation is used for on-change deletion events.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><em>complete</em> - applies only to <em>periodic</em> and <em>resync</em> updates and defaults to <tt>false</tt>.  When <tt>true</tt>, it indicates that this message completes the publisher's contribution to the collection, and is semantically equivalent to sending a separate <em>update-complete</em> notification.  Publishers <bcp14>MUST NOT</bcp14> include this flag in <em>on-change</em> updates.</t>
          </li>
        </ul>
        <t>The full absolute <em>target-path</em> is constructed by prepending <em>path-prefix</em>, if present, to <em>target</em>, using a single '/' between path segments.  Without a <em>path-prefix</em>, <em>target</em> itself is the full <em>target-path</em>.  An operation acts on the entire datastore when its full <em>target-path</em> is '/'.  This is represented by omitting <em>path-prefix</em> and setting <em>target</em> to '/'.  Examples of valid and invalid <em>path-prefix</em> and <em>target</em> combinations are given in <xref target="PathPrefixExamples"/>.</t>
        <t>The <em>observation-time</em> describes the source data, with the greatest accuracy available from the source.  For periodic and resynchronization updates, it records the time the data was sampled.  If the data was previously sampled by a producer and cached, the timestamp <bcp14>SHOULD</bcp14> represent that original sampling.  For on-change updates, it records when the underlying event (creation, modification, or deletion) first occurred, rather than when the telemetry infrastructure received or processed the change notification.</t>
        <t>Separate messages from one collection or on-change event may have different <em>observation-time</em> values while sharing the same <em>event-time</em>.</t>
        <t>For periodic and resynchronization events, the <em>observation-time</em> for data sampled in response to the collection should be the same as or later than the <em>event-time</em>, because collection processing triggers the sampling.  If a collection instead reports previously sampled, cached data, its original <em>observation-time</em> may precede the <em>event-time</em>, as described above.</t>
        <t>For on-change events, the <em>event-time</em> should be the same as or later than the <em>observation-time</em>, because the underlying change occurs before the telemetry infrastructure processes that change.</t>
        <t>As per the structure of the <em>update</em> notification, a single notification <bcp14>MAY</bcp14> provide updates for multiple targets.  The <em>updates</em> list <bcp14>MUST NOT</bcp14> contain duplicate <em>target</em> values within a single notification.  The <em>target</em> leaf is the list key, so duplicate values are invalid YANG, including when one entry specifies <em>update</em> and another specifies <em>delete</em> for the same <em>target</em>.</t>
        <section anchor="handling-particular-yang-data-nodes">
          <name>Handling Particular YANG Data Nodes</name>
          <t>Empty non-presence containers <bcp14>SHOULD</bcp14> be omitted to minimize message size and receiver processing.  Presence containers <bcp14>MUST</bcp14> be included when they exist within the reported data, even if empty, and <bcp14>MUST</bcp14> be omitted when they do not exist.  For on-change notifications, deletion of a presence container <bcp14>MUST</bcp14> be reported by an explicit <em>delete</em> of that container or an ancestor.</t>
          <t>Leaf-lists are reported as a single data node.  For on-change notifications, when entries of a subscribed leaf-list are added, removed, modified, or reordered and the leaf-list remains non-empty, the publisher <bcp14>MUST</bcp14> send an <em>update</em> whose <em>target</em> identifies the leaf-list or an ancestor, and whose payload includes the complete current sequence of entries, preserving YANG ordering.  The supplied sequence replaces the receiver's previous sequence for that leaf-list.  Updates or deletions targeting individual leaf-list entries <bcp14>MUST NOT</bcp14> be sent.</t>
          <t>When the final entry is removed, the publisher <bcp14>MUST</bcp14> report an explicit <em>delete</em> of the leaf-list or an ancestor.  The leaf-list then has no entries and does not exist in the receiver's view.  An <em>update</em> of an enclosing subtree recursively updates the supplied data; omitted descendants remain unchanged.  Consequently, omission of a presence container or leaf-list from such an <em>update</em> does not report its deletion.</t>
          <t>For a list that has no keys, the position (index) of each list entry is used to identify that entry.  TODO: Extend the YPath representation defined in <xref target="YPaths"/> to identify entries of a non-keyed list and specify the index base and index encoding.</t>
        </section>
      </section>
      <section anchor="UpdateTriggers">
        <name>Types of subscription event monitoring</name>
        <t>Subscription can either be based on sampling the requested data on a periodic cadence or being notified when the requested data changes.  In addition, this specification allows for subscriptions that both notify on-change and also with a periodic cadence, which can help ensure that the system eventually converges on the right state, even if on-change notification were somehow lost or mis-processed anywhere in the data processing pipeline.</t>
        <t>The schema for the update-trigger container is given in the following tree diagram:</t>
        <figure>
          <name>'update-trigger' container</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw subscriptions
        +--rw subscription* [id]
           +--rw update-trigger
              +--rw periodic!
              |  +--rw period         centiseconds
              |  +--rw anchor-time?   yang:date-and-time
              +--rw on-change! {on-change}?
                 +--rw sync-on-start?   boolean

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
        <t>The normative definitions for the update-trigger fields are given in the <em>ietf-yang-push-2</em> YANG module in <xref target="ietf-yang-push-2-yang"/>.  They are also described in the following sections.</t>
      </section>
      <section anchor="periodic-events">
        <name>Periodic events</name>
        <t>In a periodic subscription, the data included as part of an update record corresponds to data that could have been read using a retrieval operation.  Only the state that exists in the system at the time that it is being read is reported, periodic updates never explicitly indicate whether any data-nodes or list entries have been deleted.  Instead, receivers must infer deletions from data nodes missing from the complete snapshot provided for a particular collection event.</t>
        <t>Periodic and resync notifications carry snapshot data using only <em>update</em> elements in the <em>updates</em> list.  Publishers <bcp14>MUST NOT</bcp14> send <em>delete</em> elements in these notifications.  Receivers should ignore any <em>delete</em> elements received in periodic or resync notifications.  An individual notification may contain only part of the subscribed data.  Receivers <bcp14>MUST NOT</bcp14> infer deletion from an omitted data node until the complete snapshot for the collection has been received, as indicated by <em>complete</em> or <em>update-complete</em>.  Deletion inference applies only to the subscribed data covered by that collection.</t>
        <t>For periodic subscriptions, triggered updates will occur at the boundaries of a specified time interval.  These boundaries can be calculated from the periodic parameters:</t>
        <ul spacing="normal">
          <li>
            <t>a <em>period</em> that defines the duration between push updates.</t>
          </li>
          <li>
            <t>an <em>anchor-time</em>; update intervals fall on the points in time that are a multiple of a <em>period</em> from an <em>anchor-time</em>.  If an <em>anchor-time</em> is not provided, then the publisher chooses a suitable anchor-time, e.g., perhaps the time that the subscription was first instantiated by the publisher.</t>
          </li>
        </ul>
        <t>The anchor time and period are particularly useful, in fact required, for when the collected telemetry data is being stored in a time-series database and the subscription is setup to ensure that each collection is placed in a separate time-interval bucket.</t>
        <t>Periodic update notifications are expected, but not required, to use a single <em>target</em> per <em>update</em> notification.</t>
      </section>
      <section anchor="on-change-events">
        <name>On-Change events</name>
        <t>An on-change subscription monitors the subscribed data for any changes.  An <em>update</em> notification is sent whenever any change in the monitored data is detected, with <em>updates/update</em> used to indicate new or changed values and <em>updates/delete</em> used to indicate data nodes that have been deleted.</t>
        <t>Each entry in the <em>updates</em> list identifies a data node (i.e., list entry, container, leaf or leaf-list), via the <em>target</em>, that either has come into existence, has changes to its state, or has been deleted.</t>
        <t>New or changed values are reported using the <em>update</em> element of an <em>updates</em> entry.  The payload <bcp14>SHOULD</bcp14> only report the state that has changed (including any required list keys). Omitting a descendant data node from an <em>update</em> payload does not delete it.  The payload <bcp14>MAY</bcp14> include additional unchanged data nodes if the publisher is unable to optimize the on-change update message, but this may incur higher processing overheads for the receiver.</t>
        <t>An on-change deletion <bcp14>MUST</bcp14> be reported using a <em>delete</em> entry whose <em>target</em> identifies the deleted data node or subtree.  If a descendant of an updated subtree is deleted, it requires a separate <em>delete</em> entry at that descendant's path.  This entry <bcp14>MAY</bcp14> be included in the same notification as other <em>updates</em> entries.</t>
        <t>Within a subscription, individual publishers (as identified by publisher-id) <bcp14>MUST</bcp14> preserve the causal order of changes affecting the same data node in the <em>sequence-number</em> ordering of the corresponding on-change <em>update</em> notifications.  Receivers <bcp14>MUST</bcp14> process these notifications in sequence-number order, accounting for sequence-number wraparound.  Successive notifications affecting the same data node normally have increasing <em>observation-time</em> values, but may have the same <em>observation-time</em> if the timestamp resolution is insufficient to assign distinct times to the changes.  These values are therefore non-decreasing.  These ordering requirements apply across new data nodes, changed values, and deletions.</t>
        <t>Within an <em>update</em> notification, receivers <bcp14>MAY</bcp14> process the entries in the <em>updates</em> list in any order.  Consequently, within a single notification, the <em>updates</em> list <bcp14>MUST NOT</bcp14> contain duplicate <em>target</em> values, including when one entry specifies <em>update</em> and another specifies <em>delete</em> for the same path.  The list <bcp14>MUST NOT</bcp14> contain both a <em>delete</em> entry for a data node and an <em>update</em> entry whose <em>target</em> identifies a descendant of that deleted node.</t>
        <t>On-change subscriptions also support the following additional parameters:</t>
        <ul spacing="normal">
          <li>
            <t><em>sync-on-start</em> defines whether or not a complete snapshot of all subscribed data is sent at the start of a subscription.  Such early synchronization establishes the frame of reference for subsequent updates.  For each data node covered by an on-change with sync-on-start subscription, then an <em>sync-on-start</em> <em>update</em> notification containing the current state <bcp14>MUST</bcp14> be sent before any on-change <em>update</em> notifications for those same data nodes.  However, <em>sync-on-start</em> and <em>on-change</em> <em>update</em> notifications may be interleaved for different data-nodes under the subscription.  Unsolicited <em>sync-on-start update</em> notifications <bcp14>MUST NOT</bcp14> be sent, they <bcp14>MUST</bcp14> only be sent after a subscription has started.</t>
          </li>
        </ul>
        <section anchor="OnChangeConsiderations">
          <name>On-Change Notifiable Datastore Nodes</name>
          <t>Publishers are not required to support on-change notifications for all data nodes, and they may not be able to generate on-change updates for some data nodes.  Possible reasons for this include:</t>
          <ul spacing="normal">
            <li>
              <t>the value of the datastore node changes frequently (e.g., the in-octets counter as defined in <xref target="RFC8343"/>),</t>
            </li>
            <li>
              <t>small object changes that are frequent and meaningless (e.g., a temperature gauge changing 0.1 degrees),</t>
            </li>
            <li>
              <t>or no implementation is available to generate a notification when the source variable for a particular data node has changed.</t>
            </li>
          </ul>
          <t>In addition, publishers are not required to notify every change or value for an on-change monitored data node.  Instead, publishers <bcp14>MAY</bcp14> limit the rate at which changes are reported for a given data node, i.e., effectively deciding the interval at which an underlying value is sampled.  If a data node changes value and then reverts back to the original value within a sample interval then the publisher <bcp14>MAY</bcp14> not detect the change and it would go unreported.  However, if the data node changes to a new value after it has been sampled, then the change and latest state <bcp14>MUST</bcp14> be reported to the receiver.  In addition, if a client was to query the value (e.g., through a NETCONF get-data RPC) then they <bcp14>MUST</bcp14> see the same observed value as would be notified.</t>
          <t>To give an example, if the interface link state reported by hardware is changing state hundreds of times per second, then it would be entirely reasonable to limit those interface state changes to a much lower cadence, e.g., perhaps every 100 milliseconds.  In the particular case of interfaces, there may also be data model specific forms of more advanced dampening that are more appropriate, e.g., that notify interface down events immediately, but rate limit how quickly the interface is allowed to transition to up state, which overall acts as a limit on the rate at which the interface state may change, and hence also act as a limit on the rate at which on-change notifications could be generated.</t>
          <t>The information about what nodes support on-change notifications is reported using the capabilities operational data model.  This is further described in <xref target="Capabilities"/>.</t>
        </section>
        <section anchor="on-change-considerations">
          <name>On-Change Considerations</name>
          <t>On-change subscriptions allow receivers to receive updates whenever changes to targeted objects occur.  As such, on-change subscriptions are particularly effective for data that changes infrequently but for which applications need to be quickly notified, with minimal delay, whenever a change does occur.</t>
          <t>On-change subscriptions tend to be more difficult to implement than periodic subscriptions.  Accordingly, on-change subscriptions may not be supported by all implementations or for every object.</t>
          <t>Whether or not to accept or reject on-change subscription requests when the scope of the subscription contains objects for which on-change is not supported is up to the publisher implementation.  A publisher <bcp14>MAY</bcp14> accept an on-change subscription even when the scope of the subscription contains objects for which on-change is not supported.  In that case, updates are sent only for those objects within the scope of the subscription that do support on-change updates, whereas other objects are excluded from update records, even if their values change.  In order for a subscriber to determine whether objects support on-change subscriptions, objects are marked accordingly on a publisher.  Accordingly, when subscribing, it is the responsibility of the subscriber to ensure that it is aware of which objects support on-change and which do not.  For more on how objects are so marked, see Section 3.10. <strong>TODO Is this paragraph and the one below still the right choice for YANG Push v2?</strong></t>
          <t>Alternatively, a publisher <bcp14>MAY</bcp14> decide to simply reject an on-change subscription if the scope of the subscription contains objects for which on-change is not supported.  In the case of a configured subscription, the publisher <bcp14>MAY</bcp14> keep the subscription in <em>inactive</em> state.</t>
        </section>
      </section>
      <section anchor="combined-periodic-and-on-change-subscriptions">
        <name>Combined periodic and on-change subscriptions</name>
        <t>A single subscription may created to generate notifications both when changes occur and on a periodic cadence.  Such subscriptions are equivalent to having separate periodic and on-change subscriptions on the same path, except that they share the same subscription-id and filter paths.</t>
      </section>
      <section anchor="streaming-update-examples">
        <name>Streaming Update Examples</name>
        <t><xref target="PeriodicExample"/> provides an example of a notification message for a subscription tracking the operational status of interface (per <xref target="RFC8343"/>).  This notification message is encoded using JSON <xref target="RFC7951"/>.</t>
        <figure anchor="PeriodicExample">
          <name>Example periodic update message</name>
          <sourcecode type="JSON" name="periodic-update-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.11Z",
    "updates": [
      {
        "target": "interface",
        "update": {
          "interface": [
            {
              "name": "eth0",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "oper-status": "up",
              "admin-status": "up"
            },
            {
              "name": "eth1",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "oper-status": "up",
              "admin-status": "up"
            }
          ]
        }
      }
    ],
    "complete": false
  }
}
]]></sourcecode>
        </figure>
        <t><xref target="OnChangeExample"/> provides an example of an on-change notification message for
the same subscription.  The <tt>eth0</tt> update includes only the fields that
changed: <tt>enabled</tt> and <tt>oper-status</tt>.  The <tt>eth1</tt> interface has been deleted.</t>
        <figure anchor="OnChangeExample">
          <name>Example on-change update and delete message</name>
          <sourcecode type="JSON" name="on-change-multi-update.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "on-change",
    "observation-time": "2025-10-10T08:16:06.11Z",
    "updates": [
      {
        "target": "interface[name='eth0']",
        "update": {
          "enabled": false,
          "oper-status": "down"
        }
      },
      {
        "target": "interface[name='eth1']",
        "delete": true
      }
    ]
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="ReceiversEtAl">
      <name>Receivers, Transports, and Encodings</name>
      <section anchor="receivers">
        <name>Receivers</name>
        <t>Every subscription is associated with a receiver, which identifies the destination host, transport and encoding settings, where all notifications for a subscription are sent.</t>
        <t>For configured subscriptions there is no explicit association with an existing transport session, and hence the properties associated with the receiver are explicitly configured, as described in <xref target="ConfiguredReceivers"/>.</t>
        <t>For dynamic subscriptions, the receiver, and most associated properties are implicit from the session on which the dynamic subscription was initiated, as described in <xref target="DynamicSubscriptionReceivers"/>.</t>
        <section anchor="ConfiguredReceivers">
          <name>Receivers for Configured Subscriptions</name>
          <t>For configured subscriptions, receivers are configured independently from the subscriptions and then referenced from the subscription configuration.</t>
          <!--All subscription notifications, including lifecycle notifications ({{LifecycleNotifications}}).-->

<t>Below is a tree diagram for <em>datastore-telemetry/receivers</em> container. All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <t>These parameters identify how to connect to each receiver.  For each subscription, the publisher uses the referenced receiver configuration to establish transport connectivity to the receiver.</t>
          <figure anchor="ReceiversYangTree">
            <name>datastore-telemetry/receivers container</name>
            <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw receivers
        +--rw receiver* [name]
           +--rw name                      string
           +--rw encoding                  yp2:encoding
           +--rw dscp?                     inet:dscp
           +---x reset
           +--rw (notification-message-origin)?
           |  +--:(interface-originated)
           |  |  +--rw source-interface?   if:interface-ref
           |  |          {interface-designation}?
           |  +--:(address-originated)
           |     +--rw source-vrf?         leafref {supports-vrf}?
           |     +--rw source-address?     inet:ip-address-no-zone
           +--rw (transport-type)

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
          </figure>
          <t>Each configured receiver has the following associated properties:</t>
          <ul spacing="normal">
            <li>
              <t>a <em>name</em> to identify and reference the receiver in the subscription configuration.</t>
            </li>
            <li>
              <t>a <em>transport</em>, which identifies the transport protocol to use for all connections to the receiver.  </t>
              <ul spacing="normal">
                <li>
                  <t>any transport-specific related parameters, some of which may be mandatory, others optional to specify, e.g., DSCP.  There are likely to be various data nodes related to establishing appropriate security and encryption.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>an <em>encoding</em> used for both the envelope and contents of all notification messages sent to the receiver (<xref target="Encodings"/>).</t>
            </li>
            <li>
              <t>optional parameters to identify where traffic should egress the publisher:  </t>
              <ul spacing="normal">
                <li>
                  <t>a <em>source-interface</em>, identifying the egress interface to use from the publisher, implicitly choosing the source IP address and VRF.</t>
                </li>
                <li>
                  <t>a <em>source-vrf</em>, identifying the Virtual Routing and Forwarding (VRF) instance on which to reach receivers.  This VRF is a network instance as defined in <xref target="RFC8529"/>.  Publisher support for VRFs is optional and advertised using the <em>supports-vrf</em> feature.</t>
                </li>
                <li>
                  <t>a <em>source-address</em> address, identifying the IP address to source notification messages from.</t>
                </li>
              </ul>
              <t>
If none of the above parameters are set, the publisher <bcp14>MAY</bcp14> choose which interface(s) and address(es) to source subscription notifications from.</t>
            </li>
          </ul>
          <t>This specification is transport independent, e.g., see <xref target="transports"/>, and thus the YANG module defined in <xref target="yang-push-2-yang-module"/> cannot directly define and expose these transport parameters.  Instead, receiver-specific transport connectivity parameters <bcp14>MUST</bcp14> be configured via transport-specific augmentations to the YANG choice node <em>/datastore-telemetry/receivers/receiver/transport-type</em>.</t>
          <t>A publisher supporting configured subscriptions clearly must support at least one YANG data model that augments transport connectivity parameters onto <em>/datastore-telemetry/receivers/receiver/transport-type</em>.  For an example of a similar such augmentation (but for YANG Push), see <xref target="I-D.ietf-netconf-udp-notif"/>. <strong>TODO, this reference and text will need to be updated to a UDP-notif bis document, that augments the new YANG Push v2 receiver path.</strong></t>
        </section>
        <section anchor="DynamicSubscriptionReceivers">
          <name>Receivers for Dynamic Subscriptions</name>
          <t>For dynamic subscriptions, each subscription has a single receiver that is implicit from the host that initiated the <em>establish-subscription</em> RPC, reusing the same transport session for all subscription notifications.</t>
          <t>Hence most receiver parameters for a dynamic subscription, e.g., related to the transport, are implicitly determined and cannot be explicitly controlled.</t>
          <t>Dynamic subscriptions <bcp14>MAY</bcp14> specify DSCP Marking (see <xref target="DSCP"/>) for the telemetry notifications in the <em>establish-subscription</em> RPC (see <xref target="EstablishSubscriptionYangTree"/>).</t>
        </section>
        <section anchor="ReceiverStates">
          <name>Receiver Session States and State Machine</name>
          <t>Each subscription will need to establish a subscription to the specified receiver.  Multiple subscriptions may share one or more transport sessions to the same receiver.</t>
          <t>A receiver in YANG Push v2 can be in one of the following states:</t>
          <ul spacing="normal">
            <li>
              <t><strong>Configured</strong>: The receiver has been configured on the publisher, but the receiver is not referenced by any valid subscriptions and hence there is no attempt to establish a connection to the receiver.</t>
            </li>
            <li>
              <t><strong>Connecting</strong>: The receiver has at least one associated subscription and the publisher is attempting to establish a transport session and complete any required security exchanges, but this process has not yet succeeded.</t>
            </li>
            <li>
              <t><strong>Active</strong>: The receiver has at least one associated subscription, a transport session has been established (if required), security exchanges have successfully completed, and the publisher is able to send notifications to the receiver.</t>
            </li>
          </ul>
          <t>The state transitions for a receiver are illustrated below:</t>
          <figure anchor="ReceiverStateDiagram">
            <name>Receiver Session State Diagram</name>
            <artwork align="left"><![CDATA[
                    .-------------------.
                    |                   |
                    |    Configured     |
                    |                   |
                    '-------------------'
                            |  ^
  Receiver is referenced by |  |  No configured subscriptions
  1 or more subscriptions   |  |  reference the receiver
                            v  |
                    .-------------------.
                    |                   |
                    |    Connecting     |
                    |                   |
                    '-------------------'
                            |  ^
  Transport and/or security |  |  Transport or security session
  has been established.     |  |  has been lost or failed.
                            v  |
                    .-------------------.
                    |                   |
                    |      Active       |
                    |                   |
                    '-------------------'
]]></artwork>
          </figure>
          <t>This state model allows implementations and operators to clearly distinguish between receivers that are simply configured, those that are in the process of connecting, and those that are actively being used.</t>
          <t>If the configuration has changed such that there were previously connections to a receiver, but that receiver is no longer referenced by valid subscriptions, then the publisher <bcp14>MUST</bcp14> close any associated transport sessions to the receiver, but <bcp14>MAY</bcp14> delay the closing for a short period of time (no more than 15 minutes) to potentially allow existing transport session to be reused by new subscriptions.</t>
        </section>
      </section>
      <section anchor="transports">
        <name>Transports</name>
        <t>This document describes a transport-agnostic mechanism for subscribing to YANG datastore telemetry.  Hence, separate specifications are required to define transports that support YANG Push v2.  The requirements for these transport specifications are documented in the following section:</t>
        <section anchor="requirements-for-yang-push-v2-transport-specifications">
          <name>Requirements for YANG Push v2 Transport Specifications</name>
          <t>This section provides requirements for any transport specifications supporting the YANG Push v2 solution presented in this document.</t>
          <t>The transport specification <bcp14>MUST</bcp14> provide YANG modules, to be implemented by publishers implementing the YANG Push configuration model in <xref target="config-subs-data-model"/>, that:</t>
          <ul spacing="normal">
            <li>
              <t>augments the <em>datastore-telemetry/receivers/transport-type</em> choice statement with a container that both identifies the transport and contains all transport specific parameters.</t>
            </li>
            <li>
              <t>augments <em>/sysc:system-capabilities/transport/transport-capabilities/</em> container with any transport specific capabilities or options (conditional on a YANG <em>when</em> statement).  Note, encodings for a given transport are advertised directly via the ietf-yang-push-2-capabilities YANG Model <xref target="yang-push-2-yang-capabilities-module"/>.</t>
            </li>
          </ul>
          <t>Using a secure transport is <bcp14>RECOMMENDED</bcp14>.  Thus, any transport specification <bcp14>MUST</bcp14> provide a mechanism to ensure secure communication between the publisher and receiver in a hostile environment, e.g., through the use of transport layer encryption.  Transport specifications <bcp14>MAY</bcp14> also specify a mechanism for unencrypted communications, which can be used when transport layer security is not required, e.g., if the transport session is being secured via another mechanism, or when operating within a controlled environment or test lab.</t>
          <t>Any transport specification <bcp14>SHOULD</bcp14> support mutual receiver and publisher authentication at the transport layer.</t>
          <t>The transport selected by the subscriber to reach the publisher <bcp14>SHOULD</bcp14> be able to support multiple "establish-subscription" requests made in the same transport session.</t>
          <t>The transport specification <bcp14>MUST</bcp14> specifying how multiple subscriptions referencing the same receiver are to be handled at the transport layer.  The transport specification <bcp14>MAY</bcp14> require separate transport sessions per subscription to a given receiver, or it <bcp14>MAY</bcp14> allow multiple subscriptions to the same receiver to be multiplexed over a shared transport session.</t>
          <t>A specification for a transport built upon this document can choose whether to use the same logical channel for the RPCs and the event records.  For a given subscription and Message Publisher process, the <em>update</em> records and subscription state change notifications sent by that process <bcp14>MUST</bcp14> be sent on the same transport session.  Transport session considerations for distributed publishers are described in <xref target="distributed-notifications"/>.</t>
          <t>The transport specification <bcp14>MAY</bcp14> specify a keepalive mechanism to keep the transport session alive.  There is no YANG Push v2 protocol or application level keepalive mechanism.</t>
          <t><strong>TODO, do we need to mention anything about transport session timeouts, e.g., which would cause a subscription to be terminated.  What about buffering?  Is that a transport consideration?</strong></t>
          <t>Additional transport requirements may be dictated by the choice of transport used with a subscription.</t>
          <section anchor="DSCP">
            <name>DSCP Marking</name>
            <t>YANG Push v2 supports <em>dscp</em> marking to differentiate prioritization of notification messages during network transit.</t>
            <t>A receiver with a <em>dscp</em> leaf results in a corresponding Differentiated Services Code Point (DSCP) marking <xref target="RFC2474"/>} being placed in the IP header of any resulting <em>update</em> notification messages and subscription state change notifications.  A publisher <bcp14>MUST</bcp14> respect the DSCP markings for subscription traffic egressing that publisher.</t>
            <t>The transport specification <bcp14>MUST</bcp14> specify if there are any particular quality-of-service or class-of-service considerations related to handling DSCP settings associated with the subscription.</t>
          </section>
        </section>
      </section>
      <section anchor="Encodings">
        <name>Encodings</name>
        <t>The <em>update</em> notification (<xref target="EventRecords"/>), <em>update-complete</em> notification, and subscription lifecycle notifications (<xref target="LifecycleNotifications"/>) can be encoded in any format that has a definition for encoding YANG data.  For a given subscription, all notification messages, including both the envelope and its contents, are encoded using the same encoding.</t>
        <t>To maximize interoperability, implementations <bcp14>SHOULD</bcp14> support both JSON and CBOR with text identifiers.  Constrained platforms may not be able to support JSON and hence may choose to only support CBOR encoding.  Support for XML and CBOR with YANG SIDs is <bcp14>OPTIONAL</bcp14> unless required by the selected protocol binding.</t>
        <t>Encoding identities derive from the <em>encoding</em> base identity in <tt>ietf-yang-push-2</tt>.  Supported encodings are advertised through the transport capabilities (<xref target="yang-push-2-yang-capabilities-module"/>).</t>
        <section anchor="encoding-the-envelope-and-notification-contents">
          <name>Encoding the Envelope and Notification Contents</name>
          <t>The envelope and its contents <bcp14>MUST</bcp14> follow the corresponding YANG encoding rules:</t>
          <ul spacing="normal">
            <li>
              <t>JSON (<em>json</em>), <xref target="RFC7951"/>: the root is an object with the member <tt>ietf-yang-push-2:envelope</tt>, whose value is an object containing the envelope nodes.</t>
            </li>
            <li>
              <t>XML (<em>xml</em>), <xref target="RFC7950"/>: the root is an <tt>&lt;envelope&gt;</tt> element in the namespace <tt>urn:ietf:params:xml:ns:yang:ietf-yang-push-2</tt>, containing the envelope's child elements.</t>
            </li>
            <li>
              <t>CBOR with text identifiers (<em>cbor</em>), <xref target="RFC9254"/>: the root is a map with the text key <tt>ietf-yang-push-2:envelope</tt>, whose value is a map containing the envelope nodes, using text identifiers as keys.</t>
            </li>
            <li>
              <t>CBOR with YANG SIDs (<em>cbor-sids</em>), <xref target="RFC9254"/>: the root is a map keyed by the envelope structure's SID, whose value is a map containing the envelope nodes.  SIDs <bcp14>MUST</bcp14> be allocated according to <xref target="RFC9595"/>; SID deltas and absolute SIDs follow <xref target="RFC9254"/>.</t>
            </li>
          </ul>
          <t>The <em>contents</em> node directly contains the notification, identified by the name and namespace of its YANG <em>notification</em> statement, or its allocated SID.  The notification's data nodes use the same YANG encoding as the envelope.  For CBOR with SIDs, the notification's SID is encoded relative to the <em>contents</em> node as specified for <em>anydata</em> in Section 4.5 of <xref target="RFC9254"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="ConfiguredAndDynamic">
      <name>Setting up and Managing Subscriptions</name>
      <t>Subscriptions can be set up and managed in two ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>Configured Subscriptions - a subscription created and principally controlled by configuration.</t>
        </li>
        <li>
          <t>Dynamic Subscriptions - a subscription created and principally controlled via YANG RPCs from a telemetry receiver.</t>
        </li>
      </ol>
      <t>Conformant implementations <bcp14>MUST</bcp14> implement at least one of the two mechanisms above for establishing and maintaining subscriptions, but they <bcp14>MAY</bcp14> choose to only implement a single mechanism.</t>
      <t>The core behavior for both configured and dynamic subscription is the same, with the key differentiation being how they are provisioned, and how the transport is setup.  This next section describes the functionality that is common to both types of subscription, followed by the sections that describe the specifics and differences between the two ways of managing subscriptions.</t>
      <section anchor="CommonSubscriptionParameters">
        <name>Common Subscription Parameters</name>
        <t>All subscriptions require the following state to be instantiated:</t>
        <ul spacing="normal">
          <li>
            <t>an <em>id</em> to identify the subscription.</t>
          </li>
          <li>
            <t>the <em>target</em> for the subscription, comprising:
            </t>
            <ul spacing="normal">
              <li>
                <t>the target datastore, as per <xref target="RFC8342"/></t>
              </li>
              <li>
                <t>a set of selection filters to choose which datastore nodes the subscription is monitoring or sampling, as described in <xref target="pathsAndFilters"/>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>the <em>update-trigger</em> to indicate when <em>update</em> notifications are generated:
            </t>
            <ul spacing="normal">
              <li>
                <t><em>periodic</em>, for the publisher to send updated copies of the state on a periodic basis</t>
              </li>
              <li>
                <t><em>on-change</em>, for the publisher to send state updates when the internal state changes, i.e., event driven.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>receiver, transport, and notification encoding parameters, as per <xref target="receivers"/> and <xref target="Encodings"/>.  The encoding applies to both the envelope and its contents.  How these parameters are provided differs for configured and dynamic subscriptions, as further explained below.</t>
          </li>
        </ul>
        <t>Subscription ids <bcp14>MUST</bcp14> be unique across all configured and dynamic subscriptions.  Configured subscription take precedence over dynamic subscription, so:</t>
        <ul spacing="normal">
          <li>
            <t>attempts to create a dynamic subscription with a subscription id that conflicts with any other subscription id (configured or dynamic) <bcp14>MUST</bcp14> fail,</t>
          </li>
          <li>
            <t>configuring a subscription, assuming it passes configuration validation, replaces any dynamic subscriptions with the same subscription id.  Thus, causing the dynamic subscription to be immediately terminated (see <xref target="TerminatingSubscriptions"/>).</t>
          </li>
          <li>
            <t>subscription ids starting with <tt>dyn-</tt> are reserved for the publisher to use for automatically allocate subscription ids for dynamic subscriptions when the client has choosen not to provide one in the <em>establish-subscription</em> RPC.</t>
          </li>
        </ul>
        <section anchor="subscription-states">
          <name>Subscription States</name>
          <t>YANG Push v2 has a small set of simple states for a subscription on a publisher.  These states are intended to help clients easily determine the health and status of a subscription.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Invalid</strong>: a subscription that is invalid for any reason.  E.g., the subscription references an invalid filter expression for the current device schema.  Normally, invalid configurations should be rejected by the system, whether due to subscription configuration or <em>establish-subscription</em> RPC, and hence this state should rarely be seen.</t>
            </li>
            <li>
              <t><strong>Inactive</strong>: a valid subscription, but one that is not active because it has no associated receiver.  This state is unlikely to be seen for dynamic subscriptions.</t>
            </li>
            <li>
              <t><strong>Connecting</strong>: a subscription that is valid, and has appropriate receiver configuration, but the publisher has not managed to successfully connect to the receiver yet, and hence has not sent a <em>subscription-started</em> notification.  Transport security failures would be in this state.</t>
            </li>
            <li>
              <t><strong>Active</strong>: a valid subscription, connected to the receiver, that has sent a <em>subscription-stated</em> notification and is generating <em>update</em> notifications, as per the terms of the subscription update policy.</t>
            </li>
            <li>
              <t><strong>Terminated</strong>: represents a subscription that has finished.  Subscriptions would only be expected to transiently be in this state and hence it would not normally be reported.  Terminated dynamic subscriptions, or unconfigured subscriptions, should quickly be removed from the operational state of the device.  Terminated</t>
            </li>
          </ul>
          <t>Below is a state diagram illustrating the states, and the likely changes between states.  However, this is not a formal state machine and publishers can move between arbitrary states based on changes to subscription properties, the system, connectivity to receivers, or resource constraints on the system.  New subscriptions should choose an appropriate starting state, e.g., either Inactive or Invalid.</t>
          <figure>
            <name>Publisher's States for a Subscription</name>
            <artwork><![CDATA[
                  .-------------------.         .-------------------.
                  |                   |         |                   |
                  |    Inactive       | <------>|     Invalid       |
                  |                   |         |                   |
                  '-------------------'         '-------------------'
                            ^
                            |
                            v
                  .-------------------.
                  |                   |
                  |    Connecting     |
                  |                   |
                  '-------------------'
                            ^
                            |
                            v
                  .-------------------.
                  |                   |
                  |    Active         |
                  |                   |
                  '-------------------'


                  .-------------------.
                  |                   |
                  |    Terminated     |
                  |                   |
                  '-------------------'
]]></artwork>
          </figure>
        </section>
        <section anchor="CreatingSubscriptions">
          <name>Creating Subscriptions</name>
          <t>After a subscription is successfully established, the publisher immediately sends a <em>subscription-started</em> subscription state change notification to the receiver.  It is quite possible that upon configuration, reboot, or even steady-state operations, a transport session may not be currently available to the receiver.</t>
          <t>With active configured subscriptions, it is allowable to buffer event records even after a <em>subscription-started</em> has been sent.  However, if events are lost (rather than just delayed) due to buffer capacity being reached, a <em>subscription-terminated</em> notification <bcp14>MUST</bcp14> be sent, followed by a new <em>subscription-started</em> notification. These notifications indicate an event record discontinuity has occurred. <strong>TODO, do we always want this behaviour or is it transport specific?</strong></t>
        </section>
        <section anchor="ModifyingSubscriptions">
          <name>Modifying Subscriptions</name>
          <t>The parameters associated with a subscription <bcp14>MAY</bcp14> be modified by client <em>modify-subscription</em> RPC or through configuration.</t>
          <t>If the subscription is in <em>Active</em> state, and hence a <em>subscription-started</em> notification has been enqueued to the receiver, then any subscription parameter changes are handled as per the following sub-sections.  If the subscription is not yet in <em>Active</em> state then any transport changes associated with the receiver must be made, but otherwise the new parameters would be notified in the <em>subscription-started</em> notification.</t>
          <section anchor="ChangesNeedingTermination">
            <name>Modifications requiring subscription-terminated notification</name>
            <t>Changes to any of following parameters <bcp14>MUST</bcp14> terminate the subscription, as per <xref target="TerminatingSubscriptions"/>, before recreating it, clearing and reinitializing any associated statistics, as per <xref target="CreatingSubscriptions"/>:</t>
            <ol spacing="normal" type="1"><li>
                <t>the subcription <em>id</em></t>
              </li>
              <li>
                <t>the <em>encoding</em></t>
              </li>
              <li>
                <t>any <em>receiver</em> settings that change the encoding, transport, transport security, or receiver destination address/port</t>
              </li>
              <li>
                <t>the update-trigger to enable <em>sync-on-start</em>.</t>
              </li>
              <li>
                <t>if the <em>sync-on-start option</em> is enabled, then any changes to the subscription-filter (inline or referenced) or YANG schema (<em>schema-id</em>) associated with the subscription. <em>TODO, Why?  Should a subscription-modifies message resend the sync-on-start data anyway?</em></t>
              </li>
            </ol>
            <t>The <em>subscription-terminated</em> notification <bcp14>MUST</bcp14> be sent using the old <em>encoding</em> and <em>receiver</em> settings before the subscription parameters were changed.  The <em>subscription-started</em> notification <bcp14>MUST</bcp14> be sent using the updated subscription parameters.</t>
          </section>
          <section anchor="ChangesNeedingModifiedNotif">
            <name>Modifications allowing subscription-modified notification</name>
            <t>If changes to a subscription only include changes to the following parameters then they <bcp14>SHOULD</bcp14> be handled via a <em>subscription-modified</em> notification, but <bcp14>MAY</bcp14> be handled as described above. This applies for changes to:</t>
            <ol spacing="normal" type="1"><li>
                <t>the subscription target <em>filter</em> (inline, referring to a different named filter, or changing the referenced filter).</t>
              </li>
              <li>
                <t>the YANG schema (<em>schema-id</em>) associated with subscription target filter</t>
              </li>
              <li>
                <t>the <em>update-trigger</em>, unless <em>sync-on-start</em> is enabled</t>
              </li>
              <li>
                <t>the <em>description</em> field</t>
              </li>
              <li>
                <t>the <em>message-publishers/publisher-id</em> leaf-list</t>
              </li>
              <li>
                <t>any other fields that are included in a <em>subscription-modified</em> notification message, unless the definition of those fields explicitly specifies different behavior.</t>
              </li>
            </ol>
          </section>
          <section anchor="modifications-requiring-no-lifecycle-notification">
            <name>Modifications requiring no lifecycle notification</name>
            <t>Changes to any of the following subscription parameters do not need to be notified to the client:</t>
            <ol spacing="normal" type="1"><li>
                <t><em>dscp</em> settings.</t>
              </li>
              <li>
                <t><em>source-address</em>, <em>source-interface</em>, <em>source-vrf</em>, or the source port.</t>
              </li>
              <li>
                <t>any other settings not reported in the <em>subscription-started</em> notification message.</t>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="TerminatingSubscriptions">
          <name>Terminating Subscriptions</name>
          <t>Subscriptions <bcp14>MUST</bcp14> be terminated by the publisher due to any of the following circumstances:</t>
          <ol spacing="normal" type="1"><li>
              <t>The subscription has been unconfigured.</t>
            </li>
            <li>
              <t>Some subscription, receiver, transport or encoding configuration has been removed, e.g., receiver configuration, such that there is no longer the sufficient minimum information to maintain the subscription.</t>
            </li>
            <li>
              <t>A dynamic subscription has been terminated via a <em>delete-subscription</em> or <em>kill-subscription</em> YANG RPC.</t>
            </li>
            <li>
              <t>Transport connectivity to the receiver has been lost, either due to network issues, or a failure in the security session state.</t>
            </li>
            <li>
              <t>The publisher does not have sufficient resources to honor the terms of the subscription, i.e., it is generating too many <em>update</em> notifications, or attempting to send too much data.</t>
            </li>
            <li>
              <t>The subscription parameters have changed in such a way, i.e., as defined in <xref target="ChangesNeedingTermination"/>, that needs the subscription to be reset by terminating and recreating it.</t>
            </li>
            <li>
              <t>The <em>reset</em> RPC is invoked on a configured subscription, or on the referenced receiver associated with a configured subscription.</t>
            </li>
          </ol>
          <t>In addition, from a receiver's perspective, if transport connectivity is lost, then that is equivalent to terminating the subscription via a <em>subscription-terminated</em> notification.</t>
          <t>If possible, the publisher <bcp14>MUST</bcp14> try and close the subscription gracefully by generating a <em>subscription-terminated</em> notification to the receiver before closing any sessions to any receivers that have no remaining subscriptions.  Publishers <bcp14>MAY</bcp14> complete their current collection if one is in progress before generating the <em>subscription-terminated</em> notification.  Obviously, if transport connectivity to a receiver has been lost then neither of these two actions is possible.</t>
          <t>The publisher <bcp14>MUST NOT</bcp14> generate any further events, e.g., <em>update</em> notifications, related to the subscription after the <em>subscription-terminated</em> notification has been generated.  In addition, receivers <bcp14>SHOULD</bcp14> ignore any messages received outside of an active subscription, i.e., either before a <em>subscription-started</em> notification or after a <em>subscription-terminated</em> notification.</t>
          <t>If the publisher accepts the request, which it <bcp14>MUST</bcp14>, if the subscription-id matches a dynamic subscription established in the same transport session, then it should stop the subscription and send a <em>subscription-terminated</em> notification.</t>
        </section>
      </section>
      <section anchor="LifecycleNotifications">
        <name>Subscription Lifecycle Notifications</name>
        <t>In addition to sending event records to receivers, a publisher also sends subscription lifecycle state change notifications when lifecycle events related to subscription management occur.</t>
        <t>Subscription state change notifications are generated per subscription, and are injected into the steam of <em>update</em> messages for that that subscription.  These notifications <bcp14>MUST NOT</bcp14> be dropped or filtered.</t>
        <t>Future extensions, or implementations <bcp14>MAY</bcp14> augment additional fields into the notification structures.  Receivers <bcp14>MUST</bcp14> silently ignore unexpected fields.</t>
        <t>The complete set of subscription state change notifications is described in the following subsections:</t>
        <section anchor="SubscriptionStartedNotification">
          <name>"subscription-started"</name>
          <t>The subscription started notification is sent to a receiver to indicate that a subscription is active and they may start to receive <em>update</em> records from the publisher.</t>
          <t>The <em>subscription-started</em> notification is sent for any of these reasons:</t>
          <ol spacing="normal" type="1"><li>
              <t>A new subscription (configured or dynamic) has been started.</t>
            </li>
            <li>
              <t>The properties of a configured subscription has been changed, i.e., as specified in <xref target="ChangesNeedingTermination"/>, that requires a <em>subscription-terminated</em> notification to be sent followed by a <em>subscription-started</em> notification, presuming that the new subscription parameters are valid.</t>
            </li>
            <li>
              <t>A configured subscription previously failed, and was terminated.  After the publisher has successfully re-established a connection to the receiver and is ready to send datastore event records again.</t>
            </li>
          </ol>
          <t>Below is the tree diagram for the <em>subscription-started</em> notification.  All data nodes contained in this tree diagram are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-started Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-started
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata> {yp2:subtree}?
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |     +--ro publisher-id*   uint32
]]></sourcecode>
          </figure>
        </section>
        <section anchor="SubscriptionModifiedNotification">
          <name>"subscription-modified"</name>
          <t>The <em>subscription-modified</em> notification is sent to a receiver to indicate that some parameters associated with an active subscription have changed, as per <xref target="ChangesNeedingModifiedNotif"/>.</t>
          <t>Below is the tree diagram for the <em>subscription-modified</em> notification.  Other than the notification name and the <em>reason</em> leaf, the parameters for a <em>subscription-modified</em> notification are the same as for the <em>subscription-started</em> notification.  Robust receivers are expected to handle <em>subscription-started</em> and <em>subscription-modified</em> notifications equivalently.</t>
          <t>All data nodes contained in this tree diagram are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-modified Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-modified
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata> {yp2:subtree}?
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |  |  +--ro publisher-id*   uint32
    |  +--ro reason                subscription-change
]]></sourcecode>
          </figure>
        </section>
        <section anchor="SubscriptionTerminatedNotification">
          <name>"subscription-terminated"</name>
          <t>For a receiver, this notification indicates that no further event records for an active subscription should be expected from the publisher unless and until a new <em>subscription-started</em> notification is received.</t>
          <t>A <em>subscription-terminated</em> notification <bcp14>SHOULD</bcp14> only be sent by a publisher to a receiver if a <em>subscription-started</em> notification was previously sent.</t>
          <t>The subscription terminated notification may be sent to a receiver for any of these reasons:</t>
          <ol spacing="normal" type="1"><li>
              <t>A subscription has been stopped, either due to the change/removal of some configuration, or an RPC has been invoked to delete or kill a dynamic subscription.</t>
            </li>
            <li>
              <t>The properties of a subscription have been changed, i.e., as specified in <xref target="ChangesNeedingTermination"/>, that requires a <em>subscription-terminated</em> notification to be sent followed by a <em>subscription-started</em> notification, presuming that the new subscription parameters are valid.</t>
            </li>
            <li>
              <t>A subscription has failed for any reason, e.g.,:  </t>
              <ul spacing="normal">
                <li>
                  <t>The publisher is no longer able to honor the subscription, due to resource constraints, or the filter is no longer valid.</t>
                </li>
                <li>
                  <t>Any transport level buffer to the receiver has become full, and the hence the publisher is dropping <em>update</em> notifications.</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>Below is a tree diagram for "subscription-terminated".  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-terminated Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-terminated
    |  +--ro id        subscription-id
    |  +--ro reason    identityref
]]></sourcecode>
          </figure>
          <t><strong>TODO Augmenting extra fields is better for clients?</strong>  The <em>reason</em> data node identityref indicates why a subscription has been terminated, and could be extended with further reasons in future.  I suggest that we change this to an enum with an optional description field.**</t>
        </section>
        <section anchor="update-completed">
          <name>"update-completed"</name>
          <t><strong>TODO, this description needs to be updated</strong>.</t>
          <t>This notification indicates that all of the event records prior to the current time have been passed to a receiver.  It is sent before any notification messages containing an event record with a timestamp later than (1) the subscription's start time.</t>
          <t>After the <em>update-complete</em> notification has been sent, additional event records will be sent in sequence as they arise naturally on the publisher.</t>
          <t>Below is a tree diagram for <em>update-complete</em>.  All objects contained in this tree are described in the YANG module in Section 4.</t>
          <figure>
            <name>update-complete Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n update-complete
       +--ro id?   subscription-id
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="configured-subscriptions">
        <name>Configured Subscriptions</name>
        <t>Configured subscriptions allow the management of subscriptions via configuration so that a publisher can send notification messages to a receiver.</t>
        <t>This document specifies the ietf-yang-push-2-config YANG module <xref target="yang-push-2-config-yang-module"/> that defines an configuration model for configuring subscriptions.  Support for this YANG module is <bcp14>OPTIONAL</bcp14> and is advertised using the normal YANG mechanisms, e.g., <xref target="RFC8525"/>. <strong>TODO, do we also advertise support via capabilities, i.e., <eref target="https://github.com/rgwilton/draft-yp-observability/issues/16">issue 16</eref></strong></t>
        <t>In addition to the common subscription parameters described in <xref target="CommonSubscriptionParameters"/>, a configured subscription also includes:</t>
        <ul spacing="normal">
          <li>
            <t>the receiver for the subscription, as described in <xref target="receivers"/>.  The referenced receiver specifies all transport, receiver, and encoding parameters.</t>
          </li>
        </ul>
        <t>Configured subscriptions have several characteristics distinguishing them from dynamic subscriptions, such as:</t>
        <ul spacing="normal">
          <li>
            <t>configured subscriptions are created, modified or deleted, by any configuration client with write permission on the subscription configuration.</t>
          </li>
          <li>
            <t>configured subscription may reference a filter rather than define it inline as part of the subscription.  Even for a referenced filter, the <em>subscription-started</em> and <em>subscription-modified</em> notifications always include the filter specification inline in the notification.</t>
          </li>
          <li>
            <t>The lifetime of a configured subscription is tied to the configuration.  I.e., if a valid and complete configuration exists for a subscription, then the publisher <bcp14>MUST</bcp14> attempt to connect to the receiver and honor the requirements of the subscription.  In particular:  </t>
            <ul spacing="normal">
              <li>
                <t>If the configuration is altered or removed then the subscription will similarly be altered or removed.</t>
              </li>
              <li>
                <t>If the device reboots, then the configured subscription will obviously end, but once the subscription configuration has been processed after boot up, then the subscription will be recreated again, assuming the subscription configuration is still valid.</t>
              </li>
              <li>
                <t>If the publisher detects that transport connectivity to the receiver is broken, then any subscriptions using that transport are terminated, but the publisher <bcp14>MUST</bcp14> periodically attempt to re-establish connection to the receiver and re-activate any configured subscriptions to that receiver.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The lifetime of any transport session(s) to receiver(s) are also tied to the subscription configuration, but in a way that depends on the behavior of the Yang Push 2 transport specificiation, i.e.,  </t>
            <ul spacing="normal">
              <li>
                <t>For YANG Push transports that specify a separate transport session for each subscription to the same receiver then a new transport session is established whenever a valid subscription is configured and the transport session <bcp14>MUST</bcp14> be closed if the subscription configuration is removed or changed such that the subscription is no longer valid.</t>
              </li>
              <li>
                <t>For YANG Push transports that specify a shared transport session for all subscriptions to the same receiver then a new transport session is established for the first valid configured subscription.  Note, if there are no active subscriptions for a given receiver then any transport session(s) associated with that receiver <bcp14>MUST</bcp14> be closed, but that <bcp14>MAY</bcp14> be after a short delay.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Other than the <em>reset</em> YANG Action, described in <xref target="reset"/>, there are no YANG RPCs to dynamically create, modify, or delete a configured subscription, any alterations <bcp14>MUST</bcp14> be done via changes to the configuration.</t>
          </li>
        </ul>
        <section anchor="creating-a-configured-subscription">
          <name>Creating a Configured Subscription</name>
          <t>Configured subscriptions are those created via changes to the publisher's configuration, e.g., using the YANG module defined in <xref target="config-subs-data-model"/>, or an equivalent configuration mechanism, such as a command-line interface, or alternative YANG configuration model.</t>
          <t>After the configuration change has been accepted by the system, then the subscription is updated, as per <xref target="CreatingSubscriptions"/>.</t>
          <t><strong>TODO, to see an example of subscription creation using configuration operations over NETCONF, see Appendix A.</strong></t>
        </section>
        <section anchor="modifying-a-configured-subscription">
          <name>Modifying a Configured Subscription</name>
          <t>Configured subscriptions can be modified due to configuration changes in the subscription configuration or referenced configuration, i.e., filters or receivers.  After the configuration change has been accepted by the system, then the subscription is updated, as per <xref target="ModifyingSubscriptions"/>.</t>
        </section>
        <section anchor="deleting-a-configured-subscription">
          <name>Deleting a Configured Subscription</name>
          <t>Configured subscriptions can be deleted via configuration.  After the configuration change has been accepted by the system the subscription is terminated, as per <xref target="TerminatingSubscriptions"/>.</t>
        </section>
        <section anchor="reset">
          <name>Resetting a Configured Subscription</name>
          <t>Configured subscriptions are generally expected to self-monitor and automatically reconnect to the receiver if they experience network or transport issues.  However, the data model also defines explicit YANG <em>actions</em> to either: (i) reset a single subscription, or (ii) reset all subscriptions and the transports(s) associated with a specific configured receiver instance.</t>
          <t>These reset actions primarily act at the subscription application layer, but may be useful if a receiver or collector determines that a configured subscription is not behaving correctly, and wishes to force a reset of the subscription without modifying the configuration associated with the subscription or forcing a configuration change on the publisher device.</t>
          <t>The reset action on a subscription is handled equivalently to removing and re-adding the subscription configuration.  I.e., the subscription <bcp14>MUST</bcp14> be terminated, as per <xref target="TerminatingSubscriptions"/> before being recreated, as per <xref target="CreatingSubscriptions"/>.  The reset action also resets (terminated and re-establishes) any subscription specific transport session that is not shared with any other subscriptions.  Any counters associated with the subscription are also re-initialized in a manner that is consistent with a client unconfiguring and then reconfiguring the subscription.</t>
          <t>The reset action on a receiver is handled equivalently to removing and re-adding the receiver configuration for the receiver that has been reset.  Specifically, every subscription referencing the receiver <bcp14>MUST</bcp14> be terminated, as per <xref target="TerminatingSubscriptions"/> before being recreated, as per <xref target="CreatingSubscriptions"/>.  Any transport sessions tied to the subscriptions referencing the reset receiver <bcp14>MUST</bcp14> also be terminated and re-established.  Any counters associated with the receiver are also re-initialized in a manner that is consistent with a client unconfiguring and then reconfiguring the receiver configuration.</t>
        </section>
      </section>
      <section anchor="DynamicSubscriptions">
        <name>Dynamic Subscriptions</name>
        <t>Dynamic subscriptions are created by a subscriber invoking the <em>establish-subscription</em> YANG RPC <xref target="RFC7950"/>, as described in <xref target="EstablishDynamic"/>.</t>
        <t>Support for dynamic subscriptions is <bcp14>OPTIONAL</bcp14>, with its availability advertised via the <em>dynamic</em> YANG feature in the ietf-yang-push-2 YANG module <xref target="yang-push-2-yang-module"/>, and also via the capabilities module <xref target="yang-push-2-yang-capabilities-module"/>.</t>
        <t>Dynamic subscription differ from configured subscription in the following ways:</t>
        <ul spacing="normal">
          <li>
            <t>Dynamic subscription reuse the same transport session on which the <em>establish-subscription</em> RPC was received to send back any notifications, and so the transport and receiver do not need to be specified and each dynamic subscription can always only have a single receiver.</t>
          </li>
          <li>
            <t>The publisher <bcp14>MUST</bcp14> reply to the <em>establish-subscription</em> RPC before sending the <em>subscription-started</em> or any <em>update</em> notifications for this subscription.</t>
          </li>
          <li>
            <t>The lifetime of a dynamic subscription is bound by the transport session used to establish it.  If the transport session fails then the dynamic subscription <bcp14>MUST</bcp14> be terminated.</t>
          </li>
          <li>
            <t>Dynamic subscriptions can either be terminated by the client that established the subscription sending a <em>delete-subscription</em> YANG RPC on the same transport session, or any client with sufficient access permissions invoking the <em>kill-subscription</em> YANG RPC.</t>
          </li>
          <li>
            <t>A publisher <bcp14>MAY</bcp14> terminate a dynamic subscription at any time, i.e., due to internal constraints of the publisher.</t>
          </li>
          <li>
            <t>If a dynamic subscription is terminated for any reason, then the client is responsible for re-establishing the subscription if it is still required.</t>
          </li>
          <li>
            <t>If the publisher cannot honor the terms of a dynamic subscription then the subscription <bcp14>MUST</bcp14> be terminated. <strong>TODO, is this a <bcp14>SHOULD</bcp14> or <bcp14>MUST</bcp14>, do we want some leeway for temporary issues? E.g., allow some buffering. Also, this effectively applies to config subscriptions as well and hence should move.</strong></t>
          </li>
        </ul>
        <section anchor="EstablishDynamic">
          <name>Establishing a Dynamic Subscription</name>
          <t>The <em>establish-subscription</em> RPC allows a subscriber to request the creation of a subscription.</t>
          <t>In addition to the common subscription parameters described in <xref target="CommonSubscriptionParameters"/>, the <em>establish-subscription</em> YANG RPC:</t>
          <ul spacing="normal">
            <li>
              <t>includes the mandatory <em>encoding</em> to be used for all YANG Push v2 notifications for the subscription (<xref target="Encodings"/>).</t>
            </li>
            <li>
              <t>optionally includes DSCP settings to use for the transport.</t>
            </li>
          </ul>
          <t>The selected encoding <bcp14>MUST</bcp14> match the encoding of the incoming <em>establish-subscription</em> RPC and be supported by the protocol binding.  The publisher <bcp14>MUST</bcp14> reject an unsupported encoding with <em>encoding-unsupported</em>.  For example, NETCONF <xref target="RFC6241"/> uses XML, so dynamic subscriptions established over NETCONF use XML for both the envelope and its contents.  JSON or CBOR dynamic subscriptions require a protocol binding that supports that encoding for both RPCs and notifications.</t>
          <t>The DSCP code point settings for all subscription using the same transport session <bcp14>MUST</bcp14> be the same.  Attempts to invoke <em>establish-subscription</em> with a different DSCP code point <bcp14>MUST</bcp14> be rejected.</t>
          <t>If the publisher can satisfy the <em>establish-subscription</em> request, it replies with a numeric identifier for the subscription and then immediately starts streaming notification messages.</t>
          <t>A dynamic subscription request <bcp14>MUST</bcp14> be declined if a publisher determines that it may be unable to provide update records meeting the terms of an <em>establish-subscription</em> RPC request.</t>
          <t>Below is a tree diagram for <em>establish-subscription</em> YANG RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="EstablishSubscriptionYangTree">
            <name>establish-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x establish-subscription {dynamic}?
    |  +---w input
    |  |  +---w id?               subscription-id
    |  |  +---w description?      string
    |  |  +---w target
    |  |  |  +---w datastore?       identityref
    |  |  |  +---w (filter)
    |  |  |     +--:(path)
    |  |  |     |  +---w path       ypath
    |  |  |     +--:(subtree)
    |  |  |     |  +---w subtree    <anydata> {yp2:subtree}?
    |  |  |     +--:(xpath)
    |  |  |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |  |  +---w update-trigger
    |  |  |  +---w periodic!
    |  |  |  |  +---w period         centiseconds
    |  |  |  |  +---w anchor-time?   yang:date-and-time
    |  |  |  +---w on-change! {on-change}?
    |  |  |     +---w sync-on-start?   boolean
    |  |  +---w encoding          encoding
    |  |  +---w dscp?             inet:dscp
    |  +--ro output
    |     +--ro id    subscription-id
]]></sourcecode>
          </figure>
          <t>A publisher <bcp14>MAY</bcp14> reject the "establish-subscription" RPC for many reasons, as described in <strong>TODO</strong> (Section 2.4.6)?</t>
          <!--
TODO - Decide the simplest mechanism for returning RPC errors.

Below is a tree diagram for "establish-subscription-stream-error-info" RPC yang-data.  All objects contained in this tree are described in the YANG module in {{yang-push-2-yang-module}}.

~~~~
    yang-data establish-subscription-stream-error-info
      +- -ro establish-subscription-stream-error-info
        +- -ro reason?                   identityref
        +- -ro filter-failure-hint?      string

        Figure 3: "establish-subscription-stream-error-info"
                    RPC yang-data Tree Diagram
~~~~
{: align="left" title="\"establish-subscription-stream-error-info\" Tree Diagram"}
-->

</section>
        <section anchor="ModifyDynamic">
          <name>Modifying a Dynamic Subscription</name>
          <t>The <em>modify-subscription</em> RPC allows a subscriber to request the modification of parameters associated with a dynamic subscription. It uses the same parameters as the <em>establish-subscription</em> RPC defined in <xref target="EstablishDynamic"/>, except that the <em>id</em> leaf is mandatory.</t>
          <t>If the modification to the subscription is accepted by the publisher then it is processed as per <xref target="ModifyingSubscriptions"/>, otherwise an error is returned to the <em>modify-subscription</em> RPC and the subscription is left unmodified.</t>
          <t>The publisher <bcp14>MUST</bcp14> reply to the <em>modify-subscription</em> RPC before sending any subscription lifecycle notifications, i.e., a pair of <em>subscription-terminated</em>/<em>subscription-started</em> notifications, or a<em>subscription-modified</em> notification.</t>
          <t>Below is a tree diagram for the <em>modify-subscription</em> YANG RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="ModifySubscriptionYangTree">
            <name>modify-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x modify-subscription {dynamic}?
    |  +---w input
    |     +---w id                subscription-id
    |     +---w description?      string
    |     +---w target
    |     |  +---w datastore?       identityref
    |     |  +---w (filter)
    |     |     +--:(path)
    |     |     |  +---w path       ypath
    |     |     +--:(subtree)
    |     |     |  +---w subtree    <anydata> {yp2:subtree}?
    |     |     +--:(xpath)
    |     |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |     +---w update-trigger
    |     |  +---w periodic!
    |     |  |  +---w period         centiseconds
    |     |  |  +---w anchor-time?   yang:date-and-time
    |     |  +---w on-change! {on-change}?
    |     |     +---w sync-on-start?   boolean
    |     +---w dscp?             inet:dscp
]]></sourcecode>
          </figure>
          <t>A publisher <bcp14>MAY</bcp14> reject the "modify-subscription" RPC for various reasons, as described in <strong>TODO</strong>.</t>
        </section>
        <section anchor="deleting-a-dynamic-subscription">
          <name>Deleting a Dynamic Subscription</name>
          <t>The <em>delete-subscription</em> operation permits canceling an existing dynamic subscription that was established on the same transport session connecting to the subscriber.</t>
          <t>The publisher responds to the request in the following way:</t>
          <ul spacing="normal">
            <li>
              <t>If the identifier matches a <em>dynamic</em> subscription created on the same transport session then it <bcp14>MUST</bcp14> terminate the subscription, as per <xref target="TerminatingSubscriptions"/>.  </t>
              <t>
The publisher <bcp14>MAY</bcp14> reply back to the client before the subscription has been terminated, i.e., it may act asynchronously with respect to the delete request, however, the publisher <bcp14>MUST</bcp14> allow the client to create a new subscription using the same subscription id immediately after either the RPC operation completes or the <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>) has been transmitted.</t>
            </li>
            <li>
              <t>Otherwise, the request is failed with an "unknown subscription" error message.</t>
            </li>
          </ul>
          <t>Below is the tree diagram for the <em>delete-subscription</em> RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="DeleteSubscriptionYangTree">
            <name>delete-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x delete-subscription {dynamic}?
    |  +---w input
    |     +---w id    subscription-id
]]></sourcecode>
          </figure>
        </section>
        <section anchor="killing-a-dynamic-subscription">
          <name>Killing a Dynamic Subscription</name>
          <t>The <em>kill-subscription</em> RPC operation permits a client, that has the required access permissions, to forcibly terminate any arbitrary dynamic subscription, identified by subscription id, including those not associated with the transport session used for the <em>kill-subscription</em> RPC.  The subscription is terminated as per <xref target="TerminatingSubscriptions"/>.</t>
          <t>The publisher <bcp14>MAY</bcp14> reply back to the client before the subscription has been terminated, i.e., it may act asynchronously with respect to the delete request, however, the publisher <bcp14>MUST</bcp14> allow the client to create a new subscription using the same subscription id immediately after the <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>) has been transmitted.</t>
          <t>Below is the tree diagram for the <em>kill-subscription</em> RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="KillSubscriptionYangTree">
            <name>kill-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x kill-subscription {dynamic}?
       +---w input
          +---w id    subscription-id
]]></sourcecode>
          </figure>
        </section>
        <section anchor="rpc-failures">
          <name>RPC Failures</name>
          <t><strong>TODO, we should see if we can simplify how errors are reported.</strong></t>
          <t>Whenever an RPC is unsuccessful, the publisher returns relevant
information as part of the RPC error response.  Transport-level error
processing <bcp14>MUST</bcp14> be done before the RPC error processing described in
this section.  In all cases, RPC error information returned by the
publisher will use existing transport-layer RPC structures, such as
those seen with NETCONF (Appendix A of <xref target="RFC6241"/>) or RESTCONF
(Section 7.1 of <xref target="RFC8040"/>).  These structures <bcp14>MUST</bcp14> be able to encode
subscription-specific errors identified below and defined in this
document's YANG data model.</t>
          <t>As a result of this variety, how subscription errors are encoded in
an RPC error response is transport dependent.  Valid errors that can
occur for each RPC are as follows:</t>
          <artwork><![CDATA[
  establish-subscription         modify-subscription
  ----------------------         ----------------------
  dscp-unavailable               filter-unsupported
  encoding-unsupported           insufficient-resources
  filter-unsupported             no-such-subscription
  insufficient-resources

  delete-subscription            kill-subscription
  ----------------------         ----------------------
  no-such-subscription           no-such-subscription
]]></artwork>
          <t>To see a NETCONF-based example of an error response from the list
above, see the "no-such-subscription" error response illustrated in
<xref target="RFC8640"/>, Figure 10.</t>
          <t>There is one final set of transport-independent RPC error elements
included in the YANG data model defined in this document: three
yang-data structures that enable the publisher to provide to the
receiver any error information that does not fit into existing
transport-layer RPC structures.  These structures are:</t>
          <ol spacing="normal" type="1"><li>
              <t>"establish-subscription-stream-error-info": This <bcp14>MUST</bcp14> be returned
 with the leaf "reason" populated if an RPC error reason has not
 been placed elsewhere in the transport portion of a failed
 "establish-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if
 hints on how to overcome the RPC error are included.</t>
            </li>
            <li>
              <t>"modify-subscription-stream-error-info": This <bcp14>MUST</bcp14> be returned
 with the leaf "reason" populated if an RPC error reason has not
 been placed elsewhere in the transport portion of a failed
 "modify-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if hints
 on how to overcome the RPC error are included.</t>
            </li>
            <li>
              <t>"delete-subscription-error-info": This <bcp14>MUST</bcp14> be returned with the
 leaf "reason" populated if an RPC error reason has not been
 placed elsewhere in the transport portion of a failed
 "delete-subscription" or "kill-subscription" RPC response.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="Capabilities">
      <name>Capabilities</name>
      <t>This document defines the <tt>ietf-yang-push-2-capabilities</tt> YANG module, which augments the <tt>ietf-system-capabilities</tt> module defined in <xref target="RFC9196"/>.  These modules provide a standard, machine-readable representation of YANG Push v2 capabilities, including supported subscription types, transports, and parameters.</t>
      <t>The ietf-yang-push-2-capabilities module contains capabilities to indicate what types of subscriptions and transports may be configured, along with acceptable subscription parameter for given subtrees.</t>
      <t>The schema tree for the ietf-system-capabilities augmented by ietf-yang-push-2-capabilities is given below.</t>
      <figure>
        <name>YANG tree for ietf-system-capabilities with ietf-yl-lite-capabilities augmentations.</name>
        <sourcecode type="yangtree"><![CDATA[
module: ietf-system-capabilities
  +--ro system-capabilities
     +--ro datastore-capabilities* [datastore]
     |  +--ro datastore
     |  |       -> /yanglib:yang-library/datastore/name
     |  +--ro per-node-capabilities* []
     |     +--ro (node-selection)?
     |     |  +--:(node-selector)
     |     |     +--ro node-selector?
     |     |             nacm:node-instance-identifier
     |     +--ro yp2ca:datastore-telemetry
     |        +--ro yp2ca:periodic-notifications-supported?
     |        |       notification-support
     |        +--ro (yp2ca:update-period)?
     |        |  +--:(yp2ca:minimum-update-period)
     |        |  |  +--ro yp2ca:minimum-update-period?        uint32
     |        |  +--:(yp2ca:supported-update-period)
     |        |     +--ro yp2ca:supported-update-period*      uint32
     |        +--ro yp2ca:on-change-supported?
     |                notification-support
     +--ro yp2ca:datastore-telemetry
     |  +--ro yp2ca:periodic-notifications-supported?
     |  |       notification-support
     |  +--ro (yp2ca:update-period)?
     |  |  +--:(yp2ca:minimum-update-period)
     |  |  |  +--ro yp2ca:minimum-update-period?        uint32
     |  |  +--:(yp2ca:supported-update-period)
     |  |     +--ro yp2ca:supported-update-period*      uint32
     |  +--ro yp2ca:on-change-supported?
     |  |       notification-support
     |  +--ro yp2ca:transport
     |     +--ro yp2ca:transport-capability* [transport-protocol]
     |        +--ro yp2ca:transport-protocol    identityref
     |        +--ro yp2ca:security-protocol?    identityref
     |        +--ro yp2ca:encoding-format*      identityref
     +--ro yp2ca:distributed-notifications-supported?   boolean
]]></sourcecode>
      </figure>
      <t><strong>TODO, do we need additional capabilities, as per <eref target="https://github.com/rgwilton/draft-yp-observability/issues/18">Issue 18</eref></strong></t>
    </section>
    <section anchor="robustness-reliability-and-subscription-monitoring">
      <name>Robustness, Reliability, and Subscription Monitoring</name>
      <section anchor="robustness-and-reliability">
        <name>Robustness and Reliability</name>
        <t>It is important for clients to have confidence that the telemetry data that they receive is correct and complete.  The design of YANG Push v2 achieves this in several ways:</t>
        <ul spacing="normal">
          <li>
            <t>the <em>complete</em> flag in the <em>update</em> notification, or the equivalent <em>update-complete</em> notification, are used to signal when all data for a periodic or resynchronization collection has been enqueued by the publisher.  This allows clients to delete stale information and monitor the performance and behavior of the publisher.</t>
          </li>
          <li>
            <t>publishers use buffers when enqueuing traffic on to a transport to a receiver, but if that buffer becomes full then the transport specification indicates whether update messages should be dropped, or the subscription should be terminated.  In that case that a dynamic subscription is terminated, the client may attempt to re-created the subscription.  For configured subscriptions that have been terminated, the publisher should attempt to periodically recreate the subscription or reconnect the receiver.</t>
          </li>
          <li>
            <t>the <em>notification envelope</em> structure, <xref target="NotificationEnvelope"/>, used for all YANG Push notifications contains a <em>sequence-number</em> counter scoped to each subscription and <em>publisher-id</em>.  Gaps in that notification stream, accounting for wraparound and reordering, allow lost messages in an end-to-end data pipeline spanning multiple transport hops to be detected and appropriate mitigation steps to be taken.  For example, see figure 1 in <xref target="I-D.ietf-nmop-network-anomaly-architecture"/>.</t>
          </li>
          <li>
            <t>the protocol relies on transport protocols that are either reliable, e.g., TCP or HTTP, or unreliable transports that employ mechanisms for clients to detect when losses at the transport layer have occurred, e.g., the <em>message id</em> in <xref target="I-D.ietf-netconf-udp-notif"/> (<strong>TODO fix reference to bis version, once that becomes available</strong>).</t>
          </li>
          <li>
            <t>finally, if a publisher is not able to honor the expectation for a subscription for any reason, then the publisher always has the option to terminate the subscription.  It can then subsequently refuse to handle new subscriptions if it does not have sufficient resources to handle the subscription.</t>
          </li>
        </ul>
      </section>
      <section anchor="subscription-monitoring">
        <name>Subscription Monitoring</name>
        <t>In the operational state datastore, the <em>datastore-telemetry</em> container maintains operational state for all configured and dynamic subscriptions.</t>
        <t>Both configured and dynamic subscriptions are represented in the list <em>ietf-yang-push-2-config:datastore-telemetry/subscriptions/subscription</em>.  Dynamic subscriptions are only present in the list when they are active, and are removed as soon as they are terminated.  Whereas, configured subscriptions are always present in the list when they are configured, regardless of whether they are active.</t>
        <t>The operational state is important for monitoring the health of subscriptions, receivers, and the overall telemetry subsystem.</t>
        <t>This includes:</t>
        <t><strong>TODO, update the YANG model with more useful operational data, and mostly this section should briefly summarize and refer to the YANG model.  We should also consider what indications to include from filters that cause a larger amount of internal work but don't generate a large number of transmitted notifications.</strong></t>
        <ul spacing="normal">
          <li>
            <t>per subscription status and counters</t>
          </li>
          <li>
            <t>per receiver status and counters</t>
          </li>
          <li>
            <t>maybe some indication of the overall load on the telemetry subsystem, but we need to consider how useful that actually is, and whether just monitoring the device CPU load and general performance would be a better indication.</t>
          </li>
        </ul>
        <!-- TODO - Consider incorporating some aspects of this text.
Each subscription in the operational state datastore is represented as a list element.  Included in this list are event counters for each receiver, the state of each receiver, and the subscription parameters currently in effect.  The appearance of the leaf "configured-subscription-state" indicates that a particular subscription came into being via configuration.  This leaf also indicates whether the current state of that subscription is "valid", "invalid", or "concluded".

To understand the flow of event records in a subscription, there are two counters available for each receiver.  The first counter is "sent-event-records", which shows the number of events identified for sending to a receiver.  The second counter is "excluded-event-records", which shows the number of event records not sent to a receiver.  "excluded-event-records" shows the combined results of both access control and per-subscription filtering.  For configured subscriptions, counters are reset whenever the subscription's state is evaluated as "valid" (see (1) in Figure 8).

// Taken from another section.
In addition, the YANG Push v2 operational data gives an indication of the overall telemetry load on the device and hence gives an indication to whether a particular telemetry request is likely to be accepted, and honored.
-->

</section>
      <section anchor="publisher-capacity">
        <name>Publisher Capacity</name>
        <t>A publisher <bcp14>SHOULD</bcp14> reject a request for a subscription if it is unlikely that the publisher will be able to fulfill the terms of that subscription request.</t>
        <t>Whether or not a subscription can be supported will be determined by a combination of several factors, such as the subscription update trigger (on-change or periodic), the period in which to report changes (one-second periods will consume more resources than one-hour periods), the amount of data in the datastore subtree that is being subscribed to, the number and combination of other subscriptions that are concurrently being serviced, and the overall load from other services running on the publisher.</t>
        <t>It is entirely possible that a subscription may be reasonable at the time that it is created, but other changes to configuration or operational data or load in the system means that the subscription can no longer be honored.</t>
        <t>TODO - Do we allow servers to reduce the period of the subscription to allow it to be kept active?  E.g., with a subscription modification notification?  E.g., see <eref target="https://github.com/rgwilton/draft-yp-observability/issues/41">issue 41</eref></t>
      </section>
    </section>
    <section anchor="Conformance">
      <name>Conformance</name>
      <t>The normative requirements for a conformant YANG Push v2 implementation are stated throughout this document using <xref target="RFC2119"/> language.  This section summarizes the implementation choices; the normative requirements remain in the sections referenced below.</t>
      <t>An implementation supports configured subscriptions, dynamic subscriptions, or both.  The requirement to support at least one of these mechanisms is specified in <xref target="ConfiguredAndDynamic"/>.  Requirements for the behavior of each mechanism are specified in <xref target="configured-subscriptions"/> and <xref target="DynamicSubscriptions"/>.</t>
      <t>The <tt>ietf-yang-push-2-config</tt> YANG module contains both the configuration and operational-state models.  Support for this module is optional, as specified in <xref target="configured-subscriptions"/>.  Implementations that use alternative mechanisms to configure and manage subscriptions may omit this module.</t>
      <section anchor="subscription-content-versioning">
        <name>Subscription Content Versioning</name>
        <t>Many receivers will want to know what the schema is associated with a subscription and whether that schema has changed, e.g., due to a changing in software on the publisher.</t>
        <t>Various mechanisms are available to help receivers or collectors learn or monitor the schema associated with a subscription:</t>
        <ol spacing="normal" type="1"><li>
            <t>The device schema is available in the YANG library module ietf-yang-library.yang as defined in <xref target="RFC8525"/>.  YANG library also provides a simple "yang-library-change" notification that informs the subscriber that the library has changed, or alternatively, the publisher may support an on-change telemetry subscription to</t>
          </li>
        </ol>
        <t>Content Schema Identification</t>
        <t>YANG Module Synchronization</t>
        <t>To make subscription requests, the subscriber needs to know the YANG datastore schemas used by the publisher.  These schemas are available in the YANG library module ietf-yang-library.yang as defined in <xref target="RFC8525"/>.  The receiver is expected to know the YANG library information before starting a subscription.</t>
        <t>The set of modules, revisions, features, and deviations can change at runtime (if supported by the publisher implementation).  For this purpose, the YANG library provides a simple "yang-library-change" notification that informs the subscriber that the library has changed.  In this case, a subscription may need to be updated to take the updates into account.  The receiver may also need to be informed of module changes in order to process updates regarding datastore</t>
        <t><strong>TODO, this section should be updated so that a subscription is restarted if the schema that it is using changes, and to incorporate ideas to fingerprint the subscription schema in the subscription-started notification.</strong></t>
      </section>
    </section>
    <section anchor="distributed-notifications">
      <name>Distributed Notifications - Multiple Publishing Processes</name>
      <t>Distributed notifications allow a subscription to be served by multiple publishing processes on the same device.  For example, separate processes on linecards can publish local data directly to the receiver, avoiding a bottleneck at the management processor.</t>
      <t>The YANG Push 2 specification supports distributed notifications based on <xref target="I-D.ietf-netconf-distributed-notif"/>, but the solution is fully defined in this document.  It makes small changes to accommodate the YANG Push 2 message structure and imposes tighter restrictions on publisher ID allocation: ID 0 is reserved for the Publisher Parent Process, and if a Publisher Agent is removed and re-added to an ongoing subscription then it is allocated a new Publisher ID.</t>
      <t>It is <bcp14>OPTIONAL</bcp14> for YANG Push 2 publishers to support multiple publisher agents since they always have the option of handling all subscriptions from a single publisher process on each server.  Receivers and consumers of YANG Push 2 subscription data <bcp14>MUST</bcp14> accommodate servers that publish their data from multiple Message Publishing processes, including correlating collection completion across those processes.</t>
      <t>The following rules describe how distributed notifications are supported in YANG Push 2:</t>
      <ul spacing="normal">
        <li>
          <t>The publisher-id leaf, which identifies the Message Publisher ID of the publishing process, is defined directly in the YANG Push v2 notification envelope (<xref target="NotificationEnvelope"/>).  This means that all messages sent by any Message Publishers (e.g., including Subscription Lifecycle Notifications) will indicate which Message Publisher sent the message.</t>
        </li>
        <li>
          <t>The publisher-id leaf has a default value of 0.  The publisher-id of 0 is reserved for the Publisher Parent process and <bcp14>MUST NOT</bcp14> be allocated to any Publisher Agent processes, since that allows for the publisher-id leaf to be omitted from notification messages sent from the Publisher Parent.</t>
        </li>
        <li>
          <t>Publishers serving a subscription <bcp14>MUST</bcp14> only send the data for a given YANG data node from a single Message Publisher process.  Publisher membership and data ownership changes <bcp14>MUST</bcp14> take effect only between collections and never during a collection.  Publishers <bcp14>MAY</bcp14> reassign data to another Message Publisher process at these boundaries, e.g., to load-balance work.</t>
        </li>
        <li>
          <t>Each Message Publisher maintains an independent sequence-number counter for each subscription while it participates in that subscription (<xref target="NotificationEnvelope"/>).  A newly created or re-added Message Publisher starts its counter at 1 under a new <em>publisher-id</em>.  Sequence numbers from different Message Publishers do not establish an ordering between their notifications.</t>
        </li>
        <li>
          <t>The Publisher Parent Process manages the subscription as a whole.  All Message Publishers serving the subscription <bcp14>MUST</bcp14> use its subscription ID and comply with its parameters and lifecycle, including subsequent modifications and termination.  The Publisher Parent Process is responsible for reporting failures that affect the subscription using the lifecycle notifications defined in this document.  Internal coordination between publishing processes is implementation-specific.</t>
        </li>
        <li>
          <t>All subscription lifecycle notifications (<xref target="LifecycleNotifications"/>) <bcp14>MUST</bcp14> be sent by the Publisher Parent Process.</t>
        </li>
        <li>
          <t>Publisher Agents <bcp14>MUST NOT</bcp14> send <em>update</em> notifications for a newly started subscription or reflecting a lifecycle change until the Publisher Parent Process has sent the corresponding lifecycle notification.  There is no guarantee of message ordering between different Message Publishers; i.e., it is possible that an agent's <em>update</em> notification arrives at the receiver before the Parent's lifecycle notification even though it was sent afterwards.</t>
        </li>
        <li>
          <t>For configured subscriptions, separate Message Publisher processes <bcp14>MAY</bcp14> establish separate transport sessions to the configured receiver, where supported by the transport binding.  The transport specification defines whether sessions are shared or separate, including security associations and any requirements for source and destination ports.</t>
        </li>
        <li>
          <t>The <em>subscription-started</em> and <em>subscription-modified</em> notifications have a <em>message-publishers/publisher-id</em> leaf-list that identifies all Message Publishers that will send messages as part of the subscription.  This leaf-list defaults to a single entry of 0, so <bcp14>MAY</bcp14> be omitted if there is only a single Message Publisher and it has a publisher-id of 0.  </t>
          <ul spacing="normal">
            <li>
              <t>The list of Message Publishers serving an active subscription can change during the lifetime of the subscription and the Publisher Parent <bcp14>MUST</bcp14> send a <em>subscription-modified</em> notification of any change in publisher-ids.</t>
            </li>
            <li>
              <t>For dynamic subscriptions, publisher IDs are reported in <em>subscription-started</em>, rather than in the <em>establish-subscription</em> RPC response, consistently with configured subscriptions.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>The <em>subscriptions/subscription/message-publishers</em> list reports the current Message Publishers associated with a subscription and their per-publisher counters.</t>
        </li>
        <li>
          <t>A capability flag is used to indicate whether the server might use distributed notifications.  Advertised subscription capabilities describe the capabilities of the device as a whole.</t>
        </li>
        <li>
          <t>For periodic and resynchronization collections, completion is indicated per Message Publisher process by an <em>update-complete</em> notification or by setting <em>complete</em> to <tt>true</tt> in an <em>update</em> notification.  Each indication applies only to that publisher's contribution to the collection.  Receivers <bcp14>MUST</bcp14> track completion separately for each <em>publisher-id</em> and <bcp14>MUST NOT</bcp14> consider the full collection complete until completion has been received from all Message Publishers serving the subscription for that collection.  Completion indications are correlated using the subscription <em>id</em> and the envelope's <em>event-time</em>.</t>
        </li>
      </ul>
    </section>
    <section anchor="ietf-yang-push-2-yang">
      <name>Core YANG Push v2 YANG Data Model</name>
      <section anchor="yang-push-2-tree">
        <name>ietf-yang-push-2 YANG tree</name>
        <t>This section shows the full tree output for ietf-yang-push-2 YANG module.</t>
        <t>Note, this output does not include support for any transport configuration, and for any implementation that supports configured subscriptions using this YANG module then at least one transport would expect to be configurable.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2

  rpcs:
    +---x establish-subscription {dynamic}?
    |  +---w input
    |  |  +---w id?               subscription-id
    |  |  +---w description?      string
    |  |  +---w target
    |  |  |  +---w datastore?       identityref
    |  |  |  +---w (filter)
    |  |  |     +--:(path)
    |  |  |     |  +---w path       ypath
    |  |  |     +--:(subtree)
    |  |  |     |  +---w subtree    <anydata> {yp2:subtree}?
    |  |  |     +--:(xpath)
    |  |  |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |  |  +---w update-trigger
    |  |  |  +---w periodic!
    |  |  |  |  +---w period         centiseconds
    |  |  |  |  +---w anchor-time?   yang:date-and-time
    |  |  |  +---w on-change! {on-change}?
    |  |  |     +---w sync-on-start?   boolean
    |  |  +---w encoding          encoding
    |  |  +---w dscp?             inet:dscp
    |  +--ro output
    |     +--ro id    subscription-id
    +---x modify-subscription {dynamic}?
    |  +---w input
    |     +---w id                subscription-id
    |     +---w description?      string
    |     +---w target
    |     |  +---w datastore?       identityref
    |     |  +---w (filter)
    |     |     +--:(path)
    |     |     |  +---w path       ypath
    |     |     +--:(subtree)
    |     |     |  +---w subtree    <anydata> {yp2:subtree}?
    |     |     +--:(xpath)
    |     |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |     +---w update-trigger
    |     |  +---w periodic!
    |     |  |  +---w period         centiseconds
    |     |  |  +---w anchor-time?   yang:date-and-time
    |     |  +---w on-change! {on-change}?
    |     |     +---w sync-on-start?   boolean
    |     +---w dscp?             inet:dscp
    +---x delete-subscription {dynamic}?
    |  +---w input
    |     +---w id    subscription-id
    +---x kill-subscription {dynamic}?
       +---w input
          +---w id    subscription-id

  notifications:
    +---n subscription-started
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata> {yp2:subtree}?
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |     +--ro publisher-id*   uint32
    +---n subscription-modified
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata> {yp2:subtree}?
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |  |  +--ro publisher-id*   uint32
    |  +--ro reason                subscription-change
    +---n subscription-terminated
    |  +--ro id        subscription-id
    |  +--ro reason    identityref
    +---n update
    |  +--ro id?                 subscription-id
    |  +--ro path-prefix?        string
    |  +--ro snapshot-type       enumeration
    |  +--ro observation-time?   yang:date-and-time
    |  +--ro updates* [target]
    |  |  +--ro target          string
    |  |  +--ro (data)
    |  |     +--:(update)
    |  |     |  +--ro update?   <anydata>
    |  |     +--:(delete)
    |  |        +--ro delete?   boolean
    |  +--ro complete?           boolean
    +---n update-complete
       +--ro id?   subscription-id
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-yang-module">
        <name>ietf-yang-push-2 YANG Model</name>
        <t>This module imports typedefs from <xref target="RFC6991"/>, <xref target="RFC8343"/>, <xref target="RFC8341"/>, <xref target="RFC8529"/>, and <xref target="RFC8342"/>.  It references <xref target="RFC6241"/>, <xref target="XPATH"/> ("XML Path Language (XPath) Version 1.0"), <xref target="RFC7049"/>, <xref target="RFC8259"/>, <xref target="RFC7950"/>, <xref target="RFC7951"/>, and <xref target="RFC7540"/>.</t>
        <t>This YANG module imports typedefs from <xref target="RFC6991"/>, identities from
<xref target="RFC8342"/>, and the "sx:structure" extension from <xref target="RFC8791"/>. It also references <xref target="RFC6241"/>, <xref target="XPATH"/>, and <xref target="RFC7950"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2.yang#0.1.0"><![CDATA[
module ietf-yang-push-2 {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-push-2";
  prefix yp2;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-netconf-acm {
    prefix nacm;
    reference
      "RFC 8341: Network Configuration Access Control Model";
  }
  import ietf-yang-structure-ext {
    prefix sx;
    reference
      "RFC 8525: YANG Data Structure Extensions";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-datastores {
    prefix ds;
    reference
      "RFC 8342: Network Management Datastore Architecture (NMDA)";
  }
  import ietf-yang-library {
    prefix yanglib;
    reference
      "RFC 8525: YANG Library";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push
     version 2, a simplified version of the YANG-Push [RFC 8641]
     protocol.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2026-04-21 {
    description
      "Initial revision.";
    reference
      "XXXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * FEATURES
   */

  feature dynamic {
    description
      "This feature indicates that dynamic establishment of
       subscriptions is
       supported.";
  }

  feature on-change {
    description
      "This feature indicates that on-change triggered subscriptions
       are supported.";
  }

  feature subtree {
    description
      "This feature indicates support for YANG subtree filtering.";
    reference
      "RFC 6241: Network Configuration Protocol (NETCONF),
                 Section 6";
  }

  feature xpath {
    description
      "This feature indicates support for XPath filtering.";
    reference
      "XML Path Language (XPath) Version 1.0
       (https://www.w3.org/TR/1999/REC-xpath-19991116)";
  }

  /*
   * IDENTITIES
   */
  /* Identities for RPC and notification errors */

  identity delete-subscription-error {
    description
      "Base identity for the problem found while attempting to
       fulfill either a 'delete-subscription' RPC request or a
       'kill-subscription' RPC request.";
  }

  identity establish-subscription-error {
    description
      "Base identity for the problem found while attempting to
       fulfill an 'establish-subscription' RPC request.";
  }

  identity subscription-terminated-reason {
    description
      "Base identity for the problem condition communicated to a
       receiver as part of a 'subscription-terminated'
       notification.";
  }

  identity dscp-unavailable {
    base establish-subscription-error;
    description
      "The publisher is unable to mark notification messages with
       prioritization information in a way that will be respected
       during network transit.";
  }

  identity encoding-unsupported {
    base establish-subscription-error;
    description
      "Unable to encode notification messages in the desired
       format.";
  }

  identity filter-unavailable {
    base subscription-terminated-reason;
    description
      "Referenced filter does not exist.  This means a receiver is
       referencing a filter that doesn't exist or to which it
       does not have access permissions.";
  }

  identity filter-unsupported {
    base establish-subscription-error;
    description
      "Cannot parse syntax in the filter.  This failure can be from
       a syntax error or a syntax too complex to be processed by the
       publisher.";
  }

  identity insufficient-resources {
    base establish-subscription-error;
    description
      "The publisher does not have sufficient resources to support
       the requested subscription.  An example might be that
       allocated CPU is too limited to generate the desired set of
       notification messages.";
  }

  identity no-such-subscription {
    base delete-subscription-error;
    base subscription-terminated-reason;
    description
      "Referenced subscription doesn't exist.  This may be as a
       result of a nonexistent subscription ID, an ID that belongs to
       another subscriber, or an ID for a configured subscription.";
  }

  identity stream-unavailable {
    base subscription-terminated-reason;
    description
      "Not a subscribable event stream.  This means the referenced
       event stream is not available for subscription by the
       receiver.";
  }

  identity suspension-timeout {
    base subscription-terminated-reason;
    description
      "Termination of a previously suspended subscription.  The
       publisher has eliminated the subscription, as it exceeded a
       time limit for suspension.";
  }

  identity unsupportable-volume {
    base subscription-terminated-reason;
    description
      "The publisher does not have the network bandwidth needed to
       get the volume of generated information intended for a
       receiver.";
  }

  identity conflicting-identifier {
    base subscription-terminated-reason;
    description
      "The subscription identifier conflicts with another
       subscription.

       This can prevent a dynamic subscription from being
       established, or cause a dynamic subscription to be terminated
       if a configured subscription with the same id is created.";

    // TODO - Should there be separate error codes for creating a
    // subscription vs terminating an existing one?
  }


  /* Identities for encodings */

  identity encoding {
    description
      "Base identity to represent data encodings.";
  }

  identity json {
    base encoding;
    description
      "Encode data using JSON as described in RFC 7951.";
    reference
      "RFC 7951: JSON Encoding of Data Modeled with YANG";
  }

  identity xml {
    base encoding;
    description
      "Encode data using XML as described in RFC 7950.";
    reference
      "RFC 7950: The YANG 1.1 Data Modeling Language";
  }

  identity cbor {
    base encoding;
    description
      "Encode data using CBOR as described in RFC 9254,
       using text identifiers instead of YANG SIDs.";
    reference
      "RFC 9254: Encoding of Data Modeled with YANG in the
       Concise Binary Object Representation (CBOR).";
  }

  identity cbor-sids {
    base encoding;
    description
      "Encode data using CBOR as described in RFC 9254, using YANG
       SIDs allocated as described in RFC 9595.";
    reference
      "RFC 9254: Encoding of Data Modeled with YANG in the
       Concise Binary Object Representation (CBOR).

       RFC 9595: YANG Schema Item iDentifier (YANG SID).";
  }

  /* Identities for transports */

  identity transport {
    description
      "An identity that represents the underlying mechanism for
       passing notification messages.";
  }


  /*
   * TYPEDEFs
   */

  typedef ypath {
    type string {
      length "1..max";
    }
    description
      "A type for YANG instance data paths.";
  }

  typedef encoding {
    type identityref {
      base encoding;
    }
    description
      "Specifies a data encoding, e.g., for a data subscription.";
  }

  typedef subscription-id {
   type string {
      length "1..64";
      pattern '[A-Za-z0-9._-]+';
    }
    description
      "A used friendly string identifier for a subscription.";
  }

  typedef transport {
    type identityref {
      base transport;
    }
    description
      "Specifies the transport used to send notification messages
       to a receiver.";
  }

// TODO - Consider changes to list keys or reordering of
//        user-ordered lists.

  typedef centiseconds {
    type uint32;
    description
      "A period of time, measured in units of 0.01 seconds.";
  }

  typedef subscription-type {
    type enumeration {
      enum configured {
        description
          "A subscription that is created and managed via
           configuration.";
      }
      enum dynamic {
        description
          "A subscription that is created and managed via RPC
           primitives.";
      }
    }
    description
      "Indicate the type of subscription.";
  }

  typedef subscription-status {
    type enumeration {
      enum invalid {
        description
          "The subscription as a whole is unsupportable with its
          current parameters.";
      }
      enum inactive {
        description
          "The subscription is supportable with its current
          parameters, but it is not currently connected to a
          receiver";
      }
      enum active {
        description
          "The subscription is actively running, and is connected
           to at least one receiver.

           A subscription-started notification must have been sent
           for a subscription to be in this state, and the receiver
           will receive update notifications, as per the
           update-trigger selection.";
      }
    }
    description
      "Indicates the status of a subscription";
  }

  typedef subscription-change {
    type enumeration {
      enum new-subscription {
        description
          "This is a new subscription.";
      }
      enum deleted {
        description
          "The subscription has been unconfigured or deleted via
           a delete-subscription RPC";
      }
      enum killed {
        description
          "A dynamic subscription has been killed via a
           kill-subscription RPC";
      }
      enum receiver-added {
        description
          "A new receiver has been added to a configured
           subscription, and has connected successfully.";
      }
      enum receiver-removed {
        description
          "A receiver has been removed from a configured
           subscription, or has become disconnected.";
      }
      enum config-changed {
        description
          "The subscription configuration has been changed,
           requiring the subscription to be restarted.";
      }
    }

    description
      "Indicates the reason why a subscription has changed.";
  }

  /*
   * GROUPINGS
   */

  grouping dscp {
    description
      "This grouping describes QoS information concerning a
       subscription.  This information is passed to lower layers
       for transport prioritization and treatment.";
    leaf dscp {
      type inet:dscp;
      default "0";
      description
        "The desired network transport priority level.  This is the
         priority set on notification messages encapsulating the
         results of the subscription.  This transport priority is
         shared for all receivers of a given subscription.";
    }
  }

  grouping publishers {
    description
      "Grouping describes the list of publisher-ids";
    leaf-list publisher-id {
      type uint32;
      default 0;
      config false;
      description
        "Identifies the software process which publishes notification
        messages (e.g., processor 1 on line card 1). This field
        is used to notify the receiver which publisher processes
        are going to publish. The identifiers are locally unique to
        the Network Node. A publisher removed from and re-added to a
        subscription MUST be allocated a new identifier. Removed
        identifiers MUST NOT be reused within that subscription's
        lifetime.";
    }
  }

  grouping filter-choice {
    description
      "This grouping defines the types of selectors for objects
       from a datastore.";
    choice filter {
      mandatory true;
      description
        "The content filter specification for this request.";

      leaf path {
        type ypath;
        mandatory true;
        description
          "A basic path filter that allows wildcard, regex, or
           fixed value for list keys.  Each format is TODO";
      }
      anydata subtree {
        if-feature "yp2:subtree";
        mandatory true;
        description
          "This parameter identifies the portions of the
           target datastore to retrieve.";
        reference
          "RFC 6241: Network Configuration Protocol (NETCONF),
                     Section 6";
      }
      leaf xpath {
        if-feature "yp2:xpath";
        type yang:xpath1.0;
        mandatory true;
        description
          "This parameter contains an XPath expression identifying
           the portions of the target datastore to retrieve.

           If the expression returns a node set, all nodes in the
           node set are selected by the filter.  Otherwise, if the
           expression does not return a node set, the filter
           doesn't select any nodes.

           The expression is evaluated in the following XPath
           context:

           o  The set of namespace declarations is the set of prefix
              and namespace pairs for all YANG modules implemented
              by the server, where the prefix is the YANG module
              name and the namespace is as defined by the
              'namespace' statement in the YANG module.

              If the leaf is encoded in XML, all namespace
              declarations in scope on the 'stream-xpath-filter'
              leaf element are added to the set of namespace
              declarations.  If a prefix found in the XML is
              already present in the set of namespace declarations,
              the namespace in the XML is used.

           o  The set of variable bindings is empty.

           o  The function library is comprised of the core
              function library and the XPath functions defined in
              Section 10 in RFC 7950.

           o  The context node is the root node of the target
              datastore.";
        reference
          "XML Path Language (XPath) Version 1.0
           (https://www.w3.org/TR/1999/REC-xpath-19991116)
           RFC 7950: The YANG 1.1 Data Modeling Language,
                     Section 10";
      }
    }
  }

  grouping update-policy {
    description
      "This grouping describes the susbcription update policy";

    container update-trigger {
      description
        "This container describes all conditions under which
         subscription update messages are generated";

      container periodic {
        presence "indicates a periodic subscription";
        description
          "The publisher is requested to periodically notify the
            receiver regarding the current values of the datastore
            as defined by the selection filter.";
        leaf period {
          type centiseconds;
          mandatory true;
          description
            "Duration of time that should occur between periodic
              push updates, in units of 0.01 seconds.";
        }
        leaf anchor-time {
          type yang:date-and-time;
          description
            "Designates a timestamp before or after which a series
              of periodic push updates are determined.  The next
              update will take place at a point in time that is a
              multiple of a period from the 'anchor-time'.
              For example, for an 'anchor-time' that is set for the
              top of a particular minute and a period interval of a
              minute, updates will be sent at the top of every
              minute that this subscription is active.";
        }
      }
      container on-change {
        if-feature "on-change";
        presence "indicates an on-change subscription";
        description
          "The publisher is requested to notify the receiver
            regarding changes in values in the datastore subset as
            defined by a selection filter.";

        leaf sync-on-start {
          type boolean;
          default "true";
          description
            "When this object is set to 'false', (1) it restricts an
             on-change subscription from sending 'push-update'
             notifications and (2) pushing a full selection per the
             terms of the selection filter MUST NOT be done for
             this subscription.  Only updates about changes
             (i.e., only 'push-change-update' notifications)
             are sent.  When set to 'true' (the default behavior),
             in order to facilitate a receiver's synchronization,
             a full update is sent, via a 'push-update' notification,
             when the subscription starts.  After that,
             'push-change-update' notifications are exclusively sent,
             unless the publisher chooses to resync the subscription
             via a new 'push-update' notification.";
        }
      }
    }
  }

  grouping subscription-id {
    description
      "This grouping describes the subscription identifier.";

    leaf id {
      type subscription-id;
      mandatory true;
      description
        "The unique identifier for the subscription.";
    }
  }

  grouping client-subscription-id {
    description
      "This grouping describes a subscription identifier that
       cannot start with 'dyn-', which is reserved for dynamically
       created subscriptions.";

    leaf id {
      type subscription-id {
        pattern "dyn-.*" {
          modifier "invert-match";
        }
      }
      description
        "A identifier for the subscription, that MUST be unique
        across all configured and dynamic subscriptions.

        MUST NOT start with 'dyn-' which is reserved for
        dynamic subscriptions created by the publisher.";
    }
  }

  grouping subscription-schema {
    description
      "This grouping describes schema information related to a
       subscription.";

    leaf schema-id {
      type string;
      description
        "Indicates the version of the YANG schema used for this
        subscription.  The schema-id MUST change if the schema
        associated with the subscription changes.  The schema-id
        MAY change if the device schema changes, even if the
        change does not affect the subscription.";
    }

    leaf yang-library-content-id {
      type leafref {
        path "/yanglib:yang-library/yanglib:content-id";
      }
      description
        "Contains the YANG library content identifier.";
    }
  }

  grouping subscription-common {
    description
      "Common settings that are shared between dynamic and
       configured subscriptions.";

    leaf description {
      type string {
        length "1..1000";
      }
      description
        "Open text allowing a configuring entity to embed the
         originator or other specifics of this subscription.";
    }

    container target {
      description
        "Identifies the source of information against which a
         subscription is being applied as well as specifics on the
         subset of information desired from that source.";
      leaf datastore {
        type identityref {
          base ds:datastore;
        }
        default "ds:operational";
        description
          "Datastore from which to retrieve data, defaults to
           operational";
      }

      uses filter-choice;
    }

    uses update-policy;
  }


  /*
   * RPCs
   */

  rpc establish-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to create (and possibly
       negotiate) a subscription on its own behalf.  If successful,
       the subscription remains in effect for the duration of the
       subscriber's association with the publisher or until the
       subscription is terminated.  If an error occurs or the
       publisher cannot meet the terms of a subscription, an RPC
       error is returned, and the subscription is not created.
       In that case, the RPC reply's 'error-info' MAY include
       suggested parameter settings that would have a higher
       likelihood of succeeding in a subsequent
       'establish-subscription' request.";
    input {
      uses client-subscription-id {
        refine id {
          description
            "A optional identifier for a dynamic
             subscription, that must be unique across all
             configured and dynamic subscriptions.

             MUST NOT start with 'dyn-'.

             If not provided, the publisher MUST generate a unique
             identifier for the subscription, with an identifier
             that starts with 'dyn-', which is returned to the
             client in the RPC reply.";
        }
      }
      uses subscription-common;

      leaf encoding {
        type encoding;
        mandatory true;
        description
          "The encoding for the entire notification, including its
           envelope and contents. This MUST match the encoding of
           this establish-subscription RPC. An unsupported encoding
           MUST be rejected with encoding-unsupported. This applies
           to all notifications for the subscription, including
           subscription lifecycle notifications.";
      }

      uses dscp;

    }
    output {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "Identifier used for this subscription.";
      }
    }
  }

  rpc modify-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to modify a dynamic
       subscription's parameters.  If successful, the changed
       subscription parameters remain in effect for the duration of
       the subscription, until the subscription is again modified, or
       until the subscription is terminated.  In the case of an error
       or an inability to meet the modified parameters, the
       subscription is not modified and the original subscription
       parameters remain in effect.";
    input {
      uses subscription-id;
      uses subscription-common;

      uses dscp;

    }
    //output {
      // leaf id {
      //   type subscription-id;
      //   mandatory true;
      //   description
      //     "Identifier used for this subscription.";
      // }
    //}
  }

  sx:structure establish-subscription-stream-error-info {
    container establish-subscription-stream-error-info {
      description
        "If any 'establish-subscription' RPC parameters are
         unsupportable against the event stream, a subscription
         is not created and the RPC error response MUST indicate the
         reason why the subscription failed to be created.  This
         yang-data MAY be inserted as structured data in a
         subscription's RPC error response to indicate the reason for
         the failure.  This yang-data MUST be inserted if hints are
         to be provided back to the subscriber.";
      leaf reason {
        type identityref {
          base establish-subscription-error;
        }
        description
          "Indicates the reason why the subscription has failed to
           be created to a targeted event stream.";
      }
      leaf filter-failure-hint {
        type string;
        description
          "Information describing where and/or why a provided
           filter was unsupportable for a subscription.  The
           syntax and semantics of this hint are
           implementation specific.";
      }
    }
  }

  rpc delete-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to delete a subscription that
       was previously created by that same subscriber using the
       'establish-subscription' RPC.

       Only subscriptions that were created using
       'establish-subscription' from the same origin as this RPC
       can be deleted via this RPC. // TODO - Why same origin?

       If an error occurs, the server replies with an 'rpc-error'
       where the 'error-info' field MAY contain a
       'delete-subscription-error-info' structure.";
    input {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "The name of the dynamic subscription to be deleted.";
      }
    }
  }

  rpc kill-subscription {
    if-feature "dynamic";
    nacm:default-deny-all;
    description
      "This RPC allows an operator to delete a dynamic subscription
       without restrictions on the originating subscriber or
       underlying transport session.

       Only dynamic subscriptions, i.e., those that were created
       using 'establish-subscription', may be deleted via this RPC.

       If an error occurs, the server replies with an 'rpc-error'
       where the 'error-info' field MAY contain a
       'delete-subscription-error-info' structure.";
    input {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "The name of the dynamic subscription to be deleted.";
      }
    }
  }

  sx:structure delete-subscription-error-info {
    container delete-subscription-error-info {
      description
        "If a 'delete-subscription' RPC or a 'kill-subscription' RPC
         fails, the subscription is not deleted and the RPC error
         response MUST indicate the reason for this failure.  This
         yang-data MAY be inserted as structured data in a
         subscription's RPC error response to indicate the reason
         for the failure.";
      leaf reason {
        type identityref {
          base delete-subscription-error;
        }
        mandatory true;
        description
          "Indicates the reason why the subscription has failed to be
           deleted.";
      }
    }
  }

  /*
   * NOTIFICATIONS
   */

  grouping subscription-update-common {
    description
      "Data nodes common to both subscription-started and
       subscription-modified notifications.";

    uses subscription-id;
    uses subscription-common {
      augment "target" {
        description
          "Augments fields to identify the target schema.";
        uses subscription-schema;
      }
    }
    container message-publishers {
      description
        "Holds the publisher-ids for all processes currently
         associated with the subscription";
        uses yp2:publishers;
    }
  }

  notification subscription-started {
    description
      "This notification indicates that a subscription has started
       and notifications will now be sent.";
       uses subscription-update-common;
  }

  notification subscription-modified {
    description
      "This notification indicates that subscription paramaters have
       changed.";
    uses subscription-update-common;

    leaf reason {
      type subscription-change;
      mandatory true;
      description
        "Gives a hint for the message recipient as to why the
         notification has been sent.";
    }
  }

  notification subscription-terminated {
    description
      "This notification indicates that a subscription has been
       terminated.";
    uses subscription-id;
    leaf reason {
      type identityref {
        base subscription-terminated-reason;
      }
      mandatory true;
      description
        "Identifies the condition that resulted in the
         termination.";
    }
  }

  notification update {
    description
      "This notification contains a push update that in turn
       contains data subscribed to via a subscription.  In the case
       of a periodic subscription, this notification is sent for
       periodic updates.  It can also be used for synchronization
       updates of an on-change subscription.  This notification
       shall only be sent to receivers of a subscription.";
    leaf id {
      type subscription-id;
      description
        "The identifier of the subscription that is the source of
         this notification.";
    }

    leaf path-prefix {
      type string {
        length '2..max';
        pattern '/[^/].*' {
          error-message
            "path-prefix must start with '/' and contain at least "
          + "one path segment.";
        }
      }
      description
        "If present, this MUST be an absolute path from the
         schema root, starting with '/' and containing at least
         one path segment.  Neither an empty string nor '/'
         is permitted.  It specifies the common prefix for all
         target values in this notification.

         TODO - This should be a JSONified instance data path.";
    }

    leaf snapshot-type {
      type enumeration {
        enum "periodic" {
          description
            "The update message is due to a periodic update.";
        }
        enum "on-change" {
          description
            "The update message is due to an on-change event and
             may contain both update and delete operations.";
        }
        enum "resync" {
          description
            "This indicates that the update is to resynchronize the
             state, e.g., after a subscription started notification.

             Ideally, the resync message SHOULD be the first
             notification sent when a subscription has started, but
             it is not gauranteed or required to be the first
             (e.g., if an on-change event occurs).

             These messages can be used to ensure that all state
             has been sent to the client, and can be used to purge
             stale data.";
        }
      }
      mandatory true;
      description
        "This indicates the type of notification message that is
         being sent.";
    }

    leaf observation-time {
      type yang:date-and-time;
      description
        "The most accurate available time when the reported data
         was sampled for a periodic or resynchronization update,
         or when the underlying creation, modification, or deletion
         event first occurred for an on-change update.";
    }

    list updates {
      key "target";
      description
        "Each entry reports updated values or the deletion of the
         data node identified by target.  A notification may
         contain a partial snapshot of the subscribed data.

         Receivers MAY process the updates list entries in any
         order.  Consequently, the list MUST NOT contain duplicate
         target values within a single notification.  The
         target is the list key, so duplicate values are
         invalid YANG.  The list MUST NOT contain both a delete
         entry for a data node and an update entry whose
         target identifies a descendant of that deleted
         node.";

      leaf target {
        type string {
          length "1..max";
        }
        must "../../path-prefix or "
           + "starts-with(., '/')" {
          error-message
            "Without a path-prefix, target must be an "
          + "absolute path starting with '/'.";
        }
        must "not(../../path-prefix) or "
           + "not(starts-with(., '/'))" {
          error-message
            "With a path-prefix, target must be relative "
          + "and must not start with '/'.";
        }
        description
          "Identifies the data being updated or deleted.  As the
           updates list key, target MUST be present in every entry
           and MUST NOT be empty.  When path-prefix is absent,
           target MUST be an
           absolute path from the schema root, starting with '/'.
           When path-prefix is present, target MUST be relative
           and MUST NOT start with '/'.

           With a path-prefix, the full target path is
           formed by appending the target path segments to the
           prefix, using a single '/' between path segments.
           Otherwise, target itself is the full target path.
           A full target path of '/' identifies the entire
           datastore and MUST be represented by omitting
           path-prefix and setting target to '/'.";
      }

      choice data {
        mandatory true;
        description
          "Selects either an update of the supplied data or deletion
           of the data node at the target path.";
        anydata update {
          description
            "The current values of the supplied data nodes.  The
             receiver creates data nodes that do not yet exist and
             replaces the values of existing leaf and leaf-list
             nodes that are supplied.  Containers and list entries
             are updated recursively, with list entries identified
             by their keys.  Required list keys are included.

             For on-change notifications, omitted descendant data
             nodes are unchanged; their absence does not imply
             deletion.

             For periodic and resynchronization collections,
             absence is used to infer deletion only after the
             complete snapshot of
             the subscribed data has been received, as indicated
             by complete or update-complete.

             The data is encoded relative to the full target path,
             formed by combining path-prefix and target.";
        }
        leaf delete {
          when "../../snapshot-type = 'on-change'" {
            description
              "Deletion is only permitted in on-change
               notifications, never in periodic or resync
               snapshots.";
          }
          type boolean;
          default "false";
          description
            "When true, the data node at the target path and all its
             descendants have been deleted.  This operation also
             removes the corresponding data from the receiver's
             view.  If the data is already absent, no action is
             required. When false, no deletion is indicated.
             This operation MUST only be used for
             on-change deletion events and MUST NOT be used in
             periodic or resync snapshots.";
        }
      }
    }

    leaf complete {
      when "../snapshot-type = 'periodic' or "
         + "../snapshot-type = 'resync'";
      type boolean;
      default "false";
      description
        "This flag applies only to periodic and resynchronization
         collections. When true, it indicates the end of this
         publisher's contribution to the collection identified by the
         subscription id and the envelope's event-time. The
         publisher is identified by the envelope's publisher-id.
         Receivers MUST track completion per publisher and MUST NOT
         consider the full collection complete until all publishers
         serving the subscription for that collection have indicated
         completion.
         The data need not have been sampled at a single instant.

         The 'update-complete' notification MAY be used as an
         alternative to setting this flag, and is semantically
         equivalent.";
    }
  }

  notification update-complete {
    description
      "This notification indicates the end of this publisher's
       contribution to a periodic or resynchronization collection,
       identified by the subscription id and the envelope's
       event-time.

       The publisher is identified by the envelope's publisher-id.
       Receivers MUST track completion per publisher and MUST NOT
       consider the full collection complete until all publishers
       serving the subscription for that collection have indicated
       completion. The receiver MAY then purge stale state within
       the complete snapshot's scope.

       Alternatively, the 'complete' flag in the update
       notification MAY be used instead of sending this notification
       as a separate message, and both are semantically equivalent.";
    leaf id {
      type subscription-id;
      description
        "The name of the subscription that is the source of
          this notification.";
    }
  }

  sx:structure envelope {
    description
      "Encapsulates each YANG Push v2 notification, including
       datastore updates, update-complete notifications, and
       subscription lifecycle notifications.";
    leaf event-time {
      type yang:date-and-time;
      mandatory true;
      description
        "The time the telemetry infrastructure began processing the
         collection, on-change event, or subscription lifecycle
         event. All notifications for the same collection or
         on-change event MUST use the same value, including any
         update-complete notification.";
    }
    leaf hostname {
      type inet:host-name;
      mandatory true;
      description
        "The hostname of the network node. This value is usually
        configured on the node by the administrator to identify
        the node in the network uniquely.";
    }
    leaf publisher-id {
      type uint32;
      default 0;
      description
        "Identifies the software process which publishes notification
         messages (e.g., processor 1 on line card 1). This field
         is used to notify the receiver which publisher process
         published which message. The identifier is locally unique to
         the Network Node. A publisher removed from and re-added to a
         subscription MUST be allocated a new identifier. Removed
         identifiers MUST NOT be reused within that subscription's
         lifetime.";
    }
    leaf sequence-number {
      type yang:counter32;
      mandatory true;
      description
        "Sequence number maintained independently for each
         publisher-id within a subscription. The first notification
         from each newly created or re-added publisher uses 1
         under its new publisher-id.
         Each subsequent notification from that publisher-id for
         that subscription increments the value by 1, wrapping from
         4294967295 to 0 and continuing. The counter
         MUST NOT be reset during the lifetime of the subscription.";
    }
    container extensions {
      description
        "This container is reserved for future extensions to the
         notification envelope.";
    }
    anydata contents {
      mandatory true;
      description
        "Contains exactly one notification, identified by the name
         of its YANG 'notification' statement and the namespace of
         the module defining that statement. The notification's
         data node values are carried unchanged.";
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="config-subs-data-model">
      <name>Configured Subscription YANG Data Model</name>
      <t>This document specifies the ietf-yang-push-2-config YANG module <xref target="yang-push-2-config-yang-module"/> that defines an NMDA <xref target="RFC8342"/> compatible YANG data model for configuring subscriptions.  Support for this YANG module is <bcp14>OPTIONAL</bcp14> and is advertised using the normal mechanisms, e.g., <xref target="RFC8525"/>.</t>
      <t>Below is a tree diagram for the "subscriptions" container.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.  In the operational datastore <xref target="RFC8342"/>, the "subscription" list contains entries both for configured and dynamic subscriptions.</t>
      <figure anchor="SubscriptionYangTree">
        <name>subscriptions container Tree Diagram</name>
        <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw subscriptions
        +--rw subscription* [id]
           +--rw id                    subscription-id
           +--rw description?          string
           +--rw target
           |  +--rw datastore?          identityref
           |  +--rw (filter)
           |     +--:(path)
           |     |  +--rw path          ypath
           |     +--:(subtree)
           |     |  +--rw subtree       <anydata> {yp2:subtree}?
           |     +--:(xpath)
           |     |  +--rw xpath         yang:xpath1.0 {yp2:xpath}?
           |     +--:(by-reference)
           |        +--rw filter-ref    filter-ref
           +--rw update-trigger
           |  +--rw periodic!
           |  |  +--rw period         centiseconds
           |  |  +--rw anchor-time?   yang:date-and-time
           |  +--rw on-change! {on-change}?
           |     +--rw sync-on-start?   boolean
           +--rw receiver
           |       -> /datastore-telemetry/receivers/receiver/name
           +--ro status?               yp2:subscription-status
           +--ro type?                 yp2:subscription-type
           +--ro encoding?             yp2:encoding
           +--ro message-publishers* [publisher-id]
           |  +--ro publisher-id    uint32
           |  +--ro events
           |  |  +--ro last-status-change-time?
           |  |  |       yang:zero-based-counter64
           |  |  +--ro last-sequence-number?
           |  |  |       yang:zero-based-counter64
           |  |  +--ro last-update-notification-time?
           |  |  |       yang:date-and-time
           |  |  +--ro last-on-change-update-notification-time?
           |  |  |       yang:date-and-time
           |  |  +--ro last-error-time?
           |  |          yang:date-and-time
           |  +--ro statistics
           |     +--ro update-notifications?
           |     |       yang:zero-based-counter64
           |     +--ro on-change-update-notifications?
           |     |       yang:zero-based-counter64
           |     +--ro packets-sent?
           |     |       yang:zero-based-counter64
           |     +--ro bytes-sent?
           |     |       yang:zero-based-counter64
           |     +--ro receiver-disconnects?
           |     |       yang:zero-based-counter64
           |     +--ro errors?
           |             yang:zero-based-counter64
           +---x reset

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
      </figure>
      <t>An overview of the behavior for configured subscriptions is specified in <xref target="configured-subscriptions"/>, with further details specified in the ietf-yang-push-2-config YANG module.</t>
      <section anchor="yang-push-2-config-tree">
        <name>ietf-yang-push-2-config YANG tree</name>
        <t>This section shows the full tree output for ietf-yang-push-2-config YANG module.</t>
        <t>Note, this output does not include support for any transport configuration, and for any implementation that supports configured subscriptions using this YANG module then at least one transport would expect to be configurable.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Config Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw filters
     |  +--rw filter* [name]
     |     +--rw name             string
     |     +--rw (filter)
     |        +--:(path)
     |        |  +--rw path       ypath
     |        +--:(subtree)
     |        |  +--rw subtree    <anydata> {yp2:subtree}?
     |        +--:(xpath)
     |           +--rw xpath      yang:xpath1.0 {yp2:xpath}?
     +--rw subscriptions
     |  +--rw subscription* [id]
     |     +--rw id                    subscription-id
     |     +--rw description?          string
     |     +--rw target
     |     |  +--rw datastore?          identityref
     |     |  +--rw (filter)
     |     |     +--:(path)
     |     |     |  +--rw path          ypath
     |     |     +--:(subtree)
     |     |     |  +--rw subtree       <anydata> {yp2:subtree}?
     |     |     +--:(xpath)
     |     |     |  +--rw xpath         yang:xpath1.0 {yp2:xpath}?
     |     |     +--:(by-reference)
     |     |        +--rw filter-ref    filter-ref
     |     +--rw update-trigger
     |     |  +--rw periodic!
     |     |  |  +--rw period         centiseconds
     |     |  |  +--rw anchor-time?   yang:date-and-time
     |     |  +--rw on-change! {on-change}?
     |     |     +--rw sync-on-start?   boolean
     |     +--rw receiver
     |     |       -> /datastore-telemetry/receivers/receiver/name
     |     +--ro status?               yp2:subscription-status
     |     +--ro type?                 yp2:subscription-type
     |     +--ro encoding?             yp2:encoding
     |     +--ro message-publishers* [publisher-id]
     |     |  +--ro publisher-id    uint32
     |     |  +--ro events
     |     |  |  +--ro last-status-change-time?
     |     |  |  |       yang:zero-based-counter64
     |     |  |  +--ro last-sequence-number?
     |     |  |  |       yang:zero-based-counter64
     |     |  |  +--ro last-update-notification-time?
     |     |  |  |       yang:date-and-time
     |     |  |  +--ro last-on-change-update-notification-time?
     |     |  |  |       yang:date-and-time
     |     |  |  +--ro last-error-time?
     |     |  |          yang:date-and-time
     |     |  +--ro statistics
     |     |     +--ro update-notifications?
     |     |     |       yang:zero-based-counter64
     |     |     +--ro on-change-update-notifications?
     |     |     |       yang:zero-based-counter64
     |     |     +--ro packets-sent?
     |     |     |       yang:zero-based-counter64
     |     |     +--ro bytes-sent?
     |     |     |       yang:zero-based-counter64
     |     |     +--ro receiver-disconnects?
     |     |     |       yang:zero-based-counter64
     |     |     +--ro errors?
     |     |             yang:zero-based-counter64
     |     +---x reset
     +--rw receivers
        +--rw receiver* [name]
           +--rw name                      string
           +--rw encoding                  yp2:encoding
           +--rw dscp?                     inet:dscp
           +---x reset
           +--rw (notification-message-origin)?
           |  +--:(interface-originated)
           |  |  +--rw source-interface?   if:interface-ref
           |  |          {interface-designation}?
           |  +--:(address-originated)
           |     +--rw source-vrf?         leafref {supports-vrf}?
           |     +--rw source-address?     inet:ip-address-no-zone
           +--rw (transport-type)

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-config-yang-module">
        <name>ietf-yang-push-2-config YANG Model</name>
        <t>This module has import dependencies on <xref target="RFC6991"/>, <xref target="RFC8343"/>, and <xref target="RFC8529"/>, and ietf-yang-push-lite.yang (this RFC).  In addition, this YANG module references <xref target="BCP14"/> (<xref target="RFC2119"/> <xref target="RFC8174"/>), and <xref target="RFC8529"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2-config</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2-config.yang#0.1.0"><![CDATA[
module ietf-yang-push-2-config {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config";
  prefix yp2co;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343: A YANG Data Model for Interface Management";
  }
  import ietf-network-instance {
    prefix ni;
    reference
      "RFC 8529: YANG Data Model for Network Instances";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-yang-push-2 {
    prefix yp2;
    reference
      "RFC XXXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push version 2
     configuration and operational state model.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2025-08-03 {
    description
      "Initial revision.";
    reference
      "XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * FEATURES
   */

  feature interface-designation {
    description
      "This feature indicates that a publisher supports sourcing all
       receiver interactions for a configured subscription from a
       single designated egress interface.";
  }

  feature supports-vrf {
    description
      "This feature indicates that a publisher supports VRF
       configuration for configured subscriptions.  VRF support for
       dynamic subscriptions does not require this feature.";
    reference
      "RFC 8529: YANG Data Model for Network Instances,
                 Section 6";
  }

  /*
   * TYPEDEFs
   */

  typedef filter-ref {
    type leafref {
      path "/datastore-telemetry/filters/filter/name";
    }
    description
      "This type is used to reference a selection filter.";
  }

  /*
   * GROUPINGS
   */
  grouping filter-ref {
    description
      "This grouping is used to reference a selection filter.";
    leaf filter-ref {
      type filter-ref;
      mandatory true;
      description
        "References an existing selection filter that is to be
        applied to the subscription.";
    }
  }

  /*
   * DATA NODES
   */

  container datastore-telemetry {
    presence "Enables datastore telemetry";
    description
    "YANG Push v2 Datastore Telemetry Configuration and State.";
    container filters {
      description
        "Contains a list of configurable filters that can be applied
         to subscriptions.  This facilitates the reuse of complex
         filters once defined.";

      list filter {
        key "name";
        description
          "A list of preconfigured filters that can be applied
          to datastore subscriptions.";
        leaf name {
          type string {
            length "1..64";
            pattern '[A-Za-z0-9._-]+';
          }
          description
            "A unique name to identify the selection filters.";
        }
        uses yp2:filter-choice;
      }
    }
    container subscriptions {
      description
        "Contains the list of currently active subscriptions, i.e.,
        subscriptions that are currently in effect, used for
        subscription management and monitoring purposes.  This
        includes subscriptions that have been set up via
        RPC primitives as well as subscriptions that have been
        established via configuration.";
      list subscription {
        key "id";
        description
          "The identity and specific parameters of a subscription.
          Subscriptions in this list can be created using a control
          channel or RPC or can be established through configuration.

          If the 'kill-subscription' RPC or configuration operations
          are used to delete a subscription, a
          'subscription-terminated' message is sent to any active or
          suspended receivers.";

        uses yp2:client-subscription-id;
        uses yp2:subscription-common;

        leaf receiver {
          type leafref {
            path "/datastore-telemetry/receivers/receiver/name";
          }
          mandatory true;
          description
            "Identifies the receiver for a subscription.";
        }

        // leaf status {
        //   type enumeration {
        //     enum disconnected {
        //       description
        //         "This subscription does not have an active session
        //           with the receiver, and it is not trying to
        //           connect.

        //         E.g., this state may be reported if the
        //         subscription is not valid, or has not been started
        //         yet.";
        //     }
        //     enum connecting {
        //       description
        //         "The publisher is trying to establish a session
        //           with the receiver for this subscription.

        //           For a session less transport, this state may be
        //           used to indicate that there is no route to the
        //           receiver.

        //           A receiver in connecting state may indicate that
        //           the transport or associated security session
        //           could not be established, and the publisher is
        //         periodically trying to establish the connection.";
        //     }
        //     enum active {
        //       description
        //         "The publisher has successfully connected (if over
        //           a session based transport) to the receiver for
        //           this subscription, and the publisher is able to
        //           send notifications to the receiver.";
        //     }
        //   }
        //   config false;
        //   description
        //     "Specifies the connection status of the receiver for
        //       this subscription.";
        // }

        leaf status {
          type yp2:subscription-status;
          config false;
          description
            "The presence of this leaf indicates that the
             subscription originated from configuration, not through
             a control channel or RPC.  The value indicates the state
             of the subscription as established by the publisher.";
        }

        leaf type {
          type yp2:subscription-type;
          default "configured";
          config false;
          description
            "Whether the subscription is configured or dynamic.";
        }

        leaf encoding {
          type yp2:encoding;
          config false;
          description
            "The encoding of the entire notification, including its
             envelope and contents. For a dynamic subscription,
             this matches the encoding of the establish-subscription
             RPC.";
        }

        list message-publishers {
          key "publisher-id";
          config false;
          description
            "Holds per publisher-id information for all processes
             currently associated with the subscription";
          leaf publisher-id {
            type uint32;
//            default 0;
            description
              "Identifies the software process which publishes
               notification messages (e.g., processor 1 on line
               card 1). This field is used to notify the receiver
               which publisher processes are going to publish.
               The identifiers are locally unique to the Network
               Node.";
          }

          container events {
            description
              "Holds event information for the subscription.";

            leaf last-status-change-time {
              type yang:zero-based-counter64;
              config false;
              description
                "The timestamp when the subscription status last
                changed";
            }

            leaf last-sequence-number {
              type yang:zero-based-counter64;
              config false;
              description
                "The envelope sequence number for the last
                 notification sent for this subscription from this
                 publisher.";
            }

            leaf last-update-notification-time {
              type yang:date-and-time;
              config false;
              description
                "The timestamp of the last update notification, of
                 any type from this publisher.";
            }

            leaf last-on-change-update-notification-time {
              type yang:date-and-time;
              config false;
              description
                "The timestamp of the last update notification for
                 an on-change event from this publisher.";
            }

            leaf last-error-time {
              type yang:date-and-time;
              config false;
              description
                "The timestamp of the last time an error occurred
                 on this subscription.  E.g., failing to retrieve
                 some of the data, failing to encode some data.";
            }
          }

          container statistics {
            description
              "Statistics related to the number of messages or
              notifications generated for this publisher
              for this subscription.

              All counters are initialized to zero when the
              subscription is first created.";

            leaf update-notifications {
              type yang:zero-based-counter64;
              description
                "The number of *update* notifications generated.

                 Excludes update-complete notifications.

                 The count is re-initialized to 0 when the
                 subscription is first created.";
            }

            leaf on-change-update-notifications {
              type yang:zero-based-counter64;
              description
                "The number of *on-change* update notifications
                 generated.

                 The count is re-initialized to 0 when the
                 subscription is first created.";
            }

            leaf packets-sent {
              type yang:zero-based-counter64;
              description
                "The total number of packets sent to the receiver.";
            }

            leaf bytes-sent {
              type yang:zero-based-counter64;
              description
                "The total number of bytes sent to the receiver.";
            }

            leaf receiver-disconnects {
              type yang:zero-based-counter64;
              description
                "The total number of times the receiver has been
                  disconnected.";
            }

            leaf errors {
              type yang:zero-based-counter64;
              description
                "The total number of errors that have occurred.";
            }
          }
        }

        action reset {
          description
            "Reset the subscription.

             This action will cause a new subscription-started
             message to be sent for the subscription";
        }
      }
    }
    container receivers {
      description
        "A container for all instances of configured receivers.";

      list receiver {
        key "name";

        leaf name {
          type string {
            length "1..64";
            pattern '[A-Za-z0-9._-]+';
          }
          description
            "An arbitrary but unique name for this receiver
            instance.";
        }

        leaf encoding {
          type yp2:encoding;
          mandatory true;
          description
            "The encoding of both the notification envelope and
             its contents for configured subscriptions referencing
             this receiver.";
        }

        uses yp2:dscp;

        action reset {
          description
            "Resets all configured subscriptions that reference
             this receiver.

             This action is similar to invoking the 'reset' action
             on all subscriptions that reference this receiver
             configuration.";
        }

        choice notification-message-origin {
          description
            "Identifies the egress interface on the publisher
            from which notification messages are to be sent.";
          case interface-originated {
            description
              "When notification messages are to egress a specific,
              designated interface on the publisher.";
            leaf source-interface {
              if-feature "interface-designation";
              type if:interface-ref;
              description
                "References the interface for notification
                 messages.";
            }
          }
          case address-originated {
            description
              "When notification messages are to depart from a
              publisher using a specific originating address and/or
              routing context information.";
            leaf source-vrf {
              if-feature "supports-vrf";
              type leafref {
                path
                  '/ni:network-instances/ni:network-instance/' 
                  + 'ni:name';
              }
              description
                "VRF from which notification messages should egress a
                publisher.";
            }
            leaf source-address {
              type inet:ip-address-no-zone;
              description
                "The source address for the notification messages.
                If a source VRF exists but this object doesn't, a
                publisher's default address for that VRF must
                be used.";
            }
          }
        }

        choice transport-type {
          mandatory true;
          description
            "Choice of different types of transports used to
             send notifications.  The 'case' statements must
             be augmented in by other modules.";
        }

        description
          "A list of all receiver instances.";
      }
    }
  }

  augment "/yp2:subscription-started/yp2:target" {

    description
      "Allow a subscription-started notification to include a
       referenced named filter";
    uses filter-ref {
      refine "filter-ref" {
        mandatory false;
      }
    }
  }

  augment "/yp2:subscription-modified/yp2:target" {

    description
      "Allow a subscription-modified notification to include a
       referenced named filter";
    uses filter-ref {
      refine "filter-ref" {
        mandatory false;
      }
    }
  }

  augment "/datastore-telemetry/subscriptions/subscription/"
        + "target/filter" {

    description
      "Augment the subscription filter to allow
       referencing a filter configured separately.";

    case by-reference {
      description
        "Incorporates a filter that has been configured
         separately.";
      uses filter-ref;
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="capabilities-yang-data-model">
      <name>Capabilities YANG Data Model</name>
      <section anchor="yang-push-2-capabilities-tree">
        <name>ietf-yang-push-2-capabilities YANG tree</name>
        <t>This section shows the tree output for ietf-yang-push-2-capabilities YANG module, which augments the ietf-system-capabilities YANG module <xref target="RFC9196"/>.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Capabilities Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-capabilities

  augment /sysc:system-capabilities:
    +--ro datastore-telemetry
    |  +--ro periodic-notifications-supported?   notification-support
    |  +--ro (update-period)?
    |  |  +--:(minimum-update-period)
    |  |  |  +--ro minimum-update-period?        uint32
    |  |  +--:(supported-update-period)
    |  |     +--ro supported-update-period*      uint32
    |  +--ro on-change-supported?                notification-support
    |  +--ro transport
    |     +--ro transport-capability* [transport-protocol]
    |        +--ro transport-protocol    identityref
    |        +--ro security-protocol?    identityref
    |        +--ro encoding-format*      identityref
    +--ro distributed-notifications-supported?   boolean
  augment /sysc:system-capabilities/sysc:datastore-capabilities
            /sysc:per-node-capabilities:
    +--ro datastore-telemetry
       +--ro periodic-notifications-supported?   notification-support
       +--ro (update-period)?
       |  +--:(minimum-update-period)
       |  |  +--ro minimum-update-period?        uint32
       |  +--:(supported-update-period)
       |     +--ro supported-update-period*      uint32
       +--ro on-change-supported?                notification-support
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-yang-capabilities-module">
        <name>ietf-yang-push-2-capabilities YANG Model</name>
        <t>This module imports typedefs from the yang-push-lite YANG module.</t>
        <t>This module augments the ietf-system-capabilities YANG module <xref target="RFC9196"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2-capabilities</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2-capabilities.yang#0.1.0"><![CDATA[
module ietf-yang-push-2-capabilities {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities";
  prefix yp2ca;

  import ietf-system-capabilities {
    prefix sysc;
    reference
      "RFC 9196: YANG Modules Describing Capabilities for Systems
       and Datastore Update Notifications";
  }
  import ietf-yang-push-2 {
    prefix yp2;
    reference
      "RFC XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push lite.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2024-11-11 {
    description
      "Initial revision.";
    reference
      "XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * IDENTITIES
   */

  identity security-protocol {
    description
      "Identity for security protocols.";
  }

  identity tls12 {
    base security-protocol;
    description
      "Indicates TLS Protocol Version 1.2. TLS 1.2 is obsolete,
       and thus it is NOT RECOMMENDED to enable this feature.";
    reference
      "RFC 5246: The Transport Layer Security (TLS) Protocol
                 Version 1.2";
  }

  identity tls13 {
    base security-protocol;
    description
      "Indicates TLS Protocol Version 1.3.";
    reference
      "RFC 8446: The Transport Layer Security (TLS)
                 Protocol Version 1.3";
  }

  identity dtls12 {
    base security-protocol;
    description
      "Indicates DTLS Protocol Version 1.2. TLS 1.2 is obsolete,
       and thus it is NOT RECOMMENDED to enable this feature.";
    reference
      "RFC 6347: The Datagram Transport Layer Security (TLS) Protocol
                 Version 1.2";
  }

  identity dtls13 {
    base security-protocol;
    description
      "Indicates DTLS Protocol Version 1.3.";
    reference
      "RFC 9147: The Datagram Transport Layer Security (TLS)
                 Protocol Version 1.3";
  }

  identity ssh {
    base security-protocol;
    description
      "Indicates SSH.";
  }


  grouping yp2-capabilities {
    description
      "Capabilities related to YANG Push Lite subscriptions
       and notifications";
    container datastore-telemetry {
      description
        "Capabilities related to YANG Push List subscriptions
         and notifications";
      typedef notification-support {
        type bits {
          bit config-changes {
            description
              "The publisher is capable of sending
               notifications for 'config true' nodes for the
               relevant scope and subscription type.";
          }
          bit state-changes {
            description
              "The publisher is capable of sending
               notifications for 'config false' nodes for the
               relevant scope and subscription type.";
          }
        }
        description
          "Type for defining whether 'on-change' or
           'periodic' notifications are supported for all data nodes,
           'config false' data nodes, 'config true' data nodes, or
           no data nodes.

           The bits config-changes or state-changes have no effect
           when they are set for a datastore or for a set of nodes
           that does not contain nodes with the indicated config
           value.  In those cases, the effect is the same as if no
           support was declared.  One example of this is indicating
           support for state-changes for a candidate datastore that
           has no effect.";
      }

      leaf periodic-notifications-supported {
        type notification-support;
        description
          "Specifies whether the publisher is capable of
           sending 'periodic' notifications for the selected
           data nodes, including any subtrees that may exist
           below them.";
        reference
          "RFC 8641: Subscription to YANG Notifications for
           Datastore Updates, 'periodic' subscription concept";
      }
      choice update-period {
        description
          "Supported update period value or values for
           'periodic' subscriptions.";
        leaf minimum-update-period {
          type uint32;
          units "centiseconds";
          description
            "Indicates the minimal update period that is
             supported for a 'periodic' subscription.

             A subscription request to the selected data nodes with
             a smaller period than what this leaf specifies is
             likely to result in a 'period-unsupported' error.";
        }
        leaf-list supported-update-period {
          type uint32;
          units "centiseconds";
          description
            "Supported update period values for a 'periodic'
             subscription.

             A subscription request to the selected data nodes with a
             period not included in the leaf-list will result in a
             'period-unsupported' error.";
        }
      }
      leaf on-change-supported {
        type notification-support;
        description
          "Specifies whether the publisher is capable of
           sending 'on-change' notifications for the selected
           data nodes and the subtree below them.";
      }
    }
  }

  grouping yp2-transport-capabilities {
    description
      "Capabilities related to transports supporting Yang Push Lite";
    container transport {
      description
        "Specifies capabilities related to YANG-Push transports.";
      list transport-capability {
        key "transport-protocol";
        description
          "Indicates a list of capabilities related to notification
                  transport.";
        leaf transport-protocol {
          type identityref {
            base yp2:transport;
          }
          description
            "Indicates supported transport protocol for YANG-Push.";
        }
        leaf security-protocol {
          type identityref {
            base security-protocol;
          }
          description
            "Indicates transport security protocol.";
        }
        leaf-list encoding-format {
          type identityref {
            base yp2:encoding;
          }
          description
            "Indicates supported encoding formats.";
        }
      }
    }
  }

  // YANG Push Lite Capabilities
  augment "/sysc:system-capabilities" {
    description
      "Adds system level capabilities for YANG Push Lite";
    uses yp2-capabilities;

    leaf distributed-notifications-supported {
      type boolean;
      description
        "Indicates whether the server supports distributed
          notifications and may source message from different
          Message Publishers.";
    }
  }

  augment "/sysc:system-capabilities/yp2ca:datastore-telemetry" {
    description
      "Adds system level Yang Push Lite transport capabilities";
    uses yp2-transport-capabilities;
  }

  augment "/sysc:system-capabilities/sysc:datastore-capabilities"
        + "/sysc:per-node-capabilities" {
    description
      "Add datastore and node-level capabilities";
    uses yp2-capabilities;
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>With configured subscriptions, one or more publishers could be used to overwhelm a receiver.  To counter this, notification messages <bcp14>SHOULD NOT</bcp14> be sent to any receiver that does not support this specification.  Receivers that do not want notification messages need only terminate or refuse any transport sessions from the publisher.</t>
      <t>When a receiver of a configured subscription gets a new "subscription-started" message for a known subscription where it is already consuming events, it may indicate that an attacker has done something that has momentarily disrupted receiver connectivity. <strong>TODO - Do we still want this paragraph?</strong>.</t>
      <t>For dynamic subscriptions, implementations need to protect against malicious or buggy subscribers that may send a large number of "establish-subscription" requests and thereby use up system resources.  To cover this possibility, operators <bcp14>SHOULD</bcp14> monitor for such cases and, if discovered, take remedial action to limit the resources used, such as suspending or terminating a subset of the subscriptions or, if the underlying transport is session based, terminating the underlying transport session.</t>
      <t>Using DNS names for configured subscription's receiver "name" lookups can cause situations where the name resolves differently than expected on the publisher, so the recipient would be different than expected.</t>
      <section anchor="use-of-yang-push-v2-with-nacm">
        <name>Use of YANG Push v2 with NACM</name>
        <t><strong>TODO, do we even need this section?</strong></t>
        <t>This specification <bcp14>MAY</bcp14> be used with access control tools, such as NACM <xref target="RFC8341"/>.  Please refer to that specification for normative guidance of how NACM applies.</t>
        <t>For informative purposes, please note that NACM can be used:</t>
        <ul spacing="normal">
          <li>
            <t>NACM can be used to control access to the data nodes and RPCs defined in the YANG modules defined in this document.</t>
          </li>
          <li>
            <t>NACM can be used to control access to the data included in the YANG <em>update</em> notifications.</t>
          </li>
        </ul>
      </section>
      <section anchor="receiver-authorization">
        <name>Receiver Authorization</name>
        <t><strong>TODO Relax when access control must be checked.</strong></t>
        <t><strong>TODO Consider if this is the best place in the document, but this text needs to be updated regardless.</strong></t>
        <t>A receiver of subscription data <bcp14>MUST</bcp14> only be sent updates for which it has proper authorization.  A publisher <bcp14>MUST</bcp14> ensure that no unauthorized data is included in push updates.  To do so, it needs to apply all corresponding checks applicable at the time of a specific pushed update and, if necessary, silently remove any unauthorized data from datastore subtrees.  This enables YANG data that is pushed based on subscriptions to be authorized in a way that is equivalent to a regular data retrieval ("get") operation.</t>
        <t>Each "push-update" and "push-change-update" <bcp14>MUST</bcp14> have access control applied, as depicted in Figure 5.  This includes validating that read access is permitted for any new objects selected since the last notification message was sent to a particular receiver.  A publisher <bcp14>MUST</bcp14> silently omit data nodes from the results that the client is not authorized to see.  To accomplish this, implementations <bcp14>SHOULD</bcp14> apply the conceptual authorization model of <xref target="RFC8341"/>, specifically Section 3.2.4, extended to apply analogously to data nodes included in notifications, not just &lt;rpc-reply&gt; messages sent in response to
&lt;get&gt; and &lt;get-config&gt; requests.</t>
        <figure>
          <name>Access Control for Push Updates</name>
          <artwork align="left"><![CDATA[
                     +-----------------+      +--------------------+
  push-update or --> | datastore node  |  yes | add datastore node |
 push-change-update  | access allowed? | ---> | to update record   |
                     +-----------------+      +--------------------+
]]></artwork>
        </figure>
        <t>A publisher <bcp14>MUST</bcp14> allow for the possibility that a subscription's selection filter references nonexistent data or data that a receiver is not allowed to access.  Such support permits a receiver the ability to monitor the entire lifecycle of some datastore tree without needing to explicitly enumerate every individual datastore node.  If, after access control has been applied, there are no objects remaining in an update record, then the effect varies given if the subscription is a periodic or on-change subscription.  For a periodic subscription, an empty "push-update" notification <bcp14>MUST</bcp14> be sent, so that clients do not get confused into thinking that an update was lost.  For an on-change subscription, a "push-update" notification <bcp14>MUST NOT</bcp14> be sent, so that clients remain unaware of changes made to nodes they don't have read-access for.</t>
        <t>A publisher <bcp14>MAY</bcp14> choose to reject an "establish-subscription" request that selects nonexistent data or data that a receiver is not allowed to access.  The error identity "unchanging-selection" <bcp14>SHOULD</bcp14> be returned as the reason for the rejection.  In addition, a publisher <bcp14>MAY</bcp14> choose to terminate a dynamic subscription or suspend a configured receiver when the authorization privileges of a receiver change or the access controls for subscribed objects change.  In that case, the publisher <bcp14>SHOULD</bcp14> include the error identity "unchanging-selection" as the reason when sending the "subscription-terminated" or "subscription-suspended" notification, respectively.  Such a capability enables the publisher to avoid having to support
continuous and total filtering of a subscription's content for every update record.  It also reduces the possibility of leakage of access-controlled objects.</t>
        <t>If read access into previously accessible nodes has been lost due to a receiver permissions change, this <bcp14>SHOULD</bcp14> be reported as a patch "delete" operation for on-change subscriptions.  If not capable of handling such receiver permission changes with such a "delete", publisher implementations <bcp14>MUST</bcp14> force dynamic subscription re-establishment or configured subscription reinitialization so that appropriate filtering is installed.</t>
      </section>
      <section anchor="yang-module-security-considerations">
        <name>YANG Module Security Considerations</name>
        <t>This section is modeled after the template described in Section 3.7.1 of <xref target="I-D.ietf-netmod-rfc8407bis"/>.</t>
        <t>The "ietf-yang-push-2" YANG module defines a data model that is designed to be accessed via YANG-based management protocols, such as NETCONF <xref target="RFC6241"/> and RESTCONF <xref target="RFC8040"/>. These protocols have to use a secure transport layer (e.g., SSH <xref target="RFC4252"/>, TLS <xref target="RFC8446"/>, and QUIC <xref target="RFC9000"/>) and have to use mutual authentication.</t>
        <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a pre-configured subset of all available NETCONF or RESTCONF protocol operations and content.</t>
        <t>There are a number of data nodes defined in this YANG module that are writable/creatable/deletable (i.e., "config true", which is the default).  All writable data nodes are likely to be reasonably sensitive or vulnerable in some network environments.  Write operations (e.g., edit-config) and delete operations to these data nodes without proper protection or authentication can have a negative effect on network operations.  The following subtrees and data nodes have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>There are no particularly sensitive writable data nodes.</t>
          </li>
        </ul>
        <t>Some of the readable data nodes in this YANG module may be considered sensitive or vulnerable in some network environments.  It is thus important to control read access (e.g., via get, get-config, or notification) to these data nodes. Specifically, the following subtrees and data nodes have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>There are no particularly sensitive readable data nodes.</t>
          </li>
        </ul>
        <t>Some of the RPC or action operations in this YANG module may be considered sensitive or vulnerable in some network environments. It is thus important to control access to these operations. Specifically, the following operations have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>kill-subscription - this RPC operation allows the caller to kill any dynamic subscription, even those created via other users, or other transport sessions.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="namespace-uri-registrations">
        <name>Namespace URI registrations</name>
        <t>This document registers the following namespace URI in the "IETF XML Registry" <xref target="RFC3688"/>:</t>
        <table>
          <name>Namespace URI registrations</name>
          <thead>
            <tr>
              <th align="left">URI</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2</td>
            </tr>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config</td>
            </tr>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities</td>
            </tr>
          </tbody>
        </table>
        <t>For all registrations:</t>
        <ul spacing="normal">
          <li>
            <t>Registrant Contact: The IESG.</t>
          </li>
          <li>
            <t>XML: N/A; the requested URI is an XML namespace.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="yang-module-name-registrations">
      <name>YANG Module Name registrations</name>
      <t>This document registers the following YANG modules in the "YANG Module Names" registry <xref target="RFC6020"/>:</t>
      <table>
        <name>YANG Module Name Registrations</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Namespace</th>
            <th align="left">Prefix</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">ietf-yang-push-2</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2</td>
            <td align="left">ypl</td>
          </tr>
          <tr>
            <td align="left">ietf-yang-push-2-config</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config</td>
            <td align="left">yplco</td>
          </tr>
          <tr>
            <td align="left">ietf-yang-push-2-capabilities</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities</td>
            <td align="left">yplca</td>
          </tr>
        </tbody>
      </table>
      <t>For all registration the reference is "RFC XXXX".</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This initial draft is early work is based on discussions with various folk, particularly Thomas Graf, Holger Keller, Dan Voyer, Nils Warnke, and Alex Huang Feng; but also wider conversations that include: Benoit Claise, Pierre Francois, Paolo Lucente, Jean Quilbeuf, among others.</t>
      <t>In addition, as described in the introduction, the authors would like to acknowledge that this work builds on work of others, such as, Subscribed Notifications, YANG Push, and various extensions to that work.</t>
      <t>Markup and prose have been produced using ChatGPT Codex and reviewed by the authors. The final content remains the responsibility of the authors.</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>The following individuals have actively contributed to this draft and the YANG Push Solution.</t>
      <ul spacing="normal">
        <li>
          <t>Dan Voyer</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2474">
          <front>
            <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
            <author fullname="K. Nichols" initials="K." surname="Nichols"/>
            <author fullname="S. Blake" initials="S." surname="Blake"/>
            <author fullname="F. Baker" initials="F." surname="Baker"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="December" year="1998"/>
            <abstract>
              <t>This document defines the IP header field, called the DS (for differentiated services) field. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2474"/>
          <seriesInfo name="DOI" value="10.17487/RFC2474"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC7951">
          <front>
            <title>JSON Encoding of Data Modeled with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines encoding rules for representing configuration data, state data, parameters of Remote Procedure Call (RPC) operations or actions, and notifications defined using YANG as JavaScript Object Notation (JSON) text.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7951"/>
          <seriesInfo name="DOI" value="10.17487/RFC7951"/>
        </reference>
        <reference anchor="RFC8340">
          <front>
            <title>YANG Tree Diagrams</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="215"/>
          <seriesInfo name="RFC" value="8340"/>
          <seriesInfo name="DOI" value="10.17487/RFC8340"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC8342">
          <front>
            <title>Network Management Datastore Architecture (NMDA)</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>Datastores are a fundamental concept binding the data models written in the YANG data modeling language to network management protocols such as the Network Configuration Protocol (NETCONF) and RESTCONF. This document defines an architectural framework for datastores based on the experience gained with the initial simpler model, addressing requirements that were not well supported in the initial model. This document updates RFC 7950.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8342"/>
          <seriesInfo name="DOI" value="10.17487/RFC8342"/>
        </reference>
        <reference anchor="RFC8525">
          <front>
            <title>YANG Library</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document describes a YANG library that provides information about the YANG modules, datastores, and datastore schemas used by a network management server. Simple caching mechanisms are provided to allow clients to minimize retrieval of this information. This version of the YANG library supports the Network Management Datastore Architecture (NMDA) by listing all datastores supported by a network management server and the schema that is used by each of these datastores.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8525"/>
          <seriesInfo name="DOI" value="10.17487/RFC8525"/>
        </reference>
        <reference anchor="RFC8529">
          <front>
            <title>YANG Data Model for Network Instances</title>
            <author fullname="L. Berger" initials="L." surname="Berger"/>
            <author fullname="C. Hopps" initials="C." surname="Hopps"/>
            <author fullname="A. Lindem" initials="A." surname="Lindem"/>
            <author fullname="D. Bogdanovic" initials="D." surname="Bogdanovic"/>
            <author fullname="X. Liu" initials="X." surname="Liu"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document defines a network instance module. This module can be used to manage the virtual resource partitioning that may be present on a network device. Examples of common industry terms for virtual resource partitioning are VPN Routing and Forwarding (VRF) instances and Virtual Switch Instances (VSIs).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8529"/>
          <seriesInfo name="DOI" value="10.17487/RFC8529"/>
        </reference>
        <reference anchor="RFC8791">
          <front>
            <title>YANG Data Structure Extensions</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Björklund" initials="M." surname="Björklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document describes YANG mechanisms for defining abstract data structures with YANG.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8791"/>
          <seriesInfo name="DOI" value="10.17487/RFC8791"/>
        </reference>
        <reference anchor="RFC9196">
          <front>
            <title>YANG Modules Describing Capabilities for Systems and Datastore Update Notifications</title>
            <author fullname="B. Lengyel" initials="B." surname="Lengyel"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="B. Claise" initials="B." surname="Claise"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document defines two YANG modules, "ietf-system-capabilities" and "ietf-notification-capabilities".</t>
              <t>The module "ietf-system-capabilities" provides a placeholder structure that can be used to discover YANG-related system capabilities for servers. The module can be used to report capability information from the server at runtime or at implementation time by making use of the YANG instance data file format.</t>
              <t>The module "ietf-notification-capabilities" augments "ietf-system-capabilities" to specify capabilities related to "Subscription to YANG Notifications for Datastore Updates" (RFC 8641).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9196"/>
          <seriesInfo name="DOI" value="10.17487/RFC9196"/>
        </reference>
        <reference anchor="RFC9254">
          <front>
            <title>Encoding of Data Modeled with YANG in the Concise Binary Object Representation (CBOR)</title>
            <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
            <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
            <author fullname="A. Pelov" initials="A." surname="Pelov"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>YANG (RFC 7950) is a data modeling language used to model configuration data, state data, parameters and results of Remote Procedure Call (RPC) operations or actions, and notifications.</t>
              <t>This document defines encoding rules for YANG in the Concise Binary Object Representation (CBOR) (RFC 8949).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9254"/>
          <seriesInfo name="DOI" value="10.17487/RFC9254"/>
        </reference>
        <reference anchor="RFC9595">
          <front>
            <title>YANG Schema Item iDentifier (YANG SID)</title>
            <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
            <author fullname="A. Pelov" initials="A." role="editor" surname="Pelov"/>
            <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <date month="July" year="2024"/>
            <abstract>
              <t>YANG Schema Item iDentifiers (YANG SIDs) are globally unique 63-bit unsigned integers used to identify YANG items. SIDs provide a more compact method for identifying those YANG items that can be used efficiently, notably in constrained environments (RFC 7228). This document defines the semantics, registration processes, and assignment processes for YANG SIDs for IETF-managed YANG modules. To enable the implementation of these processes, this document also defines a file format used to persist and publish assigned YANG SIDs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9595"/>
          <seriesInfo name="DOI" value="10.17487/RFC9595"/>
        </reference>
        <reference anchor="RFC9485">
          <front>
            <title>I-Regexp: An Interoperable Regular Expression Format</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="T. Bray" initials="T." surname="Bray"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies I-Regexp, a flavor of regular expression that is limited in scope with the goal of interoperation across many different regular expression libraries.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9485"/>
          <seriesInfo name="DOI" value="10.17487/RFC9485"/>
        </reference>
        <reference anchor="RFC9911">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schönwälder" initials="J." role="editor" surname="Schönwälder"/>
            <date month="December" year="2025"/>
            <abstract>
              <t>This document defines a collection of common data types to be used with the YANG data modeling language. It includes several new type definitions and obsoletes RFC 6991.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9911"/>
          <seriesInfo name="DOI" value="10.17487/RFC9911"/>
        </reference>
        <reference anchor="BCP14">
          <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>
        <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>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-netconf-notif-envelope">
          <front>
            <title>Extensible YANG Model for YANG-Push Notifications</title>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>Deutsche Telekom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Everything OPS &amp; Arrcus</organization>
            </author>
            <date day="31" month="October" year="2026"/>
            <abstract>
              <t>   This document defines a new extensible Notification structure,
   defined in YANG, for use in YANG-Push Notification messages, both for
   NETCONF and RESTCONF, enabling any YANG-compatible encodings such as
   XML, JSON, or CBOR.  Additionally, it defines two essential
   extensions: an extension to this structure supporting a hostname and
   a sequence number, and an extension to the YANG-Push Notifications
   supporting a timestamp characterizing the moment when the data was
   observed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-notif-envelope-07"/>
        </reference>
        <reference anchor="RFC3411">
          <front>
            <title>An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks</title>
            <author fullname="D. Harrington" initials="D." surname="Harrington"/>
            <author fullname="R. Presuhn" initials="R." surname="Presuhn"/>
            <author fullname="B. Wijnen" initials="B." surname="Wijnen"/>
            <date month="December" year="2002"/>
            <abstract>
              <t>This document describes an architecture for describing Simple Network Management Protocol (SNMP) Management Frameworks. The architecture is designed to be modular to allow the evolution of the SNMP protocol standards over time. The major portions of the architecture are an SNMP engine containing a Message Processing Subsystem, a Security Subsystem and an Access Control Subsystem, and possibly multiple SNMP applications which provide specific functional processing of management data. This document obsoletes RFC 2571. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="62"/>
          <seriesInfo name="RFC" value="3411"/>
          <seriesInfo name="DOI" value="10.17487/RFC3411"/>
        </reference>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC4252">
          <front>
            <title>The Secure Shell (SSH) Authentication Protocol</title>
            <author fullname="T. Ylonen" initials="T." surname="Ylonen"/>
            <author fullname="C. Lonvick" initials="C." role="editor" surname="Lonvick"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>The Secure Shell Protocol (SSH) is a protocol for secure remote login and other secure network services over an insecure network. This document describes the SSH authentication protocol framework and public key, password, and host-based client authentication methods. Additional authentication methods are described in separate documents. The SSH authentication protocol runs on top of the SSH transport layer protocol and provides a single authenticated tunnel for the SSH connection protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4252"/>
          <seriesInfo name="DOI" value="10.17487/RFC4252"/>
        </reference>
        <reference anchor="RFC5277">
          <front>
            <title>NETCONF Event Notifications</title>
            <author fullname="S. Chisholm" initials="S." surname="Chisholm"/>
            <author fullname="H. Trevino" initials="H." surname="Trevino"/>
            <date month="July" year="2008"/>
            <abstract>
              <t>This document defines mechanisms that provide an asynchronous message notification delivery service for the Network Configuration protocol (NETCONF). This is an optional capability built on top of the base NETCONF definition. This document defines the capabilities and operations necessary to support this service. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5277"/>
          <seriesInfo name="DOI" value="10.17487/RFC5277"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
        <reference anchor="RFC7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe"/>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection. It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </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="RFC8343">
          <front>
            <title>A YANG Data Model for Interface Management</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document defines a YANG data model for the management of network interfaces. It is expected that interface-type-specific data models augment the generic interfaces data model defined in this document. The data model includes definitions for configuration and system state (status information and counters for the collection of statistics).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document obsoletes RFC 7223.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8343"/>
          <seriesInfo name="DOI" value="10.17487/RFC8343"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC8072">
          <front>
            <title>YANG Patch Media Type</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes a method for applying patches to configuration datastores using data defined with the YANG data modeling language.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8072"/>
          <seriesInfo name="DOI" value="10.17487/RFC8072"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="RFC8640">
          <front>
            <title>Dynamic Subscription to YANG Events and Datastores over NETCONF</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document provides a Network Configuration Protocol (NETCONF) binding to the dynamic subscription capability of both subscribed notifications and YANG-Push.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8640"/>
          <seriesInfo name="DOI" value="10.17487/RFC8640"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document describes a mechanism that allows subscriber applications to request a continuous and customized stream of updates from a YANG datastore. Providing such visibility into updates enables new capabilities based on the remote mirroring and monitoring of configuration and operational state.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8641"/>
          <seriesInfo name="DOI" value="10.17487/RFC8641"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-rfc8407bis">
          <front>
            <title>Guidelines for Authors and Reviewers of Documents Containing YANG Data Models</title>
            <author fullname="Andy Bierman" initials="A." surname="Bierman">
              <organization>YumaWorks</organization>
            </author>
            <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair">
              <organization>Orange</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <date day="5" month="June" year="2025"/>
            <abstract>
              <t>   This document provides guidelines for authors and reviewers of
   specifications containing YANG data models, including IANA-maintained
   modules.  Recommendations and procedures are defined, which are
   intended to increase interoperability and usability of Network
   Configuration Protocol (NETCONF) and RESTCONF Protocol
   implementations that utilize YANG modules.  This document obsoletes
   RFC 8407.

   Also, this document updates RFC 8126 by providing additional
   guidelines for writing the IANA considerations for RFCs that specify
   IANA-maintained modules.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-rfc8407bis-28"/>
        </reference>
        <reference anchor="I-D.ietf-nmop-network-anomaly-architecture">
          <front>
            <title>A Framework for a Network Anomaly Detection Architecture</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Wanting Du" initials="W." surname="Du">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>Deutsche Telekom</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   This document describes the motivation and architecture of a Network
   Anomaly Detection Framework and the relationship to other documents
   describing network Symptom semantics and network incident lifecycle.

   The described architecture for detecting IP network service
   interruption is designed to be generic applicable and extensible.
   Different applications are described and examples are referenced with
   open-source running code.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nmop-network-anomaly-architecture-08"/>
        </reference>
        <reference anchor="I-D.ietf-nmop-yang-message-broker-integration">
          <front>
            <title>An Architecture for YANG-Push to Message Broker Integration</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany">
              <organization>Swisscom</organization>
            </author>
            <date day="2" month="July" year="2026"/>
            <abstract>
              <t>   This document describes the motivation and architecture of a native
   YANG-Push notifications and YANG Schema integration into a Message
   Broker and YANG Schema Registry.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nmop-yang-message-broker-integration-13"/>
        </reference>
        <reference anchor="I-D.ietf-netconf-udp-notif">
          <front>
            <title>UDP-based Transport for Configured Subscriptions</title>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>Deutsche Telekom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Tianran Zhou" initials="T." surname="Zhou">
              <organization>Huawei</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Paolo Lucente" initials="P." surname="Lucente">
              <organization>NTT</organization>
            </author>
            <date day="29" month="July" year="2026"/>
            <abstract>
              <t>   This document describes a UDP-based transport for YANG notifications
   to collect data from network nodes within a controlled environment.
   A shim header is defined to facilitate the data streaming directly
   from a publishing process on a network device to telemetry receivers.
   Such a design enables higher frequency updates and less performance
   overhead on publisher and receiver processes compared to already
   established notification mechanisms.  A YANG data model is also
   defined for management of the described UDP-based transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-udp-notif-26"/>
        </reference>
        <reference anchor="I-D.netana-netconf-yp-transport-capabilities">
          <front>
            <title>YANG Notification Transport Capabilities</title>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Qiufang Ma" initials="Q." surname="Ma">
              <organization>Huawei</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <date day="17" month="January" year="2025"/>
            <abstract>
              <t>   This document specifies a YANG module for YANG notifications
   transport capabilities which augments "ietf-system-capabilities" YANG
   module defined in [RFC9196].  The module provides transport,
   encoding, and encryption system capabilities for transport-specific
   notification.  This YANG module can be used by the client to learn
   capability information from the server at runtime or at
   implementation time, by making use of the YANG instance data file
   format.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-netana-netconf-yp-transport-capabilities-01"/>
        </reference>
        <reference anchor="I-D.ietf-netconf-https-notif">
          <front>
            <title>An HTTPS-based Transport for YANG Notifications</title>
            <author fullname="Mahesh Jethanandani" initials="M." surname="Jethanandani">
              <organization>Kloud Services</organization>
            </author>
            <author fullname="Kent Watsen" initials="K." surname="Watsen">
              <organization>Watsen Networks</organization>
            </author>
            <date day="30" month="June" year="2026"/>
            <abstract>
              <t>   This document defines a protocol for sending asynchronous event
   notifications similar to notifications defined in RFC 5277, but over
   HTTPS.  YANG modules for configuring publishers are also defined.
   Examples are provided illustrating how to configure various
   publishers.

   This document requires that the publisher is a "server" (e.g., a
   NETCONF or RESTCONF server), but does not assume that the receiver is
   a server.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-https-notif-16"/>
        </reference>
        <reference anchor="I-D.ietf-netconf-distributed-notif">
          <front>
            <title>Subscription to Notifications in a Distributed Architecture</title>
            <author fullname="Tianran Zhou" initials="T." surname="Zhou">
              <organization>Huawei</organization>
            </author>
            <author fullname="Guangying Zheng" initials="G." surname="Zheng">
              <organization>Huawei</organization>
            </author>
            <author fullname="Eric Voit" initials="E." surname="Voit">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="31" month="October" year="2026"/>
            <abstract>
              <t>   This document describes extensions to configured subscriptions to
   YANG notifications to allow metrics being published directly from
   processors on line cards to target receivers, while subscription is
   still maintained at the route processor in a distributed forwarding
   system of a network node.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-distributed-notif-24"/>
        </reference>
        <reference anchor="I-D.jgc-netmod-yang-path">
          <front>
            <title>YANG path format (ypath)</title>
            <author fullname="James Cumming" initials="J." surname="Cumming">
              <organization>Nokia</organization>
            </author>
            <date day="12" month="August" year="2026"/>
            <abstract>
              <t>   This document defines ypath (YANG path), a single-line, self-
   describing path format for referencing nodes in YANG schema trees,
   YANG instance data, and data filters.  A ypath identifies YANG nodes
   using module-qualified names and list key predicates.  The format is
   closely related to the YANG instance-identifier built-in type but
   additionally supports schema paths, filter wildcards, regular
   expression key matching, key value sets, and path enumeration.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jgc-netmod-yang-path-00"/>
        </reference>
        <reference anchor="I-D.yn-netmod-yang-xml-03">
          <front>
            <title>XML Encoding of Data Modeled with YANG</title>
            <author fullname="Kent Watsen" initials="K." surname="Watsen">
              <organization>Watsen Networks</organization>
            </author>
            <date day="15" month="March" year="2026"/>
            <abstract>
              <t>   This document defines encoding rules for representing YANG modeled
   configuration data, state data, parameters of Remote Procedure Call
   (RPC) operations or actions, and notifications defined using XML.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-yn-netmod-yang-xml-03"/>
        </reference>
        <reference anchor="Kafka" target="https://kafka.apache.org/">
          <front>
            <title>Apache Kafka</title>
            <author initials="" surname="Apache.org" fullname="Apache.org">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="Consistency" target="https://en.wikipedia.org/wiki/Consistency_(database_systems)">
          <front>
            <title>Consistency (database systems)</title>
            <author initials="" surname="Wikipedia" fullname="Wikipedia">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="EventualConsistency" target="https://www.techopedia.com/definition/29165/eventual-consistency">
          <front>
            <title>Eventual Consistency</title>
            <author initials="M." surname="Rouse" fullname="Margaret Rouse">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="XPATH" target="https://www.w3.org/TR/1999/REC-xpath-19991116/">
          <front>
            <title>XML Path Language (XPath) Version 1.0</title>
            <author initials="" surname="W3C" fullname="W3C">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="W3C.REC-xml-20001006" target="https://www.w3.org/TR/2000/REC-xml-20001006">
          <front>
            <title>Extensible Markup Language (XML) 1.0 (Second Edition)</title>
            <author initials="" surname="W3C" fullname="W3C">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="gNMI" target="https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md">
          <front>
            <title>gRPC Network Management Interface (gNMI)</title>
            <author initials="" surname="OpenConfig" fullname="OpenConfig">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
      </references>
    </references>
    <?line 4186?>

<section anchor="DifferencesFromYangPush">
      <name>Functional changes between YANG Push v2 and YANG Push</name>
      <t>This non-normative section highlights the significant functional changes where the YANG Push v2 implementation differs from YANG Push.  However, the main body of this document, from <xref target="overview"/> onwards, provides the normative definition of the YANG Push v2 specification, except for any text or sections that explicitly indicate that they are informative rather being normative.</t>
      <t><em>Note to reviewers: If you notice mistakes in this section during development of the document and solution then please point them out to the authors and the working group.</em> <strong>(RFC editor, please remove this paragraph prior to publication)</strong></t>
      <section anchor="removed-functionality">
        <name>Removed Functionality</name>
        <t>This section lists functionality specified in <xref target="RFC8639"/> and YANG Push which is not specified in YANG Push v2.</t>
        <ul spacing="normal">
          <li>
            <t>The ability to suspend and resume a dynamic subscription.  Instead a dynamic subscription is terminated if the device cannot reliably fulfill the subscription or a receiver is too slow causing the subscription to be back pressured.</t>
          </li>
          <li>
            <t>Specifying a subscription stop time, and the corresponding subscription-completed notification have been removed.</t>
          </li>
          <li>
            <t>Replaying of buffered event records are not supported, for both configured and dynamic subscriptions.  The nearest equivalent is requesting a sync-on-start replay when the subscription transport session comes up which will reply the current state.</t>
          </li>
          <li>
            <t>QoS weighting and dependency between subscriptions has been removed due to the complexity of implementation.</t>
          </li>
          <li>
            <t>The "subscription-state-notif" extension has been removed.</t>
          </li>
          <li>
            <t>The YANG Patch format <xref target="RFC8072"/> is no longer used for on-change subscriptions.</t>
          </li>
          <li>
            <t>Support for multiple receivers for a configured subscription.</t>
          </li>
        </ul>
      </section>
      <section anchor="changed-functionality">
        <name>Changed Functionality</name>
        <t>This section documents behavior that exists in both YANG Push and YANG Push v2, but the behavior differs between the two:</t>
        <ul spacing="normal">
          <li>
            <t>Subscription error reporting, including hints, remains under review.  The device <bcp14>SHOULD</bcp14> reject subscriptions that are likely to overload the device, but more onus is placed on the operator configuring the subscriptions or setting up the dynamic subscriptions to ensure that subscriptions are reasonable, as they would be expected to do for any other configuration.</t>
          </li>
          <li>
            <t>All YANG Push v2 notification messages use the notification envelope defined in this document (<xref target="NotificationEnvelope"/>).  YANG Push <xref target="RFC8641"/> uses the notification format defined in <xref target="RFC5277"/>, or the notification envelope defined in <xref target="I-D.ietf-netconf-notif-envelope"/> if supported and enabled.</t>
          </li>
          <li>
            <t>There is a lot more alignment in data model, behavior, and state machined in YANG Push v2, aiming to minimize differences.</t>
          </li>
          <li>
            <t>Changes to handling receivers:  </t>
            <ul spacing="normal">
              <li>
                <t>For configured subscriptions, receivers are configured separately from the subscription and are referenced.</t>
              </li>
              <li>
                <t>For configured subscriptions, transport and encoding parameters are configured as part of a receiver definition, and are used by all subscriptions directed towards a given receiver.</t>
              </li>
              <li>
                <t>Encoding is now a mandatory parameter under a receiver and dynamic subscription (rather than specifying a default).</t>
              </li>
              <li>
                <t>Invoking the <em>reset</em> YANG action on a receiver requires and forces a reset of any transport sessions associated with that receiver.  Previously, the sessions would not be reset if they were used by other subscriptions.</t>
              </li>
              <li>
                <t>YANG Push v2 only supports a single receiver per subscription.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Periodic and on-change message uses a common <em>update</em> notification message format, allowing for the messages to be processed by clients in a similar fashion and to support combined periodic and on-change subscriptions.</t>
          </li>
          <li>
            <t>Changes related to the configuration model:  </t>
            <ul spacing="normal">
              <li>
                <t>Subscriptions are identified by a string identifier rather than a numeric identifier.  The prefix 'dyn-' is reserved for publisher allocated dyanmic subscription ids.  Clients may provide the id to be used for dynamic subscriptions.  There is changed handling for conflicting subscription-ids between configured and dynamic.</t>
              </li>
              <li>
                <t>Purpose has been renamed to Description (since it is a more generic term), limited to 1k characters, but also available for dynamic subscriptions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>On-change dampening:  </t>
            <ul spacing="normal">
              <li>
                <t>Client configurable on-change dampening has been removed.</t>
              </li>
              <li>
                <t>However, YANG Push v2 allows a publisher to limit the rate at which a data node is sampled for on-change notifications.  See <xref target="OnChangeConsiderations"/> for further details.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Dynamic subscriptions are no longer mandatory to implement, either or both of Configured and Dynamic Subscriptions may be implemented in YANG Push v2.</t>
          </li>
          <li>
            <t>The solution focuses solely on datastore subscriptions that each have their own event stream.  Filters cannot be applied to the event stream, only to the set of datastore data nodes that are monitored by the subscription.</t>
          </li>
          <li>
            <t>The lifecycle events of when a subscription-started or subscription-terminated may be sent differs from <xref target="RFC8639"/>/<xref target="RFC8641"/>:  </t>
            <ul spacing="normal">
              <li>
                <t>Subscription-started notifications are also sent for dynamic subscriptions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Some of the requirements on transport have been relaxed.</t>
          </li>
          <li>
            <t>The encoding identities have been extended with CBOR encodings, and the "encoding-" prefix has been removed (so that there is a better on the wire representation).</t>
          </li>
          <li>
            <t>YANG Push v2 allows for a publisher to provide an eventually consistent distributed view of the operational datastore, with subscribed data decomposed across messages and publishing processes, rather than requiring a single atomic snapshot.</t>
          </li>
        </ul>
      </section>
      <section anchor="added-functionality">
        <name>Added Functionality</name>
        <ul spacing="normal">
          <li>
            <t>Device capabilities are reported via <em>ietf-yang-push-2-capabilities</em>, which augments <em>ietf-system-capabilities</em> (<xref target="RFC9196"/>).</t>
          </li>
          <li>
            <t>A new <em>update</em> message:  </t>
            <ul spacing="normal">
              <li>
                <t>Covers both on-change and periodic events.</t>
              </li>
              <li>
                <t>Allows multiple updates to be sent in a single message (e.g., for on-change).</t>
              </li>
              <li>
                <t>Allows for a common path prefix to be specified, with any paths and encoded YANG data to be encoded relative to the common path prefix.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The <em>complete</em> flag or an <em>update-complete</em> notification indicates completion of a publisher's contribution to a periodic or resynchronization collection. Receivers track completion across all participating publishers.</t>
          </li>
          <li>
            <t>Support for distributed notifications has been added to the base YANG Push v2 specification, as described in <xref target="distributed-notifications"/>.</t>
          </li>
          <li>
            <t>TODO - More operational data on the subscription load and performance.</t>
          </li>
          <li>
            <t>All YANG Push v2 configuration is under a new <em>datastore-telemetry</em> presence container</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="subscription-errors-from-rfc-8641">
      <name>Subscription Errors (from RFC 8641)</name>
      <section anchor="rpc-failures-1">
        <name>RPC Failures</name>
        <t>Rejection of an RPC for any reason is indicated via an RPC error
response from the publisher.  Valid RPC errors returned include both
(1) existing transport-layer RPC error codes, such as those seen with
NETCONF in <xref target="RFC6241"/> and (2) subscription-specific errors, such as
those defined in the YANG data model.  As a result, how subscription
errors are encoded in an RPC error response is transport dependent.</t>
        <t>References to specific identities in the ietf-subscribed-
notifications YANG module <xref target="RFC8639"/> or the ietf-yang-push YANG module
may be returned as part of the error responses resulting from failed
attempts at datastore subscription.  For errors defined as part of
the ietf-subscribed-notifications YANG module, please refer to
<xref target="RFC8639"/>.  The errors defined in this document, grouped per RPC, are
as follows:</t>
        <artwork><![CDATA[
      establish-subscription          modify-subscription
      ---------------------------     ---------------------
       cant-exclude                    period-unsupported
       datastore-not-subscribable      update-too-big
       on-change-unsupported           sync-too-big
       on-change-sync-unsupported      unchanging-selection
       period-unsupported
       update-too-big                 resync-subscription
       sync-too-big                   ----------------------------
       unchanging-selection            no-such-subscription-resync
                                       sync-too-big
]]></artwork>
        <t>There is one final set of transport-independent RPC error elements
included in the YANG data model.  These are the four yang-data
structures for failed datastore subscriptions:</t>
        <ol spacing="normal" type="1"><li>
            <t>yang-data "establish-subscription-error-datastore": This <bcp14>MUST</bcp14> be
returned if information identifying the reason for an RPC error
has not been placed elsewhere in the transport portion of a
failed "establish-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent
if hints are included.</t>
          </li>
          <li>
            <t>yang-data "modify-subscription-error-datastore": This <bcp14>MUST</bcp14> be
returned if information identifying the reason for an RPC error
has not been placed elsewhere in the transport portion of a
failed "modify-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if
hints are included.</t>
          </li>
          <li>
            <t>yang-data "sn:delete-subscription-error": This <bcp14>MUST</bcp14> be returned
if information identifying the reason for an RPC error has not
been placed elsewhere in the transport portion of a failed
"delete-subscription" or "kill-subscription" RPC response.</t>
          </li>
          <li>
            <t>yang-data "resync-subscription-error": This <bcp14>MUST</bcp14> be returned if
information identifying the reason for an RPC error has not been
placed elsewhere in the transport portion of a failed
"resync-subscription" RPC response.</t>
          </li>
        </ol>
      </section>
      <section anchor="failure-notifications">
        <name>Failure Notifications</name>
        <t>A subscription may be unexpectedly terminated or suspended
independently of any RPC or configuration operation.  In such cases,
indications of such a failure <bcp14>MUST</bcp14> be provided.  To accomplish this,
a number of errors can be returned as part of the corresponding
subscription state change notification.  For this purpose, the
following error identities are introduced in this document, in
addition to those that were already defined in <xref target="RFC8639"/>:</t>
        <artwork><![CDATA[
  subscription-terminated        subscription-suspended
  ---------------------------    ----------------------
  datastore-not-subscribable     period-unsupported
  unchanging-selection           update-too-big
                                  synchronization-size
]]></artwork>
      </section>
    </section>
    <section anchor="PathPrefixExamples">
      <name>Path Prefix and Target Examples</name>
      <t>The following examples illustrate the path rules for update notifications.  They assume an illustrative YANG module named <tt>example</tt> with a top-level <tt>system</tt> container containing a <tt>name</tt> leaf.  "Absent" means that the field is omitted; <tt>""</tt> means a present field containing an empty string.  An invalid combination has no valid full target path.  For valid combinations, an <em>update</em> supplies data at the identified target, and a <em>delete</em> removes the identified data and its descendants from the receiver's view.</t>
      <table>
        <name>Examples of target path construction</name>
        <thead>
          <tr>
            <th align="left">path-prefix</th>
            <th align="left">target</th>
            <th align="left">Full target path</th>
            <th align="left">Validity and expected behavior</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Absent</td>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">Valid: acts on the system container.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">
              <tt>name</tt></td>
            <td align="left">
              <tt>/example:system/name</tt></td>
            <td align="left">Valid: acts on the name leaf.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">
              <tt>""</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: the target must not be empty.</td>
          </tr>
          <tr>
            <td align="left">Absent</td>
            <td align="left">
              <tt>/</tt></td>
            <td align="left">
              <tt>/</tt></td>
            <td align="left">Valid: acts on the entire datastore.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>""</tt></td>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: a present prefix cannot be empty.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>/</tt></td>
            <td align="left">
              <tt>example:system</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: the prefix contains no path segment.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>example:system</tt></td>
            <td align="left">
              <tt>name</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: the prefix is not absolute.</td>
          </tr>
          <tr>
            <td align="left">Absent</td>
            <td align="left">
              <tt>example:system</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: without a prefix, the target is not absolute.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">
              <tt>/name</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: with a prefix, the target starts with '/'.</td>
          </tr>
          <tr>
            <td align="left">Absent</td>
            <td align="left">
              <tt>""</tt></td>
            <td align="left">None</td>
            <td align="left">Invalid: without a prefix, an empty target is not absolute.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>/example:system</tt></td>
            <td align="left">Absent</td>
            <td align="left">None</td>
            <td align="left">Invalid: the target is the required key of each updates entry.</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="Examples">
      <name>Examples</name>
      <t>Notes on examples:</t>
      <ul spacing="normal">
        <li>
          <t>To allow for programmatic validation, most notification examples in this section exclude the mandatory notification envelope and associated metadata defined in <xref target="NotificationEnvelope"/>.  Full notification examples, including <xref target="FullNotificationExample"/>, include the notification header.</t>
        </li>
        <li>
          <t>These notification message examples are given using a JSON encoding, but could be encoded using XML or CBOR.</t>
        </li>
        <li>
          <t>Full notification examples use the envelope defined in <xref target="NotificationEnvelope"/>.  Payload-only examples omit that wrapper for brevity and validation.</t>
        </li>
        <li>
          <t>The <em>observation-time</em> field records when the data was sampled or the change was observed.</t>
        </li>
        <li>
          <t>All these examples are created by hand, may contain errors, and may not parse correctly.</t>
        </li>
      </ul>
      <section anchor="example-of-periodic-update-messages">
        <name>Example of periodic update messages</name>
        <t>In this example, a subscription is for <em>/ietf-interfaces:interfaces/interface</em>.  However, for efficiency reasons, the publisher is internally returning the data from two different data providers.</t>
        <t>Of note:</t>
        <ul spacing="normal">
          <li>
            <t>The first periodic message is published for the entries in the <em>/ietf-interfaces:interface/interfaces</em> list, but doesn't contain the data in the <em>statistics</em> child container.</t>
          </li>
          <li>
            <t>the <em>path-prefix</em> identifies the parent of the subscribed interface list.</t>
          </li>
          <li>
            <t>the <em>target</em> is <tt>interface</tt>, identifying the subscribed list relative to <em>path-prefix</em>.</t>
          </li>
        </ul>
        <figure>
          <name>Example periodic update for interfaces list</name>
          <sourcecode type="JSON" name="periodic-update.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.11Z",
    "updates": [
      {
        "target": "interface",
        "update": {
          "interface": [
            {
              "name": "eth0",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "oper-status": "up",
              "admin-status": "up"
            },
            {
              "name": "eth1",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "oper-status": "up",
              "admin-status": "up"
            }
          ]
        }
      }
    ],
    "complete": false
  }
}
]]></sourcecode>
        </figure>
        <t>For the second notification related to the same subscription:</t>
        <ul spacing="normal">
          <li>
            <t>the second periodic message is published for only the statistics associated with the interfaces.</t>
          </li>
          <li>
            <t>as above, <em>path-prefix</em> identifies the parent of the subscribed interface list, and <em>target</em> is <tt>interface</tt>.</t>
          </li>
          <li>
            <t>the second notification uses a separate observation-time, but would use the same event-time in the notification header so that the two messages can be correlated to the same periodic collection event.</t>
          </li>
          <li>
            <t>the second periodic message has set the <em>complete</em> flag to indicate that it is the last notification as part of the periodic collection.  A separate <em>update-complete</em> notification could have been sent instead.</t>
          </li>
        </ul>
        <figure>
          <name>Example periodic update for interface statistics</name>
          <sourcecode type="JSON" name="periodic-update-stats.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.21Z",
    "updates": [
      {
        "target": "interface",
        "update": {
          "ietf-interfaces:interface": [
            {
              "name": "eth0",
              "statistics": {
                "in-octets": 123456,
                "out-octets": 654321
              }
            },
            {
              "name": "eth1",
              "statistics": {
                "in-octets": 789012,
                "out-octets": 210987
              }
            }
          ]
        }
      }
    ]
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="example-of-an-on-change-notification-containing-updated-data">
        <name>Example of an on-change notification containing updated data</name>
        <t>If the subscription is for on-change notifications, or periodic-and-on-change notifications, then, if the interface state changed (specifically if the <tt>enabled</tt> and <tt>oper-status</tt> leaves changed), and if the device was capable of generating on-change notifications, then you may see the following message.  A few points of notes here:</t>
        <ul spacing="normal">
          <li>
            <t>The on-change notification includes only the data nodes that changed within the <em>target</em>.  It does not repeat unchanged sibling data.</t>
          </li>
          <li>
            <t>A single on-change notification could also publish updates for multiple interfaces in the same message.</t>
          </li>
          <li>
            <t>The schema of the change message is exactly the same as for the equivalent periodic message.  It doesn't use the YANG Patch format <xref target="RFC8072"/> for on-change messages.</t>
          </li>
          <li>
            <t>The <em>observation-time</em> leaf represents when the system first observed the on-change event occurring.  The envelope's <em>event-time</em> represents when the telemetry infrastructure began processing the change notification.</t>
          </li>
          <li>
            <t>The <em>on-change</em> snapshot type identifies messages triggered by changes to the subscribed data.  Each entry in the <em>updates</em> list specifies an <em>update</em> or <em>delete</em> operation, and a single message may contain both operations.  An <em>update</em> operation does not distinguish between creation and modification.</t>
          </li>
        </ul>
        <figure>
          <name>Example YANG Push v2 on-change update message</name>
          <sourcecode type="JSON" markers="true" name="on-change-msg.json"><![CDATA[
{
  "ietf-yang-push-2:envelope": {
    "event-time": "2025-10-10T08:16:05.22Z",
    "hostname": "example-router",
    "sequence-number": 454,
    "contents": {
      "update": {
        "id": "interfaces",
        "snapshot-type": "on-change",
        "observation-time": "2025-10-10T08:16:05.11Z",
        "updates": [
          {
            "target": "/ietf-interfaces:interfaces/interface[name='eth0']",
            "update": {
              "enabled": false,
              "oper-status": "down"
            }
          }
        ]
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="example-of-an-on-change-notification-containing-deleted-data">
        <name>Example of an on-change notification containing deleted data</name>
        <section anchor="update-message-with-single-deleted-data-node">
          <name>Update message with single deleted data node</name>
          <t>If the interface was deleted, and if the system was capable of reporting on-change events for the delete event, then an on-change delete message would be encoded as per the following message.</t>
          <t>Of note:</t>
          <ul spacing="normal">
            <li>
              <t>The ietf-yang-push-2:envelope has been elided</t>
            </li>
            <li>
              <t>The deleted data is identified by the target node in the <em>updates/target</em> element.</t>
            </li>
            <li>
              <t>The observation time represents the time at which the delete event occurred, e.g., perhaps when the system processed a configuration change.</t>
            </li>
          </ul>
          <figure>
            <name>Example YANG Push v2 on-change delete message</name>
            <sourcecode type="JSON" name="on-change-delete-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "snapshot-type": "on-change",
    "observation-time": "2025-10-10T08:16:15.11Z",
    "updates": [
      {
        "target": "/ietf-interfaces:interfaces/interface[name='eth0']",
        "delete": true
      }
    ]
  }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="update-message-with-multiple-on-change-deletes">
          <name>Update message with multiple on-change deletes</name>
          <t>This follow example illustrates how a single update notification message can contain multiple on-change delete events for different data nodes.  In this example, two separate interfaces are being deleted.</t>
          <t>Of note:</t>
          <ul spacing="normal">
            <li>
              <t>The ietf-yang-push-2:envelope has been elided</t>
            </li>
            <li>
              <t><em>path-prefix</em> is used to shorten the <em>target</em> values.  Each full <em>target-path</em> is formed by appending the corresponding <em>target</em> path segments to <em>path-prefix</em>.</t>
            </li>
            <li>
              <t>all delete events share a common observation-time of when the delete events occurred.  If it is necessary to identify separate observation times then the publisher would send separate messages.</t>
            </li>
            <li>
              <t>data node subtrees that are deleted (list entries in this case) are identified by separate entries in the <em>updates</em> list.</t>
            </li>
          </ul>
          <figure>
            <name>Example YANG Push v2 on-change delete message</name>
            <sourcecode type="JSON" name="on-change-multi-delete-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "on-change",
    "observation-time": "2025-10-10T08:16:16.11Z",
    "updates": [
      {
        "target": "interface[name='eth0']",
        "delete": true
      },
      {
        "target": "interface[name='eth1']",
        "delete": true
      }
    ]
  }
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="netconf-dynamic-subscription-rpc-examples">
        <name>NETCONF Dynamic Subscription RPC examples</name>
        <t>The examples in this section illustrate NETCONF RPCs for establishing and deleting dynamic subscriptions using YANG Push v2.  The examples include one successfully establishing a subscription, and a second to illustrate how errors are returned if a request to establish the subscription fails.  Examples of the <em>update</em> and subscription lifecycle notifications have been given in the previous section.</t>
        <section anchor="successful-periodic-subscription">
          <name>Successful periodic subscription</name>
          <t>The subscriber sends an "establish-subscription" RPC with the parameters listed in <xref target="EstablishDynamic"/>  An example might look like:</t>
          <figure>
            <name>Example establish-subscription RPC for interface statistics</name>
            <sourcecode type="XML" name="netconf-establish-sub-if-stats.xml"><![CDATA[
<netconf:rpc 
message-id="101" xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
  <establish-subscription xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push-2">
    <id>if-stats-sub</id>
    <description>Subscribe to interface statistics</description>
    <target>
      <datastore xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
        ds:operational
      </datastore>
      <path>/ietf-interfaces:interfaces/interface/statistics</path>
    </target>
    <update-trigger>
      <periodic>
        <period>3000</period>
      </periodic>
    </update-trigger>
    <encoding>xml</encoding>
  </establish-subscription>
</netconf:rpc>
]]></sourcecode>
          </figure>
          <t>If a publisher is happy to accept the subscription, then it returns a positive response that includes the "id" of the accepted subscription.  For example,</t>
          <figure>
            <name>Example establish-subscription RPC successful reply</name>
            <sourcecode type="XML" name="establish-subscription-reply.xml"><![CDATA[
<rpc-reply 
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <id xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push-2">dyn-52</id>
</rpc-reply>
]]></sourcecode>
          </figure>
          <t>Once established, the publisher would send a <em>subscription-started</em> notification message followed by <em>update</em> notification messages at the requested periodic cadence.</t>
        </section>
        <section anchor="failed-periodic-subscription">
          <name>Failed periodic subscription</name>
          <t>A subscription can be rejected for multiple reasons, including the
lack of authorization to establish a subscription, no capacity to
serve the subscription at the publisher, or the inability of the
publisher to select datastore content at the requested cadence.</t>
          <t>If a request is rejected because the publisher is not able to serve
it, the publisher <bcp14>SHOULD</bcp14> include in the returned error hints that
help a subscriber understand what subscription parameters might have
been accepted for the request.  These hints would be included in the
yang-data structure "establish-subscription-error-datastore".
However, even with these hints, there are no guarantees that
subsequent requests will in fact be accepted.</t>
          <t>The specific parameters to be returned as part of the RPC error
response depend on the specific transport that is used to manage the
subscription.  For NETCONF, those parameters are defined in
<xref target="RFC8640"/>.  For example, for the following NETCONF request:</t>
          <artwork><![CDATA[
  <rpc message-id="101"
      xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <establish-subscription
        xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
        xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push">
      <yp:datastore
          xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
        ds:operational
      </yp:datastore>
      <yp:datastore-xpath-filter
          xmlns:ex="https://example.com/sample-data/1.0">
        /ex:foo
      </yp:datastore-xpath-filter>
      <yp:on-change>
      </yp:on-change>
    </establish-subscription>
  </rpc>

      Figure 12: "establish-subscription" Request: Example 2
]]></artwork>
          <t>A publisher that cannot serve on-change updates but can serve
periodic updates might return the following NETCONF response:</t>
          <artwork><![CDATA[
 <rpc-reply message-id="101"
   xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
   xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications">
   <rpc-error>
     <error-type>application</error-type>
     <error-tag>operation-failed</error-tag>
     <error-severity>error</error-severity>
     <error-path>/yp:periodic/yp:period</error-path>
     <error-info>
       <yp:establish-subscription-error-datastore>
         <yp:reason>yp:on-change-unsupported</yp:reason>
       </yp:establish-subscription-error-datastore>
     </error-info>
   </rpc-error>
 </rpc-reply>

       Figure 13: "establish-subscription" Error Response: Example 2
]]></artwork>
        </section>
        <section anchor="delete-subscription-rpc">
          <name>"delete-subscription" RPC</name>
          <t>To stop receiving updates from a subscription and effectively delete
a subscription that had previously been established using an
"establish-subscription" RPC, a subscriber can send a
"delete-subscription" RPC, which takes as its only input the
subscription's "id".  This RPC is unmodified from <xref target="RFC8639"/>.</t>
        </section>
      </section>
      <section anchor="distrib-notif-example">
        <name>Distributed Notifications Subscription</name>
        <t>This simple example illustrates how messages may look like when using
distributed notifications, as described in <xref target="distributed-notifications"/>.  This example is for a very simple periodic subscription to the ietf-interfaces YANG data model.</t>
        <t>The first message is a subscription started message that indicates that there
are 2 additional <em>Publisher Agents</em> with publisher-ids of 4 and 7, e.g., perhaps representing a device with two linecards inserted into slots 4 and 7, each with
their owner separate Message Publisher process.  This message has a publisher-id of 0 because it is sent by the Publisher Parent, which, because this field has the default value, could have been elided from the message.</t>
        <figure>
          <name>Example distributed notification subscription started message</name>
          <sourcecode type="JSON" name="distributed-subscription-started.json"><![CDATA[
{
  "ietf-yang-push-2:envelope": {
    "event-time": "2025-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "sequence-number": 1,
    "contents": {
      "subscription-started": {
        "id": "interfaces",
        "target": {
          "datastore": "ietf-datastores:operational",
          "path": "/ietf-interfaces:interfaces"
        },
        "update-trigger": {
          "periodic": {
            "period": 3000,
            "anchor-time": "2025-01-01T00:00:00.00Z"
          }
        },
        "message-publishers": {
          "publisher-id": [0, 4, 7]
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>The second message is an example of a periodic update message sent from one of the Publisher Agents on the linecard.  In this case the message is sent from the publisher agent on linecard 4, and it has set the <em>complete</em> leaf to indicate that the message represents all data for that periodic collection from that publisher.</t>
        <figure>
          <name>Example distributed notification update message</name>
          <sourcecode type="JSON" name="full-distributed-notification.json"><![CDATA[
{
  "ietf-yang-push-2:envelope": {
    "event-time": "2025-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "publisher-id": 4,
    "sequence-number": 18,
    "contents": {
      "update": {
        "id": "interfaces",
        "snapshot-type": "periodic",
        "observation-time": "2025-10-10T08:00:05.11Z",
        "updates": [
          {
            "target": "/ietf-interfaces:interfaces/interface",
            "update": {
              "ietf-interfaces:interfaces": {
                "interface": [
                  {
                    "name": "eth4/0",
                    "type": "iana-if-type:ethernetCsmacd",
                    "enabled": true,
                    "oper-status": "up",
                    "admin-status": "up"
                  },
                  {
                    "name": "eth4/1",
                    "type": "iana-if-type:ethernetCsmacd",
                    "enabled": true,
                    "oper-status": "down",
                    "admin-status": "up"
                  }
                ]
              }
            }
          }
        ],
        "complete": true
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>Not shown here, but because there were 3 publisher-ids listed in the subscription-started message means that each Message Publisher must send at least one message for each periodic subscription returning any data associated with the subscription from that Message Publisher and also indicating that the periodic collection is complete by either setting <tt>complete = true</tt> or sending an <em>update-complete</em> notification.</t>
      </section>
    </section>
    <section anchor="OpenIssuesTracker">
      <name>Summary of Open Issues &amp; Potential Enhancements</name>
      <t>This temporary section lists open issues and enhancements that require further discussion by the authors, or the WG.  Detailed discussion is tracked in GitHub.</t>
      <t>The issues are ordered/grouped by the sections in the current document.  I.e., to make it easier to review/update sections of the document.</t>
      <section anchor="issues-related-to-general-ietf-process">
        <name>Issues related to general IETF process</name>
        <ol spacing="normal" type="1"><li>
            <t>If this work progresses we will need simple bis versions of the transports document so that they augment into the new data model paths.  Drafts that would need to be updated as documented in  <xref target="DraftRelationships"/>.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/27">Issue 27</eref></t>
          </li>
          <li>
            <t>Do we need to fold in any text from RFC 8640? and RESTCONF? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/26">Issue 26</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issue-related-to-terminologydefinitions">
        <name>Issue related to Terminology/Definitions</name>
        <ol spacing="normal" type="1"><li>
            <t>Should we use the object terminology? Tracked as editorial, in <eref target="https://github.com/rgwilton/draft-yp-observability/issues/15">Issue 15</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-yang-push-v2-overview">
        <name>Issues related to YANG Push v2 Overview</name>
        <t>None currently.</t>
      </section>
      <section anchor="issues-related-to-subscription-paths-and-selection-filters">
        <name>Issues related to Subscription Paths and Selection Filters</name>
        <ol spacing="normal" type="1"><li>
            <t>Align the YPath filter syntax in <xref target="YPaths"/> with <xref target="I-D.jgc-netmod-yang-path"/>, including string quoting, multi-key predicates, relative paths, and regular-expression semantics.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/29">Issue 29</eref></t>
          </li>
          <li>
            <t>Reconcile multiple path expressions in the prose with the single path/xpath leaves in the model. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/21">Issue 21</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-datastore-event-streams-message-format">
        <name>Issues related to Datastore Event Streams &amp; message format</name>
        <ol spacing="normal" type="1"><li>
            <t>Resolve remaining path syntax and batching questions for <em>update</em> notifications. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/32">Issue 32</eref></t>
          </li>
          <li>
            <t>Should every update identify its datastore, or is subscription-level context sufficient? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/46">Issue 46</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-receivers-transports-encodings">
        <name>Issues related to Receivers, Transports, &amp; Encodings</name>
        <section anchor="issues-related-to-transports">
          <name>Issues related to Transports:</name>
          <ol spacing="normal" type="1"><li>
              <t>Resolve transport versus application-layer authorization requirements under <eref target="https://github.com/rgwilton/draft-yp-observability/issues/33">Issue 33</eref>.</t>
            </li>
            <li>
              <t>Confirm the explicit encoding parameter for dynamic subscriptions, given that it must match the RPC encoding. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/45">Issue 45</eref></t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-setting-up-managing-subscriptions">
        <name>Issues related to Setting up &amp; Managing Subscriptions</name>
        <section anchor="issues-related-to-the-configuration-model">
          <name>Issues related to the configuration model:</name>
          <ol spacing="normal" type="1"><li>
              <t>Clarify advertisement of supported datastores. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/30">Issue 30</eref>, related to <eref target="https://github.com/rgwilton/draft-yp-observability/issues/18">Issue 18</eref>.</t>
            </li>
          </ol>
        </section>
        <section anchor="issues-related-to-dynamic-subscriptions">
          <name>Issues related to dynamic subscriptions:</name>
          <ol spacing="normal" type="1"><li>
              <t>Do we want to change how RPC errors are reported?  E.g., change the RPC ok response to indicate whether the subscription was successfully created or not, or included extra error information.  Note NETCONF and RESTCONF already define how errors are encoded in XML and JSON (for RESTCONF only), is it possible to unify this so we don't need large extra separate documents.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-subscription-lifecycle">
        <name>Issues related to Subscription Lifecycle</name>
        <ol spacing="normal" type="1"><li>
            <t>Should subscription-started notification include a fingerprint of the schema that is covered by the subscription that would guaranteed to change if the subscription changes? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/11">Issue 11</eref></t>
          </li>
          <li>
            <t>Is a publisher allowed to arbitrarily send a sync-on-start resync, e.g., if it detects data loss, or should it always just terminate and reinitialize the subscription? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/22">Issue 22</eref></t>
          </li>
          <li>
            <t>Confirm receiver-reset and counter behavior in <xref target="reset"/>; both reset actions already exist. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/24">Issue 24</eref></t>
          </li>
          <li>
            <t>Should kill-subscription also apply to configured subscriptions? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/38">Issue 38</eref></t>
          </li>
          <li>
            <t>Reconcile modification/restart rules, including unnecessary termination notifications. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/23">Issue 23</eref> and <eref target="https://github.com/rgwilton/draft-yp-observability/issues/34">Issue 34</eref></t>
          </li>
          <li>
            <t>Complete collection-completion semantics and failure handling. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/10">Issue 10</eref>, <eref target="https://github.com/rgwilton/draft-yp-observability/issues/12">Issue 12</eref>, and <eref target="https://github.com/rgwilton/draft-yp-observability/issues/44">Issue 44</eref></t>
          </li>
          <li>
            <t>Should we support configurable subscription-level keepalives? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/14">Issue 14</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-performance-reliability-subscription-monitoring">
        <name>Issues related to Performance, Reliability &amp; Subscription Monitoring</name>
        <section anchor="issuesquestions-related-to-operational-data">
          <name>Issues/questions related to operational data:</name>
          <ol spacing="normal" type="1"><li>
              <t>Should we define some additional operational data to help operators check that the telemetry infrastructure is performing correctly, to get an approximation of the load, etc.
              </t>
              <ul spacing="normal">
                <li>
                  <t>Rob: probably, but lower priority.</t>
                </li>
                <li>
                  <t>Tracked by <eref target="https://github.com/rgwilton/draft-yp-observability/issues/31">Issue 31</eref></t>
                </li>
              </ul>
            </li>
            <li>
              <t>Should dynamic subscriptions use the same receivers structure as for configured subscriptions, or should they be inline in the configured subscription?  Also tracked by <eref target="https://github.com/rgwilton/draft-yp-observability/issues/31">Issue 31</eref></t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-conformance-and-capabilities">
        <name>Issues related to Conformance and Capabilities</name>
        <ol spacing="normal" type="1"><li>
            <t>Do we advertise that conformance via capabilities and/or YANG features (both for configured and dynamic subscriptions)?</t>
          </li>
          <li>
            <t>For on-change, should a subscription be rejected (or not brought up) if there are no on-change notifiable nodes?</t>
          </li>
          <li>
            <t>Further work and discussion is required for advertising capabilities for filter paths.  E.g., listing all of the paths that support on-change could be a very long list.  Related, does the draft need to advertise at what points a publisher would decompose a higher subscription into more specific subscriptions.</t>
          </li>
        </ol>
        <t>All tracked via <eref target="https://github.com/rgwilton/draft-yp-observability/issues/18">Issue 18</eref></t>
      </section>
      <section anchor="issues-related-to-the-yang-modules">
        <name>Issues related to the YANG Modules</name>
        <t>None open.</t>
      </section>
      <section anchor="issues-related-to-the-security-considerations-nacm-filtering">
        <name>Issues related to the Security Considerations (&amp; NACM filtering)</name>
        <ol spacing="normal" type="1"><li>
            <t>Need to consider how NACM applies to YANG Push v2, which may differ for dynamic vs configured subscription, but generally we want the permissions to be checked when the subscription is created rather than each time a path is accessed.</t>
          </li>
          <li>
            <t>Where should this be in the document (current it in the security considerations section)</t>
          </li>
          <li>
            <t>Do we want to retain the the current text in <xref target="events"/> introduction related to terminating a subscription if permissions change?</t>
          </li>
          <li>
            <t>Also note, text was removed from the transport section related to RPC authorization, and which should be moved to an application (rather than transport) layer security mechanism.</t>
          </li>
        </ol>
        <t>All tracked via <eref target="https://github.com/rgwilton/draft-yp-observability/issues/33">Issue 33</eref></t>
      </section>
      <section anchor="issues-related-to-the-iana">
        <name>Issues related to the IANA</name>
        <t>None open.</t>
      </section>
      <section anchor="issues-related-to-the-appendixes">
        <name>Issues related to the Appendixes</name>
        <section anchor="examples-related-issuesquestions">
          <name>Examples related issues/questions:</name>
          <ol spacing="normal" type="1"><li>
              <t>Update and validate examples against the current models. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/15">Issue 15</eref></t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="summary-of-closedresolved-issues">
        <name>Summary of closed/resolved issues</name>
        <t>This appendix is only intended while the authors/WG are working on the document, and should be deleted prior to WG LC.</t>
        <ol spacing="normal" type="1"><li>
            <t>Rename subscription-terminated to subscription-stopped (Change rejected 21 Feb 25, unnecessary renaming.)</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> use envelope, hostname and sequence-number (and event-time) (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Don't mandate configured or dynamic subscriptions, allow implementations to implement one or both of them. (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Dynamic subscriptions require the encoding to be specified. (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>DSCP settings are only specified under the receiver (for configured subscriptions) (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Config and dynamic subscriptions should be aligned as much as possible.</t>
          </li>
          <li>
            <t>Subscription changes use subscription-modified or require termination/recreation as specified in <xref target="ModifyingSubscriptions"/>.</t>
          </li>
          <li>
            <t>Dynamic subscriptions support the modify-subscription RPC.</t>
          </li>
          <li>
            <t>Lifecycle messages are sent per subscription rather than per receiver, and we only support a single receiver per subscription.</t>
          </li>
          <li>
            <t>Encoding is set on the receiver for configured subscriptions and in the establishing RPC for dynamic subscriptions.</t>
          </li>
          <li>
            <t>We have a complete flag/update-complete notification to allow deleted data to be implicitly detected.  Something similar may be added to gNMI.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/12">issue 12</eref></t>
          </li>
          <li>
            <t>We use a string identifier to uniquely identify a subscription rather than a numeric id.  Reserve 'dyn-' for server allocated dynamic subscription ids.  Agreed config/dynamic conflict policy.  Restricted names for fitler-id and receiver name.  Don't use a union type (could be added in future). (Dec 8th)</t>
          </li>
          <li>
            <t>Draft renamed from Yang Push Lite to Yang Push 2. (Dec 8th)</t>
          </li>
          <li>
            <t>Dynamic subscriptions cannot reference configured filters. Lifecycle notifications include the inline filter and may also identify its configured reference. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/20">Issue 20</eref></t>
          </li>
          <li>
            <t>Publisher <bcp14>MUST NOT</bcp14> send more notifications after a subscription terminated message <eref target="https://github.com/rgwilton/draft-yp-observability/issues/13">Issue 13</eref>.</t>
          </li>
          <li>
            <t>on-change notifications <bcp14>SHOULD</bcp14> send a minimal update but <bcp14>MAY</bcp14> send additional unchanged fields.</t>
          </li>
        </ol>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9+3ob15Un+j+foiL/IQoHIEVZtmN2EkeR5ImmrctYSieZ
ODMuAkWyWkAVuqogilHrPMt5lvNkZ9332rt2gZRzme7vtL5uBwSq9n2v+/qt
xWJxMNTDujot7vzx0Yv/Vjwph7If2q4q3lTralMN3XVxSL+82vWXxbuq6+u2
KR7cu3NQnp111Tt5ccE/P7hzsCyH6qLtrk+LflgdHKzaZVNuoP1VV54Pi7oa
zhdNNSzb5nxxXTYXiy28uHiwuH9y0O/ONnWP7Q/XW3jj2dM33x40u81Z1Z0e
rKDZ0wN4ra+aftefFkO3qw6g+88Pyq4qYRgvt1VXDvB2X5TNqnheNuUFzKAZ
7hxctd3bi67dbeGxF9WAfxaPYQT1xY5fuXPwtrqGr1enB0WxKGzC9NfLs77q
3pVn9boerukbbcPWiJ/TAZRrWseDd1Wzq7DFG/ouCp7wnd/Dj3VzUfw3fB6/
35T1Gr6XBfs1rt5R213gT2W3vISfLodh258eH+OT+FX9rjrSx47xi+Ozrr3q
q2Np4xjfvaiHy90ZvN1dXNXroW2OeXeut4vWTxafXcPC94PrSd854laO6nbi
7eP9W350OWzWdw4Oyt1w2cIOFwvorSjOd+s1n5jvW9j5ofg99Ua/wZzKpv4L
Ldtp8bjul23x+rofqk1Pv1e8Xh0P8NdLfOBo2W7ox67FY16tajje485+264v
qq7452q9rrpMZ0+q3dAvL/levJUmpT9+94jf/fXADxytqnEvv6math6Kx+uy
7qtML0/hgl0Pl3gGXr567fs4ozd/XdkDi3bbH8Gyjjt5egYPF4+6uuozXfz2
1VPfbvW+/PXltuJVSlv67/Dfvni822ygw0xbL9q3delb+1d84WjJL/y6wZ/z
Lb+5bDdlDwe9PM+0+/oK6MAyXmR+4wjf+HUvv1PbB03bbeDFd3TVvv/28YOH
Xz2Uj18+eHiiH7/+Wj9+9fUX98NH/fbnnz+8Hz66bx/oxy8efBE+fq0fv7J2
vz75+kv9+OALHcPXX3ytr3398Of28esTeu03j1+dPDylYZ+cfE0Nnnz18OCg
bs79tJ4tnhxFF6lph/p8UTXvqnW71ZnDsHUsn3/585/Lx4cPvtApfPHgq690
Pe4/sEW4/1Bn89UXYREefPF1WITP9ePDhzrHn98Pz97/ylbpy8/ttS/DA1/a
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
hMAi8rKgBSqbE4oit9jmKWiMHCwmvo0Me6P6jtu1WTj3TlhomuZq7vEpSGDQ
RC0N8xcmjCPnGpgqUnMGNMoUg/Eu7iSuINhL6yHgtGUsUXCLAlRQvtcxKzia
OmasBln6cQZcROgfEUhvuxqxcl3tKaAMozrqkJrIBpYt8T4tB1BRUhqY82/1
CdHbi8UBqxCVDX30RwfXNrGHKFQjo6ux0BArxqJ6W/2SCFo5MdtTp8/2nRC3
5mmg2pBUSSCTKNb6Y/DOc9LMF1HBprHSeS7oHOxi0CqMOq5YwobTQLAgY+SP
ifHnlfnMCTSnOCVlUFyIxo92kmjO7nLCl6QgynVVobWdbmG1gVOCaNmsSH4j
tQ049oGetnrBR8UjoPcSO1TBl2QhRR0sFHSRWISEsyJAGQZgGp6jRN6iETrE
Kz31y11mmToWXE2Zp6TU7KNbNJs+ZukkbVJiPh8ENUjlykX83d39txIriKep
559eQZthCdrqtYeRkxiuXo/9eh1XsM6R4uSYHUb1e+7RkdaIswC+1ifFc10d
k4jGaoSxliW1aAE6zQR3QC/Y93LVoZuWvHz797ahWLveapAqeFNa/LTI8z6q
plkiMlM/KmPKVNLWduGemUkhQDFwztVIybLflw8enoAOsMNyN394/h1W75kQ
6jzp98ZOWkqs4WnF23iJpsskUSVSLU2Y70wriZWj1RGPjRbWZq6kq2BDsPL1
abArriwdBqx1WGypvrWdi5yTJy3uO+3W0kdQNXG1jzjMe/poiJYR0NjS4Wn7
WkElh+JBUVuI+Snl0yZ7M4iPmnDNiBrKCJrdBqjn0pUMzd85U30iyGqUp5DD
AHXaMFZcJnyMcguyXEQpnPlhquWafRjnUXhaau2qg6Ws0VhtLRsktTU0pnFT
VQaQE5has//SyrhuCme8iSL+nw2Xfl/kx1d8kL0IWUD4OMyy2e6SFDb8dpRk
NRFWbW+Ms+ZySVnw4ChpLjSR5s3ls+Xs+XzCXDGdM+fn7ZLRMslyxd58Od9O
H1LmbpcoV+zPlSu0YZcud9skOXhrMi0tTDyfmZb8bvs+nZxmb3xKfpq9dHOK
2r+7xbgpS82aNf5g//Sb8Yntl9v4lMM1HU7x6zhpoN0N7o4UccrBVPCwxAtP
3EYlFneKIDt6SQwDSiiaGMsNJEqMiAdIMCaav0P0DKnVJigY/djqw1L6bFYc
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

-->

</rfc>
