Repository: ansible/ansible-navigator (language: python)

Issue:
Add schema defaults
Add default values to be used when generating a schema, rather than having locally specific default values.


Discussion / hints:
Also tested manually to see if home directory is no longer leaked. Thanks!

Fix patch:
diff --git a/docs/_ext/single_sourced_data.py b/docs/_ext/single_sourced_data.py
index 87b065325..826f16a8a 100644
--- a/docs/_ext/single_sourced_data.py
+++ b/docs/_ext/single_sourced_data.py
@@ -6,7 +6,6 @@
 from copy import copy
 from pathlib import Path
 from re import match
-from typing import Any
 from typing import Dict
 from typing import List
 from typing import Tuple
@@ -24,7 +23,6 @@
 
 # isort: split
 
-import yaml
 
 from ansible_navigator._version import version as __version__
 from ansible_navigator.configuration_subsystem import Constants as C
@@ -47,7 +45,7 @@
 RST_NL_IN_CELL = "      | {}"
 SUBCOMMAND_TABLE_HEADER = [
     ".. list-table:: {}",
-    "  :widths: 1 3 3 1",
+    "  :widths: 1 3 3 1 1",
     "  :header-rows: 1",
 ]
 
@@ -55,7 +53,6 @@
 DOCS_DIR = Path(__file__).parents[1].resolve()
 PROJECT_DIR = DOCS_DIR.parent
 
-PARAMS_SCHEMA_PATH = DOCS_DIR / "param_details.yml"
 TEST_SETTINGS_FIXTURE = (
     PROJECT_DIR
     / "tests"
@@ -116,10 +113,9 @@ def _rst_generate_row(row: Tuple) -> List:
     return data
 
 
-def _params_generate_tables(param_details: Dict) -> List:
+def _params_generate_tables() -> List:
     """Generate a table for each subcommand's settings parameters.
 
-    :param param_details: A dictionary of the settings parameters details
     :returns: A list of tables, one each for each subcommand
     """
     tables = []
@@ -132,7 +128,6 @@ def _params_generate_tables(param_details: Dict) -> List:
         if not isinstance(entry.subcommands, list):
             row = _params_row_for_entry(
                 entry=entry,
-                param_details=param_details,
             )
             table.extend(_rst_generate_row(row))
     tables.extend(table)
@@ -154,7 +149,6 @@ def _params_generate_tables(param_details: Dict) -> List:
             for entry in entries:
                 row = _params_row_for_entry(
                     entry=entry,
-                    param_details=param_details,
                 )
                 table.extend(_rst_generate_row(row))
             tables.extend(table)
@@ -162,41 +156,11 @@ def _params_generate_tables(param_details: Dict) -> List:
     return tables
 
 
-def _params_get_param_file_entry(
-        param_details: Dict, path: str,
-) -> Union[None, Dict[Any, Any]]:
-    """Retrieve one settings parameter's details from settings data.
-
-    :param param_details: The full settings data
-    :param path: The dot delimited path for the settings parameter to retrieve
-    :returns: The settings parameter's details if present in the data
-    """
-    path_parts = path.split(".")
-    data = param_details
-    try:
-        for key in path_parts:
-            data = data[key]
-        return data
-    except KeyError:
-        return None
-
-
-def _params_retrieve_details(filename: str) -> Dict:
-    """Load the settings file.
-
-    :param filename: The path to the settings file to load
-    :return: The deserialized contents of the file
-    """
-    with open(filename, encoding="utf-8") as fh:
-        return yaml.load(fh, Loader=yaml.SafeLoader)
-
-
-def _params_row_for_entry(entry: SettingsEntry, param_details: Dict) -> Tuple:
+def _params_row_for_entry(entry: SettingsEntry) -> Tuple:
     # pylint: disable=too-many-branches
     """Create a row entry for one settings parameter.
 
     :param entry: The settings entry for which the row will be generated
-    :param param_details: The details for the settings parameter
     :return: A tuple describing the settings parameter
     """
     if entry.cli_parameters is None:
@@ -217,28 +181,18 @@ def _params_row_for_entry(entry: SettingsEntry, param_details: Dict) -> Tuple:
         yaml_like.append(f"{(2*idx+12) * ' '}{path_part}:")
     yaml_like.append("")
 
-    path = entry.settings_file_path(APP) + ".default-value-override"
-    default_override = _params_get_param_file_entry(
-        param_details=param_details,
-        path=path,
-    )
-    logger.debug(
-        "%s: default_value_override: %s",
-        entry.name,
-        default_override,
-    )
-    if isinstance(default_override, str):
-        default = default_override
+    if entry.value.schema_default is not C.NOT_SET:
+        default = entry.value.schema_default
+    elif entry.value.default is not C.NOT_SET:
+        default = entry.value.default
     else:
-        if entry.value.default is C.NOT_SET:
-            default = "No default value set"
-        else:
-            default = entry.value.default
+        default = "No default value set"
 
     choices = oxfordcomma(entry.choices, "or")
     env_var = entry.environment_variable(APP.replace("-", "_"))
 
     settings = []
+    settings.append(f"**Added in version:** {entry.version_added}")
     if choices:
         settings.append(f"**Choices:** {choices}")
     if default is not None:
@@ -264,7 +218,7 @@ def _subcommands_generate_tables() -> List:
     table.append("")
     table.extend(
         _rst_generate_row(
-            ("Name", "Description", "CLI Example", "Colon command"),
+            ("Name", "Description", "CLI Example", "Colon command", "Version added"),
         ),
     )
     for subcommand in NavigatorConfiguration.subcommands:
@@ -273,6 +227,7 @@ def _subcommands_generate_tables() -> List:
             subcommand.description,
             f"ansible-navigator {subcommand.name} --help",
             f":{subcommand.name}",
+            subcommand.version_added,
         )
         table.extend(_rst_generate_row(subcommand_details))
     return table
