Skip to content

[DNM] Add dummy task, pipeline, and ITS for EC-2011 POC - #3476

Open
simonbaird wants to merge 3 commits into
conforma:mainfrom
simonbaird:reqd-task-its-poc
Open

[DNM] Add dummy task, pipeline, and ITS for EC-2011 POC#3476
simonbaird wants to merge 3 commits into
conforma:mainfrom
simonbaird:reqd-task-its-poc

Conversation

@simonbaird

Copy link
Copy Markdown
Member

Summary

  • Adds a dummy-check Tekton task that produces configurable pass/fail/warn results with a test-result attestation step (via the attest-test-result step action)
  • Adds a reqd-task-poc-ec2011 pipeline that parses a Snapshot and runs the dummy-check task
  • Adds hack/create-dummy-its.sh to create the IntegrationTestScenario in the cluster

Context

POC for EC-2011 — dog-fooding a required task in an ITS instead of the build pipeline.

Test plan

  • ITS created in rhtap-contract-tenant namespace
  • Pipeline triggers on PR and runs successfully
  • Test-result attestation is created and attached to the image
  • Conforma can discover and evaluate the attestation

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Adds a configurable scenario creation script, a snapshot-processing Tekton Pipeline, and a dummy-check Task. The flow parses image metadata, validates results, emits JSON output, and publishes attestation data. Three Checks workflow jobs are disabled.

Changes

Dummy integration test flow

Layer / File(s) Summary
Dummy check task
tasks/dummy-check/0.1/dummy-check.yaml
Validates supported results, generates JSON test output, and publishes attestation data.
Snapshot parsing and task orchestration
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml
Parses the first containerImage and passes image metadata and the requested result to dummy-check.
Scenario creation and verification
hack/create-dummy-its.sh
Applies a configurable IntegrationTestScenario and prints a verification command.

Checks workflow control

Layer / File(s) Summary
Disable check jobs
.github/workflows/checks-codecov.yaml
Disables the Test, Acceptance, and Upload jobs with if: false.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant create_dummy_its.sh
  participant IntegrationTestScenario
  participant reqd_task_poc_ec2011
  participant dummy_check
  participant AttestationAction
  create_dummy_its.sh->>IntegrationTestScenario: Apply scenario with Git resolver parameters
  IntegrationTestScenario->>reqd_task_poc_ec2011: Start with SNAPSHOT and RESULT
  reqd_task_poc_ec2011->>reqd_task_poc_ec2011: Parse containerImage URL and digest
  reqd_task_poc_ec2011->>dummy_check: Pass result and image metadata
  dummy_check->>AttestationAction: Submit image metadata and test output
  dummy_check-->>reqd_task_poc_ec2011: Return TEST_OUTPUT
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the dummy task, pipeline, and ITS added for the EC-2011 proof of concept.
Description check ✅ Passed The description explains what changed, why it changed, links EC-2011, and includes a test plan, although it uses different headings from the template.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@qodo-for-conforma

Copy link
Copy Markdown

PR Summary by Qodo

Add dummy integration test pipeline/task and ITS bootstrap script (EC-2011 POC)

✨ Enhancement ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• Add a dummy-check Tekton task that emits configurable pass/fail/warn test output.
• Generate a test-result attestation for an image using the attest-test-result step action.
• Add an ITS-resolved pipeline plus a helper script to create the IntegrationTestScenario.
Diagram

graph TD
  A["create-dummy-its.sh"] --> B["IntegrationTestScenario"] --> C["Pipeline: reqd-task-poc-ec2011"] --> D["Task: parse-snapshot"] --> E["Task: dummy-check"] --> F{{"StepAction: attest-test-result"}} --> G[("Image + attestation")]
  subgraph Legend
    direction LR
    _sh["Script"] ~~~ _cr["K8s CR"] ~~~ _task["Tekton task"] ~~~ _ext{{"External resolver"}} ~~~ _reg[("Registry")]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Parse SNAPSHOT with jq (or a shared snapshot-parse task)
  • ➕ More robust JSON parsing than grep/regex
  • ➕ Clearer failure modes and easier to extend for multiple components
  • ➖ Adds dependency on jq (image choice / availability)
  • ➖ Slightly more setup for a quick POC
2. Pin git-resolver revisions to immutable SHAs (not main)
  • ➕ Reproducible ITS runs and easier auditing
  • ➕ Avoids breakage from upstream changes on main
  • ➖ Requires occasional manual bumping to pick up updates
  • ➖ Slightly less convenient during rapid iteration
3. Use in-repo task references (or bundle) instead of external git URLs
  • ➕ Eliminates drift between the repo content and what the pipeline executes
  • ➕ Simplifies debugging in forks
  • ➖ Less realistic if the intent is to consume upstream conforma/cli tasks
  • ➖ May reduce reuse across repos if not standardized

Recommendation: For a POC, the overall approach is reasonable (small, self-contained pipeline plus an attestation step). If this is intended to be longer-lived or used for repeatable evaluation, the two highest-leverage improvements are (1) pinning git resolver revisions to SHAs and (2) replacing the grep-based Snapshot parsing with jq or an existing Snapshot parsing task to avoid brittle extraction.

Files changed (3) +285 / -0

Enhancement (1) +153 / -0
dummy-check.yamlAdd dummy-check task that emits test output and attests it to the image +153/-0

Add dummy-check task that emits test output and attests it to the image

• Creates a Tekton Task that produces configurable JSON test output (success/failure/warning/error/skipped) and returns it as a task result. Invokes the git-resolved attest-test-result step action to generate/push an attestation tied to the provided image URL and digest, with Chains artifact output metadata.

tasks/dummy-check/0.1/dummy-check.yaml

