@@ -355,6 +355,96 @@ jobs:
355355 name : forge-out-v4-hooks-${{ matrix.leg }}
356356 path : ci-out/v4-hooks-${{ matrix.leg }}.out
357357
358+ taiko-cases :
359+ # Taiko Type-1 Ethereum-equivalence twins. Same paired-leg pattern
360+ # as evm-cases / v4-hooks-cases above (clean: rc==0 AND zero markers;
361+ # planted: rc!=0 AND markers>=1). The taiko planted suite has 1 test
362+ # that passes (warm-SLOAD — only the cold-SLOAD constant was mutated,
363+ # demonstrating single-localized-hunk discipline) alongside 5 that
364+ # fail with the INVARIANT VIOLATED marker, so the suite-level rule
365+ # still holds. Lives outside the cases/ matrix because taiko/ is a
366+ # subdir-scoped lane (Taiko Labs grant track), not a numbered Atlas
367+ # case.
368+ #
369+ # Foundry pinned to v1.7.1 here — same pin as v4-hooks-cases. The
370+ # §4b code-quality review (2026-06-28) was captured on this toolchain
371+ # (6/6 clean, 1/5 planted with markers); the pin keeps the live badge
372+ # a faithful re-verification of the §4b receipt rather than a
373+ # moving-target stable-channel claim. Shared setup-foundry composite
374+ # for cases 06+ stays on `stable`.
375+ name : Atlas taiko — ${{ matrix.leg }}
376+ runs-on : ubuntu-latest
377+ timeout-minutes : 25
378+ strategy :
379+ fail-fast : false
380+ matrix :
381+ leg :
382+ - clean
383+ - planted
384+ steps :
385+ - uses : actions/checkout@v4
386+ - name : Install Foundry (v1.7.1, scorecard pin)
387+ uses : foundry-rs/foundry-toolchain@v1
388+ with :
389+ version : v1.7.1
390+
391+ - name : Verify forge on PATH
392+ run : |
393+ forge --version
394+ cast --version
395+
396+ - name : Install forge-std (${{ env.FORGE_STD_VERSION }})
397+ working-directory : taiko/${{ matrix.leg }}
398+ run : |
399+ # Same `--no-git` install convention as the cases/ EVM jobs;
400+ # the leg dir is not its own git root.
401+ forge install foundry-rs/forge-std@${{ env.FORGE_STD_VERSION }} --no-git
402+
403+ - name : forge build (taiko / ${{ matrix.leg }})
404+ working-directory : taiko/${{ matrix.leg }}
405+ run : |
406+ forge build
407+ ls -l out/
408+
409+ - name : forge test (taiko / ${{ matrix.leg }})
410+ working-directory : taiko/${{ matrix.leg }}
411+ run : |
412+ set +e
413+ mkdir -p "$GITHUB_WORKSPACE/ci-out"
414+ OUT="$GITHUB_WORKSPACE/ci-out/taiko-${{ matrix.leg }}.out"
415+ forge test -vv 2>&1 | tee "$OUT"
416+ rc=${PIPESTATUS[0]}
417+ set -e
418+ MARKER_COUNT=$(grep -c -E 'INVARIANT VIOLATED' "$OUT" || true)
419+ if [ "${{ matrix.leg }}" = "planted" ]; then
420+ # Planted: rc != 0 AND marker present. §4b receipt says 5/6
421+ # tests fail and each failure carries the marker; the warm-
422+ # SLOAD test passes alongside them (single-hunk discipline —
423+ # only cold SLOAD was mutated) but the suite-level rc is
424+ # still non-zero, which is what we check here.
425+ if [ "$MARKER_COUNT" -ge 1 ] && [ "$rc" -ne 0 ]; then
426+ echo "::notice::taiko planted leg fired as expected (rc=${rc}, markers=${MARKER_COUNT})."
427+ exit 0
428+ fi
429+ echo "::error::taiko planted leg regressed (rc=${rc}, markers=${MARKER_COUNT}); expected rc!=0 AND markers>=1."
430+ exit 1
431+ else
432+ # Clean: rc == 0 AND zero markers.
433+ if [ "$MARKER_COUNT" -eq 0 ] && [ "$rc" -eq 0 ]; then
434+ echo "::notice::taiko clean leg holds (rc=0, 0 markers)."
435+ exit 0
436+ fi
437+ echo "::error::taiko clean leg failed (rc=${rc}, markers=${MARKER_COUNT}); expected rc==0 AND markers==0."
438+ exit 1
439+ fi
440+
441+ - name : Upload forge raw output
442+ if : always()
443+ uses : actions/upload-artifact@v4
444+ with :
445+ name : forge-out-taiko-${{ matrix.leg }}
446+ path : ci-out/taiko-${{ matrix.leg }}.out
447+
358448 solana-cases :
359449 name : Atlas case (Solana) — ${{ matrix.case }} / ${{ matrix.leg }}
360450 runs-on : ubuntu-latest
0 commit comments