diff --git a/.github/workflows/pr-quality.yml b/.github/workflows/pr-quality.yml index 8d95a51..fc78543 100644 --- a/.github/workflows/pr-quality.yml +++ b/.github/workflows/pr-quality.yml @@ -9,6 +9,27 @@ on: - synchronize jobs: + test-live-docs: + name: Test live-docs scripts + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 + with: + egress-policy: audit + + - uses: actions/checkout@v6 + + - uses: actions/setup-python@v6 + with: + python-version: '3.14' + + - name: Install dependencies + run: pip install requests pytest + + - name: Run tests + run: pytest tests/ + validate-title: name: Validate PR Title runs-on: ubuntu-latest diff --git a/.github/workflows/update-cli-docs.yml b/.github/workflows/update-cli-docs.yml index f506d25..b39f33e 100644 --- a/.github/workflows/update-cli-docs.yml +++ b/.github/workflows/update-cli-docs.yml @@ -52,7 +52,7 @@ jobs: python-version: '3.14' - name: Install Python dependencies - run: pip install pyyaml + run: pip install pyyaml requests - name: Stamp CLI version in overview page run: | @@ -62,6 +62,9 @@ jobs: - name: Update CLI navigation run: python scripts/update-cli-nav.py --docs-dir client_reference/ --nav-file config/navigation.json + - name: Add live-docs sections + run: python scripts/add_livedocs.py + - name: Install helm-docs run: | curl -sL https://github.com/norwoodj/helm-docs/releases/download/v1.14.2/helm-docs_1.14.2_Linux_x86_64.deb --output helm-docs.deb diff --git a/client_reference/kosli_assert_artifact.md b/client_reference/kosli_assert_artifact.md index 4d73ce7..f628853 100644 --- a/client_reference/kosli_assert_artifact.md +++ b/client_reference/kosli_assert_artifact.md @@ -69,12 +69,12 @@ non-zero code if non-compliant status. View an example of the `kosli assert artifact` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bassert%2Bartifact) + In [this YAML file](https://github.com/cyber-dojo/differ/blob/30dffd09c3f896a322c65029247abcea3019c43a/.github/workflows/main.yml#L329) View an example of the `kosli assert artifact` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Bassert%2Bartifact) + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/b3152a10de1f36b7dbe2818c0918af06fd3aca61/.gitlab/workflows/main.yml#L153) diff --git a/client_reference/kosli_attest_artifact.md b/client_reference/kosli_attest_artifact.md index b235543..13cbf67 100644 --- a/client_reference/kosli_attest_artifact.md +++ b/client_reference/kosli_attest_artifact.md @@ -80,12 +80,12 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli attest artifact` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bartifact), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bartifact). + In [this YAML file](https://github.com/cyber-dojo/reusable-actions-workflows/blob/25f0b797c18403de1c8490a9a71bbe9789c809a9/.github/workflows/secure-docker-build.yml#L210), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/30dffd09c3f896a322c65029247abcea3019c43a?attestation_id=046919b1-42dd-47f8-8569-912d0259). View an example of the `kosli attest artifact` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Battest%2Bartifact), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Battest%2Bartifact). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L111), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c?attestation_id=c5d209a3-9139-4f5b-a553-c6351091). diff --git a/client_reference/kosli_attest_custom.md b/client_reference/kosli_attest_custom.md index a391be8..73ad298 100644 --- a/client_reference/kosli_attest_custom.md +++ b/client_reference/kosli_attest_custom.md @@ -78,7 +78,7 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli attest custom` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bcustom), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bcustom). + In [this YAML file](https://github.com/cyber-dojo/differ/blob/30dffd09c3f896a322c65029247abcea3019c43a/.github/workflows/main.yml#L203), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/30dffd09c3f896a322c65029247abcea3019c43a?attestation_id=8a32a0bb-c995-41d1-8f2f-c78619b3). diff --git a/client_reference/kosli_attest_generic.md b/client_reference/kosli_attest_generic.md index a6ddd32..faccff7 100644 --- a/client_reference/kosli_attest_generic.md +++ b/client_reference/kosli_attest_generic.md @@ -74,12 +74,12 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli attest generic` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bgeneric), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bgeneric). + In [this YAML file](https://github.com/cyber-dojo/dashboard/blob/a6ece2b597888f7ab149759daadda08e3afab0c1/.github/workflows/main.yml#L249), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/dashboard-ci/trails/a6ece2b597888f7ab149759daadda08e3afab0c1?attestation_id=4223c865-5232-461e-b065-ea46aa5d). View an example of the `kosli attest generic` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Battest%2Bgeneric), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Battest%2Bgeneric). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L92), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c?attestation_id=27c3762e-631f-429d-863a-99a3d404). diff --git a/client_reference/kosli_attest_junit.md b/client_reference/kosli_attest_junit.md index 879e207..e38459a 100644 --- a/client_reference/kosli_attest_junit.md +++ b/client_reference/kosli_attest_junit.md @@ -79,12 +79,12 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli attest junit` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bjunit), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bjunit). + In [this YAML file](https://github.com/cyber-dojo/differ/blob/30dffd09c3f896a322c65029247abcea3019c43a/.github/workflows/main.yml#L126), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/30dffd09c3f896a322c65029247abcea3019c43a?attestation_id=ac559624-fe12-4d8e-9f20-334c8d0d). View an example of the `kosli attest junit` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Battest%2Bjunit), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Battest%2Bjunit). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L126), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c?attestation_id=7c731680-ff9f-4e22-8147-32e8629f). diff --git a/client_reference/kosli_attest_pullrequest_github.md b/client_reference/kosli_attest_pullrequest_github.md index 32a254c..0cff84d 100644 --- a/client_reference/kosli_attest_pullrequest_github.md +++ b/client_reference/kosli_attest_pullrequest_github.md @@ -71,7 +71,7 @@ The attestation can be bound to an *artifact* in two ways: View an example of the `kosli attest pullrequest github` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bpullrequest%2Bgithub), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bpullrequest%2Bgithub). + In [this YAML file](https://github.com/cyber-dojo/differ/blob/30dffd09c3f896a322c65029247abcea3019c43a/.github/workflows/main.yml#L95), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/30dffd09c3f896a322c65029247abcea3019c43a?attestation_id=a3c84fec-c679-4536-83df-35d25f2d). diff --git a/client_reference/kosli_attest_pullrequest_gitlab.md b/client_reference/kosli_attest_pullrequest_gitlab.md index 0fa0556..2170983 100644 --- a/client_reference/kosli_attest_pullrequest_gitlab.md +++ b/client_reference/kosli_attest_pullrequest_gitlab.md @@ -71,7 +71,7 @@ The attestation can be bound to an *artifact* in two ways: View an example of the `kosli attest pullrequest gitlab` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Battest%2Bpullrequest%2Bgitlab), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Battest%2Bpullrequest%2Bgitlab). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L75), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c?attestation_id=763af9cc-b908-456d-935c-f4deb860). diff --git a/client_reference/kosli_attest_snyk.md b/client_reference/kosli_attest_snyk.md index c7e2f36..5d3eaea 100644 --- a/client_reference/kosli_attest_snyk.md +++ b/client_reference/kosli_attest_snyk.md @@ -83,12 +83,12 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli attest snyk` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bsnyk), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bsnyk). + In [this YAML file](https://github.com/cyber-dojo/snyk-container-test/blob/43373102aa2abee72027e2aba050adea9fdb0173/action.yml#L70), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/2e482ef95263c81570a82f0456b026e29203d550?attestation_id=c4d17fb4-05d2-4894-bca7-f21e56ab). View an example of the `kosli attest snyk` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Battest%2Bsnyk), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Battest%2Bsnyk). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393/.gitlab/workflows/main.yml#L146), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393?attestation_id=3e9cd5ee-4fd3-403f-ba59-6d431dec). diff --git a/client_reference/kosli_attest_sonar.md b/client_reference/kosli_attest_sonar.md index 42298b9..f4c4f28 100644 --- a/client_reference/kosli_attest_sonar.md +++ b/client_reference/kosli_attest_sonar.md @@ -99,7 +99,7 @@ The attestation can be bound to an *artifact* in two ways: View an example of the `kosli attest sonar` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Battest%2Bsonar), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Battest%2Bsonar). + In [this YAML file](https://github.com/cyber-dojo/dashboard/blob/a6ece2b597888f7ab149759daadda08e3afab0c1/.github/workflows/main.yml#L166), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/dashboard-ci/trails/a6ece2b597888f7ab149759daadda08e3afab0c1?attestation_id=2377ce1f-f4b4-47c4-8458-8f16de62). diff --git a/client_reference/kosli_begin_trail.md b/client_reference/kosli_begin_trail.md index c368cad..04a3ca8 100644 --- a/client_reference/kosli_begin_trail.md +++ b/client_reference/kosli_begin_trail.md @@ -61,12 +61,12 @@ In other CI systems, set them explicitly to capture repository metadata. View an example of the `kosli begin trail` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bbegin%2Btrail), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Bbegin%2Btrail). + In [this YAML file](https://github.com/cyber-dojo/runner/blob/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e/.github/workflows/main.yml#L78), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/runner-ci/trails/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e?attestation_id=1). View an example of the `kosli begin trail` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Bbegin%2Btrail), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Bbegin%2Btrail). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L55), which created [this Kosli Event](https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c?attestation_id=1). diff --git a/client_reference/kosli_create_attestation-type.md b/client_reference/kosli_create_attestation-type.md index 77d74a9..e2e655d 100644 --- a/client_reference/kosli_create_attestation-type.md +++ b/client_reference/kosli_create_attestation-type.md @@ -56,7 +56,7 @@ All rules must return `true` for the evaluation to pass and the attestation to b View an example of the `kosli create attestation-type` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bcreate%2Battestation-type) + In [this YAML file](https://github.com/cyber-dojo/kosli-attestation-types/blob/7ad343982d42654fdf4cf123c5e7aec44af8e1a7/.github/workflows/main.yml#L56) diff --git a/client_reference/kosli_create_flow.md b/client_reference/kosli_create_flow.md index 75f15eb..b21304b 100644 --- a/client_reference/kosli_create_flow.md +++ b/client_reference/kosli_create_flow.md @@ -47,12 +47,12 @@ You can specify flow parameters in flags. View an example of the `kosli create flow` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bcreate%2Bflow), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=github&command=kosli%2Bcreate%2Bflow). + In [this YAML file](https://github.com/cyber-dojo/runner/blob/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e/.github/workflows/main.yml#L71) View an example of the `kosli create flow` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Bcreate%2Bflow), which created [this Kosli Event](https://app.kosli.com/api/v2/livedocs/cyber-dojo/event?ci=gitlab&command=kosli%2Bcreate%2Bflow). + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c/.gitlab/workflows/main.yml#L53) diff --git a/client_reference/kosli_diff_snapshots.md b/client_reference/kosli_diff_snapshots.md index df14ad2..9673fd0 100644 --- a/client_reference/kosli_diff_snapshots.md +++ b/client_reference/kosli_diff_snapshots.md @@ -52,9 +52,138 @@ Specify SNAPPISH_1 and SNAPPISH_2 by: ## Live Example -To view a live example of 'kosli diff snapshots' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli diff snapshots aws-beta aws-prod --output=json
+To view a live example of 'kosli diff snapshots' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli diff snapshots aws-beta aws-prod --output=json +``` + + +
+ +```json +{ + "snappish1": { + "snapshot_id": "aws-beta#6625", + "artifacts": [ + { + "fingerprint": "4db0e95a793aa0539250f9998bc4fbe10b5d96a339730c20a25b9e763a8a5ff3", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:b3152a1@sha256:4db0e95a793aa0539250f9998bc4fbe10b5d96a339730c20a25b9e763a8a5ff3", + "most_recent_timestamp": 1777883050, + "flow": "creator-ci", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/b3152a10de1f36b7dbe2818c0918af06fd3aca61", + "instance_count": 1 + }, + { + "fingerprint": "e99c33d87e5e6d5098aecf627a89e1408e6ca8394eb2c8923823b74b5bb3567c", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:6f7b1b0@sha256:e99c33d87e5e6d5098aecf627a89e1408e6ca8394eb2c8923823b74b5bb3567c", + "most_recent_timestamp": 1777922159, + "flow": "web-ci", + "commit_url": "https://github.com/cyber-dojo/web/commit/6f7b1b00db599de210e13dd2f7e6d63a10fe6c7b", + "instance_count": 3 + } + ] + }, + "snappish2": { + "snapshot_id": "aws-prod#4357", + "artifacts": [ + { + "fingerprint": "541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:1999d13@sha256:541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "most_recent_timestamp": 1777842905, + "flow": "web-ci", + "commit_url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6", + "instance_count": 3 + }, + { + "fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:65fd2bf@sha256:ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "most_recent_timestamp": 1776256761, + "flow": "creator-ci", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "instance_count": 1 + } + ] + }, + "changed": { + "artifacts": [] + }, + "not-changed": { + "artifacts": [ + { + "fingerprint": "1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:92c0996@sha256:1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "most_recent_timestamp": 1776923549, + "flow": "saver-ci", + "commit_url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751", + "instance_count": 1 + }, + { + "fingerprint": "1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:95ab455@sha256:1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "most_recent_timestamp": 1777956787, + "flow": "languages-start-points-ci", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce", + "instance_count": 1 + }, + { + "fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b@sha256:3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "most_recent_timestamp": 1776923862, + "flow": "dashboard-ci", + "commit_url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "instance_count": 1 + }, + { + "fingerprint": "691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:447231c@sha256:691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "most_recent_timestamp": 1776923208, + "flow": "exercises-start-points-ci", + "commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5", + "instance_count": 1 + }, + { + "fingerprint": "69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:b1ce55b@sha256:69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "most_recent_timestamp": 1776923200, + "flow": "nginx-ci", + "commit_url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "instance_count": 1 + }, + { + "fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5@sha256:b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "most_recent_timestamp": 1777550809, + "flow": "runner-ci", + "commit_url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "instance_count": 3 + }, + { + "fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0@sha256:becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "most_recent_timestamp": 1776923213, + "flow": "differ-ci", + "commit_url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "instance_count": 1 + }, + { + "fingerprint": "cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:9dd6c65@sha256:cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "most_recent_timestamp": 1776923539, + "flow": "custom-start-points-ci", + "commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3", + "instance_count": 1 + } + ] + } +} +``` + +
+
## Examples Use Cases diff --git a/client_reference/kosli_evaluate_input.md b/client_reference/kosli_evaluate_input.md index e67711d..00c1543 100644 --- a/client_reference/kosli_evaluate_input.md +++ b/client_reference/kosli_evaluate_input.md @@ -54,6 +54,16 @@ This accepts inline JSON or a file reference (`@file.json`). | --org string | The Kosli organization. | +## Live Examples in different CI systems + + + + View an example of the `kosli evaluate input` command in GitHub. + + In [this YAML file](https://github.com/cyber-dojo/snyk-scanning/blob/117e18e0cb1eab30b9747ece58327eabfc595b90/tests/test_rego_rules.sh#L153) + + + ## Examples Use Cases These examples all assume that the flags `--api-token`, `--org`, `--host`, (and `--flow`, `--trail` when required), are [set/provided](/getting_started/install/#assigning-flags-via-environment-variables). diff --git a/client_reference/kosli_evaluate_trail.md b/client_reference/kosli_evaluate_trail.md index 6709fa0..210560f 100644 --- a/client_reference/kosli_evaluate_trail.md +++ b/client_reference/kosli_evaluate_trail.md @@ -51,7 +51,7 @@ full data structure available to the policy. Use `--output json` for structured View an example of the `kosli evaluate trail` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bevaluate%2Btrail) + In [this YAML file](https://github.com/cyber-dojo/snyk-scanning/blob/9cc4c900ed581834931a9596a49b5033b7ffa12f/.github/workflows/artifact_snyk_test.yml#L325) diff --git a/client_reference/kosli_fingerprint.md b/client_reference/kosli_fingerprint.md index 945271e..fcf2389 100644 --- a/client_reference/kosli_fingerprint.md +++ b/client_reference/kosli_fingerprint.md @@ -78,7 +78,7 @@ The `.kosli_ignore` will be treated as part of the artifact like any other file, View an example of the `kosli fingerprint` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Bfingerprint) + In [this YAML file](https://github.com/cyber-dojo/snyk-scanning/blob/9cc4c900ed581834931a9596a49b5033b7ffa12f/.github/workflows/artifact_snyk_test.yml#L177) diff --git a/client_reference/kosli_get_attestation.md b/client_reference/kosli_get_attestation.md index 5acdef7..df9b09e 100644 --- a/client_reference/kosli_get_attestation.md +++ b/client_reference/kosli_get_attestation.md @@ -49,9 +49,79 @@ or any of the `--flow`, `--trail` or `--fingerprint` flags. ## Live Example -To view a live example of 'kosli get attestation' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json
+To view a live example of 'kosli get attestation' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json +``` + + +
+ +```json +[ + { + "schema_version": 2, + "attestation_type": "snyk", + "attestation_name": "snyk-container-scan", + "is_compliant": true, + "origin_url": "https://github.com/cyber-dojo/differ/actions/runs/14975901658", + "artifact_fingerprint": "0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0", + "target_artifacts": [ + "differ" + ], + "git_commit_info": { + "sha1": "5ccc5c141fdd1fbd97905b7fe0af87e5a592bfb6", + "message": "Dockerfile - Automated base-image update (#317)\n\nCo-authored-by: JonJagger@users.noreply.github.com <{{ github.actor }}>", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1747062671.0, + "url": "https://github.com/cyber-dojo/differ/commit/5ccc5c141fdd1fbd97905b7fe0af87e5a592bfb6" + }, + "evidence_archive_path": "83acb2bc-2c26-48a7-8b87-90dfcce7/artifact_attestation/05c2fd70-0832-4868-9e56-e268b720/evidence.tgz", + "evidence_archive_fingerprint": "8b671e582ee8c9550bb76fb8cef8cb5b4b9f5481737e42f44ad272c931bd82ba", + "user_data": {}, + "created_at": 1747062776.797778, + "processed_snyk_results": { + "schema_version": 1, + "tool": { + "name": "Snyk Container", + "version": "1.1296.2" + }, + "results": [ + { + "low_count": 0, + "medium_count": 0, + "high_count": 0 + }, + { + "low_count": 0, + "medium_count": 0, + "high_count": 0 + } + ] + }, + "attestation_id": "f7cd9b3a-2738-47e6-be36-689d511d", + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/5ccc5c141fdd1fbd97905b7fe0af87e5a592bfb6?attestation_id=f7cd9b3a-2738-47e6-be36-689d511d", + "reported_by": "ci-pipelines", + "has_audit_package": true, + "_links": { + "self": { + "href": "https://app.kosli.com/api/v2/attestations/cyber-dojo/differ-ci/artifact/0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0/snyk-container-scan" + }, + "evidence": { + "href": "https://app.kosli.com/api/v2/attestations/cyber-dojo/differ-ci/trail/5ccc5c141fdd1fbd97905b7fe0af87e5a592bfb6/attestation/f7cd9b3a-2738-47e6-be36-689d511d/evidence" + } + } + } +] +``` + +
+
## Examples Use Cases diff --git a/client_reference/kosli_get_environment.md b/client_reference/kosli_get_environment.md index c9b318d..b6c1f00 100644 --- a/client_reference/kosli_get_environment.md +++ b/client_reference/kosli_get_environment.md @@ -31,10 +31,41 @@ Get an environment's metadata. | -r, --max-api-retries int | [defaulted] How many times should API calls be retried when the API host is not reachable. (default 3) | | --org string | The Kosli organization. | - ## Live Example -To view a live example of 'kosli get environment' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli get environment aws-prod --output=json
+To view a live example of 'kosli get environment' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli get environment aws-prod --output=json +``` + + +
+ +```json +{ + "org": "cyber-dojo", + "name": "aws-prod", + "type": "ECS", + "description": "The ECS cluster for production cyber-dojo", + "last_modified_at": 1777983298.5339797, + "last_reported_at": 1777983298.5339797, + "state": true, + "include_scaling": false, + "tags": { + "url": "https://cyber-dojo.org/" + }, + "policies": [ + "build-process", + "snyk-scan-aws-prod" + ], + "included_environments": null +} +``` + +
+
diff --git a/client_reference/kosli_get_flow.md b/client_reference/kosli_get_flow.md index 4583378..2f1a5a1 100644 --- a/client_reference/kosli_get_flow.md +++ b/client_reference/kosli_get_flow.md @@ -31,10 +31,36 @@ Get the metadata of a specific flow. | -r, --max-api-retries int | [defaulted] How many times should API calls be retried when the API host is not reachable. (default 3) | | --org string | The Kosli organization. | - ## Live Example -To view a live example of 'kosli get flow' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli get flow dashboard-ci --output=json
+To view a live example of 'kosli get flow' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli get flow dashboard-ci --output=json +``` + + +
+ +```json +{ + "name": "dashboard-ci", + "description": "UX for a group practice dashboard", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: dashboard\n attestations:\n - name: rubocop-lint\n type: junit\n - name: snyk-container-scan\n type: generic\n - name: sonarcloud-scan\n type: sonar\n - name: unit-test\n type: junit\n - name: unit-test-coverage\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "kind": "build" + } +} +``` + +
+
diff --git a/client_reference/kosli_get_snapshot.md b/client_reference/kosli_get_snapshot.md index f2b7d94..a4a3bed 100644 --- a/client_reference/kosli_get_snapshot.md +++ b/client_reference/kosli_get_snapshot.md @@ -51,9 +51,5006 @@ ENVIRONMENT-NAME-OR-EXPRESSION can be specified as follows: ## Live Example -To view a live example of 'kosli get snapshot' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli get snapshot aws-prod --output=json
+To view a live example of 'kosli get snapshot' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli get snapshot aws-prod --output=json +``` + + +
+ +```json +{ + "index": 4357, + "is_latest": true, + "next_snapshot_timestamp": null, + "artifact_compliance_count": { + "true": 10, + "false": 0, + "null": 0 + }, + "timestamp": 1777956838.5302956, + "type": "ECS", + "compliant": true, + "html_url": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4357", + "artifacts": [ + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:95ab455@sha256:1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "creationTimestamp": [ + 1777956787 + ], + "pods": null, + "annotation": { + "type": "started-compliant", + "was": 0, + "now": 1 + }, + "flow_name": "languages-start-points-ci", + "git_commit": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce", + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=c6ff1415-5cd1-48d0-a0df-cbcbcc5e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/a97ed054e38d484a0015cd658f1d593c03ea2a61...95ab455dd7301b20c744f50b1cd015e4396aedce", + "previous_git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 889.0, + "flows": [ + { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "template_reference_name": "languages-start-points", + "git_commit": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce", + "git_commit_info": { + "sha1": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "message": "Merge pull request #204 from cyber-dojo/update-csharp-nunit\n\nEnsure we have the latest csharp-nunit", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777955898.0, + "url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=c6ff1415-5cd1-48d0-a0df-cbcbcc5e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/a97ed054e38d484a0015cd658f1d593c03ea2a61...95ab455dd7301b20c744f50b1cd015e4396aedce", + "previous_git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 889.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "template_reference_name": "languages-start-points", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=eee48a16-8b70-4f29-859c-b7904baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1085da6ce837c6ebc77dda1e23b5de4e3c33380f...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_trail_name": "promote-all-13", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 594794.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/8d3e40c13af6400b975170c90e1c0bb7", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:1999d13@sha256:541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "creationTimestamp": [ + 1777842904, + 1777842905, + 1777842905 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 3, + "now": 3 + }, + "flow_name": "web-ci", + "git_commit": "1999d1303424879336b04fa3310256554aa6cfa6", + "commit_url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6", + "html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=359b4539-989d-48f5-88eb-8a553baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/web/compare/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98...1999d1303424879336b04fa3310256554aa6cfa6", + "previous_git_commit": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/web/commit/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_trail_name": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 1241.0, + "flows": [ + { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "template_reference_name": "web", + "git_commit": "1999d1303424879336b04fa3310256554aa6cfa6", + "commit_url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6", + "git_commit_info": { + "sha1": "1999d1303424879336b04fa3310256554aa6cfa6", + "message": "Enable CSRF token enforcement on POST requests (Phase 2) (#306)\n\nPhase 1 (deployed April 14) set the csrf_token cookie on all responses.\nPhase 2 enables the enforcement check that was left commented out pending\nall users reloading. Adds a global jQuery ajaxSend hook so all POST\nrequests automatically include the token, and updates the controller test\nbase to seed the cookie and merge the token into POST params.\n\nUsers with a kata page open before this deploy will get one 403 on their\nnext test run; reloading the page picks up the new JS and self-heals.\n\nCo-authored-by: Claude Sonnet 4.6 ", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777841663.0, + "url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=359b4539-989d-48f5-88eb-8a553baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/web/compare/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98...1999d1303424879336b04fa3310256554aa6cfa6", + "previous_git_commit": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/web/commit/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_trail_name": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 1241.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "template_reference_name": "web", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=a34a55d8-2118-49ac-8899-aa2b6306", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1085da6ce837c6ebc77dda1e23b5de4e3c33380f...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_trail_name": "promote-all-12", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 480911.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "template_reference_name": "web", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=70de9485-fbcc-4d37-a744-546c44ba", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": 227969.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "template_reference_name": "web", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=24f2f6c9-5fa2-4dbd-8bb5-fc5624f3", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": 227969.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/9560296ee7a54a18afe27e41c76be7c5", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5@sha256:b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "creationTimestamp": [ + 1777550805, + 1777550806, + 1777550809 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 3, + "now": 3 + }, + "flow_name": "runner-ci", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "commit_url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/runner/compare/bcf912346ae0a104698da4560e82d5eb277fc0e9...a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "previous_git_commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/runner/commit/bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_trail_name": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 3201.0, + "flows": [ + { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "template_reference_name": "runner", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "commit_url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/runner/compare/bcf912346ae0a104698da4560e82d5eb277fc0e9...a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "previous_git_commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/runner/commit/bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_trail_name": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 3201.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "template_reference_name": "runner", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=a28dcf25-ff8e-40f5-8adc-c24b10ef", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1a3f516ca3da64bb329c5447dddc8c58751ec82b...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1a3f516ca3da64bb329c5447dddc8c58751ec82b", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1a3f516ca3da64bb329c5447dddc8c58751ec82b", + "previous_trail_name": "promotion-one-42", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 188812.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "template_reference_name": "runner", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=437eec67-3d3d-422a-956e-937f5ca0", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -64130.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "template_reference_name": "runner", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=5f006806-103b-467f-9cf2-610c41ba", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/snyk-scanning/compare/7e307436bf47f2ce550e8e86838f4993b385de5c...117e18e0cb1eab30b9747ece58327eabfc595b90", + "previous_git_commit": "7e307436bf47f2ce550e8e86838f4993b385de5c", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/7e307436bf47f2ce550e8e86838f4993b385de5c", + "previous_trail_name": "runner-0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": -64130.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/bb5a7256bb4445b9821ff8e6e3cf0a86", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b@sha256:3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "creationTimestamp": [ + 1776923862 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "dashboard-ci", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "commit_url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "previous_git_commit": "632127a7f162ad1ac02305a2940888264034364b", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/dashboard/commit/632127a7f162ad1ac02305a2940888264034364b", + "previous_trail_name": "632127a7f162ad1ac02305a2940888264034364b", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 2577.0, + "flows": [ + { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "template_reference_name": "dashboard", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "commit_url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "previous_git_commit": "632127a7f162ad1ac02305a2940888264034364b", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/dashboard/commit/632127a7f162ad1ac02305a2940888264034364b", + "previous_trail_name": "632127a7f162ad1ac02305a2940888264034364b", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 2577.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "dashboard", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=2acc6089-d810-49af-a10f-ff262a82", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 824607.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "template_reference_name": "dashboard", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=b2e65a6a-5b36-46a7-a91a-5c509bd5", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691073.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "template_reference_name": "dashboard", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=583e204e-a961-470e-a45e-d894bff1", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691073.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/0993e7a4118e4a7699ad6eb9c06a4b47", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:92c0996@sha256:1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "creationTimestamp": [ + 1776923549 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "saver-ci", + "git_commit": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "commit_url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751", + "html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "previous_git_commit": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/saver/commit/0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_trail_name": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 2075.0, + "flows": [ + { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "template_reference_name": "saver", + "git_commit": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "commit_url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751", + "git_commit_info": { + "sha1": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#364)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921474.0, + "url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "previous_git_commit": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/saver/commit/0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_trail_name": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 2075.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "saver", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=572576fd-b54a-4556-b8c6-a456fc62", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 824294.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "template_reference_name": "saver", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=feccccc8-41ef-4146-8bfc-b1f1725a", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691386.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "template_reference_name": "saver", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=bceeead3-4d64-4697-8fb0-a84fbce7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691386.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/9e8d3a77fae14af1b3f5fd22dc8185cf", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:9dd6c65@sha256:cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "creationTimestamp": [ + 1776923539 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "custom-start-points-ci", + "git_commit": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3", + "html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=f1d404d2-81f9-4f7a-9a01-9742e3e2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/custom-start-points/compare/8adb92a471e3f5caf65481155d45121a865b67a7...9dd6c657bc443c45c19e81165ff99286e237cfe3", + "previous_git_commit": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_trail_name": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 2530.0, + "flows": [ + { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "template_reference_name": "custom-start-points", + "git_commit": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3", + "git_commit_info": { + "sha1": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "message": "Merge pull request #110 from cyber-dojo/remove-defaulted-aws-rolename\n\nRemove defaulted aws-rolename from snyk-scanning job", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921009.0, + "url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=f1d404d2-81f9-4f7a-9a01-9742e3e2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/custom-start-points/compare/8adb92a471e3f5caf65481155d45121a865b67a7...9dd6c657bc443c45c19e81165ff99286e237cfe3", + "previous_git_commit": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_trail_name": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 2530.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "custom-start-points", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=604eb5a4-324d-4140-a976-19265352", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 824284.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "template_reference_name": "custom-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=3332a11e-91c5-44c9-8daf-c7a67940", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691396.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "template_reference_name": "custom-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=8f0f7459-c270-49fd-8642-58e07238", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691396.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/f009873b96764616a63037619de83dd3", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0@sha256:becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "creationTimestamp": [ + 1776923213 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "differ-ci", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "commit_url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=046919b1-42dd-47f8-8569-912d0259", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/differ/compare/c9bbaa1eceb4b8bdffa065ea7034de23d3364919...30dffd09c3f896a322c65029247abcea3019c43a", + "previous_git_commit": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/differ/commit/c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_trail_name": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 1092.0, + "flows": [ + { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "template_reference_name": "differ", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "commit_url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=046919b1-42dd-47f8-8569-912d0259", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/differ/compare/c9bbaa1eceb4b8bdffa065ea7034de23d3364919...30dffd09c3f896a322c65029247abcea3019c43a", + "previous_git_commit": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/differ/commit/c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_trail_name": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 1092.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "differ", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=a5169b25-0d5c-491c-991e-2c1d389b", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 823958.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "template_reference_name": "differ", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=182c9255-9d29-4ad5-9c5c-d5d99a71", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691722.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "template_reference_name": "differ", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=69fce703-8636-4932-9b82-3025560b", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691722.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/ee14a7db1433415dbcbf9b2a5a983c4d", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:447231c@sha256:691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "creationTimestamp": [ + 1776923208 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "exercises-start-points-ci", + "git_commit": "447231c2018bc0690735b4ee110ca46431162fd5", + "commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5", + "html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "previous_git_commit": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_trail_name": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 2123.0, + "flows": [ + { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "template_reference_name": "exercises-start-points", + "git_commit": "447231c2018bc0690735b4ee110ca46431162fd5", + "commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5", + "git_commit_info": { + "sha1": "447231c2018bc0690735b4ee110ca46431162fd5", + "message": "Merge pull request #117 from cyber-dojo/remove-defaulted-aws-rolename\n\nRemove defaulted aws-rolename from snyk-scanning job", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921085.0, + "url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "previous_git_commit": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_trail_name": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 2123.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "exercises-start-points", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=82549870-9631-4bf3-90f7-13e64e6f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 823953.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "template_reference_name": "exercises-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=6e528299-ee26-4cef-8108-84ebc9a2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691727.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "template_reference_name": "exercises-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=63f17762-9384-450d-b001-78aaa94d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691727.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/a86d9e772a4b43e0b855e0e9d43163ca", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:b1ce55b@sha256:69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "creationTimestamp": [ + 1776923200 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "nginx-ci", + "git_commit": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "commit_url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=8a73edbf-8c34-4371-a0a1-001dffd2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/nginx/compare/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd...b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "previous_git_commit": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/nginx/commit/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_trail_name": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 164853.0, + "flows": [ + { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "template_reference_name": "nginx", + "git_commit": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "commit_url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "git_commit_info": { + "sha1": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "message": "Merge pull request #108 from cyber-dojo/fix-workflow-call-2\n\nFix workflow call", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776758347.0, + "url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=8a73edbf-8c34-4371-a0a1-001dffd2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/nginx/compare/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd...b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "previous_git_commit": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/nginx/commit/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_trail_name": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 164853.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "nginx", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=445f9dbc-9f0f-4b04-bf3f-19ad3199", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promotion-one-34", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 823945.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "template_reference_name": "nginx", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=084a57cf-f6a8-4303-ae83-0aee4c68", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691735.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "template_reference_name": "nginx", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=aff4d03c-afb1-438e-9b60-c5813e72", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691735.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/70cb5b4768f343569f6ffc81a51d984d", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:65fd2bf@sha256:ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "creationTimestamp": [ + 1776256761 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "creator-ci", + "git_commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c5d209a3-9139-4f5b-a553-c6351091", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci", + "deployment_diff": { + "diff_url": "https://gitlab.com/cyber-dojo/creator/-/compare/f89742ee5f0477a7c729bfdeadc84dcbd70492b2...65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "previous_git_commit": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_trail_name": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 4517.0, + "flows": [ + { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "template_reference_name": "creator", + "git_commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c5d209a3-9139-4f5b-a553-c6351091", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci", + "deployment_diff": { + "diff_url": "https://gitlab.com/cyber-dojo/creator/-/compare/f89742ee5f0477a7c729bfdeadc84dcbd70492b2...65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "previous_git_commit": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_trail_name": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 4517.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "template_reference_name": "creator", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c1a47a75-cdd5-446b-b08e-040067c3", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promotion-one-28", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 157506.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "template_reference_name": "artifact", + "git_commit": "8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "commit_url": "https://github.com/cyber-dojo/live-snyk-scans/commit/8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "git_commit_info": { + "sha1": "8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "message": "Remove unnecessary floor() on trail creation timestamp\n\nfloor() was needed for bash integer arithmetic that has since been\nremoved; .created_at is now only used as a JSON number, which supports\nfloats natively.", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776347865.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/8440baadcaccb4ceeb8ba26b25579eb16cc447d6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-archived-at-1776759327/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=240caf97-910e-4c8b-91dd-ef048d65", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-archived-at-1776759327", + "deployment_diff": null, + "commit_lead_time": -91104.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "template_reference_name": "creator", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=893e3314-fdff-4f62-b899-2f874504", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -1358174.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "template_reference_name": "creator", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=a394a189-0af2-4900-8278-f11ac37c", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -1358174.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/712400a03ac04a9fb22935535516a317", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "creationTimestamp": [ + 1777842906 + ], + "pods": null, + "annotation": { + "type": "exited", + "was": 1, + "now": 0 + }, + "flow_name": "languages-start-points-ci", + "git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_git_commit": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_trail_name": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 819.0, + "flows": [ + { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "template_reference_name": "languages-start-points", + "git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "git_commit_info": { + "sha1": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "message": "Merge pull request #203 from cyber-dojo/update-python-pytest\n\nUpdate python-pytest", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777842087.0, + "url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_git_commit": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_trail_name": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 819.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "template_reference_name": "languages-start-points", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=fd354e7f-c2ef-4e37-bb92-49b6ce16", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-11", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 480913.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "template_reference_name": "languages-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=61b86531-a2c1-4c75-96a0-b5497786", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": 227971.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "template_reference_name": "languages-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=136bb00b-9e03-4924-89d5-6bc33be2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": 227971.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/c83d5207d2af4ecdac8d64627f8fb7bf", + "cluster_name": null, + "service_name": null + } + } + ], + "applied_policies": [ + { + "id": "93d8505f-bce5-4c7c-a2c8-f98236c8", + "name": "snyk-scan-aws-prod", + "version": 1, + "policy_dump": { + "schema_version": "1", + "artifacts": { + "provenance": { + "required": false, + "exceptions": [] + }, + "trail_compliance": { + "required": false, + "exceptions": [] + }, + "attestations": [ + { + "if_condition": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + ] + } + }, + "failing_artifacts": [] + }, + { + "id": "e398f263-0770-42d3-bca1-b417aba0", + "name": "build-process", + "version": 6, + "policy_dump": { + "schema_version": "1", + "artifacts": { + "provenance": { + "required": true, + "exceptions": [ + { + "if_condition": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + }, + "trail_compliance": { + "required": true, + "exceptions": [ + { + "if_condition": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + }, + "attestations": [ + { + "if_condition": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + ] + } + }, + "failing_artifacts": [] + } + ] +} +``` + +
+
## Examples Use Cases diff --git a/client_reference/kosli_get_trail.md b/client_reference/kosli_get_trail.md index 72a571b..d5d8219 100644 --- a/client_reference/kosli_get_trail.md +++ b/client_reference/kosli_get_trail.md @@ -32,10 +32,733 @@ Get the metadata of a specific trail. | -r, --max-api-retries int | [defaulted] How many times should API calls be retried when the API host is not reachable. (default 3) | | --org string | The Kosli organization. | - ## Live Example -To view a live example of 'kosli get trail' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json
+To view a live example of 'kosli get trail' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json +``` + + +
+ +```json +{ + "name": "1159a6f1193150681b8484545150334e89de6c1c", + "description": "zhelezovartem - ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c" + }, + "origin_url": "https://github.com/cyber-dojo/dashboard/actions/runs/8450201221", + "user_data": {}, + "repo_ids": [], + "last_modified_at": 1714814180.0268202, + "created_at": 1711534991.83214, + "compliance_status": { + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "pull-request", + "attestation_type": null, + "attestation_id": "76a44125-eccc-4fb7-8260-d4ff1866", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + } + ], + "artifacts_statuses": { + "dashboard": { + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_id": "8803e410-8ab6-4ba7-af7a-4c769a92", + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "aws-beta-snyk-scan", + "attestation_type": null, + "attestation_id": "60bde45d-4724-4c46-a963-85fe1972", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "aws-prod-snyk-scan", + "attestation_type": null, + "attestation_id": "333725e9-e82b-4a22-a81c-721adbae", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "snyk-container-scan", + "attestation_type": null, + "attestation_id": "70421c36-d79f-4813-8635-e77b760a", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "snyk-code-scan", + "attestation_type": null, + "attestation_id": "bb3acddd-5336-4b6a-a7ea-e5b3e972", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "lint", + "attestation_type": null, + "attestation_id": "d3752b67-aefc-444c-a7dc-8115c5ef", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + } + ], + "unexpected": false, + "evaluated_at": 1714814180.0264866, + "flow_template_id": null + } + }, + "evaluated_at": 1714814180.0265083, + "flow_template_id": "cd1860d5-dc06-41e7-9a3b-be078e7f" + }, + "template": { + "version": 1, + "trail": { + "attestations": [ + { + "name": "pull-request", + "type": "pull_request" + } + ], + "artifacts": [ + { + "name": "dashboard", + "attestations": [ + { + "name": "lint", + "type": "generic" + }, + { + "name": "snyk-code-scan", + "type": "snyk" + }, + { + "name": "snyk-container-scan", + "type": "snyk" + } + ] + } + ] + }, + "content": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: dashboard\n attestations:\n - name: lint\n type: generic\n - name: snyk-code-scan\n type: snyk\n - name: snyk-container-scan\n type: snyk\n" + }, + "compliance_state": "COMPLIANT", + "is_compliant": true, + "events": [ + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711534991.83214, + "type": "trail_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "name": "1159a6f1193150681b8484545150334e89de6c1c", + "creating_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "description": "zhelezovartem - ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c" + }, + "template_id": "cd1860d5-dc06-41e7-9a3b-be078e7f", + "origin_url": "https://github.com/cyber-dojo/dashboard/actions/runs/8450201221", + "user_data": "{}" + } + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535010.2210565, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "attestation_type": "pull_request", + "is_compliant": true, + "attestation_id": "76a44125-eccc-4fb7-8260-d4ff1866", + "template_reference_name": "pull-request" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535018.95352, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "d3752b67-aefc-444c-a7dc-8115c5ef", + "template_reference_name": "lint", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535027.3128896, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "artifact_id": "8803e410-8ab6-4ba7-af7a-4c769a92", + "template_reference_name": "dashboard", + "git_commit": "1159a6f1193150681b8484545150334e89de6c1c" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535054.2601902, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "bb3acddd-5336-4b6a-a7ea-e5b3e972", + "template_reference_name": "snyk-code-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535059.1866503, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "1159a6f1193150681b8484545150334e89de6c1c", + "message": "ci: update gh-workflow-tf-plan-apply action to get rid of deprecations", + "author": "Artem Zhelezov <36639304+zhelezovartem@users.noreply.github.com>", + "author_username": null, + "branch": "main", + "timestamp": 1711534976.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/1159a6f1193150681b8484545150334e89de6c1c", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "70421c36-d79f-4813-8635-e77b760a", + "template_reference_name": "snyk-container-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535086.4269938, + "type": "artifact_approval_reported", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "approval_id": "fd9de9dd-37e7-4680-8353-c5082609", + "approval_number": 70, + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "state": "APPROVED", + "reviewer": "external://zhelezovartem" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535216.8064907, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 3429, + "replica_number": 1, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535375.2659616, + "type": "artifact_approval_reported", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "approval_id": "2380af36-a5ff-4c52-ba30-a8483bb9", + "approval_number": 71, + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "state": "APPROVED", + "reviewer": "external://zhelezovartem" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711535487.4472156, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 2509, + "replica_number": 1, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711789650.9179683, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "95e89ff9-077d-4528-a09d-c7898047", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1711790067.348031, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "0a45d133-25c4-46d2-bc59-27fece47", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1712394532.589705, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "e616f223-2016-4c28-85c5-00176db6", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1712394916.8546758, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "a7d0fdd4-33a0-4e50-8a3b-d3928e1f", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1712999261.7330244, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "3e4ef819-db8e-4f1f-b665-1ac0e061", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1712999606.647108, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "d6a3266d-7e43-426f-853c-a2bab6f2", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1713604064.640139, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "b7a8fb46-f99e-4228-96a2-7cd55355", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1713604482.316237, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "a58e5d10-44fa-4918-a732-283d8541", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714208898.3243415, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "020b7686-d2f2-4d30-b890-cbfe56c2", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714209298.3530078, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "555c60fe-769e-40b9-98df-fc181634", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714563833.9450486, + "type": "artifact_stopped_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 3510, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714564003.09481, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 3513, + "replica_number": 1, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714813781.150341, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "333725e9-e82b-4a22-a81c-721adbae", + "template_reference_name": "aws-prod-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714814179.9960504, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "message": "Run ci workflows with fixed Kosli trail-name", + "author": "JonJagger ", + "author_username": null, + "branch": "main", + "timestamp": 1711195944.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/cf3896a8bbd2f74c9e36336b69d8ee64eae1ff25", + "parents": null + }, + "repo_info": null, + "attestation_type": "snyk", + "is_compliant": true, + "attestation_id": "60bde45d-4724-4c46-a963-85fe1972", + "template_reference_name": "aws-beta-snyk-scan", + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "artifact_name": "cyberdojo/dashboard:1159a6f", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714832154.1066768, + "type": "artifact_stopped_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 3539, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "7cc627bd-78ff-4051-b7b8-ef46fa15", + "timestamp": 1714832517.3628683, + "type": "artifact_stopped_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "dddd83bf5038e81c228b222f01a0184ce2a8492cb45075b66be5baf5be803ca1", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 2592, + "template_reference_name": "dashboard" + } + ], + "created_by": "ci-pipelines", + "flow": { + "name": "dashboard-ci", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "kind": "build" + } + }, + "external_urls": null, + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/trails/1159a6f1193150681b8484545150334e89de6c1c" +} +``` + +
+
diff --git a/client_reference/kosli_list_environments.md b/client_reference/kosli_list_environments.md index f017b2d..168d812 100644 --- a/client_reference/kosli_list_environments.md +++ b/client_reference/kosli_list_environments.md @@ -31,10 +31,107 @@ List environments for an org. | -r, --max-api-retries int | [defaulted] How many times should API calls be retried when the API host is not reachable. (default 3) | | --org string | The Kosli organization. | - ## Live Example -To view a live example of 'kosli list environments' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli list environments --output=json
+To view a live example of 'kosli list environments' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli list environments --output=json +``` + + +
+ +```json +[ + { + "org": "cyber-dojo", + "name": "aws-beta", + "type": "ECS", + "description": "The ECS cluster for staging cyber-dojo", + "last_modified_at": 1777983324.0257177, + "last_reported_at": 1777983324.0257177, + "state": true, + "include_scaling": false, + "tags": { + "url": "https://beta.cyber-dojo.org/" + }, + "policies": [ + "build-process", + "snyk-scan-aws-beta" + ], + "included_environments": null + }, + { + "org": "cyber-dojo", + "name": "aws-prod", + "type": "ECS", + "description": "The ECS cluster for production cyber-dojo", + "last_modified_at": 1777983298.5339797, + "last_reported_at": 1777983298.5339797, + "state": true, + "include_scaling": false, + "tags": { + "url": "https://cyber-dojo.org/" + }, + "policies": [ + "build-process", + "snyk-scan-aws-prod" + ], + "included_environments": null + }, + { + "org": "cyber-dojo", + "name": "production", + "type": "logical", + "description": "Production environments for cyber-dojo", + "last_modified_at": 1723105767.5621033, + "last_reported_at": null, + "state": true, + "include_scaling": false, + "tags": {}, + "policies": null, + "included_environments": [ + "aws-prod", + "terraform-state-differ-prod" + ] + }, + { + "org": "cyber-dojo", + "name": "terraform-state-differ-beta", + "type": "S3", + "description": "Terraform state file of the differ service for staging cyber-dojo", + "last_modified_at": 1764591277.5301485, + "last_reported_at": 1744010496.9813983, + "state": true, + "include_scaling": false, + "tags": {}, + "policies": [ + "auto-generated-no-provenance-required" + ], + "included_environments": null + }, + { + "org": "cyber-dojo", + "name": "terraform-state-differ-prod", + "type": "S3", + "description": "Terraform state file of the differ service for production cyber-dojo", + "last_modified_at": 1764591277.811534, + "last_reported_at": 1744010523.8133755, + "state": true, + "include_scaling": false, + "tags": {}, + "policies": [ + "auto-generated-no-provenance-required" + ], + "included_environments": null + } +] +``` + +
+
diff --git a/client_reference/kosli_list_flows.md b/client_reference/kosli_list_flows.md index fb2b521..5fb10a3 100644 --- a/client_reference/kosli_list_flows.md +++ b/client_reference/kosli_list_flows.md @@ -31,10 +31,243 @@ List flows for an org. | -r, --max-api-retries int | [defaulted] How many times should API calls be retried when the API host is not reachable. (default 3) | | --org string | The Kosli organization. | - ## Live Example -To view a live example of 'kosli list flows' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli list flows --output=json
+To view a live example of 'kosli list flows' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli list flows --output=json +``` + + +
+ +```json +[ + { + "name": "creator-ci", + "description": "UX for Group/Kata creation", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations: []\n artifacts:\n - name: artifact\n attestations: []\n", + "repo_url": "https://gitlab.com/cyber-dojo/creator", + "tags": { + "ci": "gitlab", + "repo_url": "https://gitlab.com/cyber-dojo/creator", + "kind": "build" + } + }, + { + "name": "custom-start-points-ci", + "description": "Custom exercises choices", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: custom-start-points\n attestations:\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/custom-start-points", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/custom-start-points", + "kind": "build" + } + }, + { + "name": "dashboard-ci", + "description": "UX for a group practice dashboard", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: dashboard\n attestations:\n - name: rubocop-lint\n type: junit\n - name: snyk-container-scan\n type: generic\n - name: sonarcloud-scan\n type: sonar\n - name: unit-test\n type: junit\n - name: unit-test-coverage\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "kind": "build" + } + }, + { + "name": "differ-ci", + "description": "Diff files from two traffic-lights", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: differ\n attestations:\n - name: rubocop-lint\n type: junit\n - name: unit-test\n type: junit\n - name: unit-test-metrics\n type: custom:test-metrics\n - name: unit-test-coverage-metrics\n type: custom:coverage-metrics\n - name: integration-test\n type: junit\n - name: integration-test-metrics\n type: custom:test-metrics\n - name: integration-test-coverage-metrics\n type: custom:coverage-metrics\n - name: sonarcloud-scan\n type: sonar\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/differ", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/differ", + "kind": "build" + } + }, + { + "name": "differ-ci-tf", + "description": "Terraform human-readable plan and state file fingerprint", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: tf-plan\n type: generic\n artifacts:\n - name: tf-state\n", + "repo_url": "https://github.com/cyber-dojo/differ", + "tags": {} + }, + { + "name": "docker-base-ci", + "description": "Build cyber-dojo/docker-base image", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n artifacts:\n - name: docker-base\n attestations:\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/docker-base", + "tags": {} + }, + { + "name": "exercises-start-points-ci", + "description": "Exercises choices", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: exercises-start-points\n attestations:\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/exercises-start-points", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/exercises-start-points", + "kind": "build" + } + }, + { + "name": "languages-start-points-ci", + "description": "Language+TestFramework choices", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: languages-start-points\n attestations:\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/languages-start-points", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/languages-start-points", + "kind": "build" + } + }, + { + "name": "nginx-ci", + "description": "Reverse proxy", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: nginx\n attestations:\n - name: snyk-container-scan\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/nginx", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/nginx", + "kind": "build" + } + }, + { + "name": "production-promotion", + "description": "Promotes sets of Artifacts from aws-beta to aws-prod", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: one-promotion\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/aws-prod-co-promotion", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/aws-prod-co-promotion", + "kind": "release" + } + }, + { + "name": "production-server-access", + "description": "Flow to track production server access", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations:\n - name: command-logs\n type: generic\n - name: user-identity\n type: generic\n - name: service-identity\n type: generic\n - name: sso-session-data\n type: generic\n", + "repo_url": "", + "tags": {} + }, + { + "name": "runner-ci", + "description": "Test runner", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: runner\n attestations:\n - name: rubocop-lint\n type: junit\n\n - name: snyk-container-scan\n type: generic\n\n - name: unit-test\n type: junit\n - name: unit-test-metrics\n type: custom:test-metrics\n - name: unit-test-coverage-metrics\n type: custom:coverage-metrics\n\n - name: integration-test\n type: junit\n - name: integration-test-metrics\n type: custom:test-metrics\n - name: integration-test-coverage-metrics\n type: custom:coverage-metrics\n", + "repo_url": "https://github.com/cyber-dojo/runner", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/runner", + "kind": "build" + } + }, + { + "name": "saver-ci", + "description": "Group/Kata model+persistence", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n artifacts:\n - name: saver\n attestations:\n - name: snyk-container-scan\n type: generic\n\n - name: unit-test\n type: junit\n - name: unit-test-metrics\n type: custom:test-metrics\n - name: unit-test-coverage-metrics\n type: custom:coverage-metrics\n - name: integration-test\n type: junit\n - name: integration-test-metrics\n type: custom:test-metrics\n - name: integration-test-coverage-metrics\n type: custom:coverage-metrics\n\n", + "repo_url": "https://github.com/cyber-dojo/saver", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/saver", + "kind": "build" + } + }, + { + "name": "secrets", + "description": "Kosli new/expiring secrets check", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations: []\n artifacts:\n - name: artifact\n attestations: []\n", + "repo_url": "", + "tags": { + "ci": "github", + "kind": "run", + "repo_url": "https://github.com/cyber-dojo/secrets" + } + }, + { + "name": "snyk-vulns-aws-beta", + "description": "", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations: []\n artifacts:\n - name: artifact\n attestations: []\n", + "repo_url": "https://github.com/cyber-dojo/snyk-scanning", + "tags": { + "ci": "github", + "kind": "run", + "workflow_url": "https://github.com/cyber-dojo/snyk-scanning/blob/main/.github/workflows/aws-beta.yml" + } + }, + { + "name": "snyk-vulns-aws-prod", + "description": "", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations: []\n artifacts:\n - name: artifact\n attestations: []\n", + "repo_url": "https://github.com/cyber-dojo/snyk-scanning", + "tags": { + "ci": "github", + "kind": "run", + "workflow_url": "https://github.com/cyber-dojo/snyk-scanning/blob/main/.github/workflows/aws-prod.yml" + } + }, + { + "name": "terraform-base-infra-prs", + "description": "Kosli flow to track terraform PRs for base infra", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\ntrail:\n attestations:\n - name: tf-plan\n type: generic\n - name: tf-apply-plan\n type: generic\n - name: pull-request\n type: pull_request\n - name: tf-validation\n type: generic", + "repo_url": "", + "tags": {} + }, + { + "name": "web-ci", + "description": "UX for practicing TDD", + "visibility": "private", + "org": "cyber-dojo", + "template": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n\n artifacts:\n - name: web\n attestations:\n - name: snyk-container-scan\n type: generic\n - name: provenance-attestation\n type: generic\n - name: sbom\n type: generic\n", + "repo_url": "https://github.com/cyber-dojo/web", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/web", + "kind": "build" + } + } +] +``` + +
+
diff --git a/client_reference/kosli_list_snapshots.md b/client_reference/kosli_list_snapshots.md index 9b8be27..6d600c7 100644 --- a/client_reference/kosli_list_snapshots.md +++ b/client_reference/kosli_list_snapshots.md @@ -50,9 +50,130 @@ Either expression can be omitted to default to NOW. ## Live Example -To view a live example of 'kosli list snapshots' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli list snapshots aws-prod --output=json
+To view a live example of 'kosli list snapshots' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli list snapshots aws-prod --output=json +``` + + +
+ +```json +[ + { + "index": 4357, + "from": 1777956838.5302956, + "to": 0.0, + "compliant": true, + "duration": 26497.173085689545 + }, + { + "index": 4356, + "from": 1777954558.5092592, + "to": 1777956838.5302956, + "compliant": true, + "duration": 2280.02103638649 + }, + { + "index": 4355, + "from": 1777954498.4239645, + "to": 1777954558.5092592, + "compliant": true, + "duration": 60.08529472351074 + }, + { + "index": 4354, + "from": 1777954438.5998223, + "to": 1777954498.4239645, + "compliant": true, + "duration": 59.82414221763611 + }, + { + "index": 4353, + "from": 1777869538.5253296, + "to": 1777954438.5998223, + "compliant": true, + "duration": 84900.07449269295 + }, + { + "index": 4352, + "from": 1777869478.5084555, + "to": 1777869538.5253296, + "compliant": true, + "duration": 60.01687407493591 + }, + { + "index": 4351, + "from": 1777842958.6060224, + "to": 1777869478.5084555, + "compliant": true, + "duration": 26519.902433156967 + }, + { + "index": 4350, + "from": 1777783138.5161338, + "to": 1777842958.6060224, + "compliant": true, + "duration": 59820.08988857269 + }, + { + "index": 4349, + "from": 1777783085.6064026, + "to": 1777783138.5161338, + "compliant": true, + "duration": 52.90973114967346 + }, + { + "index": 4348, + "from": 1777783018.5123496, + "to": 1777783085.6064026, + "compliant": true, + "duration": 67.09405303001404 + }, + { + "index": 4347, + "from": 1777695478.6151357, + "to": 1777783018.5123496, + "compliant": true, + "duration": 87539.89721393585 + }, + { + "index": 4346, + "from": 1777695418.5493166, + "to": 1777695478.6151357, + "compliant": true, + "duration": 60.06581902503967 + }, + { + "index": 4345, + "from": 1777695358.5312326, + "to": 1777695418.5493166, + "compliant": true, + "duration": 60.01808404922485 + }, + { + "index": 4344, + "from": 1777644058.4073718, + "to": 1777695358.5312326, + "compliant": true, + "duration": 51300.12386083603 + }, + { + "index": 4343, + "from": 1777643998.3954618, + "to": 1777644058.4073718, + "compliant": true, + "duration": 60.01190996170044 + } +] +``` + +
+
## Examples Use Cases diff --git a/client_reference/kosli_log_environment.md b/client_reference/kosli_log_environment.md index a76610e..b18368b 100644 --- a/client_reference/kosli_log_environment.md +++ b/client_reference/kosli_log_environment.md @@ -51,9 +51,651 @@ Either expression can be omitted to default to NOW. ## Live Example -To view a live example of 'kosli log environment' you can run the commands below (for the cyber-dojo demo organization).
Run the commands below and view the output.
export KOSLI_ORG=cyber-dojo
-export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A  # read-only
-kosli log environment aws-prod --output=json
+To view a live example of 'kosli log environment' you can run the command below (for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization). + +```shell +export KOSLI_ORG=cyber-dojo +# The API token below is read-only +export KOSLI_API_TOKEN=Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A +kosli log environment aws-prod --output=json +``` + + +
+ +```json +[ + { + "environment_name": "aws-prod", + "snapshot_index": 4357, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:95ab455@sha256:1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "sha256": "1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "description": "1 instance started running (from 0 to 1)", + "reported_at": 1777956838.5302956, + "pipeline": "languages-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "languages-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "started-compliant", + "code_diff": "https://github.com/cyber-dojo/languages-start-points/compare/a97ed054e38d484a0015cd658f1d593c03ea2a61...95ab455dd7301b20c744f50b1cd015e4396aedce", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/languages-start-points-ci/fingerprint/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "html": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=c6ff1415-5cd1-48d0-a0df-cbcbcc5e" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4357", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4357" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4357, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "sha256": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "description": "1 instance stopped running (from 1 to 0)", + "reported_at": 1777956838.5302956, + "pipeline": "languages-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "languages-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "exited", + "code_diff": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/languages-start-points-ci/fingerprint/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "html": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4357", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4357" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4356, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:65fd2bf@sha256:ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "sha256": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "description": "1 instance changed", + "reported_at": 1777954558.5092592, + "pipeline": "creator-ci", + "deployments": [], + "flows": [ + { + "flow_name": "creator-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-archived-at-1776759327", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://gitlab.com/cyber-dojo/creator/-/compare/f89742ee5f0477a7c729bfdeadc84dcbd70492b2...65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/creator-ci/fingerprint/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "html": "https://app.kosli.com/cyber-dojo/flows/creator-ci/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c5d209a3-9139-4f5b-a553-c6351091" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4356", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4356" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4356, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5@sha256:b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "sha256": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "description": "3 instances changed", + "reported_at": 1777954558.5092592, + "pipeline": "runner-ci", + "deployments": [], + "flows": [ + { + "flow_name": "runner-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "changed", + "code_diff": "https://github.com/cyber-dojo/runner/compare/bcf912346ae0a104698da4560e82d5eb277fc0e9...a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/runner-ci/fingerprint/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "html": "https://app.kosli.com/cyber-dojo/flows/runner-ci/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=fe3ed5e5-0ed1-4cb8-8d5a-57d636d7" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4356", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4356" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:b1ce55b@sha256:69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "sha256": "69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "nginx-ci", + "deployments": [], + "flows": [ + { + "flow_name": "nginx-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "changed", + "code_diff": "https://github.com/cyber-dojo/nginx/compare/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd...b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/nginx-ci/fingerprint/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "html": "https://app.kosli.com/cyber-dojo/flows/nginx-ci/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=8a73edbf-8c34-4371-a0a1-001dffd2" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "sha256": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "languages-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "languages-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/languages-start-points-ci/fingerprint/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "html": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0@sha256:becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "sha256": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "differ-ci", + "deployments": [], + "flows": [ + { + "flow_name": "differ-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/differ/compare/c9bbaa1eceb4b8bdffa065ea7034de23d3364919...30dffd09c3f896a322c65029247abcea3019c43a", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/differ-ci/fingerprint/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "html": "https://app.kosli.com/cyber-dojo/flows/differ-ci/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=046919b1-42dd-47f8-8569-912d0259" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:1999d13@sha256:541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "sha256": "541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "description": "3 instances changed", + "reported_at": 1777954498.4239645, + "pipeline": "web-ci", + "deployments": [], + "flows": [ + { + "flow_name": "web-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "changed", + "code_diff": "https://github.com/cyber-dojo/web/compare/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98...1999d1303424879336b04fa3310256554aa6cfa6", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/web-ci/fingerprint/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "html": "https://app.kosli.com/cyber-dojo/flows/web-ci/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=359b4539-989d-48f5-88eb-8a553baf" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:92c0996@sha256:1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "sha256": "1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "saver-ci", + "deployments": [], + "flows": [ + { + "flow_name": "saver-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/saver-ci/fingerprint/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "html": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b@sha256:3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "sha256": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "dashboard-ci", + "deployments": [], + "flows": [ + { + "flow_name": "dashboard-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/dashboard-ci/fingerprint/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "html": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4355, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:447231c@sha256:691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "sha256": "691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "description": "1 instance changed", + "reported_at": 1777954498.4239645, + "pipeline": "exercises-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "exercises-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/exercises-start-points-ci/fingerprint/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "html": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4355", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4355" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4354, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:92c0996@sha256:1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "sha256": "1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "description": "1 instance changed", + "reported_at": 1777954438.5998223, + "pipeline": "saver-ci", + "deployments": [], + "flows": [ + { + "flow_name": "saver-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/saver-ci/fingerprint/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "html": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4354", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4354" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4354, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "sha256": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "description": "1 instance changed", + "reported_at": 1777954438.5998223, + "pipeline": "languages-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "languages-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/languages-start-points-ci/fingerprint/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "html": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4354", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4354" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4354, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b@sha256:3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "sha256": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "description": "1 instance changed", + "reported_at": 1777954438.5998223, + "pipeline": "dashboard-ci", + "deployments": [], + "flows": [ + { + "flow_name": "dashboard-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "changed", + "code_diff": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/dashboard-ci/fingerprint/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "html": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4354", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4354" + } + } + }, + { + "environment_name": "aws-prod", + "snapshot_index": 4354, + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:447231c@sha256:691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "sha256": "691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "description": "1 instance changed", + "reported_at": 1777954438.5998223, + "pipeline": "exercises-start-points-ci", + "deployments": [], + "flows": [ + { + "flow_name": "exercises-start-points-ci", + "deployments": null + }, + { + "flow_name": "production-promotion", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-prod", + "deployments": null + }, + { + "flow_name": "snyk-vulns-aws-beta", + "deployments": null + } + ], + "artifact_compliance": true, + "snapshot_compliance": true, + "type": "updated-provenance", + "code_diff": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "_links": { + "artifact": { + "self": "https://app.kosli.com/api/v2/artifacts/cyber-dojo/exercises-start-points-ci/fingerprint/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "html": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550" + }, + "snapshot": { + "self": "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/4354", + "html": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4354" + } + } + } +] +``` + +
+
## Examples Use Cases diff --git a/client_reference/kosli_report_approval.md b/client_reference/kosli_report_approval.md index 653d671..9f449e4 100644 --- a/client_reference/kosli_report_approval.md +++ b/client_reference/kosli_report_approval.md @@ -65,12 +65,12 @@ registry without needing a local Docker daemon. View an example of the `kosli report approval` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Breport%2Bapproval) + In [this YAML file](https://github.com/cyber-dojo/differ/blob/30dffd09c3f896a322c65029247abcea3019c43a/.github/workflows/main.yml#L358) View an example of the `kosli report approval` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Breport%2Bapproval) + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/48bdbd3b059d45489e8ae5f9f680f48bc6201ad8/.gitlab/workflows/main.yml#L200) diff --git a/client_reference/kosli_tag.md b/client_reference/kosli_tag.md index bf69078..03765d0 100644 --- a/client_reference/kosli_tag.md +++ b/client_reference/kosli_tag.md @@ -42,12 +42,12 @@ use --set to add or update tags, and --unset to remove tags. View an example of the `kosli tag` command in GitHub. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=github&command=kosli%2Btag) + In [this YAML file](https://github.com/cyber-dojo/aws-prod-co-promotion/blob/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa/.github/workflows/promote_one.yml#L74) View an example of the `kosli tag` command in GitLab. - In [this YAML file](https://app.kosli.com/api/v2/livedocs/cyber-dojo/yaml?ci=gitlab&command=kosli%2Btag) + In [this YAML file](https://gitlab.com/cyber-dojo/creator/-/blob/48bdbd3b059d45489e8ae5f9f680f48bc6201ad8/.gitlab/workflows/main.yml#L52) diff --git a/scripts/add_livedocs.py b/scripts/add_livedocs.py new file mode 100644 index 0000000..bb38a7d --- /dev/null +++ b/scripts/add_livedocs.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +""" +Strip any existing live-docs sections from client_reference .md files and +regenerate them with static resolved content, driven by _MODIFIERS and _CLI_COMMANDS data. + +Usage: + python scripts/add_livedocs.py + python scripts/add_livedocs.py --docs-dir path/to/client_reference/ +""" + +import argparse +import os +import re +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from live_docs_modifiers_data import has_command, cis_for, has_trail_event +from live_docs_queries_data import has_cli_command, full_command as cli_full_command +from live_docs_fetch import ( + yaml_url as _resolve_yaml_url, + event_url as _resolve_event_url, + fetch_cli_json, +) + +_KOSLI_API_TOKEN = "Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A" + +_CI_ORDER = ["github", "gitlab"] +_CI_DISPLAY = {"github": "GitHub", "gitlab": "GitLab"} + +_FRONTMATTER = re.compile(r'^---\n(.*?)\n---', re.DOTALL) +_TITLE = re.compile(r'^title:\s*"([^"]+)"', re.MULTILINE) + +_LIVE_MODIFIERS_SECTION = re.compile( + r'## Live Examples in different CI systems\n.*?(?=## |\Z)', + re.DOTALL, +) +_LIVE_CLI_SECTION = re.compile( + r'## Live Example\n.*?(?=## |\Z)', + re.DOTALL, +) + + +def command_from_text(text): + """Return the CLI command name from the frontmatter title, or None if not found.""" + fm = _FRONTMATTER.match(text) + if not fm: + return None + title = _TITLE.search(fm.group(1)) + if not title: + return None + return title.group(1) + + +def yaml_url(command, ci): + """Return the resolved static URL for a YAML live example.""" + return _resolve_yaml_url(command, ci) + + +def event_url(command, ci): + """Return the resolved static URL for a Kosli Event live example.""" + return _resolve_event_url(command, ci) + + +def generate_modifiers_section(command): + """Return the full MDX live-docs section string for a modifier command.""" + parts = ["## Live Examples in different CI systems\n\n\n"] + for ci in (ci for ci in _CI_ORDER if ci in list(cis_for(command))): + display = _CI_DISPLAY[ci] + parts.append(f'\t\n') + parts.append(f'\tView an example of the `{command}` command in {display}.\n\n') + parts.append(f'\tIn [this YAML file]({yaml_url(command, ci)})') + if has_trail_event(command, ci): + resolved_event = event_url(command, ci) + if resolved_event: + parts.append(f', which created [this Kosli Event]({resolved_event}).') + parts.append('\n\t\n') + parts.append('\n\n') + return ''.join(parts) + + +def generate_cli_section(command): + """Return the full MDX live-docs section string for a CLI query command.""" + full_cmd = cli_full_command(command) + cli_json = fetch_cli_json(command) + + parts = [ + "## Live Example\n\n", + f"To view a live example of '{command}' you can run the command below ", + "(for the [cyber-dojo](https://app.kosli.com/cyber-dojo) demo organization).\n\n", + "```shell\n", + "export KOSLI_ORG=cyber-dojo\n", + "# The API token below is read-only\n", + f"export KOSLI_API_TOKEN={_KOSLI_API_TOKEN}\n", + f"{full_cmd}\n", + "```\n\n", + ] + + if cli_json: + parts += [ + '\n', + '
\n\n', + "```json\n", + cli_json, + "\n```\n\n", + "
\n", + "
\n\n", + ] + + return ''.join(parts) + + +def resolve_file(filepath): + """Strip and regenerate the live-docs sections in one file. Returns True if modified.""" + with open(filepath, 'r', encoding='utf-8') as f: + text = f.read() + + command = command_from_text(text) + if command is None: + return False + + new_text = _LIVE_MODIFIERS_SECTION.sub('', text) + new_text = _LIVE_CLI_SECTION.sub('', new_text) + + if has_command(command): + section = generate_modifiers_section(command) + if '## Examples Use Cases' in new_text: + new_text = new_text.replace('## Examples Use Cases', section + '## Examples Use Cases', 1) + else: + new_text = new_text.rstrip('\n') + '\n\n' + section + + if has_cli_command(command): + section = generate_cli_section(command) + if '## Examples Use Cases' in new_text: + new_text = new_text.replace('## Examples Use Cases', section + '## Examples Use Cases', 1) + else: + new_text = new_text.rstrip('\n') + '\n\n' + section + + if new_text == text: + return False + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(new_text) + return True + + +def main(): + """Strip and regenerate live-docs sections in all CLI reference markdown files.""" + parser = argparse.ArgumentParser( + description='Regenerate live-docs sections in CLI reference markdown files', + ) + parser.add_argument( + '--docs-dir', + default=os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'client_reference'), + help='Directory containing CLI reference markdown files (default: client_reference/)', + ) + args = parser.parse_args() + + docs_dir = os.path.normpath(args.docs_dir) + if not os.path.isdir(docs_dir): + print(f'Error: Directory {docs_dir} does not exist', file=sys.stderr) + sys.exit(1) + + modified = 0 + for filename in sorted(os.listdir(docs_dir)): + if not filename.endswith('.md'): + continue + if resolve_file(os.path.join(docs_dir, filename)): + print(f' resolved: {filename}') + modified += 1 + + print(f'{modified} file(s) updated.') + + +if __name__ == '__main__': + main() diff --git a/scripts/audit_live_docs_backup_commits.py b/scripts/audit_live_docs_backup_commits.py new file mode 100755 index 0000000..4194eae --- /dev/null +++ b/scripts/audit_live_docs_backup_commits.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +""" +Audit script that reports the age of every unique backup YAML commit in _MODIFIERS, +and whether each command still appears in its workflow file at HEAD. + +Run from the repo root: + python scripts/audit_live_docs_backup_commits.py +""" + +import datetime +import sys +import os +import requests +from urllib import parse + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from live_docs_modifiers_data import _MODIFIERS + +_head_cache = {} + + +def github_commit_date(repo, sha): + """Fetch the ISO 8601 commit date for sha in cyber-dojo/{repo} on GitHub, or None.""" + url = f"https://api.github.com/repos/cyber-dojo/{repo}/commits/{sha}" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json()["commit"]["committer"]["date"] + + +def gitlab_commit_date(repo, sha): + """Fetch the ISO 8601 commit date for sha in cyber-dojo/{repo} on GitLab, or None.""" + encoded = parse.quote(f"cyber-dojo/{repo}", safe="") + url = f"https://gitlab.com/api/v4/projects/{encoded}/repository/commits/{sha}" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json().get("committed_date") + + +def fetch_commit_date(ci, repo, sha): + """Dispatch to the correct host and return the ISO 8601 commit date, or None.""" + if ci == "github": + return github_commit_date(repo, sha) + if ci == "gitlab": + return gitlab_commit_date(repo, sha) + return None + + +def fetch_head_workflow(ci, repo, workflow): + """Fetch the raw workflow file content at HEAD for ci/repo/workflow, or None.""" + if ci == "github": + url = f"https://raw.githubusercontent.com/cyber-dojo/{repo}/HEAD/{workflow}" + elif ci == "gitlab": + url = f"https://gitlab.com/cyber-dojo/{repo}/-/raw/HEAD/{workflow}" + else: + return None + response = requests.get(url) + if response.status_code != 200: + return None + return response.text + + +def head_workflow(ci, repo, workflow): + """Return cached HEAD content for ci/repo/workflow, fetching on first access.""" + key = (ci, repo, workflow) + if key not in _head_cache: + _head_cache[key] = fetch_head_workflow(ci, repo, workflow) + return _head_cache[key] + + +def command_in_head(command, ci): + """Return 'yes', 'no', or '?' depending on whether command appears in the HEAD workflow.""" + y = _MODIFIERS[command][ci]["yaml"] + content = head_workflow(ci, y["repo"], y["workflow"]) + if content is None: + return "?" + return "yes" if command in content else "no" + + +def age_days(date_str): + """Return the number of whole days between now (UTC) and date_str (ISO 8601).""" + dt = datetime.datetime.fromisoformat(date_str.replace("Z", "+00:00")) + now = datetime.datetime.now(datetime.timezone.utc) + return (now - dt).days + + +def collect_unique_entries(): + """Return a dict mapping (ci, repo, sha) to the list of commands sharing that backup commit.""" + entries = {} + for command, cis in _MODIFIERS.items(): + for ci, data in cis.items(): + y = data["yaml"] + key = (ci, y["repo"], y["backup"]["commit"]) + entries.setdefault(key, []).append(command) + return entries + + +def build_rows(): + """Fetch commit dates and HEAD presence for each entry; return rows sorted oldest-first.""" + entries = collect_unique_entries() + rows = [] + n = len(entries) + for i, ((ci, repo, sha), commands) in enumerate(entries.items(), 1): + print(f" [{i}/{n}] {ci}/{repo}/{sha[:8]}... ", end="\r", flush=True) + date_str = fetch_commit_date(ci, repo, sha) + if date_str is None: + date_display = "?" + days = None + else: + date_display = date_str[:10] + days = age_days(date_str) + cmd_entries = [(cmd, command_in_head(cmd, ci)) for cmd in commands] + rows.append((days, ci, repo, sha, date_display, cmd_entries)) + + print(" " * 60, end="\r") + rows.sort(key=lambda r: (r[0] is None, -(r[0] or 0))) + return rows + + +def print_table(rows): + """Print rows as a fixed-width table, oldest commits first.""" + w_ci = max(len("ci"), max(len(r[1]) for r in rows)) + w_repo = max(len("repo"), max(len(r[2]) for r in rows)) + w_cmd = max(len("command"), max(len(cmd) for r in rows for cmd, _ in r[5])) + + header = f" {'age':>5} {'date':<10} {'ci':<{w_ci}} {'repo':<{w_repo}} {'sha':<8} {'command':<{w_cmd}} in HEAD?" + print(header) + print(" " + "-" * (len(header) - 2)) + + prefix = 2 + 5 + 2 + 10 + 2 + w_ci + 2 + w_repo + 2 + 8 + 2 + indent = " " * prefix + + for days, ci, repo, sha, date_display, cmd_entries in rows: + age_str = f"{days}d" if days is not None else "?" + for i, (cmd, in_head) in enumerate(cmd_entries): + if i == 0: + print(f" {age_str:>5} {date_display:<10} {ci:<{w_ci}} {repo:<{w_repo}} {sha[:8]} {cmd:<{w_cmd}} {in_head}") + else: + print(f"{indent}{cmd:<{w_cmd}} {in_head}") + print() + + +if __name__ == "__main__": + rows = build_rows() + print_table(rows) diff --git a/scripts/dev_live_docs.sh b/scripts/dev_live_docs.sh new file mode 100755 index 0000000..503eb94 --- /dev/null +++ b/scripts/dev_live_docs.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +trap 'git restore client_reference/' EXIT + +python3 scripts/add_livedocs.py +(sleep 3 && open http://localhost:3000/client_reference/kosli_attest_artifact) & +mint dev diff --git a/scripts/generate_live_docs_test_data.py b/scripts/generate_live_docs_test_data.py new file mode 100644 index 0000000..c988f38 --- /dev/null +++ b/scripts/generate_live_docs_test_data.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +""" +Fetch live JSON from app.kosli.com and save as stub files for live-docs unit tests. + +Run from the repo root whenever _MODIFIERS changes (new commands, renamed flows): + python3 scripts/generate_live_docs_test_data.py +""" + +import json +import os +import sys + +import requests + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import live_docs_modifiers_data + +_OUT_DIR = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "..", + "tests", + "testdata", + "live_docs", +) + + +def save(filename, data): + """Write data as pretty-printed JSON to the test data directory.""" + os.makedirs(_OUT_DIR, exist_ok=True) + path = os.path.join(_OUT_DIR, filename) + with open(path, "wt") as f: + f.write(json.dumps(data, indent=2)) + print(f" saved: {filename}") + + +def fetch_aws_prod_snapshot(): + """Fetch the latest aws-prod snapshot from app.kosli.com and return its JSON.""" + url = "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/%40%7Bnow%7D" + response = requests.get(url) + response.raise_for_status() + return response.json() + + +def flow_names_from_modifiers(): + """Return the set of flow names referenced in _MODIFIERS.""" + names = set() + for command, ci in live_docs_modifiers_data.all_entries(): + fn = live_docs_modifiers_data.flow_name(command, ci) + if fn: + names.add(fn) + return names + + +def find_trail_urls(snapshot, wanted_flow_names): + """Return a dict mapping flow_name to its latest trail URL from the snapshot.""" + result = {} + for artifact in snapshot["artifacts"]: + for flow in artifact["flows"]: + flow_name = flow["flow_name"] + if flow_name not in wanted_flow_names: + continue + timestamp = flow["git_commit_info"]["timestamp"] + if flow_name not in result or timestamp > result[flow_name]["timestamp"]: + trail_name = flow["trail_name"] + result[flow_name] = { + "timestamp": timestamp, + "url": f"https://app.kosli.com/api/v2/trails/cyber-dojo/{flow_name}/{trail_name}", + } + return result + + +def fetch_trail(url): + """Fetch a trail JSON from app.kosli.com and return it.""" + response = requests.get(url) + response.raise_for_status() + return response.json() + + +if __name__ == "__main__": + print("Fetching aws-prod snapshot...") + snapshot = fetch_aws_prod_snapshot() + save("cyber_dojo_aws_prod.json", snapshot) + + wanted = flow_names_from_modifiers() + trail_urls = find_trail_urls(snapshot, wanted) + missing = wanted - set(trail_urls.keys()) + if missing: + print(f"WARNING: flows not found in snapshot: {missing}", file=sys.stderr) + + print(f"Fetching {len(trail_urls)} trail(s)...") + for flow_name, data in sorted(trail_urls.items()): + trail = fetch_trail(data["url"]) + save(f"cyber_dojo_trail_{flow_name}.json", trail) + + print("Done.") diff --git a/scripts/live_docs_fetch.py b/scripts/live_docs_fetch.py new file mode 100644 index 0000000..9d27751 --- /dev/null +++ b/scripts/live_docs_fetch.py @@ -0,0 +1,193 @@ +"""HTTP fetch functions and URL resolution logic for live-docs. + +Results are memoized in-process to avoid redundant HTTP calls within a single run. +""" +import json +import requests +from functools import lru_cache +from urllib import parse + +import live_docs_modifiers_data +import live_docs_queries_data + +_KOSLI_API_BASE = "https://app.kosli.com/api/v2" +_KOSLI_API_TOKEN = "Pj_XT2deaVA6V1qrTlthuaWsmjVt4eaHQwqnwqjRO3A" + + +@lru_cache(maxsize=None) +def yaml_lines(command, ci, commit_sha): + """Fetch the raw workflow YAML for command/ci at commit_sha and return it as a list of lines.""" + url = live_docs_modifiers_data.raw_yaml_url(command, ci, commit_sha) + response = requests.get(url) + if response.status_code != 200: + return [] + return response.text.split("\n") + + +@lru_cache(maxsize=None) +def resolve_head_sha(command, ci): + """Return the HEAD commit SHA for the repo of command/ci, or None on failure.""" + if ci == "github": + repo = live_docs_modifiers_data.repo_name(command, ci) + url = f"https://api.github.com/repos/cyber-dojo/{repo}/commits/HEAD" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json().get("sha") + if ci == "gitlab": + repo = live_docs_modifiers_data.repo_name(command, ci) + encoded = parse.quote(f"cyber-dojo/{repo}", safe="") + url = f"https://gitlab.com/api/v4/projects/{encoded}/repository/commits/HEAD" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json().get("id") + return None + + +@lru_cache(maxsize=None) +def fetch_trail(flow_name, trail_name): + """Fetch trail JSON from app.kosli.com; return None if the request fails.""" + url = f"https://app.kosli.com/api/v2/trails/cyber-dojo/{flow_name}/{trail_name}" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json() + + +@lru_cache(maxsize=1) +def _fetch_latest_snapshot(): + """Fetch and return the latest aws-prod snapshot JSON, or None on failure.""" + url = "https://app.kosli.com/api/v2/snapshots/cyber-dojo/aws-prod/@{now}" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json() + + +def flow_in_latest_snapshot(flow_name): + """Return the flow entry for flow_name from the latest aws-prod snapshot, or None.""" + snapshot = _fetch_latest_snapshot() + if snapshot is None: + return None + for artifact in snapshot["artifacts"]: + for flow in artifact["flows"]: + if flow["flow_name"] == flow_name: + return flow + return None + + +def yaml_url(command, ci): + """Return a URL to the exact line in a CI workflow file containing command. + + Falls back to backup_yaml_url when the live flow or commit cannot be resolved. + """ + backup = live_docs_modifiers_data.backup_yaml_url(command, ci) + + if live_docs_modifiers_data.has_trail_event(command, ci): + flow = flow_in_latest_snapshot(live_docs_modifiers_data.flow_name(command, ci)) + else: + flow = None + + if flow and live_docs_modifiers_data.repo_directly_corresponds_to_flow(command, ci): + commit_sha = flow["git_commit"] + else: + commit_sha = resolve_head_sha(command, ci) + if commit_sha is None: + return backup + + for n, line in enumerate(yaml_lines(command, ci, commit_sha), 1): + if command in line and not line.lstrip().startswith("#"): + return live_docs_modifiers_data.lined_yaml_url(command, ci, n, commit_sha) + + return backup + + +def event_url(command, ci): + """Return a URL to the matching event in app.kosli.com for command and ci. + + Falls back to backup_event_url when live data cannot be resolved. + """ + backup = live_docs_modifiers_data.backup_event_url(command, ci) + + if not live_docs_modifiers_data.has_trail_event(command, ci): + return backup + + flow_name = live_docs_modifiers_data.flow_name(command, ci) + flow = flow_in_latest_snapshot(flow_name) + if not flow: + return backup + + trail_name = flow["trail_name"] + trail_json = fetch_trail(flow_name, trail_name) + if trail_json is None: + return backup + + query_string = _find_event_query_string(trail_json["events"], command) + if query_string: + return f"https://app.kosli.com/cyber-dojo/flows/{flow_name}/trails/{trail_name}?{query_string}" + return backup + + +def _find_event_query_string(events, command): + """Return a query string identifying the event for command in events, or False if not found.""" + if command == "kosli begin trail": + return "attestation_id=1" + for event in reversed(events): + query_string = _matching_event_query_string(event, command) + if query_string: + return query_string + return False + + +def _matching_event_query_string(event, command): + """Return the query string that identifies event as matching command, or False.""" + if command == "kosli attest snyk": + if _is_attestation_type(event, "snyk"): + return f"attestation_id={event['attestation_id']}" + elif command == "kosli attest sonar": + if _is_attestation_type(event, "sonar"): + return f"attestation_id={event['attestation_id']}" + elif command == "-Dsonar.analysis.kosli_flow": + if _is_attestation_type(event, "sonar"): + return f"attestation_id={event['attestation_id']}" + elif command == "kosli attest junit": + if _is_attestation_type(event, "junit"): + return f"attestation_id={event['attestation_id']}" + elif command == "kosli attest generic": + if _is_attestation_type(event, "generic"): + return f"attestation_id={event['attestation_id']}" + elif command in ("kosli attest pullrequest github", "kosli attest pullrequest gitlab"): + if _is_attestation_type(event, "pull_request"): + return f"attestation_id={event['attestation_id']}" + elif command == "kosli attest artifact": + if _is_attestation_type(event, "artifact_creation_reported"): + return f"attestation_id={event['artifact_id']}" + elif command == "kosli attest custom": + if _is_attestation_type(event, "custom"): + return f"attestation_id={event['attestation_id']}" + else: + return False + + +def _is_attestation_type(event, wanted_type): + """Return True if event matches the wanted attestation type.""" + actual_type = event.get("type", None) + if wanted_type == "artifact_creation_reported": + return actual_type == wanted_type + if wanted_type == "custom" and actual_type == "artifact_attestation_reported": + attestation_type = event.get("attestation_type", None) + return isinstance(attestation_type, str) and attestation_type.startswith("custom:") + return event.get("attestation_type", None) == wanted_type + + +@lru_cache(maxsize=None) +def fetch_cli_json(command): + """Fetch the Kosli API response for command and return pretty-printed JSON, or None on failure.""" + full_cmd = live_docs_queries_data.full_command(command) + path = live_docs_queries_data.api_path(full_cmd) + url = f"{_KOSLI_API_BASE}/{path}" + response = requests.get(url, headers={"Authorization": f"Bearer {_KOSLI_API_TOKEN}"}) + if response.status_code != 200: + return None + return json.dumps(response.json(), indent=2) diff --git a/scripts/live_docs_modifiers_data.py b/scripts/live_docs_modifiers_data.py new file mode 100644 index 0000000..30a447d --- /dev/null +++ b/scripts/live_docs_modifiers_data.py @@ -0,0 +1,615 @@ +"""Data table for live-docs modifier (POST) commands. + +_MODIFIERS maps CLI commands to per-CI metadata. Each CI entry has: +- yaml: repo, workflow, and backup (commit and line for the fallback YAML URL) +- event: flow, and backup (trail and attestation_id for the fallback event URL) + +To audit backup commit ages and check which commands are still present at HEAD: + python3 scripts/audit_live_docs_backup_commits.py +Calls the GitHub/GitLab APIs unauthenticated (60 req/hour limit). +If dates show as "?" the rate limit has been hit -- wait an hour and retry. + +To update stale backup commit SHAs and line numbers to HEAD, run: + python3 scripts/refresh_live_docs_backup_commits.py > update_live_docs_backup_commits.py + python3 update_live_docs_backup_commits.py +Only entries where the command is still present in their workflows at HEAD are updated. +""" + + +def has_entry(command, ci): + """Return True if command/ci is a known live-docs entry.""" + return command in _MODIFIERS and ci in _MODIFIERS[command] + + +def all_entries(): + """Yield (command, ci) for every entry in _MODIFIERS.""" + for command, cis in _MODIFIERS.items(): + for ci in cis: + yield command, ci + + +def flow_name(command, ci): + """Return the Kosli flow name for command/ci, or '' if the command creates no event.""" + return _MODIFIERS[command][ci]["event"]["flow"] + + +def has_trail_event(command, ci): + """Return True if command/ci creates a Trail event (i.e. its Kosli flow is non-empty).""" + return flow_name(command, ci) != "" + + +def backup_yaml_url(command, ci): + """Return the fallback YAML URL for command/ci.""" + if ci == "github": + y = _MODIFIERS[command][ci]["yaml"] + b = y["backup"] + return f"https://github.com/cyber-dojo/{y['repo']}/blob/{b['commit']}/{y['workflow']}#L{b['line']}" + if ci == "gitlab": + y = _MODIFIERS[command][ci]["yaml"] + b = y["backup"] + return f"https://gitlab.com/cyber-dojo/{y['repo']}/-/blob/{b['commit']}/{y['workflow']}#L{b['line']}" + return "" + + +def backup_event_url(command, ci): + """Return the fallback event URL for command/ci.""" + e = _MODIFIERS[command][ci]["event"] + b = e["backup"] + if not b["trail"]: + return "" + return f"https://app.kosli.com/cyber-dojo/flows/{e['flow']}/trails/{b['trail']}?attestation_id={b['attestation_id']}" + + +def raw_yaml_url(command, ci, commit_sha): + """Return the raw content URL for the workflow file at the given commit.""" + if ci == "github": + y = _MODIFIERS[command][ci]["yaml"] + return f"https://raw.githubusercontent.com/cyber-dojo/{y['repo']}/{commit_sha}/{y['workflow']}" + if ci == "gitlab": + y = _MODIFIERS[command][ci]["yaml"] + return f"https://gitlab.com/cyber-dojo/{y['repo']}/-/raw/{commit_sha}/{y['workflow']}" + return "" + + +def lined_yaml_url(command, ci, line, commit_sha): + """Return the browser URL pointing to a specific line in the workflow file.""" + if ci == "github": + y = _MODIFIERS[command][ci]["yaml"] + return f"https://github.com/cyber-dojo/{y['repo']}/blob/{commit_sha}/{y['workflow']}#L{line}" + if ci == "gitlab": + y = _MODIFIERS[command][ci]["yaml"] + return f"https://gitlab.com/cyber-dojo/{y['repo']}/-/blob/{commit_sha}/{y['workflow']}#L{line}" + return "" + + +def repo_directly_corresponds_to_flow(command, ci): + """Return True if the repo name implies the flow name (repo + '-ci' == flow). + + When True, the git commit is read from the snapshot flow entry. + When False (e.g. kosli attest artifact, whose YAML is in reusable-actions-workflows + but whose Trail event is in differ-ci), the HEAD SHA is fetched separately. + """ + data = _MODIFIERS[command][ci] + return f"{data['yaml']['repo']}-ci" == data["event"]["flow"] + + +def repo_name(command, ci): + """Return the cyber-dojo repo name for command/ci.""" + return _MODIFIERS[command][ci]["yaml"]["repo"] + + +def has_command(command): + """Return True if command is a known live-docs command.""" + return command in _MODIFIERS + + +def cis_for(command): + """Yield all CI names registered for command.""" + yield from _MODIFIERS[command] + + +_MODIFIERS = { + # kosli attest artifact and kosli attest snyk are special, in GitHub, + # as they appear in reusable workflows, called FROM the main differ workflow, + # and NOT in the main differ workflow itself. + # So the URL for the workflow yaml is NOT for the differ repo, it is the HEAD + # of the target repo. But the URL for the Kosli Trail event IS in the differ Trail, + # and this is as designed. + "kosli attest artifact": { + "github": { + "yaml": { + "repo": "reusable-actions-workflows", + "workflow": ".github/workflows/secure-docker-build.yml", + "backup": { + "commit": "25f0b797c18403de1c8490a9a71bbe9789c809a9", + "line": 210, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "2e482ef95263c81570a82f0456b026e29203d550", + "attestation_id": "1386703c-8d8f-47cf-a03e-d6a3328b", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 111, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "attestation_id": "e2345d6b-2220-414a-9bb1-26ab8e26", + }, + }, + }, + }, + "kosli attest snyk": { + "github": { + "yaml": { + "repo": "snyk-container-test", + "workflow": "action.yml", + "backup": { + "commit": "43373102aa2abee72027e2aba050adea9fdb0173", + "line": 70, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "2e482ef95263c81570a82f0456b026e29203d550", + "attestation_id": "c4d17fb4-05d2-4894-bca7-f21e56ab", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "line": 146, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "attestation_id": "3e9cd5ee-4fd3-403f-ba59-6d431dec", + }, + }, + }, + }, + # Then we have commands that do NOT have a corresponding trail event + "kosli create attestation-type": { + "github": { + "yaml": { + "repo": "kosli-attestation-types", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "7ad343982d42654fdf4cf123c5e7aec44af8e1a7", + "line": 56, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + } + }, + "kosli create flow": { + "github": { + "yaml": { + "repo": "runner", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "line": 71, + }, + }, + "event": { + "flow": "runner-ci", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 53, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli begin trail": { + "github": { + "yaml": { + "repo": "runner", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "line": 78, + }, + }, + "event": { + "flow": "runner-ci", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 55, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli tag": { + "github": { + "yaml": { + "repo": "aws-prod-co-promotion", + "workflow": ".github/workflows/promote_one.yml", + "backup": { + "commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "line": 74, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "48bdbd3b059d45489e8ae5f9f680f48bc6201ad8", + "line": 52, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli fingerprint": { + "github": { + "yaml": { + "repo": "snyk-scanning", + "workflow": ".github/workflows/artifact_snyk_test.yml", + "backup": { + "commit": "9cc4c900ed581834931a9596a49b5033b7ffa12f", + "line": 177, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + } + }, + "kosli assert artifact": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 329, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 153, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli report approval": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 358, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "48bdbd3b059d45489e8ae5f9f680f48bc6201ad8", + "line": 200, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli evaluate trail": { + "github": { + "yaml": { + "repo": "snyk-scanning", + "workflow": ".github/workflows/artifact_snyk_test.yml", + "backup": { + "commit": "9cc4c900ed581834931a9596a49b5033b7ffa12f", + "line": 325, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + "kosli evaluate input": { + "github": { + "yaml": { + "repo": "snyk-scanning", + "workflow": "tests/test_rego_rules.sh", + "backup": { + "commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "line": 153, + }, + }, + "event": { + "flow": "", + "backup": { + "trail": "", + "attestation_id": "", + }, + }, + }, + }, + # Lastly we have commands that DO create events in a Trail. + "kosli attest custom": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 265, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "ed88bbeb6e93195d2d8447a69b93431969cc71db", + "attestation_id": "4af90662-7e2d-4948-b149-c24f9350", + }, + }, + } + }, + "kosli attest junit": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 250, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "ed88bbeb6e93195d2d8447a69b93431969cc71db", + "attestation_id": "f54eae29-61cb-4b27-897a-4296a6a2", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 126, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "attestation_id": "dbee2e2c-6397-402f-ae76-267d9fba", + }, + }, + }, + }, + "kosli attest pullrequest github": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 95, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "ed88bbeb6e93195d2d8447a69b93431969cc71db", + "attestation_id": "c8f9c24c-b9d5-4659-8cd6-3121ef9a", + }, + }, + }, + }, + "kosli attest pullrequest gitlab": { + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 75, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "attestation_id": "2f796a5f-3c49-496f-be16-6faae913", + }, + }, + }, + }, + "kosli attest sonar": { + "github": { + "yaml": { + "repo": "dashboard", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "line": 166, + }, + }, + "event": { + "flow": "dashboard-ci", + "backup": { + "trail": "678e0d67225f16adc9c76596161b673f6eb4ba68", + "attestation_id": "82383544-ed40-496a-a0e1-ed1f5cc8", + }, + }, + }, + }, + "-Dsonar.analysis.kosli_flow": { + "github": { + "yaml": { + "repo": "differ", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "line": 292, + }, + }, + "event": { + "flow": "differ-ci", + "backup": { + "trail": "12fae04cac4bce5bd7a561d86557ed3122dda2d1", + "attestation_id": "a0ef02d8-b373-450a-98a8-e3931b4b", + }, + }, + }, + }, + "kosli attest generic": { + "github": { + "yaml": { + "repo": "dashboard", + "workflow": ".github/workflows/main.yml", + "backup": { + "commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "line": 249, + }, + }, + "event": { + "flow": "dashboard-ci", + "backup": { + "trail": "44ca5fa2630947cf375fdbda10972a4bedaaaba3", + "attestation_id": "6a99303c-b7b3-4f4a-b576-9cdacc1d", + }, + }, + }, + "gitlab": { + "yaml": { + "repo": "creator", + "workflow": ".gitlab/workflows/main.yml", + "backup": { + "commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "line": 131, + }, + }, + "event": { + "flow": "creator-ci", + "backup": { + "trail": "a184b5b7d2053ce2b2f7064bf46f0b6f72f9f393", + "attestation_id": "7befb7ac-ddcf-4e89-a3d7-558eb0c5", + }, + }, + }, + } +} diff --git a/scripts/live_docs_queries_data.py b/scripts/live_docs_queries_data.py new file mode 100644 index 0000000..d76db6f --- /dev/null +++ b/scripts/live_docs_queries_data.py @@ -0,0 +1,54 @@ +"""Data table for live-docs query (GET) commands. + +_QUERIES maps full query-style CLI commands to the corresponding Kosli API v2 path. +_CLI_COMMANDS maps command names (as they appear in md file frontmatter titles) to +the corresponding full command string in _QUERIES. +""" + +_QUERIES = { + "kosli list environments --output=json": "environments/cyber-dojo", + "kosli get environment aws-prod --output=json": "environments/cyber-dojo/aws-prod", + "kosli log environment aws-prod --output=json": "environments/cyber-dojo/aws-prod/events", + "kosli list snapshots aws-prod --output=json": "snapshots/cyber-dojo/aws-prod", + "kosli get snapshot aws-prod --output=json": "snapshots/cyber-dojo/aws-prod/-1", + "kosli diff snapshots aws-beta aws-prod --output=json": "env-diff/cyber-dojo?snappish1=aws-beta&snappish2=aws-prod", + "kosli list flows --output=json": "flows/cyber-dojo", + "kosli get flow dashboard-ci --output=json": "flows/cyber-dojo/dashboard-ci", + "kosli list trails dashboard-ci --output=json": "trails/cyber-dojo/dashboard-ci", + "kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json": "trails/cyber-dojo/dashboard-ci/1159a6f1193150681b8484545150334e89de6c1c", + "kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json": "attestations/cyber-dojo/differ-ci/artifact/0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0/snyk-container-scan", + "kosli list artifacts --flow=differ-ci --output=json": "artifacts/cyber-dojo/differ-ci", + "kosli get artifact differ-ci@0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json": "artifacts/cyber-dojo/differ-ci/fingerprint/0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0", + "kosli list attestation-types --output=json": "custom-attestation-types/cyber-dojo", + "kosli get attestation-type single-snyk-vuln --output=json": "custom-attestation-types/cyber-dojo/single-snyk-vuln", + "kosli list policies --output=json": "policies/cyber-dojo", + "kosli get policy artifact-provenance --output=json": "policies/cyber-dojo/artifact-provenance", +} + +_CLI_COMMANDS = { + "kosli list environments": "kosli list environments --output=json", + "kosli get environment": "kosli get environment aws-prod --output=json", + "kosli log environment": "kosli log environment aws-prod --output=json", + "kosli list snapshots": "kosli list snapshots aws-prod --output=json", + "kosli get snapshot": "kosli get snapshot aws-prod --output=json", + "kosli diff snapshots": "kosli diff snapshots aws-beta aws-prod --output=json", + "kosli list flows": "kosli list flows --output=json", + "kosli get flow": "kosli get flow dashboard-ci --output=json", + "kosli get trail": "kosli get trail dashboard-ci 1159a6f1193150681b8484545150334e89de6c1c --output=json", + "kosli get attestation": "kosli get attestation snyk-container-scan --flow=differ-ci --fingerprint=0cbbe3a6e73e733e8ca4b8813738d68e824badad0508ff20842832b5143b48c0 --output=json", +} + + +def has_cli_command(command): + """Return True if command (a short command name) has a live CLI query entry.""" + return command in _CLI_COMMANDS + + +def full_command(command): + """Return the full command string in _QUERIES for the given short command name.""" + return _CLI_COMMANDS[command] + + +def api_path(full_cmd): + """Return the Kosli API v2 path for the given full command string.""" + return _QUERIES[full_cmd] diff --git a/scripts/refresh_live_docs_backup_commits.py b/scripts/refresh_live_docs_backup_commits.py new file mode 100755 index 0000000..8f7ca34 --- /dev/null +++ b/scripts/refresh_live_docs_backup_commits.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python3 +""" +Prints an update script to stdout that, when run, updates the backup commit +SHA and line number in _MODIFIERS to HEAD for every entry where the command +is still present in the workflow at HEAD. + +Entries where the command is no longer present at HEAD are skipped. + +Run from the repo root: + python3 scripts/refresh_live_docs_backup_commits.py > update_live_docs_backup_commits.py + python3 update_live_docs_backup_commits.py + +To verify the commands are still present in their workflows at HEAD +(and the backup commits are not too old), run: + python3 scripts/audit_live_docs_backup_commits.py +""" + +import datetime +import os +import sys +import requests +from urllib import parse + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from live_docs_modifiers_data import _MODIFIERS + +_head_sha_cache = {} +_head_content_cache = {} + +MODIFIERS_PATH = "scripts/live_docs_modifiers_data.py" +INDENT = " " + + +def fetch_github_head_sha(repo): + """Fetch the current HEAD commit SHA for cyber-dojo/{repo} on GitHub, or None.""" + url = f"https://api.github.com/repos/cyber-dojo/{repo}/commits/HEAD" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json().get("sha") + + +def fetch_gitlab_head_sha(repo): + """Fetch the current HEAD commit SHA for cyber-dojo/{repo} on GitLab, or None.""" + encoded = parse.quote(f"cyber-dojo/{repo}", safe="") + url = f"https://gitlab.com/api/v4/projects/{encoded}/repository/commits/HEAD" + response = requests.get(url) + if response.status_code != 200: + return None + return response.json().get("id") + + +def head_sha(ci, repo): + """Return the cached HEAD SHA for ci/repo, fetching on first access.""" + key = (ci, repo) + if key not in _head_sha_cache: + if ci == "github": + _head_sha_cache[key] = fetch_github_head_sha(repo) + elif ci == "gitlab": + _head_sha_cache[key] = fetch_gitlab_head_sha(repo) + else: + _head_sha_cache[key] = None + return _head_sha_cache[key] + + +def fetch_head_workflow(ci, repo, workflow): + """Fetch the raw workflow file content at HEAD for ci/repo/workflow, or None.""" + if ci == "github": + url = f"https://raw.githubusercontent.com/cyber-dojo/{repo}/HEAD/{workflow}" + elif ci == "gitlab": + url = f"https://gitlab.com/cyber-dojo/{repo}/-/raw/HEAD/{workflow}" + else: + return None + response = requests.get(url) + if response.status_code != 200: + return None + return response.text + + +def head_workflow(ci, repo, workflow): + """Return cached HEAD content for ci/repo/workflow, fetching on first access.""" + key = (ci, repo, workflow) + if key not in _head_content_cache: + _head_content_cache[key] = fetch_head_workflow(ci, repo, workflow) + return _head_content_cache[key] + + +def find_line_number(content, command): + """Return the 1-based line number of the first non-comment occurrence of command in content, or None.""" + for n, line in enumerate(content.split("\n"), 1): + if command in line and not line.lstrip().startswith("#"): + return n + return None + + +def make_replacement(old_commit, old_line, new_commit, new_line): + """Return (old_str, new_str) targeting the backup block for old_commit/old_line.""" + old = f'{INDENT}"commit": "{old_commit}",\n{INDENT}"line": {old_line},' + new = f'{INDENT}"commit": "{new_commit}",\n{INDENT}"line": {new_line},' + return old, new + + +def progress(msg): + """Print a progress message to stderr so it does not pollute stdout.""" + print(msg, end="\r", flush=True, file=sys.stderr) + + +def build_replacements(): + """Return list of (old_str, new_str) for entries present at HEAD with a changed backup.""" + replacements = [] + seen = set() + for command, cis in _MODIFIERS.items(): + for ci, data in cis.items(): + y = data["yaml"] + repo, workflow = y["repo"], y["workflow"] + old_commit = y["backup"]["commit"] + old_line = y["backup"]["line"] + + progress(f" checking {ci}/{repo} -- {command}... ") + + content = head_workflow(ci, repo, workflow) + if content is None or command not in content: + continue + + new_sha = head_sha(ci, repo) + if new_sha is None: + continue + + new_line = find_line_number(content, command) + if new_line is None: + continue + + if new_sha == old_commit and new_line == old_line: + continue + + key = (old_commit, old_line) + if key in seen: + continue + seen.add(key) + + replacements.append(make_replacement(old_commit, old_line, new_sha, new_line)) + + progress(" " * 60) + return replacements + + +def print_script(replacements): + """Print the update script to stdout.""" + now = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%d %H:%M UTC") + lines = [ + "#!/usr/bin/env python3", + '"""', + f"Auto-generated by refresh_live_docs_backup_commits.py on {now}.", + "Updates backup commit SHAs and line numbers in _MODIFIERS to HEAD.", + "", + "Run from the repo root:", + " python3 update_live_docs_backup_commits.py", + '"""', + "", + f'PATH = "{MODIFIERS_PATH}"', + "", + "replacements = [", + ] + for old, new in replacements: + lines.append(" (") + lines.append(f" {old!r},") + lines.append(f" {new!r},") + lines.append(" ),") + lines += [ + "]", + "", + "with open(PATH) as f:", + " content = f.read()", + "", + "for old, new in replacements:", + ' assert old in content, f"Pattern not found:\\n{old}"', + " content = content.replace(old, new)", + "", + 'with open(PATH, "w") as f:', + " f.write(content)", + "", + f'print("Updated {{PATH}} with {len(replacements)} replacement(s).")', + ] + print("\n".join(lines)) + + +if __name__ == "__main__": + replacements = build_replacements() + if not replacements: + print("No updates needed.", file=sys.stderr) + else: + print_script(replacements) + print(f"{len(replacements)} replacement(s) written to stdout.", file=sys.stderr) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..65b406c --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,4 @@ +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'scripts')) diff --git a/tests/live_docs_helpers.py b/tests/live_docs_helpers.py new file mode 100644 index 0000000..65f12a1 --- /dev/null +++ b/tests/live_docs_helpers.py @@ -0,0 +1,105 @@ +""" +Shared helpers for live-docs unit tests. + +Stub file helpers (pathed_test_data, aws_prod_stub, flow_trail_stub) rely on +JSON files under tests/testdata/live_docs/. Regenerate them whenever +_MODIFIERS changes (new commands, renamed flows, etc.) by running: + + python3 scripts/generate_live_docs_test_data.py +""" + +import json +import os + +import live_docs_fetch + + +def clear_live_docs_caches(): + """Clear all lru_caches in live_docs_fetch so stubs are used on the next call.""" + live_docs_fetch.yaml_lines.cache_clear() + live_docs_fetch.resolve_head_sha.cache_clear() + live_docs_fetch.fetch_trail.cache_clear() + live_docs_fetch._fetch_latest_snapshot.cache_clear() + live_docs_fetch.fetch_cli_json.cache_clear() + + +def stub_http_get(monkeypatch, stubs): + """Clear live-docs caches and replace requests.get with a sequential stub.""" + clear_live_docs_caches() + http_stub = HttpStub(stubs) + monkeypatch.setattr("requests.get", http_stub.get) + return http_stub + + +class HttpStub: + """Sequential stub for requests.get() that returns pre-loaded responses in order.""" + + def __init__(self, stubs): + """Initialise with an ordered list of stub responses to return one per call.""" + self.stubs = stubs + self.index = 0 + + def get(self, url, **kwargs): + """Return the next stub response and advance the index.""" + response = self.stubs[self.index] + self.index += 1 + return response + + +class StubResponseStatusCode: + """Stub response with only a status code.""" + + def __init__(self, status_code): + """Initialise with the given HTTP status code.""" + self.status_code = status_code + + +class StubResponseJson(StubResponseStatusCode): + """Stub response that returns JSON data.""" + + def __init__(self, stubbed): + """Initialise with a dict or list to be returned by .json().""" + super().__init__(200) + self.stubbed = stubbed + + def json(self): + """Return the stubbed JSON payload.""" + return self.stubbed + + +class StubResponseText(StubResponseStatusCode): + """Stub response that returns plain text.""" + + def __init__(self, stubbed): + """Initialise with a string to be returned as .text.""" + super().__init__(200) + self.text = stubbed + + +def head_sha_stub(): + """Return a stub response for a HEAD SHA API call. + + Uses all-zeros so tests asserting live_commit != backup_commit cannot + accidentally collide with a real backup SHA. + Both 'sha' (GitHub) and 'id' (GitLab) keys are present so the same stub + works for both CI platforms. + """ + return StubResponseJson({"sha": "0" * 40, "id": "0" * 40}) + + +def pathed_test_data(filename): + """Return the absolute path to a test data file in tests/testdata/live_docs/.""" + my_dir_path = os.path.dirname(os.path.realpath(__file__)) + return os.path.join(my_dir_path, "testdata", "live_docs", filename) + + +def aws_prod_stub(): + """Return a StubResponseJson loaded from the cyber_dojo_aws_prod.json fixture.""" + with open(pathed_test_data("cyber_dojo_aws_prod.json"), "rt") as f: + return StubResponseJson(json.loads(f.read())) + + +def flow_trail_stub(flow_name): + """Return a StubResponseJson loaded from the trail fixture for flow_name.""" + with open(pathed_test_data(f"cyber_dojo_trail_{flow_name}.json"), "rt") as f: + return StubResponseJson(json.loads(f.read())) diff --git a/tests/test_live_docs_modifiers.py b/tests/test_live_docs_modifiers.py new file mode 100644 index 0000000..893bf37 --- /dev/null +++ b/tests/test_live_docs_modifiers.py @@ -0,0 +1,173 @@ +import json + +import live_docs_modifiers_data +from live_docs_fetch import ( + yaml_url, + event_url, + _matching_event_query_string, + _find_event_query_string, +) +from live_docs_helpers import ( + stub_http_get, + StubResponseJson, + StubResponseText, + StubResponseStatusCode, + head_sha_stub, + pathed_test_data, + aws_prod_stub, + flow_trail_stub, +) + + +def test_aefa1402(monkeypatch): + """ + yaml/event returns backup-url when flow is NOT in aws-prod snapshot + and main.yaml at HEAD does NOT contain the command. + """ + command = "kosli attest artifact" + assert live_docs_modifiers_data.has_command(command) + for ci in live_docs_modifiers_data.cis_for(command): + flow_name = live_docs_modifiers_data.flow_name(command, ci) + diag = f"{ci} - {live_docs_modifiers_data.repo_name(command, ci)} - {command}" + + with open(pathed_test_data("cyber_dojo_aws_prod.json"), "rt") as file: + aws_prod = json.loads(file.read()) + + for artifact in aws_prod["artifacts"]: + for flow in artifact["flows"]: + if flow["flow_name"] == flow_name: + flow["flow_name"] = f"{flow_name}-doctored" + + # yaml + stub_http_get( + monkeypatch, + [ + StubResponseJson(aws_prod), + head_sha_stub(), + StubResponseText("hello\nworld"), + ], + ) + actual_yaml_url = yaml_url(command, ci) + assert actual_yaml_url == live_docs_modifiers_data.backup_yaml_url( + command, ci + ), diag + + # event + stub_http_get(monkeypatch, [StubResponseJson(aws_prod)]) + actual_event_url = event_url(command, ci) + assert actual_event_url == live_docs_modifiers_data.backup_event_url( + command, ci + ), diag + + +def test_aefa1405(monkeypatch): + """ + When no yaml lines match the command, return backup-yaml-url. + """ + ci = "github" + command = "kosli attest snyk" + stub_http_get(monkeypatch, [aws_prod_stub(), head_sha_stub(), StubResponseText("a\nb\nc\nd")]) + actual_yaml_url = yaml_url(command, ci) + assert actual_yaml_url == live_docs_modifiers_data.backup_yaml_url(command, ci) + + +def test_aefa1406(monkeypatch): + """ + yaml returns backup-yaml-url when main.yml response returns non-200. + """ + ci = "github" + command = "kosli attest snyk" + stub_http_get(monkeypatch, [aws_prod_stub(), head_sha_stub(), StubResponseStatusCode(400)]) + actual_yaml_url = yaml_url(command, ci) + assert actual_yaml_url == live_docs_modifiers_data.backup_yaml_url(command, ci) + + +def test_aefa1409(monkeypatch): + """ + yaml returns backup-yaml-url when the HEAD SHA API returns non-200. + """ + ci = "github" + command = "kosli attest snyk" + stub_http_get(monkeypatch, [aws_prod_stub(), StubResponseStatusCode(400)]) + actual_yaml_url = yaml_url(command, ci) + assert actual_yaml_url == live_docs_modifiers_data.backup_yaml_url(command, ci) + + +def test_aefa1410(monkeypatch): + """ + yaml_url returns backup-yaml-url when the GitLab HEAD SHA API returns non-200. + """ + ci = "gitlab" + command = "kosli report approval" + stub_http_get(monkeypatch, [StubResponseStatusCode(400)]) + actual_yaml_url = yaml_url(command, ci) + assert actual_yaml_url == live_docs_modifiers_data.backup_yaml_url(command, ci) + + +def test_aefa1404(monkeypatch): + """ + When no events in a Trail match the command, return backup-event-url. + """ + ci = "github" + command = "kosli attest snyk" + flow_name = live_docs_modifiers_data.flow_name(command, ci) + + trail_stub = flow_trail_stub(flow_name) + for event in trail_stub.stubbed["events"]: + event["type"] = "never-matched" + event["attestation_type"] = "never-matched" + + stub_http_get(monkeypatch, [aws_prod_stub(), trail_stub]) + actual_event_url = event_url(command, ci) + assert actual_event_url == live_docs_modifiers_data.backup_event_url(command, ci) + + +def test_aefa1407(monkeypatch): + """ + event returns backup-event-url when events API response returns non-200. + """ + ci = "github" + command = "kosli attest snyk" + stub_http_get(monkeypatch, [aws_prod_stub(), StubResponseStatusCode(400)]) + actual_event_url = event_url(command, ci) + assert actual_event_url == live_docs_modifiers_data.backup_event_url(command, ci) + + +def test_aefa1408(monkeypatch): + """ + event returns backup-event-url when Snapshot API response returns non-200. + """ + ci = "github" + command = "kosli attest snyk" + stub_http_get(monkeypatch, [StubResponseStatusCode(400)]) + actual_event_url = event_url(command, ci) + assert actual_event_url == live_docs_modifiers_data.backup_event_url(command, ci) + + +def test_aefa1419(monkeypatch): + """ + event_url returns backup-event-url when the command has no associated Trail event. + """ + ci = "github" + command = "kosli report approval" + actual_event_url = event_url(command, ci) + assert actual_event_url == live_docs_modifiers_data.backup_event_url(command, ci) + + +def test_aefa1414(): + """matching_event_query_string() returns False for unknown command""" + assert _matching_event_query_string(None, "unknown") is False + + +def test_aefa141d(): + """matching_event_query_string returns the attestation_id for a matching snyk event.""" + event = {"attestation_type": "snyk", "attestation_id": "abc-123"} + assert ( + _matching_event_query_string(event, "kosli attest snyk") + == "attestation_id=abc-123" + ) + + +def test_aefa1415(): + """find_event_query_string() returns False when command is not found""" + assert _find_event_query_string([], "unknown") is False diff --git a/tests/test_live_docs_queries.py b/tests/test_live_docs_queries.py new file mode 100644 index 0000000..6ed5b40 --- /dev/null +++ b/tests/test_live_docs_queries.py @@ -0,0 +1,26 @@ +import live_docs_queries_data +from live_docs_fetch import fetch_cli_json +from live_docs_helpers import ( + stub_http_get, + StubResponseJson, + StubResponseStatusCode, +) + + +def test_491e4f02(monkeypatch): + """ + The CLI live-docs JSON response is the proxied JSON + from an upstream Kosli CLI command. + """ + stub = {"k": "v"} + for command in live_docs_queries_data._CLI_COMMANDS: + stub_http_get(monkeypatch, [StubResponseJson(stub)]) + result = fetch_cli_json(command) + assert result is not None, f"Failed for command: {command}" + + +def test_491e4f03(monkeypatch): + """fetch_cli_json returns None when the Kosli API call fails.""" + stub_http_get(monkeypatch, [StubResponseStatusCode(500)]) + result = fetch_cli_json(sorted(live_docs_queries_data._CLI_COMMANDS.keys())[0]) + assert result is None diff --git a/tests/test_live_docs_unknown_ci.py b/tests/test_live_docs_unknown_ci.py new file mode 100644 index 0000000..15ba7ec --- /dev/null +++ b/tests/test_live_docs_unknown_ci.py @@ -0,0 +1,16 @@ +from live_docs_modifiers_data import backup_yaml_url, lined_yaml_url, raw_yaml_url + + +def test_f5a3b800(): + """raw_yaml_url returns '' when CI is not github or gitlab.""" + assert raw_yaml_url("any", "circleci", "abc123") == "" + + +def test_f5a3b801(): + """lined_yaml_url returns '' when CI is not github or gitlab.""" + assert lined_yaml_url("any", "circleci", 1, "abc123") == "" + + +def test_f5a3b803(): + """backup_yaml_url returns '' when CI is not github or gitlab.""" + assert backup_yaml_url("any", "circleci") == "" diff --git a/tests/testdata/live_docs/cyber_dojo_aws_prod.json b/tests/testdata/live_docs/cyber_dojo_aws_prod.json new file mode 100644 index 0000000..fbe2ed9 --- /dev/null +++ b/tests/testdata/live_docs/cyber_dojo_aws_prod.json @@ -0,0 +1,4983 @@ +{ + "index": 4357, + "is_latest": true, + "next_snapshot_timestamp": null, + "artifact_compliance_count": { + "true": 10, + "false": 0, + "null": 0 + }, + "timestamp": 1777956838.5302956, + "type": "ECS", + "compliant": true, + "html_url": "https://app.kosli.com/cyber-dojo/environments/aws-prod/snapshots/4357", + "artifacts": [ + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:95ab455@sha256:1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf", + "creationTimestamp": [ + 1777956787 + ], + "pods": null, + "annotation": { + "type": "started-compliant", + "was": 0, + "now": 1 + }, + "flow_name": "languages-start-points-ci", + "git_commit": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce", + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=c6ff1415-5cd1-48d0-a0df-cbcbcc5e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/a97ed054e38d484a0015cd658f1d593c03ea2a61...95ab455dd7301b20c744f50b1cd015e4396aedce", + "previous_git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 889.0, + "flows": [ + { + "flow_name": "languages-start-points-ci", + "trail_name": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "template_reference_name": "languages-start-points", + "git_commit": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce", + "git_commit_info": { + "sha1": "95ab455dd7301b20c744f50b1cd015e4396aedce", + "message": "Merge pull request #204 from cyber-dojo/update-csharp-nunit\n\nEnsure we have the latest csharp-nunit", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777955898.0, + "url": "https://github.com/cyber-dojo/languages-start-points/commit/95ab455dd7301b20c744f50b1cd015e4396aedce" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=c6ff1415-5cd1-48d0-a0df-cbcbcc5e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/a97ed054e38d484a0015cd658f1d593c03ea2a61...95ab455dd7301b20c744f50b1cd015e4396aedce", + "previous_git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 889.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promotion-one-43", + "template_reference_name": "languages-start-points", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/1eea61094353db37c7ef3e9582e63f3427c5e01fe76b8210db985144d10088cf?artifact_id=eee48a16-8b70-4f29-859c-b7904baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1085da6ce837c6ebc77dda1e23b5de4e3c33380f...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_trail_name": "promote-all-13", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 594794.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/8d3e40c13af6400b975170c90e1c0bb7", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:1999d13@sha256:541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "creationTimestamp": [ + 1777842904, + 1777842905, + 1777842905 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 3, + "now": 3 + }, + "flow_name": "web-ci", + "git_commit": "1999d1303424879336b04fa3310256554aa6cfa6", + "commit_url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6", + "html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=359b4539-989d-48f5-88eb-8a553baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/web/compare/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98...1999d1303424879336b04fa3310256554aa6cfa6", + "previous_git_commit": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/web/commit/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_trail_name": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 1241.0, + "flows": [ + { + "flow_name": "web-ci", + "trail_name": "1999d1303424879336b04fa3310256554aa6cfa6", + "template_reference_name": "web", + "git_commit": "1999d1303424879336b04fa3310256554aa6cfa6", + "commit_url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6", + "git_commit_info": { + "sha1": "1999d1303424879336b04fa3310256554aa6cfa6", + "message": "Enable CSRF token enforcement on POST requests (Phase 2) (#306)\n\nPhase 1 (deployed April 14) set the csrf_token cookie on all responses.\nPhase 2 enables the enforcement check that was left commented out pending\nall users reloading. Adds a global jQuery ajaxSend hook so all POST\nrequests automatically include the token, and updates the controller test\nbase to seed the cookie and merge the token into POST params.\n\nUsers with a kata page open before this deploy will get one 403 on their\nnext test run; reloading the page picks up the new JS and self-heals.\n\nCo-authored-by: Claude Sonnet 4.6 ", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777841663.0, + "url": "https://github.com/cyber-dojo/web/commit/1999d1303424879336b04fa3310256554aa6cfa6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=359b4539-989d-48f5-88eb-8a553baf", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/web-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/web/compare/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98...1999d1303424879336b04fa3310256554aa6cfa6", + "previous_git_commit": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/web/commit/23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_trail_name": "23d6f24c36ffdf1210e3556a1f4d1d6b35cfdf98", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 1241.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "template_reference_name": "web", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=a34a55d8-2118-49ac-8899-aa2b6306", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1085da6ce837c6ebc77dda1e23b5de4e3c33380f...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_fingerprint": "3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/web:23d6f24@sha256:3302e9aee07946df391e246572cda3ea64de480c92d7f598c3e6ead9cb5e3020", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_trail_name": "promote-all-12", + "previous_template_reference_name": "web" + }, + "commit_lead_time": 480911.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "template_reference_name": "web", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=70de9485-fbcc-4d37-a744-546c44ba", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": 227969.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "web-541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180", + "template_reference_name": "web", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/541b7d4c1b129eb894ce1dd1713f72ae268e07cf49d178aeda684bbef2bfc180?artifact_id=24f2f6c9-5fa2-4dbd-8bb5-fc5624f3", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": 227969.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/9560296ee7a54a18afe27e41c76be7c5", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5@sha256:b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "creationTimestamp": [ + 1777550805, + 1777550806, + 1777550809 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 3, + "now": 3 + }, + "flow_name": "runner-ci", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "commit_url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/runner/compare/bcf912346ae0a104698da4560e82d5eb277fc0e9...a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "previous_git_commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/runner/commit/bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_trail_name": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 3201.0, + "flows": [ + { + "flow_name": "runner-ci", + "trail_name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "template_reference_name": "runner", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "commit_url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/runner/compare/bcf912346ae0a104698da4560e82d5eb277fc0e9...a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "previous_git_commit": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/runner/commit/bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_trail_name": "bcf912346ae0a104698da4560e82d5eb277fc0e9", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 3201.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-12", + "template_reference_name": "runner", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=a28dcf25-ff8e-40f5-8adc-c24b10ef", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/1a3f516ca3da64bb329c5447dddc8c58751ec82b...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "1a3f516ca3da64bb329c5447dddc8c58751ec82b", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1a3f516ca3da64bb329c5447dddc8c58751ec82b", + "previous_trail_name": "promotion-one-42", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": 188812.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "template_reference_name": "runner", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=437eec67-3d3d-422a-956e-937f5ca0", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -64130.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "runner-b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "template_reference_name": "runner", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039?artifact_id=5f006806-103b-467f-9cf2-610c41ba", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/snyk-scanning/compare/7e307436bf47f2ce550e8e86838f4993b385de5c...117e18e0cb1eab30b9747ece58327eabfc595b90", + "previous_git_commit": "7e307436bf47f2ce550e8e86838f4993b385de5c", + "previous_fingerprint": "0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:bcf9123@sha256:0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/7e307436bf47f2ce550e8e86838f4993b385de5c", + "previous_trail_name": "runner-0ef17bb0750a014fffa6cc419feb5b69774db08f18a354a39b552a5b1e785f98", + "previous_template_reference_name": "runner" + }, + "commit_lead_time": -64130.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/bb5a7256bb4445b9821ff8e6e3cf0a86", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b@sha256:3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "creationTimestamp": [ + 1776923862 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "dashboard-ci", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "commit_url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "previous_git_commit": "632127a7f162ad1ac02305a2940888264034364b", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/dashboard/commit/632127a7f162ad1ac02305a2940888264034364b", + "previous_trail_name": "632127a7f162ad1ac02305a2940888264034364b", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 2577.0, + "flows": [ + { + "flow_name": "dashboard-ci", + "trail_name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "template_reference_name": "dashboard", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "commit_url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=1281066d-38ba-432c-92c2-f3d7003e", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/dashboard/compare/632127a7f162ad1ac02305a2940888264034364b...a6ece2b597888f7ab149759daadda08e3afab0c1", + "previous_git_commit": "632127a7f162ad1ac02305a2940888264034364b", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/dashboard/commit/632127a7f162ad1ac02305a2940888264034364b", + "previous_trail_name": "632127a7f162ad1ac02305a2940888264034364b", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 2577.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "dashboard", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=2acc6089-d810-49af-a10f-ff262a82", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:632127a@sha256:a03cce86f5958febc442665846863ab9701456d766e76ad3816f3f00a971d850", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "dashboard" + }, + "commit_lead_time": 824607.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "template_reference_name": "dashboard", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=b2e65a6a-5b36-46a7-a91a-5c509bd5", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691073.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "dashboard-3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "template_reference_name": "dashboard", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e?artifact_id=583e204e-a961-470e-a45e-d894bff1", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691073.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/0993e7a4118e4a7699ad6eb9c06a4b47", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:92c0996@sha256:1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "creationTimestamp": [ + 1776923549 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "saver-ci", + "git_commit": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "commit_url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751", + "html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "previous_git_commit": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/saver/commit/0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_trail_name": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 2075.0, + "flows": [ + { + "flow_name": "saver-ci", + "trail_name": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "template_reference_name": "saver", + "git_commit": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "commit_url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751", + "git_commit_info": { + "sha1": "92c0996cd9ae7642eb0769f928abe6cb6c391751", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#364)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921474.0, + "url": "https://github.com/cyber-dojo/saver/commit/92c0996cd9ae7642eb0769f928abe6cb6c391751" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=3666aa1b-a19b-4ab5-a625-fa6afa9d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/saver-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/saver/compare/0b77a6402320cd10c30cf5bbf6486aa1a448443a...92c0996cd9ae7642eb0769f928abe6cb6c391751", + "previous_git_commit": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/saver/commit/0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_trail_name": "0b77a6402320cd10c30cf5bbf6486aa1a448443a", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 2075.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "saver", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=572576fd-b54a-4556-b8c6-a456fc62", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/saver:0b77a64@sha256:5b067d99f617888d66b2656537e442d41ab32367758392fb1e55c88f2e1dce7f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "saver" + }, + "commit_lead_time": 824294.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "template_reference_name": "saver", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=feccccc8-41ef-4146-8bfc-b1f1725a", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691386.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "saver-1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805", + "template_reference_name": "saver", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/1aec038070877c202ebcf960c202fa5dd35b511d36a3d5a9dda5f2dda2300805?artifact_id=bceeead3-4d64-4697-8fb0-a84fbce7", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691386.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/9e8d3a77fae14af1b3f5fd22dc8185cf", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:9dd6c65@sha256:cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "creationTimestamp": [ + 1776923539 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "custom-start-points-ci", + "git_commit": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3", + "html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=f1d404d2-81f9-4f7a-9a01-9742e3e2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/custom-start-points/compare/8adb92a471e3f5caf65481155d45121a865b67a7...9dd6c657bc443c45c19e81165ff99286e237cfe3", + "previous_git_commit": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_trail_name": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 2530.0, + "flows": [ + { + "flow_name": "custom-start-points-ci", + "trail_name": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "template_reference_name": "custom-start-points", + "git_commit": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3", + "git_commit_info": { + "sha1": "9dd6c657bc443c45c19e81165ff99286e237cfe3", + "message": "Merge pull request #110 from cyber-dojo/remove-defaulted-aws-rolename\n\nRemove defaulted aws-rolename from snyk-scanning job", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921009.0, + "url": "https://github.com/cyber-dojo/custom-start-points/commit/9dd6c657bc443c45c19e81165ff99286e237cfe3" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=f1d404d2-81f9-4f7a-9a01-9742e3e2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/custom-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/custom-start-points/compare/8adb92a471e3f5caf65481155d45121a865b67a7...9dd6c657bc443c45c19e81165ff99286e237cfe3", + "previous_git_commit": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/custom-start-points/commit/8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_trail_name": "8adb92a471e3f5caf65481155d45121a865b67a7", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 2530.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "custom-start-points", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=604eb5a4-324d-4140-a976-19265352", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/custom-start-points:8adb92a@sha256:db4ebea9fe973c7f195668be3706cd6049c07ed693de1b6e7a2a090f00498497", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "custom-start-points" + }, + "commit_lead_time": 824284.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "template_reference_name": "custom-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=3332a11e-91c5-44c9-8daf-c7a67940", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691396.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "custom-start-points-cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1", + "template_reference_name": "custom-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/cdf80bb23fc22020b7a7eb8278540fc85345f1130eea182c5bf4ad5d8a20a7d1?artifact_id=8f0f7459-c270-49fd-8642-58e07238", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691396.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/f009873b96764616a63037619de83dd3", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0@sha256:becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "creationTimestamp": [ + 1776923213 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "differ-ci", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "commit_url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=046919b1-42dd-47f8-8569-912d0259", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/differ/compare/c9bbaa1eceb4b8bdffa065ea7034de23d3364919...30dffd09c3f896a322c65029247abcea3019c43a", + "previous_git_commit": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/differ/commit/c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_trail_name": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 1092.0, + "flows": [ + { + "flow_name": "differ-ci", + "trail_name": "30dffd09c3f896a322c65029247abcea3019c43a", + "template_reference_name": "differ", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a", + "commit_url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=046919b1-42dd-47f8-8569-912d0259", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/differ/compare/c9bbaa1eceb4b8bdffa065ea7034de23d3364919...30dffd09c3f896a322c65029247abcea3019c43a", + "previous_git_commit": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/differ/commit/c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_trail_name": "c9bbaa1eceb4b8bdffa065ea7034de23d3364919", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 1092.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "differ", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=a5169b25-0d5c-491c-991e-2c1d389b", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:c9bbaa1@sha256:480f4443a28b5057b956b1bcce13475b41bd2c1343563f18337ac0e7bf6e65ea", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "differ" + }, + "commit_lead_time": 823958.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "template_reference_name": "differ", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=182c9255-9d29-4ad5-9c5c-d5d99a71", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691722.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "differ-becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "template_reference_name": "differ", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355?artifact_id=69fce703-8636-4932-9b82-3025560b", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691722.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/ee14a7db1433415dbcbf9b2a5a983c4d", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:447231c@sha256:691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "creationTimestamp": [ + 1776923208 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "exercises-start-points-ci", + "git_commit": "447231c2018bc0690735b4ee110ca46431162fd5", + "commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5", + "html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "previous_git_commit": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_trail_name": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 2123.0, + "flows": [ + { + "flow_name": "exercises-start-points-ci", + "trail_name": "447231c2018bc0690735b4ee110ca46431162fd5", + "template_reference_name": "exercises-start-points", + "git_commit": "447231c2018bc0690735b4ee110ca46431162fd5", + "commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5", + "git_commit_info": { + "sha1": "447231c2018bc0690735b4ee110ca46431162fd5", + "message": "Merge pull request #117 from cyber-dojo/remove-defaulted-aws-rolename\n\nRemove defaulted aws-rolename from snyk-scanning job", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921085.0, + "url": "https://github.com/cyber-dojo/exercises-start-points/commit/447231c2018bc0690735b4ee110ca46431162fd5" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=98831c77-04a8-4427-9cf8-03950550", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/exercises-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/exercises-start-points/compare/83ea563b423559eaf750dd680fc2329e59f60e3b...447231c2018bc0690735b4ee110ca46431162fd5", + "previous_git_commit": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/exercises-start-points/commit/83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_trail_name": "83ea563b423559eaf750dd680fc2329e59f60e3b", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 2123.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "exercises-start-points", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=82549870-9631-4bf3-90f7-13e64e6f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/exercises-start-points:83ea563@sha256:597d104edc7247a48d3a0339dd240d965a3176d0c1ce6531a1e2b5b8a9250846", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-10", + "previous_template_reference_name": "exercises-start-points" + }, + "commit_lead_time": 823953.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "template_reference_name": "exercises-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=6e528299-ee26-4cef-8108-84ebc9a2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691727.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "exercises-start-points-691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac", + "template_reference_name": "exercises-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/691a6f0bcd1ce71af0a2175f1c4295e627f3e5ea93cb78264a2042d8ed2aa9ac?artifact_id=63f17762-9384-450d-b001-78aaa94d", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691727.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/a86d9e772a4b43e0b855e0e9d43163ca", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:b1ce55b@sha256:69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "creationTimestamp": [ + 1776923200 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "nginx-ci", + "git_commit": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "commit_url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=8a73edbf-8c34-4371-a0a1-001dffd2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/nginx/compare/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd...b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "previous_git_commit": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/nginx/commit/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_trail_name": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 164853.0, + "flows": [ + { + "flow_name": "nginx-ci", + "trail_name": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "template_reference_name": "nginx", + "git_commit": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "commit_url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "git_commit_info": { + "sha1": "b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "message": "Merge pull request #108 from cyber-dojo/fix-workflow-call-2\n\nFix workflow call", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776758347.0, + "url": "https://github.com/cyber-dojo/nginx/commit/b1ce55beb190397c80d3ba0536f6b97bb5f468f6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=8a73edbf-8c34-4371-a0a1-001dffd2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/nginx-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/nginx/compare/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd...b1ce55beb190397c80d3ba0536f6b97bb5f468f6", + "previous_git_commit": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/nginx/commit/c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_trail_name": "c6c81a0f8b1458a62eee956bb16a8b32a37fd0fd", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 164853.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-11", + "template_reference_name": "nginx", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=445f9dbc-9f0f-4b04-bf3f-19ad3199", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/nginx:c6c81a0@sha256:818b3f15b642c9aa981397310a632d342a68e667224b55bd9a1b1b4ed0547284", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promotion-one-34", + "previous_template_reference_name": "nginx" + }, + "commit_lead_time": 823945.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "template_reference_name": "nginx", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=084a57cf-f6a8-4303-ae83-0aee4c68", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -691735.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "nginx-69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d", + "template_reference_name": "nginx", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/69ac936feb8487b10fe54005660e407fbc2d7cb058c98485b9764db0f12b041d?artifact_id=aff4d03c-afb1-438e-9b60-c5813e72", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -691735.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/70cb5b4768f343569f6ffc81a51d984d", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:65fd2bf@sha256:ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "creationTimestamp": [ + 1776256761 + ], + "pods": null, + "annotation": { + "type": "unchanged", + "was": 1, + "now": 1 + }, + "flow_name": "creator-ci", + "git_commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c5d209a3-9139-4f5b-a553-c6351091", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci", + "deployment_diff": { + "diff_url": "https://gitlab.com/cyber-dojo/creator/-/compare/f89742ee5f0477a7c729bfdeadc84dcbd70492b2...65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "previous_git_commit": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_trail_name": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 4517.0, + "flows": [ + { + "flow_name": "creator-ci", + "trail_name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "template_reference_name": "creator", + "git_commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c5d209a3-9139-4f5b-a553-c6351091", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci", + "deployment_diff": { + "diff_url": "https://gitlab.com/cyber-dojo/creator/-/compare/f89742ee5f0477a7c729bfdeadc84dcbd70492b2...65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "previous_git_commit": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://gitlab.com/cyber-dojo/creator/-/commit/f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_trail_name": "f89742ee5f0477a7c729bfdeadc84dcbd70492b2", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 4517.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-9", + "template_reference_name": "creator", + "git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "git_commit_info": { + "sha1": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "message": "Revert WEB_SECRET_KEY_BASE changes - SECRET_KEY_BASE now fetched from AWS SSM in web's Terraform\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776099255.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=c1a47a75-cdd5-446b-b08e-040067c3", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/creator:f89742e@sha256:fe04c26b299dbb3ae9feb00d3955427d03a929c7f50e531acc243a176e01f16f", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promotion-one-28", + "previous_template_reference_name": "creator" + }, + "commit_lead_time": 157506.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-archived-at-1776759327", + "trail_name": "creator-medium-SNYK-ALPINE322-ZLIB-16078399", + "template_reference_name": "artifact", + "git_commit": "8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "commit_url": "https://github.com/cyber-dojo/live-snyk-scans/commit/8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "git_commit_info": { + "sha1": "8440baadcaccb4ceeb8ba26b25579eb16cc447d6", + "message": "Remove unnecessary floor() on trail creation timestamp\n\nfloor() was needed for bash integer arithmetic that has since been\nremoved; .created_at is now only used as a JSON number, which supports\nfloats natively.", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1776347865.0, + "url": "https://github.com/cyber-dojo/live-snyk-scans/commit/8440baadcaccb4ceeb8ba26b25579eb16cc447d6" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-archived-at-1776759327/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=240caf97-910e-4c8b-91dd-ef048d65", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-archived-at-1776759327", + "deployment_diff": null, + "commit_lead_time": -91104.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "template_reference_name": "creator", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=893e3314-fdff-4f62-b899-2f874504", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": -1358174.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "creator-ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "template_reference_name": "creator", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f?artifact_id=a394a189-0af2-4900-8278-f11ac37c", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": -1358174.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/712400a03ac04a9fb22935535516a317", + "cluster_name": null, + "service_name": null + } + }, + { + "name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:a97ed05@sha256:8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "compliant": true, + "deployments": [], + "policy_decisions": [ + { + "policy_version": 1, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": false, + "exceptions": [] + } + }, + "satisfied": null, + "ignored": true, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_not_applicable", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_satisfied", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "snyk-scan-aws-prod" + }, + { + "policy_version": 6, + "status": "COMPLIANT", + "rule_evaluations": [ + { + "rule": { + "type": "provenance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + }, + { + "rule": { + "type": "trail-compliance", + "definition": { + "required": true, + "exceptions": [ + { + "if": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": "COMPLIANT" + } + } + ] + }, + { + "rule": { + "type": "attestation", + "definition": { + "if": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + }, + "satisfied": true, + "ignored": false, + "resolutions": [ + { + "type": "rule_satisfied", + "context": { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + }, + { + "type": "rule_not_applicable", + "context": { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "artifact_status": null + } + } + ] + } + ], + "policy_name": "build-process" + } + ], + "reasons_for_incompliance": [], + "fingerprint": "8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "creationTimestamp": [ + 1777842906 + ], + "pods": null, + "annotation": { + "type": "exited", + "was": 1, + "now": 0 + }, + "flow_name": "languages-start-points-ci", + "git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_git_commit": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_trail_name": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 819.0, + "flows": [ + { + "flow_name": "languages-start-points-ci", + "trail_name": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "template_reference_name": "languages-start-points", + "git_commit": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61", + "git_commit_info": { + "sha1": "a97ed054e38d484a0015cd658f1d593c03ea2a61", + "message": "Merge pull request #203 from cyber-dojo/update-python-pytest\n\nUpdate python-pytest", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777842087.0, + "url": "https://github.com/cyber-dojo/languages-start-points/commit/a97ed054e38d484a0015cd658f1d593c03ea2a61" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=a62586e6-58ba-4a88-84cf-1d49694f", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/languages-start-points-ci", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/languages-start-points/compare/98e8281ec23d94507d02b8d335b2dd8064e2149b...a97ed054e38d484a0015cd658f1d593c03ea2a61", + "previous_git_commit": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/languages-start-points/commit/98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_trail_name": "98e8281ec23d94507d02b8d335b2dd8064e2149b", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 819.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "production-promotion", + "trail_name": "promote-all-13", + "template_reference_name": "languages-start-points", + "git_commit": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "git_commit_info": { + "sha1": "1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "message": "Add Snyk scan to promote-all, scoped to aws-prod compliance only\n\nMirrors the change made to promote-one: inserts a snyk-scan job\n(before sdlc-control-gate) that scans each artifact against the\naws-prod environment policy. Removes KOSLI_AWS_BETA env var and\nthe aws-beta assert and attest steps.\n\nCo-Authored-By: Claude Sonnet 4.6 ", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777361993.0, + "url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/1085da6ce837c6ebc77dda1e23b5de4e3c33380f" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=fd354e7f-c2ef-4e37-bb92-49b6ce16", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/production-promotion", + "deployment_diff": { + "diff_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/compare/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa...1085da6ce837c6ebc77dda1e23b5de4e3c33380f", + "previous_git_commit": "87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_fingerprint": "281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/languages-start-points:98e8281@sha256:281eba54d6b1083b3d7b987facc053202636433de0ef5facbc6145dda5156bc4", + "previous_artifact_compliance_state": "COMPLIANT", + "previous_running": false, + "previous_git_commit_url": "https://github.com/cyber-dojo/aws-prod-co-promotion/commit/87f1f819ee6eaaf1f811259b0778f5e0cff7a0fa", + "previous_trail_name": "promote-all-11", + "previous_template_reference_name": "languages-start-points" + }, + "commit_lead_time": 480913.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-beta", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "template_reference_name": "languages-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=61b86531-a2c1-4c75-96a0-b5497786", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-beta", + "deployment_diff": null, + "commit_lead_time": 227971.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + }, + { + "flow_name": "snyk-vulns-aws-prod", + "trail_name": "languages-start-points-8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e", + "template_reference_name": "languages-start-points", + "git_commit": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "commit_url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90", + "git_commit_info": { + "sha1": "117e18e0cb1eab30b9747ece58327eabfc595b90", + "message": "Add debug commands for kosli-fingerprint", + "author": "JonJagger ", + "branch": "main", + "timestamp": 1777614935.0, + "url": "https://github.com/cyber-dojo/snyk-scanning/commit/117e18e0cb1eab30b9747ece58327eabfc595b90" + }, + "html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod/artifacts/8ba20a0fbdc3d234fb0dac28a9865b6ee719906d06229f9f15b2078a3f6f332e?artifact_id=136bb00b-9e03-4924-89d5-6bc33be2", + "flow_html_url": "https://app.kosli.com/cyber-dojo/flows/snyk-vulns-aws-prod", + "deployment_diff": null, + "commit_lead_time": 227971.0, + "artifact_compliance_in_flow": true, + "flow_reasons_for_non_compliance": [] + } + ], + "ecs_context": { + "task_arn": "arn:aws:ecs:eu-central-1:274425519734:task/app/c83d5207d2af4ecdac8d64627f8fb7bf", + "cluster_name": null, + "service_name": null + } + } + ], + "applied_policies": [ + { + "id": "93d8505f-bce5-4c7c-a2c8-f98236c8", + "name": "snyk-scan-aws-prod", + "version": 1, + "policy_dump": { + "schema_version": "1", + "artifacts": { + "provenance": { + "required": false, + "exceptions": [] + }, + "trail_compliance": { + "required": false, + "exceptions": [] + }, + "attestations": [ + { + "if_condition": { + "text": "flow.name == \"snyk-vulns-aws-prod\"" + }, + "name": "snyk-container-scan", + "type": "generic", + "must_be_compliant": true + } + ] + } + }, + "failing_artifacts": [] + }, + { + "id": "e398f263-0770-42d3-bca1-b417aba0", + "name": "build-process", + "version": 6, + "policy_dump": { + "schema_version": "1", + "artifacts": { + "provenance": { + "required": true, + "exceptions": [ + { + "if_condition": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + }, + "trail_compliance": { + "required": true, + "exceptions": [ + { + "if_condition": { + "text": "flow.tags.kind != \"build\"" + } + } + ] + }, + "attestations": [ + { + "if_condition": { + "text": "flow.tags.kind == \"build\"" + }, + "name": "*", + "type": "pull_request", + "must_be_compliant": true + } + ] + } + }, + "failing_artifacts": [] + } + ] +} \ No newline at end of file diff --git a/tests/testdata/live_docs/cyber_dojo_trail_creator-ci.json b/tests/testdata/live_docs/cyber_dojo_trail_creator-ci.json new file mode 100644 index 0000000..a22dcdc --- /dev/null +++ b/tests/testdata/live_docs/cyber_dojo_trail_creator-ci.json @@ -0,0 +1,470 @@ +{ + "name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "description": "", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" + }, + "origin_url": "https://gitlab.com/cyber-dojo/creator/-/jobs/13932530950", + "user_data": {}, + "repo_ids": [ + "a4bbd22e-cd62-4695-b6ea-437fb8ce" + ], + "last_modified_at": 1776253126.1594, + "created_at": 1776252299.7855096, + "compliance_status": { + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "pull-request", + "attestation_type": "pull_request", + "attestation_id": "763af9cc-b908-456d-935c-f4deb860", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "branch-protection", + "attestation_type": "custom:branch-protection", + "attestation_id": "cda3f464-2b3d-4961-a80f-a5c15d70", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "dast-report", + "attestation_type": "custom:dast-report", + "attestation_id": "fbc2f6ec-1dc4-4762-8781-659a4897", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "artifacts_statuses": { + "creator": { + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_id": "c5d209a3-9139-4f5b-a553-c6351091", + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "lint", + "attestation_type": "generic", + "attestation_id": "3140c88d-083b-4be4-922f-08603d1a", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "unit-test", + "attestation_type": "junit", + "attestation_id": "7c731680-ff9f-4e22-8147-32e8629f", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + }, + { + "attestation_name": "test-branch-coverage", + "attestation_type": "generic", + "attestation_id": "27c3762e-631f-429d-863a-99a3d404", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": false + } + ], + "unexpected": false, + "evaluated_at": 1776252695.6943574, + "flow_template_id": "1d346bb4-169a-4ee0-8e14-d8043498" + } + }, + "evaluated_at": 1776252695.6943574, + "flow_template_id": "1d346bb4-169a-4ee0-8e14-d8043498" + }, + "template": { + "version": 1, + "trail": { + "attestations": [ + { + "name": "pull-request", + "type": "pull_request" + }, + { + "name": "branch-protection", + "type": "custom:branch-protection" + } + ], + "artifacts": [ + { + "name": "creator", + "attestations": [ + { + "name": "lint", + "type": "generic" + }, + { + "name": "unit-test", + "type": "junit" + }, + { + "name": "test-branch-coverage", + "type": "generic" + } + ] + } + ] + }, + "content": "version: 1\n\ntrail:\n attestations:\n - name: pull-request\n type: pull_request\n - name: branch-protection\n type: custom:branch-protection\n artifacts:\n - name: creator\n attestations:\n - name: lint\n type: generic\n - name: unit-test\n type: junit\n - name: test-branch-coverage\n type: generic\n" + }, + "compliance_state": "COMPLIANT", + "is_compliant": true, + "events": [ + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252299.7855096, + "type": "trail_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252299.775839 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "name": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "creating_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "description": "", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" + }, + "template_id": "1d346bb4-169a-4ee0-8e14-d8043498", + "origin_url": "https://gitlab.com/cyber-dojo/creator/-/jobs/13932530950", + "user_data": "{}", + "repo_ids": [ + "a4bbd22e-cd62-4695-b6ea-437fb8ce" + ] + } + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252351.422441, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252351.3344343 + }, + "attestation_type": "pull_request", + "is_compliant": true, + "attestation_id": "763af9cc-b908-456d-935c-f4deb860", + "template_reference_name": "pull-request" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252354.1434097, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252354.0611956 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "3140c88d-083b-4be4-922f-08603d1a", + "template_reference_name": "lint", + "target_artifact": "creator" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252362.5431488, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252362.4543567 + }, + "attestation_type": "custom:branch-protection", + "is_compliant": true, + "attestation_id": "cda3f464-2b3d-4961-a80f-a5c15d70", + "template_reference_name": "branch-protection" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252403.582429, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252403.572518 + }, + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_name": "cyberdojo/creator:65fd2bf", + "artifact_id": "c5d209a3-9139-4f5b-a553-c6351091", + "template_reference_name": "creator", + "git_commit": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252693.482904, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252693.3686984 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "7c731680-ff9f-4e22-8147-32e8629f", + "template_reference_name": "unit-test", + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_name": "cyberdojo/creator:65fd2bf", + "target_artifact": "creator" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252695.6943574, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776252695.5762572 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "27c3762e-631f-429d-863a-99a3d404", + "template_reference_name": "test-branch-coverage", + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "artifact_name": "cyberdojo/creator:65fd2bf", + "target_artifact": "creator" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776252924.2131932, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 6415, + "replica_number": 1, + "template_reference_name": "creator" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776253126.1594, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "message": "Merge branch 'fix-multijson-deprecation-warning' into 'main'\n\nBypass MultiJson.encode deprecation warning in Sinatra's json helper\n\nSee merge request cyber-dojo/creator!243", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776252244.0, + "url": "https://gitlab.com/cyber-dojo/creator/-/commit/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c", + "parents": null + }, + "repo_info": { + "inner_id": "a4bbd22e-cd62-4695-b6ea-437fb8ce", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "53419335", + "name": "creator", + "url": "https://gitlab.com/cyber-dojo/creator", + "provider": "gitlab", + "description": "The https://cyber-dojo.org UI to configure and create (or re-enter) a group-exercise or an individual-exercise.", + "created_at": 1768825460.0531082, + "last_modified_at": 1776253126.069349 + }, + "attestation_type": "custom:dast-report", + "is_compliant": true, + "attestation_id": "fbc2f6ec-1dc4-4762-8781-659a4897", + "template_reference_name": "dast-report" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1776256798.610816, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 4237, + "replica_number": 1, + "template_reference_name": "creator" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "e4e08b57-e36e-4724-acc8-04e7e437", + "trail_id": "43c8ab31-45d7-4250-b07e-eef1e9f8", + "timestamp": 1777883123.9145384, + "type": "artifact_stopped_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "ce59db031695ca55deaaacefda233875fe5c32783c69816fcea2bb3642636e4f", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 6610, + "template_reference_name": "creator" + } + ], + "created_by": "ci-pipelines", + "flow": { + "name": "creator-ci", + "tags": { + "ci": "gitlab", + "repo_url": "https://gitlab.com/cyber-dojo/creator", + "kind": "build" + } + }, + "external_urls": null, + "html_url": "https://app.kosli.com/cyber-dojo/flows/creator-ci/trails/65fd2bfa2478534ea4bc5ccf30f6bfc6aab7550c" +} \ No newline at end of file diff --git a/tests/testdata/live_docs/cyber_dojo_trail_dashboard-ci.json b/tests/testdata/live_docs/cyber_dojo_trail_dashboard-ci.json new file mode 100644 index 0000000..d9d1189 --- /dev/null +++ b/tests/testdata/live_docs/cyber_dojo_trail_dashboard-ci.json @@ -0,0 +1,601 @@ +{ + "name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "description": "", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + "origin_url": "https://github.com/cyber-dojo/dashboard/actions/runs/24818121954", + "user_data": {}, + "repo_ids": [ + "4c546fde-c5ee-4a39-b399-8c71d7e1" + ], + "last_modified_at": 1776921476.6412313, + "created_at": 1776921304.3582873, + "compliance_status": { + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "pull-request", + "attestation_type": "pull_request", + "attestation_id": "6e554536-c39a-4031-8e25-b64a3a57", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "artifacts_statuses": { + "dashboard": { + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_id": "1281066d-38ba-432c-92c2-f3d7003e", + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "rubocop-lint", + "attestation_type": "junit", + "attestation_id": "c4f4e82a-4aff-43bc-bab2-5399ea3f", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "provenance-attestation", + "attestation_type": "generic", + "attestation_id": "38db62c5-48bc-4fa7-8ffc-e3528f0b", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "sbom", + "attestation_type": "generic", + "attestation_id": "d519c8d9-d71e-4f0d-8f95-8e5e0e63", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "sonarcloud-scan", + "attestation_type": "sonar", + "attestation_id": "2377ce1f-f4b4-47c4-8458-8f16de62", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test", + "attestation_type": "junit", + "attestation_id": "02554a9a-297f-42bb-9f6a-b2cb82bd", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test-coverage", + "attestation_type": "generic", + "attestation_id": "85132387-c4a7-476d-affd-42181927", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "snyk-container-scan", + "attestation_type": "generic", + "attestation_id": "4223c865-5232-461e-b065-ea46aa5d", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "unexpected": true, + "evaluated_at": 1776921476.6412313, + "flow_template_id": "8cbfe83e-4b17-48a6-aea8-a3c4e17a" + } + }, + "evaluated_at": 1776921475.22626, + "flow_template_id": "8cbfe83e-4b17-48a6-aea8-a3c4e17a" + }, + "template": { + "version": 1, + "trail": { + "attestations": [], + "artifacts": [] + }, + "content": "version: 1\n" + }, + "compliance_state": "COMPLIANT", + "is_compliant": true, + "events": [ + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921304.3582873, + "type": "trail_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921304.3457723 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "name": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "creating_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "description": "", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + "template_id": "7ed1eeb4-182a-40c6-a647-67e9f1b9", + "origin_url": "https://github.com/cyber-dojo/dashboard/actions/runs/24818121954", + "user_data": "{}", + "repo_ids": [ + "4c546fde-c5ee-4a39-b399-8c71d7e1" + ] + } + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921322.7155352, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921322.7099218 + }, + "attestation_type": "pull_request", + "is_compliant": true, + "attestation_id": "6e554536-c39a-4031-8e25-b64a3a57", + "template_reference_name": "pull-request" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921330.2997253, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921330.1741211 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "c4f4e82a-4aff-43bc-bab2-5399ea3f", + "template_reference_name": "rubocop-lint", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921378.4248486, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921378.4127085 + }, + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "artifact_id": "e62bcd20-a13a-415c-99b3-d559bc83", + "template_reference_name": "dashboard", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921380.0375767, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921379.9081454 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "38db62c5-48bc-4fa7-8ffc-e3528f0b", + "template_reference_name": "provenance-attestation", + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921382.1045737, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921381.9554534 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "d519c8d9-d71e-4f0d-8f95-8e5e0e63", + "template_reference_name": "sbom", + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921383.2431839, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921383.2383318 + }, + "attestation_type": "sonar", + "is_compliant": true, + "attestation_id": "2377ce1f-f4b4-47c4-8458-8f16de62", + "template_reference_name": "sonarcloud-scan", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921427.5044367, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921427.403284 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "02554a9a-297f-42bb-9f6a-b2cb82bd", + "template_reference_name": "unit-test", + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921429.3588176, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921429.3510954 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "85132387-c4a7-476d-affd-42181927", + "template_reference_name": "unit-test-coverage", + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921473.9584422, + "type": "trail_updated", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921473.94968 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "description": "", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + "user_data": "{}", + "template_id": "8cbfe83e-4b17-48a6-aea8-a3c4e17a", + "origin_url": "https://github.com/cyber-dojo/dashboard/actions/runs/24818121954" + }, + "changes": [ + "git_commit_info", + "template" + ] + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921475.22626, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921475.2154632 + }, + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "artifact_id": "1281066d-38ba-432c-92c2-f3d7003e", + "template_reference_name": "dashboard", + "git_commit": "a6ece2b597888f7ab149759daadda08e3afab0c1" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921476.6412313, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a6ece2b597888f7ab149759daadda08e3afab0c1", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#363)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776921285.0, + "url": "https://github.com/cyber-dojo/dashboard/commit/a6ece2b597888f7ab149759daadda08e3afab0c1", + "parents": null + }, + "repo_info": { + "inner_id": "4c546fde-c5ee-4a39-b399-8c71d7e1", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "290597708", + "name": "cyber-dojo/dashboard", + "url": "https://github.com/cyber-dojo/dashboard", + "provider": "github", + "description": null, + "created_at": 1768639963.3866346, + "last_modified_at": 1776921476.5239544 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "4223c865-5232-461e-b065-ea46aa5d", + "template_reference_name": "snyk-container-scan", + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/dashboard:a6ece2b", + "target_artifact": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776921623.8365097, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 6555, + "replica_number": 1, + "template_reference_name": "dashboard" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "f60c8f3f-67cd-4496-8e17-ed6fdb1e", + "trail_id": "46be6c3c-295e-423f-b063-28dacb6a", + "timestamp": 1776923878.6159692, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "3f419f93e3cdd7a3a2b358fdee8ee925dc233b5b2fe0eff20d8bce17f7473c8e", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 4313, + "replica_number": 1, + "template_reference_name": "dashboard" + } + ], + "created_by": "ci-pipelines", + "flow": { + "name": "dashboard-ci", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/dashboard", + "kind": "build" + } + }, + "external_urls": null, + "html_url": "https://app.kosli.com/cyber-dojo/flows/dashboard-ci/trails/a6ece2b597888f7ab149759daadda08e3afab0c1" +} \ No newline at end of file diff --git a/tests/testdata/live_docs/cyber_dojo_trail_differ-ci.json b/tests/testdata/live_docs/cyber_dojo_trail_differ-ci.json new file mode 100644 index 0000000..b35bc87 --- /dev/null +++ b/tests/testdata/live_docs/cyber_dojo_trail_differ-ci.json @@ -0,0 +1,784 @@ +{ + "name": "30dffd09c3f896a322c65029247abcea3019c43a", + "description": "", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a" + }, + "origin_url": "https://github.com/cyber-dojo/differ/actions/runs/24818543745", + "user_data": {}, + "repo_ids": [ + "09751ccc-0d15-4b83-a4da-8dc5ad32" + ], + "last_modified_at": 1776922324.9497623, + "created_at": 1776922144.5760212, + "compliance_status": { + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "pull-request", + "attestation_type": "pull_request", + "attestation_id": "a3c84fec-c679-4536-83df-35d25f2d", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "artifacts_statuses": { + "differ": { + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_id": "046919b1-42dd-47f8-8569-912d0259", + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "rubocop-lint", + "attestation_type": "junit", + "attestation_id": "80b8e885-6a69-4339-8701-f3dd9797", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "provenance-attestation", + "attestation_type": "generic", + "attestation_id": "0066b975-15b3-4586-9032-558ba8e7", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "sbom", + "attestation_type": "generic", + "attestation_id": "e4e309b9-c029-4f6b-9a3a-3891053b", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "sonarcloud-scan", + "attestation_type": "sonar", + "attestation_id": "a8a92f49-6217-4aec-9e7d-c4bd666c", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test", + "attestation_type": "junit", + "attestation_id": "cb400c3a-bd37-4918-ac79-959ba471", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test", + "attestation_type": "junit", + "attestation_id": "ac559624-fe12-4d8e-9f20-334c8d0d", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test-metrics", + "attestation_type": "custom:test-metrics", + "attestation_id": "369684cb-f1ce-4143-aaf7-776f8631", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test-metrics", + "attestation_type": "custom:test-metrics", + "attestation_id": "c3be70be-5673-42c4-8078-dc301dac", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test-coverage-metrics", + "attestation_type": "custom:coverage-metrics", + "attestation_id": "c8e0edb5-39e9-45e4-b5af-b2d337c6", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test-coverage-metrics", + "attestation_type": "custom:coverage-metrics", + "attestation_id": "8a32a0bb-c995-41d1-8f2f-c78619b3", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "snyk-container-scan", + "attestation_type": "generic", + "attestation_id": "55638f3a-147b-4683-abb3-a6b22f21", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "unexpected": true, + "evaluated_at": 1776922324.9497623, + "flow_template_id": "41bcefcf-aa8d-47c7-9b4e-0589bdb2" + } + }, + "evaluated_at": 1776922322.9425528, + "flow_template_id": "41bcefcf-aa8d-47c7-9b4e-0589bdb2" + }, + "template": { + "version": 1, + "trail": { + "attestations": [], + "artifacts": [] + }, + "content": "version: 1\n" + }, + "compliance_state": "COMPLIANT", + "is_compliant": true, + "events": [ + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922144.5760212, + "type": "trail_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922144.5625682 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "name": "30dffd09c3f896a322c65029247abcea3019c43a", + "creating_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "description": "", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a" + }, + "template_id": "db2b50e9-f037-4d2d-9ad4-96cb045c", + "origin_url": "https://github.com/cyber-dojo/differ/actions/runs/24818543745", + "user_data": "{}", + "repo_ids": [ + "09751ccc-0d15-4b83-a4da-8dc5ad32" + ] + } + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922169.167209, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922169.1593428 + }, + "attestation_type": "pull_request", + "is_compliant": true, + "attestation_id": "a3c84fec-c679-4536-83df-35d25f2d", + "template_reference_name": "pull-request" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922172.284509, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922172.0638747 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "80b8e885-6a69-4339-8701-f3dd9797", + "template_reference_name": "rubocop-lint", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922218.5130024, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922218.4953458 + }, + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "artifact_id": "fb2cdabc-8ff3-4bf6-924f-81c5edf8", + "template_reference_name": "differ", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922220.1516378, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922220.021401 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "0066b975-15b3-4586-9032-558ba8e7", + "template_reference_name": "provenance-attestation", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922222.2330732, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922222.0885787 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "e4e309b9-c029-4f6b-9a3a-3891053b", + "template_reference_name": "sbom", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922271.7472875, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": null, + "author": null, + "author_username": null, + "branch": null, + "timestamp": null, + "url": null, + "parents": null + }, + "repo_info": null, + "attestation_type": "sonar", + "is_compliant": true, + "attestation_id": "a8a92f49-6217-4aec-9e7d-c4bd666c", + "template_reference_name": "sonarcloud-scan", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922275.4024353, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922275.3028631 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "cb400c3a-bd37-4918-ac79-959ba471", + "template_reference_name": "integration-test", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922276.0852528, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922275.9567888 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "ac559624-fe12-4d8e-9f20-334c8d0d", + "template_reference_name": "unit-test", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922277.625133, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922277.6164017 + }, + "attestation_type": "custom:test-metrics", + "is_compliant": true, + "attestation_id": "369684cb-f1ce-4143-aaf7-776f8631", + "template_reference_name": "integration-test-metrics", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922277.7081304, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922277.7003748 + }, + "attestation_type": "custom:test-metrics", + "is_compliant": true, + "attestation_id": "c3be70be-5673-42c4-8078-dc301dac", + "template_reference_name": "unit-test-metrics", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922279.8122094, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922279.8018804 + }, + "attestation_type": "custom:coverage-metrics", + "is_compliant": true, + "attestation_id": "c8e0edb5-39e9-45e4-b5af-b2d337c6", + "template_reference_name": "integration-test-coverage-metrics", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922279.9555318, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922279.9481082 + }, + "attestation_type": "custom:coverage-metrics", + "is_compliant": true, + "attestation_id": "8a32a0bb-c995-41d1-8f2f-c78619b3", + "template_reference_name": "unit-test-coverage-metrics", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922321.0425618, + "type": "trail_updated", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922321.0321424 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "description": "", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a" + }, + "user_data": "{}", + "template_id": "41bcefcf-aa8d-47c7-9b4e-0589bdb2", + "origin_url": "https://github.com/cyber-dojo/differ/actions/runs/24818543745" + }, + "changes": [ + "git_commit_info", + "template" + ] + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922322.9425528, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922322.9319677 + }, + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "artifact_id": "046919b1-42dd-47f8-8569-912d0259", + "template_reference_name": "differ", + "git_commit": "30dffd09c3f896a322c65029247abcea3019c43a" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922324.9497623, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "30dffd09c3f896a322c65029247abcea3019c43a", + "message": "Remove defaulted aws-rolename from snyk-scanning job (#373)", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1776922121.0, + "url": "https://github.com/cyber-dojo/differ/commit/30dffd09c3f896a322c65029247abcea3019c43a", + "parents": null + }, + "repo_info": { + "inner_id": "09751ccc-0d15-4b83-a4da-8dc5ad32", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "68700466", + "name": "cyber-dojo/differ", + "url": "https://github.com/cyber-dojo/differ", + "provider": "github", + "description": null, + "created_at": 1768825647.5256214, + "last_modified_at": 1776922324.839236 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "55638f3a-147b-4683-abb3-a6b22f21", + "template_reference_name": "snyk-container-scan", + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/differ:30dffd0", + "target_artifact": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922370.6097834, + "type": "artifact_approval_reported", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "approval_id": "424dd175-3224-4fc1-aae9-159c0a27", + "approval_number": 341, + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "state": "APPROVED", + "reviewer": "external://JonJagger" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776922523.8757324, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 6559, + "replica_number": 1, + "template_reference_name": "differ" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "d398561b-b0a9-4f0e-95a3-bbb0e347", + "trail_id": "a6c5e78c-b9ec-4c95-b8a7-d150336a", + "timestamp": 1776923218.5053248, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "becf55d8a2ed6e43bdd4d26c82dc0e3a69204b92738858ad9cd25329fa513355", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 4308, + "replica_number": 1, + "template_reference_name": "differ" + } + ], + "created_by": "ci-pipelines", + "flow": { + "name": "differ-ci", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/differ", + "kind": "build" + } + }, + "external_urls": null, + "html_url": "https://app.kosli.com/cyber-dojo/flows/differ-ci/trails/30dffd09c3f896a322c65029247abcea3019c43a" +} \ No newline at end of file diff --git a/tests/testdata/live_docs/cyber_dojo_trail_runner-ci.json b/tests/testdata/live_docs/cyber_dojo_trail_runner-ci.json new file mode 100644 index 0000000..864bd23 --- /dev/null +++ b/tests/testdata/live_docs/cyber_dojo_trail_runner-ci.json @@ -0,0 +1,735 @@ +{ + "name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "description": "", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + "origin_url": "https://github.com/cyber-dojo/runner/actions/runs/25162274003", + "user_data": {}, + "repo_ids": [ + "64195520-e949-4159-8a9e-e3d9e716" + ], + "last_modified_at": 1777547960.152828, + "created_at": 1777547629.6489003, + "compliance_status": { + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "pull-request", + "attestation_type": "pull_request", + "attestation_id": "54901a94-f922-4d4d-babe-ad4316ff", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "artifacts_statuses": { + "runner": { + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_id": "fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "status": "COMPLIANT", + "is_compliant": true, + "attestations_statuses": [ + { + "attestation_name": "rubocop-lint", + "attestation_type": "junit", + "attestation_id": "d634b663-76b9-4703-b6a6-338f06de", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "provenance-attestation", + "attestation_type": "generic", + "attestation_id": "53178442-64ed-45aa-92b1-3bfc6023", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "sbom", + "attestation_type": "generic", + "attestation_id": "8806a8cf-30d4-4cec-a703-47d1f580", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test", + "attestation_type": "junit", + "attestation_id": "295f7331-29b3-4152-ad9a-1ff93628", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test-metrics", + "attestation_type": "custom:test-metrics", + "attestation_id": "581e7baa-6128-4861-8da3-c87f7454", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "unit-test-coverage-metrics", + "attestation_type": "custom:coverage-metrics", + "attestation_id": "ba2502c6-9143-4a4f-8c9e-9eec3619", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test", + "attestation_type": "junit", + "attestation_id": "d359f683-d26c-4702-9350-03eecee4", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test-metrics", + "attestation_type": "custom:test-metrics", + "attestation_id": "87c2fa71-8fe3-4e38-b9a9-215bdc12", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "integration-test-coverage-metrics", + "attestation_type": "custom:coverage-metrics", + "attestation_id": "a6e93861-0c76-46e3-a87b-e5b92f34", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + }, + { + "attestation_name": "snyk-container-scan", + "attestation_type": "generic", + "attestation_id": "93067716-e6cf-43e8-9baa-e980e903", + "overridden_attestation_id": null, + "status": "COMPLETE", + "is_compliant": true, + "unexpected": true + } + ], + "unexpected": true, + "evaluated_at": 1777547960.152828, + "flow_template_id": "5582e1db-8ee4-4322-b5b5-2af2538f" + } + }, + "evaluated_at": 1777547957.850008, + "flow_template_id": "5582e1db-8ee4-4322-b5b5-2af2538f" + }, + "template": { + "version": 1, + "trail": { + "attestations": [], + "artifacts": [] + }, + "content": "version: 1\n" + }, + "compliance_state": "COMPLIANT", + "is_compliant": true, + "events": [ + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547629.6489003, + "type": "trail_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547629.6364944 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "name": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "creating_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "description": "", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + "template_id": "1122ee17-8d3e-4f21-b410-279c9979", + "origin_url": "https://github.com/cyber-dojo/runner/actions/runs/25162274003", + "user_data": "{}", + "repo_ids": [ + "64195520-e949-4159-8a9e-e3d9e716" + ] + } + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547647.5377355, + "type": "trail_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547647.532189 + }, + "attestation_type": "pull_request", + "is_compliant": true, + "attestation_id": "54901a94-f922-4d4d-babe-ad4316ff", + "template_reference_name": "pull-request" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547658.502645, + "type": "trail_attestation_for_artifact_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547658.3691914 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "d634b663-76b9-4703-b6a6-338f06de", + "template_reference_name": "rubocop-lint", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547734.0809104, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547734.0683978 + }, + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "artifact_id": "a01f1b8a-aa3d-441c-b977-63489294", + "template_reference_name": "runner", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547736.6566045, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547736.5356593 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "53178442-64ed-45aa-92b1-3bfc6023", + "template_reference_name": "provenance-attestation", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547740.128177, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547739.9435213 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "8806a8cf-30d4-4cec-a703-47d1f580", + "template_reference_name": "sbom", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547848.7757206, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547848.666686 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "295f7331-29b3-4152-ad9a-1ff93628", + "template_reference_name": "unit-test", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547850.5266702, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547850.455977 + }, + "attestation_type": "custom:test-metrics", + "is_compliant": true, + "attestation_id": "581e7baa-6128-4861-8da3-c87f7454", + "template_reference_name": "unit-test-metrics", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547852.5436196, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547852.5283678 + }, + "attestation_type": "custom:coverage-metrics", + "is_compliant": true, + "attestation_id": "ba2502c6-9143-4a4f-8c9e-9eec3619", + "template_reference_name": "unit-test-coverage-metrics", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547904.090464, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547903.9651492 + }, + "attestation_type": "junit", + "is_compliant": true, + "attestation_id": "d359f683-d26c-4702-9350-03eecee4", + "template_reference_name": "integration-test", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547905.8000839, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547905.7901347 + }, + "attestation_type": "custom:test-metrics", + "is_compliant": true, + "attestation_id": "87c2fa71-8fe3-4e38-b9a9-215bdc12", + "template_reference_name": "integration-test-metrics", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547907.6211314, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547907.6117835 + }, + "attestation_type": "custom:coverage-metrics", + "is_compliant": true, + "attestation_id": "a6e93861-0c76-46e3-a87b-e5b92f34", + "template_reference_name": "integration-test-coverage-metrics", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547955.590948, + "type": "trail_updated", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547955.5325592 + }, + "setting_user_id": "da5d4ee8-aec0-4264-ab85-c491040c", + "trail_data_json": { + "description": "", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + "user_data": "{}", + "template_id": "5582e1db-8ee4-4322-b5b5-2af2538f", + "origin_url": "https://github.com/cyber-dojo/runner/actions/runs/25162274003" + }, + "changes": [ + "git_commit_info", + "template" + ] + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547957.850008, + "type": "artifact_creation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547957.8361285 + }, + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "artifact_id": "fe3ed5e5-0ed1-4cb8-8d5a-57d636d7", + "template_reference_name": "runner", + "git_commit": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777547960.152828, + "type": "artifact_attestation_reported", + "git_commit_info": { + "sha1": "a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "message": "Merge pull request #227 from cyber-dojo/update-base-image-5412310\n\nMerge update-base-image into main", + "author": "Jon Jagger ", + "author_username": null, + "branch": "main", + "timestamp": 1777547604.0, + "url": "https://github.com/cyber-dojo/runner/commit/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e", + "parents": null + }, + "repo_info": { + "inner_id": "64195520-e949-4159-8a9e-e3d9e716", + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "repo_id": "189528148", + "name": "cyber-dojo/runner", + "url": "https://github.com/cyber-dojo/runner", + "provider": "github", + "description": null, + "created_at": 1768824657.9620016, + "last_modified_at": 1777547960.0247514 + }, + "attestation_type": "generic", + "is_compliant": true, + "attestation_id": "93067716-e6cf-43e8-9baa-e980e903", + "template_reference_name": "snyk-container-scan", + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "artifact_name": "244531986313.dkr.ecr.eu-central-1.amazonaws.com/runner:a2ffba5", + "target_artifact": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777548143.9659677, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "environment_id": "e44779bb-311d-4bac-9d19-a64a0843", + "environment_name": "aws-beta", + "snapshot_index": 6586, + "replica_number": 3, + "template_reference_name": "runner" + }, + { + "org_id": "83acb2bc-2c26-48a7-8b87-90dfcce7", + "flow_id": "a81e8c6d-bb00-474f-b986-a6cb9b08", + "trail_id": "02f9ea49-3a13-4a58-806a-4b8375a3", + "timestamp": 1777550818.544773, + "type": "artifact_started_running", + "git_commit_info": null, + "repo_info": null, + "artifact_fingerprint": "b6df6b1da5f73049085d9e04549f9674f0e54e9f0273467db9d7b46e3e9ad039", + "environment_id": "73965c45-e9a1-4bb9-ad01-dc5a526f", + "environment_name": "aws-prod", + "snapshot_index": 4341, + "replica_number": 3, + "template_reference_name": "runner" + } + ], + "created_by": "ci-pipelines", + "flow": { + "name": "runner-ci", + "tags": { + "ci": "github", + "repo_url": "https://github.com/cyber-dojo/runner", + "kind": "build" + } + }, + "external_urls": null, + "html_url": "https://app.kosli.com/cyber-dojo/flows/runner-ci/trails/a2ffba5a5debbc8f4f199cf5a88e5899c7d6547e" +} \ No newline at end of file