How OctoMY™ lets you keep multiple identities and robots on one device and switch between them at any moment — without losing data, without restarting the app.
Why this exists
One person may operate several robots, and one machine may host several people's identities — a workshop computer, a shared family hub, a developer's laptop with both a personal and a work identity. OctoMY™ treats identity as something you can change while the app is running, the same way you'd switch a window or a profile.
At any moment OctoMY™ has up to two identities active, layered on top of each other:
| Layer | What's there | Required? |
|---|---|---|
| Device | The machine the app runs on | Always |
| Sentient | Your cryptographic identity — the human operator | Always (a shadow Sentient is auto-created on first boot) |
| Node | A robot personality (Agent / Remote / Hub) owned by the Sentient | Optional — you can be "logged in" as a Sentient with no Node selected |
The Sentient's data lives in an encrypted hive named SID-<your-id>. When you select a Node, its hive (NID-<node-id>) is mounted on top of the Sentient hive. Switching either layer is what we mean by "identity switching."
See also: Sentient Identity for what a Sentient is, and Personality for what a Node Personality is.
| You'd switch the Sentient when | You'd switch the Node when |
|---|---|
| Moving between work and personal identities | Picking up a different robot you already own |
| Operating a shared device for a different person | Switching from a fleet agent to a development sandbox |
| Recovering a Sentient from a backup phrase | Moving the same Sentient between Agent / Remote / Hub roles |
| Upgrading a shadow Sentient to a full one | Trying a new Node Personality without losing your current one |
A Sentient switch is the heavier of the two: every subsystem that depended on the old Sentient (vault, contacts, keystore, mounted hive) is torn down and rebuilt against the new one. A Node switch reuses the active Sentient and only swaps the Node layer.
| Place | What you can switch from there |
|---|---|
| Lanyard (top-right of every window) | Both — three controls left-to-right: a bare-glyph hive button (visible only when a hive is mounted; opens HiveLobbyActivity), the sentient chip (opens SentientLobbyActivity), the node chip (opens NodeSelectionActivity). The legacy caret/dropdown menu was retired by the Activity Header Makeover; hive-level switching now lives inside SentientLobbyActivity since hives are scoped to sentients |
| Sentient Selection activity | Sentient — picks from every Sentient hive registered on this device |
| Node Selection activity | Node — picks from every Node owned by the active Sentient |
| Active Mounts activity | Diagnostic view — shows what's mounted right now, useful when something feels stuck |
The Lanyard is the everyday surface. The selection activities are what the Lanyard pushes when you have more than one option, and they're also where you go when you want to create a new Sentient or Node.
Switching is one operation made of six steps. You see a spinner; behind it the app is making sure nothing gets corrupted by the change.
| Step | What it does | Visible? |
|---|---|---|
| Freeze | Input is blocked, the Lanyard greys out, a spinner activity appears | Yes — you see the spinner |
| Save | Any subsystem with unsaved writes (address book, vault, keystore, registries) is flushed to disk first | Brief delay; no UI change |
| Teardown | Comms sessions close, the old Node hive unmounts, then the old Sentient hive unmounts | No |
| Mount | The new Sentient hive activates; vault/keystore/comms reconfigure; if it's a full switch (not just Sentient → Sentient), the new Node hive mounts on top | No |
| Reconfigure | Signal cascade: every widget that displays "current Sentient" or "current Node" refreshes itself; discovery clients reconnect | You see UI elements update |
| Unfreeze | Spinner disappears; you land on the home activity of the new identity | Yes — you're back in control |
The order is deliberate. Save before Teardown is what prevents data loss — and after spec Phase 11b it's not just an attempt, it's a guarantee. The Save phase fires save() on every dirty subsystem (AddressBook, SentientVault, KeyStore, SentientRegistry, HiveRegistry) and runs the UI event loop for up to 5 seconds so the background AsyncStore workers can drain their queues before the volume tears down. Earlier versions used a fire-and-forget pattern that raced with the worker thread and could lose writes; the bounded-wait pump closes that gap.
Teardown reverses the Mount order so dependencies unwind correctly. If anything fails during Mount, the service automatically rolls back and restores the previous Sentient/Node — you never end up in a half-switched state.
Before a switch begins, the app checks two things:
This is why a switch is safe even mid-edit: the app refuses to pull the rug out from under you without asking.
Switching only moves you between identities that already exist on this device. Creating a new identity is a separate flow:
| To... | Go to... |
|---|---|
| Switch to an existing Sentient | Lanyard → Sentient → pick one |
| Create a new Sentient | Sentient Selection activity → New |
| Switch to an existing Node | Lanyard → Node → pick one |
| Create a new Node under the current Sentient | Node Selection activity → New |
| Import a Sentient from another device | Sentient Selection activity → Import, then complete the migration flow |
A successful import lands the imported Sentient hive alongside your existing ones — the same selection activity now lists one more entry. From your point of view it's just another switch target.
When you switch identities mid-session:
| Stays | Resets |
|---|---|
| The app itself (no restart) | The set of contacts visible — each Sentient has its own |
| Window layout and pinned activities | The list of Nodes you can pick — each Sentient owns its own |
| Open background services (batch queue, etc.) | Discovery / pairing state — re-runs under the new identity |
| OPAL task history across the app (recorded per-Sentient) | Active OPAL execution context — bound to the previous identity |
If you had a long-running OPAL task in flight, the switch will wait for it to finish (or fail if it can't), since tasks run in the context of the Sentient that started them.
Can two Sentients be active at the same time? No — at most one Sentient is mounted at a time, and at most one Node on top of it. Multiple identities exist on the device; only one is active.
What if my Sentient has no Nodes yet? You can still operate as that Sentient — you just have no Node-specific data (no robot personality, no per-Node config). The Lanyard shows your Sentient with no Node selected. Create one from the Node Selection activity when you need it.
Is switching the same as logging out? Closer to "switching profiles." There's no central account, no log-out / log-in dance — switching simply unmounts one identity and mounts another, all locally.
Can I switch while a robot is connected? Yes; the Comms layer tears down cleanly during Teardown and reconnects under the new identity during Reconfigure. The peer on the other end sees you as a different identity afterwards (because you are).
| Component | Role |
|---|---|
IdentitySwitchService |
Orchestrates the six-phase switch; emits phase / finished / rolledBack signals |
SwitchReadiness |
Pre-flight check — Ready, SavePending, OpenFiles, Busy, NoChange |
Lanyard |
Top-right widget showing active Sentient + Node; entry point for switching |
SentientSelectionActivity |
Pick / create / import a Sentient |
NodeSelectionActivity |
Pick / create a Node under the active Sentient |
ActiveMountsActivity |
Diagnostic view of currently-mounted hives |
OpenFileTracker |
Detects activities holding files open on a hive about to unmount |
OpenFilesActivity |
UI for the open-files-pause case |
HiveSession |
The session that owns the mount stack |