// kantor v2, yang terjadi di belakang

Di balik layar: mesin kantor v2

Satu sumber hukum di DB VPS. Sesi membaca render/, menulis lewat API dengan gerbang. Bacaan agen dan Arsiparis; Sapta membukanya bila penasaran atau macet.

hidup sejak 2 Sep 2026 render sync_seq 4070 964 node, 1070 sisi 10 lane diperbarui 2026-09-02 17:27 WIB

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.

Halv1 (sampai 1 Sep 2026)v2 (sejak 2 Sep 2026)
sumber hukummarkdown di repo kantortabel node dan sisi di Postgres, dengan gerbang
cara bacabuka berkasrender/ di folder kantor, klon baca saja dari render.git VPS
cara tulissunting markdownAPI lewat node.py dan klaim.py; hukum lewat Arsiparis
tiketClickUp sajaClickUp tetap papan, antrean DB memberi klaim, sewa, heartbeat, gerbang scope
cabangbebas, menumpuk (179 di ALX-TCG)maks 10 cabang tiket/* hidup; gabung = hapus
markdown lamaaktif_arsip-v1/, beku, baca boleh
role barunolArsiparis: satu-satunya pena untuk hukum, role, playbook, putusan, lane, pengaturan
satu kalimatLu tetap ngobrol sama role seperti biasa. Bedanya, yang mereka baca dan tulis sekarang lewat satu pintu yang punya gerbang.

Prasyarat di Mac

Empat hal. Semua sudah terpasang 2 Sep 2026; ini cara memeriksanya. Role menjalankan langkah 3 sendiri di protokol pembuka.

  1. 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
  2. ~/.kantor/env ada, chmod 600. Isinya API_URL, KANTOR_DIR, RENDER_DIR, dan TOKEN_<ROLE>. Skrip membacanya sendiri. Nol pernah cat.
    ls -l ~/.kantor/env        # -rw------- = benar
  3. 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
  4. Pemantau hidup. launchd com.ersapta.kantor.cek-vps memeriksa 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.

perintahkursimembacaboleh menulis
/ceoCEOpaket ceo, state/org, pemicu penawaranstate/org, jurnal ceo/*, usulan putusan
/pmPM semua lanepaket pm, state/* semua lane, proyek/<lane> yang dibahasstate/<lane>, jurnal pm/*, tiket: masuk, selesai, buka-ulang, matikan, putus, tutup
/it-lead <LANE>IT Leadpaket it-lead, tiket yang diklaimklaim, heartbeat, review, jurnal it-lead/*. Kerja di worktree repo project, bukan di folder kantor
/designerDesainerpaket desainer, hukum desainklaim tiket desain, review, jurnal
/salesSalespaket sales, jurnal/proof/lembar-buktisinyal pasar (POST /sinyal), jurnal sales/*
/arsiparisArsiparispaket arsiparissemua 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.

ingatRole selain Arsiparis hanya boleh menulis 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.

  1. 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.
  2. PM menulis di ClickUp. Pakai skill clickup-ops. Tugas wajib memuat Selesai bila: (min 20 karakter) dan Estimasi: <menit> (5 sampai 90). Lebih dari 90 menit = pecah.
  3. 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 45
    clickup_id adalah kunci anti dobel: kirim ulang id yang sama memperbarui, nol menggandakan.
  4. 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
  5. Bangun sampai selesai_bila terpenuhi, 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
  6. 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"
  7. PM memeriksa dan memutus. Terima, atau kembalikan dengan alasan.
    $PM tiket <id>                          # detail + riwayat
    $PM selesai <id> --catatan "..."
    $PM buka-ulang <id> --catatan "..."
  8. Gabung = hapus. Setelah selesai, PM menggabungkan cabang ke dev (ubah dengan MERGE_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
  9. 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.

kuncinilaiyang dihentikan
tugas_maks_menit90tugas di atas 90 menit ditolak saat masuk. Pecah dulu.
melar_faktor2kerja lewat 2x estimasi = MELAR. Heartbeat menjawab 409, tiket ke review.
selesai_bila_min20Selesai bila: di bawah 20 karakter ditolak. Tugas tanpa kriteria nol pernah lahir.
go_nogo_persen70epic dengan cerita selesai 70 persen ke atas dan masalah terbuka: klaim tugas epic itu tertahan sampai PM putus. Obat jebakan 30 persen.
cabang_maks10cabang tiket/* hidup 10 atau lebih di repo = klaim ditolak (PAGAR cabang). Obat 179 cabang.
rem_review_n30tiket menunggu review PM 30 atau lebih = klaim baru ditutup (REM_PRODUKSI). Produksi berhenti sampai review turun.
sewa_default_menit90klaim tanpa heartbeat 90 menit = sewa hangus, tiket kembali antre.
klaim_gagal_maks3sewa hangus ke-3 = tiket mati (dead letter). PM hidupkan bila memang perlu.
pemicu_penawaran_n10satu kebutuhan muncul 10 kali atau lebih dalam 30 hari = CEO wajib satu usulan penawaran.
tiket_minimum_usd0semua 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

gejalasebabtindakan
tailnet nol terjangkauTailscale Mac mati, atau VPS matitailscale up --timeout=20s --accept-routes; lalu cat ~/.kantor/status.json
hook: render tertinggalklon lokal di belakang VPSbash kantor-v2/mac/tarik-render.sh
401token role kosong atau salah di ~/.kantor/envminta Arsiparis menyalin ulang token dari VPS lewat pipa (nol pernah dicetak)
403role nol berhak (contoh: IT Lead memasukkan tiket)pakai kursi yang benar
422 GERBANG ...isi melanggar gerbang; pesan menyebut gerbangnyaperbaiki isinya. Gerbangnya nol diubah tanpa ketok lu
409 MELARkerja lewat 2x estimasiberhenti; tulis catatan review; PM memutus pecah atau lanjut
PAGAR cabang10 cabang tiket/* atau lebih hidup di repobash kantor-v2/antrean/sapu_cabang.sh <repo> --hapus
REM_PRODUKSI30 tiket atau lebih menunggu review PMbuka /pm, turunkan antrean review
GO_NO_GO: ...epic menunggu putusan PM$PM putus <id> --keputusan lanjut --catatan "..." (langkah 09)
SESI_SUDAH_MEMEGANGsesi ini masih memegang tiket lainreview atau lepas tiket itu dulu
container matiVPS restart atau OOMhidupkan 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.htmlsalinan 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.gitremote satu-satunya repo kantor (Stop hook mendorong otomatis). Nol GitHub
/home/ubuntu/git/render.gitsejarah render; penjadwal mendorong tiap perubahan; Mac dan situs SOP menariknya
/var/www/kantor-guide/halaman ini, statis, publik, noindex, nol skrip
backupcron 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, nol cat 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/org dan state/<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.db lama ke tabel sinyal.
  • Halaman render ringkasan sinyal_pemicu untuk 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 .env kantor v1: tangan lu, lewat dashboard tiap layanan.