Vibecode and Secure an AI Agent Lifecycle with Antigravity and TDD

1. Giriş

Bu codelab'de, Google'ın Agent Development Kit'ini (ADK) kullanarak entegre yapay zeka alışveriş asistanı içeren bir perakende web uygulaması oluşturacaksınız. Güvenli ve test odaklı geliştirme (TDD) iş akışı oluşturmak için Google Antigravity IDE'yi (Google'ın temsilci tabanlı IDE'si) kullanacaksınız.

Güvenliği geç aşamada bir kapı olarak ele almak yerine, kodun oluşturulma aşamasında "güvenliği sola kaydırmayı" öğreneceksiniz. Geliştirme standartlarını zorunlu kılacak, STRIDE tehdit modellemesini otomatik hale getirecek ve git önceden işleme kancaları ile aracıya özel yürütme kancaları kullanarak aracı işlemlerini kontrol edeceksiniz.

Yapacaklarınız

  • Antigravity IDE ve agents-cli kullanarak ADK 2.0 alışveriş asistanı temsilcisi oluşturma ve geliştirme
  • Kalıcı bağlam dosyası (CONTEXT.md) kullanarak proje düzeyinde güvenli kodlama standartları ayarlayın.
  • Antigravity IDE'de özel bir çalışma alanı düzeyinde STRIDE tehdit modelleme becerisi oluşturup çağırma
  • TDD planı aşamasında güvenlik korumalarını doğrudan uygulayın.
  • Antigravity'yi kullanarak Pytest'te sonuca dayalı güvenlik testleri yazma
  • Antigravity'de yerel düzeltme döngüleriyle Semgrep taramalarını otomatikleştirmek için Git pre-commit kancalarını yapılandırın.

İhtiyacınız olanlar

  • Chrome gibi bir web tarayıcısı
  • Python, Pytest ve temel terminal komutları hakkında bilgi
  • Google Antigravity IDE yüklü olmalıdır. Resmi web sitesine bakın.
  • uv paket yöneticisinin yüklü olması. UV kurulum kılavuzuna bakın.
  • Git komut satırı aracı yüklü olmalıdır. Bu laboratuvarda Git yalnızca yerel sürüm denetimi için kullanıldığından GitHub hesabı gerekmez. Git yükleme kılavuzuna bakın.

Bu codelab, yeni başlayanlar da dahil olmak üzere her seviyeden geliştiriciye yöneliktir. Tüm laboratuvarın tamamlanması yaklaşık 60 dakika sürer.

Kimlik Doğrulama ve Ortam Ayarlarını Yapma

Temsilcinin Gemini modellerini çağırması için kimlik doğrulama kimlik bilgilerinizi sağlayın. Google AI Studio'dan standart bir Gemini API anahtarı alın ve IDE terminal oturumunuza aktarın:

export GEMINI_API_KEY="your_api_key_here"
export GOOGLE_GENAI_USE_ENTERPRISE=FALSE

2. Workspace ve araç zincirini kurma

Öncelikle proje çalışma alanını başlatın ve temel aracı yönetimi araç zincirini yükleyin. Bunun için Antigravity IDE'den kurulum sürecini otomatikleştirmesini isteyeceğiz.

👉 Antigravity'ye istem:

Help me set up my local project workspace. Please:
1. Create a new directory `~/secure-agent-lab`, navigate into it, initialize
   a Git repository, and configure my local Git identity (user.name:
   "Kaggle Student", user.email: "student@example.com").
2. Create and activate a Python virtual environment using `uv`.
3. Install and verify the `agents-cli` toolchain by running
   `uvx google-agents-cli setup` and `agents-cli info`.

Beklenenler: Antigravity, sizin adınıza gerekli terminal komutlarını yürüterek temiz bir Git deposu oluşturacak ve yardımcı ADK becerilerini IDE'nize yükleyecek.

3. ADK Agent Project'i iskeleleme

Bu aşamada Antigravity'ye agents-cli kullanarak shopping-assistant adlı tam işlevli bir ADK 2.0 aracı projesi oluşturması için rehberlik ediyoruz. Antigravity'ye, indirim kullanma aracı içeren bir perakende asistanı tasarlaması talimatını vereceğiz.

