Semua perubahan penting proyek ini. Format: Keep a Changelog,
versi mengikuti SemVer. Rilis publik pertama 0.1.0 (2026-07-21) — repo publik, Apache-2.0, unpackaged (bukan npm publish; G-59).
Riwayat lengkap per-sesi ada di
docs/CONTEXT.md+ git log; CHANGELOG ini mulai dari M5.
- Upgrade ESLint 9→10 + @typescript-eslint 8.47→8.65. Fix
npm audit10 high (brace-expansion DoS, GHSA-mh99-v99m-4gvg).eslint9.39.1→10.8.0,@eslint/js9.39.1→10.0.1,@typescript-eslint/eslint-plugin+parser8.47.0→8.65.0. 4 castas unknown as () => unknowndihapus dari test (lint ruleno-unnecessary-type-assertionbaru). - Fix
npm audit2 high baru (terpisah dari fix eslint di atas).brace-expansion5.0.8→5.0.9 (via eslint→minimatch, GHSA-rgw5-rvv9-x895) +nanoid3.3.16→3.3.18 (via vitest→vite→postcss, GHSA-2v37-7h3g-55p8) — keduanya dev-only transitive, tak masukdist/runtime.npm audit fix, hanyapackage-lock.jsonberubah.
DEFAULT_CONTEXT_WINDOWWeb UI usang → persentase context >100% (I-38).src/web/transcript.tssebelumnya menghardcode 200K sebagai penyebut context-window untuk semua model — Opus/Sonnet/Fable 5, Opus 4.6-4.8, Sonnet 4.6 sebenarnya 1M, jadi progress barpage.tsmentok merah permanen begitu penggunaan tembus 200K. Fix: petaMODEL_CONTEXT_WINDOWS(prefix raw model id → window),contextWindowSize/contextPctkininumber | null— model tak dikenal (mis. transcript non-Anthropicdeepseek-v4-pro/gpt-5.6-luna-pro/glm-5.2) menampilkan token count saja tanpa bar, bukan mengarang penyebut. Nol field baru ke/api/status(T-W1 utuh).- Output PTY nabrak/berhimpitan di Windows (I-37, G-67). Saat isi bergulir, potongan teks lama tertinggal di kiri dan terbaca seolah bagian dari baris baru; hilang saat terminal di-resize. Penyebab: ConPTY bawaan OS bukan passthrough seperti PTY POSIX — ia merender ulang ke buffer internalnya lalu memancarkan selisih, dan model layarnya meleset saat TUI ber-render-diferensial (Ink/Claude Code) berjalan di terminal yang sudah terpakai. Fix:
useConptyDll: truepadapty.spawn()(Windows saja) — memakaiconpty.dlltim Windows Terminal yang dibundel node-pty 1.1.0. Linux tak terpengaruh (opsi diabaikan di POSIX). Escape hatchACCA_PTY_CONPTY_DLL=0mengembalikan ConPTY in-box tanpa rebuild. - Grace window post-unlatch 5s→120s (G-37). Live-verify
#hnce(25 Jul): CC TUI repaint banner limit lama @T+9s pasca-inject memicu LIMIT_HIT palsu kedua → double-trigger continue. Grace window 5s awal tidak cukup; 120s menutup kasus ini (bukti#hnce@9s) dan#z36i(16 Jul, @157s). Hook StopFailure (deteksi PRIMER) TIDAK disuppress.
- Web UI enrichment — card layout + context window CC.
acca webkini menampilkan card per sesi dengan: model name, context window (token count + progress bar warna threshold), status badge, reset countdown di usage. Data context window dibaca dari transcript JSONL CC (modul barusrc/web/transcript.ts, path encoding G-34). Semua derived values (bukan path/secret) — T-W1 utuh. Progress bar DOM berwarna: hijau <70%, kuning 70-90%, merah ≥90%.
Rilis publik pertama. Repo di-flip ke publik + private vulnerability reporting aktif + tag/Release v0.1.0 dari commit ber-CI-hijau f30e915 (target main). Menutup P-1. Isi rilis = seluruh entri di bawah (M1–M5 + M-web + kesiapan publik Apache-2.0/CI/SECURITY + remediasi PII G-61).
- Persiapan repo publik — berkas komunitas + metadata (demo-only posture).
CONTRIBUTING.md: menyatakan repo = artefak demonstrasi solo/non-komersial yang tidak menerima PR eksternal rutin (fork & pakai-ulang Apache 2.0 dipersilakan; keamanan →SECURITY.md; tracker kerja internal =docs/ISSUES.md, bukan GitHub Issues).package.json: tambah fieldrepository(URL git kanonik) +keywords(discoverability);bugssengaja dikosongkan (tak ada public bug tracker — keamanan lewat PVR). Reading-guide 1-baris di headerdocs/CONTEXT.md&docs/ISSUES.mduntuk mengarahkan pengunjung pertama ke README/PROJECT (doc-doc itu = jurnal/tracker internal padat jargon). Sapuan akhir kerahasiaan pra-flip: metadata commit author/committer diverifikasi 100% noreply (cek manualgit log --all --format='%ae %ce', gate file-based tak menjangkaunya — G-61). - README:
## English summary+## Metodologi doc-first— entry point berbahasa Inggris (apa itu acca, tiga constraint desain, status pra-rilis, pointer ke SECURITY/LICENSE/DECISIONS) + disclaimer non-afiliasi dengan Anthropic/Google, karena acca mengemudikan CLI milik dua vendor itu. Section metodologi menjelaskan repo ini sebagai artefak demonstrasi doc-first (ADR immutable, GOTCHAS, threat-model ter-gate, CONTEXT per sesi,.claude/skills/sengaja publik) berikut ongkosnya yang jujur (docs > kode). - CI GitHub Actions lintas-OS —
.github/workflows/ci.yml:npm ci+npm run checkdi matrixubuntu-latest+windows-latest(Node dari.nvmrc),permissions: contents: read, concurrency cancel-in-progress. Action dipin ke SHA 40-hex (bukan tag mutable) sebagai kontrol supply-chain. Gate artefak kelas I-34:test/ci-workflow.test.tsmemverifikasi pinning SHA, cakupan matrix dua-OS,npm run checkterpanggil, dan least-privilege — supaya klaim lintas-OS proyek benar-benar dieksekusi, bukan sekadar diklaim di docs. SECURITY.md— kanal disclosure (GitHub private vulnerability reporting; bukan issue publik), pernyataan jujur best-effort tanpa SLA, model kepercayaan (kredensial dibaca read-only, spawn CLI via PTY, state SQLite lokal, listener loopback hanya saatacca web, egress whitelist, nol telemetry, injection firewall ADR-013 + human-in-the-loop ADR-008), dan batasan yang diketahui & diterima (single-user desktop R-5/R-7, DACL named pipe Windows terbuka by design ADR-023/G-41,acca webtanpa auth by design ADR-028).- Lisensi repo = Apache License 2.0 (ADR-029) —
LICENSE(teks kanonik apache.org verbatim, sha256cfc7749b…,Copyright 2026 Ziffany Firdinal) +NOTICE(atribusi wajib-terdistribusi per §4(d)) + metadatapackage.json(license/author/homepage) + section READMELisensi & dukungan(tautan lab kampusmerah.com + authorziffany.firdinal.my.id). Menutup Pending "Lisensi repo" berumur M0. Apache 2.0 dipilih di atas MIT karena patent grant §3 + klausa merek §6 + mekanisme NOTICE; AGPL ditawarkan & ditolak owner (proyek non-komersial). Tanpa header copyright per-file;"private": truedipertahankan (melisensikan ≠ memutuskan publish npm). - Web UI monitor read-only (
acca web, M-web.1, ADR-028) — dashboard browser lokal (http://127.0.0.1:<port>, default 4599, envACCA_WEB_PORT) yang mirroracca status: usage bar 2 CLI, liveness daemon, tabel sesi, tail event-log, auto-refresh ~5s. Zero-dep (httpbawaan), opt-in. Keamanan (THREAT-MODEL §9, T-W1..W6): bind127.0.0.1SAJA, GET-only (405 lain), Host-guard anti-DNS-rebinding (403), proyeksi ter-firewall yang sama dgn IPC status (nolcli_session_id/cwd/rahasia — nol jalur data baru), halaman self-contained (nol aset eksternal), rendertextContent(anti-XSS). Verifikasi runtime:/api/statusfirewalled +Host: evil.com→403 + netstatLISTENING 127.0.0.1saja. Security-review gate M-web (T-W1..T-W6) LULUS PENUH 19 Jul → milestone M-web ditutup formal. Polish W-3 (19 Jul): kolomreset_at/updated_atdi tabel sesi kini human-readable (HH:MMlokal + nama hari bila >24 jam, browser-side, nol jalur data baru). acca prune— soft-archive sesi (ADR-004) — arsipkan sesi lama agaracca statustetap relevan; default sesi terminal saja (sisakan RUNNING/LIMIT_HIT),<ids>selektif (--forceutk yang dipantau),--all,--dry-run. Soft (setarchived_at, TAK hard-delete — row tetap di DB utk audit/retensi); reversible; auditsession_archived.- Brand/splash + inline badge (ADR-027) — wordmark "The Loop" (
a ( c∞c ) a) diacca/--help/--version/acca daemonstart + inline gauge di headeracca status. Gating ketat: TTY-only, hormatiNO_COLOR,--no-banner, ASCII fallback (default konservatif; Windows legacy → ASCII), zero-dep (helper ANSI, bukan chalk/kleur). - Deploy sebagai service Linux (M5.4) —
deploy/linux/acca-daemon.service(systemd--user) +scripts/install-linux.sh/scripts/uninstall-linux.sh(render placeholder → path absolut,enable --now+loginctl enable-linger; uninstall round-trip LIVE-verified). LIVE-verified di Ubuntu (systemd 255): install→active, auto-restart on-crash <30s, survive logout + reboot auto-start, same-DB dengan CLI (kontras I-33), recovery job pending pasca-reboot (AC-M5-3). - Backup/DR minimal (M5.1/M5.2) — engine
backupDatabase(SQLite online backup APIdb.backup+ integrity_check + prune tiered GFS-lite 24 hourly/30 daily, ADR-024);scripts/backup.js; template systemd backup + Windows Task Scheduler; dokumentasi restore. Restore LIVE-verified (M5.6): backup→marker→restore→revert terbukti +integrity_check: ok+ daemon start bersih (T-L6 tutup). - Monitor proaktif "mendekati limit" (I-8/I-17) — loop probe usage periodik saat sesi RUNNING (
usage-monitor.ts, wired diacca daemon, interval ~2mnt) → cache snapshot utkacca status+ notifikasi proximity (default 90% 5-jam / 75% mingguan, meniru Claude Code). Dedup rising-edge (createProximityGate) → notif hanya saat window BARU melewati ambang, bukan tiap tick. - Deploy sebagai service Windows (M5.5, ADR-026) — autostart per-user via Task Scheduler trigger "At log on" (
deploy/windows/acca-daemon.task.xml+scripts/install-windows.ps1/uninstall-windows.ps1); jalan sebagai user login →acca.db& kredensial CC/agy sama (menyelesaikan I-33 by construction, bukan Windows Service/LocalSystem). Crash-recovery = watchdog repetisi (Repetition PT1M+IgnoreNew, ~65s); nol jendela konsol viaconhost.exe --headless;ExecutionTimeLimit=PT0S. LIVE-verified di Win 11 (2× logout/login owner): @logon auto-start, daemon=user (bukan SYSTEM), same-DB, watchdog restart, nol tampilan terminal (G-49/G-50/G-52). - Gate artefak shippable lintas-OS (I-34) —
test/systemd-unit.test.ts,test/shell-script.test.ts,test/ps1-encoding.test.ts,test/task-scheduler-xml.test.ts: tiap.service/.timer/.sh/.ps1/Task-Scheduler-XML divalidasi (struktur/render/encoding/---in-comment), bukan sekadar dibaca reviewer. Kelas I-34 kini tertutup untuk SEMUA artefak deploy. - Security pass 5-permukaan (M5.3) — data-minimize IPC
status(T-L1), + suitetest/security-*.test.ts(injection firewall wire-level, credential-read, egress whitelist, audit append-only). THREAT-MODEL §8.
acca helpregresi "too many arguments" (G-58) — slice banner memasangprogram.action()di root commander →acca help/subcommand di-parse sbg argumen berlebih. Fix:buildProgram()diekstrak kesrc/cli/program.ts, bare-acca(splash+help) ditangani sebelum parse viaprocess.argv. Guard regresitest/cli-dispatch.test.ts(exitOverride).- Auto-resume sesi "limit lalu exit bersih" (D-1/RD-1 Opsi A, audit keempat 18 Jul) —
markExitedtak lagi meng-clobberLIMIT_HIT→EXITED(status hanya transisi dariRUNNING; semantik =markOrphanExited). Sesi yang kena limit lalu ditutup bersih (Ctrl-C/quit) kini tetap di-resume-by-id otomatis direset_at— regresi senyap dari interaksi guard I-35 (17 Jul) yang membuat jalur agy-exited (ADR-019) praktis tak terjangkau. +5 test (3 unit + 2 komposisi lifecycle), negative control terbukti. - Audit-trail probe agy sesi-hidup jujur soal kebasian (C-5/RC-5, audit ketiga) — event keputusan probe untuk sesi agy
alive(usage_available_enqueue_resume/still_limited) kini menyertakanreason:'ls_snapshot_stale'(probe LS agy sesi-hidup = snapshot beku launch-time, G-35 — bukan real-time). Perilaku tak berubah (self-correcting via inject→detect); hanya audit-trail yang berhenti menyesatkan. Opsi optimistic-resume penuh (spt agy-exited) ditolak: meng-inject sesi agy live-mungkin-masih-limit = jalur belum di-live-verify. - Notifikasi limit asli hasil konfirmasi
verify(D-2/RD-2) — latch via jobverifykini menulisstatus_change {to:LIMIT_HIT, source:verify}→ user dinotifikasi (AC-5) + audit-trail transisi konsisten di semua jalur latch. Sebelumnya satu-satunya jalur latch yang bisu.
- PII: alamat email pribadi dihapus dari metadata 25 commit (G-61) — sapuan privasi pra-publik menemukan email owner di field author+committer; audit sebelumnya melewatkannya karena hanya memindai isi file (
git grepmembaca blob, tak pernah header commit). Diremediasigit filter-repo --mailmap→ seluruh history memakai@users.noreply.github.com; tree hashHEADlama == baru (terbukti hanya metadata berubah, nol perubahan isi). Gate pencegah ditest/ci-workflow.test.ts: nol alamat email di domain pribadi owner pada file tracked (URL situs tetap boleh — atribusi ADR-029), diverifikasi dgn negative-control. Batasnya ditulis eksplisit: metadata commit tak terjangkau gate file-based → cek manualgit log --all --format='%ae'. - Egress allowlist dipersempit —
api.telegram.orgDIHAPUS (D-4/RD-4, audit keempat 18 Jul) — host tanpa konsumen produksi (M-remote ditunda tak-tentu) dibuang dariALLOWED_HOSTS(shared/http.ts); least-privilege, preseden persis ADR-019. Dikembalikan saat slice M-remote (ADR-011) benar-benar dibangun. Test egress + NFR §Security disesuaikan.
engines.node:">=24 <25"→">=24"— batas atas memblokir install di Node 25+ tanpa alasan teknis; menjelang repo publik itu menolak calon pengguna secara sia-sia..nvmrc(24.18.0) tetap jadi versi acuan dev + CI.- Build: script
prepare(→npm run build) +typescriptdipindah kedependencies—npm installpolos (setelahgit clonemanual) kini auto-builddist/, tak perlu langkahnpm run buildterpisah lagi untuk pemasangan baru. Dipicu oleh kebutuhan instalasi lintas-mesin: shortcutnpm install -g git+https://…diuji langsung dan tidak andal (bug npm — lifecyclepreparere-run tanpanode_modules/.bindi salah satu jalur reify →tsc: not found); metode resmi tetapgit clonemanual +npm install+npm link(teruji end-to-end dari clone segar). Didokumentasikan di README §"Mesin baru, belum ada clone". - Engine backup → SQLite online backup API (I-32) —
backupDatabasekini async (db.backup), concurrency-safe by design: menghapus racewal_checkpoint+copyFileSyncyang bisa hasilkan salinan half-written saat daemon menulis konkuren. Caller (scripts/backup.js) pakai top-level await. - Deteksi limit CC dari OUTPUT dikorroborasi snapshot usage (I-35) — sinyal
source:'output'CC di-suppress bila kuota jelas longgar (≥0.85 free, snapshot ≤5mnt) → firewall ADR-013 menguat; hookStopFailurebypass. Jaring FN aktif (jobkind:'verify', migrasi 0003): suppress kini menjadwalkan probe verifikasi susulan (~2,5mnt) → kuota ternyata habis (snapshot basi menutupi limit asli) = latch (mesin reset/probe normal ambil alih, tak langsung resume); kuota tersedia = FP terkonfirmasi (no-op). Dedup satu verify per-episode (hasPendingKind) — prosa multi-literal tak memicu storm probe. - Gate higiene: frasa kanonik pesan limit dilarang di repo di luar
test/fixtures/**(test/no-canonical-limit-literals.test.ts, I-36).
- Windows Service via WinSW (ADR-025) — di-demote jadi opsi host non-laptop selalu-login (tetap ter-blok I-33 utk kasus itu). MVP Windows pakai autostart per-user (ADR-026, lihat Added). Pin WinSW dorman-tapi-sah bila dibuka lagi.
- Always-on lintas-logout / at-boot-pra-login di Windows — TIDAK didukung (autostart logon-scoped, ADR-026/ADR-007, direlakan utk profil laptop). Always-on sejati = Linux systemd
--user+ linger.
- Runtime least-privilege (T-L7, Linux): daemon jalan sebagai user, bukan root; install pun user-scope (nol sudo).
- Backup/restore integritas (T-L6): restore LIVE-verified; gate security-review lokal Linux bersih (T-L1..T-L8 tutup/N/A).