slop-ai-indo 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +11 -0
- package/lib/banner.mjs +1 -1
- package/lib/linter.mjs +5 -2
- package/package.json +1 -1
- package/presets/default.md +11 -0
- package/skills/slop-ai-indo/VERSION +1 -1
- package/skills/slop-ai-indo-backend/SKILL.md +89 -10
- package/skills/slop-ai-indo-code/SKILL.md +31 -5
- package/skills/slop-ai-indo-human/contrast-mcp.py +1 -1
- package/skills/slop-ai-indo-test/SKILL.md +0 -9
package/DESIGN.md
CHANGED
|
@@ -69,6 +69,13 @@ Untuk aplikasi otomatisasi alur, diagram, atau kanvas multi-agent:
|
|
|
69
69
|
* **Laravel / PHP:**
|
|
70
70
|
* Kode PSR-12 bersih.
|
|
71
71
|
* Hapus komentar redundan yang hanya mengulang nama fungsi.
|
|
72
|
+
* DILARANG membuat DocBlock/PHPDoc boilerplate (`/** ... */`) yang hanya memparafrase nama fungsi atau mengulang tipe data (seperti `/** Get all setup menus... @return Collection */`). Gunakan native type hint (PHP 8+). DocBlock HANYA diizinkan untuk tipe generic kompleks static analysis (PHPStan/Psalm) tanpa kalimat deskripsi hampa.
|
|
73
|
+
* Terapkan Skinny Controller: validasi wajib dipisah ke Form Request, logika bisnis diekstrak ke Action Class / Service Layer.
|
|
74
|
+
* Wajib bungkus response publik dengan API Resource (`JsonResource`) atau DTO; DILARANG mengembalikan Model Eloquent mentah ke JSON client.
|
|
75
|
+
* Gunakan Guard Clauses / Early Return untuk menjaga kedalaman indentasi logika maksimal 2 tingkat.
|
|
76
|
+
* Data Master & Konfigurasi: Wajib buatkan tabel database (Master / Lookup / Reference Tables) untuk data opsi, kategori, atau konfigurasi yang berpotensi dinamis agar mudah dirawat tanpa redeploy kode. Hardcode (Backed Enum / Config) HANYA untuk alur status tertutup (state machine) yang terikat langsung dengan percabangan logika kode.
|
|
77
|
+
* DILARANG menggunakan `protected $guarded = []`. Wajib deklarasikan `$fillable` secara eksplisit atau hanya passing `$request->validated()` untuk mencegah celah Mass Assignment.
|
|
78
|
+
* Migrasi Database: Foreign key wajib gunakan `$table->foreignId()->constrained()->cascadeOnDelete()` dan beri `->index()` pada kolom yang sering disaring/diurutkan (`status`, `slug`, `created_at`).
|
|
72
79
|
* Blade/Inertia views menggunakan utilitas CSS dengan siku tajam (`rounded-sm` atau `rounded`, jangan `rounded-full`).
|
|
73
80
|
* **Flutter:**
|
|
74
81
|
* Widget menggunakan `RoundedRectangleBorder(borderRadius: BorderRadius.circular(4))`.
|
|
@@ -77,6 +84,10 @@ Untuk aplikasi otomatisasi alur, diagram, atau kanvas multi-agent:
|
|
|
77
84
|
* **CSS / Tailwind:**
|
|
78
85
|
* Gunakan `border-radius: 4px` atau `border-radius: 6px`.
|
|
79
86
|
* Hindari class `rounded-2xl`, `rounded-3xl`, `rounded-full` kecuali untuk avatar pengguna berbentuk lingkaran.
|
|
87
|
+
* **URL & Routing (Clean / Semantic URLs):**
|
|
88
|
+
* Wajib gunakan URL semantik RESTful dan slug (`/articles/{article:slug}`, `/users/{id}/edit`), DILARANG menggunakan query string untuk routing halaman atau identifier entitas (`?id=123`, `?page=settings`, `?action=delete`).
|
|
89
|
+
* Query string (`?`) HANYA diizinkan untuk filter opsional, pencarian, dan paginasi (`?category=tech&page=2`).
|
|
90
|
+
* Seluruh parameter URL wajib diproses via parameter binding (Prepared Statements / ORM) untuk proteksi mutlak dari SQL Injection dan IDOR.
|
|
80
91
|
|
|
81
92
|
---
|
|
82
93
|
|
package/lib/banner.mjs
CHANGED
package/lib/linter.mjs
CHANGED
|
@@ -128,8 +128,8 @@ export const RULES = {
|
|
|
128
128
|
id: 'R-31',
|
|
129
129
|
name: 'Trivial / Redundant AI Comments',
|
|
130
130
|
tier: 'Quality Lock',
|
|
131
|
-
description: 'Komentar kode klise yang hanya mengulang sintaks
|
|
132
|
-
fix: 'Hapus komentar yang sudah jelas dari nama
|
|
131
|
+
description: 'Komentar kode klise atau DocBlock boilerplate yang hanya mengulang sintaks atau memparafrase nama fungsi.',
|
|
132
|
+
fix: 'Hapus komentar atau DocBlock yang sudah jelas dari nama/tipe fungsi; jelaskan alasan bisnis jika perlu.',
|
|
133
133
|
patterns: [
|
|
134
134
|
/\/\/\s*(?:initialize|declare|declaration of)\s+(?:variable|state|data)\b/i,
|
|
135
135
|
/\/\/\s*(?:this function|function to)\s+(?:handles?|calculates?|renders?|returns?)\b/i,
|
|
@@ -137,6 +137,9 @@ export const RULES = {
|
|
|
137
137
|
/\/\/\s*handle\s+(?:click|submit|change|event)\b/i,
|
|
138
138
|
/\/\/\s*import\s+(?:dependencies|modules|libraries|components)\b/i,
|
|
139
139
|
/\/\/\s*constructor\b/i,
|
|
140
|
+
// DocBlock boilerplate / Signature echo:
|
|
141
|
+
/^\s*\*\s*(?:Get|Set|Handles?|Retrieves?|Returns?|Fetches?|Deletes?|Updates?)\s+(?:all\s+)?(?:the\s+)?[a-zA-Z0-9_\s/]+(?:\bfor\b|\bfrom\b|\bto\b|\bof\b|\bby\b|\binstance\b|\bmenus?\b|\bdata\b|\buser\b)[a-zA-Z0-9_\s/]*\.?\s*$/i,
|
|
142
|
+
/^\s*\*\s*@return\s+(?:void|Collection<int,\s*(?:object|mixed)>|mixed|object|array<string,\s*mixed>)\s*$/i,
|
|
140
143
|
],
|
|
141
144
|
extensions: ['.js', '.mjs', '.cjs', '.ts', '.tsx', '.jsx', '.php', '.py', '.go', '.vue', '.svelte'],
|
|
142
145
|
},
|
package/package.json
CHANGED
package/presets/default.md
CHANGED
|
@@ -69,6 +69,13 @@ Untuk aplikasi otomatisasi alur, diagram, atau kanvas multi-agent:
|
|
|
69
69
|
* **Laravel / PHP:**
|
|
70
70
|
* Kode PSR-12 bersih.
|
|
71
71
|
* Hapus komentar redundan yang hanya mengulang nama fungsi.
|
|
72
|
+
* DILARANG membuat DocBlock/PHPDoc boilerplate (`/** ... */`) yang hanya memparafrase nama fungsi atau mengulang tipe data (seperti `/** Get all setup menus... @return Collection */`). Gunakan native type hint (PHP 8+). DocBlock HANYA diizinkan untuk tipe generic kompleks static analysis (PHPStan/Psalm) tanpa kalimat deskripsi hampa.
|
|
73
|
+
* Terapkan Skinny Controller: validasi wajib dipisah ke Form Request, logika bisnis diekstrak ke Action Class / Service Layer.
|
|
74
|
+
* Wajib bungkus response publik dengan API Resource (`JsonResource`) atau DTO; DILARANG mengembalikan Model Eloquent mentah ke JSON client.
|
|
75
|
+
* Gunakan Guard Clauses / Early Return untuk menjaga kedalaman indentasi logika maksimal 2 tingkat.
|
|
76
|
+
* Data Master & Konfigurasi: Wajib buatkan tabel database (Master / Lookup / Reference Tables) untuk data opsi, kategori, atau konfigurasi yang berpotensi dinamis agar mudah dirawat tanpa redeploy kode. Hardcode (Backed Enum / Config) HANYA untuk alur status tertutup (state machine) yang terikat langsung dengan percabangan logika kode.
|
|
77
|
+
* DILARANG menggunakan `protected $guarded = []`. Wajib deklarasikan `$fillable` secara eksplisit atau hanya passing `$request->validated()` untuk mencegah celah Mass Assignment.
|
|
78
|
+
* Migrasi Database: Foreign key wajib gunakan `$table->foreignId()->constrained()->cascadeOnDelete()` dan beri `->index()` pada kolom yang sering disaring/diurutkan (`status`, `slug`, `created_at`).
|
|
72
79
|
* Blade/Inertia views menggunakan utilitas CSS dengan siku tajam (`rounded-sm` atau `rounded`, jangan `rounded-full`).
|
|
73
80
|
* **Flutter:**
|
|
74
81
|
* Widget menggunakan `RoundedRectangleBorder(borderRadius: BorderRadius.circular(4))`.
|
|
@@ -77,6 +84,10 @@ Untuk aplikasi otomatisasi alur, diagram, atau kanvas multi-agent:
|
|
|
77
84
|
* **CSS / Tailwind:**
|
|
78
85
|
* Gunakan `border-radius: 4px` atau `border-radius: 6px`.
|
|
79
86
|
* Hindari class `rounded-2xl`, `rounded-3xl`, `rounded-full` kecuali untuk avatar pengguna berbentuk lingkaran.
|
|
87
|
+
* **URL & Routing (Clean / Semantic URLs):**
|
|
88
|
+
* Wajib gunakan URL semantik RESTful dan slug (`/articles/{article:slug}`, `/users/{id}/edit`), DILARANG menggunakan query string untuk routing halaman atau identifier entitas (`?id=123`, `?page=settings`, `?action=delete`).
|
|
89
|
+
* Query string (`?`) HANYA diizinkan untuk filter opsional, pencarian, dan paginasi (`?category=tech&page=2`).
|
|
90
|
+
* Seluruh parameter URL wajib diproses via parameter binding (Prepared Statements / ORM) untuk proteksi mutlak dari SQL Injection dan IDOR.
|
|
80
91
|
|
|
81
92
|
---
|
|
82
93
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.2.0
|
|
@@ -67,13 +67,92 @@ allowed-tools: Read Write Edit Glob Grep
|
|
|
67
67
|
- **Alasan:** Rawan terunggah ke version control publik dan dieksploitasi penyerang.
|
|
68
68
|
- **Solusi:** Wajib membaca rahasia dari environment variables (`.env`, secret manager). Berikan nilai default hanya untuk lingkungan development lokal non-sensitif.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
70
|
+
### B-09: Desain URL Spageti & Identifier di Query String (Ugly Query-String URLs)
|
|
71
|
+
|
|
72
|
+
- **Ciri:** Menggunakan query string acak-acakan (`?`) untuk routing halaman atau identifier entitas utama, seperti `/article.php?id=123`, `/dashboard?page=settings`, atau `/users?action=edit&id=5`.
|
|
73
|
+
- **Alasan:**
|
|
74
|
+
1. Desain usang yang merusak SEO, keterbacaan manusia, dan estetika enterprise.
|
|
75
|
+
2. Mengekspos identifier database mentah yang mempermudah serangan manipulasi parameter (IDOR / Insecure Direct Object Reference).
|
|
76
|
+
3. Mengundang celah SQL Injection akibat kebiasaan mengambil parameter GET secara ceroboh lalu disambung langsung ke query database tanpa sanitasi.
|
|
77
|
+
- **Solusi:**
|
|
78
|
+
- Wajib gunakan Clean / Pretty URLs semantik berbasis RESTful path dan slug:
|
|
79
|
+
- Gunakan slug atau Route Model Binding: `/articles/{article:slug}` (misal: `/articles/panduan-keamanan-web`) alih-alih `?id=123`.
|
|
80
|
+
- Gunakan pola RESTful: `/users/{user}/edit` alih-alih `?action=edit&id=5`.
|
|
81
|
+
- Gunakan UUID atau public identifier untuk endpoint publik jika ID numerik tidak boleh ditebak.
|
|
82
|
+
- Query string (`?`) HANYA diizinkan untuk parameter opsional non-routing: penyaringan (filter), pengurutan (sort), pencarian (search), dan paginasi (misal: `/products?category=elektronik&sort=termurah&page=2`).
|
|
83
|
+
- Seluruh parameter (baik path param maupun query param) wajib diproses dengan validasi skema dan prepared statements / ORM parameter binding (Eloquent, Prisma, dll.) untuk menjamin keamanan mutlak dari SQL Injection.
|
|
84
|
+
|
|
85
|
+
### B-10: Fat Controller & Percampuran Tanggung Jawab (Fat Controller Antipattern)
|
|
86
|
+
|
|
87
|
+
- **Ciri:** Menumpuk seluruh logika di dalam satu method controller (100+ baris): validasi inline `$request->validate([...])`, manipulasi database berlapis, upload berkas, pengiriman email/notifikasi, dan format data sekaligus.
|
|
88
|
+
- **Alasan:** Melanggar prinsip Single Responsibility (SRP). Kode menjadi spageti, rapuh, tidak dapat digunakan kembali (reusable), dan mustahil diuji secara terisolasi via unit testing.
|
|
89
|
+
- **Solusi:**
|
|
90
|
+
- Terapkan pola **Skinny Controller**: Controller hanya berperan sebagai pengatur lalu lintas HTTP (terima request -> delegasikan ke Action/Service -> kembalikan Response).
|
|
91
|
+
- Ekstrak validasi ke **Dedicated Form Request** (misal: `StoreOrderRequest`, `UpdateProfileRequest`) dengan deklarasi aturan yang rapi.
|
|
92
|
+
- Ekstrak proses bisnis dan mutasi data ke **Action Class** (misal: `CreateOrderAction`, `ProcessPaymentAction`) dengan satu method publik (`execute()` atau `handle()`).
|
|
93
|
+
|
|
94
|
+
### B-11: Kebocoran Model Mentah ke Response Publik (Raw Model Response Leaks)
|
|
95
|
+
|
|
96
|
+
- **Ciri:** Mengembalikan model database secara langsung ke response client: `return response()->json($user)` atau `return $order`.
|
|
97
|
+
- **Alasan:**
|
|
98
|
+
1. **Celah Keamanan & Kebocoran Privasi:** Kolom internal database seperti `remember_token`, hash password lama, IP address audit, atau kolom terhapus (`deleted_at`) dapat bocor tanpa sengaja jika `$hidden` model tidak lengkap.
|
|
99
|
+
2. **Kontrak API Rapuh:** Perubahan nama kolom database langsung merusak aplikasi mobile atau frontend client.
|
|
100
|
+
3. **Format Tidak Konsisten:** Format tanggal (ISO 8601 vs timestamp) dan penamaan atribut menjadi tidak seragam antar-endpoint.
|
|
101
|
+
- **Solusi:**
|
|
102
|
+
- Wajib membungkus setiap response entitas dengan **API Resource** (seperti Laravel `JsonResource`) atau Data Transfer Object (DTO).
|
|
103
|
+
- Deklarasikan secara eksplisit field apa saja yang diizinkan keluar ke publik:
|
|
104
|
+
```php
|
|
105
|
+
return OrderResource::make($order);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### B-12: Percabangan Piramida Bersarang (Arrow Anti-Pattern vs Guard Clauses)
|
|
109
|
+
|
|
110
|
+
- **Ciri:** Struktur `if-else` bertingkat yang menjorok dalam (3 hingga 5 level nesting kurung kurawal), seperti `if ($user) { if ($active) { if ($hasStock) { ... } } }`.
|
|
111
|
+
- **Alasan:** Membebani beban kognitif pembaca (*cyclomatic complexity* tinggi) dan menyembunyikan logika utama ("happy path") di balik tumpukan kurung kurawal.
|
|
112
|
+
- **Solusi:**
|
|
113
|
+
- Gunakan **Guard Clauses / Early Return**: Periksa kondisi kegagalan atau pengecualian di baris awal fungsi, lalu segera `return` atau `throw exception`.
|
|
114
|
+
- Batasi kedalaman indentasi logika maksimal **2 tingkat**. Happy path harus berjalan lurus di tingkat terluar fungsi.
|
|
115
|
+
|
|
116
|
+
### B-13: Data Master & Opsi Dinamis Dihardcode (Hardcoded Master Data vs Database Tables)
|
|
117
|
+
|
|
118
|
+
- **Ciri:** Menuliskan array opsi, kategori produk, daftar status non-standar, role pengguna, tarif, atau konfigurasi aplikasi langsung di dalam kode program (misal: `$categories = ['Elektronik', 'Pakaian', 'Makanan']` di controller, atau opsi form hardcoded di template Blade/View).
|
|
119
|
+
- **Alasan:**
|
|
120
|
+
1. **Beban Maintenance Berat:** Setiap kali ada penambahan opsi atau perubahan nilai, developer harus mengubah file kode program, membuat commit baru, dan melakukan deployment ulang.
|
|
121
|
+
2. **Integritas Relasi Rapuh:** Data yang di-hardcode tidak memiliki integritas referensial (Foreign Key) di database, sehingga rawan inkonsistensi saat data berubah.
|
|
122
|
+
- **Solusi:**
|
|
123
|
+
- **Wajib buatkan Tabel Database (Master / Lookup / Reference Tables)** jika data berpotensi bertambah, diubah, atau dikelola oleh admin/operasional tanpa perlu campur tangan developer (misal: kategori produk, tipe transaksi, tarif biaya, master menu/permission dinamis, setting aplikasi).
|
|
124
|
+
- **Pengecualian (Boleh Hardcode / Gunakan Enum):**
|
|
125
|
+
Data HANYA boleh di-hardcode (sebaiknya dibungkus Backed Enum atau config terisolasi) jika:
|
|
126
|
+
1. Merupakan alur status tertutup (*fixed state machine*) yang logika percabangan kodenya bergantung langsung padanya (misal: alur transaksi `Pending -> Paid -> Shipped -> Completed`).
|
|
127
|
+
2. Merupakan standar baku teknis yang permanen (misal: kode mata uang ISO, gender L/P, HTTP status code).
|
|
128
|
+
|
|
129
|
+
### B-14: Celah Keamanan Mass Assignment (Lazy Guarded Antipattern vs Explicit Fillable)
|
|
130
|
+
|
|
131
|
+
- **Ciri:** Menuliskan `protected $guarded = [];` di model Eloquent atau ORM sejenis tanpa proteksi atribut.
|
|
132
|
+
- **Alasan:** Membuka celah eskalasi hak akses (*privilege escalation*). Jika penyerang menyuntikkan parameter seperti `role=admin`, `is_verified=true`, atau `balance=999999` di payload request, database akan langsung menyimpannya tanpa hambatan saat controller memanggil `Model::create($request->all())` atau `update()`.
|
|
133
|
+
- **Solusi:**
|
|
134
|
+
- **DILARANG KERAS** menggunakan `protected $guarded = [];`.
|
|
135
|
+
- Wajib mendeklarasikan array `$fillable` secara eksplisit hanya untuk kolom yang memang diizinkan diisi oleh pengguna publik:
|
|
136
|
+
```php
|
|
137
|
+
protected $fillable = ['name', 'email', 'phone'];
|
|
138
|
+
```
|
|
139
|
+
- Selalu passing data yang sudah divalidasi dari Form Request: `User::create($request->validated());`.
|
|
140
|
+
|
|
141
|
+
### B-15: Migrasi Database Tanpa Indeks & Foreign Key Rapuh (Missing Indexes & Weak Constraints)
|
|
142
|
+
|
|
143
|
+
- **Ciri:** Membuat relasi database hanya dengan kolom integer biasa tanpa constraint (`$table->unsignedBigInteger('user_id')` tanpa relasi), serta tidak menambahkan index pada kolom yang sering disaring atau diurutkan.
|
|
144
|
+
- **Alasan:**
|
|
145
|
+
1. Data menjadi yatim (*orphan*): jika user dihapus, data anaknya tertinggal tanpa relasi yang jelas.
|
|
146
|
+
2. Saat tabel membesar hingga puluhan ribu baris, query pencarian menjadi lambat drastis karena database terpaksa melakukan *Full Table Scan*.
|
|
147
|
+
- **Solusi:**
|
|
148
|
+
- Wajib deklarasikan relasi Foreign Key yang tegas:
|
|
149
|
+
```php
|
|
150
|
+
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
|
|
151
|
+
```
|
|
152
|
+
- Wajib tambahkan `->index()` pada kolom yang sering dipakai di klausa `where`, `order by`, atau relasi pencarian (misal: `status`, `slug`, `type`, `created_at`):
|
|
153
|
+
```php
|
|
154
|
+
$table->string('slug')->unique();
|
|
155
|
+
$table->string('status')->index();
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
@@ -47,11 +47,37 @@ allowed-tools: Read Write Edit Glob Grep
|
|
|
47
47
|
- **Alasan:** TODO yang samar adalah polusi teks. Itu hanya perasaan ("ini bisa lebih baik") bukan tugas nyata (apa dan mengapa).
|
|
48
48
|
- **Solusi:** Hapus. Pertahankan TODO hanya jika menyebutkan tugas spesifik dengan konteks yang cukup untuk dieksekusi.
|
|
49
49
|
|
|
50
|
-
### Mengulang Signature Fungsi (Signature Echo)
|
|
51
|
-
|
|
52
|
-
- **Ciri:** Dokumentasi
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
### Mengulang Signature Fungsi (Signature Echo) & DocBlock Slop
|
|
51
|
+
|
|
52
|
+
- **Ciri:** Dokumentasi atau DocBlock (`/** ... */`, JSDoc, PHPDoc, TSDoc) yang hanya memparafrase nama method/fungsi dalam bahasa Inggris atau mengulang type hint bawaan bahasa (misal di PHP 8+, TypeScript, Dart).
|
|
53
|
+
Contoh DocBlock Slop yang dilarang:
|
|
54
|
+
```php
|
|
55
|
+
/**
|
|
56
|
+
* Get all Setup / Setting menus authorized for the current user.
|
|
57
|
+
*
|
|
58
|
+
* @return Collection<int, object>
|
|
59
|
+
*/
|
|
60
|
+
public function getSetupMenus(): Collection
|
|
61
|
+
```
|
|
62
|
+
atau di TypeScript/JS:
|
|
63
|
+
```typescript
|
|
64
|
+
/**
|
|
65
|
+
* Process payment for the user
|
|
66
|
+
* @param amount The payment amount
|
|
67
|
+
* @returns Promise of payment result
|
|
68
|
+
*/
|
|
69
|
+
async function processPayment(amount: number): Promise<PaymentResult>
|
|
70
|
+
```
|
|
71
|
+
- **Alasan:** Menambah baris kode (visual noise) 2 hingga 3 kali lipat tanpa memberikan pemahaman teknis baru. Di era bahasa bertipe modern (PHP 8+, TypeScript, Go, Dart), nama fungsi yang deskriptif dan native type hint sudah menjadi dokumentasi hidup (*self-documenting*) yang divalidasi oleh compiler/interpreter.
|
|
72
|
+
- **Solusi:**
|
|
73
|
+
- Hapus DocBlock sepenuhnya jika nama fungsi dan tipe data sudah jelas secara native:
|
|
74
|
+
```php
|
|
75
|
+
public function getSetupMenus(): Collection
|
|
76
|
+
```
|
|
77
|
+
- **Kapan DocBlock Diizinkan?**
|
|
78
|
+
HANYA jika:
|
|
79
|
+
1. Menyediakan anotasi generic untuk static analysis (PHPStan / Psalm) yang tidak didukung sintaks native bahasa (misal: `/** @return Collection<int, SettingMenu> */` tanpa deskripsi basa-basi di atasnya).
|
|
80
|
+
2. Menjelaskan **MENGAPA** (alasan bisnis, edge-case tidak wajar, workaround bug dependensi/pihak ketiga, atau pertimbangan konkurensi/keamanan).
|
|
55
81
|
|
|
56
82
|
### Emoji Dekoratif
|
|
57
83
|
|
|
@@ -53,12 +53,3 @@ allowed-tools: Read Write Edit Glob Grep
|
|
|
53
53
|
- **Solusi:** Setiap tes harus independen (*hermetic*). Gunakan database transaction rollback per test (`RefreshDatabase` di Laravel, isolated schema di Postgres/SQLite) dan bersihkan mocks setelah setiap test case (`beforeEach`/`afterEach`).
|
|
54
54
|
|
|
55
55
|
---
|
|
56
|
-
|
|
57
|
-
## Delivery Gate: Evaluasi Testing Mandatori
|
|
58
|
-
|
|
59
|
-
Sebelum menyerahkan test code ke pengguna, agen wajib memverifikasi:
|
|
60
|
-
1. [ ] Apakah ada asersi hampa (`expect(true).toBe(true)`) di test suite?
|
|
61
|
-
2. [ ] Apakah ada tes yang mencakup skenario gagal / invalid input?
|
|
62
|
-
3. [ ] Apakah semua panggilan eksternal (API/SMS/Payment) diisolasi dengan mock/fakes?
|
|
63
|
-
4. [ ] Apakah tes deterministik dan tidak bergantung pada jam real-time atau internet live?
|
|
64
|
-
5. [ ] Apakah seluruh tes berhasil lolos saat dijalankan secara berurutan maupun terisolasi?
|