Repository: datreeio/datree
Pull request #769 (2022-08-27 08:09:36)

feat: add "ensure seccomp not unconfined" rule
Added the new schema, used defs for reusability. 
Documentation link is still needed.

eyarz: @Heydad-Helfer Thank you for the PR!
Do you also plan to write the docs for this rule?
https://github.com/datreeio/docs
Heydad-Helfer: > @Heydad-Helfer Thank you for the PR! Do you also plan to write the docs for this rule? https://github.com/datreeio/docs

Hi. I can add this, but it'll take me some time. Do you want to wait on the merge until a documentation is available?
eyarz: NP, we can wait :)
it will take us a few days to review your PR anyway...

Patch:
diff --git a/.github/workflows/files_existence.yml b/.github/workflows/files_existence.yml
index 8a680c1..7985f54 100644
--- a/.github/workflows/files_existence.yml
+++ b/.github/workflows/files_existence.yml
@@ -2,7 +2,7 @@ name: Files existence
 
 on:
   pull_request:
-    types: [opened, edited, synchronize, reopened]
+    types: [ opened, edited, synchronize, reopened ]
 
 jobs:
   file_existence:
@@ -15,5 +15,5 @@ jobs:
         id: check_files
         uses: andstor/file-existence-action@v1.1.0
         with:
-          files: "pkg/defaultRules/defaultRules.yaml"
+          files: "pkg/defaultRules/defaultRules.yaml, pkg/defaultPolicies/defaultPolicies.yaml"
           allow_failure: true
diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
index 1f4a486..d74c1ea 100644
--- a/.github/workflows/golangci-lint.yml
+++ b/.github/workflows/golangci-lint.yml
@@ -10,7 +10,7 @@ jobs:
       - name: Setup Go environment
         uses: actions/setup-go@v2.1.4
         with:
-          go-version: 1.18
+          go-version: 1.19
       - name: golangci-lint
         uses: golangci/golangci-lint-action@v2
         with:
diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
new file mode 100644
index 0000000..d8e6a46
--- /dev/null
+++ b/.github/workflows/pull_request.yml
@@ -0,0 +1,10 @@
+name: Pull Request Workflow
+
+on:
+  pull_request:
+
+jobs:
+  go_build_and_test:
+    uses: ./.github/workflows/reusable_go_build.yml
+    with:
+      goBuildTag: staging
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3869008..7e38434 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -4,11 +4,17 @@ on:
     inputs:
       release_candidate_version:
         description: "Release Candidate Version:"
-        required: false
+        required: true
 
 jobs:
+  go_build_and_test:
+    uses: ./.github/workflows/reusable_go_build.yml
+    with:
+      goBuildTag: main
+
   define_version_job:
     runs-on: ubuntu-latest
+    needs: [go_build_and_test]
     steps:
       - uses: actions/checkout@v2
       - id: define_version
@@ -21,17 +27,20 @@ jobs:
       version: ${{ steps.define_version.outputs.version }}
 
   release:
+    env:
+      GITHUB_ACTION_RUN_ID: ${{ github.run_id }}
+      GORELEASER_VERSION: 0.155.1
+      GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}
+      CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}
     runs-on: ubuntu-latest
-    needs: define_version_job
+    needs: [ go_build_and_test, define_version_job ]
     steps:
       - uses: actions/checkout@v2
       - name: Extract branch name
         shell: bash
         run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
         id: extract_branch
-      - env:
-          TRAVIS_API_TOKEN: ${{ secrets.TRAVIS_API_TOKEN }}
-        run: |
+      - run: |
           echo "Triggered by: ${{ github.actor }}!"
           branch_name=${{ steps.extract_branch.outputs.branch }}
           commit_sha=${{ github.sha }}
@@ -41,30 +50,42 @@ jobs:
               echo "Release should build only from main branch"
               exit 1
           fi
-          if [ -z "$TRAVIS_API_TOKEN" ]; then
-              echo "TRAVIS_API_TOKEN is empty"
-              exit 1
-          fi
+      - name: Setup Go environment
+        uses: actions/setup-go@v2.1.4
+        with:
+          go-version: 1.19
+      - name: GitHub Config Identity
+        run: |
+          git config --global user.email "ci@datree.io"
+          git config --global user.name "datree-ci"
+      - name: Set AWS credentials
+        uses: aws-actions/configure-aws-credentials@v1
+        with:
+          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          aws-region: us-east-1
+      - name: Run deploy prod release file
+        env:
+          RELEASE_VERSION: ${{ needs.define_version_job.outputs.version }}
+        run: bash ./scripts/release.sh
+        shell: bash
 
-          REQUEST_BUILD_BODY="
-          {
-            \"request\": {
-              \"branch\": \"$branch_name\",
-              \"sha\": \"$commit_sha\",
-              \"merge_mode\": \"deep_merge_append\",
-              \"config\": {
-                \"env\": {
-                  \"global\": [
-                    \"RELEASE_DATREE_PROD=true\",
-                    \"RELEASE_VERSION=${{ needs.define_version_job.outputs.version }}\"
-                  ]
-                }
-              }
-            }
-          }
-          "
+  brew_push_formula:
+    name: Brew push formula
+    runs-on: ubuntu-latest
+    needs: [ release, define_version_job ]
+    env:
+      RELEASE_VERSION: ${{ needs.define_version_job.outputs.version }}
+      GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}
+    steps:
+      - uses: actions/checkout@v2
+      - name: GitHub Config Identity
+        run: |
+          git config --global user.email "ci@datree.io"
+          git config --global user.name "datree-ci"
+      - run: bash ./scripts/brew_push_formula.sh production ${{ env.RELEASE_VERSION }}
+        shell: bash
 
-          REQUEST_BUILD_BODY=$REQUEST_BUILD_BODY ./.github/workflows/request-travis-build-and-wait-until-finished.sh
   release-docker:
     env:
       REPO_NAME: datree
diff --git a/.github/workflows/release_candidate.yml b/.github/workflows/release_candidate.yml
new file mode 100644
index 0000000..e7bbf8f
--- /dev/null
+++ b/.github/workflows/release_candidate.yml
@@ -0,0 +1,35 @@
+name: Release Candidate Workflow
+
+on:
+  push:
+    branches: ['main']
+    paths-ignore:
+      - "cluster-integration/**"
+env:
+  GITHUB_ACTION_RUN_ID: ${{ github.run_id }}
+  GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}
+  GORELEASER_VERSION: 0.155.1
+jobs:
+  go_build_and_test:
+    uses: ./.github/workflows/reusable_go_build.yml
+    with:
+      goBuildTag: staging
+
+  release_candidate:
+    name: Release candidate
+    runs-on: ubuntu-latest
+    needs: [go_build_and_test]
+    steps:
+      - uses: actions/checkout@v3
+      - name: Setup Go environment
+        uses: actions/setup-go@v2.1.4
+        with:
+          go-version: 1.19
+      - name: GitHub Config Identity
+        run: |
+          git config --global user.email "ci@datree.io"
+          git config --global user.name "datree-ci"
+      - name: Run deploy release candidate file
+        run: |
+          bash ./scripts/deploy_release_candidate.sh
+        shell: bash
diff --git a/.github/workflows/request-travis-build-and-wait-until-finished.sh b/.github/workflows/request-travis-build-and-wait-until-finished.sh
deleted file mode 100755
index 0f3bf9f..0000000
--- a/.github/workflows/request-travis-build-and-wait-until-finished.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/bash
-
-GH_ORGANIZATION_NAME="datreeio"
-GH_REPOSITORY_NAME="datree"
-GH_SLUG=${GH_ORGANIZATION_NAME}%2F${GH_REPOSITORY_NAME}
-
-echo "Requesting a travis build..."
-
-request_build_response=$(curl -s -X POST \
-  -H "Content-Type: application/json" \
-  -H "Accept: application/json" \
-  -H "Travis-API-Version: 3" \
-  -H "Authorization: token ${TRAVIS_API_TOKEN}" \
-  -d "$REQUEST_BUILD_BODY" \
-  "https://api.travis-ci.com/repo/${GH_SLUG}/requests")
-
-REQUEST_ID=$(echo $request_build_response | jq '.request.id')
-
-echo "Travis request id: ${REQUEST_ID}"
-
-is_travis_build_already_created=false
-
-while true; do
-  sleep 10
-  echo "Polling travis build status..."
-
-  response=$(curl -s -X GET \
-    -H "Content-Type: application/json" \
-    -H "Accept: application/json" \
-    -H "Travis-API-Version: 3" \
-    -H "Authorization: token ${TRAVIS_API_TOKEN}" \
-    "https://api.travis-ci.com/repo/${GH_SLUG}/request/${REQUEST_ID}")
-
-  build_status=$(echo $response | jq '.builds[0].state')
-  build_request_state=$(echo $response | jq '.state')
-
-  if [ $build_request_state = "\"pending\"" ]; then
-    echo "Build request pending..."
-  elif [ $build_status = "\"passed\"" ]; then
-    echo "Travis build passed!"
-    exit 0
-  elif [ $build_status = "\"failed\"" ]; then
-    echo "Travis build failed!"
-    exit 1
-  elif [ $build_status = "\"canceled\"" ]; then
-    echo "Travis build canceled!"
-    exit 1
-  elif [ $build_status = "\"created\"" ]; then
-    if [ $is_travis_build_already_created = true ]; then
-      echo "Travis build queued..."
-    else
-      echo "Travis build created!"
-    fi
-    is_travis_build_already_created=true
-  elif [ $build_status = "\"started\"" ]; then
-    echo "Travis build in progress..."
-  else
-    echo "Travis build unknown state!"
-    echo "build_status:${build_status}"
-    echo "REQUEST_ID:${REQUEST_ID}"
-    echo "response:${response}"
-    exit 1
-  fi
-done
diff --git a/.github/workflows/reusable_go_build.yml b/.github/workflows/reusable_go_build.yml
new file mode 100644
index 0000000..aea4645
--- /dev/null
+++ b/.github/workflows/reusable_go_build.yml
@@ -0,0 +1,23 @@
+name: Reusable Go Build Workflow
+
+on:
+  workflow_call:
+    inputs:
+      goBuildTag:
+        required: true
+        type: string
+
+jobs:
+  go_build_and_test:
+    name: Go build and test
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - name: Setup Go environment
+        uses: actions/setup-go@v2.1.4
+        with:
+          go-version: 1.19
+      - name: Go Build With Tags
+        run: go build -tags ${{ inputs.goBuildTag }}
+      - name: Go Test
+        run: go test ./...
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..5331ecd
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "cluster-integration/admission-webhook-datree"]
+	path = cluster-integration/admission-webhook-datree
+	url = https://github.com/datreeio/admission-webhook-datree
diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml
index a1cb08e..9fcc68b 100644
--- a/.pre-commit-hooks.yaml
+++ b/.pre-commit-hooks.yaml
@@ -1,8 +1,8 @@
 - id: datree-docker
   name: datree test, run within docker
   description: Prevent Kubernetes misconfigurations from reaching production
-  types: [file, yaml]
+  types: [ file, yaml ]
   language: docker_image
   pass_filenames: true
-  args: ['test', '--only-k8s-files']
-  entry: datree/datree:latest
+  args: [ 'test', '--only-k8s-files' ]
+  entry: --user root datree/datree:latest
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 683495d..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-language: go
-go:
-  - "1.18"
-
-dist: focal 
-
-before_script:
-  - pyenv install 3.6.10
-  - pyenv global 3.6.10
-  - pip install -U pip
-  - pip install --user awscli
-  - aws --version
-  - sudo apt-get -y install jq
-  - jq --version
-
-script:
-  - echo $RELEASE_DATREE_PROD
-  # - "travis_wait 60 sleep 3600 &"
-  - export GO_BUILD_TAG=$(bash ./scripts/define_build_tag.sh)
-  - go build -tags $GO_BUILD_TAG
-  - go test ./...
-
-before_deploy:
-  - jq --version
-  - curl -sfL https://git.io/goreleaser | VERSION=v$GORELEASER_VERSION sh -s -- check
-  - git config --global user.email "builds@travis-ci.com"
-  - git config --global user.name "Travis CI"
-  - git remote set-url origin https://datree-ci:$GITHUB_TOKEN@github.com/datreeio/datree.git
-
-deploy:
-  - provider: script
-    skip_cleanup: true
-    script: bash ./scripts/deploy_release_candidate.sh
-    on:
-      branch: main
-      condition: $RELEASE_DATREE_PROD != true
-  - provider: script
-    skip_cleanup: true
-    script: bash ./scripts/release.sh
-    on:
-      branch: main
-      condition: $RELEASE_DATREE_PROD = true
-
-env:
-  global:
-    #GITHUB_TOKEN
-    - secure: "OQTTfOMNYFxGNkizM7bhK3OJXUntazxaQ6rliRO327fRnMPacK/pswMIwUjjzwTwLV8nVIvACSIWmo/45SeJtLVcHsle3RBn0OZFmgMFjySkLldP71t/4HzV3ef24px9JNX/FO6kQ7tqzzS7SRwlekL4v/r6K8ro1kqmFDLQ2uibgSXqkI7rNwPP56L5+QTX46pA2113NnGpywAm/K33ky40Fb2QclDH41ax+Jm7zyDy1ry0d/T9db+GBOnBsfkqkuBiBDvJ2tp4n0KbvAIt870O8Ey9jB7MUkwdGKH/0ZlEFXihEmKIVn9pih5t8EFZzVxdPK+aJ3SHeqWAu9v0Iy1lsxs1je6fIkhA5hkHk9Hz4mgRrwiGRG1d25sBoNegnu0uA5Iowtwp4Rp7lTfDJSdazTW7W3L5+qzd9b1LA7GfIlATcSwDrPicf6RBX0r2eb0o2fiFi/B24X8J84CAmdnhlBjGYhoKdBZv3+ngopZAJNbbclD1YKMBhVEfjVGQMDOm6yVejIrPWq1asupX+JEpF4/myLXilooUKt2Znx01EG2UVZ31o6e5m3Hn/XWa5z5HR/zsYTozLUFe0kbJvBVwy4v/8YgUyoGGaxAifs6Eh3rmKzmQLa8eyZjIIUAibOd19uL7ZZSGAvKDr93N/8rlZnHA0PRsDNhNxVyCFu8="
-    - GORELEASER_VERSION="0.155.1"
-    # AWS_ACCESS_KEY_ID
-    - secure: "DoYHN09zYlwjaG9TpoKoNfEigFMmGzShCs6K40cwaTx3Ohr9W2NuiQZXO8eDIWJIh/x6C2cZpgCFGh/c08/OJw8F9F1gTGLgi1HFdLB7p3fwWV14Et3bUGKtVyV9aGnlBqr93u8t7bFPDdLc+GHl/8E9/f3qjuhpDUcGQbp5bamioWkxDmt3mampCfcJjFmLDgk/9ElWwAc4rF+K2uNPGAyxvXU5lvIHC9VYbHMiBgo49+qKtRRXOO85yFw4eIStGNeRKlsAqw7DdehUVvk4BqL4epU+itLqPe4QLE7RnVzMYLdtGuqebNzbvhJuGZiaYjcakrZcGyTlZKG1DfUPZoqUqZOC7/lAkafPq31uCFZnW+27EYdWy4SA1amQ1/DMkp226UDWho2Tu4kcT/0CTGq7VSFIqhuc3IyXQoO5V62cyLkD2e52lO5IPzqWkVXQoh4JOvn46qQFBfVgHp1ciEd6CJJ3HFOtEJZBtL/YqePQJgABkDtmyuE93ZaBh/FM7JaZOVKKTm9MzEi8QJbidk7kuKtH7j8lVhAU77bm84/2dcFDlyusEEvPtN5ufCfbpHzj9ypX4qfvp4y9NhlcTU9zEn0/ajjLc39Mbxfrcr+/gdt/+gj5yED1/Xyhdz+Uh9HIhPHQaWfWro21ya34oU01duk9AetXHaJ7owwvTrk="
-    # AWS_SECRET_ACCESS_KEY
-    - secure: "gerlCsh4HJidIo+srPAW7bFjPU5KDg/tErnjIKJWl0/rQs6Ai/E6AXDIK39QOzaGIKe6aObNaiIk0OqPucH9hRNZzkbaaRVq0/lfEEUJ8Uz+kJpmjcqhZb7cq8I3VNc8LULgGq+1CcjXzS7bdNK95fLzlvn9QATBORBsAgzH0k96FVF2jL6ND4nyQyW8vuKJS6gqoEK0Je0cb5Et3weG231hxOzXekA7mBf0sVvtCU6aLHpoUJiBO6Ll1mp4VJoOmD9C4K2naq/FrQF3q4rpGp6h2aNhNbC/PavCNITa8hl4GXAuWO4ffeS97VOMFB5NXckd4Dv3B4dFOQaQUNE6DLd+N+uQLqzsCKny6Cjbvm2L1W5J42MSG20dBXPcbSLE6LnkCw/Sz75Ga3/NLpzD89Letuj1MouiYmpRggRdwkICZCaaz1D9ZUsOaURCnNi+lXORE3RantHyuQimReByZQ29dCua1/JJfddW1AcJD5EcvPL/nSjiE7WfNrC0bDeCSZmAuzWSuYXJTgL2hwsGbsInZoZjv6oXYPKKmEJUig53Q9Jkh3ajEca5qU7KC8b9IpJ6XC2TBRxu//A9fzDGhWE6iR8Hw6GjaWimwWJ0DURP6isjv7uyi+uVeixXx0hu5BizvBERbB3I/AfygqGuWGdG8rRsjAwbft9dIQAhXD8="
-    #CLOUDFRONT_DISTRIBUTION_ID
-    - secure: "OPHm9ZF1qQ+yu1T5ecvOp8UVUX2AcIwbrQTJXKlz4DEANJKlX2gMzo9eLrLfaKQDqwFBmop9v721673qGjGXqyQCAwqf+OoRjX1ei/gIV8Rxx3ULV8jR/bn0oH33AllChhjpAX9nX/FDoSCWaUPJZSO1EIbvGBDKOipycxWOnGDvmNakfCWDBtezgU8yEafofuloALX+LreGoacd2ZtdcijSxZ+FjPJizJXOzJ3sdIh5cvAqu3sipKXUdCvsG1I2KsbTOV0wVj1TIBHvgCyIpjVuoMIo8lR32eYrjYQ1g9yiU37OZXCE+19ytj1N5RLpoNyWuIbZg6BAsWW3m8jasx3tSbrW8EN1jGc385faXV3k3LIy74ao7HMatxd8iFEZa8NLXlK4muLI7Y8dnTkzHf2xtT4gGTdhEhfulTj2SUzt6cWsN3fPFNXaXPj6KY44yqJQjA1BHlg8t4C2hnkYvUtYqhyLOCACqhhN2+jx+KkMRlc2cULzcwzJXB2+yzwySbkN5wlcL7DeUaK/C9ROxxKOSOOcMNDCT241eR1U3MQ1qVB4THalJ2T/eTv8W+dHzoeF/AnI7U4dOnJlCwf4t1patWB/K+2zOEhVYMd/C4RVyxc9BJ9ufgkvaM+X/laQ15vh9L23HRf6fIYv1v5Bf4AHqP8IpK0InMLtHwHc/Bw="
diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md
index f3e144f..d93fe67 100644
--- a/DEVELOPER_GUIDE.md
+++ b/DEVELOPER_GUIDE.md
@@ -5,7 +5,7 @@ This guide was written for macOS and Linux machines.
 
 ## Prerequisites
 
-- Go version 1.18
+- Go version 1.19
 - Git
 
 ## Building Datree
diff --git a/bl/policy/policy_factory.go b/bl/policy/policy_factory.go
index 8e466d5..b7b807f 100644
--- a/bl/policy/policy_factory.go
+++ b/bl/policy/policy_factory.go
@@ -3,8 +3,8 @@ package policy
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/datreeio/datree/pkg/defaultPolicies"
 
-	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/datreeio/datree/pkg/defaultRules"
 )
 
@@ -21,47 +21,53 @@ type RuleWithSchema struct {
 	MessageOnFailure string
 }
 
