<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-rtv-netmod-yang-subtree-replacement-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="YANG Subtree Replacements">Enhancements to the YANG Language for Capturing Subtree Replacements</title>

    <author fullname="Rajesh Tarakkad Venkateswaran">
      <organization>Cisco Systems</organization>
      <address>
        <email>rtv@cisco.com</email>
      </address>
    </author>
    <author fullname="Sai Venkata Giri Karnati">
      <organization>Cisco Systems</organization>
      <address>
        <email>saikarna@cisco.com</email>
      </address>
    </author>
    <author fullname="Sarthak Jain">
      <organization>Cisco Systems</organization>
      <address>
        <email>sarthakj@cisco.com</email>
      </address>
    </author>
    <author fullname="Veena Ramamoorthy">
      <organization>Cisco Systems</organization>
      <address>
        <email>vemoorth@cisco.com</email>
      </address>
    </author>
    <author fullname="Venkata Harish Nagamangalam">
      <organization>Cisco Systems</organization>
      <address>
        <email>vnagaman@cisco.com</email>
      </address>
    </author>

    <date year="2026" month="January" day="25"/>

    <area>OPS</area>
    <workgroup>NETMOD Working Group</workgroup>
    <keyword>yang</keyword> <keyword>netconf</keyword> <keyword>yang-models</keyword> <keyword>deprecation</keyword> <keyword>model-evolution</keyword>

    <abstract>


<?line 79?>

<t>As YANG data models evolve over time, model nodes are often deprecated or made obsolete. Current practices for documenting replacement paths for these nodes rely on unstructured external documents, making it difficult to programmatically identify and migrate to replacement nodes. This document proposes a YANG extension mechanism that embeds replacement path information directly within YANG models, enabling automation tools to identify replacement nodes and assist users in migrating from deprecated elements to their replacements.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://datatracker.ietf.org/doc/draft-rtv-netmod-yang-subtree-replacement/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rtv-netmod-yang-subtree-replacement/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        NETMOD Working Group mailing list (<eref target="mailto:netmod@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netmod/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/netmod/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rajesh-rtv/yang-replacement"/>.</t>
    </note>


  </front>

  <middle>


<?line 84?>

<section anchor="introduction"><name>Introduction</name>

<t>YANG <xref target="RFC7950"/> is a data modeling language used to define the configuration and operational data of network devices. As network technologies evolve, some nodes within YANG modules become deprecated. Operators then need a reliable way to discover which schema nodes supersede the deprecated ones so they can migrate configuration and operational tooling.</t>

<t>The YANG language provides the <spanx style="verb">status</spanx> statement to mark nodes as <spanx style="verb">deprecated</spanx> or <spanx style="verb">obsolete</spanx>, but it offers no standardized mechanism to point to the successor node(s). Current practice relies on unstructured documents, spreadsheets, or ad-hoc emails. The goal of this document is to embed that knowledge directly in the YANG modules so that both humans and automation can infer replacements programmatically.</t>

<t>The term "replacement" in this document refers to guidance that accompanies deprecated or obsolete nodes. The intent is not to redefine YANG status values, but to provide structured metadata that helps operators and tooling identify where to migrate.</t>

</section>
<section anchor="problem-statement"><name>Problem Statement</name>

<t>The reviewed material highlighted that today the only way to communicate replacement paths for deprecated nodes is through separate, unstructured documents like CSV files or emails. This approach suffers from several significant drawbacks:</t>

<t><list style="symbols">
  <t><strong>Inefficiency</strong>: Network operators must manually search through external documentation to find replacement paths, often requiring correlation between multiple documents.</t>
  <t><strong>Error-prone</strong>: External documentation can become outdated or may not accurately reflect the current node structure and paths defined in the YANG files, leading to incorrect migrations.</t>
  <t><strong>Lack of automation</strong>: Without a standardized, machine-readable way to express replacement information, tools cannot programmatically identify replacement nodes or assist users in migration.</t>
  <t><strong>Documentation fragmentation</strong>: Replacement information becomes scattered across multiple documents, making it difficult to maintain a complete view of model evolution.</t>
</list></t>

<t>These challenges are particularly acute for large-scale network operators who must manage configuration across numerous devices with diverse YANG models, and for vendors who need to support customers through model transitions.</t>

<t>It's worth noting that this functionality has been proposed as a potential enhancement to a future version of the YANG language itself (<xref target="YANG-NEXT"/>). However, developing and standardizing a new version of YANG would likely take a long while. The solution proposed in this document is designed to be standardized quickly and used with existing YANG modules and infrastructure.</t>

<t>During IETF 123, the NETMOD chairs polled the working group on whether the problem statement in this document should be pursued. The response showed strong interest in solving the problem, while also signalling that additional clarification and tooling guidance are required before adoption. This revision keeps the problem statement separate from the proposed solution so the working group can iterate on each aspect independently.</t>

</section>
<section anchor="solution"><name>Solution</name>

