Skip to content

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

Draft
simonbaird wants to merge 11 commits into
conforma:mainfrom
simonbaird:reqd-task-its-poc
Draft

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

Conversation

@simonbaird

@simonbaird simonbaird commented Aug 7, 2026

Copy link
Copy Markdown
Member

For review bots: You can ignore this PR, it exists to test some pipelines and artifacts in Konflux. It won't be merged in this repo.

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

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 8fe70ed8-7cf1-4f80-94e6-cdd59e5bcb85

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 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
Define dummy-check task
tasks/dummy-check/0.1/dummy-check.yaml
Defines result parameters, validates the selected result, generates JSON test output, and publishes attestation data.
Process snapshot and invoke task
pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml
Accepts SNAPSHOT and RESULT, extracts the first containerImage, and passes image metadata to dummy-check.
Create and configure scenario
hack/create-dummy-its.sh
Applies a configurable IntegrationTestScenario, removes a conflicting pull secret, and links the push secret to the shared ServiceAccount when needed.
Disable Checks 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: Extract containerImage URL and digest
  reqd_task_poc_ec2011->>dummy_check: Pass RESULT and image metadata
  dummy_check->>AttestationAction: Pass image metadata and 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, ITS, and EC-2011 POC.
Description check ✅ Passed The description explains what and why, links EC-2011, and includes a test plan despite different section headings.
✨ 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

Grey Divider

Tip of the day
💡 Did you know, you can group findings by type and pick your Finding display, from Minimal to Full

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

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

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — Adding if: false unconditionally disables the Test, Acceptance, and Upload Coverage jobs. This workflow provides unit test, integration test, acceptance test, and code coverage gate signal on PRs and pushes to main/release-* branches. If merged, all PRs and pushes to main would land without these CI checks. The if: false approach is fragile — it would silently disable CI if the commit is cherry-picked or accidentally merged.
    Remediation: Use a branch-name condition instead of if: false, or move CI-disabling to a separate workflow file on the POC branch.

  • [CI coverage regression] .github/workflows/codeql.yaml:35 — Adding if: false disables the CodeQL security analysis job. This workflow runs on PRs to main, pushes to main, and on a weekly schedule. If merged, it would eliminate static analysis security scanning and the weekly scheduled scan entirely.
    Remediation: Use a branch-specific condition or keep CI modifications out of the PR entirely.

  • [protected-path] .github/workflows/checks-codecov.yaml, .github/workflows/codeql.yaml — PR modifies files under the protected .github/ path. The PR has no linked GitHub issue and the PR description does not explain why these governance/infrastructure files are being changed (the summary mentions only Tekton task, pipeline, and ITS additions — not CI workflow modifications). Human approval is required for all protected-path changes.
    Remediation: Provide justification for disabling CI workflows in the PR description or a linked issue. These changes require explicit human maintainer approval regardless of justification.

Medium

  • [External dependency pinning / supply chain] tasks/dummy-check/0.1/dummy-check.yaml:154 — The create-test-result-attestation step references a step action from an external personal repository (simonbaird/step-actions) on a named branch (runner-image-fix) rather than a pinned commit SHA. The step action runs with access to push credentials mounted at /etc/push-credentials.
    Remediation: Pin the step action reference to a specific commit SHA. Move the step action to the org-owned repository.

  • [External dependency pinning / supply chain] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:73 — The dummy-check task is referenced from a personal repository (simonbaird/conforma-cli) on a named branch (reqd-task-its-poc) rather than a pinned SHA. Branch references are mutable.
    Remediation: Pin to a specific commit SHA.

  • [Secrets exposure] tasks/dummy-check/0.1/dummy-check.yaml:52 — Push credentials secret is mounted into all steps via stepTemplate.volumeMounts, but only the create-test-result-attestation step needs push access. The dummy-check step gets unnecessary access to registry push credentials.
    Remediation: Move the volume mount from stepTemplate to only the create-test-result-attestation step.

Low

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:139TEST_OUTPUT JSON constructed via printf with %s for the NOTE field. If NOTE contains double-quotes, backslashes, or newlines, the JSON will be syntactically invalid.
    Remediation: Use jq or Python json.dumps for proper JSON escaping.

  • [scope-coherence] .github/workflows/checks-codecov.yaml:37 — Disabling CI jobs with if: false is scope creep beyond the POC's stated purpose of testing Tekton pipelines and artifacts in Konflux.
    Remediation: Remove the if: false additions or use branch-level filtering in workflow triggers.

  • [auto-generated docs contamination] tasks/dummy-check/0.1/dummy-check.yaml — Doc generation tooling discovers tasks via tasks/*/*/*.yaml glob. If merged, dummy-check would appear in published documentation alongside production tasks.
    Remediation: Move dummy-check outside the tasks/ directory or add filtering to exclude dummy tasks.

  • [metadata annotations] tasks/dummy-check/0.1/dummy-check.yaml:21 — Missing tekton.dev/displayName annotation that exists on all other tasks in the repo.


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 — Adding if: false to the Test, Acceptance, and Upload jobs unconditionally disables all unit tests, acceptance tests, and code coverage uploads. Since this targets the main branch and these jobs gate merges, any PR that merges this change (or a descendant) would allow code to land on main without test or coverage signal. The if: false approach is branch-unaware — it disables CI on every branch carrying this commit, not just the POC branch.
    Remediation: Replace if: false with a branch-conditional guard (e.g., if: "!contains(github.head_ref, 'reqd-task')") or move POC artifacts to a separate branch without modifying shared CI workflows.

  • [CI coverage regression] .github/workflows/codeql.yaml:35 — The CodeQL security analysis job is unconditionally disabled with if: false. This removes static security scanning for any branch carrying this commit, including the weekly scheduled scan on main.
    Remediation: Use a branch-conditional guard or avoid modifying shared CI workflows in POC branches.