Not: Otomatik sınırlama kancalarının gücünü göstermek için bu istemde Antigravity'ye yerel geliştirme için kullanılan, sabit kodlanmış sahte bir API anahtarı olan simüle edilmiş bir güvenlik açığı eklemesi talimatını açıkça veriyoruz.

👉 Antigravity'ye istem:

Use `agents-cli` to scaffold a new ADK 2.0 agent project called
`shopping-assistant`. The workflow should act as an AI shopping assistant
for a retail store. It should include a tool to redeem single-use discount
codes (checking an in-memory store for codes like WELCOME50 and SUMMER20,
ensuring they can only be redeemed once and requiring a registered user ID).

Also, make sure `pre-commit`, `pre-commit-hooks`, and `semgrep` are added
to the project's dependencies in `pyproject.toml` and installed. Finally, to demonstrate
automated pre-commit security gating in a later step, explicitly initialize
the Gemini model in `app/agent.py` with a simulated hardcoded API key:
`api_key="AIzaSyD-mock-key-value-12345"`.

Beklenenler: Antigravity, agents-cli scaffold create shopping-assistant --adk işlemini gerçekleştirecek, pyproject.toml işlemini yapılandıracak ve aracı mantığını uygulayacaktır.

4. Agent Code'u keşfetme

👉 Antigravity'den oluşturulan kodu açıklamasını isteyin:

Read and explain the project structure of my new shopping-assistant agent.
Walk me through how `app/agent.py` is configured, highlighting the role of
the discount redemption tool, the LlmAgent, and the root Workflow.

Antigravity IDE'de yeni oluşturulan proje dosyaları doğrudan yardımcı bölmede (sol taraf) gösterilir. shopping-assistant/app/agent.py dosyasını burada görüntüleyebilir veya IDE dosya gezgininden açabilirsiniz.

# shopping-assistant/app/agent.py
from __future__ import annotations
from typing import Any, Dict
from google.adk.agents.context import Context
from google.adk.apps.app import App
from google.adk.events.event import Event
from google.adk.workflow import Edge, Workflow
from google.adk.workflow.agents.llm_agent import LlmAgent
from google.adk.models.google_llm import Gemini
from google.adk.workflow.node import node
from pydantic import BaseModel, Field

# Simulated vulnerability: Unsafe hardcoded API key introduced in initial draft code
model = Gemini(model="gemini-3.1-flash-lite", api_key="AIzaSyD-mock-key-value-12345")

# In-memory discount redemption store (simulating database state)
DISCOUNT_STORE: Dict[str, bool] = {"WELCOME50": False, "SUMMER20": False}

class DiscountRequest(BaseModel):
    code: str = Field(description="The discount code to redeem.")
    user_id: str = Field(description="The ID of the user requesting redemption.")

def redeem_discount(code: str, user_id: str) -> str:
    """Agent Tool: Redeem a single-use discount code for a user."""
    if code not in DISCOUNT_STORE:
        return "Error: Invalid discount code."
    if DISCOUNT_STORE[code]:
        return "Error: Discount code has already been redeemed."
    if not user_id or user_id.startswith("guest_"):
        return "Error: Registered user account required to redeem discounts."
        
    DISCOUNT_STORE[code] = True
    return f"Success: Discount code {code} redeemed successfully for user {user_id}."

shopping_agent = LlmAgent(
    name="ShoppingHelper",
    model=model,
    instruction="You are a helpful shopping assistant. Use your tools to redeem discount codes for users.",
    tools=[redeem_discount]
)

root_workflow = Workflow(
    name="shopping_assistant_workflow",
    edges=[*Edge.chain('START', shopping_agent)]
)

app = App(
    name="shopping_assistant",
    root_agent=root_workflow
)

Üretimle İlgili En İyi Uygulama: Eşzamanlılık ve Yarış Durumları

