Use cases and workflows
Companion Memory is designed to solve real-world coordination problems without sacrificing personal sovereignty or handing private archives to cloud aggregators.
The five workflows below show the wire payloads, local search evaluation, disclosure ceilings, and audit records for common coordination tasks.
Use case 1: Family photo requests (“Photos from the lake trip”)
Scenario: Maya wants to make a photo album from last summer’s family trip to Lake Tahoe. She asks Jordan: “Do you have photos of us from the lake trip?“
flowchart TD
Maya["Maya's Companion<br/>Asker: Peer M5ZDc="] -->|Signed ask| Jordan["Jordan's Companion<br/>Responder"]
Jordan --> LocalSearch["Local search<br/>Query: 'lake trip'<br/>Filter: photos, July 2024"]
LocalSearch --> MatchSet["Matches found: 42 photos<br/>(Backing entities)"]
MatchSet --> Gate{"Consent decision<br/>No standing grant"}
Gate -->|Manual review| JordanUI["Jordan's 'For you' inbox"]
JordanUI -->|Jordan selects 'A summary only'| Ceiling["Disclosure ceiling:<br/>Rung 3 (summary)"]
Ceiling --> Result["Answer synthesized:<br/>'Found 42 photos from Lake Tahoe in July 2024.'"]
Result --> MayaPoll["Delivered to Maya<br/>Zero raw image files sent"]1. Request composition
Maya’s Companion analyzes her prompt and constructs a structured ask body (contentAskSchema):
{
"askId": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"askerHandle": "maya",
"prompt": "Do you have photos of us from the lake trip?",
"request": {
"archetype": "content",
"subject": "lake trip",
"dataClass": "photos",
"from": "2024-07-01T00:00:00Z",
"to": "2024-07-31T23:59:59Z"
}
}2. Local retrieval execution
When the ask arrives at Jordan’s appliance, Jordan has not configured a standing grant for Maya. The ask queues in Jordan’s For you inbox.
Jordan’s Companion runs the search locally to prepare the preview:
- Identifies the Lake Tahoe trip entity in the graph.
- Finds 42 matching photographs taken between July 12 and July 18, 2024.
- Identifies that 14 photos include non-family bystanders and 2 include GPS coordinates of Jordan’s private campsite.
3. Review decision
Jordan opens the review card in Companion Memory:
- Card badge:
no standing grant(Review required). - Would search:
content · photos. - Jordan’s choices:
- Approve and answer: Grants the requested level.
- Answer with less: Selects A summary only.
- Decline: Refuses the ask.
Jordan selects A summary only.
4. What crossing the boundary looks like
| Data tier | Records on Jordan’s appliance | Data sent to Maya |
|---|---|---|
| Raw files | 42 high-resolution JPEG/RAW files (1.4 GB) | None |
| Location tags | Precise campsite latitude/longitude coordinates | None |
| Faces | Face embeddings of all individuals in the frame | None |
| Answer payload | Matched 42 items | "Found 42 photos from Lake Tahoe in July 2024." |
5. Audit anchoring
Jordan’s appliance records the interaction in ci.ask_audit:
backing_entities: 42 document UUIDs (Jordan’s private record of what was searched).disclosed_entities:[](Empty, because summary rungs disclose zero references).disclosed_count:42(The magnitude confirmed).d:ESaid...(Canonical SHA-256 SAID digest anchoring the record).
Use case 2: Frictionless calendar coordination (“Free for lunch on Friday?”)
Scenario: Alex’s assistant wants to schedule lunch with Taylor: “Free for lunch on Friday between 12:00 and 14:00?“
sequenceDiagram
autonumber
participant Alex as Alex's Companion (Asker)
participant Taylor as Taylor's Companion (Responder)
Alex->>Taylor: POST /agent/v1/ask (Archetype: availability, window: Fri 12-14)
Taylor->>Taylor: Check peer link (Alex is 'trusted')
Taylor->>Taylor: Evaluate standing grant (Rule: 'trusted -> calendar availability -> boolean')
Taylor->>Taylor: Execute local calendar conflict check
Note over Taylor: Taylor has a private therapy session from 11:30 to 12:30
Taylor->>Taylor: Compute result: conflict exists -> free = false
Taylor->>Taylor: Clamp to boolean rung (1 bit)
Taylor-->>Alex: 200 OK (status: answered, answer: false)
Note over Alex: Alex sees only that Taylor is not free.<br/>Zero details of the therapy session are revealed.1. Standing grant configuration
Taylor frequently schedules meetings with Alex and has configured a standing grant:
- Who: Alex (
peer-alex-uuid). - Data class:
calendar. - Allowed archetype (
queryType):availability(Free/busy checks). - Maximum ceiling:
boolean(Rung 1). - Mode:
auto(grant-auto, answering automatically without human review).
2. Search evaluation and redaction
Taylor’s Companion receives the ask (availabilityAskSchema):
{
"askId": "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e",
"askerHandle": "alex",
"prompt": "Free for lunch on Friday between 12 and 2?",
"request": {
"archetype": "availability",
"from": "2026-10-30T12:00:00Z",
"to": "2026-10-30T14:00:00Z",
"minMinutes": 60,
"purpose": "lunch"
}
}Taylor has a calendar entry:
- Title: “Dr. Smith - Therapy”
- Time:
11:30 - 12:30 - Category:
health / sensitive
3. The privacy guarantee
Because the standing grant permits only the boolean rung:
- The title, category, attendees, and location are never evaluated for disclosure.
- The engine computes a boolean overlap check:
hasConflict = true. - The answer returned to Alex is
false.
Alex’s assistant receives an immediate confirmation that Taylor is unavailable, with zero risk of disclosing private medical or personal calendar details.
Use case 3: Professional network queries (“Do you know anyone at Acme?”)
Scenario: Elena is looking for a contact at Acme Corp and asks Marcus: “Do you know anyone who works at Acme?“
flowchart LR
Elena["Elena's ask:<br/>'Do you know anyone at Acme?'"] --> GraphQuery["Marcus's knowledge graph<br/>Traverse Person -> Company"]
GraphQuery --> Found["Matched 2 persons:<br/>1. VP of Engineering (close friend)<br/>2. Former recruiter (contact)"]
Found --> RuleCheck{"Marcus's rule for Elena:<br/>Trust Tier: peer<br/>Ceiling: count (Rung 2)"}
RuleCheck --> Output["Disclosed answer:<br/>'Yes, 2 contacts at Acme.'"]
Output --> ElenaView["Elena learns Marcus has contacts.<br/>Zero names or emails disclosed."]1. Graph traversal
Marcus’s Companion evaluates the relationship ask ({ "archetype": "relationship", "subject": "Acme Corp" }) against the local entity graph:
- Matches entity
Acme Corp(organization). - Traverses incoming
employed_atedges. - Finds two contacts:
Sarah Chen(VP of Engineering, frequent email correspondent).David Miller(Technical Recruiter, met once at a conference).
2. Enforcement of the count ceiling
Elena has the peer trust tier on Marcus’s appliance. The standing rule restricts contact queries to count (Rung 2):
- Ceiling applied: Rung 2 (
count). - Entities withheld: All name, email, and position records are scrubbed.
- Answer delivered:
"Marcus knows 2 people at Acme Corp."
Elena learns that Marcus can help with an introduction, but Marcus retains complete discretion over whether to reveal Sarah or David’s identity.
Use case 4: Autonomous agent delegation (Cross-appliance MCP tools)
Scenario: An autonomous AI coding agent (for example, OpenClaw running on a developer’s desktop) needs architecture documentation from a remote team lead’s Companion Memory.
sequenceDiagram
autonumber
participant Agent as Developer Agent (Hermes/OpenClaw)
participant Desktop as Developer's Companion
participant Lead as Team Lead's Companion
Agent->>Desktop: Call MCP Tool: ask_peer(handle: "team-lead", query: "Auth architecture")
Desktop->>Desktop: Retrieve KERI private key
Desktop->>Desktop: Sign HTTP request with box AID (RFC 9421)
Desktop->>Lead: POST /agent/v1/ask (Signed headers)
Lead->>Lead: Verify RFC 9421 signature against Lead's Peer Link
Lead->>Lead: Match delegation grant: "team-lead -> developer -> docs: redacted"
Lead->>Lead: Retrieve matching document sections
Lead->>Lead: Strip internal secrets and credentials
Lead-->>Desktop: 200 OK (status: answered, answer: redacted_markdown)
Desktop-->>Agent: Return tool result (Redacted architecture docs)1. Agent tool invocation
The developer’s agent invokes the Memory MCP tool:
{
"tool": "ask_peer",
"arguments": {
"peerHandle": "team-lead",
"prompt": "What is the token expiration policy in the auth architecture?",
"dataClass": "documents"
}
}2. Sovereign peer signature
The developer’s Companion uses its Ed25519 KERI key to sign the HTTP message:
POST /agent/v1/ask HTTP/1.1
Host: lead.internal.net
Signature-Input: sig1=("@method" "@target-uri" "content-digest");created=1730040000;keyid="did:keri:D...dev-aid"
Signature: sig1=:base64signature...:
Content-Digest: sha-256=:digest...:
Content-Type: application/json3. Verification without third-party tokens
The team lead’s appliance:
- Reconstructs
@target-urifrom its configured endpoint. - Verifies the Ed25519 signature directly against the developer’s registered public key.
- Authenticates the caller as
did:keri:D...dev-aidwithout contacting Companion Portal or verifying an external JWT. - Executes the retrieval, redacts internal environment variables and secret tokens, and returns the approved documentation.
Use case 5: Ephemeral shared searches for external projects
Scenario: Liam wants to share renovation receipts and contractor invoices with an insurance adjuster who does not use Companion Memory.
flowchart LR
Liam["Liam selects:<br/>Category: 'receipts'<br/>Tag: 'kitchen-renovation'"] --> CreateShare["Create Shared Search"]
CreateShare --> Capability["Generate capability token<br/>Expires: 7 days<br/>Access: Read-only"]
Capability --> URL["HTTPS URL:<br/>https://hub.example/s/tk_9a8b7c..."]
URL --> Adjuster["Adjuster opens in browser<br/>Filtered, read-only view<br/>Zero access to messages or family photos"]1. Query pinning
Liam creates a Saved Search in Companion Memory:
- Filters:
category: receipt,tag: kitchen-renovation,date >= 2026-01-01. - Matches: 18 invoice documents and 4 building inspection PDFs.
2. Capability token generation
Liam selects Share Search:
- Access model: Capability token.
- TTL: 7 days.
- Passcode: Optional second factor.
3. Read-only sandboxing
When the adjuster opens the URL:
- The request bypasses session sign-in and authenticates exclusively via the capability token.
- The SQL query is strictly pinned to Liam’s saved criteria. The adjuster cannot alter parameters to search for medical records, emails, or unrelated files.
- When Liam finishes the insurance claim, he clicks Revoke Access, immediately invalidating the capability token.
Related
- Asking other Companions — screen-by-screen walkthrough of
/asksin Companion Memory - Asking and sharing architecture — the ToIP 4-layer dual stack, six-rung disclosure ladder, and five ADR invariants
- Decentralized trust (KERI and ToIP) — autonomic identifiers, Key Event Logs, pre-rotation, and OOBI pairing
- System architecture — data pipeline, hybrid search, and persistence architecture