@@ -333,13 +288,7 @@ def run(self) -> List[nodes.Node]:
 
         :returns: A list of nodes generated from the RST content for all settings parameter tables
         """
-        params_schema_path_str = str(PARAMS_SCHEMA_PATH)
-
-        # make sphinx discard doctree cache on file changes
-        self.env.note_dependency(params_schema_path_str)
-
-        param_details = _params_retrieve_details(params_schema_path_str)
-        tables = _params_generate_tables(param_details)
+        tables = _params_generate_tables()
         rst_tables = "\n".join(tables)
 
         return _nodes_from_rst(state=self.state, rst_source=rst_tables)
diff --git a/docs/param_details.yml b/docs/param_details.yml
deleted file mode 100644
index 52031bbce..000000000
--- a/docs/param_details.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-ansible-navigator:
-  collection-doc-cache-path:
-    default-value-override: $HOME/.cache/ansible-navigator/collection_doc_cache.db
-  logging:
-    file:
-      default-value-override: $PWD/ansible-navigator.log
-  osc4:
-    default-value-override: Current terminal capabilities
diff --git a/src/ansible_navigator/configuration_subsystem/definitions.py b/src/ansible_navigator/configuration_subsystem/definitions.py
index 49af4a756..7e8b29a2e 100644
--- a/src/ansible_navigator/configuration_subsystem/definitions.py
+++ b/src/ansible_navigator/configuration_subsystem/definitions.py
@@ -1,6 +1,6 @@
 """Configuration definitions."""
-
 import copy
+import re
 
 from dataclasses import InitVar
 from dataclasses import dataclass
@@ -26,6 +26,16 @@
     from .navigator_post_processor import NavigatorPostProcessor
 
 
+def version_added_sanity_check(version: str):
+    """Check if a version string is valid.
+
+    :param version: The version string to check
+    :raises AssertionError: If the version string is invalid
+    """
+    re_version = re.compile(r"^v\d+\.\d+$")
+    assert re_version.match(version) is not None, "Version must be in the form of v{major}.{minor}"
+
+
 class Constants(Enum):
     """Mapping some constants to friendly text."""
 
@@ -133,6 +143,8 @@ class SettingsEntry:
     short_description: str
     #: The value for the entry
     value: SettingsEntryValue
+    #: Version added
+    version_added: str
     #: Indicates if this should be applied to future CLIs parsed
     apply_to_subsequent_cli: Constants = Constants.ALL
     #: Indicates if this can be changed after initialization
@@ -154,6 +166,10 @@ class SettingsEntry:
     #: Does this hold the name of the active subcommand
     subcommand_value: bool = False
 
+    def __post_init__(self):
+        """Perform post initialization actions."""
+        version_added_sanity_check(self.version_added)
+
     def environment_variable(self, prefix: str = "") -> str:
         """Generate an effective environment variable for this entry.
 
@@ -225,8 +241,13 @@ class SubCommand:
 
     name: str
     description: str
+    version_added: str
     epilog: Optional[str] = None
 
+    def __post_init__(self):
+        """Perform post initialization actions."""
+        version_added_sanity_check(self.version_added)
+
 
 @dataclass
 class ApplicationConfiguration:
diff --git a/src/ansible_navigator/configuration_subsystem/defs_presentable.py b/src/ansible_navigator/configuration_subsystem/defs_presentable.py
index 5f65a0eda..2bf6630b0 100644
--- a/src/ansible_navigator/configuration_subsystem/defs_presentable.py
+++ b/src/ansible_navigator/configuration_subsystem/defs_presentable.py
@@ -83,6 +83,8 @@ class PresentableSettingsEntry(ContentBase):
     """The source of the current value"""
     subcommands: List
     """A list of subcommands where this entry is available"""
+    version_added: str
+    """The version this entry was added in"""
     cli_parameters: PresentableCliParameters = PresentableCliParameters()
     """The CLI parameters, long and short"""
 
@@ -133,6 +135,7 @@ def for_settings_file(
             settings_file_sample="Not applicable",
             source=internals.settings_source.value,
             subcommands=all_subcommands,
+            version_added="v1.0",
         )
 
     @classmethod
@@ -184,6 +187,7 @@ def from_settings_entry(
             settings_file_sample=settings_file_sample,
             source=entry.value.source.value,
             subcommands=subcommands,
+            version_added=entry.version_added,
         )
         return result
 
diff --git a/src/ansible_navigator/configuration_subsystem/navigator_configuration.py b/src/ansible_navigator/configuration_subsystem/navigator_configuration.py
index 7f85e3d7a..f52349348 100644
--- a/src/ansible_navigator/configuration_subsystem/navigator_configuration.py
+++ b/src/ansible_navigator/configuration_subsystem/navigator_configuration.py
@@ -115,8 +115,13 @@ class Internals:
             " For more information about these, try "
             " 'ansible-navigator builder --help-builder --mode stdout'"
         ),
+        version_added="v2.0",
+    ),
+    SubCommand(
+        name="collections",
+        description="Explore available collections",
+        version_added="v1.0",
     ),
-    SubCommand(name="collections", description="Explore available collections"),
     SubCommand(
         name="config",
         description="Explore the current ansible configuration",
@@ -126,6 +131,7 @@ class Internals:
             " For more information about these, try "
             " 'ansible-navigator config --help-config --mode stdout'"
         ),
+        version_added="v1.0",
     ),
     SubCommand(
         name="doc",
@@ -136,6 +142,7 @@ class Internals:
             " For more information about these, try "
             " 'ansible-navigator doc --help-doc --mode stdout'"
         ),