<t>The reviewed copy initially described a new keyword named <spanx style="verb">replacement</spanx>. During working group discussion we agreed that the same behaviour can be achieved with an extension, avoiding changes to the base language. We therefore define a reusable extension that can be attached to any node marked <spanx style="verb">status deprecated</spanx> or <spanx style="verb">status obsolete</spanx>. This keeps the proposal backward compatible and aligns with the guidance in <xref target="RFC8407"/> for extending YANG functionality without modifying the core language.</t>

<section anchor="proposed-extension-mechanism"><name>Proposed Extension Mechanism</name>

<t>Specifically, we introduce the <spanx style="verb">ietf-ext:deprecation-info</spanx> extension. Authors use this extension while a node has <spanx style="verb">status deprecated</spanx> to document replacement paths. The extension can appear multiple times on the same node so that each occurrence represents a migration tuple. This satisfies the request from the NETMOD working group to represent successor paths as structured tuples instead of opaque strings and enables the expression of one-to-many or many-to-one relationships. When a node transitions to <spanx style="verb">status obsolete</spanx>, the extension should be removed as the focus shifts from migration to removal.</t>

<t>Each extension statement carries a tuple encoded as key/value pairs that follow the ABNF in <xref target="abnf-lifecycle-entry"/>. The tuple minimally identifies the <em>path-type</em> (absolute or relative) and the <em>path-target</em> of the replacement node. Optional qualifiers allow the publisher to flag migration hints (for example priority or free-form notes) without inventing separate extensions.</t>

<figure anchor="abnf-lifecycle-entry"><name>Lifecycle Tuple ABNF</name>
  <artwork><![CDATA[
lifecycle-entry = path-type ":" path-target *( ";" kv-pair )
path-type         = "absolute" / "relative" / "none"
path-target       = 1*(%x21-7E)
kv-pair           = key "=" value
key               = ALPHA *( ALPHA / DIGIT / "-" )
value             = 1*(%x20-7E)
  ]]></artwork>
</figure>

<t>When <spanx style="verb">path-type</spanx> is <spanx style="verb">absolute</spanx>, <spanx style="verb">path-target</spanx> is an absolute-schema-nodeid that resolves from the module root. When <spanx style="verb">path-type</spanx> is <spanx style="verb">relative</spanx>, the tuple is interpreted relative to the schema node that instantiates the grouping containing the deprecated node. When <spanx style="verb">path-type</spanx> is <spanx style="verb">none</spanx>, the publisher <bcp14>MUST</bcp14> set <spanx style="verb">path-target</spanx> to the literal <spanx style="verb">none</spanx> to indicate that no direct replacement exists.</t>

<t>The optional key/value qualifiers are intentionally open-ended so tooling can evolve. Two keys are RECOMMENDED:</t>

<t><list style="symbols">
  <t><strong>state=deprecated</strong>: Explicitly identifies that the tuple accompanies a deprecated node. If omitted, consumers <bcp14>SHOULD</bcp14> assume the tuple inherits the YANG <spanx style="verb">status</spanx> of the enclosing node.</t>
  <t><strong>note=.../priority=.../status=preferred</strong>: Convey migration hints such as preferred replacements, operational notes, or removal timelines.</t>
</list></t>

<t>The benefits of this approach include:</t>

<t><list style="symbols">
  <t><strong>Backward compatibility</strong>: The extension approach doesn't require changes to the YANG language itself and is compatible with existing tools.</t>
  <t><strong>Self-documenting models</strong>: Replacement information is embedded directly in the models, eliminating the need for external documentation.</t>
  <t><strong>Automation enablement</strong>: Tools can programmatically identify replacement paths and assist with migration.</t>
  <t><strong>Improved developer experience</strong>: YANG model developers and users gain clear guidance for transitions between deprecated and replacement nodes.</t>
  <t><strong>Support for complex replacements</strong>: The tuple format and ability to repeat <spanx style="verb">ietf-ext:deprecation-info</spanx> statements allow one-to-many and many-to-one replacements, including cases that cross module boundaries.</t>

</list></t>

</section>
<section anchor="allowed-placements"><name>Allowed Placements</name>

<t>The <spanx style="verb">ietf-ext:deprecation-info</spanx> extension <bcp14>MAY</bcp14> be applied to the following YANG statements: <spanx style="verb">container</spanx>, <spanx style="verb">list</spanx>, <spanx style="verb">leaf</spanx>, <spanx style="verb">leaf-list</spanx>, <spanx style="verb">choice</spanx>, <spanx style="verb">case</spanx>, <spanx style="verb">anydata</spanx>, and <spanx style="verb">anyxml</spanx>. This extension <bcp14>MUST NOT</bcp14> appear on RPC, action, or notification statements.</t>

<t>Whenever the extension is used, the enclosing schema node <bcp14>MUST</bcp14> also carry <spanx style="verb">status deprecated;</spanx>. Tooling <bcp14>MUST</bcp14> treat the absence of a <spanx style="verb">status deprecated</spanx> statement as an error.</t>