Medium

  • [shell-injection] hack/create-dummy-its.sh:102 — The ${PULL_SECRET} shell variable is interpolated directly into inline Python string code within python3 -c heredocs. A crafted PULL_SECRET value containing a single quote could break out of the Python string and inject arbitrary Python code. The variable is user-controllable via the PULL_SECRET environment variable.
    Remediation: Pass PULL_SECRET as an environment variable to the Python subprocess and reference os.environ['PULL_SECRET'] in the Python code.

  • [privilege-escalation] hack/create-dummy-its.sh:68 — The script patches the shared konflux-integration-runner ServiceAccount to attach image push credentials, granting push access to ALL IntegrationTestScenario pipelines in the namespace — not just this POC's pipeline. The script also removes a pull-only secret, which is a destructive change to the shared SA. The TODO at lines 63–69 acknowledges this over-scoping.
    Remediation: Create a dedicated ServiceAccount for this POC pipeline rather than modifying the shared integration runner SA.

  • [supply-chain-integrity] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:75 — The pipeline's taskRef references a task from a personal GitHub repository (https://github.com/simonbaird/conforma-cli) using a mutable branch name (reqd-task-its-poc) rather than a pinned commit SHA. The resolved task definition can change at any time by pushing to that branch.
    Remediation: Pin the revision to a specific commit SHA instead of a branch name.

  • [protected-path] .github/workflows/checks-codecov.yaml, .github/workflows/codeql.yaml — This PR modifies files under the protected .github/ path. The PR body explains the rationale (disabling CI for POC branch) and references JIRA EC-2011. Human approval is always required for protected-path changes, regardless of context.

Low

  • [race-condition] hack/create-dummy-its.sh:100 — The script captures SA_JSON once and uses the stale snapshot for two separate mutation decisions without re-fetching after the first oc patch. Practically safe in current code (the push-secret check uses grep on the original JSON, and op:add with /secrets/- does not depend on indices) but a latent correctness risk if extended.

  • [fragile-json-parsing] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:59 — The parse-snapshot step extracts containerImage from JSON using grep -oP (Perl regex). This regex-based approach is fragile for edge-case JSON formatting. Acceptable for a POC.

  • [missing-authorization] No linked GitHub issue. The PR references external JIRA ticket EC-2011, which is not accessible to automated review tooling.

  • [personal-fork-references] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:73 — The pipeline and task reference personal fork repositories. Acceptable for a DNM/POC PR but would need updating if any artifacts are promoted.

  • [edge-case] tasks/dummy-check/0.1/dummy-check.yaml:155printf '%d' with Tekton string params would silently produce 0 for non-numeric input without failing the script.

  • [supply-chain-integrity] tasks/dummy-check/0.1/dummy-check.yaml — The create-test-result-attestation step references a step action from a personal GitHub repository (simonbaird/step-actions). While pinned to a commit SHA, the code is outside the organization's governance and receives push credentials.

  • [injection] hack/create-dummy-its.sh:91 — Shell variables are interpolated directly into YAML documents (oc apply), Python code strings, and JSON patch payloads without input validation or sanitization.

  • [naming-convention] hack/create-dummy-its.sh:19 — Uses short-form set -euo pipefail where the established repo convention across hack/ scripts is the long form: set -o errexit, set -o nounset, set -o pipefail.

  • [code-organization] tasks/dummy-check/0.1/dummy-check.yaml:21 — Metadata field ordering (labelsannotationsname) doesn't match the existing task convention (nameannotationslabels).


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 (2)

Review

Findings

Medium

  • [CI-coverage-regression] .github/workflows/checks-codecov.yaml:37 — Adding if: false unconditionally disables the Test, Acceptance, and Upload jobs for all pull requests and pushes to main/release branches. If merged, every subsequent PR would lose unit test, acceptance test, and code coverage CI signal. The disable is global with no branch-scoped condition. See also: [scope-creep] finding at this location.
    Remediation: Use a branch-scoped condition such as if: github.head_ref != 'reqd-task-its-poc', or remove the CI changes entirely.

  • [CI-coverage-regression] .github/workflows/codeql.yaml:35 — The if: false unconditionally disables CodeQL security analysis for all PRs and pushes to main, as well as the weekly scheduled scan. See also: [CI-security-regression] finding at this location.
    Remediation: Scope the skip condition to this branch only, or remove the CI modification.

  • [CI-security-regression] .github/workflows/codeql.yaml:35 — Disabling CodeQL removes automated static analysis security scanning for the repository if merged. See also: [CI-coverage-regression] finding at this location.
    Remediation: Do not disable CodeQL scanning on the main branch. Use branch-specific conditions or keep changes on a non-protected branch.

  • [secret-exposure] tasks/dummy-check/0.1/dummy-check.yaml — The dummy-check task mounts the push secret imagerepository-for-ec-main-cli-main-image-push and passes credentials to a step-action from a personal GitHub repository (simonbaird/step-actions at pinned commit SHA 96ea0a517bb15766889c7ed68775a3e32b7890e2). While the SHA pin prevents tag-based supply chain attacks, the secret is exposed to code hosted outside the organization.
    Remediation: Reference step-actions from the organization's official repository. Verify the pinned commit SHA corresponds to trusted, reviewed code.

  • [JSON-injection] tasks/dummy-check/0.1/dummy-check.yaml — TEST_OUTPUT JSON is constructed via printf with raw string interpolation of ${NOTE}. If NOTE contains double quotes, backslashes, or newlines, the resulting JSON will be syntactically invalid, causing downstream consumers (including the attestation step) to receive malformed data.
    Remediation: Use jq to construct the JSON safely, or escape the NOTE value before interpolation.

  • [injection] hack/create-dummy-its.sh${PULL_SECRET} is interpolated directly into a Python string literal inside a bash heredoc. A single quote in the variable would break out of the Python string boundary and allow arbitrary Python code injection. Similar interpolation risks apply to variables in the oc apply YAML heredoc.
    Remediation: Pass variables to Python via environment variables (e.g., PULL_SECRET_NAME="${PULL_SECRET}" python3 -c "import os; name = os.environ['PULL_SECRET_NAME']; ...") instead of string interpolation.

  • [architectural-coherence] tasks/dummy-check/0.1/dummy-check.yaml — The task and pipeline reference resources from a personal GitHub account (simonbaird/conforma-cli and simonbaird/step-actions) rather than the organization's repositories. This is inconsistent with the project's supply chain integrity model — the very thing this CLI is designed to verify.
    Remediation: Reference official project-owned resources for the step action, or clearly document the task as temporary test infrastructure with an expiration plan.

  • [scope-creep] .github/workflows/checks-codecov.yaml:37 — Disabling all CI quality gates (codecov Test, Acceptance, Upload jobs and CodeQL analysis) via if: false is a significant scope expansion beyond what a POC for testing pipelines and artifacts in Konflux would require. See also: [CI-coverage-regression] finding at this location.
    Remediation: Remove the if: false additions from the CI workflow files.

  • [protected-path] .github/workflows/checks-codecov.yaml, .github/workflows/codeql.yaml — This PR modifies files under the protected .github/ path. The PR references Jira ticket EC-2011 as context, but human approval is always required for protected-path modifications regardless of justification.

Low

  • [type-mismatch] tasks/dummy-check/0.1/dummy-check.yaml — SUCCESSES, FAILURES, and WARNINGS parameters are declared as type: string but formatted with %d (decimal integer) in the printf call. Non-numeric input silently produces 0 and a stderr warning instead of failing.
    Remediation: Add input validation to ensure these values are non-negative integers before use in printf.

  • [fail-open] tasks/dummy-check/0.1/dummy-check.yaml — The secret volume is marked optional: true, meaning the task silently proceeds without push credentials if the secret is unavailable, potentially resulting in unsigned or unattested test results.
    Remediation: Consider removing optional: true if credentials are required for the attestation step to function correctly.

  • [shell-idiom] hack/create-dummy-its.sh:19 — Uses short-form set -euo pipefail while the overwhelming majority (30 of 34) of hack/ scripts use long-form (set -o errexit, set -o nounset, set -o pipefail).
    Remediation: Use long-form set flags for consistency with the existing codebase.


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 (3)

Review

Findings

High

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — Adding if: false unconditionally disables the Test, Acceptance, and Upload jobs. This workflow gates unit tests, acceptance tests, and code coverage on PR and push to main/release branches. If merged, all subsequent changes would land without these checks. The PR is not in draft state and targets main.
    Remediation: Mark the PR as draft or use a branch-scoped condition instead of unconditional false.

  • [CI coverage regression / security gate bypass] .github/workflows/codeql.yaml:35 — Adding if: false unconditionally disables the CodeQL security analysis job, removing SAST scanning for all PRs and pushes to main plus the weekly scheduled scan.
    Remediation: Use a branch-scoped condition or mark PR as draft to prevent accidental merge.

  • [protected-path] .github/workflows/checks-codecov.yaml, .github/workflows/codeql.yaml — Both files are under the protected .github/ path. The PR has no linked GitHub issue and does not provide explicit justification for modifying governance/infrastructure files. Human approval is required for all protected-path changes.
    Remediation: Link a GitHub issue that authorizes the CI workflow modifications, or remove the .github/ changes from this PR.

Medium

  • [missing-authorization] — Non-trivial change (XL size, 400+ new lines) with no linked GitHub issue. EC-2011 is an external Jira reference without a corresponding GitHub issue establishing scope.
    Remediation: Create a linked GitHub issue for the EC-2011 POC work, or convert this PR to draft status.

  • [runtime failure] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:48 — The parse-snapshot step uses grep -oP with the PCRE-specific \K operator on ubi9/ubi-minimal. The -P flag requires libpcre2 which may not be present on the minimal image, causing a runtime failure.
    Remediation: Replace with a portable alternative (e.g., sed or python3).

  • [supply chain / mutable reference] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:75 — The dummy-check task reference uses a branch name (reqd-task-its-poc) from a personal fork, not a commit hash. Mutable references are a supply chain risk.
    Remediation: Pin the revision to a commit SHA.

  • [coherence-personal-references] hack/create-dummy-its.sh — New files reference personal forks (simonbaird/conforma-cli, simonbaird/step-actions) rather than organization-owned repositories.
    Remediation: Use organization-owned references before any production use.

Low

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:133TEST_OUTPUT JSON is constructed via printf with unsanitized %s interpolation of NOTE. Custom NOTE values with double quotes or newlines produce malformed JSON.
    Remediation: Use jq for safe JSON construction.

  • [shell injection into Python] hack/create-dummy-its.sh:70PULL_SECRET is interpolated directly into inline Python string literals. Single quotes in the variable value cause Python syntax errors or code injection.
    Remediation: Pass as an environment variable using os.environ.

  • [supply chain / external dependency] tasks/dummy-check/0.1/dummy-check.yaml:179 — The attestation step-action references a personal repo (simonbaird/step-actions), though it is commit-pinned. For production use, this should be organization-owned.
    Remediation: Move to the conforma organization repository.

  • [secrets access / over-permissioned parameter] tasks/dummy-check/0.1/dummy-check.yaml:54PUSH_SECRET_NAME allows callers to mount arbitrary namespace secrets by overriding the parameter. This follows standard Tekton patterns but should be documented.
    Remediation: Hardcode the secret name or document the trust boundary.

  • [shell-strict-mode] hack/create-dummy-its.sh:19 — Uses set -euo pipefail shorthand while the predominant convention in hack/ scripts is long-form (set -o errexit, etc.).
    Remediation: Use the long-form options for consistency.


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 (4)

Review

Findings

High

  • [ci-safety-guard-disabled] .github/workflows/checks-codecov.yaml — All CI test jobs (Test, Acceptance, Upload) are unconditionally disabled with if: false. While the PR is labeled [DNM] and the author states it will not be merged, these workflow changes are active on the PR branch. If accidentally merged or cherry-picked, CI protection for the repository is silently removed.
    Remediation: Use a branch-conditional guard (e.g., if: github.ref != 'refs/heads/reqd-task-its-poc') instead of if: false, so that CI remains active on main and other branches.

  • [ci-safety-guard-disabled] .github/workflows/codeql.yaml:35 — CodeQL security scanning is disabled via if: false on the analyze job. If merged, the repository would lose automated SAST for Go code on pushes, pull requests, and scheduled scans.
    Remediation: Use a branch-conditional guard instead of if: false to preserve CodeQL on main and release branches, or leave this workflow unmodified.

  • [Supply chain - mutable dependency resolution] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml — The pipeline resolves its Tekton task from a personal fork (https://github.com/simonbaird/conforma-cli) using a branch reference (reqd-task-its-poc) rather than an immutable commit SHA. The branch can be force-pushed, changing resolved task content without visibility.
    Remediation: Pin the task resolver reference to an immutable commit SHA instead of a branch name.

Medium

  • [protected-path] .github/ — This PR modifies files under protected paths (.github/workflows/checks-codecov.yaml, .github/workflows/codeql.yaml). The PR references EC-2011 and explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

  • [scope-creep] — Disabling all CI test jobs and CodeQL scanning is unrelated to the stated POC intent of dog-fooding a required task in an ITS. The CI changes alter the safety posture of the repository rather than adding experimental infrastructure.
    Remediation: Remove the CI-disabling changes from this PR. If CI failures block iteration, address them directly or use a mechanism that does not affect workflow definitions.

  • [privilege-escalation] hack/create-dummy-its.sh — The script removes a pull-only secret (ec-main-pull) from the konflux-integration-runner ServiceAccount and replaces it with a push secret, escalating the SA from pull-only to push access on the image repository.
    Remediation: Document the security rationale for granting push access. Add validation that target secrets exist and are of expected types before manipulating the SA.

  • [Injection - shell variable in Python string] hack/create-dummy-its.sh${PULL_SECRET} is interpolated by bash inside a Python string literal in the heredoc. A crafted value containing a single quote could break the Python syntax and achieve code injection. The same pattern applies to the INDEX extraction.
    Remediation: Pass PULL_SECRET as an environment variable to python3 and access it via os.environ['PULL_SECRET'].

  • [Supply chain - external dependency from personal repository] tasks/dummy-check/0.1/dummy-check.yaml — References a step-action from simonbaird/step-actions (personal repository). While SHA-pinned (c267bd7...), personal repos lack organization-level access controls, branch protection, and review requirements.
    Remediation: Host the step-action in the organization repository or vendor it. At minimum, document this as POC-only.

Low

  • [edge-case] tasks/dummy-check/0.1/dummy-check.yamlprintf %d format specifiers for SUCCESSES/FAILURES/WARNINGS accept unvalidated string params; non-integer values produce silent 0.

  • [edge-case] tasks/dummy-check/0.1/dummy-check.yaml — SUCCESS result does not reset user-provided FAILURES/WARNINGS values, allowing internally inconsistent output (e.g., result: SUCCESS with failures: 5).

  • [edge-case] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml — SNAPSHOT parsing uses grep -oP (Perl-compatible regex), a GNU extension that may not be available in all ubi-minimal images.

  • [shell-options-idiom] hack/create-dummy-its.sh:19 — Uses set -euo pipefail (short-form) while all other hack/ scripts use long-form (set -o errexit, set -o nounset, set -o pipefail).

  • [yaml-field-ordering] tasks/dummy-check/0.1/dummy-check.yaml:22 — Task metadata orders fields as labels, annotations, name. Existing tasks use name, annotations, labels.


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 (5)

Review

Findings

High

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — Adding if: false unconditionally disables the Test, Acceptance, and Upload jobs for all branches, including PRs to main. The comment says "skipped for POC branch" but if: false is not branch-scoped — if merged, all automated testing and coverage gates are removed.
    Remediation: Scope the skip to the POC branch only (e.g., if: github.ref != 'refs/heads/reqd-task-its-poc'), or do not merge these workflow changes to main.

  • [CI coverage regression / Security scanning bypass] .github/workflows/codeql.yaml:35 — Adding if: false unconditionally disables CodeQL security analysis for all branches and the weekly schedule, removing automated SAST scanning coverage.
    Remediation: Scope the condition to the POC branch or do not merge this workflow change to main.

Medium

  • [protected-path] .github/workflows/checks-codecov.yaml — This PR modifies files under the protected .github/ path: checks-codecov.yaml and codeql.yaml. Human approval is always required for protected-path changes, regardless of context.

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:119 — The NOTE value is interpolated into JSON via printf without JSON escaping. If NOTE contains double quotes, backslashes, or newlines, TEST_OUTPUT will be malformed JSON.
    Remediation: Use jq to construct JSON output instead of printf string interpolation.

  • [command-injection] hack/create-dummy-its.sh:47PULL_SECRET is interpolated into inline Python code via shell string expansion. A crafted value containing a single quote could break out of the Python string context and execute arbitrary Python code.
    Remediation: Pass PULL_SECRET as an environment variable and access with os.environ['PULL_SECRET'] in the Python code.

  • [unpinned-dependency] tasks/dummy-check/0.1/dummy-check.yaml:147 — The create-test-result-attestation step references a personal fork (simonbaird/step-actions) at a mutable branch ref (runner-image-fix). If the branch is compromised or force-pushed, the attestation step could be replaced with malicious code.
    Remediation: Pin to a specific commit SHA.

  • [fork-reference] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:96 — Pipeline task references personal fork (simonbaird/conforma-cli) at branch reqd-task-its-poc rather than the canonical conforma/cli repository.
    Remediation: Document follow-up to migrate to canonical repo before any production use.

Low

  • [logic-error] tasks/dummy-check/0.1/dummy-check.yaml:100RESULT validation uses grep -qw which interprets regex metacharacters. A value like S.CCESS would match SUCCESS due to . being a regex wildcard.
    Remediation: Use grep -qwF for fixed-string matching.

  • [shell-idiom] hack/create-dummy-its.sh:19 — Uses set -euo pipefail (short form), while the overwhelming majority of hack/ scripts use long-form set -o errexit, set -o nounset, set -o pipefail.
    Remediation: Replace with long-form set options to match project convention.

  • [naming-convention] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml — Directory named dummy-integration-test but Pipeline metadata name is reqd-task-poc-ec2011. Convention is for these to match.
    Remediation: Align directory name with metadata name.


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 (6)

Review

Findings

High

  • [protected-path] .github/workflows/checks-codecov.yaml — This file is under the .github/ protected path. The PR has no linked GitHub issue to authorize modifications to governance/infrastructure files. Human approval is required for all protected-path changes.
    Remediation: Link a GitHub issue that authorizes the CI workflow changes, or remove the .github/ modifications from this PR.

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — All three CI jobs (Test, Acceptance, Upload) are unconditionally disabled with if: false. This workflow runs on pull_request and push to main and release-* branches. If merged to main, all subsequent PRs and pushes will lack unit test, acceptance test, and code-coverage CI signal. No other workflow in this repository provides equivalent coverage.
    Remediation: Do not merge these if: false guards to main. Either scope the skip to the POC branch with a conditional expression (e.g., if: github.head_ref != 'reqd-task-its-poc'), or remove the guards before merging.

  • [supply-chain] tasks/dummy-check/0.1/dummy-check.yaml:148 — The create-test-result-attestation step action is resolved from a personal fork (simonbaird/step-actions) at a mutable branch ref (runner-image-fix). This step creates attestations and receives image-url, image-digest, and test-output as inputs. A compromise of the personal fork or a force-push to this branch could inject malicious code into the attestation creation process.
    Remediation: Pin the resolver reference to an immutable commit SHA, and reference the organizational repository rather than a personal fork.

Medium

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:130TEST_OUTPUT JSON is constructed via printf with %s format specifiers. The NOTE value can contain double quotes, backslashes, or newlines (either user-supplied or from $(context.task.name)) that would produce syntactically invalid JSON. Malformed output propagates to the attestation step.
    Remediation: Use jq or python3 -c 'import json; ...' to construct JSON safely.

  • [supply-chain] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:69 — The pipeline resolves the dummy-check task from a personal fork (simonbaird/conforma-cli) at mutable branch reqd-task-its-poc. The hack/create-dummy-its.sh script also defaults to the same personal fork. Existing project pipelines use organization-owned bundle resolvers.
    Remediation: Pin to an immutable commit SHA and reference the organizational repository.

Low

  • [TOCTOU race] hack/create-dummy-its.sh:49SA_JSON is fetched once and reused after oc patch modifies the ServiceAccount. The second grep check operates on a stale snapshot.
  • [Shell injection] hack/create-dummy-its.sh:53PULL_SECRET is bash-expanded directly inside an inline Python string literal. A crafted override value with single quotes could escape the string context.
  • [injection] hack/create-dummy-its.sh:20oc apply heredoc interpolates environment variables directly into YAML without escaping.
  • [scope-creep] hack/create-dummy-its.sh:86 — Script modifies the shared konflux-integration-runner ServiceAccount, potentially affecting other ITS in the namespace.
  • [Fragile regex parsing] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:51parse-snapshot uses grep regex to extract containerImage. If the image reference lacks an @ digest separator, IMAGE_DIGEST receives the entire image string.
  • [missing-authorization] No linked GitHub issue. Jira EC-2011 is external and cannot be verified.
  • [naming-coherence] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:22 — Directory is dummy-integration-test but Pipeline resource name is reqd-task-poc-ec2011.
  • [shell set-options idiom] hack/create-dummy-its.sh:19 — Uses compact set -euo pipefail; convention in hack/ is long-form.
  • [YAML metadata field ordering] tasks/dummy-check/0.1/dummy-check.yaml:20 — Metadata field order is labels, annotations, name; convention is name, annotations, labels.
  • [missing-docs] tasks/dummy-check/0.1/dummy-check.yaml — New task has no documentation page (expected for POC/DNM status).

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 (7)

Review

Findings

High

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — All three CI jobs (Test, Acceptance, Upload) are unconditionally disabled with if: false. The PR is not marked as draft and targets main. If merged, all unit tests, integration tests, acceptance tests, and code coverage uploads from this workflow are disabled for subsequent PRs. The [DNM] title convention is not enforced by branch protection.
    Remediation: Mark this PR as a draft to prevent accidental merge, or remove the CI-disabling changes from this PR entirely.

  • [protected-path] .github/workflows/checks-codecov.yaml — This PR modifies a file under the protected .github/ path. The PR has no linked GitHub issue establishing formal authorization for modifying governance/infrastructure files. Human approval is always required for protected-path changes.
    Remediation: Link a GitHub issue that explicitly authorizes the CI workflow changes, or obtain human approval from a code owner.

Medium

  • [Shell injection in embedded Python] hack/create-dummy-its.sh:84 — The PULL_SECRET shell variable is interpolated by bash into Python single-quoted string literals in the embedded python3 -c calls. Since PULL_SECRET is user-overridable via environment variable, a value containing a single quote would break out of the Python string, potentially allowing arbitrary code execution. This is a hack/ utility script run manually by developers, which limits the practical attack surface.
    Remediation: Pass PULL_SECRET as an environment variable to the python3 subprocess rather than interpolating it into the code string, e.g., PULL_SECRET="${PULL_SECRET}" python3 -c 'import os; ps = os.environ["PULL_SECRET"]; ...'.

  • [PCRE grep portability] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:67 — The parse-snapshot step uses grep -oP with the \K PCRE operator to extract containerImage from JSON. The ubi9/ubi-minimal:latest image may not include PCRE support for grep, which would cause the step to fail at runtime with grep: -P is not supported.
    Remediation: Replace with a POSIX-compatible approach or use python3/jq for JSON parsing.

  • [supply chain / unpinned dependency] tasks/dummy-check/0.1/dummy-check.yaml:156 — The step action create-test-result-attestation references https://github.com/simonbaird/step-actions at mutable branch runner-image-fix. This is a personal fork on a feature branch used for attestation creation. A force-push or branch deletion would alter or break attestation behavior.
    Remediation: Pin the revision parameter to a specific commit SHA.

  • [supply chain / unpinned dependency] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:93 — The pipeline's dummy-check taskRef resolves from https://github.com/simonbaird/conforma-cli at mutable branch reqd-task-its-poc. A force-push or branch deletion would alter or break pipeline behavior.
    Remediation: Pin the revision parameter to a specific commit SHA.

Low

  • [JSON injection / malformed output] tasks/dummy-check/0.1/dummy-check.yaml:138 — The TEST_OUTPUT JSON is constructed via printf with %s interpolation for the NOTE field. If NOTE contains double quotes, backslashes, or newlines, the resulting JSON will be malformed. In practice, the default NOTE values are hardcoded safe strings and RESULT is validated, so the risk is limited to user-provided custom NOTE values.
    Remediation: Use jq or python3 to construct the JSON safely.

  • [Shell option style] hack/create-dummy-its.sh:18 — Uses short-form set -euo pipefail while the majority of shell scripts in hack/ use the long-form convention (set -o errexit, set -o nounset, set -o pipefail, one per line).
    Remediation: Replace with the long-form convention for consistency.

  • [Hardcoded personal reference] hack/create-dummy-its.sh:25 — The default for GIT_URL is a personal fork (https://github.com/simonbaird/conforma-cli). This is consistent with the POC nature but should be updated to the organization URL before any production use.
    Remediation: Consider using the organization URL as the default.

  • [Type mismatch in printf format] tasks/dummy-check/0.1/dummy-check.yaml:138SUCCESSES, FAILURES, and WARNINGS parameters are declared as type: string but used with %d (integer) format specifiers in printf. Bash is lenient with this, but non-numeric input would silently produce 0 with a stderr warning.

  • [Pinned to non-default branch] tasks/dummy-check/0.1/dummy-check.yaml:158 — The create-test-result-attestation step action references simonbaird/step-actions at revision runner-image-fix, a feature/fix branch. Similarly, the pipeline references simonbaird/conforma-cli at reqd-task-its-poc. If these branches are deleted or rebased, the task/pipeline will fail to resolve.


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 (8)

Review

Findings

High

  • [CI coverage regression] .github/workflows/checks-codecov.yaml:37 — All three CI jobs (Test, Acceptance, Upload) are unconditionally disabled with if: false. This workflow runs on PRs and pushes to main and release-* branches. If merged, all Go unit tests, integration tests, acceptance tests, code generation checks, and code coverage uploads would be permanently disabled for all future PRs and pushes to main.
    Remediation: Do not merge the if: false changes to main. If this POC branch needs to skip these checks, use a branch-specific condition (e.g., if: github.head_ref != 'reqd-task-its-poc') or keep this change on a non-main branch only.

  • [Supply chain / Untrusted external code reference] tasks/dummy-check/0.1/dummy-check.yaml:155 — The create-test-result-attestation step references a step-action from a personal GitHub repository (simonbaird/step-actions) using a mutable branch name (runner-image-fix) rather than an immutable commit SHA. This step-action creates test-result attestations, which are security-sensitive artifacts.
    Remediation: Pin the revision to an immutable commit SHA. Move the step-action to the official organization repository before using it beyond local development.

  • [Supply chain / Untrusted external code reference] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:96 — The pipeline's dummy-check task references a task definition from a personal GitHub repository (simonbaird/conforma-cli) using a mutable branch name (reqd-task-its-poc). The Tekton git resolver will fetch whatever is at HEAD of that branch at resolution time.
    Remediation: Pin the revision to an immutable commit SHA. For any non-POC use, migrate the task definitions to the official organization repository.

  • [protected-path] .github/workflows/checks-codecov.yaml — This PR modifies a file under the .github/ protected path. The PR has no linked GitHub issue and the description does not explain why CI jobs need to be disabled. Changes to governance and infrastructure files require human approval.
    Remediation: Create a linked GitHub issue explaining the rationale for disabling CI jobs, or move this change to a non-main branch.

Medium

  • [edge-case] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:75 — The parse-snapshot step uses grep -oP which requires PCRE support. The ubi9/ubi-minimal image may not include PCRE, causing the step to fail with "support for the -P option is not compiled into this binary".
    Remediation: Replace the Perl regex with a POSIX-compatible alternative or use jq.

  • [edge-case] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:80 — If the containerImage value in the SNAPSHOT does not contain an @ separator (e.g., a tagged image like quay.io/example/repo:latest), the parameter expansion IMAGE_DIGEST="${IMAGE##*@}" will set IMAGE_DIGEST to the entire image string rather than an actual digest, causing incorrect data to flow downstream.
    Remediation: Add a guard to verify the image contains @ and the digest is valid.

  • [Injection / Unsanitized variable interpolation] tasks/dummy-check/0.1/dummy-check.yaml:119 — The dummy-check step uses printf to construct a JSON object, interpolating NOTE directly via %s without escaping JSON special characters (double quotes, backslashes, newlines). A malformed NOTE value could produce invalid JSON.
    Remediation: Use jq to construct JSON safely.

  • [shell set-option idiom] hack/create-dummy-its.sh:19 — The script uses set -euo pipefail (compact form), but every existing script in hack/ uses the long-form set -o errexit, set -o nounset, set -o pipefail on separate lines.
    Remediation: Replace set -euo pipefail with separate set -o errexit, set -o nounset, set -o pipefail lines.

Low

  • [Injection / Shell command injection via environment variables] hack/create-dummy-its.sh:36 — The script interpolates environment variables directly into YAML heredoc and JSON patch payloads without sanitization. Theoretical YAML/JSON injection risk, though practical exploitation requires controlling the operator's environment.

  • [scope-creep-beyond-poc] tasks/dummy-check/0.1/dummy-check.yaml — POC artifacts are placed in production-grade versioned directories (tasks/dummy-check/0.1/, pipelines/dummy-integration-test/0.1/) alongside real production tasks and pipelines, blurring the line between throwaway and permanent code.

  • [YAML document structure] tasks/dummy-check/0.1/dummy-check.yaml — The YAML document separator (---) is placed after the license comment block. Existing task definitions place --- as the first line, before the license header.

  • [metadata annotations] tasks/dummy-check/0.1/dummy-check.yaml — The task is missing the tekton.dev/displayName annotation that both existing tasks include.

  • [naming-inconsistency] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:24 — The pipeline is named reqd-task-poc-ec2011, encoding a Jira ticket identifier, while existing pipelines use descriptive functional names.

  • [Injection / Regex-based parsing] pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:75 — The parse-snapshot step uses grep with regex to extract containerImage from JSON rather than using a proper JSON parser like jq.


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 (9)

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 (10)

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[bot]

This comment was marked as outdated.

@st3penta st3penta left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nice!
i won't approve since it's DNM, just to be safe, but looks good as a POC

See comments for explanation. This might need to be revisited in
future, since the idea of every ITS having access to the push secret
seems in need of scrutiny.

Also, there might be a cleaner way to do this already. Will sync
with Integration Service team about it.

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

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:32 PM UTC · Completed 3:51 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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
hack/create-dummy-its.sh (1)

24-26: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Pin both Git resolver revisions to immutable commit SHAs. GIT_REVISION defaults to mutable reqd-task-its-poc, and the pipeline task resolver uses the same mutable ref at pipelines/dummy-integration-test/0.1/dummy-integration-test.yaml:100. A moved ref can change the pipeline or task without changing the scenario. Use reviewed full commit SHAs for both revisions and validate GIT_REVISION before applying.

🤖 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 24 - 26, Update the defaults in the
dummy integration test setup to use reviewed, immutable full commit SHAs for
both the top-level GIT_REVISION and the pipeline task resolver revision in
dummy-integration-test.yaml. Add validation before applying GIT_REVISION so only
a full commit SHA is accepted, while preserving the existing override behavior.

Source: Path instructions

🤖 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 75-80: Update the ServiceAccount check and patch around
INTEGRATION_SA to query only .secrets[].name, avoiding matches from
imagePullSecrets or metadata. Make the JSON patch initialize /secrets as an
array when absent or null, and append the PUSH_SECRET only when the secrets
array already exists.
- Around line 62-71: Update the ServiceAccount setup in hack/create-dummy-its.sh
so PUSH_SECRET is not linked to the shared konflux-integration-runner used by
all IntegrationTestScenario pipelines. Run this ITS in an isolated namespace or
configure a dedicated per-ITS ServiceAccount when supported, ensuring untrusted
ITS pipelines cannot access the push credential.

---

Outside diff comments:
In `@hack/create-dummy-its.sh`:
- Around line 24-26: Update the defaults in the dummy integration test setup to
use reviewed, immutable full commit SHAs for both the top-level GIT_REVISION and
the pipeline task resolver revision in dummy-integration-test.yaml. Add
validation before applying GIT_REVISION so only a full commit SHA is accepted,
while preserving the existing override behavior.
🪄 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: 2d3208c7-bd68-442b-8547-a1be70f22d05

📥 Commits

Reviewing files that changed from the base of the PR and between 1544e2f and 9cedcf9.

📒 Files selected for processing (1)
  • hack/create-dummy-its.sh

Comment thread hack/create-dummy-its.sh
Comment thread hack/create-dummy-its.sh Outdated
fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:54 PM UTC · Completed 4:14 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@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 `@hack/create-dummy-its.sh`:
- Around line 88-100: Update the pull-secret presence check before the removal
block to require an exact “found” result rather than a substring match, so
“not_found” does not enter the patch path. Preserve the existing INDEX lookup
and oc patch behavior when the secret is actually present, and allow repeat runs
to complete when it is absent.
🪄 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: 7f2019c3-4962-4024-9b66-5451c4125676

📥 Commits

Reviewing files that changed from the base of the PR and between 9cedcf9 and d1f1655.

📒 Files selected for processing (1)
  • hack/create-dummy-its.sh

Comment thread hack/create-dummy-its.sh
Comment on lines +88 to +100
print('found' if '${PULL_SECRET}' in secrets else 'not_found')
" | grep -q "found"; then
echo "Removing pull secret '${PULL_SECRET}' from SA '${INTEGRATION_SA}' to avoid credential conflict"
INDEX=$(echo "${SA_JSON}" | python3 -c "
import json, sys
sa = json.load(sys.stdin)
for i, s in enumerate(sa.get('secrets', [])):
if s['name'] == '${PULL_SECRET}':
print(i)
break
")
oc patch sa "${INTEGRATION_SA}" -n "${NAMESPACE}" --type=json \
-p="[{\"op\":\"remove\",\"path\":\"/secrets/${INDEX}\"}]"

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

Use an exact match for the pull-secret result.

Line 89 matches both found and not_found. If the pull secret is absent, INDEX is empty and the JSON Patch fails. The script cannot complete on a repeat run after the secret was removed.

Proposed fix
- " | grep -q "found"; then
+ " | grep -Fxq "found"; then
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
print('found' if '${PULL_SECRET}' in secrets else 'not_found')
" | grep -q "found"; then
echo "Removing pull secret '${PULL_SECRET}' from SA '${INTEGRATION_SA}' to avoid credential conflict"
INDEX=$(echo "${SA_JSON}" | python3 -c "
import json, sys
sa = json.load(sys.stdin)
for i, s in enumerate(sa.get('secrets', [])):
if s['name'] == '${PULL_SECRET}':
print(i)
break
")
oc patch sa "${INTEGRATION_SA}" -n "${NAMESPACE}" --type=json \
-p="[{\"op\":\"remove\",\"path\":\"/secrets/${INDEX}\"}]"
print('found' if '${PULL_SECRET}' in secrets else 'not_found')
" | grep -Fxq "found"; then
echo "Removing pull secret '${PULL_SECRET}' from SA '${INTEGRATION_SA}' to avoid credential conflict"
INDEX=$(echo "${SA_JSON}" | python3 -c "
import json, sys
sa = json.load(sys.stdin)
for i, s in enumerate(sa.get('secrets', [])):
if s['name'] == '${PULL_SECRET}':
print(i)
break
")
oc patch sa "${INTEGRATION_SA}" -n "${NAMESPACE}" --type=json \
-p="[{\"op\":\"remove\",\"path\":\"/secrets/${INDEX}\"}]"
🤖 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 88 - 100, Update the pull-secret
presence check before the removal block to require an exact “found” result
rather than a substring match, so “not_found” does not enter the patch path.
Preserve the existing INDEX lookup and oc patch behavior when the secret is
actually present, and allow repeat runs to complete when it is absent.

The pull-only ec-main-pull secret covers the same registry path as the
push secret. When Tekton merges credentials, the pull-only one can win,
causing oras attach to fail with "unauthorized". The push secret includes
pull permission so removing the pull-only one loses nothing.

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

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 5:42 PM UTC · Completed 6:01 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:08 PM UTC · Completed 7:26 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@simonbaird

Copy link
Copy Markdown
Member Author

/retest

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 7:55 PM UTC · Ended 8:13 PM UTC

Commit: 87c4a29 · View workflow run →

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:14 PM UTC · Completed 8:33 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 8:40 PM UTC · Ended 8:55 PM UTC

Commit: 87c4a29 · View workflow run →

Tekton merges all SA secrets into a single docker config, and pull-only
credentials can take precedence over push credentials for the same
registry. Mount the push secret directly and set DOCKER_CONFIG so oras
uses it instead of the merged credentials.

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:57 PM UTC · Completed 9:14 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

Pass the mounted push secret directly to oras via --registry-config
instead of trying to overwrite the merged docker config. Confirmed
the push secret works when used directly.

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

fullsend-ai-review Bot commented Aug 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:36 PM UTC · Completed 9:54 PM UTC

Commit: 87c4a29 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

Point to new step action commit that uses quay.io/konflux-ci/oras
instead of a custom runner image, eliminating a build dependency.

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

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 3:25 AM UTC · Ended 3:44 AM UTC

Commit: 87c4a29 · View workflow run →

@simonbaird
simonbaird marked this pull request as draft August 11, 2026 03:26
fullsend-ai-review[bot]

This comment was marked as outdated.

Switch back to branch name 'runner-image-fix' to test whether
the git resolver cache has cleared.

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

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:03 AM UTC · Completed 4:22 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 unconditionally disables the Test, Acceptance, and Upload Coverage jobs. This workflow provides unit test, integration test, acceptance test, and code coverage gate signal on PRs and pushes to main/release-* branches. If merged, all PRs and pushes to main would land without these CI checks.

Suggested fix: Use a branch-name condition instead of if: false, or move CI-disabling to a separate workflow file on the POC branch.


jobs:
analyze:
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 disables the CodeQL security analysis job. This workflow runs on PRs to main, pushes to main, and on a weekly schedule. If merged, it would eliminate static analysis security scanning and the weekly scheduled scan entirely.

Suggested fix: Use a branch-specific condition or keep CI modifications out of the PR entirely.

esac

TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%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.

[medium] External dependency pinning / supply chain

The create-test-result-attestation step references a step action from an external personal repository (simonbaird/step-actions) on a named branch (runner-image-fix) rather than a pinned commit SHA. The step action runs with access to push credentials mounted at /etc/push-credentials.

Suggested fix: Pin the step action reference to a specific commit SHA. Move the step action to the org-owned repository.

exit 1
fi

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

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] External dependency pinning / supply chain

The dummy-check task is referenced from a personal repository (simonbaird/conforma-cli) on a named branch (reqd-task-its-poc) rather than a pinned SHA. Branch references are mutable.

Suggested fix: Pin to a specific commit SHA.

FAILURE, WARNING, ERROR, or SKIPPED.
default: "SUCCESS"
- name: NOTE
type: string

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] Secrets exposure

Push credentials secret is mounted into all steps via stepTemplate.volumeMounts, but only the create-test-result-attestation step needs push access. The dummy-check step gets unnecessary access to registry push credentials.

Suggested fix: Move the volume mount from stepTemplate to only the create-test-result-attestation step.


# Adjust counts based on RESULT if user left defaults
case "${RESULT}" in
FAILURE)

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 constructed via printf with %s for NOTE field. If NOTE contains double-quotes, backslashes, or newlines, the JSON will be syntactically invalid.

Suggested fix: Use jq or Python json.dumps for proper JSON escaping.

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.

[low] scope-coherence

Disabling CI jobs with if: false is scope creep beyond the POC's stated purpose of testing Tekton pipelines and artifacts in Konflux.

Suggested fix: Remove the if: false additions or use branch-level filtering in workflow triggers.

apiVersion: tekton.dev/v1
kind: Task
metadata:
labels:

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] metadata annotations

Missing tekton.dev/displayName annotation that exists on all other tasks in the repo.

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.

2 participants