+        version_added="v1.0",
     ),
     SubCommand(
         name="exec",
@@ -146,10 +153,12 @@ class Internals:
             " its build and behavior. All navigator settings will be applied"
             " when starting the execution environment."
         ),
+        version_added="v2.0",
     ),
     SubCommand(
         name="images",
         description="Explore execution environment images",
+        version_added="v1.0",
     ),
     SubCommand(
         name="inventory",
@@ -160,6 +169,7 @@ class Internals:
             " For more information about these, try "
             " 'ansible-navigator inventory --help-inventory --mode stdout'"
         ),
+        version_added="v1.0",
     ),
     SubCommand(
         name="lint",
@@ -170,8 +180,13 @@ class Internals:
             " in it. If not using an execution environment, ansible-lint must"
             " be installed on your system."
         ),
+        version_added="v1.0",
+    ),
+    SubCommand(
+        name="replay",
+        description="Explore a previous run using a playbook artifact",
+        version_added="v1.0",
     ),
-    SubCommand(name="replay", description="Explore a previous run using a playbook artifact"),
     SubCommand(
         name="run",
         description="Run a playbook",
@@ -181,12 +196,18 @@ class Internals:
             " For more information about these, try "
             " 'ansible-navigator run --help-playbook --mode stdout'"
         ),
+        version_added="v1.0",
     ),
     SubCommand(
         name="settings",
         description="Review the current ansible-navigator settings",
+        version_added="v2.0",
+    ),
+    SubCommand(
+        name="welcome",
+        description="Start at the welcome page",
+        version_added="v1.0",
     ),
