Apa yang berubah
Kantor v1 hidup di markdown yang disunting tangan. Graph-nya nol konsisten, role lambat membaca. Kantor v2 memindahkan sumber hukum ke Postgres di VPS. Markdown yang lu baca sekarang adalah hasil render, bukan sumber.
| Hal | v1 (sampai 1 Sep 2026) | v2 (sejak 2 Sep 2026) |
|---|---|---|
| sumber hukum | markdown di repo kantor | tabel node dan sisi di Postgres, dengan gerbang |
| cara baca | buka berkas | render/ di folder kantor, klon baca saja dari render.git VPS |
| cara tulis | sunting markdown | API lewat node.py dan klaim.py; hukum lewat Arsiparis |
| tiket | ClickUp saja | ClickUp tetap papan, antrean DB memberi klaim, sewa, heartbeat, gerbang scope |
| cabang | bebas, menumpuk (179 di ALX-TCG) | maks 10 cabang tiket/* hidup; gabung = hapus |
| markdown lama | aktif | _arsip-v1/, beku, baca boleh |
| role baru | nol | Arsiparis: satu-satunya pena untuk hukum, role, playbook, putusan, lane, pengaturan |
Prasyarat di Mac
Empat hal. Semua sudah terpasang 2 Sep 2026; ini cara memeriksanya. Role menjalankan langkah 3 sendiri di protokol pembuka.
- Tailscale Mac nyala. API dan DB hanya terbuka di alamat tailnet. Mati = semua tulis gagal, render lokal tetap terbaca.
tailscale status | head -3 # kalau mati: tailscale up --timeout=20s --accept-routes ~/.kantor/envada, chmod 600. IsinyaAPI_URL,KANTOR_DIR,RENDER_DIR, danTOKEN_<ROLE>. Skrip membacanya sendiri. Nol pernahcat.ls -l ~/.kantor/env # -rw------- = benar- Render terbaru. Hook prompt menarik otomatis bila tertinggal. Tarik tangan kapan saja:
cd ~/Downloads/0000-ersapta-office bash kantor-v2/mac/tarik-render.sh # mencetak STEMPEL: sync_seq, node, akar, tiket - Pemantau hidup. launchd
com.ersapta.kantor.cek-vpsmemeriksa API tiap 5 menit dan menulis status.cat ~/.kantor/status.json tail -3 ~/.kantor/cek-vps.log
Membuka sesi role
Selalu dari folder kantor. Satu sesi = satu role. IT Lead dan Desainer satu sesi satu lane (lane-lock); PM satu sesi semua lane, nol lane-lock. Lane kedua = tab IT Lead baru.
cd ~/Downloads/0000-ersapta-office
claude # atau codex; keduanya membaca aturan yang sama (CLAUDE.md, AGENTS.md)
Lalu panggil kursinya. Tiap role menjalankan protokol pembuka sendiri: tarik render, baca render/akar/<akar>/PAKET.md, klaim tiket bila role produksi.
| perintah | kursi | membaca | boleh menulis |
|---|---|---|---|
| /ceo | CEO | paket ceo, state/org, pemicu penawaran | state/org, jurnal ceo/*, usulan putusan |
| /pm | PM semua lane | paket pm, state/* semua lane, proyek/<lane> yang dibahas | state/<lane>, jurnal pm/*, tiket: masuk, selesai, buka-ulang, matikan, putus, tutup |
| /it-lead <LANE> | IT Lead | paket it-lead, tiket yang diklaim | klaim, heartbeat, review, jurnal it-lead/*. Kerja di worktree repo project, bukan di folder kantor |
| /designer | Desainer | paket desainer, hukum desain | klaim tiket desain, review, jurnal |
| /sales | Sales | paket sales, jurnal/proof/lembar-bukti | sinyal pasar (POST /sinyal), jurnal sales/* |
| /arsiparis | Arsiparis | paket arsiparis | semua node: hukum, role, playbook, putusan, lane baru, pengaturan (hanya dengan ketok lu) |
Lane sah (10): CS, HP, ALX-TCG, ASF, BIP-ERP, WSMPP, CPP, DLPP, YETPP, RAACEPP. Di luar itu ditolak. Lane baru lewat Arsiparis.
state dan jurnal. Kalau sebuah sesi ingin mengubah hukum, dia menulis USULAN HUKUM: di jurnalnya dan lu buka /arsiparis.Alur satu tiket, ujung ke ujung
Perintah di bawah dijalankan role (PM, IT Lead), bukan Sapta. Jalur ini menutup jebakan 30 persen dan kasus 179 cabang: kriteria selesai sebelum kode, ukuran tugas dibatasi, cabang hilang saat masuk.
- Lu lempar kebutuhan mentah ke
/pm, sebut lane-nya. PM memperkecil scope: SoW, FRD, EPIC, Cerita, Tugas. Kriteria terima milestone ditulis SEBELUM bangun. Kriteria itu yang lu bawa ke klien sampai align. - PM menulis di ClickUp. Pakai skill
clickup-ops. Tugas wajib memuatSelesai bila:(min 20 karakter) danEstimasi: <menit>(5 sampai 90). Lebih dari 90 menit = pecah. - PM memasukkan ke antrean. Urutan wajib epic, cerita, tugas. Tugas tanpa cerita induk ditolak. Contoh lane CS:
PM="python3 kantor-v2/antrean/klaim.py --role pm" $PM masuk --clickup-id <id epic> --lane CS --judul "..." --jenis epic $PM masuk --clickup-id <id cerita> --lane CS --judul "..." --jenis cerita \ --induk-clickup <id epic> --selesai-bila "..." \ --uraian "Sebagai ..., gue bisa ..., sehingga ..." $PM masuk --clickup-id <id tugas> --lane CS --judul "..." --jenis tugas \ --induk-clickup <id cerita> --selesai-bila "..." --estimasi 45clickup_idadalah kunci anti dobel: kirim ulang id yang sama memperbarui, nol menggandakan. - Tab baru:
/it-lead <LANE>. IT Lead klaim dari repo project (bukan folder kantor). Satu sesi memegang satu tiket.cd ~/path/repo-project IT="python3 ~/Downloads/0000-ersapta-office/kantor-v2/antrean/klaim.py --role it_lead" $IT klaim --lane CS --repo . # keluaran: id, sesi, worktree, cabang, selesai_bila, estimasi_menit, langkah export KANTOR_SESI=<sesi dari keluaran> git worktree add ../CS-working-space-<id> -b tiket/<id> echo <id> > ../CS-working-space-<id>/.tiket - Bangun sampai
selesai_bilaterpenuhi, nol lebih. Hal di luar itu = satu baris tanya di catatan review, nol kode. Heartbeat tiap maks 30 menit.$IT heartbeat <id> # 409 MELAR = kerja lewat 2x estimasi; tiket otomatis ke review; berhenti, tulis catatan - IT Lead menyerahkan ke review. Catatan wajib memuat bukti uji. Lalu tulis jurnal
it-lead/<tanggal>-<id>.$IT review <id> --catatan "apa yang diuji, di mana, hasilnya" - PM memeriksa dan memutus. Terima, atau kembalikan dengan alasan.
$PM tiket <id> # detail + riwayat $PM selesai <id> --catatan "..." $PM buka-ulang <id> --catatan "..." - Gabung = hapus. Setelah
selesai, PM menggabungkan cabang kedev(ubah denganMERGE_TARGET=main). Cabang dan worktree lenyap dalam perintah yang sama.bash kantor-v2/antrean/gabung.sh <repo> <id> origin bash kantor-v2/antrean/sapu_cabang.sh <repo> # laporan harian bash kantor-v2/antrean/sapu_cabang.sh <repo> --hapus # eksekusi - Tutup cerita dan epic. Semua anak selesai, PM menutup induknya dengan bukti kriteria diperiksa. Epic yang 70 persen ceritanya selesai tapi masih ada masalah terbuka menunggu putusan PM sebelum tugas berikutnya boleh diklaim.
$PM tutup <id cerita> --catatan "Selesai bila diperiksa: ..." $PM epik --lane CS --putuskan $PM putus <id epic> --keputusan rilis_sebagian --catatan "Plan B: ..." # keputusan: lanjut | rilis_sebagian | potong | nego_waktu
Angka gerbang
Semua hidup di tabel pengaturan. Berubah hanya dengan ketok lu tertulis, satu UPDATE oleh Arsiparis, dicatat di jurnal. Nol ada di kode.
| kunci | nilai | yang dihentikan |
|---|---|---|
| tugas_maks_menit | 90 | tugas di atas 90 menit ditolak saat masuk. Pecah dulu. |
| melar_faktor | 2 | kerja lewat 2x estimasi = MELAR. Heartbeat menjawab 409, tiket ke review. |
| selesai_bila_min | 20 | Selesai bila: di bawah 20 karakter ditolak. Tugas tanpa kriteria nol pernah lahir. |
| go_nogo_persen | 70 | epic dengan cerita selesai 70 persen ke atas dan masalah terbuka: klaim tugas epic itu tertahan sampai PM putus. Obat jebakan 30 persen. |
| cabang_maks | 10 | cabang tiket/* hidup 10 atau lebih di repo = klaim ditolak (PAGAR cabang). Obat 179 cabang. |
| rem_review_n | 30 | tiket menunggu review PM 30 atau lebih = klaim baru ditutup (REM_PRODUKSI). Produksi berhenti sampai review turun. |
| sewa_default_menit | 90 | klaim tanpa heartbeat 90 menit = sewa hangus, tiket kembali antre. |
| klaim_gagal_maks | 3 | sewa hangus ke-3 = tiket mati (dead letter). PM hidupkan bila memang perlu. |
| pemicu_penawaran_n | 10 | satu kebutuhan muncul 10 kali atau lebih dalam 30 hari = CEO wajib satu usulan penawaran. |
| tiket_minimum_usd | 0 | semua penawaran dihitung; fixed price diberi bobot lewat kolom jumlah_fixed. |
Membaca kantor tanpa sesi
Render adalah markdown biasa. Buka pakai editor apa pun, baca saja.
~/Downloads/0000-ersapta-office/render/
INDEKS.md # daftar semua node per jenis
STEMPEL # sync_seq, node, akar, tiket
akar/<akar>/PAKET.md # bacaan wajib tiap role: pm, it-lead, desainer, ceo, sales, arsiparis, arsip
node/<jenis>/<slug>.md # jenis: hukum, role, playbook, proyek, state, jurnal, putusan, kamus, templat
node/<jenis>/<slug>/ # bagian-bagian node panjang (contoh: node/proyek/cs/00-pembuka/01-....md)
grep -rn "kata kunci" ~/Downloads/0000-ersapta-office/render/node/
python3 kantor-v2/mac/node.py --role ceo cari --q gotchas --jenis hukum
python3 kantor-v2/mac/node.py --role ceo baca state/org
- Situs SOP di tailnet (alamat lama yang sudah lu bookmark) kini dibangun dari
render.git. Perubahan render tampil paling lama 10 menit kemudian. Hanya terbuka saat Tailscale nyala. - Markdown v1 utuh di
~/Downloads/0000-ersapta-office/_arsip-v1/. Beku. Kalau ada yang masih lu butuhkan dari sana, minta Arsiparis memindahkannya jadi node. - Menyunting berkas di
render/percuma: hook menolak, dan render berikutnya menimpanya.
Kalau macet
| gejala | sebab | tindakan |
|---|---|---|
| tailnet nol terjangkau | Tailscale Mac mati, atau VPS mati | tailscale up --timeout=20s --accept-routes; lalu cat ~/.kantor/status.json |
| hook: render tertinggal | klon lokal di belakang VPS | bash kantor-v2/mac/tarik-render.sh |
| 401 | token role kosong atau salah di ~/.kantor/env | minta Arsiparis menyalin ulang token dari VPS lewat pipa (nol pernah dicetak) |
| 403 | role nol berhak (contoh: IT Lead memasukkan tiket) | pakai kursi yang benar |
| 422 GERBANG ... | isi melanggar gerbang; pesan menyebut gerbangnya | perbaiki isinya. Gerbangnya nol diubah tanpa ketok lu |
| 409 MELAR | kerja lewat 2x estimasi | berhenti; tulis catatan review; PM memutus pecah atau lanjut |
| PAGAR cabang | 10 cabang tiket/* atau lebih hidup di repo | bash kantor-v2/antrean/sapu_cabang.sh <repo> --hapus |
| REM_PRODUKSI | 30 tiket atau lebih menunggu review PM | buka /pm, turunkan antrean review |
| GO_NO_GO: ... | epic menunggu putusan PM | $PM putus <id> --keputusan lanjut --catatan "..." (langkah 09) |
| SESI_SUDAH_MEMEGANG | sesi ini masih memegang tiket lain | review atau lepas tiket itu dulu |
| container mati | VPS restart atau OOM | hidupkan lagi lewat compose; baris terakhir di blok bawah |
Cek kesehatan langsung (alamat dibaca dari env, nol ditulis di sini):
set -a; . ~/.kantor/env; set +a
curl -s "$API_URL/sehat" # ok, postgres, falkordb, kepala, stempel, tertinggal, render_terakhir
ssh portfolio-vps 'cd /home/ubuntu/kantor/prasyarat/vps && docker compose --env-file .env ps'
ssh portfolio-vps 'cd /home/ubuntu/kantor/prasyarat/vps && docker compose --env-file .env up -d' # hidupkan lagi yang mati
Peta tempat
Mac
| ~/Downloads/0000-ersapta-office/ | kantor. CLAUDE.md, AGENTS.md, .claude/skills/ (cermin di .agents/skills/), kantor-v2/ runtime, render/ baca saja, _arsip-v1/ beku, scripts/ lama yang masih dipakai |
| ~/.kantor/ | env (rahasia, chmod 600), status.json, cek-vps.log, cek_vps.py (di sini karena launchd nol boleh membaca Downloads) |
| ~/Downloads/ersapta-private-project/ersapta-council/draft/prasyarat/ | kode server: db/, api/, antrean/, mac/, migrasi/, vps/, guide/ (halaman ini). Pena Arsiparis, mulai dari MULAI-ARSIPARIS.md |
| ~/Downloads/0000-ersapta-office/KANTOR-GUIDE.html | salinan lokal halaman ini, terbuka tanpa internet |
VPS (ssh portfolio-vps)
| /home/ubuntu/kantor/prasyarat/ | kode terpasang; vps/.env rahasia chmod 600; compose project kantor: postgres, falkordb, api, penjadwal. Port hanya di alamat tailnet |
| /home/ubuntu/git/office.git | remote satu-satunya repo kantor (Stop hook mendorong otomatis). Nol GitHub |
| /home/ubuntu/git/render.git | sejarah render; penjadwal mendorong tiap perubahan; Mac dan situs SOP menariknya |
| /var/www/kantor-guide/ | halaman ini, statis, publik, noindex, nol skrip |
| backup | cron 03:20 tiap hari: dump Postgres, salinan render.git |
Hukum yang tetap
- Bahasa Indonesia kasual (gue/lu). Dilarang em dash, en dash, arrow chain. Commit bersih tanpa AI attribution.
- Nol push ke GitHub untuk data kantor. Remote hanya bare repo di VPS.
- Rahasia: nol
cat .env, nolcat akun-test/*, nol nilai kredensial di node, jurnal, tiket, transkrip, atau halaman ini. - Fitur Artifact dan layanan publish luar HARAM untuk materi org. Deliverable = berkas lokal.
- Docker lokal di MacBook dilarang. Container hidup di VPS.
render/dan_arsip-v1/baca saja. Hukum berubah hanya lewat Arsiparis dengan ketok lu.- Angka volatile (cash, pipeline) di Notion dan ClickUp. Pengecualian:
state/orgdanstate/<lane>, maks 8000 karakter, suntikan ke prompt maks 2 KB. - Klaim pengalaman untuk proposal hanya dari
jurnal/proof/lembar-bukti.
Belum hidup (jujur)
Terdaftar sebagai pekerjaan rawat Arsiparis di MULAI-ARSIPARIS.md. Kantor sudah bisa dipakai tanpa semuanya.
- Relay ClickUp ke antrean lewat n8n + HMAC. Sampai hidup, PM memakai
klaim.py --role pm masuk. Saat hidup, perintah itu tetap sah. login.py: login Playwright ke akun klien tanpa sandi lewat argumen.- Impor
upwork.dblama ke tabelsinyal. - Halaman render ringkasan
sinyal_pemicuuntuk CEO tanpa API. - Digest transkrip dari hook kantor ke DB.
- Empat paket akar di atas 60000 karakter (ceo, sales, it-lead, desainer). Hanya peringatan; dipecah dengan mengubah rujukan panjang jadi
merujuk. - Putar ulang 11 kunci layanan
.envkantor v1: tangan lu, lewat dashboard tiap layanan.