Penggunaan Large Language Models (LLM) untuk pembuatan kode sering kali menghasilkan AI slop: boilerplate berlebihan, pemanggilan API yang tidak eksis, dan referensi dependensi fiktif (phantom packages). Tanpa filter otomatis, kode halusinatif ini lolos ke repositori utama dan menimbulkan risiko keamanan rantai pasok (supply chain attack) serta degradasi performa.

Solusi deterministik untuk masalah ini adalah menerapkan CI guardrail untuk kode AI menggunakan Abstract Syntax Tree (AST) linting dan analisis statis langsung pada pipeline integrasi berkelanjutan (CI/CD).

Anatomi Masalah: AI Slop dan Kode Halusinatif

LLM bekerja berdasarkan probabilitas token berikutnya, bukan pemahaman semantik dari sistem dependensi proyek Anda. Kesalahan paling umum mencakup:

  • Phantom Dependencies: Mengimpor library yang terdengar kredibel tetapi tidak pernah didaftarkan pada package.json atau requirements.txt. Penyerang dapat mendaftarkan nama paket fiktif ini di registry publik untuk menyuntikkan malware.
  • Halusinasi Metode SDK: Memanggil fungsi yang tidak ada pada client library resmi, seperti mengasumsikan method client.user.get_or_create() pada SDK yang hanya menyediakan client.users.create().
  • Dead Code dan Over-defensive Logic: Pengecekan null bertingkat pada variabel yang secara deterministik sudah dijamin tidak bernilai null oleh schema runtime.

Implementasi AST Guardrail Menggunakan Semgrep

Pencarian berbasis RegEx sering gagal karena rentan terhadap false positive akibat pemformatan string dan komentar. Analisis berbasis AST memetakan kode menjadi struktur pohon logika, memungkinkan evaluasi semantik yang akurat.

Berikut adalah konfigurasi custom rules Semgrep (.semgrep/ai-guardrails.yml) untuk menangkap halusinasi API boundary dan pemanggilan method ilegal:

rules:
  - id: detect-hallucinated-s3-method
    patterns:
      - pattern: $S3.upload_file_sync(...)
    message: "Deteksi method halusinasi: Boto3 S3 tidak memiliki upload_file_sync. Gunakan upload_file atau upload_fileobj."
    languages: [python]
    severity: ERROR

  - id: prevent-phantom-import-boundary
    patterns:
      - pattern: import $PKG
      - metavariable-regex:
          metavariable: $PKG
          regex: ^(fastapi_utils|crypto_helpers|jwt_verifier)$
    message: "Paket '$PKG' terdeteksi sebagai kandidat phantom dependency. Pastikan dependensi terdaftar di requirements.txt dan lockfile."
    languages: [python]
    severity: WARNING

Validasi Dependensi dan Rasio Dead Code

Untuk mendeteksi phantom packages pada ekosistem Node.js/TypeScript secara otomatis, gunakan depcheck atau integrasikan pemeriksaan lockfile ketat. Tool ini membandingkan AST dari seluruh import statement terhadap deklarasi manifes paket.

Jalankan perintah berikut untuk mengecek inkonsistensi dependensi tanpa mengeksekusi kode:

npx depcheck --ignores="eslint*,@types*" --skip-missing=false

Jika AI menghasilkan pustaka fiktif yang lolos import lokal melalui symlink atau global scope, pengecekan ini akan menghasilkan exit code non-zero dan menghentikan pipeline.

Untuk mengukur dan membatasi akumulasi dead code (slop), integrasikan tool analisis cakupan mati seperti knip (untuk JavaScript/TypeScript) atau vulture (untuk Python):

vulture src/ --min-confidence 80 --exclude "tests/*"

Konfigurasi GitHub Actions Pipeline

Berikut adalah template alur kerja GitHub Actions minimalis yang menyatukan verifikasi AST, audit dependensi, dan boundary checking:

name: AI Code Guardrails

on:
  pull_request:
    branches: [main, master]

jobs:
  guardrail-check:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Source Code
        uses: actions/checkout@v4

      - name: Setup Python Environment
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Run Semgrep AST Rules
        run: |
          pip install semgrep
          semgrep ci --config=.semgrep/ai-guardrails.yml --error

      - name: Detect Unused and Phantom Code (Python)
        run: |
          pip install vulture
          vulture src/ --min-confidence 90

Batasan Teknis dan Praktik Terbaik

AST linting beroperasi pada level sintaksis dan semantik lokal. Tool ini tidak dapat memvalidasi apakah logika bisnis bernilai benar, hanya memastikan bahwa struktur dan pemanggilan simbol valid. Terapkan prinsip berikut saat merancang guardrail:

  • Gunakan Type Check Ketat: Konfigurasi tsc --noEmit (TypeScript) atau mypy --strict (Python) adalah lapis pertahanan utama sebelum Semgrep berjalan.
  • Tolak PR Tanpa Lockfile Update: Jika kode menambahkan deklarasi import baru tanpa perubahan yang sesuai pada package-lock.json, poetry.lock, atau pnpm-lock.yaml, CI wajib memblokir merge.
  • Audit Semgrep False Positives: Batasi rule AST hanya pada SDK inti (database client, cloud provider, sistem auth) untuk menjaga waktu eksekusi CI tetap di bawah 2 menit.