APIAPI
One endpoint. The log is the state.Satu endpoint. Log itu adalah state.
POST a log and an action. The host replays the log, runs the action, and answers with the canonical log plus the state a human seat can render.POST log dan satu aksi. Host memutar ulang log, menjalankan aksi, lalu menjawab dengan log kanonik plus state yang bisa dirender kursi manusia.
EndpointEndpoint
POST https://www.shortcutsistem.com/api/kinship/hostRequestRequest
{
"log": [],
"action": { "type": "boot" }
}The client holds the append-only event log and sends it with every request. The host replays it through the same reducer the live run used, so the audit trail is exercised on every single call and the server keeps no session state.Klien memegang log event append-only dan mengirimkannya bersama setiap request. Host memutar ulang log itu lewat reducer yang sama dengan run live, jadi audit trail-nya diuji di setiap panggilan dan server tidak menyimpan state sesi.
ActionsAksi
boot— Reset the log and boot the pack through its own gate. The fleet starts with nothing but the pack and the needs the organiser answered. — Reset log lalu boot pack lewat gate-nya sendiri. Armada mulai dari nol: hanya pack dan kebutuhan yang sudah dijawab organiser.cycle— Run one event cycle. The fleet proposes; every proposal lands on the human seat as a card. Nothing is sent. — Jalankan satu siklus event. Armada mengusulkan; setiap usulan mendarat di kursi manusia sebagai kartu. Tidak ada yang dikirim.decide— Record a verdict on one card: approve, edit, or reject. A verdict without a reason is not recorded. — Catat vonis pada satu kartu: approve, edit, atau reject. Vonis tanpa alasan tidak dicatat.hand-off— Hand an approved card over as text for the organiser to send themselves. The host refuses to send anything — the refusal is in the response, not hidden. — Serahkan kartu yang disetujui sebagai teks untuk dikirim sendiri oleh organiser. Host menolak mengirim apa pun — penolakannya ada di respons, tidak disembunyikan.replay-verify— Replay the log and check that it rebuilds the same state. This is the audit trail proving itself, not a claim about it. — Putar ulang log lalu cek apakah state-nya terbangun sama persis. Ini audit trail yang membuktikan dirinya, bukan klaim tentang dirinya.
decide takes the card id, the verdict (approve, edit, or reject), who decided, and why. hand-off takes the card id.decide menerima id kartu, vonis (approve, edit, atau reject), siapa yang memutuskan, dan alasannya. hand-off menerima id kartu.
ResponseResponse
{
"ok": true,
"log": [
{ "type": "MemberRegistered", "member": { "ref": "member-01", "tz": "Asia/Jakarta" }, "at": 1792670400000, "seq": 1 }
],
"state": {
"community": "Kopdar AI Jakarta",
"packKey": "kinshipai/bundled/event-ops/kopdar",
"orgKey": "kinshipai",
"locale": ["id", "en"],
"seats": ["organiser"],
"agentRoles": ["event-ops", "engagement", "moderator"],
"guardrails": {
"reportAggregationFloor": 10,
"memberMessageCapPer24h": 2,
"identityDisclosure": true,
"defaultsDeny": true
},
"ladder": [
{ "agent": "engagement", "actionClass": "rsvp.chase", "packLevel": "draft", "effective": "draft", "ceiling": "draft", "heldByOrg": false }
],
"provenance": [
{ "key": "member_message_cap_per_24h", "tier": "guardrail", "effective": 2, "source": "pack", "note": "lower is stricter · spec §2.9 / FR-5.5" }
],
"cards": [
{ "id": "card-2", "actionClass": "rsvp.chase", "agent": "engagement", "status": "pending", "revision": { "hash": "53dc6752c09788e3" } }
],
"timeline": ["#1 member member-01 registered (Asia/Jakarta)"],
"refusals": [{ "code": "class_unavailable", "count": 1 }],
"limits": ["The event tier is not built. …"],
"handoff": null,
"replay": null
},
"error": null
}The returned log is always the canonical one, rebuilt by the reducer — a log that does not survive the replay is not silently accepted. A refusal comes back as ok: false with the reason in error, and it is counted in the refusals the state carries. The shape above is the same for every action; the values depend on the log you send, and the arrays are trimmed for print.Log yang dikembalikan selalu log kanonik, dibangun ulang oleh reducer — log yang tidak bertahan saat replay tidak diterima diam-diam. Penolakan kembali sebagai ok: false dengan alasannya di error, dan juga dihitung di refusal yang dibawa state. Bentuk di atas sama untuk semua aksi; nilainya tergantung log yang Anda kirim, dan array-nya dipotong untuk dicetak.
Status codesStatus code
400— bad_request — the body is not { log, action }. — bad_request — body bukan { log, action }.405— method_not_allowed — the route takes POST only. — method_not_allowed — route ini hanya menerima POST.413— log_too_large — the log is over 512 KB. — log_too_large — log melebihi 512 KB.500— host_error — the host itself failed. A refusal is not an error; a 500 is a bug on our side, and it is reported as one. — host_error — host-nya sendiri yang gagal. Penolakan bukan error; 500 itu bug di sisi kami, dan dilaporkan apa adanya.
ExampleContoh
curl -X POST "https://www.shortcutsistem.com/api/kinship/host" \
-H "Content-Type: application/json" \
-d '{"log": [], "action": {"type": "boot"}}'That boots the pack and returns the ladder — which action class sits at which autonomy level, and whether the organisation's ceiling is what holds it back. It sends nothing to anybody.Itu me-boot pack dan mengembalikan ladder — kelas aksi mana di level otonomi berapa, dan apakah plafon organisasi yang menahannya. Tidak ada yang dikirim ke siapa pun.
Open-source specSpesifikasi open-source
The control plane is MIT-licensed and open source. The governance spec, the pack format, and the log vocabulary live in the spec folder of the Kinship repository. The hosted host runs the same governance a self-hoster runs — not a fork of it.Control plane berlisensi MIT dan open source. Spesifikasi tata kelola, format pack, dan kosakata log ada di folder spec di repositori Kinship. Host yang di-host menjalankan tata kelola yang sama dengan yang dijalankan self-hoster — bukan fork-nya.
What this endpoint does not doYang tidak dilakukan endpoint ini
- It does not send anything. A hand-off is text the organiser sends themselves; the response says so with
sent: falseand a transport refusal.Tidak mengirim apa pun. Hand-off adalah teks yang dikirim sendiri oleh organiser; responsnya menyatakan begitu lewatsent: falsedan penolakan transport. - It does not call a model on your behalf, and it does not query ChatGPT, Google, or any other service.Tidak memanggil model atas nama Anda, dan tidak melakukan query ke ChatGPT, Google, atau layanan lain.
- It does not keep state between calls. The log you send in is the state you get back out.Tidak menyimpan state antar-panggilan. Log yang Anda kirim masuk adalah state yang Anda terima kembali.