<t>Publishers <bcp14>MAY</bcp14> repeat the extension multiple times on the same schema node. Each occurrence conveys a distinct tuple and tooling <bcp14>SHOULD</bcp14> process them in the order they appear if prioritisation is required.</t>

<t>When a node transitions from deprecated to obsolete, the <spanx style="verb">deprecation-info</spanx> extension <bcp14>SHOULD</bcp14> be removed from the YANG module. Replacement information is most valuable during the deprecation phase when users are expected to migrate. Once a node becomes obsolete, the focus should be on removal rather than migration.</t>

<t>Working group feedback noted that the earlier naming focused heavily on the replacement node. Using lifecycle-oriented extension names and normatively tying them to the existing <spanx style="verb">status</spanx> statements makes the tuples an explicit companion to the lifecycle metadata instead of a standalone hint.</t>

</section>
<section anchor="design-time-evaluation"><name>Design-Time Evaluation Rationale</name>

<t>During the IETF 123 NETMOD discussion, implementers emphasized that the ability to reason about replacements at design time is critical. Embedding the tuples directly in the YANG source enables:</t>

<t><list style="symbols">
  <t><strong>Model reviews</strong>: Working group and vendor reviewers can confirm that every deprecated node is paired with an up-to-date replacement before publishing modules.</t>
  <t><strong>Toolchain validation</strong>: Compilers and CI pipelines can flag missing or malformed tuples while the module is being authored instead of deferring to deployment time.</t>
  <t><strong>Automation planning</strong>: Operators and orchestrators can evaluate the impact of upcoming deprecations without requiring device connectivity.</t>
</list></t>

<t>This design-time emphasis was highlighted during working group discussions, and aligns with the guidance in <xref target="RFC8407"/> on providing migration help inside the model itself.</t>

</section>
<section anchor="extension-vs-instance-data"><name>Extension Versus Instance Data</name>

<t>Some participants asked why the information cannot be carried as instance data. Instance documents are unsuitable for two reasons:</t>

<t><list style="symbols">
  <t><strong>Portability</strong>: Instance data is tied to a particular deployment, whereas the tuples must travel with the module revisions that introduce the deprecation.</t>
  <t><strong>Tool coverage</strong>: Many downstream tools (IDEs, code generators, documentation sites) consume YANG modules only. Requiring the retrieval of separate instance documents would exclude those workflows.</t>
</list></t>

<t>Embedding the tuples as a standard extension therefore provides a single source of truth that can be validated and reasoned about during module design.</t>

</section>
<section anchor="related-work"><name>Related Work and Alternatives</name>

<t>The NETMOD working group also noted other approaches under discussion, including model-specific conventions, instance-data catalogues, and proposals for future YANG language revisions (often referred to collectively as "YANG Next"). This document positions the extension as an immediately deployable option that complements those efforts. Publishers can still provide supplemental instance data where useful, but the extension ensures there is a normative pointer available inside the module itself.</t>

</section>
</section>
<section anchor="yang-module"><name>YANG Module</name>

<t>This section defines the normative YANG module that implements the lifecycle extensions described in this document.</t>

<section anchor="ietf-lifecycle-extyang-module"><name><spanx style="verb">ietf-lifecycle-ext.yang</spanx> module</name>

<t>The <spanx style="verb">ietf-lifecycle-ext</spanx> module defines the <spanx style="verb">deprecation-info</spanx> extension that enables authors to embed replacement information directly within YANG modules for deprecated nodes.</t>

<sourcecode type="yang" name="ietf-lifecycle-ext@2026-01-25.yang" markers="true"><![CDATA[
module ietf-lifecycle-ext {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-lifecycle-ext";
  prefix ietf-ext;

  organization "IETF NETMOD Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>

     Editor:   Rajesh Tarakkad Venkateswaran
               <mailto:rtv@cisco.com>";

  description
    "This module defines a lifecycle extension for recording
     migration metadata for deprecated YANG nodes.

     Copyright (c) 2026 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.

     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.";

  revision 2026-01-25 {
    description
      "Third revision. 
       - Removed obsoletion-info extension per IETF 123 working
         group feedback. Replacement information is intended for
         deprecated nodes only and should be removed when nodes
         become obsolete.
       - Enhanced deprecation-info extension description with
         explicit MUST constraints, substatement restrictions,
         and cardinality rules per RFC 8407 best practices.
       - Removed Section 3.5 Handling Obsolete Nodes.
       - Updated all references to focus solely on deprecated
         nodes.";
    reference "draft-rtv-netmod-yang-subtree-replacement-03";
  }

  revision 2026-01-15 {
    description
      "Second revision. Added CODE BEGINS markers for YANG
       validation. Restructured sections to separate normative
       module from examples.";
    reference "draft-rtv-netmod-yang-subtree-replacement-02";
  }

  revision 2025-12-28 {
    description "Initial revision.";
    reference "draft-rtv-netmod-yang-subtree-replacement-01";
  }

  extension deprecation-info {
    argument "tuple";
    description
      "Attaches a lifecycle-entry tuple to a deprecated schema
       node.
       
       This extension MUST be used only with nodes that have 
       'status deprecated'. The parent node containing this
       extension MUST include a 'status deprecated' statement.
       
       This statement MAY be used as a substatement of container,
       list, leaf, leaf-list, choice, case, anydata, and anyxml
       statements. It MUST NOT be used as a substatement of rpc,
       action, or notification statements.
       
       Zero or more 'deprecation-info' statements per parent
       statement are allowed. Multiple instances represent
       different migration paths for the same deprecated node.
       
       The tuple format and semantics are defined in the body
       of the document that defines this extension.";
  }
}
]]></sourcecode>

