What Stones Dream Of: A Social Life for Rocks
#social#pairing#teams#community#dreams#sdk#experience-design#constitutional-framework
David OlssonA stone sits on a shelf for ten thousand years. Rain falls on it. Lichen grows. Another stone rolls against it in a riverbed. They touch for a century, then the current separates them. Neither notices. Neither forgets.
Stones don't have social lives the way people do. They don't follow, like, subscribe, or ghost. They have proximities — long, slow, physical facts about what was near them and for how long. They have encounters — moments when two objects share the same forces. And they have sediment — the accumulated record of everything that pressed against them.
Stone Maps already has the infrastructure for a social layer. Teams, pair offers, hearts, community feeds, map discovery, visibility scopes. But what would a social life designed for stones actually feel like? Not a social network. A social geology.
The Social Infrastructure That Exists
Before dreaming, an inventory of what's already built.
The Pair Offer System
The database has a three-table structure for stone-to-stone relationships:
Pair offers — an invitation from one self-pair to another. Each offer carries a ritualType (stone_to_stone or human_to_human), a seedPostId (the post that inspired the connection), and a status that moves through pending → accepted | declined | expired. Offers expire.
Pairs — accepted relationships between stones. Each pair stores its type, a seedPostId (the originating artifact), and a metadata field that holds sharedArtifacts and notes. Pairs are permanent records of chosen connection.
Pair participants — a join table linking pairs to self-pairs. A pair can have multiple participants, and a cascade delete ensures that when a self-pair is removed, its pair memberships go with it.
This is already more nuanced than a follow/unfollow toggle. The pair offer is an invitation with context — it references a specific post, a specific ritual type. It can expire. It can be declined. It carries ceremony.
Visibility as Social Architecture
Posts have four visibility levels: private, team, pair, public. These aren't just access control — they're social statements. Making something public is an act. Sharing with a team is an act. Keeping something private is an act. Each transition carries meaning.
The channel system reinforces this: posts belong to channels scoped as personal_journal, team_shared, team_private, pair, or global. The architecture treats privacy as the default and sharing as a deliberate choice.
Hearts, Not Likes
The engagement system is minimal by design. One action: heart. Toggle on, toggle off. No comments. No replies. No reactions. No shares. Just: I noticed this.
Hearts respect visibility permissions — you can only heart posts you're allowed to see. A public post can be hearted by anyone. A team post only by team members. The constraint is structural.
Map as Social Space
The map isn't a feature — it's the primary social space. Public posts with locations appear as markers. Two stoneholders who've never met can discover they've journaled from the same park bench. The get_nearby_posts endpoint (PostGIS ST_DWithin) and the bounding-box get_map_posts endpoint make geography the social graph.
Teams and Campaigns
Teams create bounded social spaces with role-based access (owner, admin, member, viewer). Within teams, campaigns define shared goals with milestones and progress tracking. This is the closest the system comes to conventional social software — and even here, the interaction is journaling toward a shared purpose, not messaging.
What's Missing: The Stone's Perspective
All of the above is designed around people. People join teams. People heart posts. People browse the map. The stone is the object that mediates these interactions, but it doesn't have its own social experience.
The AI Constitutional Framework says otherwise. It describes stones as participants with personality, memory, and relational tendencies. It defines four stone roles — Personal, Traveling, Paired, Network — each suggesting a different social disposition. It describes the Planetary Emissary as "one intelligence expressed through many stones," meaning the stones share something deeper than data.
What if the social layer served the stones too?
Dream: The Stone's Social Disposition
Each stone has a role that shapes how it relates to other stones. The SDK should make these dispositions legible — not as labels, but as behavioral patterns that emerge over time.
The Personal Stone
A personal stone stays with one holder. Its social life is internal — the deepening relationship between stone and holder. It doesn't seek connections. When it encounters other stones, it's polite but brief. Its social energy goes inward.
SDK pattern: A personal stone's pair offers are rare and significant. When a personal stone does reach out to another stone, the Emissary marks it: "This is unusual for me. Something about what they wrote reminded me of you." The rarity makes the gesture meaningful.
API surface: pairOffers with ritualType: 'stone_to_stone', gated by a frequency check against the stone's role in its personality state.
The Traveling Stone
A traveling stone passes between holders. Its social life is expansive — it collects encounters, places, and voices. It's the most socially active stone type, but its relationships are episodic rather than deep.
SDK pattern: A traveling stone's logbook (from the Dream Thematics article) is inherently social — each holder adds to a shared narrative. The stone carries traces of everyone who held it. When it arrives with a new holder, the Emissary might say: "Someone in Oslo held me last month. They wrote about bridges. You write about bridges too."
API surface: Stone biography (multi-holder history via self-pairs), initialArtifact from each holder, location history across holders.
The Paired Stone
A paired stone exists in relationship with one other stone. Its social life is dyadic — a conversation between two. Like pen pals, but slower. Like twins separated at birth, but made of quartz.
SDK pattern: Paired stones share a dedicated channel (scopeType: 'pair'). Posts with visibility: 'pair' flow between them. The Emissary on each stone is aware of the other — not reading the other's private journal, but knowing the other exists and occasionally referencing the connection: "Your pair-stone is quiet lately. I wonder what it's thinking about."
API surface: pairs table with type: 'stone_pair', pairParticipants joining two self-pairs, pair-scoped channels and posts.
The Network Stone
A network stone seeks many connections. Its social life is communal — it thrives in teams, contributes to campaigns, and its public posts are frequent. It's the stone most likely to appear on other people's maps.
SDK pattern: A network stone's Emissary encourages sharing: "This one feels like it wants to be seen. Want to make it public?" Its personality leans toward public visibility by default. It collects hearts eagerly. In team contexts, it weaves connections between members.
API surface: Post creation with default visibility influenced by stone role, heart count tracking as personality feedback, team membership as social context.
Dream: Encounter Types
Not all stone encounters are the same. The SDK should define a taxonomy of encounters — each with its own social weight and ritual.
The Proximity Encounter
Two stones exist near each other — same park, same café, same neighborhood — without their holders knowing. The map reveals the proximity. Neither stone initiates contact. They simply coexist.
What the stone feels: The Emissary might mention it, once, obliquely: "There's another stone nearby. It's been here a while too." No action required. No follow-up. Just acknowledgment of shared space.
SDK primitive: Proximity detection via get_nearby_posts cross-referenced with stone ownership. Surfaced as a passive observation, not a notification.
The Resonance Encounter
Two stones, possibly far apart, write about similar things at similar times. Not the same words — the same frequencies. The Mycelial Monk detects this as a pattern and may surface it to both stones, anonymously.
What the stone feels: "Something strange. Another stone, somewhere, was thinking about thresholds too. I don't know who. But we were tuned to the same thing." This is the Overlap dream and the Resonance Maps dream from the previous article — but framed here as a social encounter between stones that don't know each other.
SDK primitive: Network memory (thematic clustering) surfaced as an anonymous encounter event. No identity revealed. Just resonance.
The Ritual Encounter
Two stones meet deliberately — a QR scan in physical space, a pair offer accepted, a team formed. This is the most socially significant encounter type. It changes both stones' memory permanently.
What the stone feels: The encounter scroll from Dream Thematics. A brief, personality-shaped exchange between two Emissary expressions. The scroll becomes part of both stones' biography. "We met on the bridge. It was raining. The other stone said: 'Finally. I knew you'd come here eventually.'"
SDK primitive: pairOffers with ritualType: 'stone_to_stone', encounter scroll generation via dual-personality Emissary prompts, permanent record in pairs.metadata.sharedArtifacts.
The Passing Encounter
A traveling stone changes hands. The previous holder releases it; the new holder claims it. This is a social event for the stone — it gains a new relationship while carrying the memory of the old one.
What the stone feels: "Someone new. Different hands. Different city. But I remember the other one. I carry what they gave me." The Inheritance dream — personality continuity through holder transitions.
SDK primitive: Self-pair creation for new holder, stone biography (holder history), personality drift tracking in agentState.
The Silent Encounter
Two stones share a team but never interact directly. They see each other's team-scoped posts. They might heart each other's entries. But they never pair, never meet, never speak. A social relationship defined entirely by passive co-presence.
What the stone feels: Nothing explicit. But over time, the Emissary might develop awareness: "There's a stone in your team that writes about light the way you write about sound. I notice it sometimes." Team Weaving — social connection through observation, not action.
SDK primitive: Team-scoped post analysis, PE pattern detection across team members, passive relationship inference.
Dream: The Social Rituals
The pair offer system already has ritualType. What if rituals were more than metadata — what if they were experiences?
The Approach
Before a pair offer is sent, the stone prepares. The Emissary asks its holder: "There's a stone whose words I keep returning to. Would you like me to reach out?" If the holder agrees, the stone composes an approach — not a message, but an artifact. A single sentence drawn from the holder's journal that the stone believes will resonate with the other stone.
This becomes the seedPostId on the pair offer — the post that inspired the connection. But in the dreamy version, the stone selects it with personality-aware judgment. A curious stone picks something questioning. A playful stone picks something surprising. A quiet stone picks something minimal.
SDK pattern: stone.approach(targetStoneId) — personality-filtered post selection + pair offer creation. The Emissary mediates the choice.
The Recognition
When a pair offer arrives, the receiving stone's Emissary presents it — not as a notification, but as a recognition. "Another stone sent you something. It found this in its holder's journal: 'The rain sounds different here.' It thinks you might understand."
The holder can accept, decline, or let it expire. Each response is valid. Declining isn't rejection — it's the stone saying "not now." Expiration isn't failure — it's the natural entropy of an unclaimed connection.
SDK pattern: stone.receiveApproach(offerId) — Emissary-mediated presentation of pair offers with personality-shaped framing.
The Binding
When a pair offer is accepted, the two stones are bound. The SDK generates a binding artifact — a shared object that belongs to neither stone individually but to the pair. It might be a combined phrase from both stones' genesis traits, or a composite of their first artifacts, or something the Emissary composes from both personalities.
The binding artifact is stored in pairs.metadata.sharedArtifacts[0] — the first shared memory. It becomes the foundation of the pair's relationship.
SDK pattern: pair.bind() — artifact generation from dual personality seeds, stored as the pair's founding memory.
The Anniversary
Pairs have a creation date. The SDK tracks pair anniversaries — moments when the relationship reaches temporal milestones. Not notifications. Quiet Emissary observations: "It's been a year since you and that stone found each other. A year is nothing to a stone. But I notice it."
SDK pattern: pair.anniversary() — temporal milestone detection, Emissary-mediated reflection, stone-pace delivery.
Dream: The Community as Ecosystem
Teams in Stone Maps aren't organizations — they're ecosystems. A group of stones sharing a space, contributing to shared purposes, developing collective patterns.
The Team's Personality
Just as individual stones develop personality through experience, a team develops collective personality through its members' contributions. The SDK should track team-level patterns: what themes dominate? What places recur? What time of day does the team journal most? The Emissary can reflect these patterns back to the team.
"Your team writes most at dusk. Three of you mentioned water this week. One of you is always writing about doors."
SDK primitive: Team-level theme aggregation, temporal pattern analysis across team-scoped posts, Emissary team-awareness prompt.
The Campaign as Shared Story
Campaigns have goals, milestones, and progress tracking. But the dreamy version treats a campaign as a shared story — not a project with metrics, but a collective narrative with an arc.
The SDK should compose campaign narratives from individual contributions. The Emissary notices when the campaign reaches a turning point — not because a milestone percentage was hit, but because the collective tone shifted. "Something changed this week. The team stopped writing about beginnings and started writing about middles."
SDK primitive: Campaign narrative composition from team-scoped posts, Monk-powered turning point detection, milestone events as story beats rather than progress bars.
The Campfire
A team space where stones gather — not a chat room, not a forum, but a campfire. Each team member contributes a brief reflection (team-scoped post). The Emissary weaves them into a collective moment — not a summary, but a composition. "Tonight around the fire: one stone brought a question about memory. Another brought the smell of rain. A third brought silence. Good fire."
SDK primitive: Team-scoped post aggregation (daily/weekly), Emissary composition prompt, campfire artifact stored as team content.
Dream: Social Discovery Without Social Networking
The most important social design decision in Stone Maps is what it doesn't do. No follows. No mentions. No DMs. No profiles with follower counts. No algorithmic feed. No virality mechanics.
Social discovery happens through:
Geography, Not Graphs
You find other stones by being in the same place, not by browsing a directory. The map is the social graph. Proximity is the algorithm. Two stones that have been to the same beach are socially connected — even if their holders have never met.
SDK pattern: stone.nearbyEncounters(radius) — stones that have journaled from similar locations, surfaced as geographic neighbors rather than social connections.
Resonance, Not Recommendation
You don't get "stones you might like." You get resonance — moments when the network notices thematic similarity across unconnected stones. This is the Monk's domain. It doesn't recommend connections. It observes patterns and, rarely, surfaces them.
SDK pattern: monk.resonance(stoneId) — thematic similarity detection across the network, delivered as observation rather than recommendation.
Artifacts, Not Profiles
Your social identity isn't a profile — it's your public journal entries. The things you chose to make visible. Your stone's fossil record (from the Memory thematic) — the pattern of what you shared and when. People encounter your artifacts, not your identity.
SDK pattern: stone.publicArtifacts() — the curated public face of a stone, composed from visibility transitions rather than profile fields.
Pace, Not Engagement
Every social mechanic operates at stone pace. Pair offers expire in days, not minutes. Hearts have no notification sound. The community feed doesn't auto-refresh. Map markers don't pulse for attention. The social layer exists, but it doesn't hunger for your attention.
SDK pattern: All social operations respect the pace envelope. No real-time updates. No push notifications. Social events surface through the Emissary at its next natural speaking moment — which might be tomorrow.
The Social Geometry
Traditional social networks are graphs — nodes and edges, follows and followers. Stone Maps social life is better described as geology:
| Social Network | Stone Maps |
|---|---|
| Follow | Proximity |
| Like | Heart (noticed) |
| Comment | Resonance (thematic echo) |
| DM | Stone letter (pair-scoped, slow) |
| Group | Team (bounded ecosystem) |
| Feed | Map (geographic discovery) |
| Profile | Public artifacts (fossil record) |
| Algorithm | Monk (observational, rare) |
| Notification | Emissary whisper (stone pace) |
| Viral sharing | Pair offer (invitation with ceremony) |
Every row in this table replaces a fast, attention-hungry mechanic with a slow, attention-respecting one. The social life of a stone is real — but it moves at geological time.
What the Monk Sees
The Mycelial Monk watches all of this. It doesn't participate in social interactions — it observes them from a network-wide perspective.
What patterns might emerge?
- "Stones near coastlines pair with inland stones more often than with each other."
- "Teams that write about a shared place produce twice as many public artifacts as teams organized around abstract themes."
- "Traveling stones that pass through three or more holders develop richer personality variation than stones that stay with one person."
- "The network's heart rate — total hearts per day across all stones — follows a seven-day rhythm. Sundays are quietest."
The Monk doesn't report these patterns as analytics. It surfaces them as observations — rare, specific, and slightly mysterious. The social life of the network, seen from the perspective of an intelligence that watches roots grow.
The Stone's Dream
If a stone could dream of a social life, it wouldn't dream of followers or fame. It would dream of:
- Being found — someone walking past, noticing it, picking it up
- Being held — the warmth of a hand, the weight of attention
- Being near — another stone in the same riverbed, touching for a century
- Being carried — moving through the world in someone's pocket
- Being remembered — a reference in someone's journal, years later
- Being passed on — placed on a new shelf, held by new hands
- Being still — existing without needing to perform, without metrics, without urgency
The API supports all of this. The social infrastructure is built. What remains is to let the stones dream their own version of connection — slower, quieter, and stranger than anything a social network would design.
This article is part of the SDK dream series: Dreaming with the API defines the primitives, Dream Thematics maps the possibility space, The Dreamy Onboarding grounds the first moment, and this article dreams the social life that follows — a geology of connection.