[VOL-5051] - Triage bbsim build

[VOL-5092] - verify_bbsim_unit-test repository failures in jenkins job history.

makefiles/*
-----------
  o Merge in latest library makefiles.
  o Some legacy retained:
      tools.mk => makefiles/docker/include.mk
      makefiles/lint/docker/*.mk (replace with docker/include.mk.new)

Makefile
--------
  o Remove bogus foobar target.
  o Target docs-lint now maps to library target lint-doc8.

docs/Makefile
-------------
  o venv install now handled by makefiles/virtualenv.mk
  o Replaced inlined doc8 lint target with makefiles/lint/doc8 (lint-doc8)
  o Use std defines for SHELL= and other constants.
  o Replace separator ';' with '&&' in commands using venv (detect errors).

config.mk
---------
  o Enable lint targets for doc8, docker & json.
  o More lint checks can be enabled but cleanup is needed first.

docs/Makefile
requirements.txt
----------------
  o Identified a few python module problems documented in VOL-5092.
  o Makefile wild target(%) matching stray dependencies so hardcode sphinx targets to act on.
  o Added hyphen/success to "make docs" until VOL-5092 can be straightened out.

Change-Id: Ibe4006747ee610bfe8ac0fdbb339e5e18e6e9176
diff --git a/.gitignore b/.gitignore
index 2e825d3..0d84d47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+# -*- makefile -*-
+
 .*.swp
 .idea
 /bbr
@@ -11,3 +13,14 @@
 .idea
 sca-report/
 .vscode
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# Virtual envs
+.venv/
+docs/.venv/
+
+# [EOF]
diff --git a/Makefile b/Makefile
index 0817e3b..2939732 100644
--- a/Makefile
+++ b/Makefile
@@ -20,14 +20,21 @@
 .DEFAULT_GOAL   := help
 MAKECMDGOALS    ?= help
 
-TOP     ?= .
-MAKEDIR ?= $(TOP)/makefiles
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+TOP ?=$(strip \
+  $(dir \
+    $(abspath $(lastword $(MAKEFILE_LIST)))\
+   )\
+)
 
 ##--------------------##
 ##---]  INCLUDES  [---##
 ##--------------------##
-include $(MAKEDIR)/include.mk
-include $(MAKEDIR)/release/include.mk
+include $(TOP)/config.mk
+include $(TOP)/makefiles/include.mk
+include $(ONF_MAKEDIR)/release/include.mk
 
 ##--------------------##
 ##---]  INCLUDES  [---##
@@ -88,32 +95,41 @@
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
 lint-mod:
+	$(call banner-enter,Target $@)
 	@echo "Running dependency check..."
 	@${GO} mod verify
 	@echo "Dependency check OK. Running vendor check..."
 	@git status > /dev/null
 	@git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Staged or modified files must be committed before running this test" && git status -- go.mod go.sum vendor && exit 1)
 	@[[ `git ls-files --exclude-standard --others go.mod go.sum vendor` == "" ]] || (echo "ERROR: Untracked files must be cleaned up before running this test" && git status -- go.mod go.sum vendor && exit 1)
-	${GO} mod tidy
-	${GO} mod vendor
+
+	$(HIDE)$(MAKE) --no-print-directory mod-update
+
 	@git status > /dev/null
 	@git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Modified files detected after running go mod tidy / go mod vendor" && git status -- go.mod go.sum vendor && git checkout -- go.mod go.sum vendor && exit 1)
 	@[[ `git ls-files --exclude-standard --others go.mod go.sum vendor` == "" ]] || (echo "ERROR: Untracked files detected after running go mod tidy / go mod vendor" && git status -- go.mod go.sum vendor && git checkout -- go.mod go.sum vendor && exit 1)
 	@echo "Vendor check OK."
+	$(call banner-enter,Target $@)
 
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
 lint: lint-mod lint-dockerfile
 
 ## -----------------------------------------------------------------------
+## Intent: Generate a static code analysis report
 ## -----------------------------------------------------------------------
+sca-report-dir := ./sca-report
+sca-report-xml := $(sca-report-dir)/sca-report.xml
 sca:
-	@$(RM) -r ./sca-report
-	@mkdir -p ./sca-report
+	$(call begin-enter,Target $@)
+	@$(RM) -r $(sca-report-dir)
+	@mkdir -p $(sca-report-dir)
 	@echo "Running static code analysis..."
-	@${GOLANGCI_LINT} run -vv --deadline=6m --out-format junit-xml ./... | tee ./sca-report/sca-report.xml
+	@${GOLANGCI_LINT} run -vv --deadline=6m --out-format junit-xml ./... \
+	  | tee ./sca-report/sca-report.xml
 	@echo ""
 	@echo "Static code analysis OK"
+	$(call begin-leave,Target $@)
 
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
@@ -129,60 +145,49 @@
 
 test-unit: clean local-omci-lib-go # @HELP Execute unit tests
 
-	@echo
-	@echo '** -----------------------------------------------------------------------'
-	@echo '** Target: $@'
-	@echo '** -----------------------------------------------------------------------'
+	$(call banner-enter,Target $@)
 
 	@mkdir -p $(dir $(results-out))
-#	@chmod -R 777 $(dir $(results-out))# dev-mode: local
-	@find $(dir $(results-out)) -print0 | xargs -0 ls -l
 
-	@echo
-	@echo "Running unit tests..."
-	@echo '-----------------------------------------------------------------------'
+	$(call banner,Running unit tests...)
+
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o+w $(dir $(results-out) $(results-out)))
 	set -euo pipefail \
 	&& ${GO} test -mod=vendor -bench=. -v \
 	  -coverprofile $(coverage-out) \
 	  -covermode count ./... \
 	  2>&1 | tee "$(results-out)"
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o-w $(dir $(results-out) $(results-out)))
 
-	@echo
-	@echo "Coverage report: junit"
-	@echo '-----------------------------------------------------------------------'
+	$(call banner,Coverage report: junit)
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o+w $(dir $(results-xml) $(results-xml)))
 	${GO_JUNIT_REPORT} < $(results-out) > $(results-xml)
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o-w $(dir $(results-xml) $(results-xml)))
 
-	@echo
-	@echo "Coverage report: Cobertura"
-	@echo '-----------------------------------------------------------------------'
+	$(call banner,Coverage report: Cobertura)
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o+w $(dir $(results-xml) $(coverage-xml)))
 	${GOCOVER_COBERTURA} < $(coverage-out) > $(coverage-xml)
+	$(if $(LOCAL_FIX_PERMS),\
+	    chmod o-w $(dir $(results-xml) $(coverage-xml)))	
+
+	$(call banner,Coverage report directory perms:)
 
 	@echo
-	@echo "Coverage report directory perms:"
-	@echo '-----------------------------------------------------------------------'
-	find $(dir $(results-out)) -print0 | xargs -0 ls -l
+	@/bin/ls -ld tests tests/results
 
 	@echo
-	@echo "Locally modified files (git status)"
-	@echo '-----------------------------------------------------------------------'
+	@find $(dir $(results-out)) -print0 | xargs -0 ls -l
+        # chown -R $$(id -u):$$(id -g) $(dir $(results-xml)
+
+	$(call banner,Locally modified files: git status)
 	git status
 
-# foobar:
-#	&& RETURN=$$? \
-	&& echo "** $@ will exit with status $$(declare -p RETURN)" \
-	&& echo \
-	&& echo "Coverage report: juni" \
-	&& ${GO_JUNIT_REPORT}   < $(results-out) > $(results-xml) \
-	&& echo \
-	&& echo "Coverage report: Cobertura" \
-	&& ${GOCOVER_COBERTURA} < $(coverage-out) > $(coverage-xml) \
-	&& echo \
-	&& echo "Coverage report directory perms:" \
-	&& find $(dir $(results-out)) -print0 | xargs -0 ls -l \
-	&& echo \
-	&& echo "List locally modified files" \
-	&& git status \
-	exit $$RETURN
+	$(call banner-leave,Target $@)
 
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
@@ -193,18 +198,6 @@
 	docker $(RM) -f bbsim
 
 ## -----------------------------------------------------------------------
-## Intgent: Update sources in the vendor/ directory.
-## Todo:
-##   o chicken-n-egg problem:
-##     - vendor/ is under revision control
-##     - go mod tidy will delete vendor
-##     - sandbox left unbuildable when mod-update target fails.
-## -----------------------------------------------------------------------
-mod-update: # @HELP Download the dependencies to the vendor folder
-	${GO} mod tidy
-	${GO} mod vendor
-
-## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
 docker-build: local-omci-lib-go local-protos# @HELP Build the BBSim docker container (contains BBSimCtl too)
 	docker build \
@@ -255,13 +248,17 @@
 ## -----------------------------------------------------------------------
 .PHONY: docs docs-lint
 docs: swagger # @HELP Generate docs and opens them in the browser
-	$(MAKE) -C docs html
+
+	$(call begin-enter,Target $@)
+	-$(MAKE) -C docs html
+	$(call begin-leave,Target $@)
+
 	@echo -e "\nBBSim documentation generated in file://${PWD}/docs/build/html/index.html"
 
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
 docs-lint:
-	$(MAKE) -C docs lint
+	$(MAKE) -C docs lint-doc8
 
 ## -----------------------------------------------------------------------
 ## -----------------------------------------------------------------------
@@ -304,6 +301,8 @@
 	@$(RM) $(results-out)
 	@$(RM) $(results-xml)
 
+	@$(RM) $(sca-report-xml)
+
 sterile :: clean
 
 ## -----------------------------------------------------------------------
@@ -379,6 +378,12 @@
 	  $<
 
 ## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+clean ::
+	$(RM) -r "docs/$(venv-name)"
+
+## -----------------------------------------------------------------------
 ## Intent: Helper target used to exercise release script changes
 ## -----------------------------------------------------------------------
 include $(MAKEDIR)/release/onf-publish.mk
diff --git a/VERSION b/VERSION
index 0dec25d..5f032e8 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.15.0-dev
\ No newline at end of file
+1.15.0-dev1
diff --git a/config.mk b/config.mk
new file mode 100644
index 0000000..3bfe158
--- /dev/null
+++ b/config.mk
@@ -0,0 +1,141 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefiles.include.version = 1.1
+# ONF.confg.mk                  = 1.6
+# -----------------------------------------------------------------------
+
+--repo-name-- := bbsim
+--repo-name-- ?= $(error --repo-name--= is required)
+
+##--------------------------------##
+##---]  Disable lint targets  [---##
+##--------------------------------##
+NO-LINT-DOC8          := true
+# NO-LINT-GOLANG      := true
+NO-LINT-GROOVY        := true#               # Note[1]
+NO-LINT-JJB           := true#               # Note[2]
+# NO-LINT-JSON        := true#               # Note[1]
+NO-LINT-MAKEFILE      := true#               # Note[1]
+NO-LINT-REUSE         := true                # License check
+NO-LINT-ROBOT         := true# 
+NO-LINT-SHELL         := true#               # Legacy syntax: update makefiles/lint then delete
+NO-LINT-SHELLCHECK    := true#               # Note[1]
+NO-LINT-TOX           := true#               # Note[1]
+NO-LINT-YAML          := true#               # Note[1]
+
+# NO-LINT-FLAKE8      := true#               # Note[1]
+NO-LINT-PYTHON        := true#               # Note[1]
+# NO-LINT-PYLINT      := true#               # Note[1]
+
+# Note[1] - A boatload of source to cleanup prior to enable.
+# Note[2] - No sources available
+
+##---------------------------------##
+##---] Conditional make logic  [---##
+##---------------------------------##
+# USE-ONF-DOCKER-MK      := true
+# USE-ONF-GERRIT-MK      := true
+# USE-ONF-GIT-MK         := true
+# USE-ONF-JJB-MK         := true
+# USE-VOLTHA-RELEASE-MK  := true
+
+##----------------------##
+##---]  Debug Mode  [---##
+##----------------------##
+# export DEBUG           := 1      # makefile debug
+# export DISTUTILS_DEBUG := 1      # verbose: pip
+# export DOCKER_DEBUG    := 1      # verbose: docker
+# export VERBOSE         := 1      # makefile debug
+
+##-----------------------------------##
+##---]  JJB/Jenkins Job Builder  [---##
+##-----------------------------------##
+JJB_VERSION   ?= 2.8.0
+JOBCONFIG_DIR ?= job-configs
+
+##---------------------------------##
+##---]  Filesystem exclusions  [---##
+##---------------------------------##
+onf-excl-dirs := $(null)        # make clean: dirs=
+onf-excl-dirs += .venv#         # $(venv-name)
+onf-excl-dirs += vendor#        # golang / voltha*-go
+onf-excl-dirs += patches#       # voltha docs - python upgrade
+onf-excl-dirs += .tox           # also a python dependency
+
+ifeq ($(--repo-name--),voltha-docs)
+  lint-doc8-excl += '_build'
+endif
+
+onf-excl-dirs ?= $(error onf-excl-dirs= is required)
+
+##-----------------------------##
+##---]  Feature Detection  [---##
+##-----------------------------##
+# [TODO] include makefiles/features/include.mk
+# [TODO] All logic below can migrate there.
+
+$(if $(filter %ci-management,$(--repo-name--)),\
+  $(eval --REPO-IS-CI-MANAGEMENT-- := true)\
+)
+$(if $(filter %voltha-docs,$(--repo-name--)),\
+  $(eval --REPO-IS-VOLTHA-DOCS-- := true)\
+)
+
+# create makefiles/config/byrepo/{--repo-name--}.mk for one-off snowflakes ?
+# $(if $(wildcard docker),$(eval USE-ONF-DOCKER-MK := true))
+
+##-------------------------##
+##---]  Derived Flags  [---##
+##-------------------------##
+ifdef --REPO-IS-CI-MANAGEMENT--
+  USE-ONF-JJB := true
+
+  onf-excl-dirs += global-jjb
+  onf-excl-dirs += lf-ansible
+  onf-excl-dirs += packer
+endif
+
+ifdef --REPO-IS-VOLTHA-DOCS--
+  onf-excl-dirs += _build
+  onf-excl-dirs += repos
+endif
+
+ifdef NO-LINT-PYTHON
+  NO-LINT-FLAKE8 := true
+  NO-LINT-PYLINT := true
+endif
+
+ifndef USE-ONF-JJB
+  NO-LINT-JJB := true
+endif
+
+onf-excl-dirs := $(sort $(strip $(onf-excl-dirs)))
+
+# [TODO]#
+#  --------------------------------------------------------------------
+#   o two distinct makefiles/ directories are needed, one for onf-make
+#   o second for repository specific makefile configs and logic.
+#   o Two independent vars specify path:
+#       ONF_MAKEDIR = library makefiles
+#       MAKEDIR     = repository specific content
+#   o Conditional repository testing above can crush down all the
+#     "if-this-repository-is-X-do-Y' logic above intoL
+#     include $(MAKEDIR)/config.mk   # repo:$(--repo-name--)
+#  --------------------------------------------------------------------
+
+# [EOF]
diff --git a/docs/Makefile b/docs/Makefile
index a2df413..255abff 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,7 +1,39 @@
-# Minimal makefile for Sphinx documentation
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
 
-# use bash safe mode, fail quickly
-SHELL = bash -e -o pipefail
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+TOP-docs ?=$(strip \
+  $(dir \
+    $(abspath $(lastword $(MAKEFILE_LIST)))\
+   )\
+)
+TOP-docs := $(subst /docs/,$(null),$(TOP-docs))
+
+##--------------------##
+##---]  INCLUDES  [---##
+##--------------------##
+include $(TOP-docs)/config.mk
+include $(TOP-docs)/makefiles/include.mk
+
+# Minimal makefile for Sphinx documentation
 
 # You can set these variables from the command line.
 SPHINXOPTS    =
@@ -11,29 +43,28 @@
 
 .PHONY: help Makefile lint
 
-# Put it first so that "make" without argument is like "make help".
-help: doc_venv
-	source $</bin/activate ; set -u ;\
-	$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+clean ::
+	$(RM) -r build "$(venv-name)"
 
-doc_venv:
-	virtualenv -p python3 $@ ;\
-	source $@/bin/activate ;\
-	pip install -r requirements.txt
+## -----------------------------------------------------------------------
+## Intent: Display target help
+## -----------------------------------------------------------------------
+help :: $(venv-activate-script)
+	$(activate) \
+	  && $(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
 
-lint: doc8
-
-doc8: doc_venv
-	source $</bin/activate ; set -u ;\
-	doc8 --max-line-length 119 \
-	     $$(find . -name \*.rst ! -path "*doc_venv*")
-
-clean:
-	rm -rf doc_venv build
-
+# -----------------------------------------------------------------------
 # Catch-all target: route all unknown targets to Sphinx using the new
 # "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: doc_venv Makefile
-	source $</bin/activate ; set -u ;\
-	$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+# -----------------------------------------------------------------------
+docs-targets += html
 
+$(docs-targets) : $(venv-activate-script) Makefile
+	$(call banner-enter,Target $@)
+	$(activate) \
+	  && $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+	$(call banner-leave,Target $@)
+
+# [EOF]
diff --git a/docs/requirements.txt b/docs/requirements.txt
index fd70c42..11c9bf4 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,3 +1,5 @@
+# -*- makefile -*-
+
 Sphinx~=2.4.4
 actdiag~=2.0.0
 blockdiag~=1.5.4
@@ -18,3 +20,10 @@
 # funcparserlib=~0.3.5
 # ----------------------------------------------------------------
 funcparserlib~=1.0.0a0
+
+# ----------------------------------------------------------------
+# ImportError: cannot import name 'environmentfilter' from 'jinja2
+# ----------------------------------------------------------------
+Jinja2<3.1
+
+# [EOF]
diff --git a/docs/swagger/bbsim/bbsim.swagger.json b/docs/swagger/bbsim/bbsim.swagger.json
index 30a1023..dd5f9c3 100644
--- a/docs/swagger/bbsim/bbsim.swagger.json
+++ b/docs/swagger/bbsim/bbsim.swagger.json
@@ -100,48 +100,6 @@
         ]
       }
     },
-    "/v1/olt/onus/{OnuSerialNumber}/{UniID}/igmp/{SubActionVal}/{GroupAddress}/{VLAN}": {
-      "post": {
-        "summary": "Change IGMP state",
-        "operationId": "ChangeIgmpState",
-        "responses": {
-          "200": {
-            "description": "A successful response.",
-            "schema": {
-              "$ref": "#/definitions/bbsimResponse"
-            }
-          }
-        },
-        "parameters": [
-          {
-            "name": "OnuReq.SerialNumber",
-            "in": "path",
-            "required": true,
-            "type": "string"
-          },
-          {
-            "name": "SubActionVal",
-            "in": "path",
-            "required": true,
-            "type": "string",
-            "enum": [
-              "JOIN",
-              "LEAVE",
-              "JOINV3"
-            ]
-          },
-          {
-            "name": "GroupAddress",
-            "in": "path",
-            "required": true,
-            "type": "string"
-          }
-        ],
-        "tags": [
-          "BBSim"
-        ]
-      }
-    },
     "/v1/olt/onus/{OnuSerialNumber}/dhcp": {
       "post": {
         "summary": "Restart DHCP for ONU",
@@ -192,6 +150,62 @@
         ]
       }
     },
+    "/v1/olt/onus/{OnuSerialNumber}/{UniID}/igmp/{SubActionVal}/{GroupAddress}/{VLAN}": {
+      "post": {
+        "summary": "Change IGMP state",
+        "operationId": "ChangeIgmpState",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimResponse"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "OnuSerialNumber",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "UniID",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "SubActionVal",
+            "in": "path",
+            "required": true,
+            "type": "string",
+            "enum": [
+              "JOIN",
+              "LEAVE",
+              "JOINV3"
+            ]
+          },
+          {
+            "name": "GroupAddress",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "VLAN",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "BBSim"
+        ]
+      }
+    },
     "/v1/olt/onus/{SerialNumber}": {
       "get": {
         "summary": "Get status of an ONU by serial number",
@@ -598,14 +612,6 @@
         }
       }
     },
-    "bbsimONURequest": {
-      "type": "object",
-      "properties": {
-        "SerialNumber": {
-          "type": "string"
-        }
-      }
-    },
     "bbsimONUTrafficSchedulers": {
       "type": "object",
       "properties": {
diff --git a/internal/bbsim/responders/sadis/dp.txt b/internal/bbsim/responders/sadis/dp.txt
index e75501e..858b336 100644
--- a/internal/bbsim/responders/sadis/dp.txt
+++ b/internal/bbsim/responders/sadis/dp.txt
@@ -41,4 +41,4 @@
               }
 
           ]
-      }
\ No newline at end of file
+      }
diff --git a/makefiles/bootstrap.mk b/makefiles/bootstrap.mk
new file mode 100644
index 0000000..eec469b
--- /dev/null
+++ b/makefiles/bootstrap.mk
@@ -0,0 +1,80 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Intent: Dependency-free macros used to source library makefiles
+#         and define the build environment.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG-bootstrap_mk),$(warning ENTER))
+
+##---------------------##
+##---]  CONSTANTS  [---##
+##---------------------##
+is-false = $(if $(1),true,$(null))
+is-true  = $(if $(1),$(null),true)
+
+##--------------------------##
+##---]  LIBRARY MACROS  [---##
+##--------------------------##
+is-null = $(if $(1),$(null),$(error $(1)= is undef))
+# is-null-var = $(if $($(1)),$(null),$(error $(1)= is undef))
+
+## [origin]
+## foreach: var=automatic, origin=undef
+is-null-var-orig = $(strip \
+  $(foreach varname,$(1),\
+      $(warning ** is-null-var: varname=$(varname), origin=$(origin 1), origin=$(origin var))\
+  )\
+)
+#  $(if $(1),$(call is-null-var-indirect,$($(1))),$(error $(1)= is undef)))\
+
+is-null-var-indirect = $(if $(1),$(null),$(error $(1)= is undef))
+
+# origin - undefned
+# default
+# environment
+# environment override
+# automatic
+# null(blah) ?   - true
+
+## -----------------------------------------------------------------------
+## Intent: Given an indirect var containing varname of a makefile *_ROOT
+##         parent director, derive a *_MKDIR variable and conditionally
+##         include the makefile hierarchy.
+## -----------------------------------------------------------------------
+## Given:
+##   o var containing OPT_ROOT=path
+## Return:
+##   o OPT_MKDIR=$(OPT_ROOT)/makefiles
+##   o If exists include $(OPT_MKDIR)/include.mk
+## -----------------------------------------------------------------------
+# library-include   := $(call mk-library-include,blah)
+
+mk-library-include=$(strip \
+  $(warning mk-library-include: $$1[$(1)] = [$($(1))]))\
+  $(call is-null-var,1)\
+  $(foreach var,$($(1)),\
+    $(info var=$(var) is-null=$(call is-null-var,var))\
+  $(foreach val,$$(var),\
+    $(info val=$(val))\
+    $(foreach makedir,$(subst _ROOT,_MKDIR,$(var)),\
+$(warning makedir=$(makedir))\
+)\
+)\
+)\
+)
+
+
+# $(warning makedir=$(makedir))\
+      $(if $($(makedir)),$(null),\
+        $(eval $(makedir)=$$$$($(var))/makefiles)\
+$(warning $(makedir) = $($($(makedir))))\
+$(info $$(wildcard $(val)/makefiles/include.mk) = $(wildcard $(val)/makefiles/include.mk))\
+        $(foreach mf,$(wildcard $(wildcard $(val)/makefiles/include.mk)),\
+$(warning $$(eval include $(mf)))\
+          $(eval include $(mf)))\
+))))\
+)
+
+$(if $(DEBUG-bootstrap_mk),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/commands/include.mk b/makefiles/commands/include.mk
new file mode 100644
index 0000000..01fa145
--- /dev/null
+++ b/makefiles/commands/include.mk
@@ -0,0 +1,36 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.0
+# -----------------------------------------------------------------------
+
+ifndef mk-include--onf-commands
+
+$(if $(DEBUG),$(warning ENTER))
+
+include $(ONF_MAKEDIR)/commands/kail.mk
+
+$(if $(DEBUG),$(warning LEAVE))
+
+mk-include--onf-commands := true
+
+endif # mk-include--onf-make
+
+# [EOF]
diff --git a/makefiles/commands/kail.mk b/makefiles/commands/kail.mk
new file mode 100644
index 0000000..ff6691d
--- /dev/null
+++ b/makefiles/commands/kail.mk
@@ -0,0 +1,46 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+MAKEDIR ?= $(error MAKEDIR= is required)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help::
+	@echo "  kail            Install the kail command"
+ifdef VERBOSE
+	@echo "                  make kail KAIL_PATH="
+endif
+
+# -----------------------------------------------------------------------
+# Install the 'kail' tool if needed: https://github.com/boz/kail
+#   o WORKSPACE - jenkins aware
+#   o Default to /usr/local/bin/kail
+#       + revisit this, system directories should not be a default path.
+#       + requires sudo and potential exists for overwrite conflict.
+# -----------------------------------------------------------------------
+KAIL_PATH ?= $(if $(WORKSPACE),$(WORKSPACE)/bin,/usr/local/bin)
+kail-cmd  ?= $(KAIL_PATH)/kail
+$(kail-cmd):
+	etc/godownloader.sh -b .
+	rsync -v --checksum kail "$@"
+	$@ version
+	$(RM) kail
+
+.PHONY: kail
+kail : $(kail-cmd)
+
+# [EOF]
diff --git a/makefiles/consts.mk b/makefiles/consts.mk
index 941df38..f1f717f 100644
--- a/makefiles/consts.mk
+++ b/makefiles/consts.mk
@@ -17,6 +17,7 @@
 # SPDX-FileCopyrightText: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 # SPDX-License-Identifier: Apache-2.0
 # -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
 # ONF.makefile.version = 1.0
 # -----------------------------------------------------------------------
 
@@ -26,15 +27,26 @@
 export dot          :=.
 export null         :=#
 export space        := $(null) $(null)
-export quote-single := $(null)'$(null)# colorization-closing-quote(')
-export quote-double := $(null)"$(null)# colorization-closing-quote(")
+export quote-single := $(null)'$(null)#'
+export quote-double := $(null)"$(null)#"
 
 # [DEBUG] make {target} HIDE=
-HIDE        ?= @
+HIDE           ?= @
 
 env-clean      ?= /usr/bin/env --ignore-environment
-xargs-n1       := xargs -0 -t -n1 --no-run-if-empty
-xargs-n1-clean := $(env-clean) $(xargs-n1)
+
+xargs-cmd       := xargs -0 -t --no-run-if-empty
+xargs-n1        := $(xargs-cmd) -n1
+xargs-n1-clean  := $(env-clean) $(xargs-n1)
+xargs-cmd-clean := $(env-clean) $(xargs-cmd)
+
+## -----------------------------------------------------------------------
+## Intent: NOP command for targets whose dependencies do all heavy lifting
+## -----------------------------------------------------------------------
+## usage: foo bar tans
+## <tab>$(nop-command)
+## -----------------------------------------------------------------------
+nop-cmd        := :
 
 ## -----------------------------------------------------------------------
 ## Default shell:
diff --git a/makefiles/docker/include.mk b/makefiles/docker/include.mk
new file mode 100644
index 0000000..0e53629
--- /dev/null
+++ b/makefiles/docker/include.mk
@@ -0,0 +1,70 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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.d
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+VOLTHA_TOOLS_VERSION ?= 2.4.0
+
+# ---------------------------
+# Macros: command refactoring
+# ---------------------------
+docker-iam     ?= --user $$(id -u):$$(id -g)#          # override for local use
+docker-run     = docker run --rm $(docker-iam)#        # Docker command stem
+docker-run-is  = $(docker-run) $(is-stdin)             # Attach streams when interactive
+docker-run-app = $(docker-run-is) -v ${CURDIR}:/app#   # w/filesystem mount
+
+# -----------------------------------------------------------------------
+# --interactive: Attach streams when stdout (fh==0) defined
+# --tty        : Always create a pseudo-tty else jenkins:docker is silent
+# -----------------------------------------------------------------------
+is-stdin       = $(shell test -t 0 && { echo '--interactive'; })
+is-stdin       += --tty
+
+voltha-protos-v5 ?= /go/src/github.com/opencord/voltha-protos/v5
+
+# Docker volume mounts: container:/app/release <=> localhost:{pwd}/release
+vee-golang     = -v gocache-${VOLTHA_TOOLS_VERSION}:/go/pkg
+vee-citools    = voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}
+
+# ---------------
+# Tool Containers
+# ---------------
+docker-go-stem = $(docker-run-app) -v gocache:/.cache $(vee-golang) $(vee-citools)-golang
+
+# Usage: GO := $(call get-docker-go,./my.env.temp)
+get-docker-go = $(docker-go-stem) go
+GO            ?= $(call get-docker-go)
+
+# Usage: GO_SH := $(call get-docker-go-sh,./my.env.temp)
+get-docker-go-sh = $(docker-go-stem) $(if $(1),--env-file $(1)) sh -c
+GO_SH            ?= $(call get-docker-go-sh,./my.env.temp)
+
+# Usage: PROTOC := $(call get-docker-protoc)
+get-docker-protoc = $(docker-run-app) $(vee-citools)-protoc protoc
+PROTOC            ?= $(call get-docker-protoc)
+
+# get-docker-protoc-sh = $(strip )
+PROTOC_SH = $(docker-run-is)
+ifdef voltha-protos-v5
+   PROTOC_SH += -v ${CURDIR}:$(voltha-protos-v5)
+   PROTOC_SH += --workdir=$(voltha-protos-v5)
+endif
+PROTOC_SH += $(vee-citools)-protoc sh -c
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/etc/include.mk b/makefiles/etc/include.mk
new file mode 100644
index 0000000..10711f7
--- /dev/null
+++ b/makefiles/etc/include.mk
@@ -0,0 +1,56 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# Usage:
+#
+# mytarget:
+#     $(call banner-enter,target $@)
+#     @echo "Hello World"
+#     $(call banner-leave,target $@)
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+target-banner = ** ---------------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## Intent: Return a command line able to display a banner hilighting
+##         make target processing within a logfile.
+## -----------------------------------------------------------------------
+banner-enter=\
+    @echo -e \
+    "\n"\
+    "$(target-banner)\n"\
+    "** $(MAKE) ENTER: $(1)\n"\
+    "$(target-banner)"
+
+banner-leave=\
+    @echo -e "** $(MAKE) LEAVE: $(1)"
+
+## Usage:
+##    $(call banner,(message containing multiple tokens))
+banner=\
+    @echo -e \
+    "\n"\
+    "** $(1)\n"\
+    "$(target-banner)"\
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/etc/todo.mk b/makefiles/etc/todo.mk
new file mode 100644
index 0000000..31fc736
--- /dev/null
+++ b/makefiles/etc/todo.mk
@@ -0,0 +1,21 @@
+## -----------------------------------------------------------------------
+## Intent: Cast value into a boolean string.
+## NOTE: : Careful with line comment placement, when octolthorp is indented
+##         in a makefile return value will have whitespace appended.
+## -----------------------------------------------------------------------
+boolean = $(if $(strip $($(1))),false,true)# trailing whitespace is bad here
+
+## -----------------------------------------------------------------------
+## Intet: Negate input value for conditional use.
+##   Return success when input value is null.
+## Usage:
+##   $(info ** defined[true]  = $(call not,value))
+##   $(info ** defined[false] = $(call not,$(null)))
+##   $(if $(call not,varname),$(error varname= is not set))
+## -----------------------------------------------------------------------
+not = $(strip \
+  $(foreach true-false\
+    ,$(info true-false=$(true-false))$(strip $(call boolean,$(1)))\
+      $(subst true,$(null),$(true-false))\
+  )\
+)
diff --git a/makefiles/golang/include.mk b/makefiles/golang/include.mk
new file mode 100644
index 0000000..1ce3d7f
--- /dev/null
+++ b/makefiles/golang/include.mk
@@ -0,0 +1,26 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2023 Open Networking Foundation (ONF) and the ONF 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: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefiles.include.version = 1.1
+# -----------------------------------------------------------------------
+
+include $(ONF_MAKEDIR)/golang/mod-update.mk
+
+# [EOF]
diff --git a/makefiles/golang/mod-update.mk b/makefiles/golang/mod-update.mk
new file mode 100644
index 0000000..5212a47
--- /dev/null
+++ b/makefiles/golang/mod-update.mk
@@ -0,0 +1,60 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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: 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefiles.include.version = 1.1
+# -----------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+## if dev-mode: make LOCAL_FIX_PERMS=1 mod-update
+.PHONY: mod-update
+mod-update: mod-tidy mod-vendor
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-tidy
+mod-tidy :
+	$(call banner-enter,Target $@)
+	${GO} mod tidy
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-vendor
+mod-vendor : mod-tidy
+mod-vendor :
+	$(call banner-enter,Target $@)
+	$(if $(LOCAL_FIX_PERMS),chmod o+w $(CURDIR))
+	${GO} mod vendor
+	$(if $(LOCAL_FIX_PERMS),chmod o-w $(CURDIR))
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo '  mod-update             mod-tidy & mod-update'
+	@echo '  mod-tidy               go mod tidy'
+	@echo '  mod-vendor             go mod vendor'
+
+  ifdef VERBOSE
+	@echo '    LOCAL_FIX_PERMS=1    Local hack to fix docker uid/gid volume problem'
+  endif
+
+# [EOF]
diff --git a/makefiles/help/header.mk b/makefiles/help/header.mk
new file mode 100644
index 0000000..021ac0d
--- /dev/null
+++ b/makefiles/help/header.mk
@@ -0,0 +1,6 @@
+# -*- makefile -*-
+
+help :
+	@echo "Usage: make [options] [target] ..."
+	@echo "Targets:"
+	@echo "  help                        This message"
diff --git a/makefiles/help/include.mk b/makefiles/help/include.mk
new file mode 100644
index 0000000..01efdc1
--- /dev/null
+++ b/makefiles/help/include.mk
@@ -0,0 +1,114 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: help help-summary help-simple help-verbose
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+
+## -----------------------------------------------------------------------
+## Intent: Render topic/tool based makefile help
+## -----------------------------------------------------------------------
+## Three targets are used to render conditional makefile help
+##    help-summary      A one-line target summary for the topic
+##    help-simple       Common targets for the topic (lint-helm, build, test)
+##    help-verbose      Exhaustive display of supported targets
+## -----------------------------------------------------------------------
+## [COOKBOOK]
+##   help colon-colon   All 'help' targets are evaluated for 'make help'
+##   help-banner        Display a usage banner for help
+##   help-summary       Display all one-line topic summary help
+##     [conditonal]
+##   help-simple        Display all common topic makefile targets.
+##   help-verbose       Exhaustive display of makefile target help.
+##     VERBOSE=
+## -----------------------------------------------------------------------
+## [See Also] makefiles/gerrit/{include.mk, help.mk}
+##   help-gerrit        Summary targets can always be used to display topic help
+##   help-verbose       Exhaustive gerrit target display.
+## -----------------------------------------------------------------------
+help :: help-banner help-summary
+
+## -----------------------------------------------------------------------
+## Intent: Display a usage banner for help.  Target will be evaluated
+##         before all other help display.
+## -----------------------------------------------------------------------
+help-banner:
+	@echo "Usage: $(MAKE) [options] [target] ..."
+
+## -----------------------------------------------------------------------
+## Intent: Display extended help.
+## -----------------------------------------------------------------------
+## Question:
+##   o Help display can be long based on volume of targets.
+##   o Should a 3rd case be added to display:
+##      - help-simple (one-liner help) by default
+##      - conditional display of extended help:
+##          - help-simple or help-verbose
+##   o Current logic displays extended help by default.
+## -----------------------------------------------------------------------
+## Usage: see makefiles/targets/test.mk
+##    test-verbose += help-check#      # append help target to help-verbose
+## -----------------------------------------------------------------------
+ifdef VERBOSE
+  help-verbose += help-verbose
+  help :: $(help-verbose)
+else
+  help :: help-simple
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Display context specific help for named targets.
+## -----------------------------------------------------------------------
+## [TODO] Display a list of help-* tokens for target specific content:
+##    % make help-check
+##    % make help-test
+## -----------------------------------------------------------------------
+## [TODO] Define LEVEL= or helper targets (help-lint-{level})
+##        for extended help w/o information overload
+##    [0] help               # make help
+##    [1] help-lint          # make help-verbose or (VERBOSE=1)
+##    [2] help-lint-shell    # make help-lint VERBOSE=1  (??)
+##    [2] help-lint-yaml
+## -----------------------------------------------------------------------
+help-index ::
+	@echo
+	@echo '[HELP] - An index of help context for common targets'
+	@echo '  help-index          This message'
+	$(HIDE)\
+  for name in $(sort $(help-verbose)); do\
+    echo "  $$name";\
+  done
+
+## -----------------------------------------------------------------------
+## Intent: Display simple extended target help
+## -----------------------------------------------------------------------
+help-simple :: help-index
+	@echo
+	@echo '[VIEW]'
+	@echo '  reload              Setup to auto-reload sphinx doc changes in browser'
+	@echo '  view-html           View generated documentation'
+	@echo
+	@echo '[TEST]'
+	@echo "  test                $(MAKE) lint linkcheck"
+	@echo "  test-all            $(MAKE) all-generation-targets"
+
+# [EOF]
diff --git a/makefiles/help/trailer.mk b/makefiles/help/trailer.mk
new file mode 100644
index 0000000..8fcdfa6
--- /dev/null
+++ b/makefiles/help/trailer.mk
@@ -0,0 +1,42 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+# include this makefile late so text will be displayed at the end6
+
+help ::
+	@echo
+	@echo '[CLEAN]'
+	@echo '  clean               Remove generated targets'
+	@echo '  sterile             clean + remove virtual env interpreter install'
+
+help ::
+	@echo
+	@echo '[HELP]'
+	@echo '  help                Display program help'
+	@echo '  help-verbose        Display additional targets and help'
+
+## -----------------------------------------------------------------------
+# repo::voltha-docs -- patch logic not deployed everywhere.
+## -----------------------------------------------------------------------
+# help ::
+#	@echo
+#	@echo '[NOTE: python 3.10+]'
+#	@echo '  The interpreter is not yet fully supported across foreign repositories.'
+#	@echo '  While working locally, if make fails to build a target try:'
+#	@echo '      $(MAKE) $${target} NO_OTHER_REPO_DOCS=1'
+
+# [EOF]
diff --git a/makefiles/help/variables.mk b/makefiles/help/variables.mk
new file mode 100644
index 0000000..a22b179
--- /dev/null
+++ b/makefiles/help/variables.mk
@@ -0,0 +1,36 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+# Include variables.mk after library makefiles have been included
+
+ifdef VERBOSE
+  help :: help-variables
+else
+  help ::
+	@echo
+	@echo '[VARIABLES] - Conditional makefile behavior'
+	@echo '  see also: help-variables'
+endif
+
+help-variables:
+	@echo
+	@echo '[VARIABLES] - Conditional makefile behavior'
+	@echo '  NO_PATCHES=           Do not apply patches to the python virtualenv'
+	@echo '  NO_OTHER_REPO_DOCS=   No foreign repos, only apply target to local sources.'
+	@echo '  VERBOSE=              Display extended help topics'
+
+# [EOF]
diff --git a/makefiles/include.mk b/makefiles/include.mk
index 1255f45..6b5283d 100644
--- a/makefiles/include.mk
+++ b/makefiles/include.mk
@@ -20,18 +20,44 @@
 
 $(if $(DEBUG),$(warning ENTER))
 
-MAKEDIR ?= $(error MAKEDIR= is required)
-
 ## -----------------------------------------------------------------------
+## Define vars based on relative import (normalize symlinks)
+## Usage: include makefiles/onf/include.mk
 ## -----------------------------------------------------------------------
-help::
-	@echo "USAGE: $(MAKE) [options] [target] ..."
-        # @echo "  test                          Sanity check chart versions"
+onf-mk-abs    ?= $(abspath $(lastword $(MAKEFILE_LIST)))
+onf-mk-top    := $(subst /include.mk,$(null),$(onf-mk-abs))
+ONF_MAKEDIR   := $(onf-mk-top)
 
-include $(MAKEDIR)/consts.mk
-include $(MAKEDIR)/commands.mk
-include $(MAKEDIR)/todo.mk
-include $(MAKEDIR)/lint/include.mk
+MAKEDIR ?= $(ONF_MAKEDIR)#                   # Two dirs needed, local and common
+
+include $(ONF_MAKEDIR)/consts.mk
+include $(ONF_MAKEDIR)/help/include.mk       # render target help
+include $(ONF_MAKEDIR)/utils/include.mk      # dependency-less helper macros
+include $(ONF_MAKEDIR)/etc/include.mk        # banner macros
+
+include $(ONF_MAKEDIR)/virtualenv.mk#        # lint-{jjb,python} depends on venv
+
+include $(ONF_MAKEDIR)/lint/include.mk
+
+# include $(ONF_MAKEDIR)/git-submodules.mk
+# include $(ONF_MAKEDIR)/gerrit/include.mk
+include $(ONF_MAKEDIR)/golang/include.mk
+
+include $(ONF_MAKEDIR)/todo.mk
+include $(ONF_MAKEDIR)/help/variables.mk
+
+##---------------------##
+##---]  ON_DEMAND  [---##
+##---------------------##
+$(if $(USE_DOCKER_MK),$(eval $(ONF_MAKEDIR)/docker/include.mk))
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+include $(ONF_MAKEDIR)/targets/clean.mk
+# include $(ONF_MAKEDIR)/targets/check.mk
+include $(ONF_MAKEDIR)/targets/sterile.mk
+# include $(ONF_MAKEDIR)/targets/test.mk
 
 $(if $(DEBUG),$(warning LEAVE))
 
diff --git a/makefiles/lint/README b/makefiles/lint/README
new file mode 100644
index 0000000..4ff0236
--- /dev/null
+++ b/makefiles/lint/README
@@ -0,0 +1 @@
+Merge and replace makefiles/lint/docker/ with repo:onf-make/makefiles/lint/docker
diff --git a/makefiles/lint/doc8/excl.mk b/makefiles/lint/doc8/excl.mk
new file mode 100644
index 0000000..deb3f63
--- /dev/null
+++ b/makefiles/lint/doc8/excl.mk
@@ -0,0 +1,47 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2022 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+
+## excl := $(wildcar */*/.git)
+lint-doc8-excl-raw += '$(venv-name)'
+lint-doc8-excl-raw += '*/$(venv-name)'
+$(if $(BUILDDIR),\
+  $(excl lint-doc8-excl-raw += '$(BUILDDIR)'))
+
+# YUCK! -- overhead
+#   o Submodule(s) use individual/variant virtualenv install paths.
+#   o Exclude special snowflakes to enable library makefile use.
+#   o All can use virtualenv.mk for consistent names and cleanup
+#   o [TODO] Ignore submodules, individual repos should check their sources.
+
+lint-doc8-excl-raw += '*/venv_cord'
+
+lint-doc8-excl-raw += './cord-tester'
+lint-doc8-excl-raw += './repos/cord-tester'
+
+lint-doc8-excl-raw += './bbsim/internal/bbsim/responders/sadis/dp.txt'
+lint-doc8-excl-raw += './repos/bbsim/internal/bbsim/responders/sadis/dp.txt'
+lint-doc8-excl-raw += './repos/voltha-helm-charts/voltha-infra/templates/NOTES.txt'
+lint-doc8-excl-raw += './voltha-helm-charts/voltha-infra/templates/NOTES.txt'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/lint/doc8/include.mk b/makefiles/lint/doc8/include.mk
new file mode 100644
index 0000000..d0263af
--- /dev/null
+++ b/makefiles/lint/doc8/include.mk
@@ -0,0 +1,67 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2022 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-doc8 lint-doc8-all lint-doc8-modified
+
+have-rst-files := $(if $(strip $(RST_SOURCE)),true)
+RST_SOURCE     ?= $(error RST_SOURCE= is required)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+ifndef NO-LINT-DOC8
+  lint-doc8-mode := $(if $(have-doc8-files),modified,all)
+  lint : lint-doc8-$(lint-doc8-mode)
+endif# NO-LINT-DOC8
+
+# Consistent targets across lint makefiles
+lint-doc8-all      : lint-doc8
+lint-doc8-modified : lint-doc8
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+include $(MAKEDIR)/lint/doc8/excl.mk
+
+ifdef lint-doc8-excl
+  lint-doc8-excl-args += $(addprefix --ignore-path$(space),$(lint-doc8-excl))
+endif
+lint-doc8-excl-args += $(addprefix --ignore-path$(space),$(lint-doc8-excl-raw))
+
+lint-doc8-args += --max-line-length 120
+
+lint-doc8: $(venv-activate-script)
+	@echo
+	@echo '** -----------------------------------------------------------------------'
+	@echo '** doc8 *.rst syntax checking'
+	@echo '** -----------------------------------------------------------------------'
+	$(activate) && doc8 --version
+	@echo
+	$(activate) && doc8 $(lint-doc8-excl-args) $(lint-doc8-args) .
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
+help::
+	@echo '  lint-doc8          Syntax check python using the doc8 command'
+  ifdef VERBOSE
+	@echo '  lint-doc8-all       doc8 checking: exhaustive'
+	@echo '  lint-doc8-modified  doc8 checking: only modified'
+  endif
+
+# [EOF]
diff --git a/makefiles/lint/groovy/README.md b/makefiles/lint/groovy/README.md
new file mode 100644
index 0000000..aa9b41a
--- /dev/null
+++ b/makefiles/lint/groovy/README.md
@@ -0,0 +1,13 @@
+# lint: groovy source
+
+# Invoke the linting tool
+% make lint-groovy
+
+# Alt checking: groovy interpreter
+
+Odd syntax errors can be detected by the groovy interpreter.
+
+% groovy path/to/{source}.groovy
+
+jjb/ pipeline scripts will eventually due to syntax problems but groovy can
+still detect problems like mismatched quotes, invalid op tokens, etc.
diff --git a/makefiles/lint/groovy/include.mk b/makefiles/lint/groovy/include.mk
new file mode 100644
index 0000000..6baf70c
--- /dev/null
+++ b/makefiles/lint/groovy/include.mk
@@ -0,0 +1,51 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+groovy-check      := npm-groovy-lint
+
+groovy-check-args := $(null)
+# groovy-check-args += --loglevel info
+# groovy-check-args += --ignorepattern
+# groovy-check-args += --verbose
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-GROOVY
+  lint : lint-groovy
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on command line script sources
+## -----------------------------------------------------------------------
+lint-groovy:
+	$(groovy-check) --version
+	@echo
+	$(HIDE)$(env-clean) find . -iname '*.groovy' -print0 \
+  | $(xargs-n1) $(groovy-check) $(groovy-check-args)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-groovy          Syntax check groovy sources'
+
+# [EOF]
diff --git a/makefiles/lint/groovy/urls b/makefiles/lint/groovy/urls
new file mode 100644
index 0000000..aa5c5eb
--- /dev/null
+++ b/makefiles/lint/groovy/urls
@@ -0,0 +1,8 @@
+# -*- makefile -*-
+
+# Config file and exclusions
+https://www.npmjs.com/package/npm-groovy-lint#Configuration
+
+https://github.com/nvuillam/npm-groovy-lint
+
+# [EOF]
diff --git a/makefiles/lint/python.mk b/makefiles/lint/help.mk
similarity index 62%
copy from makefiles/lint/python.mk
copy to makefiles/lint/help.mk
index 86503a7..24a5aa1 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/help.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2021-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,19 +15,17 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+help ::
 