</section>

</section>
<section anchor="implementation-of-lifecycle-tuples-across-scenarios"><name>Implementation of the Lifecycle Tuples Across Various Scenarios</name>

<t>The following sections demonstrate how the lifecycle extensions can be applied across different replacement scenarios. The examples illustrate common patterns encountered when evolving YANG models and show how the tuples provide clear migration paths for each situation.</t>

<section anchor="path-reference-types"><name>Path Reference Types</name>

<t>To accommodate different structural relationships between deprecated nodes and their replacements, the reviewed copy distinguished between absolute and relative XPath expressions. The tuple grammar in this document encodes the same information in the <spanx style="verb">path-type</spanx> field:</t>

<t><list style="symbols">
  <t><strong>absolute</strong>: Used when the replacement node can be directly referenced with an absolute schema path from the YANG module root. This is the most common case for nodes inside standard containers and lists.</t>
  <t><strong>relative</strong>: Used when the replacement node appears in multiple places, such as within groupings or augments. The path is resolved relative to the instantiation of the grouping that contains the deprecated node.</t>
  <t><strong>none</strong>: Used to signal that no direct replacement exists. Tooling can still present the tuple together with human-readable notes supplied through key/value qualifiers.</t>
</list></t>

<t>Each path reference type has specific syntax requirements and use cases, which are illustrated in the scenarios that follow. When a node is deprecated without a direct successor, the tuple uses <spanx style="verb">path-type = none</spanx> with <spanx style="verb">path-target = none</spanx>, matching the reviewed copy&#8217;s <spanx style="verb">None</spanx> token.</t>

</section>
<section anchor="case-1-simple-node-with-replacement"><name>Case 1: Simple Node with Replacement</name>

<t>Description: a node is deprecated and has a replacement node in the same container.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "absolute:/{File_name}:{abs_path}";
]]></sourcecode>

</section>
<section anchor="case-2-node-deprecated-with-no-replacement"><name>Case 2: Node Deprecated with No Replacement</name>

<t>Description: a node is deprecated and there is no direct replacement node.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "none:none;note=manual-migration";
]]></sourcecode>

</section>
<section anchor="case-3-grouping-cases"><name>Case 3: Grouping Cases</name>

<t>Identifying XPath nodes within YANG models, particularly when dealing with groupings, presents a challenge. Nodes that are imported through grouping may not be easily pinpointed using absolute XPath. The solution is to uniquely identify the grouping using the file name and grouping name, then provide a relative XPath from the top level of the grouping. In all other cases, an absolute XPath can be provided.</t>

<t>Utilize the file name and grouping name to uniquely identify the grouping within the YANG model. Provide a relative XPath from the top level of the grouping to pinpoint the node.</t>

<t>This approach ensures that nodes within groupings can be accurately identified and referenced, while maintaining clarity and precision for nodes outside of groupings.</t>

<section anchor="sub-case-1-node-deprecated-outside-grouping-replacement-inside-grouping"><name>Sub-Case 1: Node Deprecated Outside Grouping, Replacement Inside Grouping</name>

<t>Description: a node that is deprecated outside a grouping structure but has a replacement node within a specific grouping.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "relative:/{File_name}:{grouping_name}/{rel_path_inside_grouping}";
]]></sourcecode>

</section>
<section anchor="sub-case-2-node-deprecated-inside-grouping-replacement-outside-in-a-non-group"><name>Sub-Case 2: Node Deprecated Inside Grouping, Replacement Outside in a non-group</name>

<t>Description: a node that is deprecated within a grouping structure but has a replacement node outside any grouping.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "absolute:/{File_name}:{abs_path}";
]]></sourcecode>

</section>
<section anchor="sub-case-3-node-deprecated-inside-grouping-replacement-inside-existingnew-grouping"><name>Sub-Case 3: Node Deprecated Inside Grouping, Replacement Inside Existing/New Grouping</name>

<t>Description: a node that is deprecated within a grouping structure and has a replacement node within the same or a new grouping structure.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "relative:/{File_name}:{grouping_name}/{rel_path_inside_grouping}";
]]></sourcecode>