-func CreatePolicy(policies *cliClient.EvaluationPrerunPolicies, policyName string, registrationURL string, defaultRules *defaultRules.DefaultRulesDefinitions) (Policy, error) {
-	var err error
-
-	if policies == nil && policyName != "" && policyName != "Default" {
-		return Policy{}, fmt.Errorf("policy %s doesn't exist, sign in to the dashboard to customize your policies: %s", policyName, registrationURL)
+func CreatePolicy(policies *defaultPolicies.EvaluationPrerunPolicies, policyName string, registrationURL string, defaultRules *defaultRules.DefaultRulesDefinitions, isAnonymous bool) (Policy, error) {
+	if policies == nil {
+		// policies should never be nil because of the fallback of defaultPolicies.yaml
+		panic("policies is nil")
 	}
 
+	var err error
+
 	var rules []RuleWithSchema
 
-	if policies != nil {
-		var chosenPolicy *cliClient.Policy
+	var chosenPolicy *defaultPolicies.Policy
 
+	if policyName == "" {
 		for _, policy := range policies.Policies {
-			if policyName == "" && policy.IsDefault {
+			if policy.IsDefault {
 				chosenPolicy = policy
 				policyName = chosenPolicy.Name
 				break
-			} else if policy.Name == policyName {
+			}
+		}
+	} else {
+		for _, policy := range policies.Policies {
+			if policy.Name == policyName {
 				chosenPolicy = policy
 				break
 			}
 		}
+	}
 
-		if chosenPolicy == nil {
+	if chosenPolicy == nil {
+		if isAnonymous {
+			return Policy{}, fmt.Errorf("policy %s doesn't exist, sign in to the dashboard to customize your policies: %s", policyName, registrationURL)
+		} else {
 			return Policy{}, fmt.Errorf("policy %s doesn't exist", policyName)
 		}
+	}
 
-		rules, err = populateRules(chosenPolicy.Rules, policies.CustomRules, defaultRules.Rules)
+	rules, err = populateRules(chosenPolicy.Rules, policies.CustomRules, defaultRules.Rules)
 
-		if err != nil {
-			return Policy{}, err
-		}
-	} else {
-		policy := createDefaultPolicy(defaultRules)
-		return policy, nil
+	if err != nil {
+		return Policy{}, err
 	}
 
 	return Policy{policyName, rules}, nil
 }
 
-func populateRules(policyRules []cliClient.Rule, customRules []*cliClient.CustomRule, defaultRules []*defaultRules.DefaultRuleDefinition) ([]RuleWithSchema, error) {
+func populateRules(policyRules []defaultPolicies.Rule, customRules []*defaultPolicies.CustomRule, defaultRules []*defaultRules.DefaultRuleDefinition) ([]RuleWithSchema, error) {
 	var rules = []RuleWithSchema{}
 
 	if policyRules == nil {
@@ -107,7 +113,7 @@ func getDefaultRuleByIdentifier(defaultRules []*defaultRules.DefaultRuleDefiniti
 	return nil
 }
 
-func getCustomRuleByIdentifier(customRules []*cliClient.CustomRule, identifier string) *cliClient.CustomRule {
+func getCustomRuleByIdentifier(customRules []*defaultPolicies.CustomRule, identifier string) *defaultPolicies.CustomRule {
 	for _, customRule := range customRules {
 		if identifier == customRule.Identifier {
 			return customRule
@@ -116,15 +122,3 @@ func getCustomRuleByIdentifier(customRules []*cliClient.CustomRule, identifier s
 
 	return nil
 }
-
-func createDefaultPolicy(defaultRules *defaultRules.DefaultRulesDefinitions) Policy {
-	var rules []RuleWithSchema
-
-	for _, defaultRule := range defaultRules.Rules {
-		if defaultRule.EnabledByDefault {
-			rules = append(rules, RuleWithSchema{defaultRule.UniqueName, defaultRule.Name, defaultRule.DocumentationUrl, defaultRule.Schema, defaultRule.MessageOnFailure})
-		}
-	}
-
-	return Policy{"Default", rules}
-}
diff --git a/bl/validation/k8sValidator.go b/bl/validation/k8sValidator.go
index a599442..b27c673 100644
--- a/bl/validation/k8sValidator.go
+++ b/bl/validation/k8sValidator.go
@@ -61,8 +61,8 @@ type FileWithWarning struct {
 	WarningKind WarningKind
 }
 
-func (val *K8sValidator) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *FileWithWarning) {
-	validK8sFilesConfigurationsChan := make(chan *extractor.FileConfigurations, concurrency)
+func (val *K8sValidator) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int, skipSchemaValidation bool) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *FileWithWarning) {
+	validOrSkippedK8sFilesConfigurationsChan := make(chan *extractor.FileConfigurations, concurrency)
 	invalidK8sFilesChan := make(chan *extractor.InvalidFile, concurrency)
 	k8sValidationWarningPerValidFileChan := make(chan *FileWithWarning, concurrency)
 
@@ -70,10 +70,22 @@ func (val *K8sValidator) ValidateResources(filesConfigurationsChan chan *extract
 
 		defer func() {
 			close(invalidK8sFilesChan)
-			close(validK8sFilesConfigurationsChan)
+			close(validOrSkippedK8sFilesConfigurationsChan)
 			close(k8sValidationWarningPerValidFileChan)
 		}()
 
+		if skipSchemaValidation {
+			for fileConfigurations := range filesConfigurationsChan {
+				validOrSkippedK8sFilesConfigurationsChan <- fileConfigurations
+				k8sValidationWarningPerValidFileChan <- &FileWithWarning{
+					Filename:    fileConfigurations.FileName,
+					Warning:     "Skipped schema validation",
+					WarningKind: Skipped,
+				}
+			}
+			return
+		}
+
 		for fileConfigurations := range filesConfigurationsChan {
 
 			isValid, validationErrors, validationWarning, err := val.validateResource(fileConfigurations.FileName)
@@ -84,7 +96,7 @@ func (val *K8sValidator) ValidateResources(filesConfigurationsChan chan *extract
 				}
 			}
 			if isValid {
-				validK8sFilesConfigurationsChan <- fileConfigurations
+				validOrSkippedK8sFilesConfigurationsChan <- fileConfigurations
 				if validationWarning != nil {
 					k8sValidationWarningPerValidFileChan <- &FileWithWarning{
 						Filename:    fileConfigurations.FileName,
@@ -101,7 +113,7 @@ func (val *K8sValidator) ValidateResources(filesConfigurationsChan chan *extract
 		}
 	}()
 
-	return validK8sFilesConfigurationsChan, invalidK8sFilesChan, k8sValidationWarningPerValidFileChan
+	return validOrSkippedK8sFilesConfigurationsChan, invalidK8sFilesChan, k8sValidationWarningPerValidFileChan
 }
 
 func (val *K8sValidator) GetK8sFiles(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.FileConfigurations) {
@@ -231,5 +243,16 @@ func getDefaultSchemaLocations() []string {
 		// notice: order here is important because this fallback doesn't have strict mode enabled (in contrast to "default")
 		"https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/{{ .NormalizedKubernetesVersion }}/{{ .ResourceKind }}{{ .KindSuffix }}.json",
 		"https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{ .Group }}/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json",
+		getExtractedSchemasDir(),
 	}
 }
+
+// when using the crd-extractor(https://github.com/datreeio/CRDs-catalog#crd-extractor) extracted schemas are saved to a local dir, which should be used as a schema-location by default
+func getExtractedSchemasDir() string {
+	homeDir, err := os.UserHomeDir()
+	if err != nil {
+		return ""
+	}
+
+	return (homeDir + "/.datree/crdSchemas/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json")
+}
diff --git a/cluster-integration/README.md b/cluster-integration/README.md
new file mode 100644
index 0000000..48fdec5
--- /dev/null
+++ b/cluster-integration/README.md
@@ -0,0 +1,150 @@
+# Datree Admission Webhook
+
+<p align="center">
+<img src="https://github.com/datreeio/admission-webhook-datree/blob/main/internal/images/diagram.png" width="80%" />
+</p>
+  
+# Overview
+Datree offers cluster integration that allows you to validate your resources against your configured policy upon pushing them into a cluster, by using an admission webhook.
+
+The webhook will catch **create**, **apply** and **edit** operations and initiate a policy check against the configs associated with each operation. If any misconfigurations are found, the webhook will reject the operation, and display a detailed output with instructions on how to resolve each misconfiguration.
+
+## Webhook validation triggers
+
+K8s use different abstractions to simplify and automate complex processes. For example, when explicitly applying an object type “Deployment”, under the hood, K8s will “translate” this object into implicit objects of type “Pod.”
+
+When installed on your cluster, other policy enforcement tools will validate both explicit and implicit objects. This approach may create a lot of noise and false positive failures since it will cause the webhook to validate objects that the users don’t manage and, in some cases, are not even accessible.
+
+To avoid such issues, we decided to define the specific operations that the admission webhook should validate:
+
+- Kubectl - validate objects that were created or updated using kubectl `create`, `edit`, and `apply` commands. Objects that were implicitly created (e.g., pods created via deployment) are ignored since the webhook validates the deployment that generated them and is accessible to the user.
+- Gitops CD tools - validate objects that were explicitly created and distinguish them from other objects (custom resources) that were implicitly created during the installation and are required for the ongoing operation of these tools (e.g., ArgoCD, FluxCD, etc.)
+
+## Prerequisites
+
+The webhook officially supports **Kubernetes version _1.19_** and higher, and has been tested with EKS.
+
+# Installation
+
+## Deploy with Helm
+
+```bash
+  # Install and create namespace with Helm
+  helm repo add datree-webhook https://datreeio.github.io/admission-webhook-datree/
+  helm repo update
+
+  # Already existing `datree` namespace
+  kubectl create ns datree
+  helm install -n datree datree-webhook datree-webhook/datree-admission-webhook --set datree.token=<DATREE_TOKEN>
+```
+ 
+For more information see [Datree webhook Helm chart](https://github.com/datreeio/admission-webhook-datree/tree/gh-pages).
+
+## Deploy with installation script
+
+During the installtion the script will require to enter the Datree token during installation.
+
+```bash
+# Install with prompting Datree token
+bash <(curl https://get.datree.io/admission-webhook)
+
+# Install without prompting Datree token
+DATREE_TOKEN=[your-token] bash <(curl https://get.datree.io/admission-webhook)
+
+```
+
+### Prerequisites
+
+The following applications must be installed on the machine:
+
+- kubectl
+- openssl - _required for creating a certificate authority (CA)._
+- curl
+
+## Usage
+
+Once the webhook is installed, every hooked operation will trigger a Datree policy check. If no misconfigurations were found, the resource will be applied/updated.
+For any misconfigurations that were found the following output will be displayed:
+
+![deny-example](https://raw.githubusercontent.com/datreeio/admission-webhook-datree/main/internal/images/deny-example.png)
+
+## Behavior
+
+### Token
+
+🤫 Since your token is sensitive and you would not want to keep it in your repository, we recommend to set/change it by running a separate `kubectl patch` command:
+
+```yaml
+kubectl patch deployment webhook-server -n datree -p '
+spec:
+  template:
+    spec:
+      containers:
+        - name: server
+          env:
+            - name: DATREE_TOKEN
+              value: "<your-token>"'
+```
+
+Simply replace `<your-token>` with your actual token, then copy the entire command and run it in your terminal.
+
+### Other settings
+
+1. Create a YAML file in your repository with this content:
+
+```yaml
+spec:
+  template:
+    spec:
+      containers:
+        - name: server
+          env:
+            - name: DATREE_POLICY
+              value: ""
+            - name: DATREE_VERBOSE
+              value: ""
+            - name: DATREE_OUTPUT
+              value: ""
+            - name: DATREE_NO_RECORD
+              value: ""
+```
+
+2. Change the values of your settings as you desire.
+3. Run the following command to apply your changes to the webhook resource:
+
+```bash
+kubectl patch deployment webhook-server -n datree --patch-file /path/to/patch/file.yaml
+```
+
+## Ignore a namespace
+
+Add the label `"admission.datree/validate=skip"` to the configuration of the namespace you would like to ignore:
+
+```bash
+kubectl label namespaces default "admission.datree/validate=skip"
+```
+
+To delete the label and resume running the datree webhook on the namespace again:
+
+```bash
+kubectl label namespaces default "admission.datree/validate-"
+```
+
+## Uninstallation
+
+To uninstall the webhook, copy the following command and run it in your terminal:
+
+```bash
+bash <(curl https://get.datree.io/admission-webhook-uninstall)
+```
+
+To uninstall the helm release, copy the following command and run it in your terminal:
+
+```bash
+helm uninstall datree-webhook -n datree
+kubectl delete ns datree
+```
+
+## Local development
+
+To run the webhook locally (in development), view our [developer guide](/guides/developer-guide.md).
diff --git a/cluster-integration/admission-webhook-datree b/cluster-integration/admission-webhook-datree
new file mode 160000
index 0000000..8d1f751
--- /dev/null
+++ b/cluster-integration/admission-webhook-datree
@@ -0,0 +1,1 @@
+Subproject commit 8d1f751d360195213d2468889f1d2aae1e38f78b
diff --git a/dockerfiles/image-datree/Dockerfile b/dockerfiles/image-datree/Dockerfile
index aaade73..135b4a3 100644
--- a/dockerfiles/image-datree/Dockerfile
+++ b/dockerfiles/image-datree/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.18-alpine AS builder
+FROM golang:1.19-alpine AS builder
 RUN apk --no-cache add curl
 
 WORKDIR /go/src/app
diff --git a/go.mod b/go.mod
index 05f33d0..b99d8af 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/datreeio/datree
 
-go 1.18
+go 1.19
 
 require (
 	github.com/bmatcuk/doublestar/v2 v2.0.4
@@ -18,6 +18,7 @@ require (
 	github.com/stretchr/testify v1.7.0
 	github.com/xeipuuv/gojsonschema v1.2.0
 	github.com/yannh/kubeconform v0.4.14
+	gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
 	gopkg.in/yaml.v2 v2.4.0
 	gopkg.in/yaml.v3 v3.0.1
 	k8s.io/apimachinery v0.23.5
@@ -25,8 +26,17 @@ require (
 )
 
 require (
+	github.com/a8m/envsubst v1.3.0 // indirect
+	github.com/alecthomas/participle/v2 v2.0.0-beta.5 // indirect
+	github.com/elliotchance/orderedmap v1.4.0 // indirect
+	github.com/goccy/go-json v0.9.11 // indirect
+	github.com/goccy/go-yaml v1.9.5 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/google/go-cmp v0.5.8 // indirect
+	github.com/jinzhu/copier v0.3.5 // indirect
 	github.com/rivo/uniseg v0.2.0 // indirect
+	golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect
+	golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 )
 
@@ -37,8 +47,8 @@ require (
 	github.com/google/uuid v1.2.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
-	github.com/magiconair/properties v1.8.1 // indirect
-	github.com/mattn/go-colorable v0.1.9 // indirect
+	github.com/magiconair/properties v1.8.6 // indirect
+	github.com/mattn/go-colorable v0.1.12 // indirect
 	github.com/mattn/go-isatty v0.0.14 // indirect
 	github.com/mattn/go-runewidth v0.0.13 // indirect
 	github.com/mitchellh/mapstructure v1.1.2 // indirect
@@ -55,14 +65,16 @@ require (
 	github.com/tklauser/numcpus v0.3.0 // indirect
 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
-	golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect
+	golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
 	golang.org/x/text v0.3.7 // indirect
 	gopkg.in/ini.v1 v1.51.0 // indirect
 )
 
 require (
 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
+	github.com/mikefarah/yq/v4 v4.27.3
 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
 	github.com/shirou/gopsutil/v3 v3.22.2
 	github.com/yusufpapurcu/wmi v1.2.2 // indirect
+	k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
 )
diff --git a/go.sum b/go.sum
index 4dc755a..a535d09 100644
--- a/go.sum
+++ b/go.sum
@@ -44,6 +44,12 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/a8m/envsubst v1.3.0 h1:GmXKmVssap0YtlU3E230W98RWtWCyIZzjtf1apWWyAg=
+github.com/a8m/envsubst v1.3.0/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY=
+github.com/alecthomas/assert/v2 v2.0.3 h1:WKqJODfOiQG0nEJKFKzDIG3E29CN2/4zR9XGJzKIkbg=
+github.com/alecthomas/participle/v2 v2.0.0-beta.5 h1:y6dsSYVb1G5eK6mgmy+BgI3Mw35a3WghArZ/Hbebrjo=
+github.com/alecthomas/participle/v2 v2.0.0-beta.5/go.mod h1:RC764t6n4L8D8ITAJv0qdokritYSNR3wV5cVwmIEaMM=
+github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -83,6 +89,8 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
 github.com/eiannone/keyboard v0.0.0-20200508000154-caf4b762e807 h1:jdjd5e68T4R/j4PWxfZqcKY8KtT9oo8IPNVuV4bSXDQ=
 github.com/eiannone/keyboard v0.0.0-20200508000154-caf4b762e807/go.mod h1:Xoiu5VdKMvbRgHuY7+z64lhu/7lvax/22nzASF6GrO8=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/elliotchance/orderedmap v1.4.0 h1:wZtfeEONCbx6in1CZyE6bELEt/vFayMvsxqI5SgsR+A=
+github.com/elliotchance/orderedmap v1.4.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -92,6 +100,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -115,7 +124,15 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
+github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-yaml v1.9.5 h1:Eh/+3uk9kLxG4koCX6lRMAPS1OaMSAi+FJcya0INdB0=
+github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -161,8 +178,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -216,11 +234,14 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
+github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
@@ -243,18 +264,22 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kyokomi/emoji v2.2.4+incompatible h1:np0woGKwx9LiHAQmwZx79Oc0rHpNw3o+3evou4BEPv4=
 github.com/kyokomi/emoji v2.2.4+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
 github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5nwm/V115vj2YXfhS0w=
 github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w=
 github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
 github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
-github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
+github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
@@ -265,6 +290,8 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mikefarah/yq/v4 v4.27.3 h1:i07Cla0Hqzkb6yfw8D0KqfYJ0+uA0IOjSfhlzTXch/I=
+github.com/mikefarah/yq/v4 v4.27.3/go.mod h1:bUnRs1NSeM504h5rCBCTmhKwR2g8ka6dEHBLdZ/p3GI=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
@@ -299,6 +326,7 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -479,6 +507,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0=
+golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -554,9 +584,10 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
-golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -628,8 +659,9 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
+golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -734,6 +766,8 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE=
+gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
@@ -746,7 +780,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -766,6 +799,8 @@ k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73 h1:H9TCJUUx+2VA0ZiD9lvtaX8fthFsMoD+Izn93E/hm8U=
+k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/install.sh b/install.sh
index c71b666..0ac7eef 100755
--- a/install.sh
+++ b/install.sh
@@ -5,8 +5,8 @@ create_uninstall_script()
     UNINSTALL_SCRIPT="$HOME/.datree/uninstall.sh"
     touch $UNINSTALL_SCRIPT && chmod +x $UNINSTALL_SCRIPT
 
-    cat >> $UNINSTALL_SCRIPT << 'END'
-    if [ "$(id -u)" -ne 0 ] ; then
+    cat > $UNINSTALL_SCRIPT << END
+    if [ "\$(id -u)" -ne 0 ] ; then
     echo "This script must be executed with root privileges." && exit 1
     fi
     rm -f /usr/local/bin/datree
diff --git a/internal/fixtures/policyAsCode/prerun.json b/internal/fixtures/policyAsCode/prerun.json
index aecc1fd..e68e787 100644
--- a/internal/fixtures/policyAsCode/prerun.json
+++ b/internal/fixtures/policyAsCode/prerun.json
@@ -92,5 +92,6 @@
   },
   "isPolicyAsCodeMode": false,
   "registrationURL": "https://app.datree.io/login?t=gfdgdsteasgfsdgfdsfsd",
-  "promptRegistrationURL": "https://app.datree.io/promptLogin?t=gfdgdsteasgfsdgfdsfsd"
+  "promptRegistrationURL": "https://app.datree.io/promptLogin?t=gfdgdsteasgfsdgfdsfsd",
+  "isAnonymous": false
 }
diff --git a/pkg/cliClient/evaluation.go b/pkg/cliClient/evaluation.go
index c38e9ed..394238a 100644
--- a/pkg/cliClient/evaluation.go
+++ b/pkg/cliClient/evaluation.go
@@ -7,6 +7,7 @@ import (
 	"strings"
 
 	"github.com/datreeio/datree/pkg/ciContext"
+	"github.com/datreeio/datree/pkg/defaultPolicies"
 	"github.com/datreeio/datree/pkg/extractor"
 )
 
@@ -81,38 +82,14 @@ type EvaluationRequest struct {
 	Files        []*extractor.FileConfigurations `json:"files"`
 }
 
-type CustomRule struct {
-	Identifier              string      `json:"identifier"`
-	Name                    string      `json:"name"`
-	DefaultMessageOnFailure string      `json:"defaultMessageOnFailure"`
-	Schema                  interface{} `json:"schema"`
-	JsonSchema              string      `json:"jsonSchema"`
-}
-
-type Rule struct {
-	Identifier       string `json:"identifier"`
-	MessageOnFailure string `json:"messageOnFailure"`
-}
-
-type Policy struct {
-	Name      string `json:"name"`
-	IsDefault bool   `json:"isDefault,omitempty"`
-	Rules     []Rule `json:"rules"`
-}
-
-type EvaluationPrerunPolicies struct {
-	ApiVersion  string        `json:"apiVersion"`
-	CustomRules []*CustomRule `json:"customRules"`
-	Policies    []*Policy     `json:"policies"`
-}
-
 type EvaluationPrerunDataResponse struct {
-	PoliciesJson          *EvaluationPrerunPolicies `json:"policiesJson"`
-	DefaultK8sVersion     string                    `json:"defaultK8sVersion"`
-	RegistrationURL       string                    `json:"registrationURL"`
-	PromptRegistrationURL string                    `json:"promptRegistrationURL"`
-	IsPolicyAsCodeMode    bool                      `json:"isPolicyAsCodeMode"`
-	DefaultRulesYaml      string                    `json:"defaultRulesYaml"`
+	PoliciesJson          *defaultPolicies.EvaluationPrerunPolicies `json:"policiesJson"`
+	DefaultK8sVersion     string                                    `json:"defaultK8sVersion"`
+	RegistrationURL       string                                    `json:"registrationURL"`
+	PromptRegistrationURL string                                    `json:"promptRegistrationURL"`
+	IsPolicyAsCodeMode    bool                                      `json:"isPolicyAsCodeMode"`
+	DefaultRulesYaml      string                                    `json:"defaultRulesYaml"`
+	IsAnonymous           bool                                      `json:"isAnonymous"`
 }
 
 func (c *CliClient) RequestEvaluationPrerunData(tokenId string, isCi bool) (*EvaluationPrerunDataResponse, error) {
@@ -130,18 +107,24 @@ func (c *CliClient) RequestEvaluationPrerunData(tokenId string, isCi bool) (*Eva
 		}
 
 		if c.networkValidator.IsLocalMode() {
-			return &EvaluationPrerunDataResponse{IsPolicyAsCodeMode: true}, nil
+			return &EvaluationPrerunDataResponse{IsPolicyAsCodeMode: true, PoliciesJson: defaultPolicies.GetDefaultPoliciesStruct()}, nil
 		}
 
 		return &EvaluationPrerunDataResponse{}, err
 	}
 
 	var evaluationPrerunDataResponse = &EvaluationPrerunDataResponse{IsPolicyAsCodeMode: true}
+
 	err = json.Unmarshal(res.Body, &evaluationPrerunDataResponse)
 	if err != nil {
 		return &EvaluationPrerunDataResponse{}, err
 	}
 
+	// for anonymous invocations, use the embedded defaultPolicies.yaml file
+	if evaluationPrerunDataResponse.PoliciesJson == nil {
+		evaluationPrerunDataResponse.PoliciesJson = defaultPolicies.GetDefaultPoliciesStruct()
+	}
+
 	return evaluationPrerunDataResponse, nil
 }
 
@@ -155,12 +138,19 @@ type FileData struct {
 	ConfigurationsCount int    `json:"configurationsCount"`
 }
 
+type FailureLocation struct {
+	SchemaPath        string `json:"schemaPath"`
+	FailedErrorLine   int    `json:"failedErrorLine"`
+	FailedErrorColumn int    `json:"failedErrorColumn"`
+}
+
 type Configuration struct {
-	Name        string `json:"metadataName"`
-	Kind        string `json:"kind"`
-	Occurrences int    `json:"occurrences"`
-	IsSkipped   bool   `json:"isSkipped"`
-	SkipMessage string `json:"skipMessage"`
+	Name             string            `json:"metadataName"`
+	Kind             string            `json:"kind"`
+	Occurrences      int               `json:"occurrences"`
+	IsSkipped        bool              `json:"isSkipped"`
+	SkipMessage      string            `json:"skipMessage"`
+	FailureLocations []FailureLocation `json:"failureLocation"`
 }
 
 type FailedRule struct {
diff --git a/pkg/defaultPolicies/defaultPolicies.go b/pkg/defaultPolicies/defaultPolicies.go
new file mode 100644
index 0000000..81e330d
--- /dev/null
+++ b/pkg/defaultPolicies/defaultPolicies.go
@@ -0,0 +1,44 @@
+package defaultPolicies
+
+import (
+	_ "embed"
+
+	yamlConvertor "github.com/ghodss/yaml"
+)
+
+type EvaluationPrerunPolicies struct {
+	ApiVersion  string        `json:"apiVersion"`
+	CustomRules []*CustomRule `json:"customRules"`
+	Policies    []*Policy     `json:"policies"`
+}
+
+type CustomRule struct {
+	Identifier              string      `json:"identifier"`
+	Name                    string      `json:"name"`
+	DefaultMessageOnFailure string      `json:"defaultMessageOnFailure"`
+	Schema                  interface{} `json:"schema"`
+	JsonSchema              string      `json:"jsonSchema"`
+}
+
+type Rule struct {
+	Identifier       string `json:"identifier"`
+	MessageOnFailure string `json:"messageOnFailure"`
+}
+
+type Policy struct {
+	Name      string `json:"name"`
+	IsDefault bool   `json:"isDefault,omitempty"`
+	Rules     []Rule `json:"rules"`
+}
+
+//go:embed defaultPolicies.yaml
+var DefaultPoliciesFileContent string
+
+func GetDefaultPoliciesStruct() *EvaluationPrerunPolicies {
+	var defaultPolicies EvaluationPrerunPolicies
+	err := yamlConvertor.Unmarshal([]byte(DefaultPoliciesFileContent), &defaultPolicies)
+	if err != nil {
+		panic(err)
+	}
+	return &defaultPolicies
+}
diff --git a/pkg/defaultPolicies/defaultPolicies.yaml b/pkg/defaultPolicies/defaultPolicies.yaml
new file mode 100644
index 0000000..541e372
--- /dev/null
+++ b/pkg/defaultPolicies/defaultPolicies.yaml
@@ -0,0 +1,614 @@
+apiVersion: v1
+customRules: null
+policies:
+  - name: Default
+    isDefault: true
+    rules:
+      - identifier: CONTAINERS_MISSING_IMAGE_VALUE_VERSION
+        messageOnFailure: Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future
+      - identifier: CONTAINERS_MISSING_MEMORY_REQUEST_KEY
+        messageOnFailure: Missing property object `requests.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_CPU_REQUEST_KEY
+        messageOnFailure: Missing property object `requests.cpu` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
+        messageOnFailure: Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_CPU_LIMIT_KEY
+        messageOnFailure: Missing property object `limits.cpu` - value should be within the accepted boundaries recommended by the organization
+      - identifier: INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE
+        messageOnFailure: Incorrect value for key `host` - specify host instead of using a wildcard character ("*")
+      - identifier: SERVICE_INCORRECT_TYPE_VALUE_NODEPORT
+        messageOnFailure: Incorrect value for key `type` - `NodePort` will open a port on all nodes where it can be reached by the network external to the cluster
+      - identifier: CRONJOB_INVALID_SCHEDULE_VALUE
+        messageOnFailure: 'Incorrect value for key `schedule` - the (cron) schedule expressions is not valid and, therefore, will not work as expected'
+      - identifier: WORKLOAD_INVALID_LABELS_VALUE
+        messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it
+      - identifier: WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS
+        messageOnFailure: Incorrect value for key `restartPolicy` - any other value than `Always` is not supported by this resource
+      - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
+        messageOnFailure: Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks
+      - identifier: CONTAINERS_MISSING_READINESSPROBE_KEY
+        messageOnFailure: Missing property object `readinessProbe` - add a properly configured readinessProbe to notify kubelet your Pods are ready for traffic
+      - identifier: HPA_MISSING_MINREPLICAS_KEY
+        messageOnFailure: Missing property object `minReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: HPA_MISSING_MAXREPLICAS_KEY
+      #   messageOnFailure: Missing property object `maxReplicas` - the value should be within the accepted boundaries recommended by the organization
+      - identifier: WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT
+        messageOnFailure: Incorrect value for key `namespace` - use an explicit namespace instead of the default one (`default`)
+      - identifier: DEPLOYMENT_INCORRECT_REPLICAS_VALUE
+        messageOnFailure: Incorrect value for key `replicas` - running 2 or more replicas will increase the availability of the service
+      - identifier: CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY
+        messageOnFailure: Missing property object `startingDeadlineSeconds` - set a time limit to the cron execution to allow killing it if exceeded
+      - identifier: K8S_DEPRECATED_APIVERSION_1.16
+        messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.16)
+      - identifier: K8S_DEPRECATED_APIVERSION_1.17
+        messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.17)
+      - identifier: CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE
+        messageOnFailure: Incorrect value for key `privileged` - this mode will allow the container the same access as processes running on the host
+      # - identifier: WORKLOAD_MISSING_LABEL_OWNER_VALUE
+      #   messageOnFailure: Missing label object `owner` - add a proper owner label to know which person/team to ping when needed
+      # - identifier: DEPLOYMENT_MISSING_LABEL_ENV_VALUE
+      #   messageOnFailure: 'Missing label object `env` - add a proper environment description (e.g. "prod", "testing", etc.) to the Deployment config'
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_DIGEST
+      #   messageOnFailure: 'Incorrect value for key `image` - add a digest tag (starts with `@sha256:`) to represent an immutable version of the image'
+      - identifier: CRONJOB_MISSING_CONCURRENCYPOLICY_KEY
+        messageOnFailure: Missing property object `concurrencyPolicy` - the behavior will be more deterministic if jobs won't run concurrently
+      # - identifier: K8S_INCORRECT_KIND_VALUE_POD
+      #   messageOnFailure: Incorrect value for key `kind` - raw pod won't be rescheduled in the event of a node failure
+      # - identifier: CONTAINERS_INCORRECT_HOSTPID_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostPID` - running on the host's PID namespace enables access to sensitive information from processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTIPC_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostIPC` - running on the host`s IPC namespace can be (maliciously) used to interact with other processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTNETWORK_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostNetwork` - running on the host's network namespace can allow a compromised container to sniff network traffic
+      # - identifier: CONTAINERS_INCORRECT_RUNASUSER_VALUE_LOWUID
+      #   messageOnFailure: Incorrect value for key `runAsUser` - value should be above 9999 to reduce the likelihood that the UID is already taken
+      # - identifier: CONTAINERS_INCORRECT_PATH_VALUE_DOCKERSOCKET
+      #   messageOnFailure: Incorrect value for key `path` - avoid mounting the docker.socket becasue it can allow container breakout
+      # - identifier: CONFIGMAP_CVE2021_25742_INCORRECT_SNIPPET_ANNOTATIONS_VALUE
+      #   messageOnFailure: Missing property object `allow-snippet-annotations` - set it to "false" to override default behaviour
+      # - identifier: INGRESS_CVE2021_25742_INCORRECT_SERVER_SNIPPET_KEY
+      #   messageOnFailure: Forbidden property object `server-snippet` - ingress-nginx custom snippets are not allowed
+      # - identifier: CONTAINER_CVE2021_25741_INCORRECT_SUBPATH_KEY
+      #   messageOnFailure: Forbidden property object `subPath` - malicious users can gain access to files & directories outside of the volume
+      # - identifier: ENDPOINTSLICE_CVE2021_25373_INCORRECT_ADDRESSES_VALUE
+      #   messageOnFailure: Incorrect value for key `addresses` - IP address is within vulnerable ranges (127.0.0.0/8 and 169.254.0.0/16)
+      # - identifier: ARGO_WORKFLOW_INCORRECT_FAILFAST_VALUE_FALSE
+      #   messageOnFailure: 'Incorrect value for key `failFast` - value should be `true` to prevent DAG from running on all branches, regardless of the failed outcomes of the DAG branches'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_SERVICE_ACCOUNT_NAME_VALUE_DEFAULT
+      #   messageOnFailure: Incorrect value for key `serviceAccountName` - when set to `default` container is exposed to possible attacks
+      # - identifier: ARGO_CONFIGMAP_MISSING_PART_OF_LABEL_VALUE_ARGOCD
+      #   messageOnFailure: 'Incorrect value for annotation `app.kubernetes.io/part-of` - value should be `argocd`, or ArgoCD won''t recognize this resource'
+      # - identifier: ARGO_ROLLOUT_MISSING_PAUSE_DURATION
+      #   messageOnFailure: Missing the key `duration` - prevent the rollout from waiting indefinitely for the pause condition
+      # - identifier: ARGO_APP_PROJECT_INCORRECT_NAMESPACE_VALUE
+      #   messageOnFailure: Incorrect value for property `namespace` - Application and AppProject have to be installed on the argocd namespace
+      # - identifier: ARGO_WORKFLOW_INCORRECT_RETRY_STRATEGY_VALUE_EMPTY
+      #   messageOnFailure: 'Incorrect value for key `retryStrategy` - empty value (`{}`) can cause failed/errored steps to keep retrying, which can result in OOM issues'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_REVISION_HISTORY_LIMIT_VALUE_0
+      #   messageOnFailure: Incorrect value for key `revisionHistoryLimit` - value above 0 is required to enable rolling back from a failed deployment
+      # - identifier: ARGO_ROLLOUT_INCORRECT_SCALE_DOWN_DELAY_VALUE_BELOW_30
+      #   messageOnFailure: Incorrect value for key `scaleDownDelaySeconds` - value should be at least 30 to prevent packets from being sent to a node that killed the pod
+      # - identifier: ARGO_ROLLOUT_INCORRECT_PROGRESS_DEADLINE_ABORT_VALUE_FALSE
+      #   messageOnFailure: Incorrect value for key `progressDeadlineAbort` - value should be `true` to prevent the rollout pod from retrying indefinitely
+      # - identifier: ARGO_WORKFLOW_ENSURE_RETRY_ON_BOTH_ERROR_AND_TRANSIENT_ERROR
+      #   messageOnFailure: Incorrect value for key `retryPolicy` - the expression should include retry on steps that failed either on transient or Argo controller errors
+      # - identifier: CONTAINERS_INCORRECT_READONLYROOTFILESYSTEM_VALUE
+      #   messageOnFailure: Incorrect value for key `readOnlyRootFilesystem` - set to 'true' to protect filesystem from potential attacks
+      # - identifier: CONTAINERS_INCORRECT_KEY_HOSTPATH
+      #   messageOnFailure: Invalid key `hostPath` - refrain from using this mount to prevent an attack on the underlying host
+      # - identifier: CONTAINERS_MISSING_KEY_ALLOWPRIVILEGEESCALATION
+      #   messageOnFailure: Missing key `allowPrivilegeEscalation` - set to false to prevent attackers from exploiting escalated container privileges
+      # - identifier: CONTAINERS_INCORRECT_RESOURCES_VERBS_VALUE
+      #   messageOnFailure: Incorrect value for key `resources` and/or `verbs` - allowing containers to run the exec command can be exploited by attackers
+      # - identifier: CONTAINERS_INVALID_CAPABILITIES_VALUE
+      #   messageOnFailure: Incorrect value for key `add` - refrain from using insecure capabilities to prevent access to sensitive components
+      # - identifier: CONTAINERS_INCORRECT_KEY_HOSTPORT
+      #   messageOnFailure: Incorrect key `hostPort` - refrain from using this key to prevent insecurely exposing your workload
+      # - identifier: CONTAINERS_INCORRECT_RUNASGROUP_VALUE_LOWGID
+      #   messageOnFailure: Invalid value for key `runAsGroup` - must be greater than 999 to ensure container is running with non-root group membership
+      # - identifier: CONTAINERS_INCORRECT_RUNASNONROOT_VALUE
+      #   messageOnFailure: Invalid value for key `runAsNonRoot` - must be set to `true` to prevent unnecessary privileges
+      # - identifier: SRVACC_INCORRECT_AUTOMOUNTSERVICEACCOUNTTOKEN_VALUE
+      #   messageOnFailure: Invalid value for key `automountServiceAccountToken` - must be set to `false` to prevent granting unnecessary access to the service account
+      - identifier: RESOURCE_MISSING_NAME
+        messageOnFailure: Missing key `name` or `generateName` - one of them must be set to apply resource to a cluster
+      # - identifier: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `initialDelaySeconds` - set explicitly to control the start time before a probe is initiated (min 0)
+      # - identifier: CONTAINERS_INCORRECT_PERIODSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `periodSeconds` - set explicitly to control how often a probe is performed (min 1)
+      # - identifier: CONTAINERS_INCORRECT_TIMEOUTSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `timeoutSeconds` - set explicitly to control when a probe times out (min 1)
+      # - identifier: CONTAINERS_INCORRECT_SUCCESSTHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `successThreshold` - set explicitly to control when a probe is considered successful after having failed
+      # - identifier: CONTAINERS_INCORRECT_FAILURETHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `failureThreshold` - set explicitly to control the number of retries after a probe fails (min 1)
+      # - identifier: CONTAINERS_MISSING_PRESTOP_KEY
+      #   messageOnFailure: Missing property object `preStop` - set to ensure graceful shutdown of the container
+  - name: Argo
+    rules:
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_VERSION
+      #   messageOnFailure: Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future
+      # - identifier: CONTAINERS_MISSING_MEMORY_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.memory` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_CPU_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_CPU_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE
+      #   messageOnFailure: Incorrect value for key `host` - specify host instead of using a wildcard character ("*")
+      # - identifier: SERVICE_INCORRECT_TYPE_VALUE_NODEPORT
+      #   messageOnFailure: Incorrect value for key `type` - `NodePort` will open a port on all nodes where it can be reached by the network external to the cluster
+      # - identifier: CRONJOB_INVALID_SCHEDULE_VALUE
+      #   messageOnFailure: 'Incorrect value for key `schedule` - the (cron) schedule expressions is not valid and, therefore, will not work as expected'
+      # - identifier: WORKLOAD_INVALID_LABELS_VALUE
+      #   messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it
+      # - identifier: WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS
+      #   messageOnFailure: Incorrect value for key `restartPolicy` - any other value than `Always` is not supported by this resource
+      # - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
+      #   messageOnFailure: Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks
+      # - identifier: CONTAINERS_MISSING_READINESSPROBE_KEY
+      #   messageOnFailure: Missing property object `readinessProbe` - add a properly configured readinessProbe to notify kubelet your Pods are ready for traffic
+      # - identifier: HPA_MISSING_MINREPLICAS_KEY
+      #   messageOnFailure: Missing property object `minReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: HPA_MISSING_MAXREPLICAS_KEY
+      #   messageOnFailure: Missing property object `maxReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT
+      #   messageOnFailure: Incorrect value for key `namespace` - use an explicit namespace instead of the default one (`default`)
+      # - identifier: DEPLOYMENT_INCORRECT_REPLICAS_VALUE
+      #   messageOnFailure: Incorrect value for key `replicas` - running 2 or more replicas will increase the availability of the service
+      # - identifier: CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY
+      #   messageOnFailure: Missing property object `startingDeadlineSeconds` - set a time limit to the cron execution to allow killing it if exceeded
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.16
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.16)
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.17
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.17)
+      # - identifier: CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `privileged` - this mode will allow the container the same access as processes running on the host
+      # - identifier: WORKLOAD_MISSING_LABEL_OWNER_VALUE
+      #   messageOnFailure: Missing label object `owner` - add a proper owner label to know which person/team to ping when needed
+      # - identifier: DEPLOYMENT_MISSING_LABEL_ENV_VALUE
+      #   messageOnFailure: 'Missing label object `env` - add a proper environment description (e.g. "prod", "testing", etc.) to the Deployment config'
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_DIGEST
+      #   messageOnFailure: 'Incorrect value for key `image` - add a digest tag (starts with `@sha256:`) to represent an immutable version of the image'
+      # - identifier: CRONJOB_MISSING_CONCURRENCYPOLICY_KEY
+      #   messageOnFailure: Missing property object `concurrencyPolicy` - the behavior will be more deterministic if jobs won't run concurrently
+      # - identifier: K8S_INCORRECT_KIND_VALUE_POD
+      #   messageOnFailure: Incorrect value for key `kind` - raw pod won't be rescheduled in the event of a node failure
+      # - identifier: CONTAINERS_INCORRECT_HOSTPID_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostPID` - running on the host's PID namespace enables access to sensitive information from processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTIPC_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostIPC` - running on the host`s IPC namespace can be (maliciously) used to interact with other processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTNETWORK_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostNetwork` - running on the host's network namespace can allow a compromised container to sniff network traffic
+      # - identifier: CONTAINERS_INCORRECT_RUNASUSER_VALUE_LOWUID
+      #   messageOnFailure: Incorrect value for key `runAsUser` - value should be above 9999 to reduce the likelihood that the UID is already taken
+      # - identifier: CONTAINERS_INCORRECT_PATH_VALUE_DOCKERSOCKET
+      #   messageOnFailure: Incorrect value for key `path` - avoid mounting the docker.socket becasue it can allow container breakout
+      # - identifier: CONFIGMAP_CVE2021_25742_INCORRECT_SNIPPET_ANNOTATIONS_VALUE
+      #   messageOnFailure: Missing property object `allow-snippet-annotations` - set it to "false" to override default behaviour
+      # - identifier: INGRESS_CVE2021_25742_INCORRECT_SERVER_SNIPPET_KEY
+      #   messageOnFailure: Forbidden property object `server-snippet` - ingress-nginx custom snippets are not allowed
+      # - identifier: CONTAINER_CVE2021_25741_INCORRECT_SUBPATH_KEY
+      #   messageOnFailure: Forbidden property object `subPath` - malicious users can gain access to files & directories outside of the volume
+      # - identifier: ENDPOINTSLICE_CVE2021_25373_INCORRECT_ADDRESSES_VALUE
+      #   messageOnFailure: Incorrect value for key `addresses` - IP address is within vulnerable ranges (127.0.0.0/8 and 169.254.0.0/16)
+      - identifier: ARGO_WORKFLOW_INCORRECT_FAILFAST_VALUE_FALSE
+        messageOnFailure: 'Incorrect value for key `failFast` - value should be `true` to prevent DAG from running on all branches, regardless of the failed outcomes of the DAG branches'
+      - identifier: ARGO_WORKFLOW_INCORRECT_SERVICE_ACCOUNT_NAME_VALUE_DEFAULT
+        messageOnFailure: Incorrect value for key `serviceAccountName` - when set to `default` container is exposed to possible attacks
+      - identifier: ARGO_CONFIGMAP_MISSING_PART_OF_LABEL_VALUE_ARGOCD
+        messageOnFailure: 'Incorrect value for annotation `app.kubernetes.io/part-of` - value should be `argocd`, or ArgoCD won''t recognize this resource'
+      - identifier: ARGO_ROLLOUT_MISSING_PAUSE_DURATION
+        messageOnFailure: Missing the key `duration` - prevent the rollout from waiting indefinitely for the pause condition
+      - identifier: ARGO_APP_PROJECT_INCORRECT_NAMESPACE_VALUE
+        messageOnFailure: Incorrect value for property `namespace` - Application and AppProject have to be installed on the argocd namespace
+      - identifier: ARGO_WORKFLOW_INCORRECT_RETRY_STRATEGY_VALUE_EMPTY
+        messageOnFailure: 'Incorrect value for key `retryStrategy` - empty value (`{}`) can cause failed/errored steps to keep retrying, which can result in OOM issues'
+      - identifier: ARGO_WORKFLOW_INCORRECT_REVISION_HISTORY_LIMIT_VALUE_0
+        messageOnFailure: Incorrect value for key `revisionHistoryLimit` - value above 0 is required to enable rolling back from a failed deployment
+      - identifier: ARGO_ROLLOUT_INCORRECT_SCALE_DOWN_DELAY_VALUE_BELOW_30
+        messageOnFailure: Incorrect value for key `scaleDownDelaySeconds` - value should be at least 30 to prevent packets from being sent to a node that killed the pod
+      - identifier: ARGO_ROLLOUT_INCORRECT_PROGRESS_DEADLINE_ABORT_VALUE_FALSE
+        messageOnFailure: Incorrect value for key `progressDeadlineAbort` - value should be `true` to prevent the rollout pod from retrying indefinitely
+      - identifier: ARGO_WORKFLOW_ENSURE_RETRY_ON_BOTH_ERROR_AND_TRANSIENT_ERROR
+        messageOnFailure: Incorrect value for key `retryPolicy` - the expression should include retry on steps that failed either on transient or Argo controller errors
+      # - identifier: CONTAINERS_INCORRECT_READONLYROOTFILESYSTEM_VALUE
+      #   messageOnFailure: Incorrect value for key `readOnlyRootFilesystem` - set to 'true' to protect filesystem from potential attacks
+      # - identifier: CONTAINERS_INCORRECT_KEY_HOSTPATH
+      #   messageOnFailure: Invalid key `hostPath` - refrain from using this mount to prevent an attack on the underlying host
+      # - identifier: CONTAINERS_MISSING_KEY_ALLOWPRIVILEGEESCALATION
+      #   messageOnFailure: Missing key `allowPrivilegeEscalation` - set to false to prevent attackers from exploiting escalated container privileges
+      # - identifier: CONTAINERS_INCORRECT_RESOURCES_VERBS_VALUE
+      #   messageOnFailure: Incorrect value for key `resources` and/or `verbs` - allowing containers to run the exec command can be exploited by attackers
+      # - identifier: CONTAINERS_INVALID_CAPABILITIES_VALUE
+      #   messageOnFailure: Incorrect value for key `add` - refrain from using insecure capabilities to prevent access to sensitive components
+      # - identifier: CONTAINERS_INCORRECT_KEY_HOSTPORT
+      #   messageOnFailure: Incorrect key `hostPort` - refrain from using this key to prevent insecurely exposing your workload
+      # - identifier: CONTAINERS_INCORRECT_RUNASGROUP_VALUE_LOWGID
+      #   messageOnFailure: Invalid value for key `runAsGroup` - must be greater than 999 to ensure container is running with non-root group membership
+      # - identifier: CONTAINERS_INCORRECT_RUNASNONROOT_VALUE
+      #   messageOnFailure: Invalid value for key `runAsNonRoot` - must be set to `true` to prevent unnecessary privileges
+      # - identifier: SRVACC_INCORRECT_AUTOMOUNTSERVICEACCOUNTTOKEN_VALUE
+      #   messageOnFailure: Invalid value for key `automountServiceAccountToken` - must be set to `false` to prevent granting unnecessary access to the service account
+      # - identifier: RESOURCE_MISSING_NAME
+      #   messageOnFailure: Missing key `name` or `generateName` - one of them must be set to apply resource to a cluster
+      # - identifier: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `initialDelaySeconds` - set explicitly to control the start time before a probe is initiated (min 0)
+      # - identifier: CONTAINERS_INCORRECT_PERIODSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `periodSeconds` - set explicitly to control how often a probe is performed (min 1)
+      # - identifier: CONTAINERS_INCORRECT_TIMEOUTSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `timeoutSeconds` - set explicitly to control when a probe times out (min 1)
+      # - identifier: CONTAINERS_INCORRECT_SUCCESSTHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `successThreshold` - set explicitly to control when a probe is considered successful after having failed
+      # - identifier: CONTAINERS_INCORRECT_FAILURETHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `failureThreshold` - set explicitly to control the number of retries after a probe fails (min 1)
+      # - identifier: CONTAINERS_MISSING_PRESTOP_KEY
+      #   messageOnFailure: Missing property object `preStop` - set to ensure graceful shutdown of the container
+  - name: NSA
+    rules:
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_VERSION
+      #   messageOnFailure: Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future
+      # - identifier: CONTAINERS_MISSING_MEMORY_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.memory` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_CPU_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_CPU_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE
+      #   messageOnFailure: Incorrect value for key `host` - specify host instead of using a wildcard character ("*")
+      # - identifier: SERVICE_INCORRECT_TYPE_VALUE_NODEPORT
+      #   messageOnFailure: Incorrect value for key `type` - `NodePort` will open a port on all nodes where it can be reached by the network external to the cluster
+      # - identifier: CRONJOB_INVALID_SCHEDULE_VALUE
+      #   messageOnFailure: 'Incorrect value for key `schedule` - the (cron) schedule expressions is not valid and, therefore, will not work as expected'
+      # - identifier: WORKLOAD_INVALID_LABELS_VALUE
+      #   messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it
+      # - identifier: WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS
+      #   messageOnFailure: Incorrect value for key `restartPolicy` - any other value than `Always` is not supported by this resource
+      # - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
+      #   messageOnFailure: Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks
+      # - identifier: CONTAINERS_MISSING_READINESSPROBE_KEY
+      #   messageOnFailure: Missing property object `readinessProbe` - add a properly configured readinessProbe to notify kubelet your Pods are ready for traffic
+      # - identifier: HPA_MISSING_MINREPLICAS_KEY
+      #   messageOnFailure: Missing property object `minReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: HPA_MISSING_MAXREPLICAS_KEY
+      #   messageOnFailure: Missing property object `maxReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT
+      #   messageOnFailure: Incorrect value for key `namespace` - use an explicit namespace instead of the default one (`default`)
+      # - identifier: DEPLOYMENT_INCORRECT_REPLICAS_VALUE
+      #   messageOnFailure: Incorrect value for key `replicas` - running 2 or more replicas will increase the availability of the service
+      # - identifier: CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY
+      #   messageOnFailure: Missing property object `startingDeadlineSeconds` - set a time limit to the cron execution to allow killing it if exceeded
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.16
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.16)
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.17
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.17)
+      # - identifier: CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `privileged` - this mode will allow the container the same access as processes running on the host
+      # - identifier: WORKLOAD_MISSING_LABEL_OWNER_VALUE
+      #   messageOnFailure: Missing label object `owner` - add a proper owner label to know which person/team to ping when needed
+      # - identifier: DEPLOYMENT_MISSING_LABEL_ENV_VALUE
+      #   messageOnFailure: 'Missing label object `env` - add a proper environment description (e.g. "prod", "testing", etc.) to the Deployment config'
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_DIGEST
+      #   messageOnFailure: 'Incorrect value for key `image` - add a digest tag (starts with `@sha256:`) to represent an immutable version of the image'
+      # - identifier: CRONJOB_MISSING_CONCURRENCYPOLICY_KEY
+      #   messageOnFailure: Missing property object `concurrencyPolicy` - the behavior will be more deterministic if jobs won't run concurrently
+      # - identifier: K8S_INCORRECT_KIND_VALUE_POD
+      #   messageOnFailure: Incorrect value for key `kind` - raw pod won't be rescheduled in the event of a node failure
+      # - identifier: CONTAINERS_INCORRECT_HOSTPID_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostPID` - running on the host's PID namespace enables access to sensitive information from processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTIPC_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostIPC` - running on the host`s IPC namespace can be (maliciously) used to interact with other processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTNETWORK_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostNetwork` - running on the host's network namespace can allow a compromised container to sniff network traffic
+      - identifier: CONTAINERS_INCORRECT_RUNASUSER_VALUE_LOWUID
+        messageOnFailure: Incorrect value for key `runAsUser` - value should be above 9999 to reduce the likelihood that the UID is already taken
+      # - identifier: CONTAINERS_INCORRECT_PATH_VALUE_DOCKERSOCKET
+      #   messageOnFailure: Incorrect value for key `path` - avoid mounting the docker.socket becasue it can allow container breakout
+      # - identifier: CONFIGMAP_CVE2021_25742_INCORRECT_SNIPPET_ANNOTATIONS_VALUE
+      #   messageOnFailure: Missing property object `allow-snippet-annotations` - set it to "false" to override default behaviour
+      # - identifier: INGRESS_CVE2021_25742_INCORRECT_SERVER_SNIPPET_KEY
+      #   messageOnFailure: Forbidden property object `server-snippet` - ingress-nginx custom snippets are not allowed
+      # - identifier: CONTAINER_CVE2021_25741_INCORRECT_SUBPATH_KEY
+      #   messageOnFailure: Forbidden property object `subPath` - malicious users can gain access to files & directories outside of the volume
+      # - identifier: ENDPOINTSLICE_CVE2021_25373_INCORRECT_ADDRESSES_VALUE
+      #   messageOnFailure: Incorrect value for key `addresses` - IP address is within vulnerable ranges (127.0.0.0/8 and 169.254.0.0/16)
+      # - identifier: ARGO_WORKFLOW_INCORRECT_FAILFAST_VALUE_FALSE
+      #   messageOnFailure: 'Incorrect value for key `failFast` - value should be `true` to prevent DAG from running on all branches, regardless of the failed outcomes of the DAG branches'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_SERVICE_ACCOUNT_NAME_VALUE_DEFAULT
+      #   messageOnFailure: Incorrect value for key `serviceAccountName` - when set to `default` container is exposed to possible attacks
+      # - identifier: ARGO_CONFIGMAP_MISSING_PART_OF_LABEL_VALUE_ARGOCD
+      #   messageOnFailure: 'Incorrect value for annotation `app.kubernetes.io/part-of` - value should be `argocd`, or ArgoCD won''t recognize this resource'
+      # - identifier: ARGO_ROLLOUT_MISSING_PAUSE_DURATION
+      #   messageOnFailure: Missing the key `duration` - prevent the rollout from waiting indefinitely for the pause condition
+      # - identifier: ARGO_APP_PROJECT_INCORRECT_NAMESPACE_VALUE
+      #   messageOnFailure: Incorrect value for property `namespace` - Application and AppProject have to be installed on the argocd namespace
+      # - identifier: ARGO_WORKFLOW_INCORRECT_RETRY_STRATEGY_VALUE_EMPTY
+      #   messageOnFailure: 'Incorrect value for key `retryStrategy` - empty value (`{}`) can cause failed/errored steps to keep retrying, which can result in OOM issues'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_REVISION_HISTORY_LIMIT_VALUE_0
+      #   messageOnFailure: Incorrect value for key `revisionHistoryLimit` - value above 0 is required to enable rolling back from a failed deployment
+      # - identifier: ARGO_ROLLOUT_INCORRECT_SCALE_DOWN_DELAY_VALUE_BELOW_30
+      #   messageOnFailure: Incorrect value for key `scaleDownDelaySeconds` - value should be at least 30 to prevent packets from being sent to a node that killed the pod
+      # - identifier: ARGO_ROLLOUT_INCORRECT_PROGRESS_DEADLINE_ABORT_VALUE_FALSE
+      #   messageOnFailure: Incorrect value for key `progressDeadlineAbort` - value should be `true` to prevent the rollout pod from retrying indefinitely
+      # - identifier: ARGO_WORKFLOW_ENSURE_RETRY_ON_BOTH_ERROR_AND_TRANSIENT_ERROR
+      #   messageOnFailure: Incorrect value for key `retryPolicy` - the expression should include retry on steps that failed either on transient or Argo controller errors
+      - identifier: CONTAINERS_INCORRECT_READONLYROOTFILESYSTEM_VALUE
+        messageOnFailure: Incorrect value for key `readOnlyRootFilesystem` - set to 'true' to protect filesystem from potential attacks
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPATH
+        messageOnFailure: Invalid key `hostPath` - refrain from using this mount to prevent an attack on the underlying host
+      - identifier: CONTAINERS_MISSING_KEY_ALLOWPRIVILEGEESCALATION
+        messageOnFailure: Missing key `allowPrivilegeEscalation` - set to false to prevent attackers from exploiting escalated container privileges
+      - identifier: CONTAINERS_INCORRECT_RESOURCES_VERBS_VALUE
+        messageOnFailure: Incorrect value for key `resources` and/or `verbs` - allowing containers to run the exec command can be exploited by attackers
+      - identifier: CONTAINERS_INVALID_CAPABILITIES_VALUE
+        messageOnFailure: Incorrect value for key `add` - refrain from using insecure capabilities to prevent access to sensitive components
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPORT
+        messageOnFailure: Incorrect key `hostPort` - refrain from using this key to prevent insecurely exposing your workload
+      - identifier: CONTAINERS_INCORRECT_RUNASGROUP_VALUE_LOWGID
+        messageOnFailure: Invalid value for key `runAsGroup` - must be greater than 999 to ensure container is running with non-root group membership
+      - identifier: CONTAINERS_INCORRECT_RUNASNONROOT_VALUE
+        messageOnFailure: Invalid value for key `runAsNonRoot` - must be set to `true` to prevent unnecessary privileges
+      - identifier: SRVACC_INCORRECT_AUTOMOUNTSERVICEACCOUNTTOKEN_VALUE
+        messageOnFailure: Invalid value for key `automountServiceAccountToken` - must be set to `false` to prevent granting unnecessary access to the service account
+      # - identifier: RESOURCE_MISSING_NAME
+      #   messageOnFailure: Missing key `name` or `generateName` - one of them must be set to apply resource to a cluster
+      # - identifier: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `initialDelaySeconds` - set explicitly to control the start time before a probe is initiated (min 0)
+      # - identifier: CONTAINERS_INCORRECT_PERIODSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `periodSeconds` - set explicitly to control how often a probe is performed (min 1)
+      # - identifier: CONTAINERS_INCORRECT_TIMEOUTSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `timeoutSeconds` - set explicitly to control when a probe times out (min 1)
+      # - identifier: CONTAINERS_INCORRECT_SUCCESSTHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `successThreshold` - set explicitly to control when a probe is considered successful after having failed
+      # - identifier: CONTAINERS_INCORRECT_FAILURETHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `failureThreshold` - set explicitly to control the number of retries after a probe fails (min 1)
+      # - identifier: CONTAINERS_MISSING_PRESTOP_KEY
+      #   messageOnFailure: Missing property object `preStop` - set to ensure graceful shutdown of the container
+  - name: cdk8s
+    rules:
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.16
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.16)
+      - identifier: CONTAINERS_MISSING_IMAGE_VALUE_VERSION
+        messageOnFailure: Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future
+      - identifier: INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE
+        messageOnFailure: Incorrect value for key `host` - specify host instead of using a wildcard character ("*")
+      # - identifier: SERVICE_INCORRECT_TYPE_VALUE_NODEPORT
+      #   messageOnFailure: Incorrect value for key `type` - `NodePort` will open a port on all nodes where it can be reached by the network external to the cluster
+      # - identifier: CONTAINERS_MISSING_CPU_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_CPU_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.cpu` - value should be within the accepted boundaries recommended by the organization
+      # - identifier: CONTAINERS_MISSING_MEMORY_REQUEST_KEY
+      #   messageOnFailure: Missing property object `requests.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: WORKLOAD_INVALID_LABELS_VALUE
+        messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it
+      - identifier: WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS
+        messageOnFailure: Incorrect value for key `restartPolicy` - any other value than `Always` is not supported by this resource
+      # - identifier: HPA_MISSING_MAXREPLICAS_KEY
+      #   messageOnFailure: Missing property object `maxReplicas` - the value should be within the accepted boundaries recommended by the organization
+      - identifier: WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT
+        messageOnFailure: Incorrect value for key `namespace` - use an explicit namespace instead of the default one (`default`)
+      - identifier: DEPLOYMENT_INCORRECT_REPLICAS_VALUE
+        messageOnFailure: Incorrect value for key `replicas` - running 2 or more replicas will increase the availability of the service
+      # - identifier: WORKLOAD_MISSING_LABEL_OWNER_VALUE
+      #   messageOnFailure: Missing label object `owner` - add a proper owner label to know which person/team to ping when needed
+      # - identifier: DEPLOYMENT_MISSING_LABEL_ENV_VALUE
+      #   messageOnFailure: 'Missing label object `env` - add a proper environment description (e.g. "prod", "testing", etc.) to the Deployment config'
+      # - identifier: CONTAINERS_MISSING_IMAGE_VALUE_DIGEST
+      #   messageOnFailure: 'Incorrect value for key `image` - add a digest tag (starts with `@sha256:`) to represent an immutable version of the image'
+      # - identifier: CONTAINERS_INCORRECT_HOSTPID_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostPID` - running on the host's PID namespace enables access to sensitive information from processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTIPC_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostIPC` - running on the host`s IPC namespace can be (maliciously) used to interact with other processes running outside the container
+      # - identifier: CONTAINERS_INCORRECT_HOSTNETWORK_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `hostNetwork` - running on the host's network namespace can allow a compromised container to sniff network traffic
+      # - identifier: CONTAINERS_INCORRECT_RUNASUSER_VALUE_LOWUID
+      #   messageOnFailure: Incorrect value for key `runAsUser` - value should be above 9999 to reduce the likelihood that the UID is already taken
+      # - identifier: CONTAINERS_INCORRECT_PATH_VALUE_DOCKERSOCKET
+      #   messageOnFailure: Incorrect value for key `path` - avoid mounting the docker.socket becasue it can allow container breakout
+      # - identifier: CONFIGMAP_CVE2021_25742_INCORRECT_SNIPPET_ANNOTATIONS_VALUE
+      #   messageOnFailure: Missing property object `allow-snippet-annotations` - set it to "false" to override default behaviour
+      # - identifier: INGRESS_CVE2021_25742_INCORRECT_SERVER_SNIPPET_KEY
+      #   messageOnFailure: Forbidden property object `server-snippet` - ingress-nginx custom snippets are not allowed
+      # - identifier: CONTAINERS_MISSING_READINESSPROBE_KEY
+      #   messageOnFailure: Missing property object `readinessProbe` - add a properly configured readinessProbe to notify kubelet your Pods are ready for traffic
+      # - identifier: CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY
+      #   messageOnFailure: Missing property object `startingDeadlineSeconds` - set a time limit to the cron execution to allow killing it if exceeded
+      # - identifier: HPA_MISSING_MINREPLICAS_KEY
+      #   messageOnFailure: Missing property object `minReplicas` - the value should be within the accepted boundaries recommended by the organization
+      # - identifier: K8S_DEPRECATED_APIVERSION_1.17
+      #   messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.17)
+      # - identifier: CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE
+      #   messageOnFailure: Incorrect value for key `privileged` - this mode will allow the container the same access as processes running on the host
+      - identifier: K8S_INCORRECT_KIND_VALUE_POD
+        messageOnFailure: Incorrect value for key `kind` - raw pod won't be rescheduled in the event of a node failure
+      # - identifier: CONTAINER_CVE2021_25741_INCORRECT_SUBPATH_KEY
+      #   messageOnFailure: Forbidden property object `subPath` - malicious users can gain access to files & directories outside of the volume
+      # - identifier: ENDPOINTSLICE_CVE2021_25373_INCORRECT_ADDRESSES_VALUE
+      #   messageOnFailure: Incorrect value for key `addresses` - IP address is within vulnerable ranges (127.0.0.0/8 and 169.254.0.0/16)
+      # - identifier: ARGO_WORKFLOW_INCORRECT_FAILFAST_VALUE_FALSE
+      #   messageOnFailure: 'Incorrect value for key `failFast` - value should be `true` to prevent DAG from running on all branches, regardless of the failed outcomes of the DAG branches'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_SERVICE_ACCOUNT_NAME_VALUE_DEFAULT
+      #   messageOnFailure: Incorrect value for key `serviceAccountName` - when set to `default` container is exposed to possible attacks
+      # - identifier: ARGO_CONFIGMAP_MISSING_PART_OF_LABEL_VALUE_ARGOCD
+      #   messageOnFailure: 'Incorrect value for annotation `app.kubernetes.io/part-of` - value should be `argocd`, or ArgoCD won''t recognize this resource'
+      # - identifier: ARGO_ROLLOUT_MISSING_PAUSE_DURATION
+      #   messageOnFailure: Missing the key `duration` - prevent the rollout from waiting indefinitely for the pause condition
+      # - identifier: ARGO_APP_PROJECT_INCORRECT_NAMESPACE_VALUE
+      #   messageOnFailure: Incorrect value for property `namespace` - Application and AppProject have to be installed on the argocd namespace
+      # - identifier: ARGO_WORKFLOW_INCORRECT_RETRY_STRATEGY_VALUE_EMPTY
+      #   messageOnFailure: 'Incorrect value for key `retryStrategy` - empty value (`{}`) can cause failed/errored steps to keep retrying, which can result in OOM issues'
+      # - identifier: ARGO_WORKFLOW_INCORRECT_REVISION_HISTORY_LIMIT_VALUE_0
+      #   messageOnFailure: Incorrect value for key `revisionHistoryLimit` - value above 0 is required to enable rolling back from a failed deployment
+      # - identifier: ARGO_ROLLOUT_INCORRECT_SCALE_DOWN_DELAY_VALUE_BELOW_30
+      #   messageOnFailure: Incorrect value for key `scaleDownDelaySeconds` - value should be at least 30 to prevent packets from being sent to a node that killed the pod
+      # - identifier: ARGO_ROLLOUT_INCORRECT_PROGRESS_DEADLINE_ABORT_VALUE_FALSE
+      #   messageOnFailure: Incorrect value for key `progressDeadlineAbort` - value should be `true` to prevent the rollout pod from retrying indefinitely
+      # - identifier: ARGO_WORKFLOW_ENSURE_RETRY_ON_BOTH_ERROR_AND_TRANSIENT_ERROR
+      #   messageOnFailure: Incorrect value for key `retryPolicy` - the expression should include retry on steps that failed either on transient or Argo controller errors
+      - identifier: CONTAINERS_INCORRECT_READONLYROOTFILESYSTEM_VALUE
+        messageOnFailure: Incorrect value for key `readOnlyRootFilesystem` - set to 'true' to protect filesystem from potential attacks
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPATH
+        messageOnFailure: Invalid key `hostPath` - refrain from using this mount to prevent an attack on the underlying host
+      # - identifier: CONTAINERS_INCORRECT_RESOURCES_VERBS_VALUE
+      #   messageOnFailure: Incorrect value for key `resources` and/or `verbs` - allowing containers to run the exec command can be exploited by attackers
+      # - identifier: CONTAINERS_INVALID_CAPABILITIES_VALUE
+      #   messageOnFailure: Incorrect value for key `add` - refrain from using insecure capabilities to prevent access to sensitive components
+      # - identifier: CONTAINERS_INCORRECT_RUNASGROUP_VALUE_LOWGID
+      #   messageOnFailure: Invalid value for key `runAsGroup` - must be greater than 999 to ensure container is running with non-root group membership
+      # - identifier: CONTAINERS_INCORRECT_RUNASNONROOT_VALUE
+      #   messageOnFailure: Invalid value for key `runAsNonRoot` - must be set to `true` to prevent unnecessary privileges
+      # - identifier: SRVACC_INCORRECT_AUTOMOUNTSERVICEACCOUNTTOKEN_VALUE
+      #   messageOnFailure: Invalid value for key `automountServiceAccountToken` - must be set to `false` to prevent granting unnecessary access to the service account
+      - identifier: RESOURCE_MISSING_NAME
+        messageOnFailure: Missing key `name` or `generateName` - one of them must be set to apply resource to a cluster
+      # - identifier: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `initialDelaySeconds` - set explicitly to control the start time before a probe is initiated (min 0)
+      # - identifier: CONTAINERS_INCORRECT_PERIODSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `periodSeconds` - set explicitly to control how often a probe is performed (min 1)
+      # - identifier: CONTAINERS_INCORRECT_TIMEOUTSECONDS_VALUE
+      #   messageOnFailure: Incorrect value for key `timeoutSeconds` - set explicitly to control when a probe times out (min 1)
+      # - identifier: CONTAINERS_INCORRECT_SUCCESSTHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `successThreshold` - set explicitly to control when a probe is considered successful after having failed
+      # - identifier: CONTAINERS_INCORRECT_FAILURETHRESHOLD_VALUE
+      #   messageOnFailure: Incorrect value for key `failureThreshold` - set explicitly to control the number of retries after a probe fails (min 1)
+      # - identifier: CONTAINERS_MISSING_PRESTOP_KEY
+      #   messageOnFailure: Missing property object `preStop` - set to ensure graceful shutdown of the container
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPORT
+        messageOnFailure: Incorrect key `hostPort` - refrain from using this key to prevent insecurely exposing your workload
+      # - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
+      #   messageOnFailure: Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks
+      - identifier: CRONJOB_INVALID_SCHEDULE_VALUE
+        messageOnFailure: 'Incorrect value for key `schedule` - the (cron) schedule expressions is not valid and, therefore, will not work as expected'
+      # - identifier: CRONJOB_MISSING_CONCURRENCYPOLICY_KEY
+      #   messageOnFailure: Missing property object `concurrencyPolicy` - the behavior will be more deterministic if jobs won't run concurrently
+      # - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
+      #   messageOnFailure: Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_KEY_ALLOWPRIVILEGEESCALATION
+        messageOnFailure: Missing key `allowPrivilegeEscalation` - set to false to prevent attackers from exploiting escalated container privileges
+  - name: Strict
+    rules:
+      - identifier: CONTAINERS_MISSING_IMAGE_VALUE_VERSION
+        messageOnFailure: Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future
+      - identifier: CONTAINERS_MISSING_MEMORY_REQUEST_KEY
+        messageOnFailure: Missing property object `requests.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_CPU_REQUEST_KEY
+        messageOnFailure: Missing property object `requests.cpu` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
+        messageOnFailure: Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization
+      - identifier: CONTAINERS_MISSING_CPU_LIMIT_KEY
+        messageOnFailure: Missing property object `limits.cpu` - value should be within the accepted boundaries recommended by the organization
+      - identifier: INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE
+        messageOnFailure: Incorrect value for key `host` - specify host instead of using a wildcard character ("*")
+      - identifier: SERVICE_INCORRECT_TYPE_VALUE_NODEPORT
+        messageOnFailure: Incorrect value for key `type` - `NodePort` will open a port on all nodes where it can be reached by the network external to the cluster
+      - identifier: CRONJOB_INVALID_SCHEDULE_VALUE
+        messageOnFailure: 'Incorrect value for key `schedule` - the (cron) schedule expressions is not valid and, therefore, will not work as expected'
+      - identifier: WORKLOAD_INVALID_LABELS_VALUE
+        messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it
+      - identifier: WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS
+        messageOnFailure: Incorrect value for key `restartPolicy` - any other value than `Always` is not supported by this resource
+      - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
+        messageOnFailure: Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks
+      - identifier: CONTAINERS_MISSING_READINESSPROBE_KEY
+        messageOnFailure: Missing property object `readinessProbe` - add a properly configured readinessProbe to notify kubelet your Pods are ready for traffic
+      - identifier: HPA_MISSING_MINREPLICAS_KEY
+        messageOnFailure: Missing property object `minReplicas` - the value should be within the accepted boundaries recommended by the organization
+      - identifier: HPA_MISSING_MAXREPLICAS_KEY
+        messageOnFailure: Missing property object `maxReplicas` - the value should be within the accepted boundaries recommended by the organization
+      - identifier: WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT
+        messageOnFailure: Incorrect value for key `namespace` - use an explicit namespace instead of the default one (`default`)
+      - identifier: DEPLOYMENT_INCORRECT_REPLICAS_VALUE
+        messageOnFailure: Incorrect value for key `replicas` - running 2 or more replicas will increase the availability of the service
+      - identifier: CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY
+        messageOnFailure: Missing property object `startingDeadlineSeconds` - set a time limit to the cron execution to allow killing it if exceeded
+      - identifier: K8S_DEPRECATED_APIVERSION_1.16
+        messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.16)
+      - identifier: K8S_DEPRECATED_APIVERSION_1.17
+        messageOnFailure: Incorrect value for key `apiVersion` - the version you are trying to use is not supported by the Kubernetes cluster version (>=1.17)
+      - identifier: CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE
+        messageOnFailure: Incorrect value for key `privileged` - this mode will allow the container the same access as processes running on the host
+      - identifier: WORKLOAD_MISSING_LABEL_OWNER_VALUE
+        messageOnFailure: Missing label object `owner` - add a proper owner label to know which person/team to ping when needed
+      - identifier: DEPLOYMENT_MISSING_LABEL_ENV_VALUE
+        messageOnFailure: 'Missing label object `env` - add a proper environment description (e.g. "prod", "testing", etc.) to the Deployment config'
+      - identifier: CONTAINERS_MISSING_IMAGE_VALUE_DIGEST
+        messageOnFailure: 'Incorrect value for key `image` - add a digest tag (starts with `@sha256:`) to represent an immutable version of the image'
+      - identifier: CRONJOB_MISSING_CONCURRENCYPOLICY_KEY
+        messageOnFailure: Missing property object `concurrencyPolicy` - the behavior will be more deterministic if jobs won't run concurrently
+      - identifier: K8S_INCORRECT_KIND_VALUE_POD
+        messageOnFailure: Incorrect value for key `kind` - raw pod won't be rescheduled in the event of a node failure
+      - identifier: CONTAINERS_INCORRECT_HOSTPID_VALUE_TRUE
+        messageOnFailure: Incorrect value for key `hostPID` - running on the host's PID namespace enables access to sensitive information from processes running outside the container
+      - identifier: CONTAINERS_INCORRECT_HOSTIPC_VALUE_TRUE
+        messageOnFailure: Incorrect value for key `hostIPC` - running on the host`s IPC namespace can be (maliciously) used to interact with other processes running outside the container
+      - identifier: CONTAINERS_INCORRECT_HOSTNETWORK_VALUE_TRUE
+        messageOnFailure: Incorrect value for key `hostNetwork` - running on the host's network namespace can allow a compromised container to sniff network traffic
+      - identifier: CONTAINERS_INCORRECT_RUNASUSER_VALUE_LOWUID
+        messageOnFailure: Incorrect value for key `runAsUser` - value should be above 9999 to reduce the likelihood that the UID is already taken
+      - identifier: CONTAINERS_INCORRECT_PATH_VALUE_DOCKERSOCKET
+        messageOnFailure: Incorrect value for key `path` - avoid mounting the docker.socket becasue it can allow container breakout
+      - identifier: CONFIGMAP_CVE2021_25742_INCORRECT_SNIPPET_ANNOTATIONS_VALUE
+        messageOnFailure: Missing property object `allow-snippet-annotations` - set it to "false" to override default behaviour
+      - identifier: INGRESS_CVE2021_25742_INCORRECT_SERVER_SNIPPET_KEY
+        messageOnFailure: Forbidden property object `server-snippet` - ingress-nginx custom snippets are not allowed
+      - identifier: CONTAINER_CVE2021_25741_INCORRECT_SUBPATH_KEY
+        messageOnFailure: Forbidden property object `subPath` - malicious users can gain access to files & directories outside of the volume
+      - identifier: ENDPOINTSLICE_CVE2021_25373_INCORRECT_ADDRESSES_VALUE
+        messageOnFailure: Incorrect value for key `addresses` - IP address is within vulnerable ranges (127.0.0.0/8 and 169.254.0.0/16)
+      - identifier: ARGO_WORKFLOW_INCORRECT_FAILFAST_VALUE_FALSE
+        messageOnFailure: 'Incorrect value for key `failFast` - value should be `true` to prevent DAG from running on all branches, regardless of the failed outcomes of the DAG branches'
+      - identifier: ARGO_WORKFLOW_INCORRECT_SERVICE_ACCOUNT_NAME_VALUE_DEFAULT
+        messageOnFailure: Incorrect value for key `serviceAccountName` - when set to `default` container is exposed to possible attacks
+      - identifier: ARGO_CONFIGMAP_MISSING_PART_OF_LABEL_VALUE_ARGOCD
+        messageOnFailure: "Incorrect value for annotation `app.kubernetes.io/part-of` - value should be `argocd`, or ArgoCD won't recognize this resource"
+      - identifier: ARGO_ROLLOUT_MISSING_PAUSE_DURATION
+        messageOnFailure: Missing the key `duration` - prevent the rollout from waiting indefinitely for the pause condition
+      - identifier: ARGO_APP_PROJECT_INCORRECT_NAMESPACE_VALUE
+        messageOnFailure: Incorrect value for property `namespace` - Application and AppProject have to be installed on the argocd namespace
+      - identifier: ARGO_WORKFLOW_INCORRECT_RETRY_STRATEGY_VALUE_EMPTY
+        messageOnFailure: 'Incorrect value for key `retryStrategy` - empty value (`{}`) can cause failed/errored steps to keep retrying, which can result in OOM issues'
+      - identifier: ARGO_WORKFLOW_INCORRECT_REVISION_HISTORY_LIMIT_VALUE_0
+        messageOnFailure: Incorrect value for key `revisionHistoryLimit` - value above 0 is required to enable rolling back from a failed deployment
+      - identifier: ARGO_ROLLOUT_INCORRECT_SCALE_DOWN_DELAY_VALUE_BELOW_30
+        messageOnFailure: Incorrect value for key `scaleDownDelaySeconds` - value should be at least 30 to prevent packets from being sent to a node that killed the pod
+      - identifier: ARGO_ROLLOUT_INCORRECT_PROGRESS_DEADLINE_ABORT_VALUE_FALSE
+        messageOnFailure: Incorrect value for key `progressDeadlineAbort` - value should be `true` to prevent the rollout pod from retrying indefinitely
+      - identifier: ARGO_WORKFLOW_ENSURE_RETRY_ON_BOTH_ERROR_AND_TRANSIENT_ERROR
+        messageOnFailure: Incorrect value for key `retryPolicy` - the expression should include retry on steps that failed either on transient or Argo controller errors
+      - identifier: CONTAINERS_INCORRECT_READONLYROOTFILESYSTEM_VALUE
+        messageOnFailure: Incorrect value for key `readOnlyRootFilesystem` - set to 'true' to protect filesystem from potential attacks
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPATH
+        messageOnFailure: Invalid key `hostPath` - refrain from using this mount to prevent an attack on the underlying host
+      - identifier: CONTAINERS_MISSING_KEY_ALLOWPRIVILEGEESCALATION
+        messageOnFailure: Missing key `allowPrivilegeEscalation` - set to false to prevent attackers from exploiting escalated container privileges
+      - identifier: CONTAINERS_INCORRECT_RESOURCES_VERBS_VALUE
+        messageOnFailure: Incorrect value for key `resources` and/or `verbs` - allowing containers to run the exec command can be exploited by attackers
+      - identifier: CONTAINERS_INVALID_CAPABILITIES_VALUE
+        messageOnFailure: Incorrect value for key `add` - refrain from using insecure capabilities to prevent access to sensitive components
+      - identifier: CONTAINERS_INCORRECT_KEY_HOSTPORT
+        messageOnFailure: Incorrect key `hostPort` - refrain from using this key to prevent insecurely exposing your workload
+      - identifier: CONTAINERS_INCORRECT_RUNASGROUP_VALUE_LOWGID
+        messageOnFailure: Invalid value for key `runAsGroup` - must be greater than 999 to ensure container is running with non-root group membership
+      - identifier: CONTAINERS_INCORRECT_RUNASNONROOT_VALUE
+        messageOnFailure: Invalid value for key `runAsNonRoot` - must be set to `true` to prevent unnecessary privileges
+      - identifier: SRVACC_INCORRECT_AUTOMOUNTSERVICEACCOUNTTOKEN_VALUE
+        messageOnFailure: Invalid value for key `automountServiceAccountToken` - must be set to `false` to prevent granting unnecessary access to the service account
+      - identifier: RESOURCE_MISSING_NAME
+        messageOnFailure: Missing key `name` or `generateName` - one of them must be set to apply resource to a cluster
+      - identifier: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
+        messageOnFailure: Incorrect value for key `initialDelaySeconds` - set explicitly to control the start time before a probe is initiated (min 0)
+      - identifier: CONTAINERS_INCORRECT_PERIODSECONDS_VALUE
+        messageOnFailure: Incorrect value for key `periodSeconds` - set explicitly to control how often a probe is performed (min 1)
+      - identifier: CONTAINERS_INCORRECT_TIMEOUTSECONDS_VALUE
+        messageOnFailure: Incorrect value for key `timeoutSeconds` - set explicitly to control when a probe times out (min 1)
+      - identifier: CONTAINERS_INCORRECT_SUCCESSTHRESHOLD_VALUE
+        messageOnFailure: Incorrect value for key `successThreshold` - set explicitly to control when a probe is considered successful after having failed
+      - identifier: CONTAINERS_INCORRECT_FAILURETHRESHOLD_VALUE
+        messageOnFailure: Incorrect value for key `failureThreshold` - set explicitly to control the number of retries after a probe fails (min 1)
+      - identifier: CONTAINERS_MISSING_PRESTOP_KEY
+        messageOnFailure: Missing property object `preStop` - set to ensure graceful shutdown of the container
diff --git a/pkg/defaultRules/defaultRules.yaml b/pkg/defaultRules/defaultRules.yaml
index f39d546..aa78556 100644
--- a/pkg/defaultRules/defaultRules.yaml
+++ b/pkg/defaultRules/defaultRules.yaml
@@ -1217,25 +1217,8 @@ rules:
                           - readOnlyRootFilesystem
                     required:
                       - securityContext
-        podSecurityContextPattern:
-          if:
-            properties:
-              kind:
-                enum:
-                  - Pod
-          then:
-            properties:
-              spec:
-                properties:
-                  securityContext:
-                    properties:
-                      readOnlyRootFilesystem:
-                        const: true
-                    required:
-                      - readOnlyRootFilesystem
       allOf:
         - $ref: "#/definitions/containerSecurityPattern"
-        - $ref: "#/definitions/podSecurityContextPattern"
       additionalProperties:
         $ref: "#"
       items:
@@ -1565,9 +1548,16 @@ rules:
                 - generateName
           required:
             - metadata
-      anyOf:
-        - $ref: "#/definitions/metadataNamePattern"
-        - $ref: "#/definitions/metadataGenerateNamePattern"
+      if:
+        properties:
+          kind:
+            not:
+              enum:
+                - Kustomization
+      then:
+        anyOf:
+          - $ref: "#/definitions/metadataNamePattern"
+          - $ref: "#/definitions/metadataGenerateNamePattern"
   - id: 55
     name: Ensure each container probe has an initial delay configured
     uniqueName: CONTAINERS_INCORRECT_INITIALDELAYSECONDS_VALUE
@@ -1869,3 +1859,98 @@ rules:
         $ref: "#"
       items:
         $ref: "#"
+  - id: 61
+    name: "Prevent containers from having unnecessary system call privileges"
+    uniqueName: CONTAINERS_INCORRECT_SECCOMP_PROFILE
+    enabledByDefault: false
+    documentationUrl: "https://hub.datree.io/built-in-rules/prevent-system-call-privileges"
+    messageOnFailure: "Incorrect value for key seccompProfile - set an explicit value to prevent malicious use of system calls within the container"
+    category: Containers
+    schema:
+      definitions:
+        seccompExplicit:
+          if: *standardKinds
+          then:
+            properties: 
+              spec:
+                oneOf:
+                  - $ref: "#/$defs/securityContextSeccompReq"
+                  - $ref: "#/definitions/seccompExplicitInContainer"
+        seccompExplicitInContainer:
+          if: *standardKinds
+          then:
+            properties:
+              containers:
+                type: array
+                items:
+                  $ref: "#/$defs/securityContextSeccompReq"
+              initContainers:
+                type: array
+                items:
+                  $ref: "#/$defs/securityContextSeccompReq"
+              ephemeralContainers:
+                type: array
+                items:
+                  $ref: "#/$defs/securityContextSeccompReq"
+        seccompPatternInSpec:
+          if: *standardKinds
+          then:
+            properties:
+              spec:
+                $ref: "#/$defs/securityContextSeccomp"
+        seccompPatternInContainer:
+          if: *standardKinds
+          then:
+            properties:
+              spec:
+                properties:
+                  containers:
+                    type: array
+                    items:
+                      $ref: "#/$defs/securityContextSeccomp"
+                  initContainers:
+                    type: array
+                    items:
+                      $ref: "#/$defs/securityContextSeccomp"
+                  ephemeralContainers:
+                    type: array
+                    items:
+                      $ref: "#/$defs/securityContextSeccomp"
+
+      allOf:
+        - $ref: "#/definitions/seccompExplicit"
+        - $ref: "#/definitions/seccompPatternInSpec"
+        - $ref: "#/definitions/seccompPatternInContainer"
+
+      additionalProperties:
+        $ref: "#"
+        items:
+          $ref: "#"
+      
+      $defs:
+        securityContextSeccompReq:
+          required:
+            - securityContext
+          properties:
+            securityContext:
+              type: object
+              required:
+                - seccompProfile
+              properties:
+                seccompProfile:
+                  type: object
+                  required:
+                    - type
+        securityContextSeccomp:
+          properties:
+            securityContext:
+              type: object
+              properties:
+                seccompProfile:
+                  type: object
+                  properties:
+                    type:
+                      not:
+                        enum:
+                          - "unconfined"
+                          - "Unconfined"
diff --git a/pkg/defaultRules/defaultRulesSchema.json b/pkg/defaultRules/defaultRulesSchema.json
index b06733a..c6325b6 100644
--- a/pkg/defaultRules/defaultRulesSchema.json
+++ b/pkg/defaultRules/defaultRulesSchema.json
@@ -10,15 +10,15 @@
     },
     "rules": {
       "type": "array",
-      "minItems": 60,
-      "maxItems": 60,
+      "minItems": 61,
+      "maxItems": 61,
       "items": {
         "type": "object",
         "properties": {
           "id": {
             "type": "number",
             "minimum": 1,
-            "maximum": 60
+            "maximum": 61
           },
           "name": {
             "type": "string",
diff --git a/pkg/evaluation/evaluator.go b/pkg/evaluation/evaluator.go
index 0edf909..f91ea87 100644
--- a/pkg/evaluation/evaluator.go
+++ b/pkg/evaluation/evaluator.go
@@ -2,16 +2,21 @@ package evaluation
 
 import (
 	"encoding/json"
+	"os"
+	"regexp"
 	"strings"
 
-	"github.com/xeipuuv/gojsonschema"
-
 	policy_factory "github.com/datreeio/datree/bl/policy"
 	"github.com/datreeio/datree/pkg/ciContext"
 	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/datreeio/datree/pkg/extractor"
 	"github.com/datreeio/datree/pkg/jsonSchemaValidator"
 	"github.com/datreeio/datree/pkg/utils"
+	"github.com/mikefarah/yq/v4/pkg/yqlib"
+
+	"github.com/xeipuuv/gojsonschema"
+	"gopkg.in/op/go-logging.v1"
+	"gopkg.in/yaml.v3"
 )
 
 const (
@@ -26,6 +31,7 @@ type Evaluator struct {
 	cliClient           CLIClient
 	ciContext           *ciContext.CIContext
 	jsonSchemaValidator *jsonSchemaValidator.JSONSchemaValidator
+	yqlibEvaluator      yqlib.Evaluator
 }
 
 func New(c CLIClient, ciContext *ciContext.CIContext) *Evaluator {
@@ -33,9 +39,20 @@ func New(c CLIClient, ciContext *ciContext.CIContext) *Evaluator {
 		cliClient:           c,
 		ciContext:           ciContext,
 		jsonSchemaValidator: jsonSchemaValidator.New(),
+		yqlibEvaluator:      newYqEvaluator(),
 	}
 }
 
+func newYqEvaluator() yqlib.Evaluator {
+	yqEvaluator := yqlib.NewAllAtOnceEvaluator()
+	logger := yqlib.GetLogger()
+	backendLogger := logging.NewLogBackend(os.Stderr, "", 0)
+	backendLoggerLeveled := logging.AddModuleLevel(backendLogger)
+	backendLoggerLeveled.SetLevel(logging.ERROR, "")
+	logger.SetBackend(backendLoggerLeveled)
+	return yqEvaluator
+}
+
 type FileNameRuleMapper map[string]map[string]*Rule
 type FailedRulesByFiles map[string]map[string]*cliClient.FailedRule
 type EvaluationResultsSummery struct {
@@ -103,6 +120,7 @@ type PolicyCheckData struct {
 	IsInteractiveMode   bool
 	PolicyName          string
 	Policy              policy_factory.Policy
+	Verbose             bool
 }
 
 type PolicyCheckResultData struct {
@@ -147,15 +165,24 @@ func (e *Evaluator) Evaluate(policyCheckData PolicyCheckData) (PolicyCheckResult
 	formattedResults := FormattedResults{}
 	formattedResults.EvaluationResults = e.formatEvaluationResults(failedRulesByFiles, len(policyCheckData.FilesConfigurations), rulesCount)
 
-	formattedResults.NonInteractiveEvaluationResults = e.formatNonInteractiveEvaluationResults(formattedResults.EvaluationResults, failedRulesByFiles, policyCheckData.PolicyName, rulesCount)
+	nonInteractiveEvaluationData := nonInteractiveEvaluationData{
+		FormattedEvaluationResults: formattedResults.EvaluationResults,
+		EvaluationResults:          failedRulesByFiles,
+		PolicyName:                 policyCheckData.PolicyName,
+		TotalRulesInPolicy:         rulesCount,
+		Verbose:                    policyCheckData.Verbose,
+	}
+
+	formattedResults.NonInteractiveEvaluationResults = e.formatNonInteractiveEvaluationResults(nonInteractiveEvaluationData)
 
 	return PolicyCheckResultData{formattedResults, rulesData, filesData, failedRulesByFiles, rulesCount}, nil
 }
 
 func (e *Evaluator) evaluateConfiguration(failedRulesByFiles FailedRulesByFiles, policyCheckData PolicyCheckData, fileName string, configuration extractor.Configuration) error {
 	skipAnnotations := extractSkipAnnotations(configuration)
+
 	for _, rule := range policyCheckData.Policy.Rules {
-		failedRule, err := e.evaluateRule(rule, configuration.Payload, configuration.MetadataName, configuration.Kind, skipAnnotations)
+		failedRule, err := e.evaluateRule(rule, configuration.Payload, configuration.MetadataName, configuration.Kind, skipAnnotations, configuration.YamlNode)
 		if err != nil {
 			return err
 		}
@@ -163,14 +190,13 @@ func (e *Evaluator) evaluateConfiguration(failedRulesByFiles FailedRulesByFiles,
 		if failedRule == nil {
 			continue
 		}
-
 		addFailedRule(failedRulesByFiles, fileName, rule.RuleIdentifier, failedRule)
 	}
 
 	return nil
 }
 
-func (e *Evaluator) evaluateRule(rule policy_factory.RuleWithSchema, configurationJson []byte, configurationName string, configurationKind string, skipAnnotations map[string]string) (*cliClient.FailedRule, error) {
+func (e *Evaluator) evaluateRule(rule policy_factory.RuleWithSchema, configurationJson []byte, configurationName string, configurationKind string, skipAnnotations map[string]string, yamlNode yaml.Node) (*cliClient.FailedRule, error) {
 	ruleSchemaJson, err := json.Marshal(rule.Schema)
 	if err != nil {
 		return nil, err
@@ -190,11 +216,24 @@ func (e *Evaluator) evaluateRule(rule policy_factory.RuleWithSchema, configurati
 	}
 
 	configuration := cliClient.Configuration{
-		Name:        configurationName,
-		Kind:        configurationKind,
-		Occurrences: occurrences,
-		IsSkipped:   false,
-		SkipMessage: "",
+		Name:             configurationName,
+		Kind:             configurationKind,
+		Occurrences:      occurrences,
+		IsSkipped:        false,
+		SkipMessage:      "",
+		FailureLocations: []cliClient.FailureLocation{},
+	}
+
+	for _, detailedResult := range validationResult {
+		failedErrorLine, failedErrorColumn := e.getFailedRuleLineAndColumn(detailedResult.InstanceLocation, yamlNode)
+
+		failureLocation := cliClient.FailureLocation{
+			SchemaPath:        detailedResult.InstanceLocation,
+			FailedErrorLine:   failedErrorLine,
+			FailedErrorColumn: failedErrorColumn,
+		}
+
+		configuration.FailureLocations = append(configuration.FailureLocations, failureLocation)
 	}
 
 	if skipRuleExists {
@@ -212,14 +251,22 @@ func (e *Evaluator) evaluateRule(rule policy_factory.RuleWithSchema, configurati
 	return failedRule, nil
 }
 
+type nonInteractiveEvaluationData struct {
+	FormattedEvaluationResults *EvaluationResults
+	EvaluationResults          FailedRulesByFiles
+	PolicyName                 string
+	TotalRulesInPolicy         int
+	Verbose                    bool
+}
+
 // This method creates a NonInteractiveEvaluationResults structure
 // from EvaluationResults.
-func (e *Evaluator) formatNonInteractiveEvaluationResults(formattedEvaluationResults *EvaluationResults, evaluationResults FailedRulesByFiles, policyName string, totalRulesInPolicy int) *NonInteractiveEvaluationResults {
-	fileNameRuleMapper := formattedEvaluationResults.FileNameRuleMapper
+func (e *Evaluator) formatNonInteractiveEvaluationResults(nonInteractiveEvaluationData nonInteractiveEvaluationData) *NonInteractiveEvaluationResults {
+	fileNameRuleMapper := nonInteractiveEvaluationData.FormattedEvaluationResults.FileNameRuleMapper
 	ruleMapper := make(map[string]string)
 
-	for filePath := range evaluationResults {
-		for ruleIdentifier := range evaluationResults[filePath] {
+	for filePath := range nonInteractiveEvaluationData.EvaluationResults {
+		for ruleIdentifier := range nonInteractiveEvaluationData.EvaluationResults[filePath] {
 			ruleMapper[ruleIdentifier] = ruleIdentifier
 		}
 	}
@@ -232,6 +279,10 @@ func (e *Evaluator) formatNonInteractiveEvaluationResults(formattedEvaluationRes
 
 		for _, rule := range rules {
 			ruleResult := RuleResult{Identifier: ruleMapper[rule.Identifier], Name: rule.Name, MessageOnFailure: rule.MessageOnFailure, OccurrencesDetails: rule.OccurrencesDetails}
+			if nonInteractiveEvaluationData.Verbose {
+				ruleResult.DocumentationUrl = rule.DocumentationUrl
+			}
+
 			formattedEvaluationResults.RuleResults = append(
 				formattedEvaluationResults.RuleResults,
 				&ruleResult,
@@ -243,11 +294,11 @@ func (e *Evaluator) formatNonInteractiveEvaluationResults(formattedEvaluationRes
 		)
 	}
 	nonInteractiveEvaluationResults.PolicySummary = &PolicySummary{
-		PolicyName:         policyName,
-		TotalRulesInPolicy: totalRulesInPolicy,
-		TotalRulesFailed:   formattedEvaluationResults.Summary.TotalFailedRules,
-		TotalSkippedRules:  formattedEvaluationResults.Summary.TotalSkippedRules,
-		TotalPassedCount:   formattedEvaluationResults.Summary.TotalPassedRules,
+		PolicyName:         nonInteractiveEvaluationData.PolicyName,
+		TotalRulesInPolicy: nonInteractiveEvaluationData.TotalRulesInPolicy,
+		TotalRulesFailed:   nonInteractiveEvaluationData.FormattedEvaluationResults.Summary.TotalFailedRules,
+		TotalSkippedRules:  nonInteractiveEvaluationData.FormattedEvaluationResults.Summary.TotalSkippedRules,
+		TotalPassedCount:   nonInteractiveEvaluationData.FormattedEvaluationResults.Summary.TotalPassedRules,
 	}
 
 	return &nonInteractiveEvaluationResults
@@ -281,11 +332,12 @@ func (e *Evaluator) formatEvaluationResults(evaluationResults FailedRulesByFiles
 				mapper[filePath][ruleIdentifier].OccurrencesDetails = append(
 					mapper[filePath][ruleIdentifier].OccurrencesDetails,
 					OccurrenceDetails{
-						MetadataName: configuration.Name,
-						Kind:         configuration.Kind,
-						Occurrences:  configuration.Occurrences,
-						IsSkipped:    configuration.IsSkipped,
-						SkipMessage:  configuration.SkipMessage,
+						MetadataName:     configuration.Name,
+						Kind:             configuration.Kind,
+						Occurrences:      configuration.Occurrences,
+						IsSkipped:        configuration.IsSkipped,
+						SkipMessage:      configuration.SkipMessage,
+						FailureLocations: configuration.FailureLocations,
 					},
 				)
 			}
@@ -362,3 +414,18 @@ func extractSkipAnnotations(configuration extractor.Configuration) map[string]st
 
 	return skipAnnotations
 }
+
+func (e *Evaluator) getFailedRuleLineAndColumn(schemaPath string, yamlNode yaml.Node) (failedErrorLine int, failedErrorColumn int) {
+
+	instanceLocationYqPath := strings.Replace(schemaPath, "/", ".", -1)
+	instanceLocationYqPath = regexp.MustCompile(`\d+`).ReplaceAllString(instanceLocationYqPath, `[$0]`)
+
+	nodeList, err := e.yqlibEvaluator.EvaluateNodes(instanceLocationYqPath, &yamlNode)
+	if err != nil {
+		return
+	}
+
+	candidateNode := nodeList.Back().Value.(*yqlib.CandidateNode).Node
+
+	return candidateNode.Line, candidateNode.Column
+}
diff --git a/pkg/evaluation/junit_output.go b/pkg/evaluation/junit_output.go
index e7387f0..3876f2b 100644
--- a/pkg/evaluation/junit_output.go
+++ b/pkg/evaluation/junit_output.go
@@ -33,10 +33,11 @@ type property struct {
 }
 
 type testCase struct {
-	Name      string `xml:"name,attr"`
-	ClassName string `xml:"classname,attr"`
-	Skipped   *skipped
-	Failure   *failure
+	Name             string `xml:"name,attr"`
+	ClassName        string `xml:"classname,attr"`
+	Skipped          *skipped
+	Failure          *failure
+	DocumentationUrl *documentationUrl
 }
 
 type skipped struct {
@@ -44,6 +45,11 @@ type skipped struct {
 	Message string   `xml:"message,attr"`
 }
 
+type documentationUrl struct {
+	XMLName xml.Name `xml:"documentationUrl,omitempty"`
+	Message string   `xml:"message,attr"`
+}
+
 type failure struct {
 	XMLName xml.Name `xml:"failure,omitempty"`
 	Message string   `xml:"message,attr"`
@@ -55,7 +61,7 @@ type AdditionalJUnitData struct {
 	AllFilesThatRanPolicyCheck []string
 }
 
-func FormattedOutputToJUnitOutput(formattedOutput FormattedOutput, additionalJUnitData AdditionalJUnitData) JUnitOutput {
+func FormattedOutputToJUnitOutput(formattedOutput FormattedOutput, additionalJUnitData AdditionalJUnitData, verbose bool) JUnitOutput {
 	var jUnitOutput JUnitOutput
 
 	if formattedOutput.PolicySummary != nil {
@@ -84,7 +90,7 @@ func FormattedOutputToJUnitOutput(formattedOutput FormattedOutput, additionalJUn
 		policyValidationResult := findFileInPolicyValidationResults(fileThatRanPolicyCheck, formattedOutput.PolicyValidationResults)
 
 		if policyValidationResult != nil {
-			jUnitOutput.TestSuites = append(jUnitOutput.TestSuites, getPolicyValidationResultTestSuite(policyValidationResult, additionalJUnitData.AllEnabledRules))
+			jUnitOutput.TestSuites = append(jUnitOutput.TestSuites, getPolicyValidationResultTestSuite(policyValidationResult, additionalJUnitData.AllEnabledRules, verbose))
 		} else {
 			jUnitOutput.TestSuites = append(jUnitOutput.TestSuites, getPassingFileTestSuite(fileThatRanPolicyCheck, additionalJUnitData.AllEnabledRules))
 		}
@@ -113,7 +119,7 @@ func getPassingFileTestSuite(fileName string, allEnabledRules []cliClient.RuleDa
 	}
 }
 
-func getPolicyValidationResultTestSuite(policyValidationResult *FormattedEvaluationResults, allEnabledRules []cliClient.RuleData) testSuite {
+func getPolicyValidationResultTestSuite(policyValidationResult *FormattedEvaluationResults, allEnabledRules []cliClient.RuleData, verbose bool) testSuite {
 	suite := testSuite{
 		Name:      policyValidationResult.FileName,
 		TestCases: []testCase{},
@@ -124,6 +130,7 @@ func getPolicyValidationResultTestSuite(policyValidationResult *FormattedEvaluat
 			Name:      rule.Name,
 			ClassName: rule.Identifier,
 		}
+
 		ruleResult := findRuleResult(rule, policyValidationResult.RuleResults)
 
 		if ruleResult != nil {
@@ -131,6 +138,13 @@ func getPolicyValidationResultTestSuite(policyValidationResult *FormattedEvaluat
 				Message: ruleResult.MessageOnFailure,
 				Content: getContentFromOccurrencesDetails(ruleResult.OccurrencesDetails),
 			}
+
+			if verbose {
+				testCase.DocumentationUrl = &documentationUrl{
+					Message: ruleResult.DocumentationUrl,
+				}
+			}
+
 			if areAllOccurrencesSkipped(ruleResult.OccurrencesDetails) {
 				testCase.Skipped = &skipped{Message: "All failing configs skipped"}
 			}
diff --git a/pkg/evaluation/non_interactive_evaluator_types.go b/pkg/evaluation/non_interactive_evaluator_types.go
index 681f372..626dc85 100644
--- a/pkg/evaluation/non_interactive_evaluator_types.go
+++ b/pkg/evaluation/non_interactive_evaluator_types.go
@@ -10,6 +10,7 @@ type FormattedOutput struct {
 	EvaluationSummary       NonInteractiveEvaluationSummary `yaml:"evaluationSummary" json:"evaluationSummary" xml:"evaluationSummary"`
 	YamlValidationResults   []*extractor.InvalidFile        `yaml:"yamlValidationResults" json:"yamlValidationResults" xml:"yamlValidationResults"`
 	K8sValidationResults    []*extractor.InvalidFile        `yaml:"k8sValidationResults" json:"k8sValidationResults" xml:"k8sValidationResults"`
+	LoginUrl                string                          `yaml:"loginUrl" json:"loginUrl" xml:"loginUrl"`
 }
 
 type NonInteractiveEvaluationResults struct {
@@ -27,6 +28,7 @@ type RuleResult struct {
 	Name               string              `yaml:"name" json:"name" xml:"name"`
 	MessageOnFailure   string              `yaml:"messageOnFailure" json:"messageOnFailure" xml:"messageOnFailure"`
 	OccurrencesDetails []OccurrenceDetails `yaml:"occurrencesDetails" json:"occurrencesDetails" xml:"occurrencesDetails"`
+	DocumentationUrl   string              `yaml:"documentationUrl,omitempty" json:"documentationUrl,omitempty" xml:"documentationUrl,omitempty"`
 }
 
 type NonInteractiveEvaluationSummary struct {
diff --git a/pkg/evaluation/printer.go b/pkg/evaluation/printer.go
index 1f070a7..eacb321 100644
--- a/pkg/evaluation/printer.go
+++ b/pkg/evaluation/printer.go
@@ -115,8 +115,8 @@ func getFormattedOutput(resultsData *PrintResultsData) FormattedOutput {
 		},
 		YamlValidationResults: resultsData.InvalidYamlFiles,
 		K8sValidationResults:  resultsData.InvalidK8sFiles,
+		LoginUrl:              resultsData.LoginURL,
 	}
-
 	return formattedOutput
 }
 
@@ -132,7 +132,7 @@ func GetResultsText(resultsData *PrintResultsData) (string, error) {
 		case "xml":
 			return getXmlOutput(&formattedOutput)
 		case "JUnit":
-			return getJUnitOutput(&formattedOutput, resultsData.AdditionalJUnitData)
+			return getJUnitOutput(&formattedOutput, resultsData.AdditionalJUnitData, resultsData.Verbose)
 		default:
 			panic(errors.New("invalid output format"))
 		}
@@ -180,8 +180,8 @@ func getXmlOutput(formattedOutput *FormattedOutput) (string, error) {
 	return convertStructToXml(formattedOutput)
 }
 
-func getJUnitOutput(formattedOutput *FormattedOutput, additionalJUnitData AdditionalJUnitData) (string, error) {
-	return convertStructToXml(FormattedOutputToJUnitOutput(*formattedOutput, additionalJUnitData))
+func getJUnitOutput(formattedOutput *FormattedOutput, additionalJUnitData AdditionalJUnitData, verbose bool) (string, error) {
+	return convertStructToXml(FormattedOutputToJUnitOutput(*formattedOutput, additionalJUnitData, verbose))
 }
 
 func convertStructToXml(output interface{}) (string, error) {
@@ -312,8 +312,9 @@ func parseToPrinterWarnings(results *EvaluationResults, invalidYamlFiles []*extr
 						failedRule.OccurrencesDetails = append(
 							failedRule.OccurrencesDetails,
 							printer.OccurrenceDetails{
-								MetadataName: occurrenceDetails.MetadataName,
-								Kind:         occurrenceDetails.Kind,
+								MetadataName:     occurrenceDetails.MetadataName,
+								Kind:             occurrenceDetails.Kind,
+								FailureLocations: occurrenceDetails.FailureLocations,
 							},
 						)
 					}
diff --git a/pkg/evaluation/rule.go b/pkg/evaluation/rule.go
index c450e29..8339f0c 100644
--- a/pkg/evaluation/rule.go
+++ b/pkg/evaluation/rule.go
@@ -1,5 +1,7 @@
 package evaluation
 
+import "github.com/datreeio/datree/pkg/cliClient"
+
 type Rule struct {
 	Identifier         string
 	Name               string
@@ -19,9 +21,10 @@ func (rp *Rule) GetFailedOccurrencesCount() int {
 }
 
 type OccurrenceDetails struct {
-	MetadataName string `yaml:"metadataName" json:"metadataName" xml:"metadataName"`
-	Kind         string `yaml:"kind" json:"kind" xml:"kind"`
-	SkipMessage  string `yaml:"skipMessage" json:"skipMessage" xml:"skipMessage"`
-	Occurrences  int    `yaml:"occurrences" json:"occurrences" xml:"occurrences"`
-	IsSkipped    bool   `yaml:"isSkipped" json:"isSkipped" xml:"isSkipped"`
+	MetadataName     string                      `yaml:"metadataName" json:"metadataName" xml:"metadataName"`
+	Kind             string                      `yaml:"kind" json:"kind" xml:"kind"`
+	SkipMessage      string                      `yaml:"skipMessage" json:"skipMessage" xml:"skipMessage"`
+	Occurrences      int                         `yaml:"occurrences" json:"occurrences" xml:"occurrences"`
+	IsSkipped        bool                        `yaml:"isSkipped" json:"isSkipped" xml:"isSkipped"`
+	FailureLocations []cliClient.FailureLocation `yaml:"failureLocations" json:"failureLocations" xml:"failureLocations"`
 }
diff --git a/pkg/extractor/extractor.go b/pkg/extractor/extractor.go
index 5f4f6e5..e272c8c 100644
--- a/pkg/extractor/extractor.go
+++ b/pkg/extractor/extractor.go
@@ -9,7 +9,7 @@ import (
 	"path/filepath"
 
 	"gopkg.in/yaml.v3"
-	yamlConvertor "sigs.k8s.io/yaml"
+	k8sSigsYaml "sigs.k8s.io/yaml"
 )
 
 type InvalidFile struct {
@@ -68,6 +68,7 @@ type Configuration struct {
 	ApiVersion   string
 	Annotations  map[string]interface{}
 	Payload      []byte
+	YamlNode     yaml.Node
 }
 
 type FileConfigurations struct {
@@ -91,8 +92,8 @@ func extractYamlConfigurations(content string) (*[]Configuration, error) {
 
 	var err error
 	for {
-		var anyTypeStore interface{}
-		err = yamlDecoder.Decode(&anyTypeStore)
+		var yamlNode yaml.Node
+		err = yamlDecoder.Decode(&yamlNode)
 		if err != nil {
 			if err == io.EOF {
 				break
@@ -100,24 +101,27 @@ func extractYamlConfigurations(content string) (*[]Configuration, error) {
 				return nil, err
 			}
 		}
+		var yamlByteArray bytes.Buffer
 
-		yamlByteArray, err := yamlConvertor.Marshal(anyTypeStore)
+		enc := yaml.NewEncoder(&yamlByteArray)
+		enc.SetIndent(2)
+		err = enc.Encode(&yamlNode)
 		if err != nil {
 			return nil, err
 		}
 
-		jsonByte, err := yamlConvertor.YAMLToJSON(yamlByteArray)
+		jsonByte, err := k8sSigsYaml.YAMLToJSON(yamlByteArray.Bytes())
 		if err != nil {
 			return nil, err
 		}
 
-		configurations = append(configurations, extractConfigurationK8sData(jsonByte))
+		configurations = append(configurations, extractConfigurationK8sData(jsonByte, yamlNode))
 	}
 
 	return &configurations, nil
 }
 
-func extractConfigurationK8sData(content []byte) Configuration {
+func extractConfigurationK8sData(content []byte, yamlNode yaml.Node) Configuration {
 	var configuration Configuration
 	var jsonObject map[string]interface{}
 	configuration.Payload = content
@@ -144,7 +148,7 @@ func extractConfigurationK8sData(content []byte) Configuration {
 	if kind := jsonObject["kind"]; kind != nil {
 		configuration.Kind = kind.(string)
 	}
-
+	configuration.YamlNode = yamlNode
 	return configuration
 }
 
diff --git a/pkg/policy/policy.go b/pkg/policy/policy.go
index 3f4397e..c545451 100644
--- a/pkg/policy/policy.go
+++ b/pkg/policy/policy.go
@@ -1,14 +1,14 @@
 package policy
 
 import (
+	"github.com/datreeio/datree/pkg/defaultPolicies"
 	"github.com/datreeio/datree/pkg/validatePoliciesYaml"
 
-	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/datreeio/datree/pkg/fileReader"
 	"github.com/ghodss/yaml"
 )
 
-func GetPoliciesFileFromPath(path string) (*cliClient.EvaluationPrerunPolicies, error) {
+func GetPoliciesFileFromPath(path string) (*defaultPolicies.EvaluationPrerunPolicies, error) {
 	fileReader := fileReader.CreateFileReader(nil)
 	policiesStr, err := fileReader.ReadFileContent(path)
 	if err != nil {
@@ -22,7 +22,7 @@ func GetPoliciesFileFromPath(path string) (*cliClient.EvaluationPrerunPolicies,
 		return nil, err
 	}
 
-	var policies *cliClient.EvaluationPrerunPolicies
+	var policies *defaultPolicies.EvaluationPrerunPolicies
 	policiesBytes, err := yaml.YAMLToJSON(policiesStrBytes)
 	if err != nil {
 		return nil, err
diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go
index 1770b60..dadb965 100644
--- a/pkg/printer/printer.go
+++ b/pkg/printer/printer.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/santhosh-tekuri/jsonschema/v5"
 
 	"github.com/xeipuuv/gojsonschema"
@@ -34,9 +35,10 @@ type FailedRule struct {
 }
 
 type OccurrenceDetails struct {
-	MetadataName string
-	Kind         string
-	SkipMessage  string
+	MetadataName     string
+	Kind             string
+	SkipMessage      string
+	FailureLocations []cliClient.FailureLocation
 }
 
 type InvalidYamlInfo struct {
@@ -207,6 +209,14 @@ func (p *Printer) GetWarningsText(warnings []Warning) string {
 
 				for _, occurrenceDetails := range failedRule.OccurrencesDetails {
 					sb.WriteString(fmt.Sprintf("    - metadata.name: %v (kind: %v)\n", p.getStringOrNotAvailableText(occurrenceDetails.MetadataName), p.getStringOrNotAvailableText(occurrenceDetails.Kind)))
+					for _, validationResult := range occurrenceDetails.FailureLocations {
+						if validationResult.SchemaPath != "" {
+							failurePath := fmt.Sprintf("%v (line: %d:%d)\n", strings.Replace(validationResult.SchemaPath, "/", ".", -1)[1:], validationResult.FailedErrorLine, validationResult.FailedErrorColumn)
+							sb.WriteString(fmt.Sprintf("      > key: %v", failurePath))
+						}
+					}
+					sb.WriteString("\n")
+
 				}
 				sb.WriteString(fmt.Sprintf("%v %v\n", p.Theme.Emoji.Suggestion, failedRule.Suggestion))
 
diff --git a/pkg/validatePoliciesYaml/validatePoliciesYaml.go b/pkg/validatePoliciesYaml/validatePoliciesYaml.go
index 25b734f..62abd5f 100644
--- a/pkg/validatePoliciesYaml/validatePoliciesYaml.go
+++ b/pkg/validatePoliciesYaml/validatePoliciesYaml.go
@@ -4,8 +4,8 @@ import (
 	_ "embed"
 	"encoding/json"
 	"fmt"
+	"github.com/datreeio/datree/pkg/defaultPolicies"
 
-	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/datreeio/datree/pkg/defaultRules"
 	"github.com/datreeio/datree/pkg/jsonSchemaValidator"
 	"github.com/ghodss/yaml"
@@ -44,7 +44,7 @@ func ValidatePoliciesYaml(content []byte, policyYamlPath string) error {
 
 func validatePoliciesContent(content []byte) error {
 	// unmarshal the content
-	var schema *cliClient.EvaluationPrerunPolicies
+	var schema *defaultPolicies.EvaluationPrerunPolicies
 	err := json.Unmarshal(content, &schema)
 	if err != nil {
 		return err
@@ -67,7 +67,7 @@ func validatePoliciesContent(content []byte) error {
 	return err
 }
 
-func validateIdentifier(policies []*cliClient.Policy, customRules []*cliClient.CustomRule) error {
+func validateIdentifier(policies []*defaultPolicies.Policy, customRules []*defaultPolicies.CustomRule) error {
 
 	err := checkIdentifierInPolicy(policies, customRules)
 	if err != nil {
@@ -78,7 +78,7 @@ func validateIdentifier(policies []*cliClient.Policy, customRules []*cliClient.C
 	return err
 }
 
-func checkIdentifierInPolicy(policies []*cliClient.Policy, customRules []*cliClient.CustomRule) error {
+func checkIdentifierInPolicy(policies []*defaultPolicies.Policy, customRules []*defaultPolicies.CustomRule) error {
 	err := checkIdentifierUniquenessInPolicy(policies)
 	if err != nil {
 		return err
@@ -91,7 +91,7 @@ func checkIdentifierInPolicy(policies []*cliClient.Policy, customRules []*cliCli
 	return nil
 }
 
-func checkIdentifierExistence(policies []*cliClient.Policy, customRules []*cliClient.CustomRule) error {
+func checkIdentifierExistence(policies []*defaultPolicies.Policy, customRules []*defaultPolicies.CustomRule) error {
 	defaultRules, err := defaultRules.GetDefaultRules()
 	if err != nil {
 		return err
@@ -127,7 +127,7 @@ func checkIdentifierExistence(policies []*cliClient.Policy, customRules []*cliCl
 	return nil
 }
 
-func checkIdentifierUniquenessInPolicy(policies []*cliClient.Policy) error {
+func checkIdentifierUniquenessInPolicy(policies []*defaultPolicies.Policy) error {
 	for index, policy := range policies {
 		propertyValuesExistenceMap := make(map[string]bool)
 		rules := policy.Rules
@@ -142,7 +142,7 @@ func checkIdentifierUniquenessInPolicy(policies []*cliClient.Policy) error {
 	return nil
 }
 
-func checkCustomRulesIdentifiersUniqueness(customRules []*cliClient.CustomRule) error {
+func checkCustomRulesIdentifiersUniqueness(customRules []*defaultPolicies.CustomRule) error {
 	defaultRules, err := defaultRules.GetDefaultRules()
 	if err != nil {
 		return err
@@ -169,7 +169,7 @@ func checkCustomRulesIdentifiersUniqueness(customRules []*cliClient.CustomRule)
 	return nil
 }
 
-func validateSingleDefaultPolicy(policies []*cliClient.Policy) error {
+func validateSingleDefaultPolicy(policies []*defaultPolicies.Policy) error {
 	sawDefault := false
 	for _, policy := range policies {
 
@@ -187,7 +187,7 @@ func validateSingleDefaultPolicy(policies []*cliClient.Policy) error {
 	return nil
 }
 
-func validateSchemaField(customRules []*cliClient.CustomRule) error {
+func validateSchemaField(customRules []*defaultPolicies.CustomRule) error {
 	for index, rule := range customRules {
 		var err error
 		var jsonContent string
diff --git a/scripts/define_release_version.sh b/scripts/define_release_version.sh
index e98bdf3..1cae7c4 100644
--- a/scripts/define_release_version.sh
+++ b/scripts/define_release_version.sh
@@ -2,6 +2,7 @@
 set -e
 
 if test -z "$1"; then
+    git fetch --prune --unshallow --tags # needed for getting list of tags
     latestRcTag=$(git tag --sort=-version:refname | grep "\-rc$" | head -n 1)
 else
     latestRcTag="$1"
diff --git a/scripts/deploy_release_candidate.sh b/scripts/deploy_release_candidate.sh
index ac2d00d..014f2a6 100644
--- a/scripts/deploy_release_candidate.sh
+++ b/scripts/deploy_release_candidate.sh
@@ -4,6 +4,7 @@ set -ex
 MAJOR_VERSION=1
 MINOR_VERSION=6
 
+git fetch --prune --unshallow --tags # needed for getting list of tags
 latestRcTag=$(git tag --sort=-version:refname | grep -E "^${MAJOR_VERSION}\.${MINOR_VERSION}.[0-9]+-rc" | head -n 1 | grep --only-matching "^${MAJOR_VERSION}\.${MINOR_VERSION}.[0-9]\+" || true)
 
 if [ "$latestRcTag" == "" ]; then
@@ -17,8 +18,8 @@ echo $DATREE_BUILD_VERSION
 
 v_release_tag=v$DATREE_BUILD_VERSION
 
-git tag $DATREE_BUILD_VERSION -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER"
-git tag $v_release_tag -a -m "Generated tag with v from TravisCI for build $TRAVIS_BUILD_NUMBER"
+git tag $DATREE_BUILD_VERSION -a -m "Generated tag from GH action for build $GITHUB_ACTION_RUN_ID"
+git tag $v_release_tag -a -m "Generated tag with v from GH action for build $GITHUB_ACTION_RUN_ID"
 git push --tags
 
 curl -sL https://git.io/goreleaser | GORELEASER_CURRENT_TAG=$DATREE_BUILD_VERSION GO_BUILD_TAG=staging VERSION=v$GORELEASER_VERSION bash
diff --git a/scripts/release.sh b/scripts/release.sh
index d2917d5..d94b07b 100644
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -4,11 +4,11 @@ set -ex
 release_tag=$RELEASE_VERSION
 v_release_tag=v$release_tag
 
+git fetch
 git checkout "$release_tag-rc"
 
-
-git tag $release_tag -a -m "Generated tag from manual TravisCI for production build $TRAVIS_BUILD_NUMBER"
-git tag $v_release_tag -a -m "Generated tag with v from manual TravisCI for production build $TRAVIS_BUILD_NUMBER"
+git tag $release_tag -a -m "Generated tag from manual GH action production build $GITHUB_ACTION_RUN_ID"
+git tag $v_release_tag -a -m "Generated tag with v from manual GH action for production build $GITHUB_ACTION_RUN_ID"
 
 git push origin $release_tag
 git push origin $v_release_tag
@@ -22,7 +22,5 @@ curl -sL https://git.io/goreleaser | GORELEASER_CURRENT_TAG=$DATREE_BUILD_VERSIO
 
 bash ./scripts/upload_install_scripts.sh
 
-bash ./scripts/brew_push_formula.sh production $DATREE_BUILD_VERSION
-
 git checkout -b "release/${release_tag}"
 git push origin "release/${release_tag}"


Test patch:
diff --git a/bl/policy/policy_factory_test.go b/bl/policy/policy_factory_test.go
index ccea3f5..350ac9f 100644
--- a/bl/policy/policy_factory_test.go
+++ b/bl/policy/policy_factory_test.go
@@ -6,6 +6,8 @@ import (
 	"os"
 	"testing"
 
+	"github.com/datreeio/datree/pkg/defaultPolicies"
+
 	"github.com/datreeio/datree/pkg/defaultRules"
 	"github.com/datreeio/datree/pkg/fileReader"
 
@@ -30,7 +32,7 @@ func TestCreatePolicy(t *testing.T) {
 			panic(err)
 		}
 
-		policy, _ := CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules)
+		policy, _ := CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules, preRunData.IsAnonymous)
 		var expectedRules []RuleWithSchema
 
 		for _, defaultRule := range defaultRules.Rules {
@@ -62,7 +64,7 @@ func TestCreatePolicy(t *testing.T) {
 			panic(err)
 		}
 
-		policy, err := CreatePolicy(preRunData.PoliciesJson, "labels_best_practices2", preRunData.RegistrationURL, defaultRules)
+		policy, err := CreatePolicy(preRunData.PoliciesJson, "labels_best_practices2", preRunData.RegistrationURL, defaultRules, preRunData.IsAnonymous)
 		var expectedRules []RuleWithSchema
 
 		if err != nil {
@@ -89,7 +91,7 @@ func TestCreatePolicy(t *testing.T) {
 			panic(err)
 		}
 
-		policy, err := CreatePolicy(preRunData.PoliciesJson, "labels_best_practices3", preRunData.RegistrationURL, defaultRules)
+		policy, err := CreatePolicy(preRunData.PoliciesJson, "labels_best_practices3", preRunData.RegistrationURL, defaultRules, preRunData.IsAnonymous)
 		var expectedRules []RuleWithSchema
 		if err != nil {
 			panic(err)
@@ -108,21 +110,23 @@ func TestCreatePolicy(t *testing.T) {
 	})
 	t.Run("Test Create Policy for anonymous user with --policy flag Default", func(t *testing.T) {
 		defaultRules, err := defaultRules.GetDefaultRules()
+		defaultPolicies := defaultPolicies.GetDefaultPoliciesStruct()
 		if err != nil {
 			panic(err)
 		}
 
-		_, err = CreatePolicy(nil, "Default", preRunData.RegistrationURL, defaultRules)
+		_, err = CreatePolicy(defaultPolicies, "Default", preRunData.RegistrationURL, defaultRules, true)
 
 		assert.Equal(t, nil, err)
 	})
 	t.Run("Test Create Policy for anonymous user with --policy flag not default", func(t *testing.T) {
 		defaultRules, err := defaultRules.GetDefaultRules()
+		defaultPolicies := defaultPolicies.GetDefaultPoliciesStruct()
 		if err != nil {
 			panic(err)
 		}
 
-		policy, err := CreatePolicy(nil, "my-policy", preRunData.RegistrationURL, defaultRules)
+		policy, err := CreatePolicy(defaultPolicies, "my-policy", preRunData.RegistrationURL, defaultRules, true)
 
 		assert.Equal(t, fmt.Errorf("policy my-policy doesn't exist, sign in to the dashboard to customize your policies: %s", preRunData.RegistrationURL), err)
 		assert.Equal(t, Policy{}, policy)
diff --git a/bl/validation/k8sValidator_test.go b/bl/validation/k8sValidator_test.go
index 60cd907..4276848 100644
--- a/bl/validation/k8sValidator_test.go
+++ b/bl/validation/k8sValidator_test.go
@@ -3,6 +3,7 @@ package validation
 import (
 	"fmt"
 	"io"
+	"os"
 	"sync"
 	"testing"
 
@@ -51,7 +52,7 @@ func test_valid_multiple_configurations(t *testing.T) {
 		Configurations: []extractor.Configuration{},
 	}
 	close(filesConfigurationsChan)
-	validConfigurationsChan, _, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1)
+	validConfigurationsChan, _, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1, false)
 
 	for p := range validConfigurationsChan {
 		assert.Equal(t, path, p.FileName)
@@ -99,7 +100,7 @@ func test_invalid_file(t *testing.T) {
 		Configurations: []extractor.Configuration{},
 	}
 	close(filesConfigurationsChan)
-	_, invalidFilesChan, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1)
+	_, invalidFilesChan, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1, false)
 
 	for p := range invalidFilesChan {
 		assert.Equal(t, path, p.Path)
@@ -123,7 +124,7 @@ func test_empty_file(t *testing.T) {
 		Configurations: []extractor.Configuration{},
 	}
 	close(filesConfigurationsChan)
-	_, invalidFilesChan, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1)
+	_, invalidFilesChan, _ := k8sValidator.ValidateResources(filesConfigurationsChan, 1, false)
 
 	for p := range invalidFilesChan {
 		assert.Equal(t, path, p.Path)
@@ -150,7 +151,7 @@ func test_offline_with_remote_custom_schema_location(t *testing.T) {
 	}
 	close(filesConfigurationsChan)
 
-	_, invalidFilesChan, filesWithWarningsChan := k8sValidator.ValidateResources(filesConfigurationsChan, 1)
+	_, invalidFilesChan, filesWithWarningsChan := k8sValidator.ValidateResources(filesConfigurationsChan, 1, false)
 	for p := range invalidFilesChan {
 		assert.Equal(t, 1, len(p.ValidationErrors))
 		assert.Equal(t, "k8s schema validation error: no such host\n", p.ValidationErrors[0].Error())
@@ -180,7 +181,7 @@ func test_missing_schema_skipped(t *testing.T) {
 	k8sValidationWarningPerValidFile := make(K8sValidationWarningPerValidFile)
 
 	var wg sync.WaitGroup
-	filesConfigurationsChanRes, invalidFilesChan, filesWithWarningsChan := k8sValidator.ValidateResources(filesConfigurationsChan, 1)
+	filesConfigurationsChanRes, invalidFilesChan, filesWithWarningsChan := k8sValidator.ValidateResources(filesConfigurationsChan, 1, false)
 	wg.Add(1)
 	go func() {
 		for p := range filesConfigurationsChanRes {
@@ -201,11 +202,13 @@ func test_missing_schema_skipped(t *testing.T) {
 }
 
 func test_get_all_schema_locations_online(t *testing.T) {
+	homeDir, _ := os.UserHomeDir()
 	expectedOutput := []string{
 		"/my-local-schema-location",
 		"default",
 		"https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/{{ .NormalizedKubernetesVersion }}/{{ .ResourceKind }}{{ .KindSuffix }}.json",
 		"https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{ .Group }}/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json",
+		homeDir + "/.datree/crdSchemas/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json",
 	}
 	actual := getAllSchemaLocations([]string{"/my-local-schema-location"}, false)
 	assert.Equal(t, expectedOutput, actual)
diff --git a/cmd/kustomize/main_test.go b/cmd/kustomize/main_test.go
index a54f0cc..3105557 100644
--- a/cmd/kustomize/main_test.go
+++ b/cmd/kustomize/main_test.go
@@ -122,7 +122,7 @@ type k8sValidatorMock struct {
 	mock.Mock
 }
 
-func (kv *k8sValidatorMock) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning) {
+func (kv *k8sValidatorMock) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int, skipSchemaValidation bool) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning) {
 	args := kv.Called(filesConfigurationsChan, concurrency)
 	return args.Get(0).(chan *extractor.FileConfigurations), args.Get(1).(chan *extractor.InvalidFile), args.Get(2).(chan *validation.FileWithWarning)
 }
diff --git a/cmd/test/main.go b/cmd/test/main.go
index 38f6417..e45cfd9 100644
--- a/cmd/test/main.go
+++ b/cmd/test/main.go
@@ -12,17 +12,18 @@ import (
 	"sync"
 	"time"
 
-	"github.com/datreeio/datree/pkg/defaultRules"
-
 	"github.com/datreeio/datree/bl/files"
 	"github.com/datreeio/datree/bl/messager"
 	policy_factory "github.com/datreeio/datree/bl/policy"
 	"github.com/datreeio/datree/bl/validation"
 	"github.com/datreeio/datree/pkg/ciContext"
 	"github.com/datreeio/datree/pkg/cliClient"
+	"github.com/datreeio/datree/pkg/defaultPolicies"
+	"github.com/datreeio/datree/pkg/defaultRules"
 	"github.com/datreeio/datree/pkg/evaluation"
 	"github.com/datreeio/datree/pkg/policy"
 	"github.com/pkg/errors"
+	"k8s.io/utils/strings/slices"
 
 	"github.com/datreeio/datree/pkg/extractor"
 	"github.com/datreeio/datree/pkg/localConfig"
@@ -43,7 +44,7 @@ type Messager interface {
 }
 
 type K8sValidator interface {
-	ValidateResources(filesConfigurations chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning)
+	ValidateResources(filesConfigurations chan *extractor.FileConfigurations, concurrency int, skipSchemaValidation bool) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning)
 	InitClient(k8sVersion string, ignoreMissingSchemas bool, schemaLocations []string)
 	GetK8sFiles(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.FileConfigurations)
 }
@@ -58,6 +59,7 @@ type TestCommandFlags struct {
 	SchemaLocations      []string
 	PolicyConfig         string
 	NoRecord             bool
+	SkipValidation       string
 }
 
 // TestCommandFlags constructor
@@ -70,7 +72,19 @@ func NewTestCommandFlags() *TestCommandFlags {
 		Verbose:              false,
 		PolicyName:           "",
 		SchemaLocations:      make([]string, 0),
+		SkipValidation:       "",
+	}
+}
+
+func validateSkipValidationFlag(flags *TestCommandFlags) error {
+	supportedSkipValidation := []string{"schema"}
+
+	if flags.SkipValidation != "" && !slices.Contains(supportedSkipValidation, flags.SkipValidation) {
+		return fmt.Errorf("invalid --skip-validation option - %q\n"+
+			"Valid values are: %v", flags.SkipValidation, supportedSkipValidation)
 	}
+
+	return nil
 }
 
 func (flags *TestCommandFlags) Validate() error {
@@ -87,6 +101,11 @@ func (flags *TestCommandFlags) Validate() error {
 		return err
 	}
 
+	err = validateSkipValidationFlag(flags)
+	if err != nil {
+		return err
+	}
+
 	return nil
 
 }
@@ -128,6 +147,7 @@ type TestCommandData struct {
 	RegistrationURL       string
 	PromptRegistrationURL string
 	ClientId              string
+	SkipSchemaValidation  bool
 }
 
 type TestCommandContext struct {
@@ -236,6 +256,8 @@ func (flags *TestCommandFlags) AddFlags(cmd *cobra.Command) {
 	cmd.Flags().BoolVar(&flags.Verbose, "verbose", false, "Display 'How to Fix' link")
 	cmd.Flags().BoolVar(&flags.NoRecord, "no-record", false, "Don’t send policy checks metadata to the backend")
 
+	cmd.Flags().StringVar(&flags.SkipValidation, "skip-validation", "", "Skip validation step. Possible values: 'schema'")
+
 	// kubeconform flag
 	cmd.Flags().StringArrayVarP(&flags.SchemaLocations, "schema-location", "", []string{}, "Override schemas location search path (can be specified multiple times)")
 	cmd.Flags().BoolVarP(&flags.IgnoreMissingSchemas, "ignore-missing-schemas", "", false, "Ignore missing schemas when executing schema validation step")
@@ -254,7 +276,7 @@ func GenerateTestCommandData(testCommandFlags *TestCommandFlags, localConfigCont
 		k8sVersion = "1.20.0"
 	}
 
-	var policies *cliClient.EvaluationPrerunPolicies
+	var policies *defaultPolicies.EvaluationPrerunPolicies
 	var err error
 
 	if testCommandFlags.PolicyConfig != "" {
@@ -275,7 +297,7 @@ func GenerateTestCommandData(testCommandFlags *TestCommandFlags, localConfigCont
 		return nil, err
 	}
 
-	policy, err := policy_factory.CreatePolicy(policies, testCommandFlags.PolicyName, evaluationPrerunDataResp.RegistrationURL, defaultRules)
+	policy, err := policy_factory.CreatePolicy(policies, testCommandFlags.PolicyName, evaluationPrerunDataResp.RegistrationURL, defaultRules, evaluationPrerunDataResp.IsAnonymous)
 	if err != nil {
 		return nil, err
 	}
@@ -292,6 +314,7 @@ func GenerateTestCommandData(testCommandFlags *TestCommandFlags, localConfigCont
 		ClientId:              localConfigContent.ClientId,
 		RegistrationURL:       evaluationPrerunDataResp.RegistrationURL,
 		PromptRegistrationURL: evaluationPrerunDataResp.PromptRegistrationURL,
+		SkipSchemaValidation:  testCommandFlags.SkipValidation == "schema",
 	}
 
 	return testCommandOptions, nil
@@ -472,8 +495,13 @@ func evaluate(ctx *TestCommandContext, filesPaths []string, testCommandData *Tes
 		go validationManager.AggregateIgnoredYamlFiles(ignoredYamlFilesChan, &wg)
 	}
 
-	validK8sFilesConfigurationsChan, invalidK8sFilesChan, filesWithWarningsChan := ctx.K8sValidator.ValidateResources(validYamlConfigurationsChan, concurrency)
+	var validK8sFilesConfigurationsChan chan *extractor.FileConfigurations
+	var invalidK8sFilesChan chan *extractor.InvalidFile
+	var filesWithWarningsChan chan *validation.FileWithWarning
 
+	validK8sFilesConfigurationsChan, invalidK8sFilesChan, filesWithWarningsChan = ctx.K8sValidator.ValidateResources(
+		validYamlConfigurationsChan, concurrency, testCommandData.SkipSchemaValidation,
+	)
 	wg.Add(3)
 	go validationManager.AggregateValidK8sFiles(validK8sFilesConfigurationsChan, &wg)
 	go validationManager.AggregateInvalidK8sFiles(invalidK8sFilesChan, &wg)
@@ -484,10 +512,11 @@ func evaluate(ctx *TestCommandContext, filesPaths []string, testCommandData *Tes
 	policyName := testCommandData.Policy.Name
 
 	policyCheckData := evaluation.PolicyCheckData{
-		FilesConfigurations: validationManager.ValidK8sFilesConfigurations(),
+		FilesConfigurations: validationManager.ValidOrSkippedK8sFilesConfigurations(),
 		IsInteractiveMode:   isInteractiveMode,
 		PolicyName:          policyName,
 		Policy:              testCommandData.Policy,
+		Verbose:             testCommandData.Verbose,
 	}
 
 	emptyEvaluationResultData := EvaluationResultData{
diff --git a/cmd/test/main_test.go b/cmd/test/main_test.go
index f62c4f3..1f41eb8 100644
--- a/cmd/test/main_test.go
+++ b/cmd/test/main_test.go
@@ -127,7 +127,7 @@ type K8sValidatorMock struct {
 	mock.Mock
 }
 
-func (kv *K8sValidatorMock) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning) {
+func (kv *K8sValidatorMock) ValidateResources(filesConfigurationsChan chan *extractor.FileConfigurations, concurrency int, skipSchemaValidation bool) (chan *extractor.FileConfigurations, chan *extractor.InvalidFile, chan *validation.FileWithWarning) {
 	args := kv.Called(filesConfigurationsChan, concurrency)
 	return args.Get(0).(chan *extractor.FileConfigurations), args.Get(1).(chan *extractor.InvalidFile), args.Get(2).(chan *validation.FileWithWarning)
 }
@@ -358,7 +358,7 @@ func test_all_k8s_resources_tested() *TestFlowTestCase {
 		panic(err)
 	}
 
-	policy, _ := policy_factory.CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules)
+	policy, _ := policy_factory.CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules, preRunData.IsAnonymous)
 	close(invalidFilesChan)
 
 	return &TestFlowTestCase{
@@ -495,7 +495,7 @@ func test_no_k8s_resources_found() *TestFlowTestCase {
 		panic(err)
 	}
 
-	policy, _ := policy_factory.CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules)
+	policy, _ := policy_factory.CreatePolicy(preRunData.PoliciesJson, "", preRunData.RegistrationURL, defaultRules, preRunData.IsAnonymous)
 	paths := []string{root + "/docker-compose-config.yaml", root + "/simple.json", root + "/simple.yaml"}
 	filesConfigurationsChan := make(chan *extractor.FileConfigurations, 3)
 	go func() {
@@ -687,7 +687,7 @@ func setup() {
 	ignoredFilesChan := newIgnoredYamlFilesChan()
 	k8sValidationWarningsChan := newK8sValidationWarningsChan()
 
-	k8sValidatorMock.On("ValidateResources", mock.Anything, mock.Anything).Return(filesConfigurationsChan, invalidK8sFilesChan, k8sValidationWarningsChan, newErrorsChan())
+	k8sValidatorMock.On("ValidateResources", mock.Anything, mock.Anything, mock.Anything).Return(filesConfigurationsChan, invalidK8sFilesChan, k8sValidationWarningsChan, newErrorsChan())
 	k8sValidatorMock.On("GetK8sFiles", mock.Anything, mock.Anything).Return(filesConfigurationsChan, ignoredFilesChan, newErrorsChan())
 	k8sValidatorMock.On("InitClient", mock.Anything, mock.Anything, mock.Anything).Return()
 
@@ -733,7 +733,7 @@ func setup() {
 		panic(err)
 	}
 
-	testingPolicy, _ = policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules)
+	testingPolicy, _ = policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules, prerunData.IsAnonymous)
 }
 
 func TestTestCommandFlagsValidation(t *testing.T) {
@@ -853,7 +853,7 @@ func TestTestCommandNoInternetConnection(t *testing.T) {
 		WarningKind: validation.NetworkError,
 	}}
 
-	k8sValidatorMock.On("ValidateResources", mock.Anything, mock.Anything).Return(filesConfigurationsChan, invalidK8sFilesChan, K8sValidationWarnings, newErrorsChan())
+	k8sValidatorMock.On("ValidateResources", mock.Anything, mock.Anything, mock.Anything).Return(filesConfigurationsChan, invalidK8sFilesChan, K8sValidationWarnings, newErrorsChan())
 
 	k8sValidatorMock.AssertCalled(t, "ValidateResources", mock.Anything, 100)
 	mockedEvaluator.AssertCalled(t, "Evaluate", policyCheckData)
diff --git a/cmd/test/validationManager.go b/cmd/test/validationManager.go
index cace472..4f95815 100644
--- a/cmd/test/validationManager.go
+++ b/cmd/test/validationManager.go
@@ -9,11 +9,11 @@ import (
 )
 
 type ValidationManager struct {
-	invalidYamlFiles                 []*extractor.InvalidFile
-	invalidK8sFiles                  []*extractor.InvalidFile
-	validK8sFilesConfigurations      []*extractor.FileConfigurations
-	k8sValidationWarningPerValidFile validation.K8sValidationWarningPerValidFile
-	ignoredFiles                     []extractor.FileConfigurations
+	invalidYamlFiles                              []*extractor.InvalidFile
+	invalidK8sFiles                               []*extractor.InvalidFile
+	validAndSkippedSchemaValidationConfigurations []*extractor.FileConfigurations
+	k8sValidationWarningPerValidFile              validation.K8sValidationWarningPerValidFile
+	ignoredFiles                                  []extractor.FileConfigurations
 }
 
 func NewValidationManager() *ValidationManager {
@@ -54,13 +54,13 @@ func (v *ValidationManager) InvalidK8sFilesCount() int {
 
 func (v *ValidationManager) AggregateValidK8sFiles(validK8sFilesConfigurationsChan chan *extractor.FileConfigurations, wg *sync.WaitGroup) {
 	for fileConfigurations := range validK8sFilesConfigurationsChan {
-		v.validK8sFilesConfigurations = append(v.validK8sFilesConfigurations, fileConfigurations)
+		v.validAndSkippedSchemaValidationConfigurations = append(v.validAndSkippedSchemaValidationConfigurations, fileConfigurations)
 	}
 	wg.Done()
 }
 
-func (v *ValidationManager) ValidK8sFilesConfigurations() []*extractor.FileConfigurations {
-	return v.validK8sFilesConfigurations
+func (v *ValidationManager) ValidOrSkippedK8sFilesConfigurations() []*extractor.FileConfigurations {
+	return v.validAndSkippedSchemaValidationConfigurations
 }
 
 func (v *ValidationManager) GetK8sValidationSummaryStr(filesCount int) string {
@@ -91,13 +91,13 @@ func (v *ValidationManager) countFilesWithWarningsOfKind(warningKind validation.
 }
 
 func (v *ValidationManager) ValidK8sFilesConfigurationsCount() int {
-	return len(v.validK8sFilesConfigurations)
+	return len(v.validAndSkippedSchemaValidationConfigurations)
 }
 
 func (v *ValidationManager) ValidK8sConfigurationsCount() int {
 	totalConfigs := 0
 
-	for _, fileConfiguration := range v.validK8sFilesConfigurations {
+	for _, fileConfiguration := range v.validAndSkippedSchemaValidationConfigurations {
 		totalConfigs += len(fileConfiguration.Configurations)
 	}
 
@@ -125,7 +125,7 @@ func (v *ValidationManager) AggregateIgnoredYamlFiles(ignoredFilesChan chan *ext
 }
 
 func (v *ValidationManager) IgnoredFiles() []*extractor.FileConfigurations {
-	return v.validK8sFilesConfigurations
+	return v.validAndSkippedSchemaValidationConfigurations
 }
 
 func (v *ValidationManager) IgnoredFilesCount() int {
diff --git a/pkg/cliClient/cliClient_test.go b/pkg/cliClient/cliClient_test.go
index fcc091c..b8fb829 100644
--- a/pkg/cliClient/cliClient_test.go
+++ b/pkg/cliClient/cliClient_test.go
@@ -6,15 +6,12 @@ import (
 	"net/http"
 	"testing"
 
-	"github.com/datreeio/datree/pkg/networkValidator"
-
+	"github.com/datreeio/datree/bl/files"
 	"github.com/datreeio/datree/pkg/ciContext"
-
+	"github.com/datreeio/datree/pkg/defaultPolicies"
 	"github.com/datreeio/datree/pkg/fileReader"
-
-	"github.com/datreeio/datree/bl/files"
-
 	"github.com/datreeio/datree/pkg/httpClient"
+	"github.com/datreeio/datree/pkg/networkValidator"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )
@@ -132,6 +129,7 @@ type PublishPoliciesTestCase struct {
 func TestRequestEvaluationPrerunDataSuccess(t *testing.T) {
 	tests := []*RequestEvaluationPrerunDataTestCase{
 		test_requestEvaluationPrerunData_success(),
+		test_requestEvaluationPrerunData_anonymousSuccess(),
 	}
 
 	httpClientMock := mockHTTPClient{}
@@ -437,6 +435,65 @@ func test_requestEvaluationPrerunData_success() *RequestEvaluationPrerunDataTest
 	}
 }
 
+func test_requestEvaluationPrerunData_anonymousSuccess() *RequestEvaluationPrerunDataTestCase {
+	preRunDataServerResponse := mockGetPreRunData()
+	preRunDataServerResponse.IsAnonymous = true
+	preRunDataServerResponse.PoliciesJson = nil
+
+	preRunDataExpectedOutput := mockGetPreRunData()
+	preRunDataExpectedOutput.IsAnonymous = true
+	preRunDataExpectedOutput.PoliciesJson = defaultPolicies.GetDefaultPoliciesStruct()
+
+	return &RequestEvaluationPrerunDataTestCase{
+		name: "success - get prerun data for anonymous evaluation",
+		args: struct {
+			token   string
+			offline string
+		}{
+			token: "internal_test_token",
+		},
+		mock: struct {
+			response struct {
+				status int
+				body   *EvaluationPrerunDataResponse
+				error  error
+			}
+		}{
+			response: struct {
+				status int
+				body   *EvaluationPrerunDataResponse
+				error  error
+			}{
+				status: http.StatusOK,
+				body:   preRunDataServerResponse,
+			},
+		},
+		expected: struct {
+			request struct {
+				method  string
+				uri     string
+				body    interface{}
+				headers map[string]string
+			}
+			responseErr error
+			response    *EvaluationPrerunDataResponse
+		}{
+			request: struct {
+				method  string
+				uri     string
+				body    interface{}
+				headers map[string]string
+			}{
+				method:  http.MethodGet,
+				uri:     "/cli/evaluation/tokens/internal_test_token/prerun?isCi=false",
+				body:    nil,
+				headers: nil,
+			},
+			response: preRunDataExpectedOutput,
+		},
+	}
+}
+
 func test_requestEvaluationPrerunData_error() *RequestEvaluationPrerunDataTestCase {
 	return &RequestEvaluationPrerunDataTestCase{
 		name: "fail - get prerun data for evaluation",
@@ -494,10 +551,11 @@ func test_requestEvaluationPrerunData_network_error(offlineMode string, expected
 	emptyRes := &EvaluationPrerunDataResponse{}
 	if offlineMode == "local" {
 		emptyRes.IsPolicyAsCodeMode = true
+		emptyRes.PoliciesJson = defaultPolicies.GetDefaultPoliciesStruct()
 	}
 
 	return &RequestEvaluationPrerunDataTestCase{
-		name: "fail - get prerun data for evaluation",
+		name: "fail - get prerun data for evaluation network error",
 		args: struct {
 			token   string
 			offline string
diff --git a/pkg/defaultPolicies/defaultPolicies_test.go b/pkg/defaultPolicies/defaultPolicies_test.go
new file mode 100644
index 0000000..4a1d4bb
--- /dev/null
+++ b/pkg/defaultPolicies/defaultPolicies_test.go
@@ -0,0 +1,17 @@
+package defaultPolicies_test
+
+import (
+	_ "embed"
+	"testing"
+
+	"github.com/datreeio/datree/pkg/defaultPolicies"
+
+	"github.com/datreeio/datree/pkg/validatePoliciesYaml"
+)
+
+func TestMain(m *testing.M) {
+	err := validatePoliciesYaml.ValidatePoliciesYaml([]byte(defaultPolicies.DefaultPoliciesFileContent), "./defaultPolicies.yaml")
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/pkg/evaluation/evaluator_test.go b/pkg/evaluation/evaluator_test.go
index 64cdf7b..568e617 100644
--- a/pkg/evaluation/evaluator_test.go
+++ b/pkg/evaluation/evaluator_test.go
@@ -1,11 +1,15 @@
 package evaluation
 
 import (
+	"bytes"
+	_ "embed"
 	"encoding/json"
+	"io"
 	"path/filepath"
 	"testing"
 
 	"github.com/datreeio/datree/pkg/defaultRules"
+	"gopkg.in/yaml.v3"
 
 	policy_factory "github.com/datreeio/datree/bl/policy"
 	"github.com/datreeio/datree/pkg/fileReader"
@@ -131,7 +135,7 @@ func TestEvaluate(t *testing.T) {
 		panic(err)
 	}
 
-	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules)
+	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules, prerunData.IsAnonymous)
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -146,6 +150,7 @@ func TestEvaluate(t *testing.T) {
 				IsInteractiveMode:   tt.args.policyCheckData.IsInteractiveMode,
 				PolicyName:          policy.Name,
 				Policy:              policy,
+				Verbose:             tt.args.policyCheckData.Verbose,
 			}
 
 			policyCheckResultData, err := evaluator.Evaluate(policyCheckData)
@@ -163,6 +168,28 @@ func TestEvaluate(t *testing.T) {
 	}
 }
 
+//go:embed test_fixtures/FailureLocations.yaml
+var FailureLocationsStr string
+
+func TestGetFailedRuleLineAndColumn(t *testing.T) {
+	failedLocationSchemaPath := "/spec/template/spec/containers/0/image"
+	FailureLocationsByteArray := []byte(FailureLocationsStr)
+	yamlDecoder := yaml.NewDecoder(bytes.NewReader(FailureLocationsByteArray))
+	var testCaseYamlNode yaml.Node
+	err := yamlDecoder.Decode(&testCaseYamlNode)
+	if err != nil {
+		if err != io.EOF {
+			panic(err)
+		}
+	}
+	mockedCliClient := &mockCliClient{}
+	evaluator := New(mockedCliClient, nil)
+
+	line, column := evaluator.getFailedRuleLineAndColumn(failedLocationSchemaPath, testCaseYamlNode)
+	assert.Equal(t, 23, line)
+	assert.Equal(t, 18, column)
+}
+
 type evaluateArgs struct {
 	policyCheckData PolicyCheckData
 }
@@ -188,7 +215,7 @@ func request_evaluation_all_valid() *evaluateTestCase {
 		panic(err)
 	}
 
-	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules)
+	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules, prerunData.IsAnonymous)
 
 	return &evaluateTestCase{
 		name: "should request validation without invalid files",
@@ -239,7 +266,7 @@ func request_evaluation_all_invalid() *evaluateTestCase {
 		panic(err)
 	}
 
-	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules)
+	policy, _ := policy_factory.CreatePolicy(prerunData.PoliciesJson, "", prerunData.RegistrationURL, defaultRules, prerunData.IsAnonymous)
 
 	return &evaluateTestCase{
 		name: "should not request validation if there are no valid files",
diff --git a/pkg/evaluation/printer_test.go b/pkg/evaluation/printer_test.go
index 89624bb..20387c8 100644
--- a/pkg/evaluation/printer_test.go
+++ b/pkg/evaluation/printer_test.go
@@ -5,10 +5,10 @@ import (
 	"os"
 	"testing"
 
+	"github.com/datreeio/datree/bl/validation"
+
 	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/datreeio/datree/pkg/defaultRules"
-
-	"github.com/datreeio/datree/bl/validation"
 	"github.com/datreeio/datree/pkg/extractor"
 
 	"github.com/datreeio/datree/pkg/printer"
@@ -120,7 +120,19 @@ func TestCustomOutputs(t *testing.T) {
 	xmlStdout, _ := getXmlOutput(&formattedOutput)
 	assert.Equal(t, expectedOutputs.xml, xmlStdout)
 
-	JUnitStdout, _ := getJUnitOutput(&formattedOutput, additionalJUnitData)
+	JUnitStdout, _ := getJUnitOutput(&formattedOutput, additionalJUnitData, false)
+	assert.Equal(t, expectedOutputs.JUnit, JUnitStdout)
+}
+
+func TestCustomOutputsWithVerbose(t *testing.T) {
+	formattedOutput := createFormattedOutputWithDocumentationUrl()
+	additionalJUnitData := createAdditionalJUnitData()
+	expectedOutputs := getExpectedOutputsWithVerbose()
+
+	jsonStdout, _ := getJsonOutput(&formattedOutput)
+	assert.Equal(t, expectedOutputs.json, jsonStdout)
+
+	JUnitStdout, _ := getJUnitOutput(&formattedOutput, additionalJUnitData, true)
 	assert.Equal(t, expectedOutputs.JUnit, JUnitStdout)
 }
 
@@ -129,7 +141,7 @@ func TestInvalidK8sCustomOutputs(t *testing.T) {
 	additionalJUnitData := createAdditionalJUnitDataInvalidK8sFile()
 	expectedOutputs := getInvalidK8sFileExpectedOutputs()
 
-	JUnitStdout, _ := getJUnitOutput(&formattedOutput, additionalJUnitData)
+	JUnitStdout, _ := getJUnitOutput(&formattedOutput, additionalJUnitData, false)
 	assert.Equal(t, expectedOutputs.JUnit, JUnitStdout)
 }
 
@@ -193,6 +205,11 @@ func createFormattedOutput() FormattedOutput {
 							MetadataName: "rss-site",
 							Kind:         "Deployment",
 							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0.image",
+								FailedErrorLine:   10,
+								FailedErrorColumn: 20,
+							}},
 						}},
 					},
 					{
@@ -203,6 +220,11 @@ func createFormattedOutput() FormattedOutput {
 							MetadataName: "rss-site",
 							Kind:         "Deployment",
 							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0.resources.limits",
+								FailedErrorLine:   95,
+								FailedErrorColumn: 15,
+							}},
 						}},
 					},
 					{
@@ -213,6 +235,11 @@ func createFormattedOutput() FormattedOutput {
 							MetadataName: "rss-site",
 							Kind:         "Deployment",
 							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "metadata.labels.owner",
+								FailedErrorLine:   7,
+								FailedErrorColumn: 12,
+							}},
 						}},
 					},
 					{
@@ -223,6 +250,11 @@ func createFormattedOutput() FormattedOutput {
 							MetadataName: "rss-site",
 							Kind:         "Deployment",
 							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0",
+								FailedErrorLine:   22,
+								FailedErrorColumn: 11,
+							}},
 						}},
 					},
 				},
@@ -240,11 +272,107 @@ func createFormattedOutput() FormattedOutput {
 			K8sValidation:               "1/1",
 			PassedPolicyValidationCount: 0,
 		},
+		LoginUrl: "https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y",
+	}
+}
+
+func createFormattedOutputWithDocumentationUrl() FormattedOutput {
+	evaluationResults := &NonInteractiveEvaluationResults{
+		PolicySummary: &PolicySummary{
+			PolicyName:         "Default",
+			TotalRulesInPolicy: 21,
+			TotalRulesFailed:   4,
+			TotalPassedCount:   0,
+		},
+		FormattedEvaluationResults: []*FormattedEvaluationResults{
+			{
+				FileName: "File1",
+				RuleResults: []*RuleResult{
+					{
+						Identifier:       "CONTAINERS_MISSING_IMAGE_VALUE_VERSION",
+						Name:             "Ensure each container image has a pinned (tag) version",
+						MessageOnFailure: "Incorrect value for key `image` - specify an image version to avoid unpleasant \"version surprises\" in the future",
+						OccurrencesDetails: []OccurrenceDetails{{
+							MetadataName: "rss-site",
+							Kind:         "Deployment",
+							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0.image",
+								FailedErrorLine:   10,
+								FailedErrorColumn: 20,
+							}},
+						}},
+						DocumentationUrl: "https://hub.datree.io/ensure-image-pinned-version",
+					},
+					{
+						Identifier:       "CONTAINERS_MISSING_MEMORY_LIMIT_KEY",
+						Name:             "Ensure each container has a configured memory limit",
+						MessageOnFailure: "Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization",
+						OccurrencesDetails: []OccurrenceDetails{{
+							MetadataName: "rss-site",
+							Kind:         "Deployment",
+							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0.resources.limits",
+								FailedErrorLine:   95,
+								FailedErrorColumn: 15,
+							}},
+						}},
+						DocumentationUrl: "https://hub.datree.io/ensure-memory-limit",
+					},
+					{
+						Identifier:       "WORKLOAD_INVALID_LABELS_VALUE",
+						Name:             "Ensure workload has valid label values",
+						MessageOnFailure: "Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it",
+						OccurrencesDetails: []OccurrenceDetails{{
+							MetadataName: "rss-site",
+							Kind:         "Deployment",
+							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "metadata.labels.owner",
+								FailedErrorLine:   7,
+								FailedErrorColumn: 12,
+							}},
+						}},
+						DocumentationUrl: "https://hub.datree.io/ensure-labels-value-valid",
+					},
+					{
+						Identifier:       "CONTAINERS_MISSING_LIVENESSPROBE_KEY",
+						Name:             "Ensure each container has a configured liveness probe",
+						MessageOnFailure: "Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks",
+						OccurrencesDetails: []OccurrenceDetails{{
+							MetadataName: "rss-site",
+							Kind:         "Deployment",
+							Occurrences:  1,
+							FailureLocations: []cliClient.FailureLocation{{
+								SchemaPath:        "spec.template.spec.containers.0",
+								FailedErrorLine:   22,
+								FailedErrorColumn: 11,
+							}},
+						}},
+						DocumentationUrl: "https://hub.datree.io/ensure-liveness-probe",
+					},
+				},
+			},
+		},
+	}
+
+	return FormattedOutput{
+		PolicyValidationResults: evaluationResults.FormattedEvaluationResults,
+		PolicySummary:           evaluationResults.PolicySummary,
+		EvaluationSummary: NonInteractiveEvaluationSummary{
+			ConfigsCount:                1,
+			FilesCount:                  1,
+			PassedYamlValidationCount:   1,
+			K8sValidation:               "1/1",
+			PassedPolicyValidationCount: 0,
+		},
+		LoginUrl: "https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y",
 	}
 }
 
 func createInvalidK8sFileFormattedOutput() FormattedOutput {
-	err := errors.New("k8s schema validation error: could not find schema for Deploymentt You can skip files with missing schemas instead of failing by using the `--ignore-missing-schemas` flag ")
+	err := errors.New("k8s schema validation error: could not find schema for Deployment You can skip files with missing schemas instead of failing by using the `--ignore-missing-schemas` flag ")
 	err2 := errors.New("k8s schema validation error: For field spec.replicas: Invalid type. Expected: [integer,null], given: string ")
 	invalidK8sFile := &extractor.InvalidFile{
 		Path:             "File1",
@@ -275,6 +403,15 @@ func getExpectedOutputs() expectedOutputs {
 	}
 }
 
+func getExpectedOutputsWithVerbose() expectedOutputs {
+	jsonOutputVerbose, _ := os.ReadFile("./printer_test_expected_outputs/json_output_verbose.json")
+	jUnitOutputVerbose, _ := os.ReadFile("./printer_test_expected_outputs/JUnit_output_verbose.xml")
+	return expectedOutputs{
+		json:  string(jsonOutputVerbose),
+		JUnit: string(jUnitOutputVerbose),
+	}
+}
+
 func getInvalidK8sFileExpectedOutputs() expectedOutputs {
 	jUnitOutput, _ := os.ReadFile("./printer_test_expected_outputs/JUnit_invalid_k8s_output.xml")
 	return expectedOutputs{
@@ -313,7 +450,7 @@ func printResults(outputFormat string) *printResultsTestCase {
 			invalidYamlFiles:  []*extractor.InvalidFile{},
 			invalidK8sFiles:   []*extractor.InvalidFile{},
 			evaluationSummary: printer.EvaluationSummary{},
-			loginURL:          "login/url",
+			loginURL:          "https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y",
 			outputFormat:      outputFormat,
 		},
 		expected: nil,
diff --git a/pkg/evaluation/printer_test_expected_outputs/JUnit_invalid_k8s_output.xml b/pkg/evaluation/printer_test_expected_outputs/JUnit_invalid_k8s_output.xml
index 59a98ae..8f3126f 100755
--- a/pkg/evaluation/printer_test_expected_outputs/JUnit_invalid_k8s_output.xml
+++ b/pkg/evaluation/printer_test_expected_outputs/JUnit_invalid_k8s_output.xml
@@ -2,7 +2,7 @@
 <testsuites name="" tests="0" failures="0" skipped="0">
 	<testsuite name="File1">
 		<testcase name="invalid k8s file" classname="k8s validation">
-			<failure message="Invalid k8s file">k8s schema validation error: could not find schema for Deploymentt You can skip files with missing schemas instead of failing by using the `--ignore-missing-schemas` flag </failure>
+			<failure message="Invalid k8s file">k8s schema validation error: could not find schema for Deployment You can skip files with missing schemas instead of failing by using the `--ignore-missing-schemas` flag </failure>
 		</testcase>
 		<testcase name="invalid k8s file" classname="k8s validation">
 			<failure message="Invalid k8s file">k8s schema validation error: For field spec.replicas: Invalid type. Expected: [integer,null], given: string </failure>
diff --git a/pkg/evaluation/printer_test_expected_outputs/JUnit_output_verbose.xml b/pkg/evaluation/printer_test_expected_outputs/JUnit_output_verbose.xml
new file mode 100755
index 0000000..e60bbc8
--- /dev/null
+++ b/pkg/evaluation/printer_test_expected_outputs/JUnit_output_verbose.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuites name="Default" tests="21" failures="4" skipped="0">
+	<testsuite name="File1">
+		<testcase name="Ensure each container image has a pinned (tag) version" classname="CONTAINERS_MISSING_IMAGE_VALUE_VERSION">
+			<failure message="Incorrect value for key `image` - specify an image version to avoid unpleasant &#34;version surprises&#34; in the future">1 occurrences&#xA;- metadata.name: rss-site (kind: Deployment)&#xA;0 skipped&#xA;</failure>
+			<documentationUrl message="https://hub.datree.io/ensure-image-pinned-version"></documentationUrl>
+		</testcase>
+		<testcase name="Ensure each container has a configured memory request" classname="CONTAINERS_MISSING_MEMORY_REQUEST_KEY"></testcase>
+		<testcase name="Ensure each container has a configured CPU request" classname="CONTAINERS_MISSING_CPU_REQUEST_KEY"></testcase>
+		<testcase name="Ensure each container has a configured memory limit" classname="CONTAINERS_MISSING_MEMORY_LIMIT_KEY">
+			<failure message="Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization">1 occurrences&#xA;- metadata.name: rss-site (kind: Deployment)&#xA;0 skipped&#xA;</failure>
+			<documentationUrl message="https://hub.datree.io/ensure-memory-limit"></documentationUrl>
+		</testcase>
+		<testcase name="Ensure each container has a configured CPU limit" classname="CONTAINERS_MISSING_CPU_LIMIT_KEY"></testcase>
+		<testcase name="Prevent Ingress from forwarding all traffic to a single container" classname="INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE"></testcase>
+		<testcase name="Prevent Service from exposing node port" classname="SERVICE_INCORRECT_TYPE_VALUE_NODEPORT"></testcase>
+		<testcase name="Ensure CronJob scheduler is valid" classname="CRONJOB_INVALID_SCHEDULE_VALUE"></testcase>
+		<testcase name="Ensure workload has valid label values" classname="WORKLOAD_INVALID_LABELS_VALUE">
+			<failure message="Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it">1 occurrences&#xA;- metadata.name: rss-site (kind: Deployment)&#xA;0 skipped&#xA;</failure>
+			<documentationUrl message="https://hub.datree.io/ensure-labels-value-valid"></documentationUrl>
+		</testcase>
+		<testcase name="Ensure deployment-like resource is using a valid restart policy" classname="WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS"></testcase>
+		<testcase name="Ensure each container has a configured liveness probe" classname="CONTAINERS_MISSING_LIVENESSPROBE_KEY">
+			<failure message="Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks">1 occurrences&#xA;- metadata.name: rss-site (kind: Deployment)&#xA;0 skipped&#xA;</failure>
+			<documentationUrl message="https://hub.datree.io/ensure-liveness-probe"></documentationUrl>
+		</testcase>
+		<testcase name="Ensure each container has a configured readiness probe" classname="CONTAINERS_MISSING_READINESSPROBE_KEY"></testcase>
+		<testcase name="Ensure HPA has minimum replicas configured" classname="HPA_MISSING_MINREPLICAS_KEY"></testcase>
+		<testcase name="Prevent workload from using the default namespace" classname="WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT"></testcase>
+		<testcase name="Ensure Deployment has more than one replica configured" classname="DEPLOYMENT_INCORRECT_REPLICAS_VALUE"></testcase>
+		<testcase name="Ensure CronJob has a configured deadline" classname="CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY"></testcase>
+		<testcase name="Prevent deprecated APIs in Kubernetes v1.16" classname="K8S_DEPRECATED_APIVERSION_1.16"></testcase>
+		<testcase name="Prevent deprecated APIs in Kubernetes v1.17" classname="K8S_DEPRECATED_APIVERSION_1.17"></testcase>
+		<testcase name="Prevent containers from having root access capabilities" classname="CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE"></testcase>
+		<testcase name="Prevent CronJob from executing jobs concurrently" classname="CRONJOB_MISSING_CONCURRENCYPOLICY_KEY"></testcase>
+		<testcase name="Ensure resource has a configured name" classname="RESOURCE_MISSING_NAME"></testcase>
+	</testsuite>
+	<testsuite name="File2">
+		<testcase name="Ensure each container image has a pinned (tag) version" classname="CONTAINERS_MISSING_IMAGE_VALUE_VERSION"></testcase>
+		<testcase name="Ensure each container has a configured memory request" classname="CONTAINERS_MISSING_MEMORY_REQUEST_KEY"></testcase>
+		<testcase name="Ensure each container has a configured CPU request" classname="CONTAINERS_MISSING_CPU_REQUEST_KEY"></testcase>
+		<testcase name="Ensure each container has a configured memory limit" classname="CONTAINERS_MISSING_MEMORY_LIMIT_KEY"></testcase>
+		<testcase name="Ensure each container has a configured CPU limit" classname="CONTAINERS_MISSING_CPU_LIMIT_KEY"></testcase>
+		<testcase name="Prevent Ingress from forwarding all traffic to a single container" classname="INGRESS_INCORRECT_HOST_VALUE_PERMISSIVE"></testcase>
+		<testcase name="Prevent Service from exposing node port" classname="SERVICE_INCORRECT_TYPE_VALUE_NODEPORT"></testcase>
+		<testcase name="Ensure CronJob scheduler is valid" classname="CRONJOB_INVALID_SCHEDULE_VALUE"></testcase>
+		<testcase name="Ensure workload has valid label values" classname="WORKLOAD_INVALID_LABELS_VALUE"></testcase>
+		<testcase name="Ensure deployment-like resource is using a valid restart policy" classname="WORKLOAD_INCORRECT_RESTARTPOLICY_VALUE_ALWAYS"></testcase>
+		<testcase name="Ensure each container has a configured liveness probe" classname="CONTAINERS_MISSING_LIVENESSPROBE_KEY"></testcase>
+		<testcase name="Ensure each container has a configured readiness probe" classname="CONTAINERS_MISSING_READINESSPROBE_KEY"></testcase>
+		<testcase name="Ensure HPA has minimum replicas configured" classname="HPA_MISSING_MINREPLICAS_KEY"></testcase>
+		<testcase name="Prevent workload from using the default namespace" classname="WORKLOAD_INCORRECT_NAMESPACE_VALUE_DEFAULT"></testcase>
+		<testcase name="Ensure Deployment has more than one replica configured" classname="DEPLOYMENT_INCORRECT_REPLICAS_VALUE"></testcase>
+		<testcase name="Ensure CronJob has a configured deadline" classname="CRONJOB_MISSING_STARTINGDEADLINESECOND_KEY"></testcase>
+		<testcase name="Prevent deprecated APIs in Kubernetes v1.16" classname="K8S_DEPRECATED_APIVERSION_1.16"></testcase>
+		<testcase name="Prevent deprecated APIs in Kubernetes v1.17" classname="K8S_DEPRECATED_APIVERSION_1.17"></testcase>
+		<testcase name="Prevent containers from having root access capabilities" classname="CONTAINERS_INCORRECT_PRIVILEGED_VALUE_TRUE"></testcase>
+		<testcase name="Prevent CronJob from executing jobs concurrently" classname="CRONJOB_MISSING_CONCURRENCYPOLICY_KEY"></testcase>
+		<testcase name="Ensure resource has a configured name" classname="RESOURCE_MISSING_NAME"></testcase>
+	</testsuite>
+	<testsuite name="policySummary">
+		<properties>
+			<property name="policyName" value="Default"></property>
+			<property name="totalRulesInPolicy" value="21"></property>
+			<property name="totalSkippedRules" value="0"></property>
+			<property name="totalRulesFailed" value="4"></property>
+			<property name="totalPassedCount" value="0"></property>
+		</properties>
+	</testsuite>
+	<testsuite name="evaluationSummary">
+		<properties>
+			<property name="configsCount" value="1"></property>
+			<property name="filesCount" value="1"></property>
+			<property name="passedYamlValidationCount" value="1"></property>
+			<property name="k8sValidation" value="1/1"></property>
+			<property name="passedPolicyValidationCount" value="0"></property>
+		</properties>
+	</testsuite>
+</testsuites>
diff --git a/pkg/evaluation/printer_test_expected_outputs/json_output.json b/pkg/evaluation/printer_test_expected_outputs/json_output.json
index 7c189da..b287048 100644
--- a/pkg/evaluation/printer_test_expected_outputs/json_output.json
+++ b/pkg/evaluation/printer_test_expected_outputs/json_output.json
@@ -1,1 +1,1 @@
-{"policyValidationResults":[{"fileName":"File1","ruleResults":[{"identifier":"CONTAINERS_MISSING_IMAGE_VALUE_VERSION","name":"Ensure each container image has a pinned (tag) version","messageOnFailure":"Incorrect value for key `image` - specify an image version to avoid unpleasant \"version surprises\" in the future","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false}]},{"identifier":"CONTAINERS_MISSING_MEMORY_LIMIT_KEY","name":"Ensure each container has a configured memory limit","messageOnFailure":"Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false}]},{"identifier":"WORKLOAD_INVALID_LABELS_VALUE","name":"Ensure workload has valid label values","messageOnFailure":"Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false}]},{"identifier":"CONTAINERS_MISSING_LIVENESSPROBE_KEY","name":"Ensure each container has a configured liveness probe","messageOnFailure":"Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false}]}]}],"policySummary":{"policyName":"Default","totalRulesInPolicy":21,"totalSkippedRules":0,"totalRulesFailed":4,"totalPassedCount":0},"evaluationSummary":{"configsCount":1,"filesCount":1,"passedYamlValidationCount":1,"k8sValidation":"1/1","passedPolicyValidationCount":0},"yamlValidationResults":null,"k8sValidationResults":null}
+{"policyValidationResults":[{"fileName":"File1","ruleResults":[{"identifier":"CONTAINERS_MISSING_IMAGE_VALUE_VERSION","name":"Ensure each container image has a pinned (tag) version","messageOnFailure":"Incorrect value for key `image` - specify an image version to avoid unpleasant \"version surprises\" in the future","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0.image","failedErrorLine":10,"failedErrorColumn":20}]}]},{"identifier":"CONTAINERS_MISSING_MEMORY_LIMIT_KEY","name":"Ensure each container has a configured memory limit","messageOnFailure":"Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0.resources.limits","failedErrorLine":95,"failedErrorColumn":15}]}]},{"identifier":"WORKLOAD_INVALID_LABELS_VALUE","name":"Ensure workload has valid label values","messageOnFailure":"Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"metadata.labels.owner","failedErrorLine":7,"failedErrorColumn":12}]}]},{"identifier":"CONTAINERS_MISSING_LIVENESSPROBE_KEY","name":"Ensure each container has a configured liveness probe","messageOnFailure":"Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0","failedErrorLine":22,"failedErrorColumn":11}]}]}]}],"policySummary":{"policyName":"Default","totalRulesInPolicy":21,"totalSkippedRules":0,"totalRulesFailed":4,"totalPassedCount":0},"evaluationSummary":{"configsCount":1,"filesCount":1,"passedYamlValidationCount":1,"k8sValidation":"1/1","passedPolicyValidationCount":0},"yamlValidationResults":null,"k8sValidationResults":null,"loginUrl":"https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y"}
diff --git a/pkg/evaluation/printer_test_expected_outputs/json_output_verbose.json b/pkg/evaluation/printer_test_expected_outputs/json_output_verbose.json
new file mode 100644
index 0000000..f7c72e7
--- /dev/null
+++ b/pkg/evaluation/printer_test_expected_outputs/json_output_verbose.json
@@ -0,0 +1,1 @@
+{"policyValidationResults":[{"fileName":"File1","ruleResults":[{"identifier":"CONTAINERS_MISSING_IMAGE_VALUE_VERSION","name":"Ensure each container image has a pinned (tag) version","messageOnFailure":"Incorrect value for key `image` - specify an image version to avoid unpleasant \"version surprises\" in the future","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0.image","failedErrorLine":10,"failedErrorColumn":20}]}],"documentationUrl":"https://hub.datree.io/ensure-image-pinned-version"},{"identifier":"CONTAINERS_MISSING_MEMORY_LIMIT_KEY","name":"Ensure each container has a configured memory limit","messageOnFailure":"Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0.resources.limits","failedErrorLine":95,"failedErrorColumn":15}]}],"documentationUrl":"https://hub.datree.io/ensure-memory-limit"},{"identifier":"WORKLOAD_INVALID_LABELS_VALUE","name":"Ensure workload has valid label values","messageOnFailure":"Incorrect value for key(s) under `labels` - the vales syntax is not valid so the Kubernetes engine will not accept it","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"metadata.labels.owner","failedErrorLine":7,"failedErrorColumn":12}]}],"documentationUrl":"https://hub.datree.io/ensure-labels-value-valid"},{"identifier":"CONTAINERS_MISSING_LIVENESSPROBE_KEY","name":"Ensure each container has a configured liveness probe","messageOnFailure":"Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible deadlocks","occurrencesDetails":[{"metadataName":"rss-site","kind":"Deployment","skipMessage":"","occurrences":1,"isSkipped":false,"failureLocations":[{"schemaPath":"spec.template.spec.containers.0","failedErrorLine":22,"failedErrorColumn":11}]}],"documentationUrl":"https://hub.datree.io/ensure-liveness-probe"}]}],"policySummary":{"policyName":"Default","totalRulesInPolicy":21,"totalSkippedRules":0,"totalRulesFailed":4,"totalPassedCount":0},"evaluationSummary":{"configsCount":1,"filesCount":1,"passedYamlValidationCount":1,"k8sValidation":"1/1","passedPolicyValidationCount":0},"yamlValidationResults":null,"k8sValidationResults":null,"loginUrl":"https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y"}
diff --git a/pkg/evaluation/printer_test_expected_outputs/xml_output.xml b/pkg/evaluation/printer_test_expected_outputs/xml_output.xml
index 97e1910..47599d6 100644
--- a/pkg/evaluation/printer_test_expected_outputs/xml_output.xml
+++ b/pkg/evaluation/printer_test_expected_outputs/xml_output.xml
@@ -12,6 +12,11 @@
 				<skipMessage></skipMessage>
 				<occurrences>1</occurrences>
 				<isSkipped>false</isSkipped>
+				<failureLocations>
+					<SchemaPath>spec.template.spec.containers.0.image</SchemaPath>
+					<FailedErrorLine>10</FailedErrorLine>
+					<FailedErrorColumn>20</FailedErrorColumn>
+				</failureLocations>
 			</occurrencesDetails>
 		</ruleResults>
 		<ruleResults>
@@ -24,6 +29,11 @@
 				<skipMessage></skipMessage>
 				<occurrences>1</occurrences>
 				<isSkipped>false</isSkipped>
+				<failureLocations>
+					<SchemaPath>spec.template.spec.containers.0.resources.limits</SchemaPath>
+					<FailedErrorLine>95</FailedErrorLine>
+					<FailedErrorColumn>15</FailedErrorColumn>
+				</failureLocations>
 			</occurrencesDetails>
 		</ruleResults>
 		<ruleResults>
@@ -36,6 +46,11 @@
 				<skipMessage></skipMessage>
 				<occurrences>1</occurrences>
 				<isSkipped>false</isSkipped>
+				<failureLocations>
+					<SchemaPath>metadata.labels.owner</SchemaPath>
+					<FailedErrorLine>7</FailedErrorLine>
+					<FailedErrorColumn>12</FailedErrorColumn>
+				</failureLocations>
 			</occurrencesDetails>
 		</ruleResults>
 		<ruleResults>
@@ -48,6 +63,11 @@
 				<skipMessage></skipMessage>
 				<occurrences>1</occurrences>
 				<isSkipped>false</isSkipped>
+				<failureLocations>
+					<SchemaPath>spec.template.spec.containers.0</SchemaPath>
+					<FailedErrorLine>22</FailedErrorLine>
+					<FailedErrorColumn>11</FailedErrorColumn>
+				</failureLocations>
 			</occurrencesDetails>
 		</ruleResults>
 	</policyValidationResults>
@@ -65,4 +85,5 @@
 		<k8sValidation>1/1</k8sValidation>
 		<passedPolicyValidationCount>0</passedPolicyValidationCount>
 	</evaluationSummary>
+	<loginUrl>https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y</loginUrl>
 </FormattedOutput>
diff --git a/pkg/evaluation/printer_test_expected_outputs/yaml_output.yaml b/pkg/evaluation/printer_test_expected_outputs/yaml_output.yaml
index 5601667..13d4668 100644
--- a/pkg/evaluation/printer_test_expected_outputs/yaml_output.yaml
+++ b/pkg/evaluation/printer_test_expected_outputs/yaml_output.yaml
@@ -11,6 +11,10 @@ policyValidationResults:
       skipMessage: ""
       occurrences: 1
       isSkipped: false
+      failureLocations:
+      - schemapath: spec.template.spec.containers.0.image
+        failederrorline: 10
+        failederrorcolumn: 20
   - identifier: CONTAINERS_MISSING_MEMORY_LIMIT_KEY
     name: Ensure each container has a configured memory limit
     messageOnFailure: Missing property object `limits.memory` - value should be within
@@ -21,6 +25,10 @@ policyValidationResults:
       skipMessage: ""
       occurrences: 1
       isSkipped: false
+      failureLocations:
+      - schemapath: spec.template.spec.containers.0.resources.limits
+        failederrorline: 95
+        failederrorcolumn: 15
   - identifier: WORKLOAD_INVALID_LABELS_VALUE
     name: Ensure workload has valid label values
     messageOnFailure: Incorrect value for key(s) under `labels` - the vales syntax
@@ -31,6 +39,10 @@ policyValidationResults:
       skipMessage: ""
       occurrences: 1
       isSkipped: false
+      failureLocations:
+      - schemapath: metadata.labels.owner
+        failederrorline: 7
+        failederrorcolumn: 12
   - identifier: CONTAINERS_MISSING_LIVENESSPROBE_KEY
     name: Ensure each container has a configured liveness probe
     messageOnFailure: Missing property object `livenessProbe` - add a properly configured
@@ -41,6 +53,10 @@ policyValidationResults:
       skipMessage: ""
       occurrences: 1
       isSkipped: false
+      failureLocations:
+      - schemapath: spec.template.spec.containers.0
+        failederrorline: 22
+        failederrorcolumn: 11
 policySummary:
   policyName: Default
   totalRulesInPolicy: 21
@@ -55,4 +71,5 @@ evaluationSummary:
   passedPolicyValidationCount: 0
 yamlValidationResults: []
 k8sValidationResults: []
+loginUrl: https://app.datree.io/login?t=tDJhAU478UTDeSwxGAy99y
 
diff --git a/pkg/evaluation/test_fixtures/FailureLocations.yaml b/pkg/evaluation/test_fixtures/FailureLocations.yaml
new file mode 100644
index 0000000..9253c37
--- /dev/null
+++ b/pkg/evaluation/test_fixtures/FailureLocations.yaml
@@ -0,0 +1,60 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: AAAA
+  namespace: test
+  labels:
+    owner: --
+    environment: prod
+    app: web
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: web
+  template:
+    metadata:
+      namespace: test
+      labels:
+        app: web
+    spec:
+      containers:
+        - name: front-end
+          image: nginx:latest
+          readinessProbe:
+            tcpSocket:
+              port: 8080
+            initialDelaySeconds: 5
+            periodSeconds: 10
+          resources:
+            requests:
+              memory: "64Mi"
+              cpu: "64m"
+            limits:
+              memory: "64Mi"
+              cpu: "500m"
+          ports:
+            - containerPort: 80
+        - name: rss-reader
+          image: nginx:latest
+          livenessProbe:
+            httpGet:
+              path: /healthz
+              port: 8080
+              httpHeaders:
+                - name: Custom-Header
+                  value: Awesome
+          readinessProbe:
+            tcpSocket:
+              port: 8080
+            initialDelaySeconds: 5
+            periodSeconds: 10
+          resources:
+            requests:
+              cpu: "64m"
+              memory: "128Mi"
+            limits:
+              memory: "128Mi"
+              cpu: "500m"
+          ports:
+            - containerPort: 88
diff --git a/pkg/policy/policy_test.go b/pkg/policy/policy_test.go
index e9609e4..7bebe68 100644
--- a/pkg/policy/policy_test.go
+++ b/pkg/policy/policy_test.go
@@ -9,7 +9,8 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/datreeio/datree/pkg/cliClient"
+	"github.com/datreeio/datree/pkg/defaultPolicies"
+
 	"github.com/datreeio/datree/pkg/defaultRules"
 	"github.com/datreeio/datree/pkg/fileReader"
 	"github.com/datreeio/datree/pkg/jsonSchemaValidator"
@@ -128,11 +129,11 @@ func getFileData(filename string) (int, bool) {
 	return id, isPass
 }
 
-func expectedPoliciesContent(t *testing.T, path string) *cliClient.EvaluationPrerunPolicies {
+func expectedPoliciesContent(t *testing.T, path string) *defaultPolicies.EvaluationPrerunPolicies {
 	fileReader := fileReader.CreateFileReader(nil)
 	policiesStr, _ := fileReader.ReadFileContent(path)
 
-	var policiesJson *cliClient.EvaluationPrerunPolicies
+	var policiesJson *defaultPolicies.EvaluationPrerunPolicies
 	policiesBytes, _ := yaml.YAMLToJSON([]byte(policiesStr))
 
 	err := yaml.Unmarshal(policiesBytes, &policiesJson)
diff --git a/pkg/policy/tests/61-fail.yaml b/pkg/policy/tests/61-fail.yaml
new file mode 100644
index 0000000..0240d68
--- /dev/null
+++ b/pkg/policy/tests/61-fail.yaml
@@ -0,0 +1,22 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: myPod
+spec:
+  securityContext:
+    seccompProfile:
+      type: Localhost
+  containers:
+    - name: nginx
+      image: nginx:1.14.2
+      ports:
+        - containerPort: 80
+  initContainers:
+    - name: nginx
+      image: nginx:1.14.2
+      securityContext:
+        seccompProfile:
+          type: unconfined
+      ports:
+        - containerPort: 80
+
diff --git a/pkg/policy/tests/61-pass.yaml b/pkg/policy/tests/61-pass.yaml
new file mode 100644
index 0000000..0f82d8d
--- /dev/null
+++ b/pkg/policy/tests/61-pass.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: myPod
+spec:
+  securityContext:
+    seccompProfile:
+      type: Localhost
+  containers:
+    - name: nginx
+      image: nginx:1.14.2
+      ports:
+        - containerPort: 80
+  initContainers:
+    - name: nginx
+      image: nginx:1.14.2
+      ports:
+        - containerPort: 80
+
diff --git a/pkg/printer/printer_test.go b/pkg/printer/printer_test.go
index 396e3d5..8e9c5fd 100644
--- a/pkg/printer/printer_test.go
+++ b/pkg/printer/printer_test.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"testing"
 
+	"github.com/datreeio/datree/pkg/cliClient"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -14,10 +15,18 @@ func TestGetWarningsText(t *testing.T) {
 		Title: GetFileNameText("~/.datree/k8-demo.yaml"),
 		FailedRules: []FailedRule{
 			{
-				Name:               "Caption",
-				Occurrences:        1,
-				Suggestion:         "Suggestion",
-				OccurrencesDetails: []OccurrenceDetails{{MetadataName: "yishay", Kind: "Pod"}},
+				Name:        "Caption",
+				Occurrences: 1,
+				Suggestion:  "Suggestion",
+				OccurrencesDetails: []OccurrenceDetails{{
+					MetadataName: "yishay",
+					Kind:         "Pod",
+					FailureLocations: []cliClient.FailureLocation{{
+						SchemaPath:        ".spec.template.spec.containers.0.image",
+						FailedErrorLine:   10,
+						FailedErrorColumn: 20,
+					}},
+				}},
 			},
 		},
 	},
@@ -56,6 +65,8 @@ func TestGetWarningsText(t *testing.T) {
 
 ❌  Caption  [1 occurrence]
     - metadata.name: yishay (kind: Pod)
+      > key: spec.template.spec.containers.0.image (line: 10:20)
+
 💡  Suggestion
 
 >>  File: /datree/datree/internal/fixtures/kube/yaml-validation-error.yaml
@@ -112,6 +123,8 @@ https://github.com/datreeio/helm-datree
 
 [X]  Caption  [1 occurrence]
     - metadata.name: yishay (kind: Pod)
+      > key: spec.template.spec.containers.0.image (line: 10:20)
+
 [*]  Suggestion
 
 >>  File: /datree/datree/internal/fixtures/kube/yaml-validation-error.yaml