just-shield 0.2.1

Pre-execution supply-chain scanner for GitHub Actions workflows
Documentation
# just-shield 자체 CI — 채점표 게이트 (ADR-0002 원칙 ④).
# cargo test가 미탐 코퍼스(attacks)·오탐 코퍼스(benign)를 포함하므로
# 이 워크플로의 초록불이 곧 릴리스 자격이다.
# 마지막 스텝은 just-shield가 자기 저장소를 자기 규칙으로 검사한다 (dogfood).
name: CI
on:
  push:
    branches: [main]
  pull_request:
permissions:
  contents: read
jobs:
  gate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
      - run: cargo fmt --check
      - run: cargo clippy --all-targets -- -D warnings
      - name: 채점표 게이트 (유닛 + 통합 + 코퍼스)
        run: cargo test
      - name: 자기 검사 (dogfood)
        run: cargo run --quiet -- scan . --strict
  # 액션 래퍼 셀프 테스트 — 3개 OS에서 릴리스 바이너리를 내려받아
  # 체크섬 검증을 통과한 뒤 이 저장소를 검사한다 (이슈 #30 수용 기준).
  action-selftest:
    strategy:
      matrix:
        runner: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.runner }}
    steps:
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
      - uses: ./
        with:
          strict: true
  # v2 유출 정책층 e2e (채점표 ②, 이슈 #46) — 관찰자→기록→판정 사슬을
  # 진짜 ubuntu 러너에서 연결한다. 공격 경로(미등재 조회 🔴)·양성 경로(등재만 통과)·
  # fail-open(관찰자 종료 후에도 DNS 동작)을 매 PR 증명한다.
  egress-e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
      - run: sudo apt-get update && sudo apt-get install -y dnsutils
      - run: cargo build --release
      - run: bash tests/e2e/egress-e2e.sh target/release/just-shield
  # 래퍼 observe 모드 셀프 테스트 (이슈 #47) — 한 블록 UX가 잡 시작 관찰 +
  # 잡 종료 보고(post 훅)까지 동작하는지 확인한다. 이 잡은 잠그지 않았으므로
  # 관찰 보고만 하고 실패하지 않아야 한다 (잠금 선택제).
  observe-selftest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
      - uses: ./
        with:
          mode: observe
      - run: curl -sS https://crates.io > /dev/null || true # 관찰될 통신 한 건
      # 관찰자가 실제로 사용자 스텝의 DNS를 기록했는지 단언한다 — "기록 없음→통과"라는
      # 맹점을 막는다(이전엔 관찰자가 죽어도 셀프 테스트가 초록불이었다).
      - name: 관찰이 실제로 동작했는지 단언
        run: |

          rec="${RUNNER_TEMP}/just-shield-record.txt"
          test -s "$rec" || { echo "기록이 비었습니다 — 관찰자가 사용자 스텝을 못 봤습니다" >&2; exit 1; }
          grep -q "crates.io" "$rec" || { echo "기록에 crates.io가 없습니다:" >&2; cat "$rec" >&2; exit 1; }
          echo "✅ 관찰자가 사용자 스텝의 DNS(crates.io)를 기록했다"