</section>
<section anchor="sub-case-4-node-deprecated-outside-grouping-replacement-outside-grouping"><name>Sub-Case 4: Node Deprecated Outside Grouping, Replacement Outside Grouping</name>

<t>Description: a node that is deprecated outside a grouping structure and has a replacement node also outside any grouping.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
ietf-ext:deprecation-info "absolute:/{File_name}:{abs_path}";
]]></sourcecode>

</section>
</section>
<section anchor="summary-of-syntax-notations"><name>Summary of Syntax Notations</name>

<t>The following syntax notations are used for replacement paths:</t>

<t><list style="symbols">
  <t><spanx style="verb">relative:/{File_name}:{grouping_name}/{rel_path_inside_grouping}</spanx>: Indicates the relative path of the replacement node within a specified grouping in a file.</t>
  <t><spanx style="verb">absolute:/{File_name}:{path}</spanx>: Indicates the absolute path of the replacement node in a file.</t>
  <t><spanx style="verb">none:none</spanx>: Indicates that there is no replacement for the deprecated node; publishers can append notes (for example <spanx style="verb">none:none;note=legacy</spanx>).</t>
</list></t>

</section>
<section anchor="replacement-guidelines-for-non-leaf-level-deprecation"><name>Replacement Guidelines for Non-Leaf level Deprecation</name>

<t>When deprecating structures like container or list at their respective levels, it is essential to ensure that the replacement is explicitly mentioned at all sub-levels, including child elements such as leaf, leaf-list, or nested structures. This approach ensures clarity and provides a complete mapping of deprecated elements to their replacements, making it easier for users to transition to the new structure.</t>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
container old-container {
  status deprecated;
  ietf-ext:deprecation-info "absolute:/{File_name}:{replacement_container_path}";

  leaf old-leaf {
    status deprecated;
    ietf-ext:deprecation-info "absolute:/{File_name}:{replacement_leaf_path}";
  }
}
]]></sourcecode>

</section>
</section>
<section anchor="example-implementation"><name>Example Implementation</name>