-.PHONY: lint-python
+# -----------------------------------------------------------------------
+# -----------------------------------------------------------------------
+help-summary ::
+	@echo '  help-lint           Display lint target help'
 
-lint : lint-python
-
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+help-simple :: help-lint
+help-lint  :
+	@echo
+	@echo "[LINT]"
+	@echo '  help-lint           Display lint target help'
 
 # [EOF]
diff --git a/makefiles/lint/include.mk b/makefiles/lint/include.mk
index d1a5a16..c2f0ca6 100644
--- a/makefiles/lint/include.mk
+++ b/makefiles/lint/include.mk
@@ -1,36 +1,30 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2023 Open Networking Foundation
-#
-# 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.
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.1
 # -----------------------------------------------------------------------
 
-help::
+$(if $(DEBUG),$(warning ENTER))
+
+help ::
 	@echo
 	@echo "[LINT]"
-	@echo "  lint                       Static code analysis/syntax checking"
-	@echo "    LOCAL_LINT=1             Enable local linting w/o docker & jenkins overhead"
 
-include $(MAKEDIR)/lint/docker/include.mk
+include $(ONF_MAKEDIR)/lint/doc8/include.mk
+include $(ONF_MAKEDIR)/lint/docker/include.mk
+include $(ONF_MAKEDIR)/lint/groovy/include.mk
+include $(ONF_MAKEDIR)/lint/jjb.mk
+include $(ONF_MAKEDIR)/lint/json.mk
+include $(ONF_MAKEDIR)/lint/license/include.mk
+include $(ONF_MAKEDIR)/lint/makefile.mk
+include $(ONF_MAKEDIR)/lint/python/include.mk
+include $(ONF_MAKEDIR)/lint/shell.mk
+include $(ONF_MAKEDIR)/lint/yaml.mk
 