-    SubCommand(name="welcome", description="Start at the welcome page"),
 ]
 
 NavigatorConfiguration = ApplicationConfiguration(
@@ -202,6 +223,7 @@ class Internals:
             settings_file_path_override="ansible-runner.artifact-dir",
             short_description="The directory path to store artifacts generated by ansible-runner",
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="ansible_runner_rotate_artifacts_count",
@@ -211,6 +233,7 @@ class Internals:
             "for last n runs, if set to 0 artifact directories "
             "won't be deleted",
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="ansible_runner_timeout",
@@ -219,6 +242,7 @@ class Internals:
             short_description="The timeout value after which ansible-runner will"
             "force stop the execution",
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="app",
@@ -227,6 +251,7 @@ class Internals:
             short_description="Subcommands",
             subcommand_value=True,
             value=SettingsEntryValue(default="welcome"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="cmdline",
@@ -234,6 +259,7 @@ class Internals:
             settings_file_path_override="ansible.cmdline",
             short_description="Extra parameters passed to the corresponding command",
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="collection_doc_cache_path",
@@ -243,6 +269,7 @@ class Internals:
                 default=generate_cache_path(),
                 schema_default="~/.cache/ansible-navigator/collection_doc_cache.db",
             ),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="config",
@@ -252,6 +279,7 @@ class Internals:
             short_description="Specify the path to the ansible configuration file",
             subcommands=["config"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="container_engine",
@@ -260,6 +288,7 @@ class Internals:
             settings_file_path_override="execution-environment.container-engine",
             short_description="Specify the container engine (auto=podman then docker)",
             value=SettingsEntryValue(default="auto"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="container_options",
@@ -268,6 +297,7 @@ class Internals:
             settings_file_path_override="execution-environment.container-options",
             short_description="Extra parameters passed to the container engine command",
             value=SettingsEntryValue(),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="display_color",
@@ -278,6 +308,7 @@ class Internals:
             settings_file_path_override="color.enable",
             short_description="Enable the use of color for mode interactive and stdout",
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="editor_command",
@@ -288,6 +319,7 @@ class Internals:
                 default=generate_editor_command(),
                 schema_default="vi +{line_number} {filename}",
             ),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="editor_console",
@@ -296,6 +328,7 @@ class Internals:
             settings_file_path_override="editor.console",
             short_description="Specify if the editor is console based",
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="exec_command",
@@ -304,6 +337,7 @@ class Internals:
             short_description="Specify the command to run within the execution environment",
             subcommands=["exec"],
             value=SettingsEntryValue(default="/bin/bash"),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="exec_shell",
@@ -313,6 +347,7 @@ class Internals:
             short_description="Specify the exec command should be run in a shell",
             subcommands=["exec"],
             value=SettingsEntryValue(default=True),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="execution_environment",
@@ -321,6 +356,7 @@ class Internals:
             settings_file_path_override="execution-environment.enabled",
             short_description="Enable or disable the use of an execution environment",
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="execution_environment_image",
@@ -328,6 +364,7 @@ class Internals:
             settings_file_path_override="execution-environment.image",
             short_description="Specify the name of the execution environment image",
             value=SettingsEntryValue(default="quay.io/ansible/creator-ee:v0.4.0"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="execution_environment_volume_mounts",
@@ -340,6 +377,7 @@ class Internals:
                 " (--eev /home/user/test:/home/user/test:Z)"
             ),
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="help_builder",
@@ -349,6 +387,7 @@ class Internals:
             short_description="Help options for ansible-builder command in stdout mode",
             subcommands=["builder"],
             value=SettingsEntryValue(default=False),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="help_config",
@@ -358,6 +397,7 @@ class Internals:
             short_description="Help options for ansible-config command in stdout mode",
             subcommands=["config"],
             value=SettingsEntryValue(default=False),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="help_doc",
@@ -367,6 +407,7 @@ class Internals:
             short_description="Help options for ansible-doc command in stdout mode",
             subcommands=["doc"],
             value=SettingsEntryValue(default=False),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="help_inventory",
@@ -376,6 +417,7 @@ class Internals:
             short_description="Help options for ansible-inventory command in stdout mode",
             subcommands=["inventory"],
             value=SettingsEntryValue(default=False),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="help_playbook",
@@ -385,6 +427,7 @@ class Internals:
             short_description="Help options for ansible-playbook command in stdout mode",
             subcommands=["run"],
             value=SettingsEntryValue(default=False),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="images_details",
@@ -410,6 +453,7 @@ class Internals:
             ),
             subcommands=["images"],
             value=SettingsEntryValue(default=["everything"]),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="inventory",
@@ -419,6 +463,7 @@ class Internals:
             short_description="Specify an inventory file path or comma separated host list",
             subcommands=["inventory", "run"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="inventory_column",
@@ -428,6 +473,7 @@ class Internals:
             short_description="Specify a host attribute to show in the inventory view",
             subcommands=["inventory", "run"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="lint_config",
@@ -437,6 +483,7 @@ class Internals:
             short_description="Specify the path to the ansible-lint configuration file",
             subcommands=["lint"],
             value=SettingsEntryValue(),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="lintables",
@@ -445,6 +492,7 @@ class Internals:
             settings_file_path_override="ansible-lint.lintables",
             subcommands=["lint"],
             value=SettingsEntryValue(),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="log_append",
@@ -456,6 +504,7 @@ class Internals:
             ),
             settings_file_path_override="logging.append",
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="log_file",
@@ -466,6 +515,7 @@ class Internals:
                 default=abs_user_path("./ansible-navigator.log"),
                 schema_default="./ansible-navigator.log",
             ),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="log_level",
@@ -474,6 +524,7 @@ class Internals:
             short_description="Specify the ansible-navigator log level",
             settings_file_path_override="logging.level",
             value=SettingsEntryValue(default="warning"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="mode",
@@ -483,6 +534,7 @@ class Internals:
             cli_parameters=CliParameters(short="-m"),
             short_description="Specify the user-interface mode",
             value=SettingsEntryValue(default="interactive"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="osc4",
@@ -491,6 +543,7 @@ class Internals:
             settings_file_path_override="color.osc4",
             short_description="Enable or disable terminal color changing support with OSC 4",
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="pass_environment_variable",
@@ -502,6 +555,7 @@ class Internals:
                 " to and set within the execution environment (--penv MY_VAR)"
             ),
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="playbook",
@@ -510,6 +564,7 @@ class Internals:
             settings_file_path_override="ansible.playbook.path",
             subcommands=["run"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="playbook_artifact_enable",
@@ -521,6 +576,7 @@ class Internals:
             " require user input",
             subcommands=["run"],
             value=SettingsEntryValue(default=True),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="playbook_artifact_replay",
@@ -529,6 +585,7 @@ class Internals:
             short_description="Specify the path for the playbook artifact to replay",
             subcommands=["replay"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="playbook_artifact_save_as",
@@ -539,6 +596,7 @@ class Internals:
             value=SettingsEntryValue(
                 default="{playbook_dir}/{playbook_name}-artifact-{time_stamp}.json",
             ),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="plugin_name",
@@ -547,6 +605,7 @@ class Internals:
             short_description="Specify the plugin name",
             subcommands=["doc"],
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="plugin_type",
@@ -556,6 +615,7 @@ class Internals:
             short_description=f"Specify the plugin type, {oxfordcomma(PLUGIN_TYPES, 'or')}",
             subcommands=["doc"],
             value=SettingsEntryValue(default="module"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="pull_arguments",
@@ -567,6 +627,7 @@ class Internals:
                 " registry. e.g. --pa='--tls-verify=false'"
             ),
             value=SettingsEntryValue(),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="pull_policy",
@@ -582,6 +643,7 @@ class Internals:
                 " otherwise pull if not locally available"
             ),
             value=SettingsEntryValue(default="tag"),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="set_environment_variable",
@@ -593,6 +655,7 @@ class Internals:
                 " execution environment (--senv MY_VAR=42)"
             ),
             value=SettingsEntryValue(),
+            version_added="v1.0",
         ),
         SettingsEntry(
             name="settings_effective",
@@ -608,6 +671,7 @@ class Internals:
             ),
             subcommands=["settings"],
             value=SettingsEntryValue(default=False),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="settings_sample",
@@ -620,6 +684,7 @@ class Internals:
             short_description=("Generate a sample settings file"),
             subcommands=["settings"],
             value=SettingsEntryValue(default=False),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="settings_schema",
@@ -636,6 +701,7 @@ class Internals:
             ),
             subcommands=["settings"],
             value=SettingsEntryValue(default="json"),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="settings_sources",
@@ -648,6 +714,7 @@ class Internals:
             short_description=("Show the source of each current settings entry"),
             subcommands=["settings"],
             value=SettingsEntryValue(default=False),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="time_zone",
@@ -657,6 +724,7 @@ class Internals:
                 "Specify the IANA time zone to use or 'local' to use the system time zone"
             ),
             value=SettingsEntryValue(default="UTC"),
+            version_added="v2.0",
         ),
         SettingsEntry(
             name="workdir",
@@ -668,6 +736,7 @@ class Internals:
                 default=os.getcwd(),
                 schema_default=".",
             ),
+            version_added="v2.0",
         ),
     ],
 )