<t>The following examples demonstrate how the lifecycle extensions can be used in practice. These are vendor-neutral examples created specifically for this document to illustrate the functionality and are not intended to be actual YANG modules used in production environments.</t>
<section anchor="ietf-deprecation-regression-test-17131yang-module"><name><spanx style="verb">ietf-deprecation-regression-test-17131.yang</spanx> module</name>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
module ietf-deprecation-regression-test-17131 {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-deprecation-regression-test";
  prefix depr-reg-test;

import ietf-depr-reg-test-helper-17131 {
    prefix depr-reg-test-helper;
  }

import ietf-lifecycle-ext {
    prefix ietf-ext;
  }

container deprecation-regression-test {
    container configurations {
      container config {


    // Case 1: Replacement in same container.
    leaf case1 {
      type uint8;
      status deprecated;
      description
        "Case 1 - Replacement in same container, "
        "leaf case1 (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case1-replacement;status=preferred";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case1-legacy;note=legacy-support";
    }
    leaf case1-replacement {
      type uint16;
      description
        "Case 1 - Replacement in same container, "
        "leaf case1-replacement (NEW)";
    }

    // Case 2: Replacement in different container.
    leaf case2 {
      type uint8;
      status deprecated;
      description
        "Case 2 - Leaf deprecated with a replacement in a different "
        "container, leaf i (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/"
        "replacementContainerCase2/case2-replacement";
    }

    // Case 3: Replacement located in another module.
    leaf case3 {
      type uint8;
      status deprecated;
      description
        "Case 3 - Replacement located in another module, "
        "leaf case3 (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-file-2-17131:"
        "deprecation-regression-test-2/configurations/config/"
        "case3-replacement;note=external-module";
    }

    // Case 4: List leaf replaced elsewhere.
    list listCase4 {
      key "key-case4";
      leaf key-case4 {
        type string;
      }
      leaf case4 {
        type uint8;
        status deprecated;
        description
          "Case 4 - List leaf replaced in another list, "
          "leaf case4 (DEPRECATED)";
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/"
          "replacementContainerCase4/case4-replacement";
      }
    }
    list replacementListCase4 {
      key "key-case4-replacement";
      leaf key-case4-replacement {
        type string;
      }
      leaf case4-replacement {
        type uint8;
        description
          "Case 4 - List leaf replacement, "
          "case4-replacement (NEW)";
      }
    }

    // Case 5: Grouping leaf replaced inside grouping.
    grouping groupCase5 {
      leaf case5 {
        type uint8;
        status deprecated;
        description
          "Case 5 - Grouping leaf deprecated and reused via the same "
          "grouping, leaf case5 (DEPRECATED)";
        ietf-ext:deprecation-info
          "relative:/ietf-deprecation-regression-test-17131:"
          "groupCase5/case5-replacement;status=preferred";
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "case5-replacement-alt;note=alternate-path";
      }
      leaf case5-replacement {
        type uint16;
        description
          "Case 5 - Replacement leaf reused via grouping, "
          "case5-replacement (NEW)";
      }
    }
    container containerP1 {
      uses groupCase5;
      description
        "Case 5 - Grouping usage via containerP1 (NEW)";
    }
    container containerP2 {
      uses groupCase5;
      description
        "Case 5 - Grouping usage via containerP2 (NEW)";
    }

    // Case 6: Grouping leaf replaced via imported helper.
    container containerP3 {
      uses depr-reg-test-helper:groupCase6;
      description
        "Case 6 - Grouping reuse via helper module, containerP3 (NEW)";
    }
    container containerP4 {
      uses depr-reg-test-helper:groupCase6;
      description
        "Case 6 - Grouping reuse via helper module, containerP4 (NEW)";
    }

    // Case 7: Replacement leaf shares name.
    leaf case7 {
      type uint8;
      status deprecated;
      description
        "Case 7 - Leaf replaced by another leaf with the same name "
        "elsewhere, leaf case7 (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/"
        "replacementContainerCase7/case7";
    }
    container replacementContainerCase7 {
      presence "true";
      description
        "Case 7 - Replacement container holding leaf case7 (NEW)";
      leaf case7 {
        type uint8;
        description
          "Case 7 - New leaf case7 at alternate location (NEW)";
      }
    }

    // Case 8 : Leaf-list deprecated, replaced by another leaf-list
    leaf-list case8 {
      type uint8;
      status deprecated;
      description
        "Case 8 - Leaf-list case8 replaced by new list (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case8-replacement";
    }
    leaf-list case8-replacement {
      type uint8;
      description
        "Case 8 - Replacement leaf-list case8-replacement (NEW)";
    }

    // Case 9 : Empty leaf deprecated, replaced by another empty leaf
    leaf case9 {
      type empty;
      status deprecated;
      description
        "Case 9 - Empty leaf case9 replaced by new empty leaf "
        "(DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case9-replacement";
    }
    leaf case9-replacement {
      type empty;
      description
        "Case 9 - Replacement empty leaf case9-replacement (NEW)";
    }

    // Case 10 : A container is deprecated with a replacement container.
    container containerCase10 {
      leaf case10 {
        type uint8;
        status deprecated;
        description
          "Case 10 - Leaf case10 in deprecated container (DEPRECATED)";
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "replacementContainerCase10/case10-replacement";
      }
      status deprecated;
      description
        "Case 10 - ContainerCase10 replaced by successor (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "replacementContainerCase10";
    }
    container replacementContainerCase10 {
      leaf case10-replacement {
        type uint8;
        description
          "Case 10 - Replacement leaf case10-replacement (NEW)";
      }
      description
        "Case 10 - Replacement container replacementContainerCase10 "
        "(NEW)";
    }

    // Case 11: Multiple items mapped to one leaf.
    leaf case11a {
      type uint8;
      status deprecated;
      description
        "Case 11 - Items merged into leaf case11a (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case11-replacement";
    }
    leaf case11b {
      type uint8;
      status deprecated;
      description
        "Case 11 - Items merged into leaf case11b (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case11-replacement";
    }
    leaf case11-replacement {
      type uint16;
      description
        "Case 11 - Replacement leaf case11-replacement (NEW)";
    }

    // Case 12: List item replaced by different list type.
    list listCase12 {
      key "key-case12";
      status deprecated;
      leaf key-case12 {
        type string;
        status deprecated;
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "replacementListCase12/key-case12-replacement";
      }
      leaf case12 {
        type uint8;
        status deprecated;
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "replacementListCase12/case12-replacement";
      }
    }
    list replacementListCase12 {
      key "key-case12-replacement";
      leaf key-case12-replacement {
        type string;
      }
      leaf case12-replacement {
        type uint8;
      }
    }

    // Case 13: Choice case provides alternate leaf.
    choice choice13 {
      case caseCase13 {
        leaf case13 {
          type uint8;
          status deprecated;
          description
            "Case 13 - Choice branch leaf case13 (DEPRECATED)";
          ietf-ext:deprecation-info
            "absolute:/ietf-deprecation-regression-test-17131:"
            "deprecation-regression-test/configurations/config/"
            "choice13/case13-replacement";
        }
      }
      case caseCase13Replacement {
        leaf case13-replacement {
          type uint8;
          description
            "Case 13 - Alternate choice leaf case13-replacement (NEW)";
        }
      }
    }

    // Case 14: One leaf replaced by multiple new leaves.
    leaf case14 {
      type uint16;
      status deprecated;
      description
        "Case 14 - Single leaf replaced by many, case14 (DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case14a-replacement";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "case14b-replacement";
    }
      leaf case14a-replacement {
        type uint8;
        description
        "Case 14 - Replacement leaf case14a-replacement (NEW)";
    }
      leaf case14b-replacement {
        type uint8;
        description
        "Case 14 - Replacement leaf case14b-replacement (NEW)";
    }

    // Case 15: Leaf deprecated with no replacement.
    leaf case15 {
      type uint8;
      status deprecated;
      description
        "Case 15 - Feature deprecated; no replacement (DEPRECATED)";
      ietf-ext:deprecation-info
        "none:none;note=manual-migration";
    }

    // Case 16: Container replacement annotated per level.
    container containerCase16 {
      presence "true";
      status deprecated;
      description
        "Case 16 - ContainerCase16 replaced by successor container "
        "(DEPRECATED)";
      ietf-ext:deprecation-info
        "absolute:/ietf-deprecation-regression-test-17131:"
        "deprecation-regression-test/configurations/config/"
        "replacementContainerCase16";

      leaf case16-leaf1 {
        type string;
        status deprecated;
        description
          "Case 16 - Leaf case16-leaf1 deprecated in containerCase16 "
          "(DEPRECATED)";
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "replacementContainerCase16/case16a";
      }

      leaf case16-leaf2 {
        type uint8;
        status deprecated;
        description
          "Case 16 - Leaf case16-leaf2 deprecated in containerCase16 "
          "(DEPRECATED)";
        ietf-ext:deprecation-info
          "absolute:/ietf-deprecation-regression-test-17131:"
          "deprecation-regression-test/configurations/config/"
          "replacementContainerCase16/case16b";
      }
    }

    container replacementContainerCase16 {
      presence "true";
      description
        "Case 16 - Replacement container replacementContainerCase16 "
        "(NEW)";

      leaf case16a {
        type string;
        description
          "Case 16 - Replacement for case16-leaf1 (NEW)";
      }

      leaf case16b {
        type uint8;
        description
          "Case 16 - Replacement for case16-leaf2 (NEW)";
      }
    }
  }
}   } }]]></sourcecode>

