VALIDASI FTMS v2.4.0 — SUBSTITUSI DAN SESI MANAJER
Tanggal: 29 September 2026

HASIL PENGUJIAN OTOMATIS
- php artisan test: 48 pengujian lulus, 796 assertions.
- Sebelum kickoff: pertukaran langsung, pertukaran kembali, penyimpanan
  formasi lengkap, tanpa request pending atau event pertandingan.
- Status ditunda sebelum kickoff tetap bebas. started_at yang sudah terisi
  mencegah perubahan langsung walaupun status diubah kembali menjadi ditunda.
- Selama laga: pengajuan tidak mengubah pemain; admin dan panitia yang
  ditugaskan dapat menyetujui, memperbarui susunan dan timeline bersama.
- Pengajuan ganda, pasangan pemain yang tidak sesuai posisi starter/cadangan,
  persetujuan oleh manajer, dan akses panitia tanpa penugasan ditolak.
- Persetujuan kedua tidak menghasilkan event kedua. Kegagalan pencatatan
  event mengembalikan susunan, event, dan status pengajuan melalui transaksi.
- Penolakan mempertahankan susunan. Penyelesaian laga menonaktifkan pending
  dan mengunci pergantian maupun penyimpanan formasi langsung.
- Event substitusi manual dan pembatalannya menjaga susunan dan riwayat
  persetujuan tetap sesuai; pembatalan dilakukan dari urutan terakhir tim.
- Login manajer terbaru mengganti sesi aktif. GET dan perubahan profil dari
  sesi lama ditolak. Token tidak ada/palsu ditolak. Login gagal tidak mencabut
  sesi benar. Logout sesi lama tidak dapat mencabut sesi baru.
- Akun manajer yang berbeda dapat aktif bersamaan. Sesi admin/panitia tetap
  dapat digunakan dari beberapa browser. Hash sesi tidak keluar pada props.
- Pengujian fitur sebelumnya, termasuk akun tim, bagan, turnamen, tema,
  Mallise Cup, hapus massal, dan papan skor, tetap lulus.

PEMERIKSAAN BROWSER
- Chromium dengan sesi browser terpisah untuk manajer/perangkat lama,
  panitia, dan manajer/perangkat baru.
- Emulasi mobile sentuh 390px: pilih cadangan dan posisi pada meja formasi,
  simpan sebelum kickoff tanpa persetujuan; pergantian terlihat tersimpan.
- Tombol Mulai milik panitia mengubah antarmuka manajer melalui polling.
- Pengajuan saat live mempertahankan pemain lama sampai tombol Setujui.
  Hasil persetujuan terlihat pada susunan dan timeline.
- Pengajuan dari halaman lapangan di mobile, serta penolakan oleh panitia,
  tidak mengganti pemain di lapangan.
- Login kedua mengarahkan perangkat pertama ke login dengan pemberitahuan.
  Endpoint sesi lama merespons 401 dan sesi terbaru tetap aktif (204).
- Drag melalui pegangan di desktop membuat pengajuan; persetujuan terlihat
  otomatis pada lapangan/meja formasi. Laga selesai mengunci kontrolnya.
- Tidak ada error JavaScript pada tujuh alur pemeriksaan browser tersebut.

BUILD DAN PEMBARUAN
- npm run build berhasil; public/build tersedia dalam paket.
- Sintaks PHP pada layanan, middleware, controller, dan migrasi baru valid.
- Migrasi tambahan berhasil diterapkan pada database pengujian proyek lama.
- ZIP tidak menyertakan vendor, node_modules, .env, database, cache hasil
  kompilasi Laravel, atau file sesi. composer.json/lock tidak menambah paket.
- Pertahankan vendor proyek sebelumnya, .env, database dan unggahan.
  Jalankan php repair-cache.php, php artisan migrate, php artisan optimize:clear.
  Manajer login ulang sesudah pembaruan. Panduan rinci: PANDUAN-UPDATE.txt.

CAKUPAN VERIFIKASI
- Backend PHP 8.3 dengan SQLite; browser Chromium desktop dan emulasi mobile.
- Belum diuji pada perangkat Android fisik atau database MySQL pengguna.
- Pembatasan berlaku pada satu sesi browser aktif per akun manajer, bukan
  identifikasi perangkat keras. Sesi lama ditolak pada permintaan berikutnya;
  halaman terlihat memeriksa setiap 5 detik dan saat kembali aktif.
