## Masalah yang dihadapi sebagian besar pembangun

Jika Anda menjalankan satu agen terhadap satu toko, atribusi adalah hal yang sepele. Anda tahu siapa yang menulis setiap baris. Anda menulis kepada agen.

Saat Anda menjalankan dua, tiga, lima agen terhadap instance Neotoma yang sama, [gambarannya berubah](/posts/when-agents-share-state-everything-breaks). Setiap agen menulis pengamatan, hubungan, sumber, interpretasi. Toko mengumpulkan status dari semuanya. Jika salah satu dari agen tersebut mulai menulis data yang buruk, ringkasan yang salah, tanggal yang sudah basi, hubungan yang salah atribusi, satu-satunya cara untuk mempertimbangkan catatan mana yang harus dipercaya adalah dengan mempertimbangkan agen mana yang menulisnya.

Tanpa atribusi per baris, pilihan Anda ketika terjadi kesalahan sangatlah sulit: hapus penyimpanan dan penyerapan kembali, atau tinggalkan baris yang buruk dan ikuti arusnya. Keduanya menjadi lebih buruk seiring berkembangnya toko.

Masalah ini menjadi lebih akut bagi siapa pun yang mengirimkan produk berbasis agen. Catatan pelanggan Anda sedang ditulis oleh armada: agen Anda sendiri, agen pihak ketiga yang terintegrasi melalui MCP, mungkin plugin yang dipasang seseorang minggu lalu. Saat pelanggan bertanya "siapa yang menulis ini ke akun saya dan atas otoritas siapa?", pertanyaan tersebut harus dapat dijawab berdasarkan data, bukan dari latihan korelasi di seluruh log server dan transkrip percakapan.

Saya menjalankan agen di Cursor, Claude Code, Codex, dan ChatGPT, semuanya menulis ke satu instance Neotoma. Saya menulis tentang [apa yang sebenarnya dilakukan tumpukan itu](/posts/apa yang sebenarnya dilakukan tumpukan agen-saya). Integrasi AAuth Neotoma menutup kesenjangan bagi tumpukan saya dan siapa pun yang mengembangkannya: setiap agen membawa kuncinya sendiri, dan toko dapat tetap dipercaya seiring bertambahnya armada.

## Mengapa AAuth