-ifdef LOCAL_LINT
-  # include $(MAKEDIR)/lint/json.mk              # venv dependency
-  # include $(MAKEDIR)/lint/golang/sca.mk
-  # include $(MAKEDIR)/lint/license/include.mk   # exclusions needed
-  # include $(MAKEDIR)/lint/python.mk
-  # include $(MAKEDIR)/lint/robot.mk             # venv dependency
-  # include $(MAKEDIR)/lint/shell.mk             # cleanup needed
-  # include $(MAKEDIR)/lint/yaml.mk              # venv needed -- alt: yamllint
-endif
+include $(ONF_MAKEDIR)/lint/help.mk
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/lint/include.mk.safe b/makefiles/lint/include.mk.safe
new file mode 100644
index 0000000..bf598dc
--- /dev/null
+++ b/makefiles/lint/include.mk.safe
@@ -0,0 +1,39 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation
+#
+# 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.
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+help ::
+	@echo
+	@echo "[LINT]"
+
+include $(ONF_MAKEDIR)/lint/doc8/include.mk
+include $(ONF_MAKEDIR)/lint/docker/include.mk
+# include $(ONF_MAKEDIR)/lint/groovy/include.mk
+# include $(ONF_MAKEDIR)/lint/jjb.mk
+# include $(ONF_MAKEDIR)/lint/json.mk
+# include $(ONF_MAKEDIR)/lint/license/include.mk
+# include $(ONF_MAKEDIR)/lint/makefile.mk
+# include $(ONF_MAKEDIR)/lint/python/include.mk
+# include $(ONF_MAKEDIR)/lint/shell.mk
+# include $(ONF_MAKEDIR)/lint/yaml.mk
+
+include $(ONF_MAKEDIR)/lint/help.mk
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/lint/jjb.mk b/makefiles/lint/jjb.mk
new file mode 100644
index 0000000..ccfa073
--- /dev/null
+++ b/makefiles/lint/jjb.mk
@@ -0,0 +1,60 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-venv
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-JJB
+  lint : lint-jjb
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Construct command line for linting jenkins-job-builder config
+## -----------------------------------------------------------------------
+
+ifdef DEBUG
+  lint-jjb-args += --log_level DEBUG#         # verbosity: high
+else
+  lint-jjb-args += --log_level INFO#          # verbosity: default
+endif
+lint-jjb-args += --ignore-cache
+lint-jjb-args += test#                        # command action
+lint-jjb-args += -o archives/job-configs#     # Generated jobs written here
+lint-jjb-args += --recursive
+lint-jjb-args += --config-xml#                # JJB v3.0 write to OUTPUT/jobname/config.xml
+lint-jjb-args += jjb/#                        # JJB config sources (input)
+
+lint-jjb-deps := $(null)
+lint-jjb-deps += $(venv-activate-script) 
+lint-jjb-deps += checkout-ci-management-sub-modules
+lint-jjb: $(lint-jjb-deps)
+	$(activate) && { jenkins-jobs $(lint-jjb-args); }
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo '  lint-jjb               Validate jjb job generation'
+ifdef VERBOSE
+	@echo '    DEBUG=1                lint-jjb --log_level=DEBUG'
+endif
+
+# [EOF]
diff --git a/makefiles/lint/json.mk b/makefiles/lint/json.mk
index cc9ecfa..30c93c0 100644
--- a/makefiles/lint/json.mk
+++ b/makefiles/lint/json.mk
@@ -1,8 +1,8 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
+# 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
 #