Test patch:
diff --git a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/0.json b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/0.json
index cf1cf6ca5..6e277421f 100644
--- a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/0.json
+++ b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/0.json
@@ -10,6 +10,31 @@
         "compared_fixture": false
     },
     "output": [
+        "  - welcome",
+        "  version_added: v2.0",
+        "- choices:",
+        "  - always",
+        "  - missing",
+        "  - never",
+        "  - tag",
+        "  cli_parameters:",
+        "    long: --pull-policy",
+        "    short: --pp",
+        "  current_settings_file: None",
+        "  current_value: never",
+        "  default: false",
+        "  default_value: tag",
+        "  description: Specify the image pull policy always:Always pull the image, missing:Pull",
+        "    if not locally available, never:Never pull the image, tag:if the image tag is",
+        "    'latest', always pull the image, otherwise pull if not locally available",
+        "  env_var: ANSIBLE_NAVIGATOR_PULL_POLICY",
+        "  name: Pull policy",
+        "  settings_file_sample:",
+        "    ansible-navigator:",
+        "      execution-environment:",
+        "        pull:",
+        "          policy: <------",
+        "  source: Environment variable",
         "  subcommands:",
         "  - builder",
         "  - collections",
@@ -23,6 +48,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v1.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --set-environment-variable",
@@ -54,6 +80,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v1.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --effective",
@@ -72,18 +99,8 @@
         "        effective: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --sample",
@@ -92,7 +109,7 @@
         "  current_value: false",
         "  default: true",
         "  default_value: false",
-        "  description: Generate a sample settings file.",
+        "  description: Generate a sample settings file",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SAMPLE",
         "  name: Settings sample",
         "  settings_file_sample:",
@@ -101,18 +118,8 @@
         "        sample: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices:",
         "  - json",
         "  cli_parameters:",
@@ -122,7 +129,7 @@
         "  current_value: json",
         "  default: true",
         "  default_value: json",
-        "  description: Generate a schema for the settings file. ('json'= draft-07 JSON Schema)",
+        "  description: Generate a schema for the settings file ('json'= draft-07 JSON Schema)",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SCHEMA",
         "  name: Settings schema",
         "  settings_file_sample:",
@@ -132,6 +139,7 @@
         "  source: Defaults",
         "  subcommands:",
         "  - settings",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --sources",
@@ -140,7 +148,7 @@
         "  current_value: false",
         "  default: true",
         "  default_value: false",
-        "  description: Show the source of each current settings entry.",
+        "  description: Show the source of each current settings entry",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SOURCES",
         "  name: Settings sources",
         "  settings_file_sample:",
@@ -149,18 +157,8 @@
         "        sources: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --time-zone",
@@ -170,7 +168,7 @@
         "  default: true",
         "  default_value: UTC",
         "  description: Specify the IANA time zone to use or 'local' to use the system time",
-        "    zone.",
+        "    zone",
         "  env_var: TZ",
         "  name: Time zone",
         "  settings_file_sample:",
@@ -190,6 +188,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --workdir",
@@ -208,6 +207,7 @@
         "  source: Defaults",
         "  subcommands:",
         "  - builder",
+        "  version_added: v2.0",
         "(venv) bash-5.1$"
     ]
 }
diff --git a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/1.json b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/1.json
index eed393944..7cab8fbf6 100644
--- a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/1.json
+++ b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/1.json
@@ -10,6 +10,31 @@
         "compared_fixture": false
     },
     "output": [
+        "  - welcome",
+        "  version_added: v2.0",
+        "- choices:",
+        "  - always",
+        "  - missing",
+        "  - never",
+        "  - tag",
+        "  cli_parameters:",
+        "    long: --pull-policy",
+        "    short: --pp",
+        "  current_settings_file: None",
+        "  current_value: never",
+        "  default: false",
+        "  default_value: tag",
+        "  description: Specify the image pull policy always:Always pull the image, missing:Pull",
+        "    if not locally available, never:Never pull the image, tag:if the image tag is",
+        "    'latest', always pull the image, otherwise pull if not locally available",
+        "  env_var: ANSIBLE_NAVIGATOR_PULL_POLICY",
+        "  name: Pull policy",
+        "  settings_file_sample:",
+        "    ansible-navigator:",
+        "      execution-environment:",
+        "        pull:",
+        "          policy: <------",
+        "  source: Environment variable",
         "  subcommands:",
         "  - builder",
         "  - collections",
@@ -23,6 +48,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v1.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --set-environment-variable",
@@ -54,6 +80,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v1.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --effective",
@@ -72,18 +99,8 @@
         "        effective: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --sample",
@@ -92,7 +109,7 @@
         "  current_value: false",
         "  default: true",
         "  default_value: false",
-        "  description: Generate a sample settings file.",
+        "  description: Generate a sample settings file",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SAMPLE",
         "  name: Settings sample",
         "  settings_file_sample:",
@@ -101,18 +118,8 @@
         "        sample: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices:",
         "  - json",
         "  cli_parameters:",
@@ -122,7 +129,7 @@
         "  current_value: json",
         "  default: true",
         "  default_value: json",
-        "  description: Generate a schema for the settings file. ('json'= draft-07 JSON Schema)",
+        "  description: Generate a schema for the settings file ('json'= draft-07 JSON Schema)",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SCHEMA",
         "  name: Settings schema",
         "  settings_file_sample:",
@@ -132,6 +139,7 @@
         "  source: Defaults",
         "  subcommands:",
         "  - settings",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --sources",
@@ -140,7 +148,7 @@
         "  current_value: false",
         "  default: true",
         "  default_value: false",
-        "  description: Show the source of each current settings entry.",
+        "  description: Show the source of each current settings entry",
         "  env_var: ANSIBLE_NAVIGATOR_SETTINGS_SOURCES",
         "  name: Settings sources",
         "  settings_file_sample:",
@@ -149,18 +157,8 @@
         "        sources: <------",
         "  source: Defaults",
         "  subcommands:",
-        "  - builder",
-        "  - collections",
-        "  - config",
-        "  - doc",
-        "  - exec",
-        "  - images",
-        "  - inventory",
-        "  - lint",
-        "  - replay",
-        "  - run",
         "  - settings",
-        "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --time-zone",
@@ -170,7 +168,7 @@
         "  default: true",
         "  default_value: UTC",
         "  description: Specify the IANA time zone to use or 'local' to use the system time",
-        "    zone.",
+        "    zone",
         "  env_var: TZ",
         "  name: Time zone",
         "  settings_file_sample:",
@@ -190,6 +188,7 @@
         "  - run",
         "  - settings",
         "  - welcome",
+        "  version_added: v2.0",
         "- choices: []",
         "  cli_parameters:",
         "    long: --workdir",
@@ -208,6 +207,7 @@
         "  source: Defaults",
         "  subcommands:",
         "  - builder",
+        "  version_added: v2.0",
         "(venv) bash-5.1$"
     ]
 }