Lapisan atribusi dibangun di atas [AAuth](https://www.aauth.dev/), sebuah protokol terbuka yang memberikan identitas kriptografinya sendiri kepada setiap klien HTTP. Tidak ada prapendaftaran. Tidak ada rahasia bersama. Tidak ada token pembawa. Setiap permintaan ditandatangani dengan Tanda Tangan Pesan HTTP [RFC 9421](https://datatracker.ietf.org/doc/html/rfc9421), sehingga token yang dicuri tidak ada gunanya tanpa kunci penandatanganan.

Saya memilih AAuth karena orang di baliknya, Dick Hardt, adalah seorang teman dan salah satu pakar identitas terdalam yang saya kenal. Dia mengedit OAuth 2.0 ([RFC 6749](https://www.rfc-editor.org/rfc/rfc6749)), ikut menulis OpenID Authentication 2.0, dan merupakan anggota dewan pendiri [OpenID Foundation](https://openid.net/foundation/members/). Itu adalah garis keturunan yang sama yang ditemui sebagian besar pengembang melalui aliran kode otorisasi dan login gabungan. Ketika seseorang dengan riwayat tersebut memulai protokol baru khusus untuk agen, protokol itulah yang layak untuk dilawan.

## Apa yang dibawa setiap tulisan sekarang

[v0.6.0](https://github.com/markmhendrickson/neotoma/releases/tag/v0.6.0) mengirimkan atribusi agen per baris di setiap permukaan penulisan: `/store`, `/observations/create`, `/create_relationship`, `/ Correct`, `/entities/split`, alat penyimpanan MCP, dan penulisan CLI melalui MCP dan HTTP. Setiap observasi, hubungan, sumber, dan stempel interpretasi:

- Pengidentifikasi agen terverifikasi (cap jempol kunci publik untuk penulis yang ditandatangani, subjek JWT dan penerbit untuk token agen, nama dan versi ClientInfo sebagai cadangan).
- Tingkat kepercayaan yang mengklasifikasikan seberapa kuat identitas terbukti.
- Transportasi yang digunakan untuk menulis.

Lima tingkatan mencakup spektrum:

- `perangkat keras`: agen menyediakan amplop `cnf.attestation` (Apple Secure Enclave, WebAuthn yang dikemas, atau TPM2) yang diverifikasi server terhadap akar tepercaya.
- `operator_attested`: tanda tangan telah diverifikasi, dan operator telah mengizinkan pasangan penerbit atau subjek penerbit. Operator menjamin proses agen tanpa memerlukan pengesahan perangkat keras.
- `perangkat lunak`: agen menandatangani permintaan dengan kunci yang valid, diverifikasi oleh server. Di sinilah sebagian besar agen mendarat saat ini, termasuk penandatanganan proksi Kursor saya dengan ES256 JWK yang didukung file.
- `unverified_client`: agen mendeklarasikan dirinya dengan clientInfo yang dapat dikenali tetapi tidak menandatangani.
- `anonim`: tidak ada identitas sama sekali.

Hasilnya: Anda dapat melihat baris mana pun di toko Anda dan menjawab "agen mana yang menulis ini" sebagai pembacaan terhadap data kelas satu.

## Hibah alih-alih file konfigurasi

Pada awal siklus v0.6.0, kemampuan dimuat dari file JSON variabel lingkungan. Itu berfungsi untuk sekumpulan agen statis tetapi merusak momen Anda ingin menangguhkan satu agen tanpa memulai ulang server.

Sekarang: setiap `agent_grant` adalah entitas Neotoma kelas satu. Ini cocok dengan identitas AAuth (menurut subjek, penerbit, cap jempol, atau kombinasinya), membawa entri kemampuan yang tercakup per operasi dan jenis entitas, dan memiliki siklus hidup: `aktif`, `ditangguhkan`, `dibatalkan`. Middleware penerimaan menyelesaikan identitas AAuth terverifikasi ke pemberian izin yang cocok pada setiap permintaan, memasukkan pengguna dan kemampuan pemberian izin ke dalam konteks permintaan, dan penegakan hilir memeriksa setiap operasi terhadap pemberian izin.

Hibah dikelola melalui UI Inspektur, REST API (`POST /agents/grants`, `PATCH`, menangguhkan, mencabut, memulihkan), atau dimigrasikan satu kali dari env-config lama melalui `neotoma agent grants import`. Env vars lama (`NEOTOMA_AGENT_CAPABILITIES_*`) menyebabkan kegagalan waktu boot jika masih disetel, dengan kesalahan terstruktur yang mengarah ke perintah migrasi.

Penangguhan hibah bersifat instan. Permintaan agen berikutnya gagal masuk. Memulihkan juga sama instannya. Tidak ada restart server, tidak ada ulang konfigurasi.

Bagi siapa pun yang menjalankan produk dengan agen yang berhubungan dengan pelanggan, ini berarti respons insiden berpindah dari "mulai ulang layanan dengan konfigurasi baru" menjadi "tangguhkan satu hibah dan selidiki". Radius ledakan dari agen yang berperilaku buruk terbatas pada operasi yang memberikan izin.

## Identitas sebelum penerbangan

Setiap agen kini bisa bertanya kepada Neotoma, sebelum menghasilkan data apa pun, apakah diakui sebagai penulis terpercaya.

Tiga titik masuk yang setara:

- `GET /sesi` melalui HTTP.
- `get_session_identity` sebagai alat MCP.
- `sesi autentikasi neotoma` di CLI.

Masing-masing mengembalikan tingkat kepercayaan yang diselesaikan, status pemberian (diterima atau tidak, dengan alasan), kebijakan penulisan anonim, dan `eligible_for_trusted_writes` boolean. Responsnya mencakup blok diagnostik yang menjelaskan cara penyelesaian tingkat tersebut. Agen baru gagal keras di awal sesi alih-alih menulis baris anonim sampai seseorang menyadarinya.

Instruksi MCP yang dikirimkan memberi tahu setiap agen yang terhubung untuk menjalankan pemeriksaan ini sebelum mengaktifkan penulisan.

## Di mana saya menjalankan ini

Tiga agen layanan berbeda di tumpukan saya menulis ke Neotoma di bawah AAuth hari ini.

**Proksi MCP Kursor.** Setiap permintaan MCP dari Kursor mengalir melalui proksi penandatanganan (`mcp_identity_proxy.py`) yang memasukkan tanda tangan RFC 9421 dengan token agen `aa-agent+jwt`. Neotoma memverifikasi tanda tangan, menyelesaikan identitas (`sub=cursor@markmhendrickson.com`, `iss=https://markmhendrickson.com`), mencocokkan `agent_grant`, dan mengizinkan penulisan di `tier=software`. Proksi juga menjalankan sesi preflight saat startup dan dapat gagal ditutup jika server melaporkan tingkat anonim.

**Pipa masukan.** Relai Netlify di `agent.neotoma.io` meneruskan laporan bug agen ke Neotoma melalui terowongan [Akses Cloudflare](https://www.cloudflare.com/zero-trust/) yang ditandatangani AAuth. Hibahnya terbatas pada operasi `neotoma_feedback` saja.

**[Darkmesh](https://github.com/markmhendrickson/darkmesh) penulisan balik intro hangat.** [Garpu Darkmesh](https://github.com/markmhendrickson/darkmesh/blob/main/docs/neotoma_integration.md) ([konteks](/posts/the-substrate-plancast-needed)) merekam intro hangat yang terungkap kembali ke Neotoma dengan Tanda tangan RFC 9421 dan token `aa-agent+jwt`. Setiap pengungkapan mendarat dengan `agent_sub`, `agent_iss`, dan sidik jari kunci node, yang dicakup oleh hibah per node.

Tes bersama Darkmesh membuktikan penegakan hukum dalam bentuk yang bermusuhan. Agen simulasi kedua dari node rekan mencoba menulis `warm_intro_reveal` tanpa jenis entitas tersebut dalam hibahnya. Neotoma menolak tulisan itu. Penulisan node yang diotorisasi tidak berubah.

Peta jalan berikutnya: [agen publik di markmhendrickson.com](https://markmhendrickson.com/agent/) membungkus instance Neotoma sebagai memorinya dan saat ini hanya melayani entitas yang telah saya tandai publik secara eksplisit. Saya berencana menambahkan pembacaan dengan gerbang AAuth sehingga pengunjung resmi dapat menanyakan jenis entitas non-publik tertentu. Mesin identitas-tanda-plus-hibah yang sama, diterapkan pada jalur baca.

## Peningkatan seluruh armada

Neotoma mengirimkan instruksi MCP kanoniknya dari server ke setiap klien yang terhubung pada setiap jabat tangan. Di v0.6.0, instruksi tersebut sekarang mengkodifikasi preflight atribusi, penandaan `observation_source`, tepi sumber yang dikutip balasan, grup tampilan `ambigu (N)` untuk peringatan penggabungan heuristik, dan loop pengiriman umpan balik terstruktur.

Ketika saya memutakhirkan server saya, kait Kursor, Kode Claude, Codex, dan OpenCode saya semuanya mengambil perilaku baru. Tidak ada rilis sisi klien. Tidak ada migrasi per alat. Satu server mengalami gangguan, lima agen diperbarui. Bagi siapa pun yang menjalankan armada pelanggan, pola yang sama berlaku: tingkatkan instans Neotoma dan setiap agen yang terhubung mengambil default baru tanpa penerapan klien.

## Permukaan audit

Bagi pembuat produk di pasar yang teregulasi, pertanyaan lanjutan dari pelanggan jarang berupa "apakah sistem Anda mengingat hal ini". Ini adalah "siapa yang menulisnya, dan dapatkah Anda membuktikan bahwa mereka berwenang."

Setelah v0.6.0, itu adalah pembacaan terhadap data kelas satu:

- `GET /agents` menyebutkan setiap identitas agen yang dilihat server.
- `GET /agents/{key}` mengembalikan tampilan detail per agen.
- Audit `GET /agents/{key}/records` yang mencatat agen tertentu yang dibuat.
- `GET /agents/grants` mencantumkan semua hibah, kemampuannya, dan status siklus hidupnya.

Jika Anda memberikan fungsionalitas agen kepada pelanggan di bidang layanan kesehatan, keuangan, hukum, atau perusahaan, inilah permukaan yang pada akhirnya akan diminta oleh pelanggan Anda.

## Cara menyalakannya

``` pesta
neotoma auth keygen --alg ES256
contoh tanda autentikasi neotoma
sesi autentikasi neotoma
```

Buat pemberian izin untuk identitas baru melalui Inspector atau REST API, yang mencakup kemampuan untuk operasi yang dibutuhkan agen Anda. Jika Anda meningkatkan versi dari model env-config lama, jalankan `neotoma agent grants import --owner-user-id <your_user_id>` sekali, lalu hapus variabel lama.

Untuk penandatanganan terprogram, [`@aauth/local-keys`](https://www.aauth.dev/) atau pustaka AAuth yang setara menandatangani permintaan dengan Tanda Tangan Pesan HTTP RFC 9421 ditambah token `aa-agent+jwt`. Neotoma memverifikasi tanda tangan pada byte mentah yang ditandatangani klien.

Menulis tanpa AAuth masih berfungsi. Mereka mendarat di tingkat `anonim`. Pembangun yang menginginkan kegagalan besar dapat membalik `NEOTOMA_AAUTH_STRICT=1` dan menambahkan subjek tertentu ke `NEOTOMA_STRICT_AAUTH_SUBS`.

## Juga dikirimkan

v0.6.0 bukan hanya AAuth. Rilis yang sama menyebabkan pemisahan entitas untuk catatan yang digabungkan secara berlebihan, ekspor snapshot armada ditambah peralatan drift, percakapan multi-agen kelas satu melalui `conversation_message` dan `sender_kind`, dan perimeter API yang diperketat. Suplemen selengkapnya ada di [catatan rilis v0.6.0](https://github.com/markmhendrickson/neotoma/releases/tag/v0.6.0).

## Instal dan tingkatkan

``` pesta
npm install -g neotoma@[0.6.0](https://github.com/markmhendrickson/neotoma/releases/tag/v0.6.0)
neotoma init
neotoma auth keygen
sesi autentikasi neotoma
```

Memutakhirkan server memberi Anda stempel atribusi baru dan penyegaran instruksi MCP pada jabat tangan klien berikutnya. Tidak diperlukan instalasi di sisi klien untuk agen yang sudah terhubung melalui MCP.

Pemasangan penuh: [neotoma.io/install](https://neotoma.io/install). Repo: [github.com/markmhendrickson/neotoma](https://github.com/markmhendrickson/neotoma). Catatan rilis: [v0.6.0](https://github.com/markmhendrickson/neotoma/releases/tag/v0.6.0).