</section>
<section anchor="ietf-deprecation-regression-test-helper-module-17131yang-module"><name><spanx style="verb">ietf-deprecation-regression-test-helper-module-17131.yang</spanx> module</name>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
module ietf-depr-reg-test-helper-17131 {
  yang-version 1.1;

namespace "urn:ietf:params:xml:ns:yang:ietf-depr-reg-test-helper";

prefix depr-reg-test-helper;

organization "IETF NETMOD Working Group";

contact "IETF NETMOD Working Group <netmod@ietf.org>";

import ietf-lifecycle-ext {
    prefix ietf-ext;
  }

// Case 6 : Leaf inside a grouping deprecated, replaced in the same grouping but imported through 
  // a different module and used in various modules.
  grouping groupCase6 {
    leaf case6 {
      type uint8;
      default 10;
      status deprecated;
      description
        "Case 6 - Leaf inside a grouping
         deprecated, replaced in the same grouping but imported through
         a different module and used in various modules,
         leaf case-6 (DEPRECATED)";
      ietf-ext:deprecation-info
        "relative:/ietf-depr-reg-test-helper-17131:"
        "groupCase6/case6-replacement;status=preferred";
    }
    leaf case6-replacement {
      type uint8;
      default 11;
      description
        "Case 6 - Leaf inside a grouping
         deprecated, replaced in the same grouping but imported
         through a different module and used in various modules,
         leaf case6-replacement (NEW)";
    }
  }
}
]]></sourcecode>

</section>
<section anchor="ietf-deprecation-regression-test-file-2-17131yang-module"><name><spanx style="verb">ietf-deprecation-regression-test-file-2-17131.yang</spanx> module</name>

<t>YANG Example:</t>

<sourcecode type="yang"><![CDATA[
module ietf-deprecation-regression-test-file-2-17131 {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-deprecation-regression-test-file-2";
  prefix depr-reg-test-2;

import ietf-lifecycle-ext {
    prefix ietf-ext;
  }

container deprecation-regression-test-2 {
    container configurations {
      container config {
        // Case 3: Replacement located in another module.
        leaf case3-replacement {
          type uint8;
          default 15;
        }
      }
    }
  }
}
]]></sourcecode>

</section>

</section>
<section anchor="netmod-123-feedback"><name>IETF 123 NETMOD Feedback</name>

<t>This document incorporates feedback received during the NETMOD working group meeting at IETF 123 (<eref target="https://notes.ietf.org/notes-ietf-123-netmod?both"/>). Key discussion points included:</t>

<t><list style="symbols">
  <t>Modeling replacement metadata as a structured tuple rather than an opaque string</t>
  <t>Using lifecycle-oriented naming conventions aligned with YANG status statements</t>
  <t>Clarifying that replacement information is only needed during deprecation, not after obsolescence</t>
  <t>Maintaining separation between problem statement and solution details</t>
  <t>Acknowledging that alternative approaches may exist and how they complement this proposal</t>
  <t>Defining which YANG statements permit the extension</t>
  <t>Explaining the rationale for using an extension rather than instance data</t>
  <t>Emphasizing the importance of design-time evaluation</t>
</list></t>

<t>The chair poll ("Should the problem on slide 2 be addressed by the WG?") indicated broad interest, with several participants asking for more detail and none objecting. This revision documents the working group consensus and adds guidance for follow-on tooling work.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</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?>

