Repository: replicatedhq/kots
Pull request #1102 (2020-09-15 18:03:56)

1.19.1


Patch:
diff --git a/Makefile b/Makefile
index 1dc65b19c..aeae96bb2 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,7 @@ BUILDFLAGS = -tags "netgo containers_image_ostree_stub exclude_graphdriver_devic
 
 .PHONY: test
 test:
-	go test $(BUILDFLAGS) ./pkg/... ./cmd/... -coverprofile cover.out
+	go test $(BUILDFLAGS) ./pkg/... ./cmd/... ./ffi/... -coverprofile cover.out
 
 .PHONY: integration-cli
 integration-cli:
@@ -45,19 +45,23 @@ integration-cli:
 
 .PHONY: ci-test
 ci-test:
-	go test $(BUILDFLAGS) ./pkg/... ./cmd/... ./integration/... -coverprofile cover.out
+	go test $(BUILDFLAGS) ./pkg/... ./cmd/... ./ffi/... ./integration/... -coverprofile cover.out
 
 .PHONY: kots
 kots: fmt vet
 	CGOENABLED=0 go build ${LDFLAGS} -o bin/kots $(BUILDFLAGS) github.com/replicatedhq/kots/cmd/kots
 
+.PHONY: ffi
+ffi: fmt vet
+	go build ${LDFLAGS} $(BUILDFLAGS) -o bin/kots.so -buildmode=c-shared ./ffi/...
+
 .PHONY: fmt
 fmt:
-	go fmt ./pkg/... ./cmd/...
+	go fmt ./pkg/... ./cmd/... ./ffi/...
 
 .PHONY: vet
 vet:
-	go vet $(BUILDFLAGS) ./pkg/... ./cmd/...
+	go vet $(BUILDFLAGS) ./pkg/... ./cmd/... ./ffi/...
 
 .PHONY: gosec
 gosec:
