# K1 persons
`kcode-k1-persons` is the public transaction facade for current K1 person names and directed alias classes. The wire dependency owns exact wire-v1 encoding and decoding; this package owns `k1-persons-subsystem` Ordering registration, exact local submission-result correlation, and composition. The projection owns durable materialization, Ordering owns canonical replay and reorganization, and Peering owns transaction signing and submission. `K1Persons` is `Send + Sync`.
There is no authorization, discovery, listing, deletion, migration, alternate or legacy wire decoder, HTTP, networking, worker, polling, retry, or background work. Reorganization or a callback failure makes the facade unavailable until reopened.
## API
```rust
use std::{path::Path, sync::Arc};
use kcode_k1_peering::K1Peering;
use kcode_k1_persons::{K1Persons, PersonId, TxId};
use kcode_k1_txn_ordering::K1TxnOrdering;
let persons = K1Persons::open(root, ordering, peering)?;
let person: PersonId = persons.create("Ada".to_owned())?;
persons.update(person, "Ada Lovelace".to_owned())?;
let root: PersonId = persons.resolve(person, person)?;
let name: Option<String> = persons.get(root)?;
# Ok::<(), String>(())
```
`K1Persons::open(&Path, Arc<K1TxnOrdering>, Arc<K1Peering>)` opens the projection at the supplied root, registers strictly after its checkpoint, completes canonical replay, and retains both live dependencies. It costs projection `O(P)` opening plus Ordering replay; dependency waits have no finite bound.
`create(String)` and `update(PersonId, String)` validate and encode through wire-v1, perform `O(name bytes)` local work, and make exactly one synchronous Peering submission. `resolve(PersonId, PersonId)` performs bounded wire and correlation work plus projection `O(class)` work and one synchronous submission. None retries, and dependency submission or callback waits have no finite guarantee.
`create` returns its transaction-backed `PersonId`. `update` succeeds for applied or unchanged updates. `resolve` returns the resulting canonical root for applied or unchanged resolution. Projection rejections return their exact reason.
`get(PersonId)` resolves aliases and returns the current name or `None` for an unknown person. It is expected `O(1)` plus a name copy and performs no disk I/O.