</section>
<section anchor="operational-considerations"><name>Operational Considerations</name>

<t>Network operators and YANG model consumers can leverage the information provided by the <spanx style="verb">ietf-ext:deprecation-info</spanx> extension in several ways:</t>

<t><list style="symbols">
  <t><strong>Automated Migration Tools</strong>: Software tools can be developed to scan configurations using deprecated nodes and automatically suggest or implement replacements.</t>
  <t><strong>Documentation Generation</strong>: Model documentation tools can highlight deprecated nodes and their replacements, making it easier for network operators to understand migration paths.</t>
  <t><strong>Configuration Validation</strong>: Validation tools can warn about the use of deprecated nodes and suggest alternatives based on the extension data.</t>
  <t><strong>Training and Knowledge Transfer</strong>: The explicit documentation of replacements can help in training and knowledge transfer as teams adopt newer model versions.</t>
</list></t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>The extension defined in this document does not introduce new protocol behaviour or data plane interactions. The tuples are metadata that accompany YANG modules and are evaluated at design time. Consequently, the security considerations of <xref target="RFC7950"/> apply.</t>

<t>Incorrect or stale tuples could mislead automation systems or operators during migrations. Publishers <bcp14>SHOULD</bcp14> validate tuples during module reviews and CI testing, and consumers <bcp14>SHOULD</bcp14> treat the tuples as advisory rather than authoritative until verified in their environments.</t>

<t>The tuples do not carry sensitive information beyond schema paths. They neither relax access control nor expose configuration data. Implementations <bcp14>SHOULD</bcp14> ensure that tuple parsing failures are handled gracefully (for example by logging warnings) to avoid denial-of-service conditions caused by malformed metadata.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>IANA is requested to add a new entry to the "IETF XML Registry" for the namespace <spanx style="verb">urn:ietf:params:xml:ns:yang:ietf-lifecycle-ext</spanx> with reference to this document.</t>

<t>IANA is also requested to add a new entry to the "YANG Module Names" registry with the following values: name <spanx style="verb">ietf-lifecycle-ext</spanx>, namespace <spanx style="verb">urn:ietf:params:xml:ns:yang:ietf-lifecycle-ext</spanx>, prefix <spanx style="verb">ietf-ext</spanx>, reference this document.</t>

<t>No other IANA actions are required.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor='RFC7950' target='https://www.rfc-editor.org/rfc/rfc7950'>
  <front>
    <title>The YANG 1.1 Data Modeling Language</title>
    <author initials='M.' surname='Bjorklund' fullname='Martin Bjorklund'>
      <organization>Tail-f Systems</organization>
    </author>
    <date year='2016' month='August'/>
  </front>
  <seriesInfo name='RFC' value='7950'/>
  <seriesInfo name='DOI' value='10.17487/RFC7950'/>
</reference>

<reference anchor='RFC8407' target='https://www.rfc-editor.org/rfc/rfc8407'>
  <front>
    <title>Guidelines for Authors and Reviewers of Documents Containing YANG Data Models</title>
    <author initials='A.' surname='Bierman' fullname='Andy Bierman'>
      <organization>YumaWorks</organization>
    </author>
    <date year='2018' month='October'/>
  </front>
  <seriesInfo name='RFC' value='8407'/>
  <seriesInfo name='DOI' value='10.17487/RFC8407'/>
</reference>

<reference anchor='RFC2119' target='https://www.rfc-editor.org/rfc/rfc2119'>
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author initials='S.' surname='Bradner' fullname='Scott Bradner'>
      <organization>Harvard University</organization>
    </author>
    <date year='1997' month='March'/>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='2119'/>
  <seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>

<reference anchor='RFC8174' target='https://www.rfc-editor.org/rfc/rfc8174'>
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author initials='B.' surname='Leiba' fullname='Barry Leiba'>
      <organization>Huawei Technologies</organization>
    </author>
    <date year='2017' month='May'/>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='8174'/>
  <seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor='YANG-NEXT' target='https://github.com/netmod-wg/yang-next/issues/130'>
  <front>
    <title>YANG Next Issue #130: Deprecation Replacement Metadata</title>
    <author surname='NETMOD Working Group'/>
    <date year='2024'/>
  </front>
  <seriesInfo name='GitHub' value='netmod-wg/yang-next#130'/>
</reference>



    </references>

</references>


<?line 807?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The authors would like to thank the members of the NETMOD working group for their valuable input and feedback.</t>

<t>Special thanks to Kent Watsen, Lou Berger, Balazs Lengyel, Reshad Rahman, Deepak Rajaram, and Rob Wilton for their detailed feedback and suggestions during the IETF 123 NETMOD working group discussions, which significantly improved this document.</t>

<t>The authors acknowledge the ongoing YANG Next discussions captured in <xref target="YANG-NEXT"/> that provided initial inspiration for this proposal.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>
