[
  {
    "code": "A",
    "name": "Teknologi & Stack",
    "weight": 15,
    "description": "Penilaian kesesuaian stack teknologi dengan standar PDAM",
    "items": [
      { "id": "A1", "label": "Menggunakan Laravel LTS terbaru (min Laravel 11.x)", "description": "Vendor wajib pakai framework backend PHP yang masih supported", "isCritical": false },
      { "id": "A2", "label": "Menggunakan Nuxt.js stable terbaru (min Nuxt 3.x)", "description": "Frontend pakai Nuxt 3 stable", "isCritical": false },
      { "id": "A3", "label": "Database MySQL 8.x", "description": "Database utama MySQL 8.x", "isCritical": false },
      { "id": "A4", "label": "Tidak menggunakan teknologi di luar kesepakatan", "description": "Konsistensi stack sesuai SOW", "isCritical": false },
      { "id": "A5", "label": "Bersedia menggunakan TypeScript di frontend", "description": "TypeScript strict mode di sisi frontend", "isCritical": false }
    ]
  },
  {
    "code": "B",
    "name": "Kualitas Kode",
    "weight": 15,
    "description": "Penilaian standar dan kualitas penulisan kode",
    "items": [
      { "id": "B1", "label": "Mengikuti PSR-12 + ESLint/Prettier (otomatis di CI)", "description": "Code style otomatis di CI", "isCritical": false },
      { "id": "B2", "label": "Menerapkan SOLID & Design Pattern (Service, Repository)", "description": "Arsitektur clean code", "isCritical": false },
      { "id": "B3", "label": "PHPStan minimal level 6", "description": "Static analysis minimal level 6", "isCritical": false },
      { "id": "B4", "label": "Test coverage >=70% backend, >=60% frontend", "description": "Coverage minimum yang harus dipenuhi", "isCritical": false },
      { "id": "B5", "label": "Cyclomatic complexity <=10 per fungsi", "description": "Kompleksitas siklomatik dibatasi", "isCritical": false },
      { "id": "B6", "label": "Code duplication <=3% (SonarQube)", "description": "Duplikasi kode dibatasi", "isCritical": false },
      { "id": "B7", "label": "Penamaan: camelCase var/func, PascalCase class", "description": "Konsistensi penamaan", "isCritical": false }
    ]
  },
  {
    "code": "C",
    "name": "Version Control & CI/CD",
    "weight": 10,
    "description": "Pengelolaan kode dan deployment otomatis",
    "items": [
      { "id": "C1", "label": "Repository milik PDAM sejak awal proyek", "description": "Source code & repo dimiliki PDAM dari hari pertama", "isCritical": true },
      { "id": "C2", "label": "Branch main protected, wajib PR", "description": "Branch protection rule diterapkan", "isCritical": false },
      { "id": "C3", "label": "PR wajib direview minimal 2 orang (1 dari PDAM)", "description": "Code review minimal 2 reviewer", "isCritical": false },
      { "id": "C4", "label": "Conventional Commits diterapkan", "description": "Standar pesan commit", "isCritical": false },
      { "id": "C5", "label": "Pipeline CI/CD lengkap (lint, test, security, build, deploy)", "description": "CI/CD pipeline end-to-end", "isCritical": false },
      { "id": "C6", "label": "Auto-rollback tersedia untuk deployment production", "description": "Rollback otomatis bila deploy gagal", "isCritical": false }
    ]
  },
  {
    "code": "D",
    "name": "Testing & QA",
    "weight": 10,
    "description": "Jaminan kualitas melalui testing berlapis",
    "items": [
      { "id": "D1", "label": "Unit test (PHPUnit + Vitest)", "description": "Unit test backend & frontend", "isCritical": false },
      { "id": "D2", "label": "Integration test", "description": "Integration test antar layer", "isCritical": false },
      { "id": "D3", "label": "Automation UI test (Cypress/Playwright)", "description": "E2E UI test otomatis", "isCritical": false },
      { "id": "D4", "label": "Manual QA oleh tim independen", "description": "QA manual oleh tim terpisah", "isCritical": false },
      { "id": "D5", "label": "Bug classification & SLA resolusi disepakati", "description": "Klasifikasi bug + SLA tertulis", "isCritical": false },
      { "id": "D6", "label": "Regression test otomatis pre-deploy", "description": "Regression check sebelum deploy", "isCritical": false }
    ]
  },
  {
    "code": "E",
    "name": "Keamanan",
    "weight": 15,
    "description": "Penerapan praktik keamanan aplikasi",
    "items": [
      { "id": "E1", "label": "Mengikuti OWASP Top 10", "description": "Mitigasi semua OWASP Top 10 risk", "isCritical": false },
      { "id": "E2", "label": "Input validation server-side", "description": "Validasi sisi server wajib", "isCritical": false },
      { "id": "E3", "label": "Prepared statement untuk seluruh query", "description": "Anti SQL Injection dengan prepared statement", "isCritical": false },
      { "id": "E4", "label": "HTTPS + HSTS + security headers", "description": "TLS + header keamanan modern", "isCritical": false },
      { "id": "E5", "label": "Rate limiting endpoint sensitif", "description": "Rate limit pada endpoint kritikal", "isCritical": false },
      { "id": "E6", "label": "Password hashing bcrypt/argon2", "description": "Hashing password modern", "isCritical": false },
      { "id": "E7", "label": "JWT/OAuth2 dengan refresh token rotation", "description": "Token rotation diaktifkan", "isCritical": false },
      { "id": "E8", "label": "RBAC + audit log", "description": "Kontrol akses + audit trail", "isCritical": false },
      { "id": "E9", "label": "Bersedia Penetration Test pre-go-live", "description": "Pentest wajib sebelum produksi", "isCritical": true },
      { "id": "E10", "label": "Vulnerability scanning otomatis di CI", "description": "Scan dependency & SAST di CI", "isCritical": false }
    ]
  },
  {
    "code": "F",
    "name": "Dokumentasi",
    "weight": 10,
    "description": "Dokumentasi lengkap untuk operasional & maintenance",
    "items": [
      { "id": "F1", "label": "Code documentation (PHPDoc, JSDoc)", "description": "Inline code doc", "isCritical": false },
      { "id": "F2", "label": "Setup documentation (local, dev, staging, prod)", "description": "Panduan setup semua environment", "isCritical": false },
      { "id": "F3", "label": "API documentation (OpenAPI/Swagger auto-generated)", "description": "OpenAPI spec otomatis", "isCritical": false },
      { "id": "F4", "label": "Architecture documentation (C4 Model)", "description": "Arsitektur dengan C4 model", "isCritical": false },
      { "id": "F5", "label": "ERD + data dictionary", "description": "ERD + kamus data lengkap", "isCritical": false },
      { "id": "F6", "label": "Operational runbook untuk Tim IT PDAM", "description": "Runbook operasional siap pakai", "isCritical": false },
      { "id": "F7", "label": "User manual + video tutorial", "description": "Manual user + video", "isCritical": false }
    ]
  },
  {
    "code": "G",
    "name": "DevOps & Infrastruktur",
    "weight": 10,
    "description": "Infrastruktur production-ready",
    "items": [
      { "id": "G1", "label": "NGINX dengan konfigurasi optimal", "description": "Reverse proxy + tuning", "isCritical": false },
      { "id": "G2", "label": "Docker + multi-stage build", "description": "Image kecil & aman", "isCritical": false },
      { "id": "G3", "label": "docker-compose.yml lengkap", "description": "Compose untuk seluruh service", "isCritical": false },
      { "id": "G4", "label": "Container terpisah (BE, FE, DB)", "description": "Single concern per container", "isCritical": false },
      { "id": "G5", "label": "Image versioning (bukan latest)", "description": "Tag image dengan versi semver", "isCritical": false },
      { "id": "G6", "label": "Monitoring & alerting (Prometheus/Grafana)", "description": "Observability lengkap", "isCritical": false },
      { "id": "G7", "label": "Log aggregation retensi >=90 hari", "description": "Log central + retensi", "isCritical": false },
      { "id": "G8", "label": "Backup strategy + DR plan tertulis", "description": "Backup & DR tertulis & teruji", "isCritical": false }
    ]
  },
  {
    "code": "H",
    "name": "Project Management",
    "weight": 5,
    "description": "Pengelolaan proyek yang transparan",
    "items": [
      { "id": "H1", "label": "Scrum 1-2 minggu per sprint", "description": "Sprint length 1-2 minggu", "isCritical": false },
      { "id": "H2", "label": "Tools (Jira/Trello) akses penuh untuk PDAM", "description": "Akses penuh ke tools manajemen proyek", "isCritical": false },
      { "id": "H3", "label": "Product Owner dari pihak PDAM", "description": "PO dari sisi PDAM", "isCritical": false },
      { "id": "H4", "label": "DoR & DoD tertulis dan disepakati", "description": "Definition of Ready & Done tertulis", "isCritical": false },
      { "id": "H5", "label": "Bersedia hadir di seluruh Scrum event", "description": "Komitmen kehadiran event scrum", "isCritical": false }
    ]
  },
  {
    "code": "I",
    "name": "SLA & Support",
    "weight": 5,
    "description": "Dukungan setelah go-live",
    "items": [
      { "id": "I1", "label": "Technical support >=6 bulan post go-live", "description": "Dukungan teknis min 6 bulan", "isCritical": false },
      { "id": "I2", "label": "Warranty period 12 bulan", "description": "Masa garansi 12 bulan", "isCritical": true },
      { "id": "I3", "label": "Response SLA Critical <=2 jam", "description": "Respon insiden kritikal <=2 jam", "isCritical": false },
      { "id": "I4", "label": "Resolve SLA Critical <=24 jam", "description": "Penyelesaian insiden kritikal <=24 jam", "isCritical": false },
      { "id": "I5", "label": "Uptime SLA >=99.5%", "description": "Komitmen uptime minimum", "isCritical": false },
      { "id": "I6", "label": "On-call contact 24/7 untuk masa garansi", "description": "PIC standby 24/7 selama garansi", "isCritical": false }
    ]
  },
  {
    "code": "J",
    "name": "Transfer Knowledge & Handover",
    "weight": 5,
    "description": "Transfer pengetahuan ke Tim IT PDAM",
    "items": [
      { "id": "J1", "label": "Minimal 5 sesi workshop transfer knowledge", "description": "Workshop transfer knowledge min 5 sesi", "isCritical": true },
      { "id": "J2", "label": "Sesi workshop direkam dan diserahkan", "description": "Rekaman semua workshop diserahkan", "isCritical": false },
      { "id": "J3", "label": "Shadow development min 2 personel PDAM", "description": "Shadowing development", "isCritical": false },
      { "id": "J4", "label": "Mentoring support 6 bulan post go-live", "description": "Mentoring berkelanjutan", "isCritical": false },
      { "id": "J5", "label": "Handover formal 1 bulan sebelum kontrak berakhir", "description": "Handover terjadwal", "isCritical": false },
      { "id": "J6", "label": "Standby support 30 hari setelah handover", "description": "Support standby pasca handover", "isCritical": false }
    ]
  },
  {
    "code": "K",
    "name": "Kepemilikan & Legal",
    "weight": 5,
    "description": "Aspek legal dan kepemilikan",
    "items": [
      { "id": "K1", "label": "Source code 100% milik PDAM", "description": "Hak kepemilikan source code mutlak", "isCritical": true },
      { "id": "K2", "label": "NDA 5 tahun ditandatangani", "description": "Non-Disclosure Agreement 5 tahun", "isCritical": true },
      { "id": "K3", "label": "SBOM (Software Bill of Materials) tersedia", "description": "Daftar komponen software diserahkan", "isCritical": false },
      { "id": "K4", "label": "Bersedia source code escrow", "description": "Source code di-escrow pihak ketiga", "isCritical": false },
      { "id": "K5", "label": "Bersedia diaudit kapan saja", "description": "Bersedia audit eksternal kapanpun", "isCritical": false },
      { "id": "K6", "label": "Menyetujui matriks penalti", "description": "Setuju klausul penalti", "isCritical": false }
    ]
  }
]