diff --git a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/2.json b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/2.json
index 77f436004..909696be5 100644
--- a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/2.json
+++ b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/2.json
@@ -34,7 +34,7 @@
         "                                },",
         "                                \"policy\": {",
         "                                    \"default\": \"tag\",",
-        "                                    \"description\": \"Specify the image pull policy. always:Always pull the image, missing:Pull if not locally available, never:Never pull the image, tag:if the image tag is 'latest', always pull the image, otherwise pull if not locally available\",",
+        "                                    \"description\": \"Specify the image pull policy always:Always pull the image, missing:Pull if not locally available, never:Never pull the image, tag:if the image tag is 'latest', always pull the image, otherwise pull if not locally available\",",
         "                                    \"enum\": [",
         "                                        \"always\",",
         "                                        \"missing\",",
@@ -113,7 +113,7 @@
         "                            \"type\": \"boolean\"",
         "                        },",
         "                        \"file\": {",
-        "                            \"default\": \"/home/user/github/ansible-navigator/ansible-navigator.log\",",
+        "                            \"default\": \"./ansible-navigator.log\",",
         "                            \"description\": \"Specify the full path for the ansible-navigator log file\",",
         "                            \"type\": \"string\"",
         "                        },",
@@ -175,12 +175,12 @@
         "                        },",
         "                        \"sample\": {",
         "                            \"default\": false,",
-        "                            \"description\": \"Generate a sample settings file.\",",
+        "                            \"description\": \"Generate a sample settings file\",",
         "                            \"type\": \"boolean\"",
         "                        },",
         "                        \"schema\": {",
         "                            \"default\": \"json\",",
-        "                            \"description\": \"Generate a schema for the settings file. ('json'= draft-07 JSON Schema)\",",
+        "                            \"description\": \"Generate a schema for the settings file ('json'= draft-07 JSON Schema)\",",
         "                            \"enum\": [",
         "                                \"json\"",
         "                            ],",
@@ -188,14 +188,14 @@
         "                        },",
         "                        \"sources\": {",
         "                            \"default\": false,",
-        "                            \"description\": \"Show the source of each current settings entry.\",",
+        "                            \"description\": \"Show the source of each current settings entry\",",
         "                            \"type\": \"boolean\"",
         "                        }",
         "                    }",
         "                },",
         "                \"time-zone\": {",
         "                    \"default\": \"UTC\",",
-        "                    \"description\": \"Specify the IANA time zone to use or 'local' to use the system time zone.\",",
+        "                    \"description\": \"Specify the IANA time zone to use or 'local' to use the system time zone\",",
         "                    \"type\": \"string\"",
         "                }",
         "            }",
@@ -204,9 +204,9 @@
         "    \"required\": [",
         "        \"ansible-navigator\"",
         "    ],",
-        "    \"title\": \"ansible-navigator settings v2.0.0a1.dev42+g9ddf6322.d20220325\",",
+        "    \"title\": \"ansible-navigator settings v2.0.0b1.dev13+g14ef084f.d20220406\",",
         "    \"type\": \"object\",",
-        "    \"version\": \"2.0.0a1.dev42+g9ddf6322.d20220325\"",
+        "    \"version\": \"2.0.0b1.dev13+g14ef084f.d20220406\"",
         "}",
         "(venv) bash-5.1$"
     ]
diff --git a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/3.json b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/3.json
index 4a4e797c2..9f2d03cce 100644
--- a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/3.json
+++ b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/3.json
@@ -34,7 +34,7 @@
         "                                },",
         "                                \"policy\": {",
         "                                    \"default\": \"tag\",",
-        "                                    \"description\": \"Specify the image pull policy. always:Always pull the image, missing:Pull if not locally available, never:Never pull the image, tag:if the image tag is 'latest', always pull the image, otherwise pull if not locally available\",",
+        "                                    \"description\": \"Specify the image pull policy always:Always pull the image, missing:Pull if not locally available, never:Never pull the image, tag:if the image tag is 'latest', always pull the image, otherwise pull if not locally available\",",
         "                                    \"enum\": [",
         "                                        \"always\",",
         "                                        \"missing\",",
@@ -113,7 +113,7 @@
         "                            \"type\": \"boolean\"",
         "                        },",
         "                        \"file\": {",
-        "                            \"default\": \"/home/user/github/ansible-navigator/ansible-navigator.log\",",
+        "                            \"default\": \"./ansible-navigator.log\",",
         "                            \"description\": \"Specify the full path for the ansible-navigator log file\",",
         "                            \"type\": \"string\"",
         "                        },",
@@ -175,12 +175,12 @@
         "                        },",
         "                        \"sample\": {",
         "                            \"default\": false,",
-        "                            \"description\": \"Generate a sample settings file.\",",
+        "                            \"description\": \"Generate a sample settings file\",",
         "                            \"type\": \"boolean\"",
         "                        },",
         "                        \"schema\": {",
         "                            \"default\": \"json\",",