Other (2) +132 / -0
create-dummy-its.shAdd script to create an IntegrationTestScenario pointing at the POC pipeline +46/-0

Add script to create an IntegrationTestScenario pointing at the POC pipeline

• Introduces a bash helper that applies an IntegrationTestScenario CR into a target namespace. The ITS resolves a pipeline from a git repo/revision/path, with defaults tuned for the EC-2011 POC and environment-variable overrides for reuse.

hack/create-dummy-its.sh

dummy-integration-test.yamlAdd reqd-task-poc-ec2011 pipeline to parse Snapshot and run dummy-check +86/-0

Add reqd-task-poc-ec2011 pipeline to parse Snapshot and run dummy-check

• Adds a Tekton Pipeline that accepts a SNAPSHOT param, extracts the first component image URL and digest, then runs the dummy-check task. Exposes TEST_OUTPUT as a pipeline result and resolves the dummy-check task via the git resolver.

pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 7, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 10:36 PM UTC · Ended 10:49 PM UTC

Commit: 87c4a29 · View workflow run →

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@hack/create-dummy-its.sh`:
- Around line 25-26: In the reqd-task-poc-ec2011 required-task scenario, remove
the test.appstudio.openshift.io/optional label so the scenario is treated as
mandatory. Leave the remaining scenario configuration unchanged.

In `@pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml`:
- Around line 51-64: Update the SNAPSHOT handling around the IMAGE extraction to
parse it as JSON, validate every component’s containerImage and required digest
separator, and reject malformed or missing values. Preserve the
image-url/image-digest contract only if SNAPSHOT is explicitly constrained to
one component; otherwise process and emit all validated components rather than
silently selecting the first one.

In `@tasks/dummy-check/0.1/dummy-check.yaml`:
- Line 66: Replace the mutable ubi-minimal:latest image reference in
tasks/dummy-check/0.1/dummy-check.yaml at lines 66-66 with an approved immutable
digest, and make the same replacement in
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml at lines 43-43.
Use the identical digest in both files.
- Around line 141-144: Pin every Git resolver revision to an approved immutable
full commit SHA: update the revision default in
tasks/dummy-check/0.1/dummy-check.yaml:141-144,
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:81-86, and
hack/create-dummy-its.sh:8-10, replacing branch references such as main and
reqd-task-its-poc. If hack/create-dummy-its.sh enforces GIT_REVISION, validate
that the supplied value is a full commit SHA.
- Around line 122-130: Update the TEST_OUTPUT construction to use a JSON encoder
for RESULT, TIMESTAMP, NOTE, and other string fields so quotes, backslashes, and
newlines are escaped correctly. Validate SUCCESSES, FAILURES, and WARNINGS as
integers before applying %d, terminating the step for invalid values while still
accepting negative integers.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 2155f7f0-eebb-4e9f-8e6d-45839f9106bf

📥 Commits

Reviewing files that changed from the base of the PR and between 61ed8a3 and 12663f2.

📒 Files selected for processing (3)
  • hack/create-dummy-its.sh
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml
  • tasks/dummy-check/0.1/dummy-check.yaml

Comment thread hack/create-dummy-its.sh
Comment on lines +25 to +26
labels:
test.appstudio.openshift.io/optional: "true"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- script ---'
cat -n hack/create-dummy-its.sh

printf '%s\n' '--- related references ---'
rg -n -i --glob '!vendor/**' --glob '!node_modules/**' \
  'reqd-task-poc-ec2011|test\.appstudio\.openshift\.io/optional|optional.*IntegrationTestScenario|IntegrationTestScenario|required task|required-task' .

Repository: conforma/cli

Length of output: 2721


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- dummy integration-test pipeline ---'
cat -n pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml

printf '%s\n' '--- enterprise-contract guidance ---'
sed -n '70,110p' pipelines/enterprise-contract/0.1/enterprise-contract.yaml

printf '%s\n' '--- all optional-label and informative references ---'
rg -n -i 'test\.appstudio\.openshift\.io/optional|informative|required.*task|task.*required|IntegrationTestScenario' \
  README.md docs hack pipelines internal config .github 2>/dev/null || true

Repository: conforma/cli

Length of output: 7294


🌐 Web query:

Konflux IntegrationTestScenario test.appstudio.openshift.io/optional label required task semantics

💡 Result:

The label test.appstudio.openshift.io/optional in Konflux is used to control whether an IntegrationTestScenario is mandatory for the release process [1][2]. Its semantics are as follows: - Purpose: It specifies whether the result of a PipelineRun created by the IntegrationTestScenario must be successful for an application snapshot to be considered valid [1][3]. - Values: - "true": The integration test is marked as optional. If the test fails, it does not block the release or promotion of the application snapshot [1][4][3]. - "false": The integration test is mandatory (required). If the test fails, the application snapshot is marked as failed, which prevents its release [1][4][3]. - Default Behavior: If the label is not explicitly defined in an IntegrationTestScenario custom resource, the Konflux Integration Service defaults its value to "false", meaning all integration tests are mandatory by default [1][5][3]. - Propagation: When a test runs, this label is copied from the IntegrationTestScenario resource to the resulting PipelineRun [1][2]. By marking a test as optional, users can allow specific, non-critical tests to fail without hindering the overall automated release process [4][3].

Citations:


Remove the optional label from the required-task scenario.

The reqd-task-poc-ec2011 scenario must be mandatory to enforce required-task behavior. Remove test.appstudio.openshift.io/optional: "true".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hack/create-dummy-its.sh` around lines 25 - 26, In the reqd-task-poc-ec2011
required-task scenario, remove the test.appstudio.openshift.io/optional label so
the scenario is treated as mandatory. Leave the remaining scenario configuration
unchanged.