diff --git a/go.mod b/go.mod
index ff9d102fe..2d20f4f33 100644
--- a/go.mod
+++ b/go.mod
@@ -27,11 +27,12 @@ require (
 	github.com/google/gofuzz v1.1.0
 	github.com/google/uuid v1.1.1
 	github.com/gorilla/handlers v1.4.2 // indirect
-	github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect
+	github.com/gorilla/mux v1.7.4 // indirect
 	github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
 	github.com/manifoldco/promptui v0.3.2
 	github.com/mattn/go-isatty v0.0.12
 	github.com/mholt/archiver v3.1.1+incompatible
+	github.com/mtrmac/gpgme v0.1.2 // indirect
 	github.com/otiai10/copy v1.0.2
 	github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
 	github.com/pkg/errors v0.9.1
@@ -47,6 +48,7 @@ require (
 	github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect
 	github.com/yvasiyarov/gorelic v0.0.7 // indirect
 	github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect
+	go.undefinedlabs.com/scopeagent v0.1.12
 	golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5
 	gopkg.in/yaml.v2 v2.3.0
 	helm.sh/helm/v3 v3.2.4
diff --git a/go.sum b/go.sum
index c213232df..5278e23e7 100644
--- a/go.sum
+++ b/go.sum
@@ -60,6 +60,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM=
 github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/DataDog/zstd v1.4.0/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
 github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14=
 github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=
 github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
@@ -138,7 +139,6 @@ github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NR
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
 github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
@@ -205,12 +205,19 @@ github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDG
 github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
+github.com/containers/image/v5 v5.2.0 h1:DowY5OII5x9Pb6Pt76vnHU79BgG4/jdwhZjeAj2R+t8=
+github.com/containers/image/v5 v5.2.0/go.mod h1:IAub4gDGvXoxaIAdNy4e3FbVTDPVNMv9F0UfVVFbYCU=
 github.com/containers/image/v5 v5.5.2 h1:fv7FArz0zUnjH0W0l8t90CqWFlFcQrPP6Pug+9dUtVI=
 github.com/containers/image/v5 v5.5.2/go.mod h1:4PyNYR0nwlGq/ybVJD9hWlhmIsNra4Q8uOQX2s6E2uM=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY=
+github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741 h1:8tQkOcednLJtUcZgK7sPglscXtxvMOnFOa6wd09VWLM=
+github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
 github.com/containers/ocicrypt v1.0.2 h1:Q0/IPs8ohfbXNxEfyJ2pFVmvJu5BhqJUAmc6ES9NKbo=
 github.com/containers/ocicrypt v1.0.2/go.mod h1:nsOhbP19flrX6rE7ieGFvBlr7modwmNjsqWarIUce4M=
+github.com/containers/storage v1.15.8/go.mod h1:zhvjIIl/fR6wt/lgqQAC+xanHQ+8gUQ0GBVeXYN81qI=
+github.com/containers/storage v1.16.2 h1:S77Y+lmJcnGoPEZB2OOrTrRGyjT8viDCGyhVNNz78h8=
+github.com/containers/storage v1.16.2/go.mod h1:/RNmsK01ajCL+VtMSi3W8kHzpBwN+Q5gLYWgfw5wlMg=
 github.com/containers/storage v1.20.2 h1:tw/uKRPDnmVrluIzer3dawTFG/bTJLP8IEUyHFhltYk=
 github.com/containers/storage v1.20.2/go.mod h1:oOB9Ie8OVPojvoaKWEGSEtHbXUAs+tSyr7RO7ZGteMc=
 github.com/coredns/corefile-migration v1.0.6/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E=
@@ -227,6 +234,7 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc
 github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
@@ -252,6 +260,7 @@ github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bP
 github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ=
 github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
+github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
@@ -285,6 +294,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
+github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw=
 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
@@ -306,6 +317,7 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt
 github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
 github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
@@ -513,6 +525,7 @@ github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
 github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
+github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
 github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
@@ -601,11 +614,17 @@ github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7IL
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0=
+github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.8 h1:eLeJ3dr/Y9+XRfJT4l+8ZjmtB5RPJhucH2HeCV5+IZY=
 github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
+github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
 github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
@@ -681,6 +700,7 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
 github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
+github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
 github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -730,6 +750,7 @@ github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7P
 github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0=
+github.com/mtrmac/gpgme v0.1.1/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI=
 github.com/mtrmac/gpgme v0.1.2 h1:dNOmvYmsrakgW7LcgiprD0yfRuQQe8/C8F6Z+zogO3s=
 github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
@@ -783,6 +804,8 @@ github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
+github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc=
+github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc90 h1:4+xo8mtWixbHoEm451+WJNUrq12o2/tDsyK9Vgc/NcA=
 github.com/opencontainers/runc v1.0.0-rc90/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -790,6 +813,9 @@ github.com/opencontainers/runtime-spec v1.0.0 h1:O6L965K88AilqnxeYPks/75HLpp4IG+
 github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
+github.com/opencontainers/selinux v1.3.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
+github.com/opencontainers/selinux v1.3.3 h1:RX0wAeqtvVSYQcr017X3pFXPkLEtB6V4NjRD7gVQgg4=
+github.com/opencontainers/selinux v1.3.3/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/opencontainers/selinux v1.5.2 h1:F6DgIsjgBIcDksLW4D5RG9bXok6oqZ3nvMwj4ZoFu/Q=
 github.com/opencontainers/selinux v1.5.2/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo=
@@ -836,7 +862,6 @@ github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8=
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -849,7 +874,6 @@ github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7q
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
 github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@@ -1008,6 +1032,7 @@ github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98 h1:Z/megzd
 github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98/go.mod h1:TyJZDQ/5AgyN7FSLiBJ8RO9u2c6wbtRvK827b6AVqY4=
 github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
 github.com/uudashr/gocognit v0.0.0-20190926065955-1655d0de0517/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
@@ -1017,6 +1042,8 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE=
 github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g=
+github.com/vbauerster/mpb/v4 v4.11.2 h1:ynkUoKzi65DZ1UsQPx7sgi/KN6G9f7br+Us2nKm35AM=
+github.com/vbauerster/mpb/v4 v4.11.2/go.mod h1:jIuIRCltGJUnm6DCyPVkwjlLUk4nHTH+m4eD14CdFF0=
 github.com/vbauerster/mpb/v5 v5.2.2 h1:zIICVOm+XD+uV6crpSORaL6I0Q1WqOdvxZTp+r3L9cw=
 github.com/vbauerster/mpb/v5 v5.2.2/go.mod h1:W5Fvgw4dm3/0NhqzV8j6EacfuTe5SvnzBRwiXxDR9ww=
 github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
@@ -1032,6 +1059,7 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
+github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg=
 github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
 github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
@@ -1070,8 +1098,9 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.undefinedlabs.com/scopeagent v0.1.7 h1:TPALQQNkPah8NgVjPKKhaBNZL2hg+hY2GRPfRMSt48c=
 go.undefinedlabs.com/scopeagent v0.1.7/go.mod h1:XCD8wnuBZ+eskhynYNP+uvBiFan9cFrWLwHnWOETXDU=
+go.undefinedlabs.com/scopeagent v0.1.12 h1:EKOFhKGIWlEaNOziVMU3Fs5vMo9BdEMLUOx6EXvOuUQ=
+go.undefinedlabs.com/scopeagent v0.1.12/go.mod h1:phe27toysIN8sk8tq6T99zi3WLVVwSASUAQb0ENVm9E=
 go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
 golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
 golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM=
@@ -1096,6 +1125,7 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
+golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1155,6 +1185,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -1222,7 +1253,9 @@ golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191220220014-0732a990476f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1345,6 +1378,8 @@ google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRn
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4=
 google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
diff --git a/kotsadm/go.mod b/kotsadm/go.mod
index d34848b8e..db02775bc 100644
--- a/kotsadm/go.mod
+++ b/kotsadm/go.mod
@@ -37,6 +37,7 @@ require (
 	github.com/stretchr/testify v1.6.1
 	github.com/vmware-tanzu/velero v1.4.2
 	go.uber.org/zap v1.13.0
+	go.undefinedlabs.com/scopeagent v0.1.15
 	golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5
 	google.golang.org/api v0.9.0
 	gopkg.in/go-playground/assert.v1 v1.2.1
diff --git a/kotsadm/go.sum b/kotsadm/go.sum
index 588852149..6aa152e83 100644
--- a/kotsadm/go.sum
+++ b/kotsadm/go.sum
@@ -68,6 +68,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM=
 github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/DataDog/zstd v1.4.0/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
 github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14=
 github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=
 github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
@@ -230,12 +231,19 @@ github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDG
 github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
+github.com/containers/image/v5 v5.2.0 h1:DowY5OII5x9Pb6Pt76vnHU79BgG4/jdwhZjeAj2R+t8=
+github.com/containers/image/v5 v5.2.0/go.mod h1:IAub4gDGvXoxaIAdNy4e3FbVTDPVNMv9F0UfVVFbYCU=
 github.com/containers/image/v5 v5.5.2 h1:fv7FArz0zUnjH0W0l8t90CqWFlFcQrPP6Pug+9dUtVI=
 github.com/containers/image/v5 v5.5.2/go.mod h1:4PyNYR0nwlGq/ybVJD9hWlhmIsNra4Q8uOQX2s6E2uM=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY=
+github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741 h1:8tQkOcednLJtUcZgK7sPglscXtxvMOnFOa6wd09VWLM=
+github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
 github.com/containers/ocicrypt v1.0.2 h1:Q0/IPs8ohfbXNxEfyJ2pFVmvJu5BhqJUAmc6ES9NKbo=
 github.com/containers/ocicrypt v1.0.2/go.mod h1:nsOhbP19flrX6rE7ieGFvBlr7modwmNjsqWarIUce4M=
+github.com/containers/storage v1.15.8/go.mod h1:zhvjIIl/fR6wt/lgqQAC+xanHQ+8gUQ0GBVeXYN81qI=
+github.com/containers/storage v1.16.2 h1:S77Y+lmJcnGoPEZB2OOrTrRGyjT8viDCGyhVNNz78h8=
+github.com/containers/storage v1.16.2/go.mod h1:/RNmsK01ajCL+VtMSi3W8kHzpBwN+Q5gLYWgfw5wlMg=
 github.com/containers/storage v1.20.2 h1:tw/uKRPDnmVrluIzer3dawTFG/bTJLP8IEUyHFhltYk=
 github.com/containers/storage v1.20.2/go.mod h1:oOB9Ie8OVPojvoaKWEGSEtHbXUAs+tSyr7RO7ZGteMc=
 github.com/coredns/corefile-migration v1.0.6/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E=
@@ -259,6 +267,7 @@ github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfc
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
@@ -286,6 +295,7 @@ github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bP
 github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ=
 github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
+github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
@@ -321,6 +331,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
+github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw=
 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
@@ -343,6 +355,7 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt
 github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
 github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
@@ -557,6 +570,7 @@ github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
 github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
+github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
 github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
@@ -661,11 +675,17 @@ github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7IL
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0=
+github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.8 h1:eLeJ3dr/Y9+XRfJT4l+8ZjmtB5RPJhucH2HeCV5+IZY=
 github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
+github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
 github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
@@ -750,6 +770,7 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
 github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
+github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
 github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -801,6 +822,7 @@ github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7P
 github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0=
+github.com/mtrmac/gpgme v0.1.1/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI=
 github.com/mtrmac/gpgme v0.1.2 h1:dNOmvYmsrakgW7LcgiprD0yfRuQQe8/C8F6Z+zogO3s=
 github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
@@ -857,6 +879,8 @@ github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
+github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc=
+github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc90 h1:4+xo8mtWixbHoEm451+WJNUrq12o2/tDsyK9Vgc/NcA=
 github.com/opencontainers/runc v1.0.0-rc90/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -864,6 +888,9 @@ github.com/opencontainers/runtime-spec v1.0.0 h1:O6L965K88AilqnxeYPks/75HLpp4IG+
 github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
+github.com/opencontainers/selinux v1.3.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
+github.com/opencontainers/selinux v1.3.3 h1:RX0wAeqtvVSYQcr017X3pFXPkLEtB6V4NjRD7gVQgg4=
+github.com/opencontainers/selinux v1.3.3/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/opencontainers/selinux v1.5.2 h1:F6DgIsjgBIcDksLW4D5RG9bXok6oqZ3nvMwj4ZoFu/Q=
 github.com/opencontainers/selinux v1.5.2/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo=
@@ -1104,6 +1131,7 @@ github.com/undefinedlabs/go-mpatch v0.0.0-20200326085307-1a86426f42a6 h1:VO1oVFj
 github.com/undefinedlabs/go-mpatch v0.0.0-20200326085307-1a86426f42a6/go.mod h1:TyJZDQ/5AgyN7FSLiBJ8RO9u2c6wbtRvK827b6AVqY4=
 github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
 github.com/uudashr/gocognit v0.0.0-20190926065955-1655d0de0517/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
@@ -1113,6 +1141,8 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE=
 github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g=
+github.com/vbauerster/mpb/v4 v4.11.2 h1:ynkUoKzi65DZ1UsQPx7sgi/KN6G9f7br+Us2nKm35AM=
+github.com/vbauerster/mpb/v4 v4.11.2/go.mod h1:jIuIRCltGJUnm6DCyPVkwjlLUk4nHTH+m4eD14CdFF0=
 github.com/vbauerster/mpb/v5 v5.2.2 h1:zIICVOm+XD+uV6crpSORaL6I0Q1WqOdvxZTp+r3L9cw=
 github.com/vbauerster/mpb/v5 v5.2.2/go.mod h1:W5Fvgw4dm3/0NhqzV8j6EacfuTe5SvnzBRwiXxDR9ww=
 github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
@@ -1130,6 +1160,7 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
+github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg=
 github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
 github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
@@ -1175,6 +1206,7 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
 go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 go.undefinedlabs.com/scopeagent v0.1.7/go.mod h1:XCD8wnuBZ+eskhynYNP+uvBiFan9cFrWLwHnWOETXDU=
+go.undefinedlabs.com/scopeagent v0.1.12/go.mod h1:phe27toysIN8sk8tq6T99zi3WLVVwSASUAQb0ENVm9E=
 go.undefinedlabs.com/scopeagent v0.1.15 h1:H3n8Vb2ndEoMnt8EKeq4uqnV58EMsNQsTRvg314KXfg=
 go.undefinedlabs.com/scopeagent v0.1.15/go.mod h1:ebAQoyMi0CPxEnrI09lQ19vnpu01KMlLv7M++V9bYdo=
 go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
@@ -1202,6 +1234,7 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
+golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1261,6 +1294,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -1333,7 +1367,9 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191220220014-0732a990476f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/kotsadm/operator/go.mod b/kotsadm/operator/go.mod
index b90ec1be8..4226875d7 100644
--- a/kotsadm/operator/go.mod
+++ b/kotsadm/operator/go.mod
@@ -12,6 +12,7 @@ require (
 	github.com/replicatedhq/troubleshoot v0.9.42
 	github.com/spf13/cobra v0.0.5
 	github.com/spf13/viper v1.4.0
+	go.undefinedlabs.com/scopeagent v0.1.12
 	gopkg.in/yaml.v2 v2.3.0
 	k8s.io/api v0.18.4
 	k8s.io/apimachinery v0.18.4
diff --git a/kotsadm/operator/go.sum b/kotsadm/operator/go.sum
index 8fbc4de2a..c8ebb4b1c 100644
--- a/kotsadm/operator/go.sum
+++ b/kotsadm/operator/go.sum
@@ -483,6 +483,8 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.undefinedlabs.com/scopeagent v0.1.7 h1:TPALQQNkPah8NgVjPKKhaBNZL2hg+hY2GRPfRMSt48c=
 go.undefinedlabs.com/scopeagent v0.1.7/go.mod h1:XCD8wnuBZ+eskhynYNP+uvBiFan9cFrWLwHnWOETXDU=
+go.undefinedlabs.com/scopeagent v0.1.12 h1:EKOFhKGIWlEaNOziVMU3Fs5vMo9BdEMLUOx6EXvOuUQ=
+go.undefinedlabs.com/scopeagent v0.1.12/go.mod h1:phe27toysIN8sk8tq6T99zi3WLVVwSASUAQb0ENVm9E=
 go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
 golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -627,6 +629,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/kotsadm/pkg/airgap/airgap.go b/kotsadm/pkg/airgap/airgap.go
index 2ea616ba4..e4160b397 100644
--- a/kotsadm/pkg/airgap/airgap.go
+++ b/kotsadm/pkg/airgap/airgap.go
@@ -196,7 +196,7 @@ func CreateAppFromAirgap(pendingApp *types.PendingApp, airgapBundlePath string,
 		return errors.Wrap(err, "failed to create new version")
 	}
 
-	if err := preflight.Run(pendingApp.ID, newSequence, true, tmpRoot); err != nil {
+	if err := preflight.Run(pendingApp.ID, newSequence, tmpRoot); err != nil {
 		return errors.Wrap(err, "failed to start preflights")
 	}
 
diff --git a/kotsadm/pkg/airgap/update.go b/kotsadm/pkg/airgap/update.go
index b595cfbb6..56e489216 100644
--- a/kotsadm/pkg/airgap/update.go
+++ b/kotsadm/pkg/airgap/update.go
@@ -11,13 +11,13 @@ import (
 
 	"github.com/pkg/errors"
 	apptypes "github.com/replicatedhq/kots/kotsadm/pkg/app/types"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/preflight"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/kotsadm/pkg/version"
 	"github.com/replicatedhq/kots/pkg/crypto"
 	"github.com/replicatedhq/kots/pkg/cursor"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/pkg/pull"
 )
 
@@ -187,7 +187,7 @@ func UpdateAppFromAirgap(a *apptypes.App, airgapBundlePath string) (finalError e
 		return errors.Wrap(err, "failed to create new version")
 	}
 
-	if err := preflight.Run(a.ID, newSequence, true, currentArchivePath); err != nil {
+	if err := preflight.Run(a.ID, newSequence, currentArchivePath); err != nil {
 		return errors.Wrap(err, "failed to start preflights")
 	}
 
diff --git a/kotsadm/pkg/handlers/airgap.go b/kotsadm/pkg/handlers/airgap.go
index ee1d4ffa9..a33b151c6 100644
--- a/kotsadm/pkg/handlers/airgap.go
+++ b/kotsadm/pkg/handlers/airgap.go
@@ -43,7 +43,8 @@ type AirgapBundleExistsResponse struct {
 }
 
 var uploadedAirgapBundleChunks = map[string]struct{}{}
-var mtx sync.Mutex
+var chunkLock sync.Mutex
+var fileLock sync.Mutex
 
 func GetAirgapInstallStatus(w http.ResponseWriter, r *http.Request) {
 	status, err := store.GetStore().GetAirgapInstallStatus()
@@ -100,7 +101,7 @@ func CheckAirgapBundleChunk(w http.ResponseWriter, r *http.Request) {
 	}
 
 	chunkKey := getChunkKey(resumableIdentifier, chunkNumber)
-	if _, ok := uploadedAirgapBundleChunks[chunkKey]; !ok {
+	if !isChunkPresent(chunkKey) {
 		w.WriteHeader(http.StatusNoContent) // instead of 404 to avoid unwarranted notices in browser consoles
 		return
 	}
@@ -159,8 +160,8 @@ func UploadAirgapBundleChunk(w http.ResponseWriter, r *http.Request) {
 
 	func() {
 		// create airgap bundle file if not exists
-		mtx.Lock()
-		defer mtx.Unlock()
+		fileLock.Lock()
+		defer fileLock.Unlock()
 
 		_, err = os.Stat(airgapBundlePath)
 		if os.IsNotExist(err) {
@@ -212,7 +213,7 @@ func UploadAirgapBundleChunk(w http.ResponseWriter, r *http.Request) {
 	}
 
 	chunkKey := getChunkKey(resumableIdentifier, chunkNumber)
-	uploadedAirgapBundleChunks[chunkKey] = struct{}{}
+	addUploadedChank(chunkKey)
 
 	if chunkNumber%25 == 0 {
 		logger.Infof("written chunk number %d / %d. bundle id: %s", chunkNumber, totalChunks, resumableIdentifier)
@@ -366,7 +367,23 @@ func getAirgapBundlePath(uploadedFileIdentifier string) string {
 	return filepath.Join(os.TempDir(), fmt.Sprintf("%s.%s", uploadedFileIdentifier, "airgap"))
 }
 
+func addUploadedChank(chunkKey string) {
+	chunkLock.Lock()
+	defer chunkLock.Unlock()
+	uploadedAirgapBundleChunks[chunkKey] = struct{}{}
+}
+
+func isChunkPresent(chunkKey string) bool {
+	chunkLock.Lock()
+	defer chunkLock.Unlock()
+	_, ok := uploadedAirgapBundleChunks[chunkKey]
+	return ok
+}
+
 func isUploadComplete(uploadedFileIdentifier string, totalChunks int64) bool {
+	chunkLock.Lock()
+	defer chunkLock.Unlock()
+
 	isUploadComplete := true
 
 	var i int64
@@ -381,6 +398,9 @@ func isUploadComplete(uploadedFileIdentifier string, totalChunks int64) bool {
 }
 
 func cleanUp(uploadedFileIdentifier string, totalChunks int64) error {
+	chunkLock.Lock()
+	defer chunkLock.Unlock()
+
 	var i int64
 	for i = 1; i <= totalChunks; i++ {
 		chunkKey := getChunkKey(uploadedFileIdentifier, i)
diff --git a/kotsadm/pkg/handlers/app.go b/kotsadm/pkg/handlers/app.go
index 3653e36f5..0d0a668fd 100644
--- a/kotsadm/pkg/handlers/app.go
+++ b/kotsadm/pkg/handlers/app.go
@@ -217,7 +217,7 @@ func responseAppFromApp(a *apptypes.App) (*ResponseApp, error) {
 			return nil, errors.Wrap(err, "failed to get current parent sequence for downstream")
 		}
 
-		s, err := store.GetStore().IsSnapshotsSupportedForVersion(a, parentSequence)
+		s, err := store.GetStore().IsSnapshotsSupportedForVersion(a.ID, parentSequence)
 		if err != nil {
 			return nil, errors.Wrap(err, "failed to check if snapshots is allowed")
 		}
diff --git a/kotsadm/pkg/handlers/config.go b/kotsadm/pkg/handlers/config.go
index 7a5b1559b..4af38c966 100644
--- a/kotsadm/pkg/handlers/config.go
+++ b/kotsadm/pkg/handlers/config.go
@@ -200,8 +200,7 @@ func LiveAppConfig(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
-	versionInfo := template.VersionInfoFromInstallation(liveAppConfigRequest.Sequence+1, foundApp.IsAirgap, kotsKinds.Installation.Spec) // sequence +1 because the sequence will be incremented on save (and we want the preview to be accurate)
-	renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, template.LocalRegistry{}, &versionInfo)
+	renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, template.LocalRegistry{})
 	if err != nil {
 		liveAppConfigResponse.Error = "failed to render templates"
 		JSON(w, http.StatusInternalServerError, liveAppConfigResponse)
@@ -266,8 +265,7 @@ func CurrentAppConfig(w http.ResponseWriter, r *http.Request) {
 		configValues[key] = generatedValue
 	}
 
-	versionInfo := template.VersionInfoFromInstallation(int64(sequence)+1, foundApp.IsAirgap, kotsKinds.Installation.Spec) // sequence +1 because the sequence will be incremented on save (and we want the preview to be accurate)
-	renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, template.LocalRegistry{}, &versionInfo)
+	renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, template.LocalRegistry{})
 	if err != nil {
 		currentAppConfigResponse.Error = "failed to render templates"
 		JSON(w, http.StatusInternalServerError, currentAppConfigResponse)
@@ -421,7 +419,7 @@ func updateAppConfig(updateApp *apptypes.App, sequence int64, req UpdateAppConfi
 		return updateAppConfigResponse, err
 	}
 
-	if err := preflight.Run(updateApp.ID, int64(sequence), updateApp.IsAirgap, archiveDir); err != nil {
+	if err := preflight.Run(updateApp.ID, int64(sequence), archiveDir); err != nil {
 		updateAppConfigResponse.Error = errors.Cause(err).Error()
 		return updateAppConfigResponse, err
 	}
diff --git a/kotsadm/pkg/handlers/preflight.go b/kotsadm/pkg/handlers/preflight.go
index 2aa1155e8..87d7d116d 100644
--- a/kotsadm/pkg/handlers/preflight.go
+++ b/kotsadm/pkg/handlers/preflight.go
@@ -12,7 +12,7 @@ import (
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/preflight"
 	preflighttypes "github.com/replicatedhq/kots/kotsadm/pkg/preflight/types"
-	"github.com/replicatedhq/kots/kotsadm/pkg/render/helper"
+	"github.com/replicatedhq/kots/kotsadm/pkg/render"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/pkg/kotsutil"
 )
@@ -99,7 +99,7 @@ func IgnorePreflightRBACErrors(w http.ResponseWriter, r *http.Request) {
 
 	go func() {
 		defer os.RemoveAll(archiveDir)
-		if err := preflight.Run(foundApp.ID, int64(sequence), foundApp.IsAirgap, archiveDir); err != nil {
+		if err := preflight.Run(foundApp.ID, int64(sequence), archiveDir); err != nil {
 			logger.Error(err)
 			return
 		}
@@ -139,7 +139,7 @@ func StartPreflightChecks(w http.ResponseWriter, r *http.Request) {
 
 	go func() {
 		defer os.RemoveAll(archiveDir)
-		if err := preflight.Run(foundApp.ID, int64(sequence), foundApp.IsAirgap, archiveDir); err != nil {
+		if err := preflight.Run(foundApp.ID, int64(sequence), archiveDir); err != nil {
 			logger.Error(err)
 			return
 		}
@@ -222,7 +222,15 @@ func GetPreflightStatus(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	renderedPreflight, err := helper.RenderAppFile(foundApp, &sequence, []byte(renderedMarshalledPreflights))
+	registrySettings, err := store.GetStore().GetRegistryDetailsForApp(foundApp.ID)
+	if err != nil {
+		err = errors.Wrap(err, "failed to get registry settings for app")
+		logger.Error(err)
+		w.WriteHeader(500)
+		return
+	}
+
+	renderedPreflight, err := render.RenderFile(renderedKotsKinds, registrySettings, []byte(renderedMarshalledPreflights))
 	if err != nil {
 		err = errors.Wrap(err, "failed to render preflights")
 		logger.Error(err)
diff --git a/kotsadm/pkg/handlers/troubleshoot.go b/kotsadm/pkg/handlers/troubleshoot.go
index 28d1b73ca..d2c9f163d 100644
--- a/kotsadm/pkg/handlers/troubleshoot.go
+++ b/kotsadm/pkg/handlers/troubleshoot.go
@@ -17,7 +17,6 @@ import (
 	"github.com/replicatedhq/kots/kotsadm/pkg/license"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/redact"
-	"github.com/replicatedhq/kots/kotsadm/pkg/render/helper"
 	"github.com/replicatedhq/kots/kotsadm/pkg/snapshot"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/kotsadm/pkg/supportbundle"
@@ -463,15 +462,8 @@ func GetTroubleshoot(w http.ResponseWriter, r *http.Request) {
 		fullTroubleshoot = fmt.Sprintf("%s\n---\n%s", string(specBytes), redactSpec)
 	}
 
-	renderedTroubleshoot, err := helper.RenderAppFile(foundApp, nil, []byte(fullTroubleshoot))
-	if err != nil {
-		logger.Error(err)
-		w.WriteHeader(500)
-		return
-	}
-
 	w.WriteHeader(200)
-	w.Write(renderedTroubleshoot)
+	w.Write([]byte(fullTroubleshoot))
 }
 
 func GetSupportBundleRedactions(w http.ResponseWriter, r *http.Request) {
diff --git a/kotsadm/pkg/handlers/upload.go b/kotsadm/pkg/handlers/upload.go
index 24186ea72..17f5245d4 100644
--- a/kotsadm/pkg/handlers/upload.go
+++ b/kotsadm/pkg/handlers/upload.go
@@ -141,7 +141,7 @@ func UploadExistingApp(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	if err := preflight.Run(a.ID, newSequence, a.IsAirgap, archiveDir); err != nil {
+	if err := preflight.Run(a.ID, newSequence, archiveDir); err != nil {
 		logger.Error(err)
 		w.WriteHeader(500)
 		return
diff --git a/kotsadm/pkg/license/license.go b/kotsadm/pkg/license/license.go
index db88ae545..b7b001a4e 100644
--- a/kotsadm/pkg/license/license.go
+++ b/kotsadm/pkg/license/license.go
@@ -115,7 +115,7 @@ func createNewVersion(a *apptypes.App, archiveDir string, registrySettings *regi
 		return errors.Wrap(err, "failed to create new version")
 	}
 
-	if err := preflight.Run(a.ID, newSequence, a.IsAirgap, archiveDir); err != nil {
+	if err := preflight.Run(a.ID, newSequence, archiveDir); err != nil {
 		return errors.Wrap(err, "failed to run preflights")
 	}
 
diff --git a/kotsadm/pkg/online/online.go b/kotsadm/pkg/online/online.go
index 7244bc351..bc2ab4785 100644
--- a/kotsadm/pkg/online/online.go
+++ b/kotsadm/pkg/online/online.go
@@ -193,7 +193,7 @@ func CreateAppFromOnline(pendingApp *types.PendingApp, upstreamURI string, isAut
 		}
 	}
 
-	if err := preflight.Run(pendingApp.ID, newSequence, false, tmpRoot); err != nil {
+	if err := preflight.Run(pendingApp.ID, newSequence, tmpRoot); err != nil {
 		return nil, errors.Wrap(err, "failed to start preflights")
 	}
 
diff --git a/kotsadm/pkg/preflight/preflight.go b/kotsadm/pkg/preflight/preflight.go
index bb67f128d..8b4e9b37b 100644
--- a/kotsadm/pkg/preflight/preflight.go
+++ b/kotsadm/pkg/preflight/preflight.go
@@ -12,7 +12,7 @@ import (
 	"go.uber.org/zap"
 )
 
-func Run(appID string, sequence int64, isAirgap bool, archiveDir string) error {
+func Run(appID string, sequence int64, archiveDir string) error {
 	renderedKotsKinds, err := kotsutil.LoadKotsKindsFromPath(archiveDir)
 	if err != nil {
 		return errors.Wrap(err, "failed to load rendered kots kinds")
@@ -54,7 +54,7 @@ func Run(appID string, sequence int64, isAirgap bool, archiveDir string) error {
 			return errors.Wrap(err, "failed to get registry settings for app")
 		}
 
-		renderedPreflight, err := render.RenderFile(renderedKotsKinds, registrySettings, sequence, isAirgap, []byte(renderedMarshalledPreflights))
+		renderedPreflight, err := render.RenderFile(renderedKotsKinds, registrySettings, []byte(renderedMarshalledPreflights))
 		if err != nil {
 			return errors.Wrap(err, "failed to render preflights")
 		}
diff --git a/kotsadm/pkg/registry/registry.go b/kotsadm/pkg/registry/registry.go
index 178deafe0..fd9dacaca 100644
--- a/kotsadm/pkg/registry/registry.go
+++ b/kotsadm/pkg/registry/registry.go
@@ -142,7 +142,6 @@ func RewriteImages(appID string, sequence int64, hostname string, username strin
 		RegistryNamespace: namespace,
 		AppSlug:           a.Slug,
 		IsGitOps:          a.IsGitOps,
-		AppSequence:       a.CurrentSequence + 1, // sequence +1 because this is the current latest sequence, not the sequence that the rendered version will be saved as
 	}
 
 	if err := rewrite.Rewrite(options); err != nil {
@@ -154,7 +153,7 @@ func RewriteImages(appID string, sequence int64, hostname string, username strin
 		return errors.Wrap(err, "failed to create new version")
 	}
 
-	if err := preflight.Run(appID, newSequence, a.IsAirgap, appDir); err != nil {
+	if err := preflight.Run(appID, newSequence, appDir); err != nil {
 		return errors.Wrap(err, "failed to run preflights")
 	}
 
diff --git a/kotsadm/pkg/render/helper/appfile.go b/kotsadm/pkg/render/helper/appfile.go
deleted file mode 100644
index 0d1c4a99b..000000000
--- a/kotsadm/pkg/render/helper/appfile.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package helper
-
-import (
-	"os"
-
-	"github.com/pkg/errors"
-	"github.com/replicatedhq/kots/kotsadm/pkg/app/types"
-	"github.com/replicatedhq/kots/kotsadm/pkg/render"
-	"github.com/replicatedhq/kots/kotsadm/pkg/store"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
-)
-
-// RenderAppFile renders a single file using the current sequence of the provided app, or the overrideSequence (if provided)
-// it's here for now to avoid an import cycle between kotsadm/pkg/render and kotsadm/pkg/store
-func RenderAppFile(a *types.App, overrideSequence *int64, inputContent []byte) ([]byte, error) {
-	sequence := a.CurrentSequence
-	if overrideSequence != nil {
-		sequence = *overrideSequence
-	}
-	archiveDir, err := store.GetStore().GetAppVersionArchive(a.ID, sequence)
-	if err != nil {
-		return nil, errors.Wrap(err, "failed to get app version archive")
-	}
-	defer os.RemoveAll(archiveDir)
-
-	renderedKotsKinds, err := kotsutil.LoadKotsKindsFromPath(archiveDir)
-	if err != nil {
-		return nil, errors.Wrap(err, "failed to load kotskinds")
-	}
-
-	registrySettings, err := store.GetStore().GetRegistryDetailsForApp(a.ID)
-	if err != nil {
-		return nil, errors.Wrap(err, "failed to load registry settings")
-	}
-
-	return render.RenderFile(renderedKotsKinds, registrySettings, sequence, a.IsAirgap, inputContent)
-}
diff --git a/kotsadm/pkg/render/render.go b/kotsadm/pkg/render/render.go
index b6fea7c05..a481ba6a2 100644
--- a/kotsadm/pkg/render/render.go
+++ b/kotsadm/pkg/render/render.go
@@ -9,28 +9,28 @@ import (
 	"github.com/pkg/errors"
 	apptypes "github.com/replicatedhq/kots/kotsadm/pkg/app/types"
 	downstreamtypes "github.com/replicatedhq/kots/kotsadm/pkg/downstream/types"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	registrytypes "github.com/replicatedhq/kots/kotsadm/pkg/registry/types"
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
 	"github.com/replicatedhq/kots/pkg/crypto"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/pkg/rewrite"
 	"github.com/replicatedhq/kots/pkg/template"
 )
 
 // RenderFile renders a single file
 // this is useful for upstream/kotskinds files that are not rendered in the dir
-func RenderFile(kotsKinds *kotsutil.KotsKinds, registrySettings *registrytypes.RegistrySettings, sequence int64, isAirgap bool, inputContent []byte) ([]byte, error) {
+func RenderFile(kotsKinds *kotsutil.KotsKinds, registrySettings *registrytypes.RegistrySettings, inputContent []byte) ([]byte, error) {
 	fixedUpContent, err := kotsutil.FixUpYAML(inputContent)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to fix up yaml")
 	}
 
-	return RenderContent(kotsKinds, registrySettings, sequence, isAirgap, fixedUpContent)
+	return RenderContent(kotsKinds, registrySettings, fixedUpContent)
 }
 
 // RenderContent renders any string/content
 // this is useful for rendering single values, like a status informer
-func RenderContent(kotsKinds *kotsutil.KotsKinds, registrySettings *registrytypes.RegistrySettings, sequence int64, isAirgap bool, inputContent []byte) ([]byte, error) {
+func RenderContent(kotsKinds *kotsutil.KotsKinds, registrySettings *registrytypes.RegistrySettings, inputContent []byte) ([]byte, error) {
 	apiCipher, err := crypto.AESCipherFromString(os.Getenv("API_ENCRYPTION_KEY"))
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to load apiCipher")
@@ -75,8 +75,7 @@ func RenderContent(kotsKinds *kotsutil.KotsKinds, registrySettings *registrytype
 		configGroups = kotsKinds.Config.Spec.Groups
 	}
 
-	versionInfo := template.VersionInfoFromInstallation(sequence, isAirgap, kotsKinds.Installation.Spec)
-	builder, _, err := template.NewBuilder(configGroups, templateContextValues, localRegistry, appCipher, kotsKinds.License, &versionInfo)
+	builder, _, err := template.NewBuilder(configGroups, templateContextValues, localRegistry, appCipher, kotsKinds.License)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to create builder")
 	}
@@ -133,7 +132,6 @@ func RenderDir(archiveDir string, a *apptypes.App, downstreams []downstreamtypes
 		IsAirgap:         a.IsAirgap,
 		AppSlug:          a.Slug,
 		IsGitOps:         a.IsGitOps,
-		AppSequence:      a.CurrentSequence + 1, // sequence +1 because this is the current latest sequence, not the sequence that the rendered version will be saved as
 	}
 
 	if registrySettings != nil {
diff --git a/kotsadm/pkg/snapshot/backup.go b/kotsadm/pkg/snapshot/backup.go
index 49c5c8de3..c52f30dae 100644
--- a/kotsadm/pkg/snapshot/backup.go
+++ b/kotsadm/pkg/snapshot/backup.go
@@ -13,7 +13,7 @@ import (
 	apptypes "github.com/replicatedhq/kots/kotsadm/pkg/app/types"
 	"github.com/replicatedhq/kots/kotsadm/pkg/downstream"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
-	"github.com/replicatedhq/kots/kotsadm/pkg/render/helper"
+	"github.com/replicatedhq/kots/kotsadm/pkg/render"
 	"github.com/replicatedhq/kots/kotsadm/pkg/snapshot/types"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	kotstypes "github.com/replicatedhq/kots/pkg/kotsadm/types"
@@ -77,12 +77,17 @@ func createApplicationBackup(ctx context.Context, a *apptypes.App, isScheduled b
 		return nil, errors.Wrap(err, "failed to load kots kinds from path")
 	}
 
+	registrySettings, err := store.GetStore().GetRegistryDetailsForApp(a.ID)
+	if err != nil {
+		return nil, errors.Wrap(err, "failed to get registry settings for app")
+	}
+
 	backupSpec, err := kotsKinds.Marshal("velero.io", "v1", "Backup")
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get backup spec from kotskinds")
 	}
 
-	renderedBackup, err := helper.RenderAppFile(a, nil, []byte(backupSpec))
+	renderedBackup, err := render.RenderFile(kotsKinds, registrySettings, []byte(backupSpec))
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to render backup")
 	}
diff --git a/kotsadm/pkg/socketservice/socketservice.go b/kotsadm/pkg/socketservice/socketservice.go
index fb6f8846f..354eadfc5 100644
--- a/kotsadm/pkg/socketservice/socketservice.go
+++ b/kotsadm/pkg/socketservice/socketservice.go
@@ -18,6 +18,7 @@ import (
 	appstatustypes "github.com/replicatedhq/kots/kotsadm/pkg/appstatus/types"
 	"github.com/replicatedhq/kots/kotsadm/pkg/downstream"
 	downstreamtypes "github.com/replicatedhq/kots/kotsadm/pkg/downstream/types"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/render"
 	"github.com/replicatedhq/kots/kotsadm/pkg/snapshot"
@@ -27,7 +28,6 @@ import (
 	"github.com/replicatedhq/kots/kotsadm/pkg/supportbundle"
 	supportbundletypes "github.com/replicatedhq/kots/kotsadm/pkg/supportbundle/types"
 	"github.com/replicatedhq/kots/kotsadm/pkg/version"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 
 	velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
 )
@@ -291,7 +291,7 @@ func (s *SocketService) processDeploySocketForApp(clusterSocket ClusterSocket, a
 		// render status informers
 		renderedInformers := []string{}
 		for _, informer := range kotsKinds.KotsApplication.Spec.StatusInformers {
-			renderedInformer, err := render.RenderContent(kotsKinds, registrySettings, deployedVersion.Sequence, a.IsAirgap, []byte(informer))
+			renderedInformer, err := render.RenderContent(kotsKinds, registrySettings, []byte(informer))
 			if err != nil {
 				logger.Error(errors.Wrap(err, "failed to render status informer"))
 				continue
diff --git a/kotsadm/pkg/store/ocistore/version_store.go b/kotsadm/pkg/store/ocistore/version_store.go
index 0290411be..2cfb17342 100644
--- a/kotsadm/pkg/store/ocistore/version_store.go
+++ b/kotsadm/pkg/store/ocistore/version_store.go
@@ -18,10 +18,9 @@ import (
 	"github.com/mholt/archiver"
 	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 	"github.com/pkg/errors"
-	apptypes "github.com/replicatedhq/kots/kotsadm/pkg/app/types"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	versiontypes "github.com/replicatedhq/kots/kotsadm/pkg/version/types"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"go.uber.org/zap"
 )
 
@@ -132,7 +131,7 @@ func (s OCIStore) IsRollbackSupportedForVersion(appID string, sequence int64) (b
 	return appVersion.KOTSKinds.KotsApplication.Spec.AllowRollback, nil
 }
 
-func (s OCIStore) IsSnapshotsSupportedForVersion(a *apptypes.App, sequence int64) (bool, error) {
+func (s OCIStore) IsSnapshotsSupportedForVersion(appID string, sequence int64) (bool, error) {
 	return false, ErrNotImplemented
 }
 
diff --git a/kotsadm/pkg/store/s3pg/version_store.go b/kotsadm/pkg/store/s3pg/version_store.go
index f6e0ed936..647b6de58 100644
--- a/kotsadm/pkg/store/s3pg/version_store.go
+++ b/kotsadm/pkg/store/s3pg/version_store.go
@@ -15,7 +15,6 @@ import (
 	"github.com/aws/aws-sdk-go/service/s3/s3manager"
 	"github.com/mholt/archiver"
 	"github.com/pkg/errors"
-	apptypes "github.com/replicatedhq/kots/kotsadm/pkg/app/types"
 	"github.com/replicatedhq/kots/kotsadm/pkg/persistence"
 	"github.com/replicatedhq/kots/kotsadm/pkg/render"
 	kotss3 "github.com/replicatedhq/kots/kotsadm/pkg/s3"
@@ -91,10 +90,10 @@ func (s S3PGStore) IsRollbackSupportedForVersion(appID string, sequence int64) (
 	return kotsAppSpec.Spec.AllowRollback, nil
 }
 
-func (s S3PGStore) IsSnapshotsSupportedForVersion(a *apptypes.App, sequence int64) (bool, error) {
+func (s S3PGStore) IsSnapshotsSupportedForVersion(appID string, sequence int64) (bool, error) {
 	db := persistence.MustGetPGSession()
 	query := `select backup_spec from app_version where app_id = $1 and sequence = $2`
-	row := db.QueryRow(query, a.ID, sequence)
+	row := db.QueryRow(query, appID, sequence)
 
 	var backupSpecStr sql.NullString
 	if err := row.Scan(&backupSpecStr); err != nil {
@@ -108,7 +107,7 @@ func (s S3PGStore) IsSnapshotsSupportedForVersion(a *apptypes.App, sequence int6
 		return false, nil
 	}
 
-	archiveDir, err := s.GetAppVersionArchive(a.ID, sequence)
+	archiveDir, err := s.GetAppVersionArchive(appID, sequence)
 	if err != nil {
 		return false, errors.Wrap(err, "failed to get app version archive")
 	}
@@ -118,13 +117,12 @@ func (s S3PGStore) IsSnapshotsSupportedForVersion(a *apptypes.App, sequence int6
 		return false, errors.Wrap(err, "failed to load kots kinds from path")
 	}
 
-	registrySettings, err := s.GetRegistryDetailsForApp(a.ID)
+	registrySettings, err := s.GetRegistryDetailsForApp(appID)
 	if err != nil {
 		return false, errors.Wrap(err, "failed to get registry settings for app")
 	}
 
-	// as far as I can tell, this is the only place within kotsadm/pkg/store that uses templating
-	rendered, err := render.RenderFile(kotsKinds, registrySettings, sequence, a.IsAirgap, []byte(backupSpecStr.String))
+	rendered, err := render.RenderFile(kotsKinds, registrySettings, []byte(backupSpecStr.String))
 	if err != nil {
 		return false, errors.Wrap(err, "failed to render backup spec")
 	}
diff --git a/kotsadm/pkg/store/store_interface.go b/kotsadm/pkg/store/store_interface.go
index 79f7e56e7..90f52ef7b 100644
--- a/kotsadm/pkg/store/store_interface.go
+++ b/kotsadm/pkg/store/store_interface.go
@@ -127,7 +127,7 @@ type SnapshotStore interface {
 type VersionStore interface {
 	IsGitOpsSupportedForVersion(appID string, sequence int64) (bool, error)
 	IsRollbackSupportedForVersion(appID string, sequence int64) (bool, error)
-	IsSnapshotsSupportedForVersion(a *apptypes.App, sequence int64) (bool, error)
+	IsSnapshotsSupportedForVersion(appID string, sequence int64) (bool, error)
 	GetAppVersionArchive(appID string, sequence int64) (archivePath string, err error)
 	CreateAppVersionArchive(appID string, sequence int64, archivePath string) error
 	CreateAppVersion(string, *int64, string, string, *kotsutil.KotsKinds) (int64, error)
diff --git a/kotsadm/pkg/updatechecker/updatechecker.go b/kotsadm/pkg/updatechecker/updatechecker.go
index 46af97b6d..99cf61edc 100644
--- a/kotsadm/pkg/updatechecker/updatechecker.go
+++ b/kotsadm/pkg/updatechecker/updatechecker.go
@@ -9,12 +9,12 @@ import (
 	"github.com/pkg/errors"
 	"github.com/replicatedhq/kots/kotsadm/pkg/app"
 	"github.com/replicatedhq/kots/kotsadm/pkg/downstream"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/license"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/kotsadm/pkg/upstream"
 	"github.com/replicatedhq/kots/kotsadm/pkg/version"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	kotspull "github.com/replicatedhq/kots/pkg/pull"
 	cron "github.com/robfig/cron/v3"
 	"go.uber.org/zap"
diff --git a/kotsadm/pkg/upstream/upstream.go b/kotsadm/pkg/upstream/upstream.go
index 3955cdbf2..01fd2cced 100644
--- a/kotsadm/pkg/upstream/upstream.go
+++ b/kotsadm/pkg/upstream/upstream.go
@@ -10,12 +10,12 @@ import (
 	"time"
 
 	"github.com/pkg/errors"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/logger"
 	"github.com/replicatedhq/kots/kotsadm/pkg/preflight"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/kotsadm/pkg/version"
 	"github.com/replicatedhq/kots/pkg/crypto"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	kotspull "github.com/replicatedhq/kots/pkg/pull"
 )
 
@@ -150,7 +150,7 @@ func DownloadUpdate(appID string, archiveDir string, toCursor string) (sequence
 		return 0, errors.Wrap(err, "failed to create version")
 	}
 
-	if err := preflight.Run(appID, newSequence, a.IsAirgap, archiveDir); err != nil {
+	if err := preflight.Run(appID, newSequence, archiveDir); err != nil {
 		return 0, errors.Wrap(err, "failed to run preflights")
 	}
 
diff --git a/kotsadm/pkg/version/version.go b/kotsadm/pkg/version/version.go
index 440753610..4d996aa80 100644
--- a/kotsadm/pkg/version/version.go
+++ b/kotsadm/pkg/version/version.go
@@ -10,12 +10,12 @@ import (
 	"github.com/replicatedhq/kots/kotsadm/pkg/config"
 	"github.com/replicatedhq/kots/kotsadm/pkg/downstream"
 	"github.com/replicatedhq/kots/kotsadm/pkg/gitops"
+	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"github.com/replicatedhq/kots/kotsadm/pkg/persistence"
 	"github.com/replicatedhq/kots/kotsadm/pkg/secrets"
 	"github.com/replicatedhq/kots/kotsadm/pkg/store"
 	"github.com/replicatedhq/kots/kotsadm/pkg/version/types"
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
-	"github.com/replicatedhq/kots/pkg/kotsutil"
 	"k8s.io/client-go/kubernetes/scheme"
 	applicationv1beta1 "sigs.k8s.io/application/api/v1beta1"
 )
diff --git a/kotskinds/apis/kots/v1beta1/airgap_types.go b/kotskinds/apis/kots/v1beta1/airgap_types.go
index 8f6509f34..da6652697 100644
--- a/kotskinds/apis/kots/v1beta1/airgap_types.go
+++ b/kotskinds/apis/kots/v1beta1/airgap_types.go
@@ -27,7 +27,6 @@ type AirgapSpec struct {
 	UpdateCursor string `json:"updateCursor,omitempty"`
 	ChannelName  string `json:"channelName,omitempty"`
 	Signature    []byte `json:"signature,omitempty"`
-	AppSlug      string `json:"appSlug,omitempty"`
 }
 
 // AirgapStatus defines the observed state of Airgap
diff --git a/pkg/base/render.go b/pkg/base/render.go
index b1cec0f06..064f0f295 100644
--- a/pkg/base/render.go
+++ b/pkg/base/render.go
@@ -16,8 +16,6 @@ type RenderOptions struct {
 	LocalRegistryUsername  string
 	LocalRegistryPassword  string
 	ExcludeKotsKinds       bool
-	Sequence               int64
-	IsAirgap               bool
 	Log                    *logger.Logger
 }
 
diff --git a/pkg/base/replicated.go b/pkg/base/replicated.go
index e87f11d7c..3b26cee9e 100644
--- a/pkg/base/replicated.go
+++ b/pkg/base/replicated.go
@@ -77,16 +77,7 @@ func renderReplicated(u *upstreamtypes.Upstream, renderOptions *RenderOptions) (
 		Password:  renderOptions.LocalRegistryPassword,
 	}
 
-	versionInfo := template.VersionInfo{
-		Sequence:     renderOptions.Sequence,
-		Cursor:       u.UpdateCursor,
-		ChannelName:  u.ChannelName,
-		VersionLabel: u.VersionLabel,
-		ReleaseNotes: u.ReleaseNotes,
-		IsAirgap:     renderOptions.IsAirgap,
-	}
-
-	builder, _, err := template.NewBuilder(configGroups, templateContext, localRegistry, cipher, license, &versionInfo)
+	builder, _, err := template.NewBuilder(configGroups, templateContext, localRegistry, cipher, license)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to create config context")
 	}
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 0605bb26b..92604f94e 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -19,8 +19,8 @@ func TemplateConfig(log *logger.Logger, configSpecData string, configValuesData
 	return templateConfig(log, configSpecData, configValuesData, licenseData, localRegistry, MarshalConfig)
 }
 
-func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry, info *template.VersionInfo) (*kotsv1beta1.Config, error) {
-	templatedString, err := templateConfigObjects(configSpec, configValues, license, localRegistry, info, MarshalConfig)
+func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry) (*kotsv1beta1.Config, error) {
+	templatedString, err := templateConfigObjects(configSpec, configValues, license, localRegistry, MarshalConfig)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to template config")
 	}
@@ -37,8 +37,8 @@ func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[stri
 	return config, nil
 }
 
-func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry, info *template.VersionInfo, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) {
-	builder, configVals, err := template.NewBuilder(configSpec.Spec.Groups, configValues, localRegistry, nil, license, info)
+func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) {
+	builder, configVals, err := template.NewBuilder(configSpec.Spec.Groups, configValues, localRegistry, nil, license)
 	if err != nil {
 		return "", errors.Wrap(err, "failed to create config context")
 	}
@@ -91,7 +91,7 @@ func templateConfig(log *logger.Logger, configSpecData string, configValuesData
 		templateContext = map[string]template.ItemValue{}
 	}
 
-	return templateConfigObjects(config, templateContext, license, localRegistry, &template.VersionInfo{}, marshalFunc)
+	return templateConfigObjects(config, templateContext, license, localRegistry, marshalFunc)
 }
 
 func ApplyValuesToConfig(config *kotsv1beta1.Config, values map[string]template.ItemValue) {
diff --git a/pkg/pull/pull.go b/pkg/pull/pull.go
index c6441d668..73a754823 100644
--- a/pkg/pull/pull.go
+++ b/pkg/pull/pull.go
@@ -114,7 +114,6 @@ func Pull(upstreamURI string, pullOptions PullOptions) (string, error) {
 	fetchOptions.UseAppDir = pullOptions.CreateAppDir
 	fetchOptions.LocalPath = pullOptions.LocalPath
 	fetchOptions.CurrentCursor = pullOptions.UpdateCursor
-	fetchOptions.AppSequence = pullOptions.AppSequence
 
 	var installation *kotsv1beta1.Installation
 
@@ -243,8 +242,6 @@ func Pull(upstreamURI string, pullOptions PullOptions) (string, error) {
 		LocalRegistryPassword:  pullOptions.RewriteImageOptions.Password,
 		ExcludeKotsKinds:       pullOptions.ExcludeKotsKinds,
 		Log:                    log,
-		Sequence:               pullOptions.AppSequence,
-		IsAirgap:               pullOptions.AirgapRoot != "",
 	}
 	log.ActionWithSpinner("Creating base")
 	io.WriteString(pullOptions.ReportWriter, "Creating base\n")
@@ -676,7 +673,7 @@ func imagesDirFromOptions(upstream *upstreamtypes.Upstream, pullOptions PullOpti
 
 func publicKeysMatch(license *kotsv1beta1.License, airgap *kotsv1beta1.Airgap) error {
 	if license == nil || airgap == nil {
-		// not sure when this would happen, but earlier logic allows this combination
+		// not sure when this would happen, but earlier logic allows this combinaion
 		return nil
 	}
 
@@ -686,11 +683,7 @@ func publicKeysMatch(license *kotsv1beta1.License, airgap *kotsv1beta1.Airgap) e
 	}
 
 	if err := verify([]byte(license.Spec.AppSlug), []byte(airgap.Spec.Signature), publicKey); err != nil {
-		if airgap.Spec.AppSlug != "" {
-			return errors.Wrapf(err, "failed to verify bundle signature - license is for app %q, airgap package for app %q", license.Spec.AppSlug, airgap.Spec.AppSlug)
-		} else {
-			return errors.Wrapf(err, "failed to verify bundle signature - airgap package does not match license app %q", license.Spec.AppSlug)
-		}
+		return errors.Wrap(err, "failed to verify bundle signature")
 	}
 
 	return nil
diff --git a/pkg/rewrite/rewrite.go b/pkg/rewrite/rewrite.go
index 9cbda7b1e..dfd06be68 100644
--- a/pkg/rewrite/rewrite.go
+++ b/pkg/rewrite/rewrite.go
@@ -41,7 +41,6 @@ type RewriteOptions struct {
 	RegistryNamespace string
 	AppSlug           string
 	IsGitOps          bool
-	AppSequence       int64
 }
 
 func Rewrite(rewriteOptions RewriteOptions) error {
@@ -99,8 +98,6 @@ func Rewrite(rewriteOptions RewriteOptions) error {
 		LocalRegistryPassword:  rewriteOptions.RegistryPassword,
 		ExcludeKotsKinds:       rewriteOptions.ExcludeKotsKinds,
 		Log:                    log,
-		Sequence:               rewriteOptions.AppSequence,
-		IsAirgap:               rewriteOptions.IsAirgap,
 	}
 	log.ActionWithSpinner("Creating base")
 	io.WriteString(rewriteOptions.ReportWriter, "Creating base\n")
diff --git a/pkg/template/builder.go b/pkg/template/builder.go
index 5f648a14d..1c503379f 100644
--- a/pkg/template/builder.go
+++ b/pkg/template/builder.go
@@ -20,19 +20,18 @@ type Builder struct {
 	Functs template.FuncMap
 }
 
-// NewBuilder creates a builder with StaticCtx, licenseCtx and ConfigCtx.
-func NewBuilder(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License, info *VersionInfo) (Builder, map[string]ItemValue, error) {
+// NewBuilder creates a builder with StaticCtx, LicenseCtx and ConfigCtx.
+func NewBuilder(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License) (Builder, map[string]ItemValue, error) {
 	b := Builder{}
-	configCtx, err := b.newConfigContext(configGroups, existingValues, localRegistry, cipher, license, info)
+	configCtx, err := b.newConfigContext(configGroups, existingValues, localRegistry, cipher, license)
 	if err != nil {
 		return Builder{}, nil, errors.Wrap(err, "create config context")
 	}
 
 	b.Ctx = []Ctx{
 		StaticCtx{},
-		licenseCtx{License: license},
-		newKurlContext("base", "default"), // can be hardcoded because kurl always deploys to the default namespace
-		newVersionCtx(info),
+		LicenseCtx{License: license},
+		NewKurlContext("base", "default"), // can be hardcoded because kurl always deploys to the default namespace
 		configCtx,
 	}
 	return b, configCtx.ItemValues, nil
diff --git a/pkg/template/config_context.go b/pkg/template/config_context.go
index a47ebd442..41d8c4ec2 100644
--- a/pkg/template/config_context.go
+++ b/pkg/template/config_context.go
@@ -69,7 +69,7 @@ type ConfigCtx struct {
 }
 
 // newConfigContext creates and returns a context for template rendering
-func (b *Builder) newConfigContext(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License, info *VersionInfo) (*ConfigCtx, error) {
+func (b *Builder) newConfigContext(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License) (*ConfigCtx, error) {
 	configCtx := &ConfigCtx{
 		ItemValues:    existingValues,
 		LocalRegistry: localRegistry,
@@ -80,9 +80,8 @@ func (b *Builder) newConfigContext(configGroups []kotsv1beta1.ConfigGroup, exist
 		Ctx: []Ctx{
 			configCtx,
 			StaticCtx{},
-			&licenseCtx{License: license},
-			newKurlContext("base", "default"),
-			newVersionCtx(info),
+			&LicenseCtx{License: license},
+			NewKurlContext("base", "default"),
 		},
 	}
 
diff --git a/pkg/template/kurl_context.go b/pkg/template/kurl_context.go
index 2d879aa5d..3f63eff1a 100644
--- a/pkg/template/kurl_context.go
+++ b/pkg/template/kurl_context.go
@@ -36,8 +36,8 @@ func GetKurlValues(installerName, nameSpace string) *kurlv1beta1.Installer {
 	return retrieved
 }
 
-func newKurlContext(installerName, nameSpace string) *kurlCtx {
-	ctx := &kurlCtx{
+func NewKurlContext(installerName, nameSpace string) *KurlCtx {
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -50,7 +50,7 @@ func newKurlContext(installerName, nameSpace string) *kurlCtx {
 	return ctx
 }
 
-func (ctx kurlCtx) AddValuesToKurlContext(retrieved *kurlv1beta1.Installer) {
+func (ctx KurlCtx) AddValuesToKurlContext(retrieved *kurlv1beta1.Installer) {
 	Spec := reflect.ValueOf(retrieved.Spec)
 
 	for i := 0; i < Spec.NumField(); i++ {
@@ -70,11 +70,11 @@ func (ctx kurlCtx) AddValuesToKurlContext(retrieved *kurlv1beta1.Installer) {
 	}
 }
 
-type kurlCtx struct {
+type KurlCtx struct {
 	KurlValues map[string]interface{}
 }
 
-func (ctx kurlCtx) FuncMap() template.FuncMap {
+func (ctx KurlCtx) FuncMap() template.FuncMap {
 	return template.FuncMap{
 		"KurlString": ctx.kurlString,
 		"KurlInt":    ctx.kurlInt,
@@ -84,7 +84,7 @@ func (ctx kurlCtx) FuncMap() template.FuncMap {
 	}
 }
 
-func (ctx kurlCtx) kurlBool(yamlPath string) bool {
+func (ctx KurlCtx) kurlBool(yamlPath string) bool {
 	if len(ctx.KurlValues) == 0 {
 		return false
 	}
@@ -104,7 +104,7 @@ func (ctx kurlCtx) kurlBool(yamlPath string) bool {
 	return b
 }
 
-func (ctx kurlCtx) kurlInt(yamlPath string) int {
+func (ctx KurlCtx) kurlInt(yamlPath string) int {
 	if len(ctx.KurlValues) == 0 {
 		return 0
 	}
@@ -124,7 +124,7 @@ func (ctx kurlCtx) kurlInt(yamlPath string) int {
 	return i
 }
 
-func (ctx kurlCtx) kurlString(yamlPath string) string {
+func (ctx KurlCtx) kurlString(yamlPath string) string {
 	if len(ctx.KurlValues) == 0 {
 		return ""
 	}
@@ -144,7 +144,7 @@ func (ctx kurlCtx) kurlString(yamlPath string) string {
 	return s
 }
 
-func (ctx kurlCtx) kurlOption(yamlPath string) string {
+func (ctx KurlCtx) kurlOption(yamlPath string) string {
 	if len(ctx.KurlValues) == 0 {
 		return ""
 	}
@@ -168,7 +168,7 @@ func (ctx kurlCtx) kurlOption(yamlPath string) string {
 	}
 }
 
-func (ctx kurlCtx) kurlAll() string {
+func (ctx KurlCtx) kurlAll() string {
 	//debug function to show all supported k:v pairs
 
 	keys := make([]string, len(ctx.KurlValues))
diff --git a/pkg/template/license_context.go b/pkg/template/license_context.go
index 324d7d388..021f7df27 100644
--- a/pkg/template/license_context.go
+++ b/pkg/template/license_context.go
@@ -10,19 +10,19 @@ import (
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
 )
 
-type licenseCtx struct {
+type LicenseCtx struct {
 	License *kotsv1beta1.License
 }
 
-// FuncMap represents the available functions in the licenseCtx.
-func (ctx licenseCtx) FuncMap() template.FuncMap {
+// FuncMap represents the available functions in the LicenseCtx.
+func (ctx LicenseCtx) FuncMap() template.FuncMap {
 	return template.FuncMap{
 		"LicenseFieldValue": ctx.licenseFieldValue,
 		"LicenseDockerCfg":  ctx.licenseDockercfg,
 	}
 }
 
-func (ctx licenseCtx) licenseFieldValue(name string) string {
+func (ctx LicenseCtx) licenseFieldValue(name string) string {
 	// return "" for a nil license - it's better than an error, which makes the template engine return "" for the full string
 	if ctx.License == nil {
 		return ""
@@ -60,7 +60,7 @@ func (ctx licenseCtx) licenseFieldValue(name string) string {
 	}
 }
 
-func (ctx licenseCtx) licenseDockercfg() string {
+func (ctx LicenseCtx) licenseDockercfg() string {
 	// return "" for a nil license - it's better than an error, which makes the template engine return "" for the full string
 	if ctx.License == nil {
 		return ""
diff --git a/pkg/template/version_context.go b/pkg/template/version_context.go
deleted file mode 100644
index 2889304c8..000000000
--- a/pkg/template/version_context.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package template
-
-import (
-	"text/template"
-
-	"github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
-)
-
-type VersionInfo struct {
-	Sequence     int64  // the installation sequence. Always 0 when being freshly installed, etc
-	Cursor       string // the upstream version cursor - integers for kots apps, may be semvers for helm charts
-	ChannelName  string // the name of the channel that the current version was from (kots apps only)
-	VersionLabel string // a pretty version label if provided (kots apps only)
-	ReleaseNotes string // the release notes for the given version (kots apps only)
-	IsAirgap     bool   // is this an airgap app (kots apps only)
-}
-
-type versionCtx struct {
-	info *VersionInfo
-}
-
-func newVersionCtx(info *VersionInfo) versionCtx {
-	return versionCtx{info: info}
-}
-
-func VersionInfoFromInstallation(sequence int64, isAirgap bool, spec v1beta1.InstallationSpec) VersionInfo {
-	return VersionInfo{
-		Sequence:     sequence,
-		Cursor:       spec.UpdateCursor,
-		ChannelName:  spec.ChannelName,
-		VersionLabel: spec.VersionLabel,
-		ReleaseNotes: spec.ReleaseNotes,
-		IsAirgap:     isAirgap,
-	}
-}
-
-// FuncMap represents the available functions in the versionCtx.
-func (ctx versionCtx) FuncMap() template.FuncMap {
-	return template.FuncMap{
-		"Sequence":     ctx.sequence,
-		"Cursor":       ctx.cursor,
-		"ChannelName":  ctx.channelName,
-		"VersionLabel": ctx.versionLabel,
-		"ReleaseNotes": ctx.releaseNotes,
-		"IsAirgap":     ctx.isAirgap,
-	}
-}
-
-func (ctx versionCtx) sequence() int64 {
-	if ctx.info == nil {
-		return -1
-	}
-	return ctx.info.Sequence
-}
-
-func (ctx versionCtx) cursor() string {
-	if ctx.info == nil {
-		return ""
-	}
-	return ctx.info.Cursor
-}
-
-func (ctx versionCtx) channelName() string {
-	if ctx.info == nil {
-		return ""
-	}
-	return ctx.info.ChannelName
-}
-
-func (ctx versionCtx) versionLabel() string {
-	if ctx.info == nil {
-		return ""
-	}
-	return ctx.info.VersionLabel
-}
-
-func (ctx versionCtx) releaseNotes() string {
-	if ctx.info == nil {
-		return ""
-	}
-	return ctx.info.ReleaseNotes
-}
-
-func (ctx versionCtx) isAirgap() bool {
-	if ctx.info == nil {
-		return false
-	}
-	return ctx.info.IsAirgap
-}
diff --git a/pkg/upstream/fetch.go b/pkg/upstream/fetch.go
index 535c7bebb..a90c3b375 100644
--- a/pkg/upstream/fetch.go
+++ b/pkg/upstream/fetch.go
@@ -24,7 +24,6 @@ type FetchOptions struct {
 	CurrentCursor       string
 	CurrentChannel      string
 	CurrentVersionLabel string
-	AppSequence         int64
 }
 
 func FetchUpstream(upstreamURI string, fetchOptions *FetchOptions) (*types.Upstream, error) {
@@ -58,7 +57,7 @@ func downloadUpstream(upstreamURI string, fetchOptions *FetchOptions) (*types.Up
 		return downloadHelm(u, fetchOptions.HelmRepoURI)
 	}
 	if u.Scheme == "replicated" {
-		return downloadReplicated(u, fetchOptions.LocalPath, fetchOptions.RootDir, fetchOptions.UseAppDir, fetchOptions.License, fetchOptions.ConfigValues, pickCursor(fetchOptions), pickVersionLabel(fetchOptions), cipher, fetchOptions.AppSequence, fetchOptions.Airgap != nil)
+		return downloadReplicated(u, fetchOptions.LocalPath, fetchOptions.RootDir, fetchOptions.UseAppDir, fetchOptions.License, fetchOptions.ConfigValues, pickCursor(fetchOptions), pickVersionLabel(fetchOptions), cipher)
 	}
 	if u.Scheme == "git" {
 		return downloadGit(upstreamURI)
diff --git a/pkg/upstream/replicated.go b/pkg/upstream/replicated.go
index a38887671..a1db31e61 100644
--- a/pkg/upstream/replicated.go
+++ b/pkg/upstream/replicated.go
@@ -114,7 +114,7 @@ func getUpdatesReplicated(u *url.URL, localPath string, currentCursor Replicated
 	return updates, nil
 }
 
-func downloadReplicated(u *url.URL, localPath string, rootDir string, useAppDir bool, license *kotsv1beta1.License, existingConfigValues *kotsv1beta1.ConfigValues, updateCursor ReplicatedCursor, versionLabel string, cipher *crypto.AESCipher, appSequence int64, isAirgap bool) (*types.Upstream, error) {
+func downloadReplicated(u *url.URL, localPath string, rootDir string, useAppDir bool, license *kotsv1beta1.License, existingConfigValues *kotsv1beta1.ConfigValues, updateCursor ReplicatedCursor, versionLabel string, cipher *crypto.AESCipher) (*types.Upstream, error) {
 	var release *Release
 
 	if localPath != "" {
@@ -162,12 +162,6 @@ func downloadReplicated(u *url.URL, localPath string, rootDir string, useAppDir
 		release.ReleaseNotes = application.Spec.ReleaseNotes
 	}
 
-	// get channel name from license, if one was provided
-	channelName := ""
-	if license != nil {
-		channelName = license.Spec.ChannelName
-	}
-
 	if existingConfigValues == nil {
 		var prevConfigFile string
 		if useAppDir {
@@ -187,18 +181,9 @@ func downloadReplicated(u *url.URL, localPath string, rootDir string, useAppDir
 		return nil, errors.Wrap(err, "failed to find config in release")
 	}
 	if config != nil || existingConfigValues != nil {
-		versionInfo := template.VersionInfo{
-			Sequence:     appSequence,
-			Cursor:       updateCursor.Cursor,
-			ChannelName:  channelName,
-			VersionLabel: release.VersionLabel,
-			ReleaseNotes: release.ReleaseNotes,
-			IsAirgap:     isAirgap,
-		}
-
 		// If config existed and was removed from the app,
 		// values will be carried over to the new version anyway.
-		configValues, err := createConfigValues(application.Name, config, existingConfigValues, cipher, license, &versionInfo)
+		configValues, err := createConfigValues(application.Name, config, existingConfigValues, cipher, license)
 		if err != nil {
 			return nil, errors.Wrap(err, "failed to create empty config values")
 		}
@@ -216,6 +201,12 @@ func downloadReplicated(u *url.URL, localPath string, rootDir string, useAppDir
 		return nil, errors.Wrap(err, "failed to get files from release")
 	}
 
+	// get channel name from license, if one was provided
+	channelName := ""
+	if license != nil {
+		channelName = license.Spec.ChannelName
+	}
+
 	upstream := &types.Upstream{
 		URI:           u.RequestURI(),
 		Name:          application.Name,
@@ -496,7 +487,7 @@ func mustMarshalConfigValues(configValues *kotsv1beta1.ConfigValues) []byte {
 	return b.Bytes()
 }
 
-func createConfigValues(applicationName string, config *kotsv1beta1.Config, existingConfigValues *kotsv1beta1.ConfigValues, cipher *crypto.AESCipher, license *kotsv1beta1.License, versionInfo *template.VersionInfo) (*kotsv1beta1.ConfigValues, error) {
+func createConfigValues(applicationName string, config *kotsv1beta1.Config, existingConfigValues *kotsv1beta1.ConfigValues, cipher *crypto.AESCipher, license *kotsv1beta1.License) (*kotsv1beta1.ConfigValues, error) {
 	templateContextValues := make(map[string]template.ItemValue)
 
 	var newValues kotsv1beta1.ConfigValuesSpec
@@ -538,7 +529,7 @@ func createConfigValues(applicationName string, config *kotsv1beta1.Config, exis
 	// We should get this supported before 1.13.0 ships
 	localRegistry := template.LocalRegistry{}
 
-	builder, _, err := template.NewBuilder(config.Spec.Groups, templateContextValues, localRegistry, cipher, license, versionInfo)
+	builder, _, err := template.NewBuilder(config.Spec.Groups, templateContextValues, localRegistry, cipher, license)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to create config context")
 	}


Test patch:
diff --git a/cmd/kots/cli/util_test.go b/cmd/kots/cli/util_test.go
index 3e63da354..fac4feb8c 100644
--- a/cmd/kots/cli/util_test.go
+++ b/cmd/kots/cli/util_test.go
@@ -6,6 +6,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func TestExpandDir(t *testing.T) {
diff --git a/integration/replicated/pull_test.go b/integration/replicated/pull_test.go
index b742a56d1..acc14084a 100644
--- a/integration/replicated/pull_test.go
+++ b/integration/replicated/pull_test.go
@@ -1,5 +1,9 @@
 package replicated
 
+import (
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
+)
+
 type replicatedPullTest struct {
 	name    string
 	testDir string
diff --git a/integration/upload/upload_test.go b/integration/upload/upload_test.go
index 21f9be7b7..26e4063bf 100644
--- a/integration/upload/upload_test.go
+++ b/integration/upload/upload_test.go
@@ -9,6 +9,7 @@ import (
 	kotsupload "github.com/replicatedhq/kots/pkg/upload"
 	"github.com/replicatedhq/kots/pkg/util"
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_Upload(t *testing.T) {
diff --git a/kotsadm/operator/pkg/appstate/resource_test.go b/kotsadm/operator/pkg/appstate/resource_test.go
index 4483ea218..9eb785077 100644
--- a/kotsadm/operator/pkg/appstate/resource_test.go
+++ b/kotsadm/operator/pkg/appstate/resource_test.go
@@ -2,6 +2,8 @@ package appstate
 
 import (
 	"testing"
+
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_getResourceKindCommonName(t *testing.T) {
diff --git a/kotsadm/operator/pkg/appstate/types/types_test.go b/kotsadm/operator/pkg/appstate/types/types_test.go
index 1fcfc02f7..edad76f75 100644
--- a/kotsadm/operator/pkg/appstate/types/types_test.go
+++ b/kotsadm/operator/pkg/appstate/types/types_test.go
@@ -3,6 +3,8 @@ package types
 import (
 	"reflect"
 	"testing"
+
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func TestStatusInformerString_Parse(t *testing.T) {
diff --git a/kotsadm/operator/pkg/pacts/desired_test.go b/kotsadm/operator/pkg/pacts/desired_test.go
index 123237ca5..dad2a5104 100644
--- a/kotsadm/operator/pkg/pacts/desired_test.go
+++ b/kotsadm/operator/pkg/pacts/desired_test.go
@@ -8,6 +8,7 @@ import (
 	"testing"
 
 	"github.com/pact-foundation/pact-go/dsl"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_GetDesiredState(t *testing.T) {
diff --git a/kotsadm/operator/pkg/pacts/pact_test.go b/kotsadm/operator/pkg/pacts/pact_test.go
index 78f6e6a7e..78911f301 100644
--- a/kotsadm/operator/pkg/pacts/pact_test.go
+++ b/kotsadm/operator/pkg/pacts/pact_test.go
@@ -6,6 +6,7 @@ import (
 	"testing"
 
 	"github.com/pact-foundation/pact-go/dsl"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 var (
diff --git a/kotsadm/operator/pkg/util/kubectl_version_test.go b/kotsadm/operator/pkg/util/kubectl_version_test.go
index 592ea6959..975331493 100644
--- a/kotsadm/operator/pkg/util/kubectl_version_test.go
+++ b/kotsadm/operator/pkg/util/kubectl_version_test.go
@@ -2,6 +2,8 @@ package util
 
 import (
 	"testing"
+
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_matchKnownVersion(t *testing.T) {
diff --git a/kotsadm/operator/pkg/util/throttler_test.go b/kotsadm/operator/pkg/util/throttler_test.go
index d917e5cd0..d8a799ef6 100644
--- a/kotsadm/operator/pkg/util/throttler_test.go
+++ b/kotsadm/operator/pkg/util/throttler_test.go
@@ -4,6 +4,8 @@ import (
 	"sync/atomic"
 	"testing"
 	"time"
+
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func TestThrottle(t *testing.T) {
diff --git a/kotsadm/pkg/downstream/diff_test.go b/kotsadm/pkg/downstream/diff_test.go
index 29676e922..780f7ad1d 100644
--- a/kotsadm/pkg/downstream/diff_test.go
+++ b/kotsadm/pkg/downstream/diff_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 	"gopkg.in/go-playground/assert.v1"
 )
 
diff --git a/kotsadm/pkg/redact/redact_test.go b/kotsadm/pkg/redact/redact_test.go
index 2870b19b4..f6b41d369 100644
--- a/kotsadm/pkg/redact/redact_test.go
+++ b/kotsadm/pkg/redact/redact_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/replicatedhq/kots/kotsadm/pkg/redact/types"
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
diff --git a/kotsadm/pkg/store/ocistore/version_store_test.go b/kotsadm/pkg/store/ocistore/version_store_test.go
index ce1e0f099..9f54c42a7 100644
--- a/kotsadm/pkg/store/ocistore/version_store_test.go
+++ b/kotsadm/pkg/store/ocistore/version_store_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/assert"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_refFromAppVersion(t *testing.T) {
diff --git a/kotsadm/pkg/supportbundle/archive_test.go b/kotsadm/pkg/supportbundle/archive_test.go
index 90ad5fed5..3bd91a367 100644
--- a/kotsadm/pkg/supportbundle/archive_test.go
+++ b/kotsadm/pkg/supportbundle/archive_test.go
@@ -2,6 +2,8 @@ package supportbundle
 
 import (
 	"testing"
+
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_refFromBundleID(t *testing.T) {
diff --git a/kotskinds/apis/kots/v1beta1/helmchart_types_test.go b/kotskinds/apis/kots/v1beta1/helmchart_types_test.go
index 5c0a7169c..5e0f438df 100644
--- a/kotskinds/apis/kots/v1beta1/helmchart_types_test.go
+++ b/kotskinds/apis/kots/v1beta1/helmchart_types_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_UnmarshalValues(t *testing.T) {
diff --git a/kotskinds/apis/kots/v1beta1/v1beta1tests/helmchart_types_test.go b/kotskinds/apis/kots/v1beta1/v1beta1tests/helmchart_types_test.go
index 757a010b6..97dc09761 100644
--- a/kotskinds/apis/kots/v1beta1/v1beta1tests/helmchart_types_test.go
+++ b/kotskinds/apis/kots/v1beta1/v1beta1tests/helmchart_types_test.go
@@ -7,6 +7,7 @@ import (
 	kotsscheme "github.com/replicatedhq/kots/kotskinds/client/kotsclientset/scheme"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 	"k8s.io/client-go/kubernetes/scheme"
 )
 
diff --git a/kotskinds/apis/kots/v1beta1/v1beta1tests/license_types_test.go b/kotskinds/apis/kots/v1beta1/v1beta1tests/license_types_test.go
index 46f6a50c5..6aecee523 100644
--- a/kotskinds/apis/kots/v1beta1/v1beta1tests/license_types_test.go
+++ b/kotskinds/apis/kots/v1beta1/v1beta1tests/license_types_test.go
@@ -7,6 +7,7 @@ import (
 	kotsscheme "github.com/replicatedhq/kots/kotskinds/client/kotsclientset/scheme"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 	"k8s.io/client-go/kubernetes/scheme"
 )
 
diff --git a/kotskinds/multitype/main_test.go b/kotskinds/multitype/main_test.go
new file mode 100644
index 000000000..5e9f7788a
--- /dev/null
+++ b/kotskinds/multitype/main_test.go
@@ -0,0 +1,12 @@
+package multitype
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/kotskinds/multitype/quotedbool_test.go b/kotskinds/multitype/quotedbool_test.go
index 9bafec2ae..d8d201707 100644
--- a/kotskinds/multitype/quotedbool_test.go
+++ b/kotskinds/multitype/quotedbool_test.go
@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	yaml "gopkg.in/yaml.v2"
 )
 
@@ -47,6 +48,9 @@ func TestQuotedBool_UnmarshalJSON(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			var newQuotBool QuotedBool
@@ -112,6 +116,9 @@ func TestQuotedBool_UnmarshalYAML(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			var newQuotBool QuotedBool
diff --git a/pkg/base/base_test.go b/pkg/base/base_test.go
index 3f36aef22..22c83de96 100644
--- a/pkg/base/base_test.go
+++ b/pkg/base/base_test.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func Test_transpileHelmHooksToKotsHooks(t *testing.T) {
@@ -119,6 +120,8 @@ status: {}
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			b := BaseFile{
@@ -421,6 +424,9 @@ spec:
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			b := BaseFile{
 				Path:    test.path,
 				Content: test.content,
diff --git a/pkg/base/main_test.go b/pkg/base/main_test.go
new file mode 100644
index 000000000..1752f6e2b
--- /dev/null
+++ b/pkg/base/main_test.go
@@ -0,0 +1,12 @@
+package base
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/base/write_test.go b/pkg/base/write_test.go
index c9330f8e6..caf703941 100644
--- a/pkg/base/write_test.go
+++ b/pkg/base/write_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 var (
@@ -242,6 +243,8 @@ func Test_DeduplicateOnContent(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			actualResources, actualPatches, err := deduplicateOnContent(test.files, test.excludeKotsKinds, "test")
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 5a9ea6cb9..675b0944b 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/replicatedhq/kots/pkg/logger"
 	"github.com/replicatedhq/kots/pkg/template"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	"k8s.io/apimachinery/pkg/runtime/serializer/json"
 	"k8s.io/client-go/kubernetes/scheme"
 )
@@ -243,6 +244,9 @@ status: {}
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			decode := scheme.Codecs.UniversalDeserializer().Decode
diff --git a/pkg/config/main_test.go b/pkg/config/main_test.go
new file mode 100644
index 000000000..fea9abf09
--- /dev/null
+++ b/pkg/config/main_test.go
@@ -0,0 +1,12 @@
+package config
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/cursor/cursor_test.go b/pkg/cursor/cursor_test.go
index 2aeed7f8b..ac85cb467 100644
--- a/pkg/cursor/cursor_test.go
+++ b/pkg/cursor/cursor_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/assert"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func Test_Comparable(t *testing.T) {
@@ -50,6 +51,8 @@ func Test_Comparable(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			c1, err := NewCursor(test.c1)
 			if test.c1Error {
 				assert.Error(t, err)
diff --git a/pkg/cursor/main_test.go b/pkg/cursor/main_test.go
new file mode 100644
index 000000000..7c42f42d6
--- /dev/null
+++ b/pkg/cursor/main_test.go
@@ -0,0 +1,12 @@
+package cursor
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/image/builder_test.go b/pkg/image/builder_test.go
index b5a47552e..56e71837e 100644
--- a/pkg/image/builder_test.go
+++ b/pkg/image/builder_test.go
@@ -4,9 +4,12 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestReleaseStartNum(t *testing.T) {
+	test := scopeagent.StartTest(t)
+	defer test.End()
 	var err error
 	var ref *ImageRef
 
diff --git a/pkg/image/image_test.go b/pkg/image/image_test.go
index ebc85d354..d466c5774 100644
--- a/pkg/image/image_test.go
+++ b/pkg/image/image_test.go
@@ -7,6 +7,7 @@ import (
 	"github.com/replicatedhq/kots/pkg/docker/registry"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	kustomizetypes "sigs.k8s.io/kustomize/api/types"
 )
 
@@ -91,6 +92,8 @@ func Test_ImageNameFromNameParts(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			image, err := ImageInfoFromFile(test.registryOps, test.parts)
 			if test.isError {
 				assert.Error(t, err)
@@ -154,6 +157,8 @@ func TestDestRef(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			if got := DestRef(tt.args.registry, tt.args.srcImage); got != tt.want {
 				t.Errorf("DestImageName() = %v, want %v", got, tt.want)
 			}
@@ -314,6 +319,8 @@ func Test_buildImageAlts(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 			got, err := buildImageAlts(tt.destRegistry, tt.image)
 			req.NoError(err)
@@ -361,6 +368,8 @@ func Test_stripImageTag(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			if got := stripImageTag(tt.image); got != tt.want {
 				t.Errorf("stripImageTag() = %v, want %v", got, tt.want)
 			}
diff --git a/pkg/image/main_test.go b/pkg/image/main_test.go
new file mode 100644
index 000000000..1ea35b3c7
--- /dev/null
+++ b/pkg/image/main_test.go
@@ -0,0 +1,12 @@
+package image
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/k8sutil/main_test.go b/pkg/k8sutil/main_test.go
new file mode 100644
index 000000000..2087f7470
--- /dev/null
+++ b/pkg/k8sutil/main_test.go
@@ -0,0 +1,12 @@
+package k8sutil
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/k8sutil/updaterole_test.go b/pkg/k8sutil/updaterole_test.go
index 0ed064be4..f67b216b9 100644
--- a/pkg/k8sutil/updaterole_test.go
+++ b/pkg/k8sutil/updaterole_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	rbacv1 "k8s.io/api/rbac/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -144,6 +145,8 @@ func TestUpdateRole(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 			UpdateRole(tt.existingRole, tt.desiredRole)
 			req.ElementsMatch(tt.existingRole.Rules, tt.expectedRules)
diff --git a/pkg/kotsadm/kotsad_version_test.go b/pkg/kotsadm/kotsad_version_test.go
new file mode 100644
index 000000000..148912b6f
--- /dev/null
+++ b/pkg/kotsadm/kotsad_version_test.go
@@ -0,0 +1,51 @@
+package kotsadm
+
+import (
+	"testing"
+
+	"github.com/replicatedhq/kots/pkg/kotsadm/types"
+	"github.com/stretchr/testify/assert"
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func Test_kotsadmRegistry(t *testing.T) {
+	tests := []struct {
+		name              string
+		overrideVersion   string
+		overrideRegistry  string
+		overrideNamespace string
+		expected          string
+	}{
+		{
+			name:     "no overrides",
+			expected: "kotsadm",
+		},
+		{
+			name:             "local registry",
+			overrideRegistry: "localhost:32000",
+			expected:         "localhost:32000/kotsadm",
+		},
+		{
+			name:              "local registry, custom namespace",
+			overrideRegistry:  "registry.somebigbank.com",
+			overrideNamespace: "my-namespace",
+			expected:          "registry.somebigbank.com/my-namespace",
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
+			options := types.KotsadmOptions{
+				OverrideVersion:   test.overrideVersion,
+				OverrideRegistry:  test.overrideRegistry,
+				OverrideNamespace: test.overrideNamespace,
+			}
+
+			actual := kotsadmRegistry(options)
+			assert.Equal(t, test.expected, actual)
+		})
+	}
+}
diff --git a/pkg/kotsadm/kotsadm_version_test.go b/pkg/kotsadm/kotsadm_version_test.go
index dd9ae8d3b..7f3368ae8 100644
--- a/pkg/kotsadm/kotsadm_version_test.go
+++ b/pkg/kotsadm/kotsadm_version_test.go
@@ -3,8 +3,8 @@ package kotsadm
 import (
 	"testing"
 
-	"github.com/replicatedhq/kots/pkg/kotsadm/types"
 	"github.com/stretchr/testify/assert"
+	_ "go.undefinedlabs.com/scopeagent/autoinstrument"
 )
 
 func Test_kotsadmTagForVersionString(t *testing.T) {
@@ -37,42 +37,3 @@ func Test_kotsadmTagForVersionString(t *testing.T) {
 		})
 	}
 }
-
-func Test_kotsadmRegistry(t *testing.T) {
-	tests := []struct {
-		name              string
-		overrideVersion   string
-		overrideRegistry  string
-		overrideNamespace string
-		expected          string
-	}{
-		{
-			name:     "no overrides",
-			expected: "kotsadm",
-		},
-		{
-			name:             "local registry",
-			overrideRegistry: "localhost:32000",
-			expected:         "localhost:32000/kotsadm",
-		},
-		{
-			name:              "local registry, custom namespace",
-			overrideRegistry:  "registry.somebigbank.com",
-			overrideNamespace: "my-namespace",
-			expected:          "registry.somebigbank.com/my-namespace",
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			options := types.KotsadmOptions{
-				OverrideVersion:   test.overrideVersion,
-				OverrideRegistry:  test.overrideRegistry,
-				OverrideNamespace: test.overrideNamespace,
-			}
-
-			actual := kotsadmRegistry(options)
-			assert.Equal(t, test.expected, actual)
-		})
-	}
-}
diff --git a/pkg/kotsadm/main_test.go b/pkg/kotsadm/main_test.go
new file mode 100644
index 000000000..708b56399
--- /dev/null
+++ b/pkg/kotsadm/main_test.go
@@ -0,0 +1,12 @@
+package kotsadm
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/midstream/lists_test.go b/pkg/midstream/lists_test.go
index 74f3d933a..c2569576c 100644
--- a/pkg/midstream/lists_test.go
+++ b/pkg/midstream/lists_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/assert"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func Test_findNewStrings(t *testing.T) {
@@ -30,6 +31,8 @@ func Test_findNewStrings(t *testing.T) {
 	}
 
 	for _, test := range tests {
+		scopetest := scopeagent.StartTest(t)
+		defer scopetest.End()
 		diff := findNewStrings(test.newList, test.existingList)
 		assert.Equal(t, test.expected, diff)
 	}
diff --git a/pkg/midstream/main_test.go b/pkg/midstream/main_test.go
new file mode 100644
index 000000000..3a6724c5c
--- /dev/null
+++ b/pkg/midstream/main_test.go
@@ -0,0 +1,12 @@
+package midstream
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/pull/main_test.go b/pkg/pull/main_test.go
new file mode 100644
index 000000000..2c4ae1104
--- /dev/null
+++ b/pkg/pull/main_test.go
@@ -0,0 +1,12 @@
+package pull
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/pull/upstream_test.go b/pkg/pull/upstream_test.go
index 6e2168f9c..97e2af2f3 100644
--- a/pkg/pull/upstream_test.go
+++ b/pkg/pull/upstream_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/assert"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestRewriteUpstream(t *testing.T) {
@@ -26,6 +27,8 @@ func TestRewriteUpstream(t *testing.T) {
 	}
 	for _, test := range tests {
 		t.Run(test.upstreamURI, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			actual := RewriteUpstream(test.upstreamURI)
 			assert.Equal(t, actual, test.expected)
 		})
diff --git a/pkg/template/builder_test.go b/pkg/template/builder_test.go
index 7200517a8..8ae5964f9 100644
--- a/pkg/template/builder_test.go
+++ b/pkg/template/builder_test.go
@@ -5,6 +5,7 @@ import (
 	"text/template"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 type testContext struct {
@@ -211,17 +212,23 @@ func TestBuildStrings(t *testing.T) {
 
 	for _, test := range cases {
 		t.Run(test.name(), func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			test.runTest(t, builder)
 		})
 	}
 
 	t.Run("Test bad values", func(t *testing.T) {
+		scopetest := scopeagent.StartTest(t)
+		defer scopetest.End()
 		built, err := builder.String("{{repl ParseBool True}}")
 		require.New(t).Error(err)
 		require.New(t).Equal("", built)
 	})
 
 	t.Run("Test broken template syntax", func(t *testing.T) {
+		scopetest := scopeagent.StartTest(t)
+		defer scopetest.End()
 		built, err := builder.String("{{repl SomeFunc")
 		require.New(t).Error(err)
 		require.New(t).Equal("", built)
diff --git a/pkg/template/config_context_test.go b/pkg/template/config_context_test.go
index cfd55a35a..e9738af54 100644
--- a/pkg/template/config_context_test.go
+++ b/pkg/template/config_context_test.go
@@ -8,6 +8,7 @@ import (
 	"github.com/replicatedhq/kots/kotskinds/multitype"
 	"github.com/replicatedhq/kots/pkg/crypto"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -354,6 +355,9 @@ func TestBuilder_NewConfigContext(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			// expect license to be the one passed as an arg unless the test overrides this
@@ -365,7 +369,7 @@ func TestBuilder_NewConfigContext(t *testing.T) {
 			builder.AddCtx(StaticCtx{})
 
 			localRegistry := LocalRegistry{}
-			got, err := builder.newConfigContext(tt.args.configGroups, tt.args.templateContext, localRegistry, tt.args.cipher, tt.args.license, nil)
+			got, err := builder.newConfigContext(tt.args.configGroups, tt.args.templateContext, localRegistry, tt.args.cipher, tt.args.license)
 			req.NoError(err)
 			req.Equal(tt.want, got)
 		})
@@ -481,6 +485,9 @@ func Test_localImageName(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			newName := test.ctx.localImageName(test.image)
@@ -538,6 +545,9 @@ func TestConfigCtx_localRegistryImagePullSecret(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			req := require.New(t)
 
 			ctx := ConfigCtx{
diff --git a/pkg/template/depgraph_test.go b/pkg/template/depgraph_test.go
index c1e84aee5..ff2e3fb40 100644
--- a/pkg/template/depgraph_test.go
+++ b/pkg/template/depgraph_test.go
@@ -7,6 +7,7 @@ import (
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
 	"github.com/replicatedhq/kots/kotskinds/multitype"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 type depGraphTestCase struct {
@@ -231,6 +232,9 @@ func TestDepGraph(t *testing.T) {
 	}
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			graph := depGraph{}
 			for source, deps := range test.dependencies {
 				graph.AddNode(source)
@@ -271,6 +275,9 @@ func TestDepGraph(t *testing.T) {
 		})
 
 		t.Run(test.name+"+parse", func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
+
 			graph := depGraph{}
 
 			groups := buildTestConfigGroups(
diff --git a/pkg/template/kurl_context_test.go b/pkg/template/kurl_context_test.go
index ee1618b7c..729f988a6 100644
--- a/pkg/template/kurl_context_test.go
+++ b/pkg/template/kurl_context_test.go
@@ -5,13 +5,16 @@ import (
 
 	kurlv1beta1 "github.com/replicatedhq/kurl/kurlkinds/pkg/apis/cluster/v1beta1"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func TestBoolPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -22,9 +25,11 @@ func TestBoolPresent(t *testing.T) {
 }
 
 func TestBoolNotPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -35,9 +40,11 @@ func TestBoolNotPresent(t *testing.T) {
 }
 
 func TestBoolInvalidType(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -48,9 +55,11 @@ func TestBoolInvalidType(t *testing.T) {
 }
 
 func TestStringPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -61,9 +70,11 @@ func TestStringPresent(t *testing.T) {
 }
 
 func TestStringNotPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -74,9 +85,11 @@ func TestStringNotPresent(t *testing.T) {
 }
 
 func TestStringInvalidType(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -87,9 +100,11 @@ func TestStringInvalidType(t *testing.T) {
 }
 
 func TestIntPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -100,9 +115,11 @@ func TestIntPresent(t *testing.T) {
 }
 
 func TestIntNotPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -113,9 +130,11 @@ func TestIntNotPresent(t *testing.T) {
 }
 
 func TestIntInvalidType(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -126,9 +145,11 @@ func TestIntInvalidType(t *testing.T) {
 }
 
 func TestOptionPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -139,9 +160,11 @@ func TestOptionPresent(t *testing.T) {
 }
 
 func TestOptionNotPresent(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -152,9 +175,11 @@ func TestOptionNotPresent(t *testing.T) {
 }
 
 func TestKurlAll(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
@@ -167,9 +192,11 @@ func TestKurlAll(t *testing.T) {
 }
 
 func TestParseInstallerProperly(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := &kurlCtx{
+	ctx := &KurlCtx{
 		KurlValues: make(map[string]interface{}),
 	}
 
diff --git a/pkg/template/license_context_test.go b/pkg/template/license_context_test.go
index e2772b1b5..45f6e9d71 100644
--- a/pkg/template/license_context_test.go
+++ b/pkg/template/license_context_test.go
@@ -5,12 +5,15 @@ import (
 
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestLicenseContext_dockercfg(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
-	ctx := licenseCtx{
+	ctx := LicenseCtx{
 		License: &kotsv1beta1.License{
 			Spec: kotsv1beta1.LicenseSpec{
 				LicenseID: "abcdef",
@@ -226,9 +229,11 @@ func TestLicenseCtx_licenseFieldValue(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
-			ctx := licenseCtx{
+			ctx := LicenseCtx{
 				License: tt.License,
 			}
 			req.Equal(tt.want, ctx.licenseFieldValue(tt.fieldName))
diff --git a/pkg/template/main_test.go b/pkg/template/main_test.go
new file mode 100644
index 000000000..f8c8204a5
--- /dev/null
+++ b/pkg/template/main_test.go
@@ -0,0 +1,12 @@
+package template
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/template/random_test.go b/pkg/template/random_test.go
index c30930ae4..02b68e071 100644
--- a/pkg/template/random_test.go
+++ b/pkg/template/random_test.go
@@ -8,9 +8,13 @@ import (
 	"unicode/utf8"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestGenerateRandomString(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
+
 	req := require.New(t)
 	ctx := &StaticCtx{}
 	seenStrings := map[string]struct{}{}
@@ -71,6 +75,8 @@ func TestGenerateRandomStringTemplates(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			builder := Builder{}
@@ -95,6 +101,9 @@ func TestGenerateRandomStringTemplates(t *testing.T) {
 }
 
 func TestRandomBytes(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
+
 	req := require.New(t)
 	ctx := &StaticCtx{}
 	seenStrings := map[string]struct{}{}
diff --git a/pkg/template/static_context_test.go b/pkg/template/static_context_test.go
index 6bff927ee..908bc1b6b 100644
--- a/pkg/template/static_context_test.go
+++ b/pkg/template/static_context_test.go
@@ -7,9 +7,12 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestStaticContext_kubeSeal_badCert(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	ctx := StaticCtx{}
@@ -24,6 +27,8 @@ SPA=
 }
 
 func TestStaticContext_kubeSeal_goodCert(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	ctx := StaticCtx{}
@@ -63,6 +68,8 @@ yw==
 }
 
 func TestSprigRandom(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	builder := Builder{}
@@ -88,6 +95,8 @@ func validateAndClearCaCert(req *require.Assertions, builder Builder) {
 }
 
 func TestTlsCaCert(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	builder := Builder{}
@@ -96,6 +105,8 @@ func TestTlsCaCert(t *testing.T) {
 }
 
 func TestTlsCertFromCa(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	builder := Builder{}
@@ -120,6 +131,8 @@ func TestTlsCertFromCa(t *testing.T) {
 }
 
 func TestTlsKeyFromCa(t *testing.T) {
+	scopetest := scopeagent.StartTest(t)
+	defer scopetest.End()
 	req := require.New(t)
 
 	builder := Builder{}
diff --git a/pkg/template/version_context_test.go b/pkg/template/version_context_test.go
deleted file mode 100644
index 5a0ea35b7..000000000
--- a/pkg/template/version_context_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package template
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestVersionContext(t *testing.T) {
-	req := require.New(t)
-
-	// a properly populated versionCtx - should return the appropriate values
-	ctx := versionCtx{
-		info: &VersionInfo{
-			Sequence:     5,
-			Cursor:       "five",
-			ChannelName:  "chanFive",
-			VersionLabel: "verFive",
-			ReleaseNotes: "this is five",
-			IsAirgap:     true,
-		},
-	}
-
-	// an unpopulated versionCtx - should not error/panic
-	nilCtx := versionCtx{}
-
-	req.Equal(int64(5), ctx.sequence())
-	req.Equal(int64(-1), nilCtx.sequence())
-
-	req.Equal("five", ctx.cursor())
-	req.Equal("", nilCtx.cursor())
-
-	req.Equal("chanFive", ctx.channelName())
-	req.Equal("", nilCtx.channelName())
-
-	req.Equal("verFive", ctx.versionLabel())
-	req.Equal("", nilCtx.versionLabel())
-
-	req.Equal("this is five", ctx.releaseNotes())
-	req.Equal("", nilCtx.releaseNotes())
-
-	req.Equal(true, ctx.isAirgap())
-	req.Equal(false, nilCtx.isAirgap())
-}
diff --git a/pkg/upstream/fetch_test.go b/pkg/upstream/fetch_test.go
index b1fd8ef01..2712ff1ff 100644
--- a/pkg/upstream/fetch_test.go
+++ b/pkg/upstream/fetch_test.go
@@ -10,6 +10,7 @@ import (
 	kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -76,6 +77,8 @@ ACgAAA==`,
 				},
 			},
 		}
+		scopetest := scopeagent.StartTest(t)
+		defer scopetest.End()
 		u, err := FetchUpstream("replicated://app-slug", fetchOptions)
 		req.NoError(err)
 		assert.Equal(t, test.expectedLabel, u.VersionLabel)
diff --git a/pkg/upstream/helm_test.go b/pkg/upstream/helm_test.go
index 1df80d9c2..bb626005b 100644
--- a/pkg/upstream/helm_test.go
+++ b/pkg/upstream/helm_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func Test_parseHelmURL(t *testing.T) {
@@ -34,6 +35,8 @@ func Test_parseHelmURL(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			u, err := url.ParseRequestURI(test.uri)
diff --git a/pkg/upstream/main_test.go b/pkg/upstream/main_test.go
new file mode 100644
index 000000000..ea25579b3
--- /dev/null
+++ b/pkg/upstream/main_test.go
@@ -0,0 +1,12 @@
+package upstream
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/upstream/push_images_test.go b/pkg/upstream/push_images_test.go
index baa11e597..ed1422f07 100644
--- a/pkg/upstream/push_images_test.go
+++ b/pkg/upstream/push_images_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	kustomizetypes "sigs.k8s.io/kustomize/api/types"
 )
 
@@ -85,6 +86,8 @@ func Test_buildImageAltNames(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			got := buildImageAltNames(tt.rewrittenImage)
diff --git a/pkg/upstream/replicated_test.go b/pkg/upstream/replicated_test.go
index 664e97dc1..93d32d960 100644
--- a/pkg/upstream/replicated_test.go
+++ b/pkg/upstream/replicated_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/replicatedhq/kots/pkg/upstream/types"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -54,6 +55,8 @@ func Test_parseReplicatedURL(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			u, err := url.ParseRequestURI(test.uri)
@@ -142,6 +145,8 @@ func Test_releaseToFiles(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			actual, err := releaseToFiles(test.release)
@@ -153,6 +158,8 @@ func Test_releaseToFiles(t *testing.T) {
 }
 
 func Test_createConfigValues(t *testing.T) {
+	test := scopeagent.StartTest(t)
+	defer test.End()
 	applicationName := "Test App"
 
 	config := &kotsv1beta1.Config{
@@ -249,13 +256,13 @@ func Test_createConfigValues(t *testing.T) {
 			Default: "default_4",
 		},
 	}
-	values1, err := createConfigValues(applicationName, config, nil, nil, nil, nil)
+	values1, err := createConfigValues(applicationName, config, nil, nil, nil)
 	req.NoError(err)
 	assert.Equal(t, expected1, values1.Spec.Values)
 
 	// Like an app without a config, should have exact same values
 	expected2 := configValues.Spec.Values
-	values2, err := createConfigValues(applicationName, nil, configValues, nil, nil, nil)
+	values2, err := createConfigValues(applicationName, nil, configValues, nil, nil)
 	req.NoError(err)
 	assert.Equal(t, expected2, values2.Spec.Values)
 
@@ -276,7 +283,7 @@ func Test_createConfigValues(t *testing.T) {
 			Default: "default_4",
 		},
 	}
-	values3, err := createConfigValues(applicationName, config, configValues, nil, nil, nil)
+	values3, err := createConfigValues(applicationName, config, configValues, nil, nil)
 	req.NoError(err)
 	assert.Equal(t, expected3, values3.Spec.Values)
 }
@@ -316,6 +323,8 @@ func Test_getRequest(t *testing.T) {
 
 	req := require.New(t)
 	for _, test := range tests {
+		scopetest := scopeagent.StartTest(t)
+		defer scopetest.End()
 		license := &kotsv1beta1.License{
 			Spec: kotsv1beta1.LicenseSpec{
 				Endpoint:        test.endpoint,
diff --git a/pkg/util/main_test.go b/pkg/util/main_test.go
new file mode 100644
index 000000000..bf388a081
--- /dev/null
+++ b/pkg/util/main_test.go
@@ -0,0 +1,12 @@
+package util
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/util/marshal_indent_test.go b/pkg/util/marshal_indent_test.go
index 130a71844..906441dbd 100644
--- a/pkg/util/marshal_indent_test.go
+++ b/pkg/util/marshal_indent_test.go
@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestMarshalIndent(t *testing.T) {
@@ -28,6 +29,8 @@ func TestMarshalIndent(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			got, err := MarshalIndent(tt.indent, tt.in)
diff --git a/pkg/util/util_test.go b/pkg/util/util_test.go
index 660b7764b..891c51480 100644
--- a/pkg/util/util_test.go
+++ b/pkg/util/util_test.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func Test_CommonSlicePrefix(t *testing.T) {
@@ -36,6 +37,8 @@ func Test_CommonSlicePrefix(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			common := CommonSlicePrefix(test.first, test.second)
 			assert.Equal(t, test.expected, common)
 		})
@@ -71,6 +74,8 @@ func Test_SplitStringOnLen(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			parts, err := SplitStringOnLen(test.in, test.max)
@@ -110,6 +115,8 @@ func TestIntPointer(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 			got := IntPointer(tt.x)
 			req.Equal(tt.want, *got)
@@ -137,6 +144,8 @@ func TestGenPassword(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 			got := GenPassword(tt.length)
 			req.Len(got, tt.length)
@@ -178,6 +187,8 @@ func TestCompareStringArrays(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 			req.Equal(CompareStringArrays(tt.arr1, tt.arr2), tt.want)
 		})
diff --git a/pkg/version/main_test.go b/pkg/version/main_test.go
new file mode 100644
index 000000000..e92254507
--- /dev/null
+++ b/pkg/version/main_test.go
@@ -0,0 +1,12 @@
+package version
+
+import (
+	"os"
+	"testing"
+
+	"go.undefinedlabs.com/scopeagent"
+)
+
+func TestMain(m *testing.M) {
+	os.Exit(scopeagent.Run(m))
+}
diff --git a/pkg/version/version_test.go b/pkg/version/version_test.go
index 7cf50c059..7e49d7bdf 100644
--- a/pkg/version/version_test.go
+++ b/pkg/version/version_test.go
@@ -7,6 +7,7 @@ import (
 	"time"
 
 	"github.com/stretchr/testify/require"
+	"go.undefinedlabs.com/scopeagent"
 )
 
 func TestVersion(t *testing.T) {
@@ -25,6 +26,8 @@ func TestVersion(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			version = tt.want
@@ -65,6 +68,8 @@ func TestGitSHA(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			gitSHA = tt.sha
@@ -99,6 +104,8 @@ func TestBuildTime(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			buildTime = tt.timestring
@@ -129,6 +136,8 @@ func TestGetBuild(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			version = tt.version
@@ -177,6 +186,8 @@ func TestIsLatestRelease(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			scopetest := scopeagent.StartTest(t)
+			defer scopetest.End()
 			req := require.New(t)
 
 			h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {