Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 50 additions & 28 deletions .github/workflows/gauntlet.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
name: GNU CRY GAUNTLET
permissions:
contents: read

on:
push:
Expand All @@ -7,36 +9,56 @@ on:
branches: [ main ]

jobs:
gauntlet:
gating:
runs-on: ubuntu-latest
name: C23 Compiler GAUNTLET
name: C23 Gating Compilers
strategy:
matrix:
compiler: [gcc-12, gcc-13, clang-18, clang-19, clang-20]
compiler: [gcc-14, clang-20]
fail-fast: false

steps:
Comment thread
flyingrobots marked this conversation as resolved.
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build ${{ matrix.compiler }} Docker image
run: |
echo "🔥 Building ${{ matrix.compiler }} Docker image..."
docker build --target ${{ matrix.compiler }} -t gauntlet-${{ matrix.compiler }}:latest -f tools/gauntlet/Dockerfile.gauntlet .

- name: Run ${{ matrix.compiler }} GAUNTLET
run: |
echo "🔫 Running ${{ matrix.compiler }} GAUNTLET..."
docker run --rm -v "$PWD":/workspace -w /workspace gauntlet-${{ matrix.compiler }}:latest

- name: Upload build logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: gauntlet-logs-${{ matrix.compiler }}
path: |
build/
retention-days: 7
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Build ${{ matrix.compiler }} Docker image
run: |
echo "🔥 Building ${{ matrix.compiler }} Docker image (gating)..."
docker build --target ${{ matrix.compiler }} -t gauntlet-${{ matrix.compiler }}:latest -f tools/gauntlet/Dockerfile.gauntlet .
- name: Run ${{ matrix.compiler }} GAUNTLET
run: |
echo "🔫 Running ${{ matrix.compiler }} GAUNTLET (gating)..."
docker run --rm -v "$PWD":/workspace -w /workspace gauntlet-${{ matrix.compiler }}:latest
- name: Upload build logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: gauntlet-logs-${{ matrix.compiler }}
path: build/
retention-days: 7
Comment on lines +30 to +36

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.

🧹 Nitpick (assertive)

Always persist Meson logs for triage.

Keep the failure-only artifact, but also upload meson-logs even on success.

       - name: Upload build logs on failure
         if: failure()
         uses: actions/upload-artifact@v4
         with:
           name: gauntlet-logs-${{ matrix.compiler }}
           path: build/
           retention-days: 7
+      - name: Upload Meson logs (always)
+        if: always()
+        uses: actions/upload-artifact@v4
+        with:
+          name: meson-logs-${{ matrix.compiler }}
+          path: build/meson-logs/
+          retention-days: 7

Repeat for canary block.

Also applies to: 58-64


canary:
runs-on: ubuntu-latest
name: Compat Canaries (non-blocking)
continue-on-error: true
needs: [gating]
strategy:
matrix:
compiler: [gcc-12, gcc-13, clang-18, clang-19]
fail-fast: false
steps:
Comment on lines +38 to +47

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.

🛠️ Refactor suggestion

Let canaries run even if gating fails.

To keep portability signals, run canaries regardless of gating result.

   canary:
     runs-on: ubuntu-latest
     name: Compat Canaries (non-blocking)
     continue-on-error: true
-    needs: [gating]
+    needs: [gating]
+    if: always()
📝 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
canary:
runs-on: ubuntu-latest
name: Compat Canaries (non-blocking)
continue-on-error: true
needs: [gating]
strategy:
matrix:
compiler: [gcc-12, gcc-13, clang-18, clang-19]
fail-fast: false
steps:
canary:
runs-on: ubuntu-latest
name: Compat Canaries (non-blocking)
continue-on-error: true
needs: [gating]
if: always()
strategy:
matrix:
compiler: [gcc-12, gcc-13, clang-18, clang-19]
fail-fast: false
steps:
🤖 Prompt for AI Agents
.github/workflows/gauntlet.yml around lines 38 to 47: the canary job is blocked
by the gating job because it uses needs: [gating], so it won't run if gating
fails; to ensure canaries always run for portability signals, keep the needs for
ordering but add a job-level condition of if: always() to force execution
regardless of gating result (alternatively remove the needs dependency if
ordering isn’t required).

- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Build ${{ matrix.compiler }} Docker image
run: |
echo "🐤 Building ${{ matrix.compiler }} Docker image (canary)..."
docker build --target ${{ matrix.compiler }} -t gauntlet-${{ matrix.compiler }}:latest -f tools/gauntlet/Dockerfile.gauntlet .
- name: Run ${{ matrix.compiler }} GAUNTLET
run: |
echo "🐤 Running ${{ matrix.compiler }} GAUNTLET (canary)..."
docker run --rm -v "$PWD":/workspace -w /workspace gauntlet-${{ matrix.compiler }}:latest
- name: Upload build logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: gauntlet-logs-${{ matrix.compiler }}
path: build/
retention-days: 7
62 changes: 62 additions & 0 deletions docs/CI_STRATEGY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# CI/CD Strategy

## Overview
This repository enforces high correctness and portability while centering on modern C23. CI is split into:
- Gating jobs that must pass for merges
- Canary jobs that provide early portability signals but do not block
- Static analysis (clang-tidy) with a strict baseline
- Deterministic Docker builds to ensure local=CI parity

## Compiler Matrix

### Gating (C23 focus)

- `gcc-14` — first broadly usable GCC with C23 support
- `clang-20` — latest LLVM with strong C23 + clang-tidy 20

Rationale: These represent the C23 target surface we care about. They block the PR when they fail.

### Canaries (non‑blocking)

- `gcc-12`, `gcc-13` — older GCCs common on LTS distros
- `clang-18`, `clang-19` — earlier LLVMs

Rationale: Useful signals for downstream consumers. They run with `continue-on-error: true` so they never block merges.

```mermaid
flowchart LR
A[Gating: gcc-14] --> M[Merge]
B[Gating: clang-20] --> M
C[Canary: gcc-13] -->|non-blocking| M
D[Canary: clang-19] -->|non-blocking| M
E[Canary: gcc-12] -->|non-blocking| M
F[Canary: clang-18] -->|non-blocking| M
```

## Static Analysis

- `clang-tidy` 20 with `quality/.clang-tidy`; warnings-as-errors.
- Baseline file `tools/baseline_count.txt` enforces no regressions.
- CI builds a deterministic LLVM 20 environment in Docker.
- CRoaring is installed from apt when available, or built from source in CI to stabilize aarch64 and older runners.

## Builds & Tests

- Meson + Ninja builds and runs unit tests.
- Cache artifacts are not pushed; they are derived and may be uploaded only for debugging.

## Docker Hygiene

- Images are namespaced and labeled for safe cleanup: `gitmind/ci:clang-20`, `gitmind/gauntlet:<compiler>`; label `com.gitmind.project=git-mind`.
- Local helper: `make docker-clean` removes only project images/containers and builder cache.

## Time & Cost

- Gating jobs run in parallel and should complete under a few minutes.
- Canaries may be slower; they are non‑blocking and primarily diagnostic.

## Future Enhancements

- Add cohesion-report to CI to summarize semantic (advice) changes across merges.
- Nightly long‑matrix (more compilers/OSes) as a separate scheduled workflow.
- Cache Docker layers to reduce cold start times.
127 changes: 78 additions & 49 deletions tools/gauntlet/Dockerfile.gauntlet
Original file line number Diff line number Diff line change
@@ -1,122 +1,151 @@
# Base image with common dependencies
FROM ubuntu:22.04 as base
FROM ubuntu:22.04 AS base
Comment thread
coderabbitai[bot] marked this conversation as resolved.
LABEL com.gitmind.project="git-mind" \
org.opencontainers.image.title="git-mind-gauntlet"

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC

# Install base dependencies
RUN apt-get update && apt-get install -y \
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
ninja-build \
python3 \
python3-pip \
pkg-config \
libsodium-dev \
libgit2-dev \
libroaring-dev \
git \
curl \
meson
meson && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD sh -lc "$CC --version >/dev/null 2>&1 || exit 1"

# Provide test runner in base so all targets inherit it
RUN echo '#!/bin/bash' > /test-compiler.sh && \
echo 'set -e' >> /test-compiler.sh && \
echo 'echo "🔫 Testing $CC..."' >> /test-compiler.sh && \
echo 'echo "Compiler: $CC"' >> /test-compiler.sh && \
echo 'echo "C++ Compiler: $CXX"' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Clean previous build' >> /test-compiler.sh && \
echo 'rm -rf build' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Setup build with current compiler' >> /test-compiler.sh && \
echo 'if meson setup build --warnlevel=3; then' >> /test-compiler.sh && \
echo ' echo "✅ Meson setup successful"' >> /test-compiler.sh && \
echo ' if ninja -C build; then' >> /test-compiler.sh && \
echo ' echo "✅ Build successful"' >> /test-compiler.sh && \
echo ' if ninja -C build test; then' >> /test-compiler.sh && \
echo ' echo "✅ Tests passed"' >> /test-compiler.sh && \
echo ' echo "PASS"' >> /test-compiler.sh && \
echo ' else echo "❌ Tests failed"; echo "FAIL_TEST"; fi' >> /test-compiler.sh && \
echo ' else echo "❌ Build failed"; echo "FAIL_BUILD"; fi' >> /test-compiler.sh && \
echo 'else echo "❌ Meson setup failed"; echo "FAIL_SETUP"; fi' >> /test-compiler.sh && \
chmod +x /test-compiler.sh
WORKDIR /workspace
CMD ["/test-compiler.sh"]
Comment on lines +46 to +47

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.

🧹 Nitpick (assertive)

Run as non‑root (appeases policy checks, safer defaults).

Create a non‑root user once tools are installed; inherited by derived stages.

 WORKDIR /workspace
-CMD ["/test-compiler.sh"]
+RUN useradd -m -u 1000 builder && chown -R builder:builder /workspace
+USER builder
+CMD ["/test-compiler.sh"]

Repeat the same USER builder pattern in base-noble:

 WORKDIR /workspace
-CMD ["/test-compiler.sh"]
+RUN useradd -m -u 1000 builder && chown -R builder:builder /workspace
+USER builder
+CMD ["/test-compiler.sh"]

Also applies to: 144-145

🤖 Prompt for AI Agents
In tools/gauntlet/Dockerfile.gauntlet around lines 46-47 (and similarly at
144-145), the image ends up running as root; create a non-root user after all
tools are installed, chown the /workspace (and any tool directories) to that
user, and set USER to that unprivileged account before WORKDIR and CMD so
derived stages inherit it; apply the same USER creation/chown pattern inside the
base-noble stage as well.


# GCC 12 (THE DEVIL) - Pre-C23 image
FROM base as gcc-12
RUN apt-get update && apt-get install -y \
FROM base AS gcc-12
RUN apt-get update && apt-get install -y --no-install-recommends \
software-properties-common \
wget \
gnupg && \
add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
apt-get update && \
apt-get install -y gcc-12 g++-12
apt-get install -y --no-install-recommends gcc-12 g++-12 && \
rm -rf /var/lib/apt/lists/*
ENV CC=gcc-12
ENV CXX=g++-12

# GCC 13 - C23 support image
FROM base as gcc-13
RUN apt-get update && apt-get install -y \
FROM base AS gcc-13
RUN apt-get update && apt-get install -y --no-install-recommends \
software-properties-common \
wget \
gnupg && \
add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
apt-get update && \
apt-get install -y gcc-13 g++-13
apt-get install -y --no-install-recommends gcc-13 g++-13 && \
rm -rf /var/lib/apt/lists/*
ENV CC=gcc-13
ENV CXX=g++-13

# Clang 18 - C23 support image
FROM base as clang-18
RUN apt-get update && apt-get install -y \
FROM base AS clang-18
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
gnupg \
lsb-release \
software-properties-common && \
wget -O - https://apt.llvm.org/llvm.sh | bash -s -- 18 all && \
apt-get install -y clang-18 clang++-18 clang-tidy-18
apt-get install -y --no-install-recommends clang-18 clang++-18 clang-tidy-18 && \
rm -rf /var/lib/apt/lists/*
Comment on lines +76 to +84

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.

🛠️ Refactor suggestion

Harden LLVM installer usage; avoid piping remote scripts to shell.

Download llvm.sh with checksum verification, then execute; repeat for 18/19/20.

Example for clang-20:

 RUN apt-get update && apt-get install -y --no-install-recommends \
@@
-    software-properties-common && \
-    wget -O - https://apt.llvm.org/llvm.sh | bash -s -- 20 all && \
+    software-properties-common ca-certificates && \
+    curl -fsSL -o /tmp/llvm.sh https://apt.llvm.org/llvm.sh && \
+    echo "${LLVM_SH_SHA256}  /tmp/llvm.sh" | sha256sum -c - && \
+    bash /tmp/llvm.sh 20 all && rm -f /tmp/llvm.sh && \
     apt-get install -y --no-install-recommends clang-20 clang++-20 clang-tidy-20 && \
     rm -rf /var/lib/apt/lists/*

At stage top add:

+ARG LLVM_SH_SHA256=<pin-the-current-sha256>

Also applies to: 89-97, 102-110

🤖 Prompt for AI Agents
In tools/gauntlet/Dockerfile.gauntlet around lines 76 to 84 (and similarly at
89-97 and 102-110), the Dockerfile currently pipes the remote llvm.sh installer
directly to bash; replace that with a secure download-and-verify flow: curl or
wget the llvm.sh to a local file, fetch or embed the expected checksum, verify
the checksum (sha256sum) before execution, then run the verified script; repeat
this hardened pattern for clang versions 18, 19 and 20; also add the stage-top
artifacts the reviewer suggested (local script path and checksum variables) so
each stage uses the downloaded-and-verified script rather than piping from the
network.

ENV CC=clang-18
ENV CXX=clang++-18

# Clang 19 - C23 support image
FROM base as clang-19
RUN apt-get update && apt-get install -y \
FROM base AS clang-19
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
gnupg \
lsb-release \
software-properties-common && \
wget -O - https://apt.llvm.org/llvm.sh | bash -s -- 19 all && \
apt-get install -y clang-19 clang++-19 clang-tidy-19
apt-get install -y --no-install-recommends clang-19 clang++-19 clang-tidy-19 && \
rm -rf /var/lib/apt/lists/*
ENV CC=clang-19
ENV CXX=clang++-19

# Clang 20 - Latest C23 support image
FROM base as clang-20
RUN apt-get update && apt-get install -y \
FROM base AS clang-20
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
gnupg \
lsb-release \
software-properties-common && \
wget -O - https://apt.llvm.org/llvm.sh | bash -s -- 20 all && \
apt-get install -y clang-20 clang++-20 clang-tidy-20
apt-get install -y --no-install-recommends clang-20 clang++-20 clang-tidy-20 && \
rm -rf /var/lib/apt/lists/*
ENV CC=clang-20
ENV CXX=clang++-20

# Default to clang-20 for standalone usage
FROM clang-20

# Simple test script that works with any compiler
# Ubuntu 24.04 base (for gcc-14)
FROM ubuntu:24.04 AS base-noble
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
ninja-build \
python3 \
python3-pip \
pkg-config \
libsodium-dev \
libgit2-dev \
libroaring-dev \
git \
curl \
meson && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD sh -lc "$CC --version >/dev/null 2>&1 || exit 1"
# Provide test runner in base-noble too
RUN echo '#!/bin/bash' > /test-compiler.sh && \
echo 'set -e' >> /test-compiler.sh && \
echo 'echo "🔫 Testing $CC..."' >> /test-compiler.sh && \
echo 'echo "Compiler: $CC"' >> /test-compiler.sh && \
echo 'echo "C++ Compiler: $CXX"' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Clean previous build' >> /test-compiler.sh && \
echo 'rm -rf build' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Setup build with current compiler' >> /test-compiler.sh && \
echo 'if meson setup build --warnlevel=3; then' >> /test-compiler.sh && \
echo ' echo "✅ Meson setup successful"' >> /test-compiler.sh && \
echo ' ' >> /test-compiler.sh && \
echo ' # Build' >> /test-compiler.sh && \
echo ' if ninja -C build; then' >> /test-compiler.sh && \
echo ' echo "✅ Build successful"' >> /test-compiler.sh && \
echo ' ' >> /test-compiler.sh && \
echo ' # Run tests' >> /test-compiler.sh && \
echo ' if ninja -C build test; then' >> /test-compiler.sh && \
echo ' echo "✅ Tests passed"' >> /test-compiler.sh && \
echo ' echo "PASS"' >> /test-compiler.sh && \
echo ' else' >> /test-compiler.sh && \
echo ' echo "❌ Tests failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_TEST"' >> /test-compiler.sh && \
echo ' fi' >> /test-compiler.sh && \
echo ' else' >> /test-compiler.sh && \
echo ' echo "❌ Build failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_BUILD"' >> /test-compiler.sh && \
echo ' fi' >> /test-compiler.sh && \
echo 'else' >> /test-compiler.sh && \
echo ' echo "❌ Meson setup failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_SETUP"' >> /test-compiler.sh && \
echo 'fi' >> /test-compiler.sh && \
echo ' if ninja -C build; then' >> /test-compiler.sh && \
echo ' if ninja -C build test; then echo "PASS"; else echo "FAIL_TEST"; fi' >> /test-compiler.sh && \
echo ' else echo "FAIL_BUILD"; fi' >> /test-compiler.sh && \
echo 'else echo "FAIL_SETUP"; fi' >> /test-compiler.sh && \
chmod +x /test-compiler.sh
Comment on lines +131 to 143

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.

🧹 Nitpick (assertive)

De‑duplicate the runner; copy from base (also fixes exit code once base is patched).

Avoid drift by reusing the same /test-compiler.sh from the base stage.

-# Provide test runner in base-noble too
-RUN echo '#!/bin/bash' > /test-compiler.sh && \
-    echo 'set -e' >> /test-compiler.sh && \
-    echo 'echo "🔫 Testing $CC..."' >> /test-compiler.sh && \
-    echo 'echo "Compiler: $CC"' >> /test-compiler.sh && \
-    echo 'echo "C++ Compiler: $CXX"' >> /test-compiler.sh && \
-    echo 'rm -rf build' >> /test-compiler.sh && \
-    echo 'if meson setup build --warnlevel=3; then' >> /test-compiler.sh && \
-    echo '  if ninja -C build; then' >> /test-compiler.sh && \
-    echo '    if ninja -C build test; then echo "PASS"; else echo "FAIL_TEST"; fi' >> /test-compiler.sh && \
-    echo '  else echo "FAIL_BUILD"; fi' >> /test-compiler.sh && \
-    echo 'else echo "FAIL_SETUP"; fi' >> /test-compiler.sh && \
-    chmod +x /test-compiler.sh
+COPY --from=base /test-compiler.sh /test-compiler.sh
+RUN chmod +x /test-compiler.sh
📝 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
# Provide test runner in base-noble too
RUN echo '#!/bin/bash' > /test-compiler.sh && \
echo 'set -e' >> /test-compiler.sh && \
echo 'echo "🔫 Testing $CC..."' >> /test-compiler.sh && \
echo 'echo "Compiler: $CC"' >> /test-compiler.sh && \
echo 'echo "C++ Compiler: $CXX"' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Clean previous build' >> /test-compiler.sh && \
echo 'rm -rf build' >> /test-compiler.sh && \
echo '' >> /test-compiler.sh && \
echo '# Setup build with current compiler' >> /test-compiler.sh && \
echo 'if meson setup build --warnlevel=3; then' >> /test-compiler.sh && \
echo ' echo "✅ Meson setup successful"' >> /test-compiler.sh && \
echo ' ' >> /test-compiler.sh && \
echo ' # Build' >> /test-compiler.sh && \
echo ' if ninja -C build; then' >> /test-compiler.sh && \
echo ' echo "✅ Build successful"' >> /test-compiler.sh && \
echo ' ' >> /test-compiler.sh && \
echo ' # Run tests' >> /test-compiler.sh && \
echo ' if ninja -C build test; then' >> /test-compiler.sh && \
echo ' echo "✅ Tests passed"' >> /test-compiler.sh && \
echo ' echo "PASS"' >> /test-compiler.sh && \
echo ' else' >> /test-compiler.sh && \
echo ' echo "❌ Tests failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_TEST"' >> /test-compiler.sh && \
echo ' fi' >> /test-compiler.sh && \
echo ' else' >> /test-compiler.sh && \
echo ' echo "❌ Build failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_BUILD"' >> /test-compiler.sh && \
echo ' fi' >> /test-compiler.sh && \
echo 'else' >> /test-compiler.sh && \
echo ' echo "❌ Meson setup failed"' >> /test-compiler.sh && \
echo ' echo "FAIL_SETUP"' >> /test-compiler.sh && \
echo 'fi' >> /test-compiler.sh && \
echo ' if ninja -C build; then' >> /test-compiler.sh && \
echo ' if ninja -C build test; then echo "PASS"; else echo "FAIL_TEST"; fi' >> /test-compiler.sh && \
echo ' else echo "FAIL_BUILD"; fi' >> /test-compiler.sh && \
echo 'else echo "FAIL_SETUP"; fi' >> /test-compiler.sh && \
chmod +x /test-compiler.sh
COPY --from=base /test-compiler.sh /test-compiler.sh
RUN chmod +x /test-compiler.sh
🤖 Prompt for AI Agents
In tools/gauntlet/Dockerfile.gauntlet around lines 131-143, the Dockerfile
rebuilds /test-compiler.sh via many echo lines causing drift and wrong exit
semantics; instead copy the canonical runner from the base stage and preserve
permissions. Replace the echo block with a single COPY --from=<base-stage-name>
/test-compiler.sh /test-compiler.sh and then run chmod +x /test-compiler.sh (or
ensure the copied file already has executable bit) so the image reuses the exact
runner from the base stage and inherits any future fixes (including correct exit
codes).


WORKDIR /workspace
CMD ["/test-compiler.sh"]

# GCC 14 target (gating)
FROM base-noble AS gcc-14
RUN apt-get update && apt-get install -y --no-install-recommends gcc-14 g++-14 && rm -rf /var/lib/apt/lists/*
ENV CC=gcc-14
ENV CXX=g++-14
Loading