Comment on lines +51 to +64
IMAGE=$(echo "${SNAPSHOT}" | grep -oP '"containerImage"\s*:\s*"\K[^"]+' | head -1)
if [[ -z "${IMAGE}" ]]; then
echo "ERROR: No containerImage found in SNAPSHOT" >&2
exit 1
fi

IMAGE_URL="${IMAGE%%@*}"
IMAGE_DIGEST="${IMAGE##*@}"

echo "Parsed image-url: ${IMAGE_URL}"
echo "Parsed image-digest: ${IMAGE_DIGEST}"

echo -n "${IMAGE_URL}" > "$(results.image-url.path)"
echo -n "${IMAGE_DIGEST}" > "$(results.image-digest.path)"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- candidate files ---'
git ls-files | grep -E '(^|/)(pipelines/dummy-integration-test/0\.1/dummy-integration-test\.yaml|hack/create-dummy-its\.sh)$' || true
printf '%s\n' '--- YAML structure ---'
ast-grep outline pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml --lang yaml || true
printf '%s\n' '--- YAML lines 1-90 ---'
cat -n pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml | sed -n '1,90p'
printf '%s\n' '--- generator script ---'
if test -f hack/create-dummy-its.sh; then cat -n hack/create-dummy-its.sh | sed -n '1,180p'; fi
printf '%s\n' '--- related references ---'
rg -n -C 3 'containerImage|image-url|image-digest|dummy-integration-test|create-dummy-its|SNAPSHOT' pipelines hack README.md 2>/dev/null | sed -n '1,260p'

Repository: conforma/cli

Length of output: 24835


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- dummy-check task ---'
fd -i 'dummy-check' . --type f | sort
for f in $(fd -i 'dummy-check' . --type f | sort); do
  echo "--- $f ---"
  wc -l "$f"
  cat -n "$f" | sed -n '1,180p'
done
printf '%s\n' '--- pipeline and task result consumers ---'
rg -n -C 5 'image-digest|image-url|dummy-check|components.*containerImage|containerImage' pipelines tasks .github 2>/dev/null | sed -n '1,320p'
printf '%s\n' '--- deterministic parser probe ---'
python3 - <<'PY'
import json, re, subprocess

script = r'''set -euo pipefail
SNAPSHOT="$1"
IMAGE=$(echo "${SNAPSHOT}" | grep -oP '"containerImage"\s*:\s*"\K[^"]+' | head -1)
if [[ -z "${IMAGE}" ]]; then exit 1; fi
IMAGE_URL="${IMAGE%%@*}"
IMAGE_DIGEST="${IMAGE##*@}"
printf 'url=%s\ndigest=%s\n' "$IMAGE_URL" "$IMAGE_DIGEST"
'''
cases = {
    "two components": {"components": [
        {"containerImage": "quay.io/a@sha256:aaa"},
        {"containerImage": "quay.io/b@sha256:bbb"},
    ]},
    "tag only": {"components": [{"containerImage": "quay.io/a:latest"}]},
    "invalid JSON with matching text": 'prefix "containerImage": "quay.io/a@sha256:aaa" suffix',
    "escaped quote value": {"components": [{"containerImage": "quay.io/a@sha256:aa\\\"bb"}]},
    "missing component image": {"components": [{"name": "a"}]},
}
for name, value in cases.items():
    text = value if isinstance(value, str) else json.dumps(value)
    p = subprocess.run(["bash", "-c", script, "parser", text], text=True,
                       capture_output=True)
    print(f"[{name}] exit={p.returncode}")
    print((p.stdout + p.stderr).strip() or "<no output>")
PY

Repository: conforma/cli

Length of output: 24091


Parse and validate every Snapshot component.

Line 51 accepts non-JSON text and processes only the first containerImage. The task forwards one scalar image-url and image-digest pair, despite the contract requiring validation of every component.

If an image has no @, ${IMAGE##*@} writes the complete image reference as image-digest. Parse SNAPSHOT as JSON, validate every component, and either process all components or change the contract to require one component.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml` around
lines 51 - 64, Update the SNAPSHOT handling around the IMAGE extraction to parse
it as JSON, validate every component’s containerImage and required digest
separator, and reject malformed or missing values. Preserve the
image-url/image-digest contract only if SNAPSHOT is explicitly constrained to
one component; otherwise process and emit all validated components rather than
silently selecting the first one.

results:
- name: TEST_OUTPUT
description: JSON test results for consumption by subsequent steps.
image: registry.access.redhat.com/ubi9/ubi-minimal:latest

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Pin executable container images by digest.

Both steps use the mutable latest tag. A later image update can change task behavior without a repository change.

  • tasks/dummy-check/0.1/dummy-check.yaml#L66-L66: replace ubi-minimal:latest with an approved immutable digest.
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml#L43-L43: replace ubi-minimal:latest with the same approved immutable digest.
📍 Affects 2 files
  • tasks/dummy-check/0.1/dummy-check.yaml#L66-L66 (this comment)
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml#L43-L43
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tasks/dummy-check/0.1/dummy-check.yaml` at line 66, Replace the mutable
ubi-minimal:latest image reference in tasks/dummy-check/0.1/dummy-check.yaml at
lines 66-66 with an approved immutable digest, and make the same replacement in
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml at lines 43-43.
Use the identical digest in both files.

Comment on lines +122 to +130
TEST_OUTPUT=$(printf '{
"result": "%s",
"timestamp": "%s",
"note": "%s",
"namespace": "default",
"successes": %d,
"failures": %d,
"warnings": %d
}' "${RESULT}" "${TIMESTAMP}" "${NOTE}" "${SUCCESSES}" "${FAILURES}" "${WARNINGS}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

file="tasks/dummy-check/0.1/dummy-check.yaml"

printf '%s\n' '--- file outline ---'
if command -v ast-grep >/dev/null 2>&1; then
  ast-grep outline "$file" || true
fi

printf '%s\n' '--- relevant task sections ---'
sed -n '1,170p' "$file"

printf '%s\n' '--- TEST_OUTPUT and attestation references ---'
rg -n -C 5 'TEST_OUTPUT|attest|NOTE|SUCCESSES|FAILURES|WARNINGS' tasks/dummy-check/0.1 "$file" tasks 2>/dev/null | head -n 300

Repository: conforma/cli

Length of output: 29153


🏁 Script executed:

#!/bin/bash
set -eu

run_case() {
  local label="$1"
  local note="$2"
  local successes="$3"
  local failures="$4"
  local warnings="$5"

  output=$(
    printf '{
  "result": "%s",
  "timestamp": "%s",
  "note": "%s",
  "namespace": "default",
  "successes": %d,
  "failures": %d,
  "warnings": %d
}' "SUCCESS" "2026-08-01T00:00:00" "$note" "$successes" "$failures" "$warnings" 2>/tmp/printf-error
  ) || true

  printf '%s\t%s\n' "$label" "$output"
  if python3 -c 'import json, sys; json.load(sys.stdin)' <<<"$output" 2>/dev/null; then
    printf '%s\n' 'JSON_PARSE=valid'
  else
    printf '%s\n' 'JSON_PARSE=invalid'
  fi
  if [ -s /tmp/printf-error ]; then
    printf 'PRINTF_ERROR=%s\n' "$(cat /tmp/printf-error)"
  fi
}

run_case 'plain-note' 'all good' '1' '0' '0'
run_case 'quote-note' 'contains "quote"' '1' '0' '0'
run_case 'newline-note' $'contains\nnewline' '1' '0' '0'
run_case 'backslash-note' 'contains \ backslash' '1' '0' '0'
run_case 'invalid-count' 'all good' 'not-a-number' '0' '0'
run_case 'negative-count' 'all good' '-1' '0' '0'

Repository: conforma/cli

Length of output: 1415


🏁 Script executed:

#!/bin/bash
set -u

set +e
bash -c '
  set -euo pipefail
  TEST_OUTPUT=$(printf "{\n  \"successes\": %d\n}\n" "not-a-number")
  printf "WRITE_REACHED=%s\n" "$TEST_OUTPUT"
'
status=$?
printf 'COMMAND_STATUS=%d\n' "$status"

bash -c '
  set -euo pipefail
  TEST_OUTPUT=$(printf "{\n  \"successes\": %d\n}\n" "-1")
  printf "WRITE_REACHED=%s\n" "$TEST_OUTPUT"
'
status=$?
printf 'NEGATIVE_COMMAND_STATUS=%d\n' "$status"

Repository: conforma/cli

Length of output: 280


Serialize TEST_OUTPUT with a JSON encoder. NOTE values containing ", \, or newlines produce invalid JSON for the attestation step. Encode all string fields before constructing the object. Validate SUCCESSES, FAILURES, and WARNINGS as non-negative integers before %d; invalid values terminate the step, while negative values are accepted.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tasks/dummy-check/0.1/dummy-check.yaml` around lines 122 - 130, Update the
TEST_OUTPUT construction to use a JSON encoder for RESULT, TIMESTAMP, NOTE, and
other string fields so quotes, backslashes, and newlines are escaped correctly.
Validate SUCCESSES, FAILURES, and WARNINGS as integers before applying %d,
terminating the step for invalid values while still accepting negative integers.

Comment on lines +141 to +144
- name: revision
value: main
- name: pathInRepo
value: stepactions/attest-test-result/0.1/attest-test-result.yaml

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

git ls-remote https://github.com/conforma/step-actions main
git ls-remote https://github.com/conforma/cli main
git ls-remote https://github.com/simonbaird/conforma-cli reqd-task-its-poc

Repository: conforma/cli

Length of output: 334


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- tracked files ---'
git ls-files \
  tasks/dummy-check/0.1/dummy-check.yaml \
  pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml \
  hack/create-dummy-its.sh

printf '%s\n' '--- task definition ---'
sed -n '130,150p' tasks/dummy-check/0.1/dummy-check.yaml

printf '%s\n' '--- pipeline definition ---'
sed -n '70,95p' pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml

printf '%s\n' '--- generator defaults ---'
sed -n '1,25p' hack/create-dummy-its.sh

printf '%s\n' '--- related resolver inputs ---'
rg -n -C 3 'pathInRepo|GIT_REVISION|reqd-task-its-poc|attest-test-result|dummy-integration-test' \
  tasks pipelines hack .github 2>/dev/null || true

Repository: conforma/cli

Length of output: 6509


Pin every Git resolver revision to an immutable commit.

main and reqd-task-its-poc are branch references. Branch updates can change the fetched pipeline or task code without changing this scenario. Replace all three defaults with approved full commit SHAs. Validate GIT_REVISION if the script must enforce immutable revisions.

📍 Affects 3 files
  • tasks/dummy-check/0.1/dummy-check.yaml#L141-L144 (this comment)
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml#L81-L86
  • hack/create-dummy-its.sh#L8-L10
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tasks/dummy-check/0.1/dummy-check.yaml` around lines 141 - 144, Pin every Git
resolver revision to an approved immutable full commit SHA: update the revision
default in tasks/dummy-check/0.1/dummy-check.yaml:141-144,
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:81-86, and
hack/create-dummy-its.sh:8-10, replacing branch references such as main and
reqd-task-its-poc. If hack/create-dummy-its.sh enforces GIT_REVISION, validate
that the supplied value is a full commit SHA.

@qodo-for-conforma

qodo-for-conforma Bot commented Aug 7, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Wrong taskRef revision ✓ Resolved 🐞 Bug ≡ Correctness
Description
The new pipeline resolves dummy-check from https://github.com/conforma/cli at revision main,
so when the pipeline is fetched from a non-main branch (as your ITS script defaults to), the Task
definition can be missing and the PipelineRun can fail during remote resolution.
Code

pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[R82-85]

+            value: https://github.com/conforma/cli
+          - name: revision
+            value: main
+          - name: pathInRepo
Relevance

●●● Strong

Hardcoded git resolver revision causing branch-based PipelineRun failures is a straightforward
correctness fix; team accepts such validation.

PR-#3080

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The pipeline hardcodes revision: main for the git-resolved dummy-check task, while the helper
script defaults to creating an ITS that resolves the pipeline from a branch revision; this makes the
pipeline/task sources diverge and can break task resolution during branch-based execution.

pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[78-86]
hack/create-dummy-its.sh[8-10]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml` fetches the `dummy-check` task from `conforma/cli@main`. If the pipeline is executed from a branch/commit that is not `main` (e.g., via the ITS git resolver), task resolution can fail because the pipeline and task are pulled from different revisions.

## Issue Context
- The ITS helper defaults `GIT_REVISION` to a branch name, but the pipeline hardcodes `dummy-check` to `main`.
- This makes the integration test pipeline brittle during PR/branch testing.

## Fix Focus Areas
- pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[78-86]

## Recommended fix
Choose one of:
1) Inline the `dummy-check` as a `taskSpec` in the pipeline (like `parse-snapshot`) for the POC.
2) Add pipeline params for `TASK_GIT_URL`/`TASK_GIT_REVISION` and use those in the git resolver, then ensure the ITS/controller sets them to the same revision as the pipeline.
3) Pin the task to an immutable commit SHA (and update it when needed), rather than `main`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Unescaped NOTE breaks JSON 🐞 Bug ≡ Correctness
Description
dummy-check builds JSON using printf with the unescaped NOTE parameter, so a NOTE containing
quotes/newlines/backslashes produces invalid JSON and can break the attest-test-result step and
any downstream consumer expecting parseable JSON.
Code

tasks/dummy-check/0.1/dummy-check.yaml[R122-125]

+        TEST_OUTPUT=$(printf '{
+          "result": "%s",
+          "timestamp": "%s",
+          "note": "%s",
Relevance

●●● Strong

Unescaped NOTE can deterministically produce invalid JSON; escaping via jq/printf is a clear
correctness improvement.

PR-#3386

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The task interpolates NOTE directly into a quoted JSON field via printf and then forwards that
output to the attestation step as test-output, so malformed JSON can propagate into attestations
and consumers.

tasks/dummy-check/0.1/dummy-check.yaml[122-134]
tasks/dummy-check/0.1/dummy-check.yaml[145-153]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The task constructs JSON with `printf ... "note": "%s" ...` but does not JSON-escape `NOTE`. Any special characters in `NOTE` can invalidate the JSON output, which is then passed as `test-output` to the attestation step.

## Issue Context
The produced JSON is both:
- written to the task result `TEST_OUTPUT`
- passed into the `attest-test-result` step action

## Fix Focus Areas
- tasks/dummy-check/0.1/dummy-check.yaml[84-134]
- tasks/dummy-check/0.1/dummy-check.yaml[145-153]

## Recommended fix
Construct the JSON via a JSON-aware tool rather than `printf`, for example:
- Switch the step image to one that includes `jq` and do:
 `TEST_OUTPUT=$(jq -n --arg result "$RESULT" --arg timestamp "$TIMESTAMP" --arg note "$NOTE" --arg ns "$NAMESPACE" --argjson successes "$SUCCESSES" --argjson failures "$FAILURES" --argjson warnings "$WARNINGS" '{result:$result,timestamp:$timestamp,note:$note,namespace:$ns,successes:$successes,failures:$failures,warnings:$warnings}')`
- Or, if you keep bash-only, implement proper JSON string escaping for `NOTE` before interpolation.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Only first component validated 🐞 Bug ≡ Correctness
Description
The pipeline description claims each components[].containerImage is validated, but
parse-snapshot selects only the first match (head -1) and also doesn’t validate that the image
reference contains an @ digest, which can pass incorrect image-url/image-digest into the
attestation step.
Code

pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[R51-54]

+              IMAGE=$(echo "${SNAPSHOT}" | grep -oP '"containerImage"\s*:\s*"\K[^"]+' | head -1)
+              if [[ -z "${IMAGE}" ]]; then
+                echo "ERROR: No containerImage found in SNAPSHOT" >&2
+                exit 1
Relevance

●● Moderate

POC pipeline may intentionally use first component; mismatch with description/validation is
plausible but intent unclear.

PR-#3043

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The pipeline’s SNAPSHOT param description claims every containerImage in components is
validated, but the implementation extracts only the first match and forwards the derived image-url
and image-digest into the task that creates the attestation.

pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[12-23]
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[51-64]
tasks/dummy-check/0.1/dummy-check.yaml[145-149]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`parse-snapshot` extracts only the first `containerImage` occurrence and splits it with shell substring ops, but the pipeline’s own parameter description states that each image in the `components` array is validated.

## Issue Context
- Current implementation does: `... | head -1`, so additional components are ignored.
- If `containerImage` is a tag reference (no `@sha256:...`), `IMAGE_DIGEST` becomes the whole string and `image-url`/`image-digest` become inconsistent inputs to the attestation.

## Fix Focus Areas
- pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[12-23]
- pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[51-64]

## Recommended fix
- Parse the snapshot with a real JSON parser (e.g., `jq -r '.components[].containerImage'`).
- Either:
 1) loop over all component images and run `dummy-check` once per image, OR
 2) update the param description to explicitly say only the first component is used.
- Add an explicit check that `containerImage` contains `@` (and ideally `@sha256:`) before producing `image-url`/`image-digest`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context used
⚠️ Tickets: not configured — ticket URL found in PR but could not be fetched — check ticket provider credentials
✅ Compliance rules (platform): 36 rules

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment thread pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml Outdated
Comment on lines +122 to +125
TEST_OUTPUT=$(printf '{
"result": "%s",
"timestamp": "%s",
"note": "%s",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Unescaped note breaks json 🐞 Bug ≡ Correctness

dummy-check builds JSON using printf with the unescaped NOTE parameter, so a NOTE containing
quotes/newlines/backslashes produces invalid JSON and can break the attest-test-result step and
any downstream consumer expecting parseable JSON.
Agent Prompt
## Issue description
The task constructs JSON with `printf ... "note": "%s" ...` but does not JSON-escape `NOTE`. Any special characters in `NOTE` can invalidate the JSON output, which is then passed as `test-output` to the attestation step.

## Issue Context
The produced JSON is both:
- written to the task result `TEST_OUTPUT`
- passed into the `attest-test-result` step action

## Fix Focus Areas
- tasks/dummy-check/0.1/dummy-check.yaml[84-134]
- tasks/dummy-check/0.1/dummy-check.yaml[145-153]

## Recommended fix
Construct the JSON via a JSON-aware tool rather than `printf`, for example:
- Switch the step image to one that includes `jq` and do:
  `TEST_OUTPUT=$(jq -n --arg result "$RESULT" --arg timestamp "$TIMESTAMP" --arg note "$NOTE" --arg ns "$NAMESPACE" --argjson successes "$SUCCESSES" --argjson failures "$FAILURES" --argjson warnings "$WARNINGS" '{result:$result,timestamp:$timestamp,note:$note,namespace:$ns,successes:$successes,failures:$failures,warnings:$warnings}')`
- Or, if you keep bash-only, implement proper JSON string escaping for `NOTE` before interpolation.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +51 to +54
IMAGE=$(echo "${SNAPSHOT}" | grep -oP '"containerImage"\s*:\s*"\K[^"]+' | head -1)
if [[ -z "${IMAGE}" ]]; then
echo "ERROR: No containerImage found in SNAPSHOT" >&2
exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

3. Only first component validated 🐞 Bug ≡ Correctness

The pipeline description claims each components[].containerImage is validated, but
parse-snapshot selects only the first match (head -1) and also doesn’t validate that the image
reference contains an @ digest, which can pass incorrect image-url/image-digest into the
attestation step.
Agent Prompt
## Issue description
`parse-snapshot` extracts only the first `containerImage` occurrence and splits it with shell substring ops, but the pipeline’s own parameter description states that each image in the `components` array is validated.

## Issue Context
- Current implementation does: `... | head -1`, so additional components are ignored.
- If `containerImage` is a tag reference (no `@sha256:...`), `IMAGE_DIGEST` becomes the whole string and `image-url`/`image-digest` become inconsistent inputs to the attestation.

## Fix Focus Areas
- pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[12-23]
- pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml[51-64]

## Recommended fix
- Parse the snapshot with a real JSON parser (e.g., `jq -r '.components[].containerImage'`).
- Either:
  1) loop over all component images and run `dummy-check` once per image, OR
  2) update the param description to explicitly say only the first component is used.
- Add an explicit check that `containerImage` contains `@` (and ideally `@sha256:`) before producing `image-url`/`image-digest`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

simonbaird and others added 2 commits August 7, 2026 18:47
Adds a dummy-check Tekton task that produces configurable
pass/fail/warn results with a test-result attestation step, a
pipeline that parses a Snapshot and runs the task, and a script to
create the IntegrationTestScenario in the cluster.

The goal is to dogfood the new method for required tasks to be run
in ITS pipelines with their results visible to Conforma with a
secure chain of trust.

Ref: https://redhat.atlassian.net/browse/EC-2011

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 7, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:50 PM UTC · Completed 11:08 PM UTC

Commit: 87c4a29 · View workflow run →

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/checks-codecov.yaml:
- Line 37: Replace the constant if: false conditions for the Test, Acceptance,
and Upload jobs with the same non-constant repository or workflow variable gate
that evaluates false for the POC, ensuring actionlint accepts all three
conditions. Update .github/workflows/checks-codecov.yaml at lines 37-37,
100-100, and 169-169.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 9bfdcb78-2264-4d55-bbda-e6753493c88b

📥 Commits

Reviewing files that changed from the base of the PR and between 12663f2 and 4830e00.

📒 Files selected for processing (4)
  • .github/workflows/checks-codecov.yaml
  • hack/create-dummy-its.sh
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml
  • tasks/dummy-check/0.1/dummy-check.yaml
🚧 Files skipped from review as they are similar to previous changes (3)
  • tasks/dummy-check/0.1/dummy-check.yaml
  • hack/create-dummy-its.sh
  • pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml

jobs:

Test:
if: false # skipped for POC branch

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Replace the constant job conditions with one lint-valid POC gate.

actionlint rejects each constant if: false condition. Use the same non-constant repository or workflow variable gate for all three jobs. Keep the gate false for the POC.

  • .github/workflows/checks-codecov.yaml#L37-L37: update the Test job condition.
  • .github/workflows/checks-codecov.yaml#L100-L100: update the Acceptance job condition.
  • .github/workflows/checks-codecov.yaml#L169-L169: update the Upload job condition.
🧰 Tools
🪛 actionlint (1.7.12)

[error] 37-37: constant expression "false" in condition. remove the if: section

(if-cond)

📍 Affects 1 file
  • .github/workflows/checks-codecov.yaml#L37-L37 (this comment)
  • .github/workflows/checks-codecov.yaml#L100-L100
  • .github/workflows/checks-codecov.yaml#L169-L169
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/checks-codecov.yaml at line 37, Replace the constant if:
false conditions for the Test, Acceptance, and Upload jobs with the same
non-constant repository or workflow variable gate that evaluates false for the
POC, ensuring actionlint accepts all three conditions. Update
.github/workflows/checks-codecov.yaml at lines 37-37, 100-100, and 169-169.

Source: Linters/SAST tools

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review

Findings

High

  • [protected-path] .github/workflows/checks-codecov.yaml — This PR modifies a file under the protected .github/ path. The PR has no linked GitHub issue and does not explain why the CI workflow changes (disabling test jobs) are necessary for the stated POC goal. Human approval is always required for protected-path changes.
    Remediation: Link a GitHub issue that authorizes the CI workflow changes, or remove the workflow modifications from this PR.

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — Adding if: false to the Test, Acceptance, and Upload jobs disables all test and coverage CI for every PR and push to main. The release workflow (release.yaml) triggers on workflow_run with conclusion == 'success'. Since the Tools job still runs and skipped jobs do not fail the workflow, the overall conclusion will be success — meaning releases could proceed on every main push without any test validation.
    Remediation: Do not merge if: false on the main branch. Keep these changes on a separate POC branch, use path-based conditions, or disable the release workflow trigger as well.

  • [supply chain / untrusted code source] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:99 — All git resolver references across the pipeline, task, and helper script point to personal forks (simonbaird/conforma-cli and simonbaird/step-actions) on mutable branches rather than canonical org repos or pinned SHAs. This includes the attestation-creation step which is security-critical. Fork branches can be force-pushed, deleted, or compromised without review.
    Remediation: Point references to org repos or pin to commit SHAs. At minimum, add prominent comments documenting that these are temporary POC references that must be updated before any production use.

Medium

  • [scope-creep / CI suppression] .github/workflows/checks-codecov.yaml:37 — Disabling all three CI jobs is beyond the stated intent of adding a dummy task/pipeline. The PR is marked [DNM] but is not a draft, increasing the risk of accidental merge. No documented cleanup plan or expiration date exists for the POC artifacts.
    Remediation: Remove CI workflow changes from this PR, or convert to a draft PR.

  • [missing tracking issue] — No linked GitHub issue for this non-trivial change (336 additions, 4 files). EC-2011 is referenced as a Jira ticket but there is no corresponding GitHub issue for tracking cleanup, follow-up, or establishing authorized scope.
    Remediation: Create a GitHub issue for the POC, including a cleanup plan and expiration date.

Low

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:131TEST_OUTPUT JSON is constructed via printf with %s interpolation of the NOTE variable. If NOTE contains double quotes, backslashes, or newlines, the output will be syntactically invalid. Limited blast radius in POC context.

  • [fragile JSON parsing] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:46parse-snapshot uses grep -oP for JSON parsing, which is fragile for minified or escaped JSON. jq would be more robust.

  • [shell script conventions] hack/create-dummy-its.sh:19 — Script uses set -euo pipefail but repo convention (verified in hack/demo.sh, hack/derive-version.sh, etc.) is long-form: set -o errexit; set -o nounset; set -o pipefail.

  • [YAML metadata ordering] tasks/dummy-check/0.1/dummy-check.yaml:22 — Metadata fields ordered as labels, annotations, name but existing tasks use name, annotations, labels ordering.

  • [license header formatting] hack/create-dummy-its.sh:8 — License header URL indentation uses 5 spaces vs repo convention of 6 spaces. Affects all 3 new files.

  • [YAML formatting] tasks/dummy-check/0.1/dummy-check.yaml:26 — Tags use quoted style ("konflux") vs unquoted comma-separated in existing tasks. Missing blank line before spec:.


Labels: PR modifies CI workflows under .github/ (protected path) and introduces supply-chain references to personal forks for security-critical attestation steps


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

High

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — The if: false additions unconditionally disable the Test, Acceptance, and Upload jobs in the checks-codecov workflow. This is the only workflow in the repository that runs make test and make acceptance. The comment says "skipped for POC branch" but the PR targets main, so merging this disables all unit test, acceptance test, and coverage gating for every subsequent PR and push to main/release-* branches.
    Remediation: Remove the if: false additions, or use a branch-conditional expression (e.g., if: github.ref != 'refs/heads/reqd-task-its-poc') to limit the skip to the POC branch only.

  • [protected-path] .github/workflows/checks-codecov.yaml — This PR modifies .github/workflows/checks-codecov.yaml, which is under the .github/ protected path. The PR has no linked GitHub issue and the description does not explain why CI workflow modifications are necessary. Human approval is always required for changes to governance and infrastructure files.
    Remediation: Link a GitHub issue that authorizes the CI workflow changes and explain the rationale in the PR description.

Medium

  • [JSON injection via unescaped interpolation] tasks/dummy-check/0.1/dummy-check.yaml:130 — TEST_OUTPUT JSON is constructed via printf '%s' string interpolation of the NOTE variable. If NOTE contains JSON-special characters (double quotes, backslashes, newlines), the resulting JSON will be malformed. Auto-generated NOTE values are safe, but NOTE is a user-facing parameter with no escaping.
    Remediation: Use jq to construct the JSON output, e.g.: TEST_OUTPUT=$(jq -n --arg r "$RESULT" --arg t "$TIMESTAMP" --arg n "$NOTE" --argjson s "$SUCCESSES" --argjson f "$FAILURES" --argjson w "$WARNINGS" '{result:$r, timestamp:$t, note:$n, namespace:"default", successes:$s, failures:$f, warnings:$w}').

  • [Hardcoded personal fork reference] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:96 — The pipeline's dummy-check taskRef resolver references https://github.com/simonbaird/conforma-cli on branch reqd-task-its-poc. This creates a runtime dependency on a personal fork that may be deleted or force-pushed. The task definition is being added to this same repository. The same pattern appears in hack/create-dummy-its.sh.
    Remediation: Update the git resolver URL to https://github.com/conforma/cli and reference the branch/revision where the task will exist after merge. Update hack/create-dummy-its.sh defaults similarly.

  • [Unpinned mutable external reference] tasks/dummy-check/0.1/dummy-check.yaml:147 — The create-test-result-attestation step references https://github.com/conforma/step-actions at revision main. This is a mutable branch reference; a compromised or force-pushed main branch could alter the step-action code. This step handles attestation creation, which is security-sensitive.
    Remediation: Pin the step-action resolver reference to an immutable commit SHA.