-        "                            \"description\": \"Generate a schema for the settings file. ('json'= draft-07 JSON Schema)\",",
+        "                            \"description\": \"Generate a schema for the settings file ('json'= draft-07 JSON Schema)\",",
         "                            \"enum\": [",
         "                                \"json\"",
         "                            ],",
@@ -188,14 +188,14 @@
         "                        },",
         "                        \"sources\": {",
         "                            \"default\": false,",
-        "                            \"description\": \"Show the source of each current settings entry.\",",
+        "                            \"description\": \"Show the source of each current settings entry\",",
         "                            \"type\": \"boolean\"",
         "                        }",
         "                    }",
         "                },",
         "                \"time-zone\": {",
         "                    \"default\": \"UTC\",",
-        "                    \"description\": \"Specify the IANA time zone to use or 'local' to use the system time zone.\",",
+        "                    \"description\": \"Specify the IANA time zone to use or 'local' to use the system time zone\",",
         "                    \"type\": \"string\"",
         "                }",
         "            }",
@@ -204,9 +204,9 @@
         "    \"required\": [",
         "        \"ansible-navigator\"",
         "    ],",
-        "    \"title\": \"ansible-navigator settings v2.0.0a1.dev42+g9ddf6322.d20220325\",",
+        "    \"title\": \"ansible-navigator settings v2.0.0b1.dev13+g14ef084f.d20220406\",",
         "    \"type\": \"object\",",
-        "    \"version\": \"2.0.0a1.dev42+g9ddf6322.d20220325\"",
+        "    \"version\": \"2.0.0b1.dev13+g14ef084f.d20220406\"",
         "}",
         "(venv) bash-5.1$"
     ]
diff --git a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/4.json b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/4.json
index 4217a62b9..e80796e48 100644
--- a/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/4.json
+++ b/tests/fixtures/integration/actions/settings/test_stdout_tmux.py/test/4.json
@@ -77,7 +77,7 @@
         "#     # Specify if the editor is console based",
         "#     console: False",
         "#   exec:",
-        "#     # Specify the exec command should be run in a shell.",
+        "#     # Specify the exec command should be run in a shell",
         "#     shell: True",
         "#     # Specify the command to run within the execution environment",
         "#     command: /bin/bash",
@@ -110,7 +110,7 @@
         "#       # registry. e.g. --pa='--tls-verify=false'",
         "#       arguments:",
         "#         - \"--tls-verify=false\"",
-        "#       # Specify the image pull policy. always:Always pull the image,",
+        "#       # Specify the image pull policy always:Always pull the image,",
         "#       # missing:Pull if not locally available, never:Never pull the image,",
         "#       # tag:if the image tag is 'latest', always pull the image, otherwise",
         "#       # pull if not locally available",
@@ -155,15 +155,14 @@
         "#     # Show the effective settings. Defaults, CLI parameters, environment",
         "#     # variables, and the settings file will be combined",
         "#     effective: False",
-        "#     # Generate a sample settings file.",
+        "#     # Generate a sample settings file",
         "#     sample: False",
-        "#     # Generate a schema for the settings file. ('json'= draft-07 JSON",
-        "#     # Schema)",
+        "#     # Generate a schema for the settings file ('json'= draft-07 JSON Schema)",
         "#     schema: json",
-        "#     # Show the source of each current settings entry.",
+        "#     # Show the source of each current settings entry",
         "#     sources: False",
         "#   # Specify the IANA time zone to use or 'local' to use the system time",
-        "#   # zone.",
+        "#   # zone",
         "#   time-zone: UTC",
         "(venv) bash-5.1$"
     ]
diff --git a/tests/unit/actions/settings/test_settings.py b/tests/unit/actions/settings/test_settings.py
index 6204f260d..5de3afba7 100644
--- a/tests/unit/actions/settings/test_settings.py
+++ b/tests/unit/actions/settings/test_settings.py
@@ -74,6 +74,7 @@ def test_color_menu(data: ColorMenuTestEntry):
         source="",
         subcommands=[],
         cli_parameters=PresentableCliParameters(long="", short=""),
+        version_added="v0.0",
     )
     assert color_menu(0, "", entry) == (data.color, data.decoration)
 
@@ -126,6 +127,7 @@ def __str__(self):
             source="",
             subcommands=[],
             cli_parameters=PresentableCliParameters(long="", short=""),
+            version_added="v0.0",
         ),
     ),
     ContentHeadingEntry(
@@ -144,6 +146,7 @@ def __str__(self):
             source="",
             subcommands=[],
             cli_parameters=PresentableCliParameters(long="", short=""),
+            version_added="v0.0",
         ),
     ),
 )
diff --git a/tests/unit/configuration_subsystem/test_mode_subcommand_action.py b/tests/unit/configuration_subsystem/test_mode_subcommand_action.py
index 3af7275ad..e6de06166 100644
--- a/tests/unit/configuration_subsystem/test_mode_subcommand_action.py
+++ b/tests/unit/configuration_subsystem/test_mode_subcommand_action.py
@@ -25,18 +25,24 @@ def test_import_error():
         internals=Internals(action_packages=["__ansible_navigator.__actions"]),
         post_processor=NavigatorPostProcessor(),
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
                 name="app",
                 short_description="test_app",
                 value=SettingsEntryValue(current="subcommand1"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="mode",
                 short_description="mode",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
         ],
     )
