# Backend-SRE Coding Guidelines

## I. Formatting & Style (Google-Style Python)
* **Formatter & Linter:** Wajib menggunakan `ruff` untuk *formatting* dan *linting* otomatis.
* **Naming Convention:**
    * `snake_case`: Fungsi, variabel, argumen.
    * `PascalCase`: *Classes*, *Custom Exceptions*, *Pydantic Models*.
    * `UPPER_SNAKE`: Konstanta/konfigurasi global.
* **Imports:** Wajib 3 blok (Standard Library, Third-party, Local Modules) dengan satu baris kosong di antara blok.
* **Comments:** Gunakan `# simple comment` untuk penjelasan logika. **Dilarang keras** menggunakan komentar dekoratif (`#=====`, `#-----`).
* **Docstring:** Setiap *class* dan *function* wajib memiliki *docstring* format Google Style (menjelaskan `Args:`, `Returns:`, dan `Raises:`).

## II. Observability Standard
* **Structured Logging:** Gunakan `logger.info("message", extra={"key": "value"})`. Jangan menyisipkan *variable* langsung ke dalam *string* log.
* **Instrumentation Strategy:** Kode harus ditulis secara modular agar siap di-*wrap* dengan *decorator* atau *middleware* OpenTelemetry di masa depan tanpa mengubah logika inti.

## III. Testing Standard
* **Structure:** Semua *test* berada di direktori `/tests/` dengan struktur *mirroring* terhadap `app/` (contoh: `tests/services/test_parser.py` untuk `app/services/parser.py`).
* **Unit Tests:** Fokus pada logika atomik (fungsi/metode).
* **Integration Tests:** Wajib untuk alur yang melibatkan *Database* (Neo4j/Supabase) dan *LLM Extraction*.
* **Hard-Gate:** *Pipeline* CI/CD harus menggagalkan *merge* jika terdapat *test* yang *failed* atau *coverage* menurun.

## IV. Data Integrity & Robustness
* **Pydantic Armor:** Semua data yang melewati batas modul (*service boundary*) **wajib** divalidasi dengan *Pydantic Model*. Dilarang keras meneruskan *raw dictionary* tanpa kontrak yang jelas.
* **Type Hinting:** Wajib menggunakan *Type Hinting* untuk semua *function signature*. Gunakan `Optional` atau `Union` jika data bisa bernilai `None`.
* **Error Handling:** Tidak boleh ada *bare except*. Semua pengecualian harus ditangkap spesifik dan dicatat dengan log yang mengandung konteks (ID Artikel/Task).
