proitlab
81ec6bdfe7
V40-V43: band umur vote (BARU/VALID/KADALUARSA, scan simpan semua umur) → REVOTE = VALID langsung (V42) → tag mint 1-hari + badge VOTE ULANG SEGERA (V43) ; klaim recovery jendela lewat + parse respons dict rows (B7/B8) ; backend mysql test_mariadb ; oracle test_dashboard/distribute/get_voters/mariadb ; images web/scan/dist/claim rebuild + push
2026-08-07 12:07:34 +07:00
proitlab
af9a0291b9
banner BERITA: sembunyikan baris SETIAP SABTU saat event berikutnya = first-run (17 Agt) — hanya tampil utk putaran mingguan
2026-08-06 21:44:19 +07:00
proitlab
192e27aff3
first run distribusi baked 17 Agt 2026 (config default + loop via config + compose) ; saldo liquid pindah paling kiri ; empty-state history jadi BELUM ADA DISTRIBUSI
2026-08-06 21:35:19 +07:00
proitlab
2f1f19c435
jadwal distribusi mingguan + banner BERITA jadwal berikutnya di dashboard (V37/V38, T43/T44)
2026-08-06 19:05:03 +07:00
proitlab
b1e6e93796
klaim reward BP harian (claim service V32-V34) + kill-switch DISTRIBUTE_ENABLED (V35) + Telegram dua kanal komunitas/internal (V30/V36) + placement web/scan/dist/claim != server2U
2026-08-06 06:30:19 +07:00
proitlab
d3a0e768a0
spec: fix §I /api/search hasil tambah total_reward; §C lib += pyntelope
2026-08-06 05:42:13 +07:00
proitlab
0b1749a062
backprop §B.4 + §V.31: image dist ⊥ bawa modul yang diimpor → ModuleNotFoundError (oracle test_images.py)
2026-08-06 05:36:24 +07:00
proitlab
025f46d399
distribusi: notifikasi Telegram mulai/selesai/gagal (telegram.py, V30)
2026-08-06 05:30:22 +07:00
proitlab
397e20ec3a
spec: T25 x — service distribute (Dockerfile.dist + distribute_loop.py, key via bind NFS config.env:/app/.env:ro)
2026-08-05 22:38:13 +07:00
proitlab
83e294dec8
stack: distribute baca VEX_BP_PRIVATE_KEY dari bind NFS config.env:/app/.env:ro (bukan interpolasi)
2026-08-05 22:34:30 +07:00
proitlab
4e02701887
stack: service distribute (Dockerfile.dist + distribute_loop.py, harian DISTRIBUTE_HOUR)
2026-08-05 22:22:24 +07:00
proitlab
f77681793f
history: grid pay-list desktop 200/200/120 + TXID fleksibel, tablet 180/180/110, ?v=8
2026-08-05 21:16:18 +07:00
proitlab
d30dd8b292
history: TXID pay-list kolom diukur (460px), ?v=7
2026-08-05 21:05:42 +07:00
proitlab
3ad5eb32d2
dashboard: kolom TOTAL REWARD per pemilih + TXID jadi link explorer
2026-08-05 20:56:28 +07:00
proitlab
344de409cd
history: payments hanya run terbaru, TANGGAL pindah ke judul, MEMO dihapus (DB+UI)
2026-08-05 20:37:50 +07:00
proitlab
a3251eebc4
dashboard: kolom AKUN/STAKE/VOTE sama lebar di desktop
2026-08-05 19:58:35 +07:00
proitlab
e4fa6bf1dc
dashboard: seimbangkan kolom dan responsifkan riwayat
2026-08-05 17:28:38 +07:00
proitlab
9a269e224c
tata letak: kolom STAKE (VEX) rata tengah
2026-08-05 16:57:08 +07:00
proitlab
8ab8001b34
T19-T28: distribusi profit harian (distribute.py, /history, tests)
2026-08-05 16:07:36 +07:00
proitlab
656f26085f
T18: stack swarm docker — image web+scan, scan_loop.py, mariadb bind-mount server5.saltis.id
...
- Dockerfile (web) + Dockerfile.scan (scan; sertakan tzdata) + .dockerignore
- scan_loop.py: jadwal skan SCAN_HOURS (0,8,16 lokal via TZ) + skan-awal SCAN_RUN_ON_START; loop tak keluar; tunggu DB siap
- docker-compose.yml → STACK SWARM produksi (mariadb bind mount /data/db/mariadb/databisnisid/data + placement node.hostname == server5.saltis.id; web :5000; scan); image dari registry git.proit.id/proitlab/databisnisid-{web,scan}
- docker-compose.dev.yml: mariadb uji lokal (127.0.0.1:3306) — pengganti docker-compose.yml lama
- SPEC.md §V18/T18; AGENTS.md runbook swarm + dev compose
- .env.example: TZ/SCAN_HOURS/SCAN_RUN_ON_START/MARIADB_*
2026-08-05 14:26:29 +07:00
proitlab
fdb5d0de15
T17: backend penyimpanan bersama db.py (sqlite | mysql via PyMySQL)
...
- db.py: abstraksi connect/query/queryone/replace_snapshot; %s → ? utk sqlite;
replace snapshot mysql = CREATE IF NOT EXISTS + DELETE + INSERT (MVCC)
- config/.env.example: VEX_DB_BACKEND (default sqlite) + VEX_DB_HOST/PORT/USER/PASS/NAME
- get_voters.persist → db.replace_snapshot; dashboard baca via db.query
- LIKE pakai ESCAPE '!' (backslash memutus literal string MySQL, B2);
db.query selalu kembalikan list (PyMySQL tuple vs sqlite list, B3)
- docker-compose.yml: kontainer uji mariadb:11 (databisnisid-mariadb, 127.0.0.1:3306)
- test_mariadb.py: suite integrasi opt-in (skip bila bukan mysql)
- SPEC.md §V17/T17/B2/B3; AGENTS.md runbook
2026-08-05 12:41:17 +07:00
proitlab
063fb5e5eb
run.sh: launcher gunicorn mudah (foreground, $@ passthrough)
...
./run.sh = ./venv/bin/gunicorn -c gunicorn.conf.py dashboard:app dari
cwd mana pun. Peringatan bila venv belum siap. AGENTS.md diperbarui.
2026-08-05 10:46:45 +07:00
proitlab
f0fc4715a1
T16: saldo liquid akun BP di dashboard (API databisnis + cache TTL)
...
Sel stat SALDO LIQUID menampilkan account.core_liquid_balance dari
GET {DATABISNIS_API}/v2/state/get_account. Cache in-memory per worker
selama DASH_LIQUID_TTL (60s); gagal fetch → nilai lama (atau '—' bila
belum pernah sukses) + cooldown supaya API tak dipukul berulang. Stats
grid 4 kolom desktop, 2x2 tablet. Oracle + smoke lolos.
2026-08-05 10:41:44 +07:00
proitlab
eb4f941b37
T13: klamp last_vote heuristik ke waktu scan (⊥ di masa depan)
...
Unstake tanpa revote membuat rasio bobot/stake membesar → estimasi
last_vote melewati now. normalize() kini mengklamp ke now; voters.db
dikembalikan (27 baris, MAX(last_vote) ≤ MAX(scanned_at)). Oracle lolos.
2026-08-05 10:21:45 +07:00
proitlab
41990af9af
T15: buang voter basi di scan + hapus bobot suara & UI basi di web
...
get_voters.py kini menyimpan hanya pemilih segar (last_vote tak
diketahui atau > VEX_STALE_DAYS dibuang di normalize, V13). Web
menampilkan kolom RANK/AKUN/STAKE/VOTE TERAKHIR, tanpa BOBOT SUARA,
stat VOTE BASI, penanda/ filter ?stale=1 (V15). voters.db dipangkas
336 → 42. Oracle diperbarui dan lolos.
2026-08-04 17:18:50 +07:00
proitlab
b0b3ba8ab3
T14: penanda vote basi (last_vote dari rasio bobot/stake, filter ?stale=1, VEX_STALE_DAYS)
2026-08-04 17:05:16 +07:00
proitlab
2b95be3091
T13: produksi web dengan gunicorn + WAL (gunicorn.conf.py, DASH_WORKERS, V12)
2026-08-04 16:40:16 +07:00
proitlab
0374f9f4c2
responsive: perbaikan wrap timestamp & bobot panjang di mobile
2026-08-04 16:31:08 +07:00
proitlab
205ad35c70
T9-T12: env config + live owner search + responsive (§V11, I.env, I.web)
...
- config.py: env/.env (python-dotenv), defaults = konstanta lama; get_voters & dashboard pakai config
- dashboard: ?q= server filter + /api/search JSON (substring, LIKE-escape, rank global via correlated count)
- static/app.js: debounced live search; degrades to GET ?q=
- static/style.css: input search + responsive (1024/768/480), list→kartu berlabel di mobile
- test_dashboard: search/API/rank-global/config tests; .env.example; .env gitignored
2026-08-04 16:23:26 +07:00
proitlab
0b3a86aad2
T6-T8: web dashboard spec-list (§V10, I.web, I.db)
...
- dashboard.py: Flask read-only, paged 50/page, ORDER BY staked DESC
- templates/index.html + static/style.css: DESIGN.md Bugatti austere tokens
- test_dashboard.py: oracle (ordering, paging, read-only)
- DESIGN.md style guide (was untracked)
2026-08-04 16:08:08 +07:00
proitlab
c5e30a4785
T1-T5: Python voter fetcher (§V1-9)
...
- get_voters.py: scan Vexanium voters table (vexcore), retry/paginate,
filter databisnisid single-vote + stake ≥1000 VEX, store weight verbatim,
daily-replace SQLite snapshot (owner PK, scanned_at)
- V8/V9 + test_get_voters.py (oracle, §V1-9)
- SPEC.md, AGENTS.md, requirements.txt
2026-08-04 15:56:19 +07:00