Pada tahun 2012 saya menulis [postmortem untuk Plancast](https://markmhendrickson.com/posts/a-postmortem-for-plancast/), sebuah startup yang saya geluti selama tiga tahun. Premisnya sederhana: orang-orang membuat rencana, rencana layak dibagikan, dan umpan acara mendatang dari orang-orang yang Anda percayai akan memunculkan hal-hal yang sebelumnya tidak Anda ketahui ingin Anda lakukan. Itu tidak berhasil. Bagian itu menjelaskan alasannya.

Membacanya kembali dua belas tahun kemudian, diagnosis permukaannya masih berlaku. Rencana dibuat terlalu jarang untuk mempertahankan kebiasaan makan sehari-hari. Berbagi rencana masa depan memberikan kesia-siaan yang lemah dibandingkan dengan berbagi foto. Paket sudah habis masa berlakunya, sehingga setiap konten memiliki masa simpan selama beberapa jam. Sebagian besar paket bersifat lokal secara geografis, sehingga sebagian besar paket jaringan Anda sering kali tidak relevan. Dan masalah terdalamnya: orang-orang tidak ingin mengetahui peristiwa-peristiwa yang tidak mereka undang secara pribadi. Kesadaran tanpa undangan terasa seperti pengecualian. Kebanyakan orang juga tidak ingin membagikan setiap paket ke seluruh jaringan mereka. Orang yang salah bisa muncul, atau ruangan tidak lagi bisa dikendalikan.

Apa yang saya lewatkan pada tahun 2012 adalah tidak satu pun dari masalah ini yang benar-benar merupakan masalah mekanika produk. Itu adalah masalah substrat. Substrat yang tersedia pada saat itu, sebuah feed di dalam jaringan sosial terpusat, memiliki bentuk yang salah untuk semua media tersebut. Saya mencoba merekayasa media dengan fitur. Substrat masih berada pada batas tertinggi di setiap metrik.

## Apa yang sebenarnya salah

Umpan adalah primitif yang salah untuk berbagi rencana karena:

- Umpan mengasumsikan aliran konten yang stabil. Rencana tidak datang sebagai arus.
- Siaran hadiah umpan. Rencana perlu ditujukan kepada khalayak.
- Umpan memiliki satu fungsi penciutan. Plancast memilih "yang paling cepat duluan" berdasarkan tanggal acara, feed sosial memilih "yang terbaru duluan" berdasarkan waktu postingan. Bagaimanapun, ini adalah salah satu urutan kronologis. Rencana mendapat manfaat dari banyak fungsi kueri, dan fungsi yang berguna (siapa dalam grafik kepercayaan Anda yang akan hadir, apa yang cocok pada hari Kamis ini, siapa yang ada di kota) jarang sekali merupakan jenis kronologis.
- Umpan membuat setiap konten terlihat oleh semua orang yang mengikuti Anda. Rencana memerlukan cakupan.
- Umpan memperlakukan konsumsi sebagai permukaan yang menghadap pengguna. Rencana memerlukan komposisi dengan sistem lain (kalender, RSVP, transit, cuaca).
- Umpan memusatkan mediasi. Rencana pada dasarnya ada di antara manusia.

Setelah daftar tersebut muncul, setiap kegagalan Plancast yang saya sebutkan pada tahun 2012 adalah gejala hilir. Substrat tidak dapat mengungkapkan apa sebenarnya yang diinginkan dari pembagian rencana.

## Substrat yang saya butuhkan

Substrat yang sekarang akan saya buat memiliki dua bagian, tidak ada satupun yang tersedia dalam bentuk yang dapat digunakan pada tahun 2012.

**Status yang tahan lama dan hanya dapat ditambahkan untuk agen AI pribadi.** Inilah yang saya bangun sebagai [Neotoma](https://neotoma.io). Setiap pengamatan yang dilakukan agen (kontak ditambahkan, acara RSVP, undangan dikeluarkan, kehadiran dikonfirmasi) menjadi entitas yang diketik dengan asal, batasan skema, dan riwayat yang tidak dapat diubah. Agen AI milik pengguna membaca dan menulis darinya. Tidak ada grafik sosial yang terpusat. Pengguna adalah pemilik negara.

**Jaringan buku alamat dan cakupan kepercayaan yang berdaulat.** Inilah gunanya [Darkmesh](https://github.com/markmhendrickson/darkmesh) (garpu saya dari [Anand Iyer](https://www.anandiyer.com/) yang asli). Darkmesh memungkinkan seseorang memublikasikan bagian konteksnya yang dapat dialamatkan (kontak spesifik, grup spesifik, cakupan spesifik) ke node mesh orang lain di bawah persetujuan eksplisit. Persetujuan diadakan di tepi jaringan. Agen pengirim tidak dapat memasukkan pesan ke dalam status penerima kecuali node mesh penerima telah menerima cakupan pengirim.

Agen AI pribadi berbicara satu sama lain melalui jaringan. Nyatakan bahwa mereka peduli terhadap kehidupan jangka panjang di Neotoma masing-masing pengguna. Tidak ada server pusat yang menampung rencana semua orang.

## Bagaimana misi awal menjadi dapat dilaksanakan

Promosi Plancast yang asli adalah: pertemuan kebetulan dari kesadaran bersama akan rencana. Kesalahannya adalah berpikir bahwa kesadaran bersama harus datang dari sebuah feed.

Pada substrat baru ini, nada yang sama terurai menjadi karya yang berbeda.

1. **Penyerapan acara dilakukan secara otomatis.** Agen saya sudah mengetahui acara yang telah saya RSVP di Luma, acara di kalender saya, acara di email konfirmasi dari Eventbrite atau Meetup. Ia menuliskannya ke Neotoma saya sebagai entitas `peristiwa` dengan asal. Saya tidak pernah mengetiknya di mana pun.

2. **Berbagi dilakukan dengan persetujuan dan ditangani.** Saat saya melakukan RSVP terhadap sesuatu, agen saya dapat menandai cakupan yang seharusnya mengetahui bahwa saya akan pergi. Ini bukan postingan feed. Mereka ditujukan pada pengamatan yang berjalan melalui mesh hanya ke orang-orang yang node-nya telah mengakui cakupan saya.

3. **Penemuan adalah kueri, bukan umpan.** Permukaan paling alami untuk "apa yang terjadi di dunia saya" bukanlah aliran. Ini adalah pertanyaan yang saya tanyakan kepada agen saya sendiri. *Siapa yang menurut saya akan pergi ke mana dalam dua minggu ke depan. Manakah dari peristiwa tersebut yang cocok dengan malam saya pada Kamis ini. Siapa di kota yang belum pernah saya lihat selama setahun.* Setiap kueri dihitung pada waktu pengambilan melalui Neotoma saya ditambah cakupan apa pun yang diterima mesh saya. Tidak ada pakan.

4. **Undangan adalah kelas satu.** Ini adalah bagian yang ditekankan oleh karya tahun 2012, dan bagian yang dilewati sebagian besar upaya produk.

## Bagaimana seharusnya undangan berfungsi

Plancast memang memiliki undangan eksplisit, tetapi bersifat manual. Mereka berada di atas rencana yang sudah dapat dilihat pelanggan Anda. Pakannya masih merupakan permukaan pertama. Tag, penyebutan, atau metadata yang menandai Anda memiliki bentuk yang sama: visibilitas sekitar diutamakan, dan ketukan pribadi diutamakan. Undangan yang sebenarnya seharusnya membalikkan urutan itu.

Dalam substrat ini, undangan adalah entitas yang diketik di negara bagian penerima. Kira-kira:

```
undangan
  pengirim: contact_id
  penerima: contact_id
  acara_ref: acara_id
  ruang lingkup: "1:1" | "grup_kecil" | "bersama_attending_set"
  note_to_recipient: string (wajib, tidak kosong)
  Relationship_basis: string (mengapa orang ini, mengapa peristiwa ini)
  slot_budget_used: integer (anggaran per acara)
  expired_at: stempel waktu
  conditional_on: predikat kuorum opsional
  asal: agen / sumber / stempel waktu
```

Beberapa hal mengikuti dari bentuk ini.

**Substrat menolak untuk dikirim jika mesh tidak menerima cakupan pengirim.** Hal ini mematikan undangan massal dingin dengan kecepatan mesin di satu-satunya lapisan di mana mereka dapat dimatikan: tepi jaringan.

**Anggaran undangan per acara memaksa selektivitas.** Setiap acara memiliki sejumlah kecil slot undangan yang dapat dikonfigurasi dan dapat digunakan oleh pengirim. Substrat, bukan kemauan keras, memaksakan "jangan menyiram buku alamat Anda". Ketegangan kesombongan versus selektivitas tahun 2012 menjadi parameter substrat.

**Penarikan dengan pra-izin adalah pola yang dominan.** Saat agen saya menjalankan kueri tetapnya, agen saya hanya melihat orang-orang yang agennya telah menandai saya sebagai seseorang yang akan mereka sambut di acara khusus ini. Persimpangan antara "siapa di jaringan saya yang akan hadir" dan "siapa yang akan menyambut saya di sana" jauh lebih kecil daripada "siapa di jaringan saya yang memposting". Ini bukan umpan. Ini adalah indeks dengan gerbang izin.

**Konteks pribadi wajib diisi pada tingkat jenis.** `note_to_recipient` dan `relationship_basis` merupakan kolom yang wajib diisi. Kosong bukanlah keadaan yang valid. Agen saya dapat menyusunnya dari grafik Neotoma saya (tumpang tindih terakhir, konteks bersama, kontak umum) tetapi baris yang dikonfirmasi oleh manusia adalah defaultnya. Inilah yang ditunjukkan oleh artikel tahun 2012 ketika menegaskan bahwa orang ingin merasa diundang secara pribadi. Substrat menjadikan catatan pribadi sebagai persyaratan struktural, bukan kesopanan opsional.

**Penolakan bersifat senyap dan tidak diatribusikan.** Penerima membalas dengan `terima`, `lulus`, atau `pensil`. Hanya `terima` yang terlihat oleh pengirim. `pass` memutuskan untuk "tidak ada jawaban" tanpa tanda terima telah dibaca dan tanpa alasan. Penerima tetap memiliki asal pribadi. Anda dapat mengaudit beban sosial Anda sendiri tanpa memaparkannya.

**Kuorum adalah primitif kelas satu.** Artikel tahun 2012 menyebut penundaan sebagai kegagalan terbesar: orang tetap membuka pilihan dan menolak melakukan komitmen lebih awal. Substrat mengatasi hal ini secara langsung dengan `conditional_on`: "Saya akan pergi ke X jika Aaron dan Diwaker juga melakukan commit." Substrat mengawasi predikat dan menyelesaikannya. Tidak ada peran koordinator, tidak ada rangkaian obrolan grup, tidak ada serpihan.

**Komposisi dengan grafik acara yang ada.** Saat undangan diterima, agen menjangkau platform yang memiliki RSVP kanonik (Luma, Eventbrite, kalender) dan menulis reservasi sebenarnya. Entitas `kehadiran_komitmen` Neotoma tetap bersifat kanonik untuk siapa-yang-mempercayai-siapa-yang-pergi-ke mana. RSVP pihak ketiga tetap sesuai dengan tempat dan pintunya. Dua catatan, satu sumber kebenaran per kekhawatiran, terhubung.

## Apa yang sebenarnya diputuskan oleh agen

Sistem di atas hanya berfungsi jika agen melakukan pekerjaan non-sepele secara lokal. Kedua pertanyaan tersebut, di kedua arah perulangan, bersifat konkrit.

**Outbound, siapa yang akan menyambut baik rencana ini.** Saat agen saya melihat saya telah melakukan RSVP untuk sesuatu, mereka menilai kontak saya berdasarkan acara tersebut, bukan terhadap saya. Sinyal lokal yang berguna:

- kontak yang Neotoma-nya membawakan topik bersama atau acara yang dihadiri bersama dengan yang satu ini,
- kontak yang pernah saya kunjungi selama setahun terakhir,
- kontak yang secara eksplisit ikut serta dalam suatu kategori (tandai saya tentang musik live di kota ini),
- kontak yang jadwal atau lokasi pengamatannya tumpang tindih dengan jendela acara.

Agen menghasilkan daftar kandidat yang diberi peringkat, tidak pernah melakukan auto-fire. Anggaran slot dibelanjakan oleh saya atau dengan konfirmasi saya, dan bidang `relationship_basis` diisi dari penilaian yang sama sehingga saya dapat melihat mengapa seseorang disarankan sebelum saya mengirim.

**Masuk, rencana mana yang masuk melalui mesh layak untuk dimunculkan.** Agen saya menjalankan kueri simetris terhadap undangan masuk dan terhadap pengamatan kehadiran sekitar yang diakui oleh cakupan saya. Sinyal lokal:

- seberapa baru dan seberapa sering saya menghadiri bersama orang-orang yang terlibat,
- apakah topik tersebut sesuai dengan kategori yang saya ikuti,
- apakah kalender saya punya ruang,
- apakah kuorum yang saya pedulikan sedang terbentuk.

Sebagian besar ping yang masuk diajukan, bukan muncul. Yang muncul muncul dengan paragraf pendek milik agen tentang mengapa yang satu ini dan bukan yang lain.

Kedua arah merupakan pekerjaan berat dan keduanya tetap bersifat lokal. Tidak ada serdadu pusat. Setiap agen pengguna menghitung berdasarkan status yang dimiliki pengguna, dan penilaiannya dapat diperiksa oleh pengguna tersebut. Hal inilah yang membuat pengalaman mulai tampak seperti infrastruktur yang dapat bertindak atas nama Anda tanpa menjadi sebuah platform.

## Bagaimana hubungan berkembang seperti yang diamati

Di feed, grafik hubungan Anda sebagian besar bersifat statis setelah terbentuk. Anda mengikuti orang, jarang berhenti mengikuti mereka, dan yang lainnya hanyalah sinyal gangguan yang ditafsirkan platform untuk Anda. Dalam substrat ini grafik dibentuk oleh observasi.

Setiap tulisan yang diketik sedikit menggerakkan suatu hubungan. Undangan yang dikirim akan memindahkan tepian ke satu arah. Undangan yang diterima akan menggerakkannya lebih jauh. Tumpang tindih kehadiran yang dicatat oleh kedua agen membuatnya semakin maju lagi. Rekaman percakapan, catatan bersama, atau entitas proyek yang disentuh kedua node meninggalkan pengamatan di tepi antara dua kontak, dengan asal dan stempel waktu.

Kebalikannya juga benar. Tepinya membusuk ketika tidak terjadi apa-apa. Kontak yang belum Anda undang, hadiri, atau tulis selama setahun adalah jenis kontak yang berbeda dibandingkan kontak yang Anda lihat akhir pekan lalu. Pembusukan bukanlah penghapusan. Sejarah masih ada untuk diambil. Namun penilaian relevansi agen di masa depan menggunakan bobot terkini, jadi keheningan selama satu tahun akan merugikan visibilitas sebelum mengorbankan hubungan itu sendiri.

Ini membalikkan model umpan ke arah yang penting. Umpan menjadikan grafik sebagai masukan dan aktivitas sebagai keluaran. Substrat ini menjadikan aktivitas sebagai masukan dan grafik sebagai keluaran. Hubungan berkembang karena perilaku merupakan keadaan yang terstruktur, bukan karena seseorang mengeklik "Ikuti" sekali pada tahun 2014 dan platform tersebut berpura-pura bahwa keunggulan tersebut masih berarti sesuatu sejak saat itu.

## Apa ini bukan

Ini bukan upaya untuk menggantikan undangan yang dibuat oleh manusia. Tugas media adalah membuat undangan tulisan tangan lebih murah untuk dikirim dengan baik, lebih pasti untuk diterima, dan lebih sulit untuk dikirimi spam. Setiap lapisan di atas dimaksudkan untuk mendorong pengalaman kembali ke apa yang saya identifikasi dengan benar pada tahun 2012 sebagai mata uang sosial yang sebenarnya: seseorang yang Anda percayai memikirkan Anda secara spesifik. Substrat tidak dapat menghasilkan pemikiran itu. Ia dapat menolak memberikan penggantinya.

## Yang masih buka

Ada beberapa hal yang saya belum punya jawaban yang tepat.

- Bagaimana anggaran undangan harus didenominasi dan diperbarui. Per acara, per minggu, per mesh? Terikat dengan tingkat penerimaan?
- Bagaimana perubahan cakupan mesh menyebar ketika hubungan berubah. Bagaimana rasanya mencabut ruang lingkup tanpa merusak hubungan?
- Interop lintas-mesh ketika peserta menjalankan implementasi mesh yang berbeda. Apakah ini memerlukan lapisan protokol yang tipis?
- Penanganan penyalahgunaan ketika pengirim yang sebelumnya mengaku mulai melakukan spam. Siapa yang menerapkan penalti, node mesh penerima atau media secara keseluruhan?
- Kisah migrasi untuk acara yang RSVP kanoniknya berada di balik paywall atau login.

Ini adalah pertanyaan nyata, namun merupakan pertanyaan produk dan protokol di atas substrat yang sudah berfungsi. Mereka bukanlah arsitektur yang tidak dikenal.

## Mengapa saya menulis ini sekarang

Beberapa minggu yang lalu Oo Nwoye meninggalkan komentar publik di [karya terbaru](https://markmhendrickson.com/posts/) tentang memori agen dan bertanya, dengan berbagai kata, apakah Plancast harus dibangkitkan untuk era AI. Jawabannya sama dengan yang di atas. Misi awalnya benar. Substratnya salah. Substrat sekarang ada.

Saya rasa jawabannya bukan dengan membangun kembali Plancast sebagai sebuah aplikasi. Jawabannya adalah dengan membangun cakupan undangan, kehadiran, dan kepercayaan sebagai hal yang primitif pada lapisan negara pribadi yang berdaulat, membiarkan agen melakukan pekerjaan menyerap dan mengarahkan, dan membiarkan mekanisme sosial muncul dari fakta bahwa undangan adalah tulisan yang diketik ke status tahan lama, bukan acara umpan sekitar.

Jika Anda telah membangun atau sedang membangun sesuatu di lingkungan ini, saya ingin berbicara.