Low

  • [grep -oP portability] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:56 — The parse-snapshot step uses grep -oP (PCRE with \K lookbehind) to extract containerImage from SNAPSHOT JSON. While ubi9/ubi-minimal ships GNU grep with -P support, parsing structured JSON with regex is fragile and may break on multi-line or reordered JSON.

  • [Default counter inconsistency] tasks/dummy-check/0.1/dummy-check.yaml:119 — The FAILURE case only adjusts SUCCESSES if it equals '1' (the default). If a user passes SUCCESSES=5 and RESULT=FAILURE, the task reports 5 successes alongside the failure, which is semantically inconsistent.

  • [POC lifecycle] tasks/dummy-check/0.1/dummy-check.yaml — POC artifacts (dummy-check task, dummy-integration-test pipeline, create-dummy-its.sh script) are being added to main alongside production artifacts with no documented lifecycle plan for cleanup or promotion.

  • [yaml-document-separator] tasks/dummy-check/0.1/dummy-check.yaml:18 — The --- separator is placed after the license header. Existing task YAMLs place --- as line 1, before the license header.

  • [yaml-metadata-ordering] tasks/dummy-check/0.1/dummy-check.yaml:21 — Metadata fields ordered labels, annotations, name. Existing tasks consistently use name, annotations, labels.

  • [license-header-formatting] tasks/dummy-check/0.1/dummy-check.yaml:8 — License header URL line uses 5-space indentation while existing tasks and pipelines use 6-space indentation.


Labels: PR modifies CI workflow (.github/), adds Tekton pipeline and task, and includes test tooling


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added ci github_actions Pull requests that update GitHub Actions code testing labels Aug 7, 2026
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@simonbaird simonbaird changed the title Add dummy task, pipeline, and ITS for EC-2011 POC [DNM] Add dummy task, pipeline, and ITS for EC-2011 POC Aug 8, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 8, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 2:13 AM UTC · Completed 2:31 AM UTC

Commit: 87c4a29 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

jobs:

Test:
if: false # skipped for POC branch

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[high] CI coverage regression

Adding if: false to the Test, Acceptance, and Upload jobs disables all test and coverage CI for every PR and push to main. The release workflow (release.yaml) triggers on workflow_run with conclusion=='success'. Since the Tools job still runs and skipped jobs do not fail the workflow, the overall conclusion will be 'success', meaning releases could proceed on every main push without any test validation.

Suggested fix: Do not merge if: false on the main branch. Keep these changes on a separate POC branch, use path-based conditions, or disable the release workflow trigger as well.

params:
- name: url
value: https://github.com/simonbaird/conforma-cli
- name: revision

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[high] supply chain / untrusted code source

All git resolver references across the pipeline, task, and helper script point to personal forks (simonbaird/conforma-cli and simonbaird/step-actions) on mutable branches rather than canonical org repos or pinned SHAs. This includes the attestation-creation step which is security-critical. Fork branches can be force-pushed, deleted, or compromised without review.

Suggested fix: Point references to org repos or pin to commit SHAs. At minimum, add prominent comments documenting that these are temporary POC references.

jobs:

Test:
if: false # skipped for POC branch

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] scope-creep

Disabling all three CI jobs is beyond the stated intent of adding a dummy task/pipeline. The PR is marked [DNM] but is not a draft, increasing the risk of accidental merge. No documented cleanup plan or expiration date exists for the POC artifacts.

Suggested fix: Remove CI workflow changes from this PR, or convert to a draft PR.

;;
ERROR|SKIPPED)
SUCCESSES="0"
FAILURES="0"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] JSON injection / malformed output

TEST_OUTPUT JSON is constructed via printf with %s interpolation of the NOTE variable. If NOTE contains double quotes, backslashes, or newlines, the output will be syntactically invalid. Limited blast radius in POC context.

FAILURE, WARNING, ERROR, or SKIPPED.
default: "SUCCESS"
results:
- name: TEST_OUTPUT

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] fragile JSON parsing

parse-snapshot uses grep -oP for JSON parsing, which is fragile for minified or escaped JSON and may not be portable across all container images.

Comment thread hack/create-dummy-its.sh
# SPDX-License-Identifier: Apache-2.0

set -euo pipefail

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] naming-convention

Script uses set -euo pipefail but repo convention is long-form (set -o errexit; set -o nounset; set -o pipefail).

kind: Task
metadata:
labels:
app.kubernetes.io/version: "0.1"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] code-organization

Metadata fields ordered as labels/annotations/name but existing tasks use name/annotations/labels ordering.

Comment thread hack/create-dummy-its.sh
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] pattern-inconsistency

License header URL indentation uses 5 spaces vs repo convention of 6 spaces. Affects all 3 new files.

annotations:
tekton.dev/pipelines.minVersion: "0.12.1"
tekton.dev/tags: "konflux"
name: dummy-check

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] pattern-inconsistency

Tags use quoted style vs unquoted comma-separated in existing tasks. Missing blank line before spec.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant