diff --git a/jjb/pipeline/voltha/software-upgrades.groovy b/jjb/pipeline/voltha/software-upgrades.groovy
index e169d1b..19b8a6e 100755
--- a/jjb/pipeline/voltha/software-upgrades.groovy
+++ b/jjb/pipeline/voltha/software-upgrades.groovy
@@ -67,13 +67,24 @@
 // returns the test version which is the latest tag of the repo, the component upgrade gets tested on this.
 // Note: if there is a major version change between deployment and test tags, then deployment tag will be same as test tag, i.e. both as latest.
 // -----------------------------------------------------------------------
+// git ls repo: gerrit (source of truth) VS github (mirror)
+// Branch deletions are not mirrored out to github.
+// Always perform checkouts/queries using the gerrit server as added
+// insulation to guard against repository deltas.
+// -----------------------------------------------------------------------
+// [TODO] Revisit logic:
+//   o Refactor logic into a standalone shell script.
+//   o Redundancy can be removed and a script will be testable.
+// -----------------------------------------------------------------------
 def get_voltha_comp_versions(component, base_deploy_tag) {
     def comp_test_tag = sh(
-        script: "git ls-remote --refs --tags https://github.com/opencord/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=1 | sed 's/v//'",
+        // script: "git ls-remote --refs --tags https://github.com/opencord/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=1 | sed 's/v//'",
+        script: "git ls-remote --refs --tags https://gerrit.opencord.org/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=1 | sed 's/v//'",
         returnStdout: true
     ).trim()
     def comp_deploy_tag = sh(
-        script: "git ls-remote --refs --tags https://github.com/opencord/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=2 | head -n 1 | sed 's/v//'",
+        // script: "git ls-remote --refs --tags https://github.com/opencord/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=2 | head -n 1 | sed 's/v//'",
+        script: "git ls-remote --refs --tags https://gerrit.opencord.org/${component} | cut --delimiter='/' --fields=3 | tr '-' '~' | sort --version-sort | tail --lines=2 | head -n 1 | sed 's/v//'",
         returnStdout: true
     ).trim()
     def comp_deploy_major = comp_deploy_tag.substring(0, comp_deploy_tag.indexOf('.'))
diff --git a/jjb/software-upgrades.yaml b/jjb/software-upgrades.yaml
index 1ee9f9f..acb9e0b 100644
--- a/jjb/software-upgrades.yaml
+++ b/jjb/software-upgrades.yaml
@@ -1,7 +1,29 @@
 ---
-# voltha 2.X tests
+
+# -----------------------------------------------------------------------
+# Copyright 2021-2024 Open Networking Foundation Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http:#www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2021-2024 Open Networking Foundation Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# Entropy: 0fcb5ffa-d1a4-11ee-be5e-9f44b7181764
+# -----------------------------------------------------------------------
+# Intent: voltha 2.X tests
 # oar image URLs that redirect away from oss to maven-central (?)
 # olt, dhcpl2relay, igmpproxy, kafka
+# -----------------------------------------------------------------------
 
 - project:
     name: software-upgrades
diff --git a/test/bats/check_repo_tags.bats b/test/bats/check_repo_tags.bats
new file mode 100755
index 0000000..d36ead1
--- /dev/null
+++ b/test/bats/check_repo_tags.bats
@@ -0,0 +1,170 @@
+#!/usr/bin/env bats
+# -----------------------------------------------------------------------
+# Copyright 2024 Open Networking Foundation Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http:#www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2024 Open Networking Foundation Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------#
+# Source: /sandbox/ci-management/jjb/pipeline/voltha/software-upgrades.groovy
+# -----------------------------------------------------------------------
+
+bats_require_minimum_version 1.5.0
+
+## -----------------------------------------------------------------------
+# This runs before each of the following tests are executed.
+## -----------------------------------------------------------------------
+setup() {
+    source './utils/check_repo_tags.sh'
+
+    declare -g components=()
+    components+=('voltha-docs')
+    components+=('voltha-onos')
+    components+=('voltha-openolt-adapter')
+    components+=('voltha-openonu-adapter-go')
+    components+=('voltha-lib-go')
+    components+=('voltha-protos')
+}
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+@test 'Validate comp_deploy_tag()' {
+
+    local component
+    for component in "${components[@]}";
+    do
+        ## --------------
+        ## Known problems
+        ## --------------
+        case "$component" in
+            voltha-docs)
+                # skip 'declare -a gerrit=([0]="2.12.35")'
+                continue
+                ;;
+            voltha-lib-go)
+                # skip 'declare -a gerrit=([0]="7.5.3")'
+                continue
+                ;;
+            voltha-onos)
+                # skip 'declare -a gerrit=([0]="2.11.0")'
+                continue
+                ;;
+            voltha-openolt-adapter)
+                # skip 'declare -a gerrit=([0]="4.4.10")'
+                continue
+                ;;
+            voltha-openonu-adapter-go)
+                # skip 'declare -a gerrit=([0]="2.12.0~beta")'
+                continue
+                ;;
+            voltha-protos)
+                # skip 'declare -a gerrit=([0]="5.4.11")'
+                continue
+                ;;
+        esac
+
+        # local component='voltha-openonu-adapter-go'
+        declare -a gerrit=()
+        gather_comp_deploy gerrit "http://gerrit.opencord.org/${component}"
+
+        declare -a github=()
+        gather_comp_deploy gerrit "http://github.com/opencord/${component}"
+
+        printf "\nCOMPONENT: %s\n" "$component" 1>&2
+        declare -p gerrit 1>&2
+        declare -p github 1>&2
+
+        ## Check for deltas
+        [[ "${gerrit[*]}" == "${github[@]}" ]]
+    done
+    
+    ## -----------------------------------------
+    ## Compare by size, filtered list is smaller
+    ## -----------------------------------------
+    [ true ]
+}
+
+## -----------------------------------------------------------------------
+## Intent: Compare tags between gerrit and github repositories
+## -----------------------------------------------------------------------
+@test 'Validate comp_test_tag()' {
+ 
+    local component
+    for component in "${components[@]}";
+    do
+        ## --------------
+        ## Known problems
+        ## --------------
+        case "$component" in
+            voltha-docs)
+                # skip "$component not mirrored on github"
+                continue
+                ;;
+            voltha-onos)
+                # skip "declare -a gerrit=([0]="2.12.0~beta")"
+                continue
+                ;;
+            voltha-lib-go)
+                # skip "declare -a gerrit=([0]="7.6.0")"
+                continue
+                ;;
+            voltha-openolt-adapter)
+                # skip "declare -a gerrit=([0]="4.4.11")"
+                continue
+                ;;
+            voltha-openonu-adapter-go)
+                # skip 'github repo lacks tag 2.12.0 (voltha-openonu-adapter-go)'
+                continue
+                ;;
+            voltha-protos)
+                # skip "declare -a gerrit=([0]="5.5.0")"
+                continue
+                ;;
+        esac
+
+        # local component='voltha-openonu-adapter-go'
+        declare -a gerrit=()
+        gather_comp_test gerrit "http://gerrit.opencord.org/${component}"
+
+        declare -a github=()
+        gather_comp_test gerrit "http://github.com/opencord/${component}"
+
+        printf "\nCOMPONENT: %s\n" "$component" 1>&2
+        declare -p gerrit 1>&2
+        declare -p github 1>&2
+
+        ## Check for deltas
+        [[ "${gerrit[*]}" == "${github[@]}" ]]
+    done
+}
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+@test 'todo()' {
+
+    cat <<EOM
+
+1) Compare repository branches and tags:
+   - Iterate over all repositories.
+   - Retrieve branches and tags from gerrit.
+   - Retrieve branches and tags from github.
+   - Compare contents for discrepancies.
+EOM
+
+    [ true ]
+}
+
+# [EOF]
diff --git a/test/bats/makefile b/test/bats/makefile
new file mode 100644
index 0000000..fa4fbe9
--- /dev/null
+++ b/test/bats/makefile
@@ -0,0 +1,77 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2024 Open Networking Foundation Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http:#www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2024 Open Networking Foundation Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# Intent: This test suite will validate repo:helm-repo-tools scripts
+# -----------------------------------------------------------------------
+
+null	:=#
+space	:=$(null) $(null)
+HIDE	?= @
+
+src = $(wildcard *.bats)
+bats := $(subst .bats,$(null),$(src))
+.PHONY: $(bats)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+all:
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: test
+test += test-bats
+test : $(test)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: test-bats
+test-bats : $(bats)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+$(bats) :
+	$(HIDE)./$@.bats
+
+## -----------------------------------------------------------------------
+## Intent: Display target help
+## -----------------------------------------------------------------------
+help ::
+	@echo 'Usage: $(MAKE) [options] [target] ...'
+	@printf '  %-33.33s %s\n' \
+	  'test' 'Launch available test suites'
+	@printf '  %-33.33s %s\n' 'test-bats' \
+	  'Launch available BATS shell test suites'
+
+	@echo
+	@echo '[TEST: by name]'
+	@$(MAKE) --no-print-directory help-bats
+
+	@echo
+	@echo '[HELP]'
+	@printf '  %-33.33s %s\n' 'help'      'Display target usage'
+	@printf '  %-33.33s %s\n' 'help-bats' 'Display a list of test suites'
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-bats := $(addprefix help--,$(bats))
+help-bats : $(help-bats)
+$(help-bats) :
+	@printf '  $(MAKE) %-33.33s %s\n' "$(lastword $(subst -,$(space),$@))" ''
+
+# [EOF]
diff --git a/test/bats/utils/check_repo_tags.sh b/test/bats/utils/check_repo_tags.sh
new file mode 100644
index 0000000..e1fed39
--- /dev/null
+++ b/test/bats/utils/check_repo_tags.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+# -----------------------------------------------------------------------
+# Copyright 2024 Open Networking Foundation Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http:#www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+# SPDX-FileCopyrightText: 2024 Open Networking Foundation Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------#
+# Source: /sandbox/ci-management/jjb/pipeline/voltha/software-upgrades.groovy
+# -----------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## Intent: Shell snippet from software-upgrades.groovy for testing
+## -----------------------------------------------------------------------
+function gather_comp_deploy()
+{
+    local -n ref=$1; shift
+    local url="$1"; shift
+
+    readarray -t buffer < <(git ls-remote --refs --tags "$url" \
+                                | cut --delimiter='/' --fields=3 \
+                                | tr '-' '~' \
+                                | sort --version-sort \
+                                | tail --lines=2 \
+                                | head -n 1 \
+                                | sed 's/v//' \
+                           )
+    ref=("${buffer[@]}")
+    return
+}
+
+## -----------------------------------------------------------------------
+## Intent: Shell snippet from software-upgrades.groovy for testing
+## -----------------------------------------------------------------------
+function gather_comp_test()
+{
+    local -n ref=$1; shift
+    local url="$1"; shift
+
+    readarray -t buffer < <(git ls-remote --refs --tags "$url" \
+                                | cut --delimiter='/' --fields=3 \
+                                | tr '-' '~' \
+                                | sort --version-sort \
+                                | tail --lines=1 \
+                                | sed 's/v//'
+                           )
+    ref=("${buffer[@]}")
+    return
+}
+
+: # ($?==0) for source script
+
+# [EOF]