@@ -15,21 +15,78 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-JSON_FILES ?= $(error JSON_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-json
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-json lint-json-all lint-json-modified
 
-lint : lint-json
+## -----------------------------------------------------------------------
+## Intent: Use the json command to perform syntax checking.
+##   o If UNSTABLE=1 syntax check all sources
+##   o else only check sources modified by the developer.
+## Usage:
+##   % make lint UNSTABLE=1
+##   % make lint-json-all
+## -----------------------------------------------------------------------
+ifndef NO-LINT-JSON
+  have-json-files := $(if $(strip $(JSON_FILES)),true)
+  JSON_FILES      ?= $(error JSON_FILES= required)
 
-lint-json: vst_venv
-	source ./$</bin/activate \
-	    ; set -u \
-	    ; for jsonfile in $(JSON_FILES); do \
-		echo "Validating json file: $$jsonfile" ;\
-		python -m json.tool $$jsonfile > /dev/null ;\
-	done
+  lint-json-mode := $(if $(have-json-files),modified,all)
+  lint : lint-json-$(lint-json-mode)
+endif# NO-LINT-JSON
 
+## -----------------------------------------------------------------------
+## Intent: exhaustive json syntax checking
+## -----------------------------------------------------------------------
+json-find-args := $(null)
+json-find-args += -name '$(venv-name)'
+lint-json-all:	
+	$(HIDE)$(MAKE) --no-print-directory lint-json-install
+
+	$(activate)\
+ && find . \( $(json-find-args) \) -prune -o -name '*.json' -print0 \
+	| $(xargs-n1) python -m json.tool > /dev/null ;\
+
+## -----------------------------------------------------------------------
+## Intent: check deps for format and python3 cleanliness
+## Note:
+##   json --py3k option no longer supported
+## -----------------------------------------------------------------------
+lint-json-modified: $(venv-activate-script)
+	$(HIDE)$(MAKE) --no-print-directory lint-json-install
+
+	$(activate)\
+ && for jsonfile in $(JSON_FILES); do \
+        echo "Validating json file: $$jsonfile" ;\
+        python -m json.tool $$jsonfile > /dev/null ;\
+    done
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+.PHONY: lint-json-install
+lint-json-install: $(venv-activate-script)
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** json syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+#	$(activate) && pip install --upgrade json.tool
+#       $(activate) && python -m json.tool --version (?-howto-?)
+	@echo
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
 help::
-	@echo "  lint-json            Syntax check json sources"
+	@echo '  lint-json          Syntax check python using the json command'
+  ifdef VERBOSE
+	@echo '  lint-json-all       json checking: exhaustive'
+	@echo '  lint-json-modified  json checking: only modified'
+  endif
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/lint/license/common.mk b/makefiles/lint/license/common.mk
new file mode 100644
index 0000000..2b42049
--- /dev/null
+++ b/makefiles/lint/license/common.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-REUSE
+  lint : lint-license
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-license:
+	reuse --root . lint
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-reuse              License syntax checking'
+
+# [EOF]
diff --git a/makefiles/lint/license/include.mk b/makefiles/lint/license/include.mk
index aaf6e47..d34d462 100644
--- a/makefiles/lint/license/include.mk
+++ b/makefiles/lint/license/include.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2022 Open Networking Foundation
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,74 +15,23 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-# JSON_FILES ?= $(error JSON_FILES= is required)
+ifndef NO-LINT-LICENSE
 
-.PHONY: lint-license
+ifndef mk-include--onf-lint-license#       # one-time loader
 
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-lint : lint-license
+$(if $(DEBUG),$(warning ENTER))
 
-lint-license-gargs += --recursive
+$(if $(USE_LINT_LICENSE)\
+  ,$(eval include $(ONF_MAKEDIR)/lint/license/voltha-system-tests/include.mk)\
+  ,$(eval include $(ONF_MAKEDIR)/lint/license/common.mk)\
+)
 
-# ignore: png, xlsx
-# will utf8 be excluded(?)
-lint-license-gargs += --binary-files=without-match
-lint-license-gargs += --files-without-match
+  mk-include--onf-lint-license := true
 
-# [TODO] license checking accepts either Copy or Apache.
-# [TODO] At least Copyright should be required (both?)
-lint-license-gargs += --extended-regexp
-lint-license-gargs += -e 'Copyright[[:space:]]+[[:digit:]]{4}'
-lint-license-gargs += -e 'Apache License'
+$(if $(DEBUG),$(warning LEAVE))
 
-# [TODO] --strict, --strict-dates
+endif # mk-include--onf-lint-license
 
-# Editor temp files
-lint-license-gargs += --exclude='*.~'
-lint-license-gargs += --exclude='*.swp'
-
-lint-license-gargs += --exclude-dir='.git'
-
-# TODO: Normalize into .venv for consistent filtering across projects.
-lint-license-gargs += --exclude-dir='vst_venv'
-lint-license-gargs += --exclude-dir='flog'
-
-lint-license-gargs += --exclude='*.json'
-lint-license-gargs += --exclude='*.md'
-lint-license-gargs += --exclude='*.out'
-lint-license-gargs += --exclude='*.pyc'
-lint-license-gargs += --exclude='*.xml'
-
-# [FILE(s)]
-lint-license-gargs += --exclude='VERSION'
-
-# [GIT]
-# lint-license-gargs += --exclude='.gitignore'
-# lint-license-gargs += --exclude='.gitreview'
-lint-license-gargs += --exclude='\.*'
-
-# [PYTHON]
-lint-license-gargs += --exclude='requirements.txt'
-
-# [WIP]
-lint-license-gargs += --exclude='patch'
-
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-lint-license-new:
-	grep $(lint-license-gargs) $(dot)
-
-## -----------------------------------------------------------------------
-## Jenkins job checking logic.
-## -----------------------------------------------------------------------
-lint-license:
-	$(MAKEDIR)/lint/license/license-check.sh
-
-## -----------------------------------------------------------------------
-## -----------------------------------------------------------------------
-help ::
-	@echo "  lint-license         Verify sources contain a license block."
-	@echo "  lint-license-new     Grep driven replacement logic."
+endif # NO-LINT-LICENSE
 
 # [EOF]
diff --git a/makefiles/lint/license/reuse.mk b/makefiles/lint/license/reuse.mk
new file mode 100644
index 0000000..5572bef
--- /dev/null
+++ b/makefiles/lint/license/reuse.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-REUSE
+  lint : lint-license
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-license:
+	reuse --root . lint
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-reuse              License syntax checking"
+
+# [EOF]
diff --git a/makefiles/lint/license/voltha-system-tests/include.mk b/makefiles/lint/license/voltha-system-tests/include.mk
new file mode 100644
index 0000000..b457f58
--- /dev/null
+++ b/makefiles/lint/license/voltha-system-tests/include.mk
@@ -0,0 +1,80 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+.PHONY: lint-license
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+lint : lint-license
+
+lint-license-gargs += --recursive
+
+# ignore: png, xlsx
+# will utf8 be excluded(?)
+lint-license-gargs += --binary-files=without-match
+lint-license-gargs += --files-without-match
+
+# [TODO] license checking accepts either Copy or Apache.
+# [TODO] At least Copyright should be required (both?)
+lint-license-gargs += --extended-regexp
+lint-license-gargs += -e 'Copyright[[:space:]]+[[:digit:]]{4}'
+lint-license-gargs += -e 'Apache License'
+
+# [TODO] --strict, --strict-dates
+
+# TODO: Normalize into .venv for consistent filtering across projects.
+lint-license-gargs += --exclude-dir='.git'
+lint-license-gargs += --exclude-dir='$(venv-name)'
+lint-license-gargs += --exclude-dir='flog'
+
+lint-license-gargs += --exclude='*.json'
+lint-license-gargs += --exclude='*.md'
+lint-license-gargs += --exclude='*.pyc'
+lint-license-gargs += --exclude='*.xml'
+
+# [FILE(s)]
+lint-license-gargs += --exclude='VERSION'
+
+# [GIT]
+# lint-license-gargs += --exclude='.gitignore'
+# lint-license-gargs += --exclude='.gitreview'
+lint-license-gargs += --exclude='\.*'
+
+# [PYTHON]
+lint-license-gargs += --exclude='requirements.txt'
+
+# [WIP]
+lint-license-gargs += --exclude='patch'
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+lint-license-new:
+	grep $(lint-license-gargs) $(dot)
+
+## -----------------------------------------------------------------------
+## Jenkins job checking logic.
+## -----------------------------------------------------------------------
+lint-license:
+	$(MAKEDIR)/lint/license/license-check.sh
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help::
+	@echo "  lint-license         Verify sources contain a license block."
+	@echo "  lint-license-new     Grep driven replacement logic."
+
+# [EOF]
diff --git a/makefiles/lint/license/voltha-system-tests/license-check.sh b/makefiles/lint/license/voltha-system-tests/license-check.sh
new file mode 100755
index 0000000..92aa363
--- /dev/null
+++ b/makefiles/lint/license/voltha-system-tests/license-check.sh
@@ -0,0 +1,159 @@
+#!/usr/bin/env bash
+
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+# licensecheck.sh
+# checks for copyright/license headers on files
+# excludes filename extensions where this check isn't pertinent
+
+# --strict
+# --strict-dates
+#    see https://github...
+
+## ---------------------------------------------------------------------------
+## find: warning: ‘-name’ matches against basenames only, but the given pattern
+## contains a directory separator (‘/’), thus the expression will evaluate to
+## false all the time.  Did you mean ‘-wholename’?
+##
+## [TODO] find and fix plugin script, change --name to --path:
+##    find ! -name "*/docs/*" 
+## ---------------------------------------------------------------------------
+## [TODO] see license/include.mk, grep -L will ignore binaries so no need to
+## explicitly filter images, spreadsheets, etc.  Files containing utf-8 are
+## the only question mark.
+## ---------------------------------------------------------------------------
+
+set +e -u -o pipefail
+fail_licensecheck=0
+
+declare -a gargs=()
+gargs+=('--extended-regexp')
+
+# Evil regex -- scripts detecting pattern are excluded from checking.
+gargs+=('-e' 'Apache License')
+
+# Good regex -- no false positives.
+gargs+=('-e' 'Copyright[[:space:]]+[[:digit:]]{4}')
+
+while IFS= read -r -d '' path
+do
+    if ! grep -q "${gargs[@]}" "${path}";
+    then
+	echo "ERROR: $path does not contain License Header"
+	fail_licensecheck=1
+    fi
+done < <(find . -name ".git" -prune -o -type f \
+  ! -iname "*.png" \
+  ! -name "*.asc" \
+  ! -name "*.bat" \
+  ! -name "*.bin" \
+  ! -name "*.cert" \
+  ! -name "*.cfg" \
+  ! -name "*.cnf" \
+  ! -name "*.conf" \
+  ! -name "*.cql" \
+  ! -name "*.crt" \
+  ! -name "*.csar" \
+  ! -name "*.csr" \
+  ! -name "*.csv" \
+  ! -name "*.ctmpl" \
+  ! -name "*.curl" \
+  ! -name "*.db" \
+  ! -name "*.der" \
+  ! -name "*.desc" \
+  ! -name "*.diff" \
+  ! -name "*.dnsmasq" \
+  ! -name "*.do" \
+  ! -name "*.docx" \
+  ! -name "*.eot" \
+  ! -name "*.gif" \
+  ! -name "*.gpg" \
+  ! -name "*.graffle" \
+  ! -name "*.ico" \
+  ! -name "*.iml" \
+  ! -name "*.in" \
+  ! -name "*.inc" \
+  ! -name "*.install" \
+  ! -name "*.j2" \
+  ! -name "*.jar" \
+  ! -name "*.jks" \
+  ! -name "*.jpg" \
+  ! -name "*.json" \
+  ! -name "*.jsonld" \
+  ! -name "*.JSON" \
+  ! -name "*.key" \
+  ! -name "*.list" \
+  ! -name "*.local" \
+  ! -path "*.lock" \
+  ! -name "*.log" \
+  ! -name "*.mak" \
+  ! -name "*.md" \
+  ! -name "*.MF" \
+  ! -name "*.oar" \
+  ! -name "*.p12" \
+  ! -name "*.patch" \
+  ! -name "*.pb.go" \
+  ! -name "*.pb.gw.go" \
+  ! -name "*.pdf" \
+  ! -name "*.pcap" \
+  ! -name "*.pem" \
+  ! -name "*.properties" \
+  ! -name "*.proto" \
+  ! -name "*.protoset" \
+  ! -name "*.pyc" \
+  ! -name "*.repo" \
+  ! -name "*.robot" \
+  ! -name "*.rst" \
+  ! -name "*.rules" \
+  ! -name "*.service" \
+  ! -name "*.svg" \
+  ! -name "*.swp" \
+  ! -name "*.tar" \
+  ! -name "*.tar.gz" \
+  ! -name "*.toml" \
+  ! -name "*.ttf" \
+  ! -name "*.txt" \
+  ! -name "*.woff" \
+  ! -name "*.xproto" \
+  ! -name "*.xtarget" \
+  ! -name "*ignore" \
+  ! -name "*rc" \
+  ! -name "*_pb2.py" \
+  ! -name "*_pb2_grpc.py" \
+  ! -name "Dockerfile" \
+  ! -name "Dockerfile.*" \
+  ! -name "go.mod" \
+  ! -name "go.sum" \
+  ! -name "README" \
+  ! -path "*/vendor/*" \
+  ! -path "*conf*" \
+  ! -path "*git*" \
+  ! -path "*swagger*" \
+  ! -path "*.drawio" \
+  ! -name "*.pb.h" \
+  ! -name "*.pb.cc" \
+  ! -path "*/docs/*" \
+  ! -name 'output.xml' \ 
+  ! -path "*/.venv/*" \
+  ! -name '*#*' \
+  ! -path '*scripts/flog/*' \
+  ! -name '*~' \
+  ! -name 'VERSION' \
+  ! -name 'patch' \
+  -print0 )
+
+exit ${fail_licensecheck}
diff --git a/makefiles/lint/python.mk b/makefiles/lint/license/voltha-system-tests/license-helper.sh
old mode 100644
new mode 100755
similarity index 63%
copy from makefiles/lint/python.mk
copy to makefiles/lint/license/voltha-system-tests/license-helper.sh
index 86503a7..0f690e4
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/license/voltha-system-tests/license-helper.sh
@@ -1,6 +1,6 @@
-# -*- makefile -*-
+#!/bin/bash
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,19 +15,17 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+declare -i status=$#
 
-.PHONY: lint-python
+while [ $# -gt 0 ]; do
+    arg="$1"; shift
+    echo "ERROR: Detected missing license header: ${arg}"
+done
 
-lint : lint-python
+if [ $status -ne 0 ]; then
+    exit 1
+fi
 
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+/bin/true # set $?
 
 # [EOF]
diff --git a/makefiles/lint/makefile.mk b/makefiles/lint/makefile.mk
new file mode 100644
index 0000000..27206e0
--- /dev/null
+++ b/makefiles/lint/makefile.mk
@@ -0,0 +1,65 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+xargs-n1-local := $(subst -t,$(null),$(xargs-n1))#   inhibit cmd display
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+make-check-find := find . -name 'vendor' -prune
+make-check-find += -o \( -iname makefile -o -name '*.mk' \)
+make-check-find += -type f -print0
+
+make-check      := $(MAKE)
+
+make-check-args += --dry-run
+make-check-args += --keep-going
+make-check-args += --warn-undefined-variables
+make-check-args += --no-print-directory
+
+# Quiet internal undef vars
+make-check-args += DEBUG=
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-MAKEFILE
+  lint : lint-make
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-make-ignore += JSON_FILES=
+lint-make-ignore += YAML_FILES=
+lint-make:
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** Makefile syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+	$(HIDE)$(env-clean) $(make-check-find) \
+	    | $(xargs-n1-local) $(make-check) $(make-check-args) $(lint-make-ignore)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-make           Syntax check [Mm]akefile and *.mk'
+
+# [EOF]
diff --git a/makefiles/lint/python.mk b/makefiles/lint/python/flake8
similarity index 93%
rename from makefiles/lint/python.mk
rename to makefiles/lint/python/flake8
index 86503a7..1492829 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/lint/python/flake8
@@ -25,7 +25,7 @@
 	-source ./$</bin/activate \
 	    && set -u \
 	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
+	    && flake8 --max-line-length=99 --count $(PYTHON_FILE)S
 
 help::
 	@echo "  lint-python          Syntax check using pylint and flake8"
diff --git a/makefiles/lint/python/flake8.mk b/makefiles/lint/python/flake8.mk
new file mode 100644
index 0000000..4d7ba93
--- /dev/null
+++ b/makefiles/lint/python/flake8.mk
@@ -0,0 +1,49 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+python-check-find := find . -name '*venv*' -prune\
+  -o \( -name '*.py' \)\
+  -type f -print0
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-PYTHON-FLAKE8
+  lint        : lint-python-flake8
+  lint-python : lint-python-flake8
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-python-flake8:
+	$(HIDE)$(env-clean) $(python-check-find) \
+	    | $(xargs-n1) flake8 --max-line-length=99 --count
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-python-flake8  Syntax check python sources (*.py)'
+
+# [EOF]
diff --git a/makefiles/lint/python/include.mk b/makefiles/lint/python/include.mk
new file mode 100644
index 0000000..0392822
--- /dev/null
+++ b/makefiles/lint/python/include.mk
@@ -0,0 +1,45 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+ifndef mk-include--onf-lint-python#       # one-time loader
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Display early so lint targets are grouped
+## -----------------------------------------------------------------------
+help ::
+#	@echo
+#	@echo '[PYTHON]'
+	@echo '  lint-python         Syntax check python sources (*.py)'
+#	@echo '  help-lint-python-flake8'
+#	@echo '  help-lint-python-pylint'
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+  ifndef NO-LINT-PYTHON
+    include $(ONF_MAKEDIR)/lint/python/flake8.mk
+    include $(ONF_MAKEDIR)/lint/python/pylint.mk
+  endif
+
+  mk-include--onf-lint-python := true
+
+$(if $(DEBUG),$(warning LEAVE))
+
+endif # mk-include--onf-lint-license
+
+# [EOF]
diff --git a/makefiles/lint/python/pylint.mk b/makefiles/lint/python/pylint.mk
new file mode 100644
index 0000000..85c7afd
--- /dev/null
+++ b/makefiles/lint/python/pylint.mk
@@ -0,0 +1,54 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+# Gather sources to check
+# TODO: implement deps, only check modified files
+python-check-find := find . -name '*venv*' -prune\
+  -o \( -name '*.py' \)\
+  -type f -print0
+
+# python-check    := $(env-clean) pylint
+python-check    := pylint
+
+# python-check-args += --dry-run
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-PYTHON
+  lint        : lint-python-pylint
+  lint-python : lint-python-pylint
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on makefile sources
+## -----------------------------------------------------------------------
+lint-python-pylint:
+	$(HIDE)$(env-clean) $(python-check-find) \
+	    | $(xargs-n1) $(python-check) $(python-check-args)
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-python-pylint  Syntax check python sources (*.py)'
+
+# [EOF]
diff --git a/makefiles/lint/robot.mk b/makefiles/lint/robot.mk
index 9808602..369dfa8 100644
--- a/makefiles/lint/robot.mk
+++ b/makefiles/lint/robot.mk
@@ -30,10 +30,8 @@
 
 lint : lint-robot
 
-lint-robot: vst_venv
-	source ./$</bin/activate \
-	    && set -u \
-	    && rflint $(LINT_ARGS) $(ROBOT_FILES)
+lint-robot: $(venv-activate-script)
+	$(activate) && rflint $(LINT_ARGS) $(ROBOT_FILES)
 
 help::
 	@echo "  lint-robot           Syntax check robot sources using rflint"
diff --git a/makefiles/lint/shell.mk b/makefiles/lint/shell.mk
index da92921..704038c 100644
--- a/makefiles/lint/shell.mk
+++ b/makefiles/lint/shell.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,20 +14,52 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.0
+# -----------------------------------------------------------------------
 
-JSON_FILES ?= $(error JSON_FILES= is required)
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
 
-.PHONY: lint-shell
+# Gather sources to check
+# TODO: implement deps, only check modified files
+shell-check-find := find .
+# vendor scripts but they really should be lintable
+shell-check-find += -name 'vendor' -prune
+shell-check-find += -o \( -name '*.sh' \)
+shell-check-find += -type f -print0
 
-lint : lint-shell
+# shell-check    := $(env-clean) pylint
+shell-check      := shellcheck
 
+shell-check-args += --check-sourced
+shell-check-args += --external-sources
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-SHELL
+  lint : lint-shell
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Perform a lint check on command line script sources
+## -----------------------------------------------------------------------
 lint-shell:
-	shellcheck --version
-	find . \( -name 'staging' -o -name 'vst_venv' \) -prune \
-	    -o -name '*.sh' ! -name 'activate.sh' -print0 \
-	| xargs -0 -n1 shellcheck
+	$(shell-check) -V
+	@echo
+	$(HIDE)$(env-clean) $(shell-check-find) \
+	    | $(xargs-n1) $(shell-check) $(shell-check-args)
 
-help::
-	@echo "  lint-shell           Syntax check bash,bourne,etc sources"
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-shell          Syntax check shell sources'
+
+# [SEE ALSO]
+# -----------------------------------------------------------------------
+#   o https://www.shellcheck.net/wiki/Directive
 
 # [EOF]
diff --git a/makefiles/lint/yaml.mk b/makefiles/lint/yaml.mk
index c9cb392..8672daa 100644
--- a/makefiles/lint/yaml.mk
+++ b/makefiles/lint/yaml.mk
@@ -1,8 +1,8 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
-# Licensed under the Apache License, Version 2.0 (the "License");
+# 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
 #
@@ -15,18 +15,71 @@
 # limitations under the License.
 # -----------------------------------------------------------------------
 
-YAML_FILES ?= $(error YAML_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-yaml
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: lint-yaml lint-yaml-all lint-yaml-modified
 
-lint : lint-yaml
+## -----------------------------------------------------------------------
+## Intent: Use the yaml command to perform syntax checking.
+##   o If UNSTABLE=1 syntax check all sources
+##   o else only check sources modified by the developer.
+## Usage:
+##   % make lint UNSTABLE=1
+##   % make lint-yaml-all
+## -----------------------------------------------------------------------
 
-lint-yaml: vst_venv
-	source ./$</bin/activate \
-	    ; set -u \
-	    ; yamllint -s $(YAML_FILES)
+ifndef NO-LINT-YAML
+  have-yaml-files := $(if $(strip $(YAML_FILES)),true)
+  YAML_FILES      ?= $(error YAML_FILES= is required)
 
+  lint-yaml-mode := $(if $(have-yaml-files),modified,all)
+  lint-yaml : lint-yaml-$(lint-yaml-mode)
+
+  lint : lint-yaml#     # Enable as a default lint target
+endif# NO-LINT-YAML
+
+## -----------------------------------------------------------------------
+## Intent: exhaustive yaml syntax checking
+## -----------------------------------------------------------------------
+lint-yaml-all:
+	$(HIDE)$(MAKE) --no-print-directory lint-yaml-install
+
+	find . \( -iname '*.yaml' -o -iname '*.yml' \) -print0 \
+	    | $(xargs-n1-clean) yamllint --strict
+
+## -----------------------------------------------------------------------
+## Intent: check deps for format and python3 cleanliness
+## Note:
+##   yaml --py3k option no longer supported
+## -----------------------------------------------------------------------
+lint-yaml-modified:
+	$(HIDE)$(MAKE) --no-print-directory lint-yaml-install
+	yamllint -s $(YAML_FILES)
+
+## -----------------------------------------------------------------------
+## Intent:
+## -----------------------------------------------------------------------
+lint-yaml-install:
+	@echo
+	@echo "** -----------------------------------------------------------------------"
+	@echo "** yaml syntax checking"
+	@echo "** -----------------------------------------------------------------------"
+	yamllint --version
+	@echo
+
+## -----------------------------------------------------------------------
+## Intent: Display command usage
+## -----------------------------------------------------------------------
 help::
-	@echo "  lint-yaml            Syntax check yaml source using yamllint"
+	@echo '  lint-yaml          Syntax check python using the yaml command'
+  ifdef VERBOSE
+	@echo '  lint-yaml-all       yaml checking: exhaustive'
+	@echo '  lint-yaml-modified  yaml checking: only locally modified'
+  endif
+
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/nop b/makefiles/nop
deleted file mode 100644
index ba2b114..0000000
--- a/makefiles/nop
+++ /dev/null
@@ -1 +0,0 @@
-Thu Apr 13 10:18:26 AM EDT 2023
diff --git a/makefiles/release/bbr.mk b/makefiles/release/bbr.mk
index 02bb0e4..79ae03b 100644
--- a/makefiles/release/bbr.mk
+++ b/makefiles/release/bbr.mk
@@ -39,10 +39,10 @@
 ##   o create a response file for passing docker env vars
 ##   o cross-compile: GOOS= GOARCH= go build
 ## -----------------------------------------------------------------------
-tans release-bbr: $(release-bbr-deps)
+release-bbr: $(release-bbr-deps)
 
 .PHONY: $(release-bbr-deps)
-$(release-bbr-deps):
+tans $(release-bbr-deps):
 
 	@echo
 	@echo "** -----------------------------------------------------------------------"
diff --git a/makefiles/targets/check.mk b/makefiles/targets/check.mk
new file mode 100644
index 0000000..aa1b0d0
--- /dev/null
+++ b/makefiles/targets/check.mk
@@ -0,0 +1,38 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: check
+check : lint lint-yaml lint-jjb
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-check
+help-check ::
+	@echo
+	@echo '[MAKE: check]'
+	@echo '  check               pre-commit checking, with extra targets (default:NO, jenkins:FAIL)'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/clean.mk b/makefiles/targets/clean.mk
new file mode 100644
index 0000000..f787e5c
--- /dev/null
+++ b/makefiles/targets/clean.mk
@@ -0,0 +1,40 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Remove makefile generated content
+## -----------------------------------------------------------------------
+.PHONY: clean
+clean ::
+	$(RM) -r $(JOBCONFIG_DIR)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-clean
+help-clean ::
+	@echo
+	@echo '[MAKE: clean]'
+	@echo '  clean               Remove makefile generated content'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/sterile.mk b/makefiles/targets/sterile.mk
new file mode 100644
index 0000000..c661f53
--- /dev/null
+++ b/makefiles/targets/sterile.mk
@@ -0,0 +1,45 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Revert sandbox into a pristine checkout stage
+## -----------------------------------------------------------------------
+##   Note: Sterile target behavior differs from clean around handling of
+##         persistent content.  For ex removal of a python virtualenv adds
+##         extra overhead to development iteration:
+##           make clean   - preserve a virtual env
+##           make sterile - force reinstallation
+## -----------------------------------------------------------------------
+.PHONY: sterile
+sterile :: clean
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-sterile
+help-sterile ::
+	@echo
+	@echo '[MAKE: sterile]'
+	@echo '  sterile             make clean, also remove persistent content (~venv)'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/test.mk b/makefiles/targets/test.mk
new file mode 100644
index 0000000..2f68086
--- /dev/null
+++ b/makefiles/targets/test.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: test
+test: $(venv-activate-script) $(JOBCONFIG_DIR)
+	$(activate) \
+	&& pipdeptree \
+	&& jenkins-jobs -l DEBUG test --recursive --config-xml -o "$(JOBCONFIG_DIR)" jjb/ ;
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-test
+help-test ::
+	@echo
+	@echo '[MAKE: test]'
+	@echo '  test                Perform testing that a jenkins job pull request will invoke'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/targets/tox.mk b/makefiles/targets/tox.mk
new file mode 100644
index 0000000..44da921
--- /dev/null
+++ b/makefiles/targets/tox.mk
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+## -----------------------------------------------------------------------
+## Intent: Sanity check incoming JJB config changes.
+##   Todo: Depend on makefiles/lint/jjb.mk :: lint-jjb
+## -----------------------------------------------------------------------
+# lint : lint-jjb
+lint-tox: lint-jjb
+	tox -e py310
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help-verbose += help-tox
+help-tox ::
+	@echo
+	@echo '[MAKE: tox]'
+	@echo '  lint-tox            Python unit testing, sanity check incoming JJB changes.'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]
diff --git a/makefiles/todo.mk b/makefiles/todo.mk
index 19e2272..8b3c658 100644
--- a/makefiles/todo.mk
+++ b/makefiles/todo.mk
@@ -28,6 +28,10 @@
 todo ::
 	@echo
 	@echo "[TODO: bbsim]"
+	@echo '  update makefiles to the latest from repo:onf-make'
+	@echo '  merge hadolint targets into onf-make if not fully supported yet'
+	@echo '  merge makefiles/tools.mk into makefiles/docker'
+	@echo '  merge and replace makefiles/lint/docker/*.mk with latest repo:onf-make/'
 
 $(if $(DEBUG),$(warning LEAVE))
 
diff --git a/makefiles/lint/python.mk b/makefiles/utils/include.mk
similarity index 65%
copy from makefiles/lint/python.mk
copy to makefiles/utils/include.mk
index 86503a7..5a7678f 100644
--- a/makefiles/lint/python.mk
+++ b/makefiles/utils/include.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 # -----------------------------------------------------------------------
-# Copyright 2017-2022 Open Networking Foundation
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,21 +13,17 @@
 # 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: 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+# SPDX-License-Identifier: Apache-2.0
 # -----------------------------------------------------------------------
 
-PYTHON_FILES ?= $(error PYTHON_FILES= is required)
+$(if $(DEBUG),$(warning ENTER))
 
-.PHONY: lint-python
+# usage: $(call if-not,false,5)
+if-not = $(info 1=$(1), 2=$(2), 3=$(3))\
+  $(if $(1),$(null),$(2))
 
-lint : lint-python
-
-lint-python: vst_venv
-	-source ./$</bin/activate \
-	    && set -u \
-	    && pylint $(PYTHON_FILES) \
-	    && flake8 --max-line-length=99 --count $(PYTHON_FILES)
-
-help::
-	@echo "  lint-python          Syntax check using pylint and flake8"
+$(if $(DEBUG),$(warning LEAVE))
 
 # [EOF]
diff --git a/makefiles/utils/test/makefile b/makefiles/utils/test/makefile
new file mode 100644
index 0000000..a148cfa
--- /dev/null
+++ b/makefiles/utils/test/makefile
@@ -0,0 +1,9 @@
+# -*- makefile -*-
+
+include ../include.mk
+
+all:
+
+test ::
+	@echo "Testing if-not"
+	@echo $(call if-not,$(null),true,false)
diff --git a/makefiles/virtualenv.mk b/makefiles/virtualenv.mk
new file mode 100644
index 0000000..a8e792d
--- /dev/null
+++ b/makefiles/virtualenv.mk
@@ -0,0 +1,97 @@
+# -*- makefile -*-
+## -----------------------------------------------------------------------
+# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF 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.
+# -----------------------------------------------------------------------
+# https://gerrit.opencord.org/plugins/gitiles/onf-make
+# ONF.makefile.version = 1.2
+# -----------------------------------------------------------------------
+
+$(if $(DEBUG),$(warning ENTER))
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+.PHONY: venv
+
+##------------------##
+##---]  LOCALS  [---##
+##------------------##
+venv-name             ?= .venv#                            # default install directory
+venv-abs-path         := $(PWD)/$(venv-name)
+venv-activate-bin     := $(venv-name)/bin
+venv-activate-script  := $(venv-activate-bin)/activate#    # dependency
+
+# Intent: activate= is a macro for accessing the virtualenv activation script#
+#  Usage: $(activate) && python
+activate             ?= set +u && source $(venv-activate-script) && set -u
+
+## -----------------------------------------------------------------------
+## Intent: Activate script path dependency
+## Usage:
+##    o place on the right side of colon as a target dependency
+##    o When the script does not exist install the virtual env and display.
+## ----------------------------------------------------------------------
+$(venv-activate-script):
+	@echo
+	@echo "============================="
+	@echo "Installing python virtual env"
+	@echo "============================="
+	virtualenv -p python3 $(venv-name)
+	$(activate) && python -m pip install --upgrade pip
+	$(activate) && pip install --upgrade setuptools
+	$(activate) && [[ -r requirements.txt ]] \
+	    && { python -m pip install -r requirements.txt; } \
+	    || { /bin/true; }
+
+	$(activate) && python --version
+
+## -----------------------------------------------------------------------
+## Intent: Explicit named installer target w/o dependencies.
+##         Makefile targets should depend on venv-activate-script.
+## -----------------------------------------------------------------------
+venv-activate-patched := $(venv-activate-script).patched
+venv-activate-patched : $(venv-activate-patched)
+$(venv-activate-patched) : $(venv-activate-script)
+	$(call banner-enter,Target $@)
+	$(onf-mk-top)/../patches/python_310_migration.sh --venv "$(venv-name)" 'apply'
+	touch $@
+	$(call banner-leave,Target $@)
+
+## -----------------------------------------------------------------------
+## Intent: Explicit named installer target w/o dependencies.
+##         Makefile targets should depend on venv-activate-script.
+## -----------------------------------------------------------------------
+venv: $(venv-activate-script)
+
+## -----------------------------------------------------------------------
+## Intent: Revert installation to a clean checkout
+## -----------------------------------------------------------------------
+sterile :: clean
+	$(RM) -r "$(venv-abs-path)"
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+	@echo
+	@echo '[VIRTUAL ENV]'
+	@echo '  venv                Create a python virtual environment'
+	@echo '    venv-name=        Subdir name for virtualenv install'
+	@echo '  venv-activate-script         make macro name'
+	@echo '      $$(target) dependency    install python virtualenv'
+	@echo '      source $$(macro) && cmd  configure env and run cmd'
+
+$(if $(DEBUG),$(warning LEAVE))
+
+# [EOF]