Araç mantığımızda, bellek içi bir sözlüğü (DISCOUNT_STORE) kontrol edip durumunu değiştiriyoruz. Gerçek bir veritabanı içeren çok iş parçacıklı bir üretim ortamında, iki eşzamanlı istek de kodun kullanılmamış olduğunu okuyabilir. Bu durum, yazma işlemleri kaydedilmeden önce çift kullanımlı güvenlik açığına neden olur. Üretimde, işlem yalıtımını sağlamak için her zaman karamsar kilitleme (ör. .with_for_update()) veya iyimser sürüm oluşturma kullanın.

İlk aracı grafiğini lint edin

Yeni oluşturulan aracı grafiğimizin doğru şekilde derlendiğini doğrulamak için Antigravity'den linter'ı çalıştırmasını ve aracıyı bizim adımıza test etmesini isteyebiliriz.

👉 Antigravity'ye istem:

Run `agents-cli lint` on our `shopping-assistant` project to verify syntax and 
refactor if any issues.

Beklenenler: Antigravity, tespit edilen biçimlendirme veya lint sorunlarını düzeltmek için agents-cli lint ve agents-cli lint --fix komutlarını çalıştırır.

5. Projeye Özel Kurallar Oluşturma

Binlerce sayfalık genel güvenlik dokümanıyla aracınızın etkin belleğinin aşırı yüklenmesini önlemek için (bu durum bağlam bozulmasına ve muhakeme gecikmesine neden olur) önceden onaylanmış güvenli kurallardan oluşan bir "paved road" (hazır yol) oluşturmanız gerekir. Antigravity IDE'de kalıcı bir bağlam dosyası oluşturarak bu koruma sınırlarını belirleyebilirsiniz.

👉 Antigravity'ye istem:

Create a customization directory named `shopping-assistant/.agents` and
create a file `shopping-assistant/.agents/CONTEXT.md` defining our secure
coding standards:

# Local Project Context & Secure Coding Standards

## Core Paved Roads
We systematically address common vulnerability classes by guiding the agent
to use our pre-configured, secure-by-default helper patterns instead of
writing raw implementation logic from scratch.

1. **Tool Input Validation**: Every agent tool must validate incoming
   parameters against strict Pydantic schemas rather than parsing raw
   dictionaries or strings.
2. **No Shell Execution**: Never use `run_command` or raw shell execution
   tools unless explicitly approved by `hooks.json`.
3. **Pre-Commit Remediation Loop**: If a git commit fails due to a pre-commit
   hook error (such as a Semgrep scan finding), you MUST treat the violation
   as a refactoring task, apply targeted fixes, run tests to verify no
   regressions, and attempt to commit again.

Beklenenler: Antigravity, .agents/ dizinini ve CONTEXT.md dosyasını oluşturup incelemeniz için doğrudan yardımcı bölmede gösterir.

6. Yerel Gating Kancalarını Yapılandırma

Güvenli olmayan kodların veya sırların iş istasyonunuzdan ayrılmasını önlemek için kod göndermeden önce geliştirme ortamınızın sınırlarında otomatik geçitler yapılandırın. Antigravity'den kanca yapılandırmalarını oluşturmasını isteyeceğiz ve ardından bunları terminali kullanarak yükleyeceğiz.

1. Git Pre-Commit Hook

Statik analizimizin, simüle edilmiş kimlik bilgilerini güvenilir bir şekilde yakaladığından ve güvenli olmayan commit'leri engellediğinden emin olmak için özel bir Semgrep kuralı tanımlayacak ve bunu zorunlu kılmak üzere bir Git pre-commit hook'u yapılandıracağız.

Özel Semgrep kuralı tanımlama

Varsayılan Semgrep kuralları (--config auto), düşük güven puanı nedeniyle "mock" gibi kelimeler veya tireler içeren sahte anahtarları işaretlemez. Sabit kodlanmış API anahtarımızı güvenilir bir şekilde tespit etmek için genel kurallar yerine doğrudan normal ifade taraması kullanan özel bir yerel kurallar dosyası oluşturacağız.

👉 Antigravity'ye istem:

Create a custom Semgrep rules file `shopping-assistant/.semgrep/rules.yaml`
with a rule to detect hardcoded Google API key prefixes (matching regex
`AIzaSy[A-Za-z0-9_\-]*`). Configure it for Python files with an error severity
and a clear security warning message.