@@ -58,18 +64,24 @@ def test_subcommand_not_found():
         internals=Internals(action_packages=["ansible_navigator.actions"]),
         post_processor=NavigatorPostProcessor(),
         subcommands=[
-            SubCommand(name="__test_action", description="test_action"),
+            SubCommand(
+                name="__test_action",
+                description="test_action",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
                 name="app",
                 short_description="test_app",
                 value=SettingsEntryValue(current="__test_action"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="mode",
                 short_description="mode",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
         ],
     )
diff --git a/tests/unit/configuration_subsystem/test_presentable.py b/tests/unit/configuration_subsystem/test_presentable.py
index 33ea2a4d4..880285e36 100644
--- a/tests/unit/configuration_subsystem/test_presentable.py
+++ b/tests/unit/configuration_subsystem/test_presentable.py
@@ -27,7 +27,11 @@ def _sample_settings():
         internals=Internals(settings_file_path="/test/path"),
         post_processor=NavigatorPostProcessor(),
         subcommands=[
-            SubCommand(name="subcommand_1", description="subcommand_1"),
+            SubCommand(
+                name="subcommand_1",
+                description="subcommand_1",
+                version_added="v0.0",
+            ),
         ],
         entries=[],
     )
@@ -52,6 +56,7 @@ def _settings_file_dict():
         "source": "Not set",
         "subcommands": ["subcommand_1"],
         "cli_parameters": {"long": "No long CLI parameter", "short": "No short CLI parameter"},
+        "version_added": "v1.0",
     }
 
 
@@ -85,6 +90,7 @@ def test_settings_entry(sample_settings, settings_file_dict):
             default="default",
             source=Constants.ENVIRONMENT_VARIABLE,
         ),
+        version_added="v0.0",
     )
     sample_settings.entries = [entry]
     configurator = Configurator(params=[], application_configuration=sample_settings)
@@ -106,5 +112,6 @@ def test_settings_entry(sample_settings, settings_file_dict):
         "source": "Environment variable",
         "subcommands": ["subcommand_1"],
         "cli_parameters": {"long": "--se-1", "short": "-se1"},
+        "version_added": "v0.0",
     }
     assert asdict(presentable[1]) == entry_dict
diff --git a/tests/unit/configuration_subsystem/test_previous_cli.py b/tests/unit/configuration_subsystem/test_previous_cli.py
index 11c4fa6a3..2c459f728 100644
--- a/tests/unit/configuration_subsystem/test_previous_cli.py
+++ b/tests/unit/configuration_subsystem/test_previous_cli.py
@@ -272,8 +272,16 @@ def test_apply_cli_subset_none():
         internals=Internals(initializing=True),
         post_processor=None,
         subcommands=[
-            SubCommand(name="list", description="list"),
-            SubCommand(name="run", description="run"),
+            SubCommand(
+                name="list",
+                description="list",
+                version_added="v0.0",
+            ),
+            SubCommand(
+                name="run",
+                description="run",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
@@ -281,6 +289,7 @@ def test_apply_cli_subset_none():
                 short_description="Subcommands",
                 subcommand_value=True,
                 value=SettingsEntryValue(default="run"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="z",
@@ -288,6 +297,7 @@ def test_apply_cli_subset_none():
                 cli_parameters=CliParameters(short="-z"),
                 short_description="the z parameter",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="execution_environment",
@@ -295,6 +305,7 @@ def test_apply_cli_subset_none():
                 cli_parameters=CliParameters(short="-e"),
                 short_description="the e parameter",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
         ],
     )
diff --git a/tests/unit/configuration_subsystem/test_sample_configurations.py b/tests/unit/configuration_subsystem/test_sample_configurations.py
index c6bb07bbd..154b6a894 100644
--- a/tests/unit/configuration_subsystem/test_sample_configurations.py
+++ b/tests/unit/configuration_subsystem/test_sample_configurations.py
@@ -30,13 +30,18 @@ def test_cmdline_source_not_set():
         internals=Internals(),
         post_processor=NavigatorPostProcessor(),
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
                 name="cmdline",
                 short_description="cmdline",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
         ],
     )
@@ -54,7 +59,11 @@ def test_no_subcommand():
         internals=Internals(),
         post_processor=None,
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[],
     )
@@ -70,7 +79,11 @@ def test_many_subcommand():
         internals=Internals(),
         post_processor=None,
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
@@ -78,12 +91,14 @@ def test_many_subcommand():
                 short_description="Subcommands",
                 subcommand_value=True,
                 value=SettingsEntryValue(default="welcome"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="sb2",
                 short_description="Subcommands",
                 subcommand_value=True,
                 value=SettingsEntryValue(default="welcome"),
+                version_added="v0.0",
             ),
         ],
     )
@@ -99,7 +114,11 @@ def test_invalid_choice_not_set():
         internals=Internals(),
         post_processor=None,
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
@@ -107,11 +126,13 @@ def test_invalid_choice_not_set():
                 short_description="Subcommands",
                 subcommand_value=True,
                 value=SettingsEntryValue(default="welcome"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="e1",
                 short_description="ex1",
                 value=SettingsEntryValue(),
+                version_added="v0.0",
             ),
         ],
     )
@@ -127,7 +148,11 @@ def test_custom_nargs_for_positional():
         internals=Internals(),
         post_processor=None,
         subcommands=[
-            SubCommand(name="subcommand1", description="subcommand1"),
+            SubCommand(
+                name="subcommand1",
+                description="subcommand1",
+                version_added="v0.0",
+            ),
         ],
         entries=[
             SettingsEntry(
@@ -135,6 +160,7 @@ def test_custom_nargs_for_positional():
                 short_description="Subcommands",
                 subcommand_value=True,
                 value=SettingsEntryValue(default="welcome"),
+                version_added="v0.0",
             ),
             SettingsEntry(
                 name="e1",
@@ -142,6 +168,7 @@ def test_custom_nargs_for_positional():
                 short_description="ex1",
                 value=SettingsEntryValue(),
                 subcommands=["subcommand1"],
+                version_added="v0.0",
             ),
         ],
     )