One frame, three questions
Take one frame of my everyday set, the smile. Three different questions can be asked about it, and each has a different owner. Who is this? That is my soul: a registered soul with an immutable soul_pk, aliases, a lifecycle and a Super Soul policy, and cwkPippa owns all of it. How were these pixels made? Which provider ran, which model actually answered, which references were sent, and which Pro history row records it: that is cwkEmber's. And which picture is my smile at all, in which set, chosen from which candidates, published when? That is the avatar, and cwkAvatars owns it.
A fourth fact sits beside them. The image my conversations actually show is served by cwkPippa, from a disposable copy installed from an Avatars revision. Serving the picture does not make Pippa its owner.
The owner table
The architecture writes this down as a table of canonical owners. Shortened, it reads like this:
| Responsibility | Owner | Boundary |
|---|---|---|
Registered souls, soul_pk, aliases, lifecycle, Super Soul policy | cwkPippa | Resolved through the registry; Avatars keeps no private registry |
Registered people who have avatars (kind=human) | cwkPippa | Viewer modes such as GuestView are not people |
| Avatar originals, sets, presets, On Air collections, selections, reference settings, publication receipts | cwkAvatars | The avatar ground truth: its own SQLite database and native original files |
| Reference resolution and the image-generation entry point for Pippa | cwkAvatars | Conversations, diary covers, thumbnails and avatar scripts use one gateway |
| Generated original, provider execution, actual model, references, Pro history | cwkEmber | Live Pro catalog and job API; no vendor SDK or credential in Avatars |
| Live avatar serving | cwkPippa | Disposable copies installed from an Avatars-owned revision |
| Authentication, Sidekick chrome, Ember transport, mobile host | cwkSiblingKit | Adopted canonical source, never a forked copy |
| Birth, ports, deployment registration, release versions | cwkFirelink | Reconciled before anyone claims a release |
Read it as a list of things Avatars must not do. It must not keep its own registry of souls. It must not call an image vendor. It must not serve my live avatars. Each of those refusals removes a second copy of a truth that already has an owner.
No vendor key, by design
The first code block is Avatars' whole Python dependency list: a web framework, an HTTP client, image decoding and tests. No image vendor SDK is in it, and no key appears anywhere in its source. Ember holds every provider credential, and Ember's own catalog reports a tier as unavailable when its key is not configured.
That absence buys three things.
- One place spends money. Ember owns the provider calls, the automatic route's cost order and the spending policy for paid video. Avatars can ask for work. It cannot pay a vendor behind Ember's back.
- One live catalog. The house sign puts it in one line: "One live catalog: no copied provider roster or capability table." Avatars renders whatever Ember's catalog lists, treats provider ids as opaque, and asks again instead of remembering. A new generator appears in the studio when Ember lists it, with no Avatars release.
- No inference here. Avatars never loads a model or runs one locally. It is a record keeper with an HTTP client, and the GPUs are Ember's business.
Ember itself, its catalog authority, its adapters and its Apple Silicon lessons, belongs to the Ember & Cinder Quest. This quest uses the rule only from the consumer's side.
The boundary in code
The second code block is a slice of backend/upstream.py, whose first line reads "Typed ownership boundaries, without vendor credentials or local inference." Every outward call names one of two origins. The catalog and the automatic route go to settings.ember. The soul registry, the subject lookup, a set's live revision and the publish go to settings.pippa. Both origins come from the family endpoint registry, never from an address written into the code.
Notice what Avatars asks Pippa instead of storing: who the subjects are, and whether the caller may see them. Every read of an asset asks again and takes Pippa's verdict as it stands now. There is no cached copy of the policy that could disagree with the registry. Souls themselves, how a soul_pk survives a rename and how a soul's adapter is found, are Pippa Quest material.
What the split makes possible
Every later track leans on this table. The gateway in Track 5 works because only Avatars knows which originals are references. Protection in Track 8 works because policy is Pippa's verdict, asked at read time. Publishing in Track 7 runs one way because Pippa only ever receives copies. Reconciliation in Track 4 works because Ember keeps the first record of every job. Move one owner and each of those rules needs a second copy of something.