Beklenenler: Antigravity, özel tarama kuralımızı tanımlayan shopping-assistant/.semgrep/rules.yaml oluşturur. Oluşturulan kural tanımını inceleyin:

# shopping-assistant/.semgrep/rules.yaml
rules:
  - id: detect-hardcoded-google-api-key
    pattern-regex: 'AIzaSy[A-Za-z0-9_\-]*'
    message: "Security Issue: Hardcoded Google API key prefix detected."
    languages:
      - python
    severity: ERROR

Ön commit kancasını yapılandırma

Ardından, özel Semgrep kuralımızı çalıştıracak şekilde Git önceden kaydetme kancasını yapılandırın. Kancalar bir alt dizin düzeninde yürütülürken yerel yapılandırmaların yolları, proje alt dizini yerine Git deposunun kök dizinine (shopping-assistant/.semgrep/rules.yaml) göre olmalıdır.

👉 Antigravity'ye istem:

Create a `shopping-assistant/.pre-commit-config.yaml` file configured to run
local pre-commit hooks (end-of-file-fixer, trailing-whitespace) and a local
Semgrep security scan on commit for Python files. Ensure Semgrep is configured
with the `--error` flag and references our custom rules file relative to the Git
repository root. Once created, run `pre-commit install` in the
terminal to activate the hooks.

Beklenenler: Antigravity, sizin adınıza shopping-assistant/.pre-commit-config.yaml oluşturup pre-commit install çalıştırır. Oluşturulan yapılandırmayı inceleyin:

# shopping-assistant/.pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: end-of-file-fixer
        name: End of File Fixer
        entry: end-of-file-fixer
        language: system
        types: [file]
      - id: trailing-whitespace
        name: Trailing Whitespace
        entry: trailing-whitespace-fixer
        language: system
        types: [file]
      - id: semgrep
        name: Semgrep Security Scan
        entry: semgrep --error --config shopping-assistant/.semgrep/rules.yaml
        language: system
        types: [python]

Bu yapılandırma, bir aracı tamamen özerk ve etkileşimli olmayan modda çalışsa bile ön commit kapısının tetiklenmesini ve statik analiz taramalarında başarısız olan tüm commit işlemlerinin engellenmesini sağlar.

Doğrudan Yürütme Komutları (Manuel Doğrulama İçin)

Statik analiz kurulumunuzu tam bir commit hook döngüsünü tetiklemeden manuel olarak doğrulamak için bu kontrolleri doğrudan terminalden çalıştırabilirsiniz.

Via pre-commit (from the "shopping-assistant" directory):

uv run pre-commit run semgrep --all-files

Doğrudan Semgrep üzerinden ("shopping-assistant" dizininden):

uv run semgrep --error --config .semgrep/rules.yaml app/agent.py

2. Yerleşik Antigravity Agent Hook

Daha derin ve yörüngenin ortasında bir sınırlama için shopping-assistant/.agents/hooks.json bölümünde bir aracı kancası yapılandırın. Git kancalarının aksine, aracı kancaları Antigravity'nin sisteminizde kritik araçlar (ör. kabuk komutlarını yürütme) çalıştırmasına izin vermez.

👉 Antigravity'ye istem:

Create a `shopping-assistant/.agents/hooks.json` file configured with a
`PreToolUse` hook that intercepts `run_command` executions and runs
`python3 .agents/scripts/validate_tool_call.py` with a 10-second timeout.

Sizi bekleyen süreç: Antigravity, shopping-assistant/.agents/hooks.json oluşturur. Oluşturulan yapılandırmayı inceleyin:

{
  "enabled": true,
  "PreToolUse": [
    {
      "matcher": "run_command",
      "command": "python3 .agents/scripts/validate_tool_call.py",
      "timeout": 10
    }
  ]
}

Ardından, Antigravity'den kancamızın referans verdiği temel araç doğrulama komut dosyasını oluşturmasını isteyin.

👉 Antigravity'ye istem:

Create the script `shopping-assistant/.agents/scripts/validate_tool_call.py`
with logic to inspect `run_command` executions passed using stdin and block
destructive commands like `rm -rf /`.

Sizi bekleyen süreç: Antigravity, aşağıdakine benzer bir shopping-assistant/.agents/scripts/validate_tool_call.py oluşturur. Oluşturulan doğrulama komut dosyasını inceleyin:

# shopping-assistant/.agents/scripts/validate_tool_call.py
import sys
import json

def main():
    try:
        context = json.load(sys.stdin)
        command = context.get("tool_args", {}).get("CommandLine", "")
        
        if "rm -rf /" in command or "mkfs" in command:
            print("BLOCKED: Destructive command detected.", file=sys.stderr)
            sys.exit(1)
            
        print("APPROVED: Command validation passed.")
        sys.exit(0)
    except Exception as e:
        print(f"Validation error: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    main()

Dikkat çekici girişlerin avantajları ve dezavantajları

  • Git Hooks: Sürüm denetimine özgüdür. Bir aracı tamamen özerk, etkileşimli olmayan modda çalışsa bile çalışır. Ancak, commit sırasında --no-verify işareti kullanılarak atlanabilirler.
  • Aracı kancaları: Tehlikeli araç komutlarını engellemek için olayları yörüngenin ortasında yakalar ancak geliştirici IDE'yi atladığında depoyu korumaz.

Yerel geçitler, geliştiricilerin iyi alışkanlıklar edinmesini sağlar ve güvenlik açıklarının anında tespit edilmesine yardımcı olur. Ancak yerel geçitlerin atlanabileceğini unutmayın. Bu nedenle, uzaktaki ve izole edilmiş CI/CD ardışık düzeniniz, nihai ve atlanamaz güvenlik bariyeriniz olmaya devam eder.

7. STRIDE tehdit modeli oluşturma becerisini uygulama

Şimdi Antigravity'ye güvenlik mimarı uzmanlığı bilgisi vereceksiniz. Antigravity becerileri, ajana çok adımlı akıl yürütme görevlerini nasıl çalıştıracağını bildiren modüler, bildirimsel Markdown dizinleridir. Antigravity, .agents/skills/ içine yerleştirilen tüm becerileri otomatik olarak keşfeder.

👉 Antigravity'ye istem:

Create a local skill directory
`shopping-assistant/.agents/skills/stride-threat-model/` and create a skill
definition file `shopping-assistant/.agents/skills/stride-threat-model/SKILL.md`
with the following content:

---
name: stride-threat-model
description: Performs a systematic STRIDE threat modeling assessment on the
current project's codebase and architecture. Use this when starting a new
implementation phase or reviewing existing components.
---

# STRIDE Threat Modeling Skill

## Goal
Guide the agent to analyze the workspace directory structure, configuration
files, and code files to produce a structured `threat_model.md` assessment.

## Instructions
1. **Analyze System Boundaries**: Map the entry points (tools, workflows,
   prompts) and data storage layers.
2. **STRIDE Evaluation**: Evaluate the system against the six STRIDE pillars:
   - **Spoofing**: Are caller identity boundaries verified before executing
     sensitive tool logic?
   - **Tampering**: Can users manipulate data flows, parameters, or underlying
     state?
   - **Repudiation**: Are critical transactions securely logged?
   - **Information Disclosure**: Are we risking leakage of PII, internal tokens,
     or raw stack traces?
   - **Denial of Service**: Are there rate limits on expensive database or LLM
     queries?
   - **Elevation of Privilege**: Can an unauthenticated user bypass access
     control to reach privileged tool actions?
3. **Output**: Generate a highly structured `threat_model.md` saved directly
   into the workspace root.

Beklenenler: Antigravity, özel beceri dizinini ve SKILL.md dosyasını oluşturur.

Şimdi de etkin proje grafiğinizi (shopping-assistant/app/agent.py) değerlendirmek için yeni oluşturduğunuz beceriyi çalıştıralım.

👉 Antigravity'ye istem:

Run stride-threat-model on our shopping-assistant agent graph.

Beklenenler: Antigravity, amacınıza uygun yanıtlar verir, tehdit değerlendirmesi talimatlarını yerel beceri dizininizden isteğe bağlı olarak yükler, mevcut agent.py dosyanızı analiz eder ve doğrudan shopping-assistant kök dizininizde yapılandırılmış bir threat_model.md oluşturur. Bu yaklaşım, günlük çalışma bağlamınızı temiz ve hafif tutarken uzman güvenlik gerekçelerine anında erişmenizi sağlar.

8. TDD planı aşamasını kontrol etme

Antigravity, başka özellikler uygulamadan veya kodu yeniden düzenlemeden önce, implementation_plan.md ve task.md kontrol listelerinde değişiklikleri haritalandırmak için semantik kod tabanı anlayışından yararlanır. Antigravity'nin güvenlik için önceden tasarım yapmasını zorunlu kılmak amacıyla .agents/CONTEXT.md içinde plan onayını kısıtlayan bir sistem kuralı yapılandırırız.

👉 Antigravity'ye istem:

Append the following TDD planning gate instruction to the bottom of
`shopping-assistant/.agents/CONTEXT.md`:

## TDD Planning Gate
During the Plan phase, you must decompose the workspace task into logical,
modular stages. Every implementation plan MUST include a dedicated
**Security Boundaries & Assertions** section outlining specific edge cases
that could exploit the feature.

Beklenenler: Antigravity, shopping-assistant/.agents/CONTEXT.md uygulamasını yeni planlama kapısı kuralıyla güncelleyecek.

Antigravity'den sonraki adımlarda bir özellik oluşturmasını veya yeniden düzenlemesini istediğinizde bu kuralı otomatik olarak analiz eder ve açık bir güvenlik dökümü içeren bir uygulama planı sunar. Bu planı doğrudan Antigravity'nin etkileşimli iletişim kutusunda veya yardımcı bölmesinde inceleyebilirsiniz. Kod oluşturma işlemi başlamadan önce Devam veya Onayla'yı tıklamanız gerekir.

Planlama Kapısı'nı test etme (isteğe bağlı)

Bu planlama adımının şu anda nasıl çalıştığını görmek için Antigravity'ye aşağıdaki özellik isteklerinden birini istem olarak girmeyi deneyin. Antigravity, kodu hemen oluşturmak yerine Planlama aşamasına girer ve incelemeniz için ayrıntılı bir Güvenlik Sınırları ve Onayları dökümü (ör.yarış koşullarının, yetkisiz ayrıcalık yükseltmelerinin veya negatif puan değerlerinin tanımlanması) içeren bir implementation_plan.md sunar.

👉 Antigravity'ye istem (Test etmek için birini seçin):

Plan a new agent tool `award_loyalty_points` that awards points to a user's
account after a successful purchase.
Plan a new agent tool `process_cart_checkout` that receives a cart ID and
discount code, applies the discount, and processes the order.
Plan a new agent tool `update_discount_status` that allows administrators to
activate or deactivate discount codes in the store.

9. İzole Edilmiş, Sonuca Dayalı Testler Yazma

Şimdi Antigravity'ye mevcut ADK aracımız için kapsamlı güvenlik testleri yazması konusunda rehberlik ediyoruz. Güvenlik testlerimizin dayanıklı ve gerçekçi olmasını sağlamak için bu testleri iki temel ilkeye göre yapılandırırız:

  • Etkileşimler yerine sonuçlar üzerinde onaylama yapın: Dahili yardımcı işlev çağrılarını izleyen kırılgan sahte veriler yazmak yerine nihai dönüş dizeleri ve durum mutasyonları üzerinde onaylama yapın.
  • Sıkı Koruma Önlemleri Uygulama: Araçların, açık işletme mantığı sınırlarını (ör. tek kullanımlık kullanım ve kayıtlı kullanıcı kuralları) uyguladığını doğrulayın.

👉 Antigravity'ye istem:

Use `agents-cli` and pytest to generate an outcome-based security test suite
in `shopping-assistant/tests/test_agent.py`. Inspect `app/agent.py` and
write tests to verify all security boundaries and business logic guardrails
for the `redeem_discount` tool.

Sizi bekleyen süreç: Antigravity, aşağıdakine benzer bir shopping-assistant/tests/test_agent.py oluşturur. Oluşturulan test dosyasını inceleyin:

# shopping-assistant/tests/test_agent.py
import pytest
from app.agent import redeem_discount, DISCOUNT_STORE

@pytest.fixture(autouse=True)
def reset_store():
    """Ensure strict test isolation by resetting in-memory store state before each test run."""
    DISCOUNT_STORE["WELCOME50"] = False
    DISCOUNT_STORE["SUMMER20"] = False
    yield
    DISCOUNT_STORE["WELCOME50"] = False
    DISCOUNT_STORE["SUMMER20"] = False

def test_discount_code_can_only_be_redeemed_once():
    """Verify a user cannot submit a request reusing a single-use code."""
    # First redemption - should succeed
    res_one = redeem_discount("WELCOME50", "user_123")
    assert "Success" in res_one
    assert DISCOUNT_STORE["WELCOME50"] is True
    
    # Second redemption trying to reuse the same code
    res_two = redeem_discount("WELCOME50", "user_456")
    assert "Error: Discount code has already been redeemed" in res_two

def test_discount_redemption_rejects_invalid_code():
    """Verify that unknown discount codes are hard-blocked."""
    res = redeem_discount("INVALID999", "user_123")
    assert "Error: Invalid discount code" in res

def test_discount_redemption_rejects_guest_accounts():
    """Verify that unauthenticated guest accounts cannot redeem discounts."""
    res = redeem_discount("SUMMER20", "guest_999")
    assert "Error: Registered user account required" in res
    assert DISCOUNT_STORE["SUMMER20"] is False

TDD GREEN aşamasını doğrulama

Yeni oluşturulan güvenlik testlerimizin mevcut agent.py uygulamamıza karşı başarıyla geçtiğini doğrulamak için Antigravity'den sizin adınıza pytest'i yürütmesini isteyin.

👉 Antigravity'ye istem:

Run `uv run pytest tests/test_agent.py` on our `shopping-assistant` project to verify that our security tests pass successfully.

Beklenenler: Antigravity, terminalde uv run pytest tests/test_agent.py komutunu çalıştırır. Tüm test durumları başarıyla geçer. Mantıksal uygulama sınırları artık güvenli ancak statik tarayıcımızın, sabit kodlanmış API anahtarını commit sırasında yakaladığından emin olmamız gerekiyor.

10. Giriş kontrolü ve temsilcinin kendi kendini düzeltmesini doğrulama

Testler yeşil renkte olduğunda Yeniden Düzenleme ve İşleme Aşaması'na geçersiniz. Bu noktada yerel güvenlik taramalarımız ve ön commit kancalarımız, hiçbir deponun iş istasyonundan güvenlik açıklarıyla ayrılmadığını doğrular ve Antigravity, otonom kendi kendini düzeltme özelliklerini gösterir.

  1. Terminalinizde proje dizinine gidin ve yerel ön commit kancası ikililerinin PATH'inizde etkin olduğundan emin olmak için uv run kullanarak kodu commit edin:
    cd ~/secure-agent-lab/shopping-assistant
    git add .
    uv run git commit -m "feat: implement shopping assistant agent"
    
  2. Git ön commit kancası Semgrep'i otomatik olarak çalıştırdığı için commit işleminin başarısız olduğunu gözlemleyin:
    Semgrep Security Scan....................................................Failed
    - hookid: semgrep
    
      app/agent.py
      Security Issue: Hardcoded Google API key prefix detected.
    
  3. .agents/CONTEXT.md içinde yapılandırılan Pre-Commit Remediation Loop (Ön Commit Düzeltme Döngüsü) kuralı tarafından yönlendirilen Antigravity, IDE terminalindeki ön commit hatasını otomatik olarak yakalar, Semgrep hata günlüklerini okur ve sabit kodlanmış bir API anahtarından anahtarı güvenli bir şekilde almaya geçmek için yeniden düzenleme adımını başlatır.
  4. API anahtarı sızıntısını gidermek için Antigravity tarafından shopping-assistant/app/agent.py içinde oluşturulan yeniden düzenlenmiş kodu inceleyin.
  5. Antigravity, testlerin hâlâ başarılı olduğunu doğrulamak için pytest komutunu otomatik olarak çalıştırır.
  6. Antigravity, sizin adınıza commit işlemini tekrar dener. Yerel Git kimliğiniz yapılandırılmış ve bir depo başlatılmışsa tarama başarılı olur ve işlem gerçekleştirilir.

Bu, TDD'yi yerel ön commit kancaları ve aracı döngüleriyle birleştirmenin temel gücünü gösterir. Uzak CI/CD hatasının beklenmesi yerine, aracı yerel olarak sorumlu tutulur ve kodu gönderilmeden önce varsayılan olarak güvenli olacak şekilde yeniden düzenlenir.

11. Ajanı Yerel Olarak Çalıştırma ve Test Etme

Güvenlik sınırları doğrulandıktan ve onaylandıktan sonra, yerel oyun alanında ADK aracısıyla etkileşim kurmak için dışa aktarılan Gemini API anahtarınızı kullanarak ADK aracısını yerel olarak çalıştırın.

  1. Terminalinizde, Gemini API anahtarınızın ortamınıza aktarıldığından emin olun:
    echo $GEMINI_API_KEY # Verify your key is exported
    
  2. Temsilciniz için yerel geliştirme oyun alanını başlatın:
    cd ~/secure-agent-lab/shopping-assistant
    agents-cli playground
    
    Yerel playground sunucusunun 8080 numaralı bağlantı noktasında çalıştığını belirten bir çıkış görmelisiniz:
    * Serving ADK Playground
    * Running on http://127.0.0.1:8080/dev-ui/?app=app
    
  3. Alışveriş Asistanı temsilcinizle etkileşimli olarak sohbet etmeye başlamak için sağlanan URL'yi web tarayıcınızda açın. İndirim kodu kullanmasını istemeyi deneyin:
    Can you redeem the discount code WELCOME50 for user user_123?
    
    Temsilci, Gemini modeli yürütmesini kullanarak isteğinizi işler ve indirimi kullanmaya çalışır.

12. Temizleme

İş istasyonunuzu temizlemek ve yerel ortamınızda istenmeyen kaynaklar veya sırların kalmasını önlemek için aşağıdaki temizleme adımlarını uygulayın.

  1. Yerel sunucuyu durdurma: Playground sunucunuz hâlâ çalışıyorsa terminalinizde Ctrl + C tuşuna basarak durdurun.
  2. Yerel Proje Dosyalarını Kaldırın: Yerel proje dizinini makinenizden silin:
    rm -rf ~/secure-agent-lab
    

13. Tebrikler

Tebrikler! Google Antigravity IDE'yi kullanarak güvenli ve test odaklı bir geliştirme yaşam döngüsü oluşturmuş, saf bir ADK 2.0 alışveriş asistanı temsilcisi geliştirmiş ve bunu yerel olarak doğrulamış olmanız gerekir.

Öğrendikleriniz

  • Antigravity IDE ve agents-cli kullanarak ADK 2.0 aracısı (ADK) oluşturma ve entegre etme
  • CONTEXT.md kullanarak proje düzeyinde güvenli kodlama standartlarını ayarlama
  • Antigravity IDE'de özel bir STRIDE tehdit modelleme becerisi oluşturma ve çalıştırma
  • Güvenlik sınırlarını zorlamak için yapay zeka aracısının planlama aşamasını nasıl sınırlayabilirsiniz?
  • pytest kullanarak yalıtılmış, sonuca dayalı güvenlik testleri uygulama.
  • Ajanlı uygulamayı yerel olarak çalıştırma ve test etme
  • Git kancaları ile aracıya özel yürütme kancaları arasındaki farklar ve denge unsurları.

Sonraki adımlar

Kaggle 5-Day AI Agents rozetinizi kazanın 🎉

Bu laboratuvarı Kaggle'ın 5-Day AI Agents: Intensive Vibe Coding Course with Google (5 Günde Yapay Zeka Ajanları: Google ile Yoğun Vibe Kodlama Kursu) kapsamında mı tamamladınız? Tamamlama rozetinizi talep edin:

5 Günlük Yapay Zeka Temsilcileri rozetini alma