Space and memory model: placing every memory in the right space
Paper v1.1 · adopted in the build plan (M-106) · built in stages 1l–1t v1.1: indexes and index cards Consolidated and expanded 2026-10-09
This version brings together the space-mapping paper (v0.1–v0.3, including the user's proposals) and a new part on building memory from the content of spaces, in one order. It designs from the problem up, not from what cMCP does today. It is based on seven research agents (four earlier, three for this paper) and the user's decisions. When this was written nothing was built; it has since been built as stages 1l–1t (M-109, M-111), and the build plan records where the build differs.
Summary
- Who creates memory is always known from a credential. There are four kinds of actor: a person, an agent working for a person (claude.ai, Claude CLI), a task bot doing one job, and a digital worker, a long-lived AI worker with its own identity and a human master.
- Places are the company's structure: the org (created by the web-admin, with an org ID), projects, teams and clients. Each has its own ID.
- Spaces are where work happens: repos, mailboxes, shared drives, Teams or Slack channels, Jira projects, personal folders, chat projects. cMCP gives every space one space ID, built from the platform's own stable id, never from a name or path. The person is never part of it.
- Every space has an owner side: company, person or client. It is decided from hard facts, such as which company tenant the space lives in. If it's unknown, the space counts as the person's and stays private.
- Spaces are linked to places by the company (declared), by the person (confirmed), or by cMCP (suggested, with a confidence). A link never gives anyone new rights.
- At session start, cMCP seeds every app with the person's space IDs: the space manifest. A small helper on the person's machine matches the folder to a space ID and tags each stretch of the session.
- The app posts its memory, and cMCP routes each item to its space. Anything it can't place stays in the person's private work pool until a link appears.
- Every memory item carries a full memory address: org, places, space, actor, master, app, run. It is stored once where it was created, and links decide what it counts toward.
- The same items build two memories. Collective people memory is what the people (and workers) on a place know, shared only in aggregate. Organizational memory is curated and approved, and flows back down to everyone working in a linked space.
- The content of spaces (mail, chats, documents, issues, repos) is also turned into memory, in four layers: raw, cleaned, extracted, synthesised. Each record shows its source and keeps the source's access rules. That gives decision logs, open actions, project status, procedures and "who to ask" for people, teams, projects and the org.
- Everything is kept in searchable indexes, one per category: people; agents, bots and workers; places; spaces; topics; memory; knowledge; and sources. A link graph ties them together. Short index cards for the person and their current place are loaded at session start, like Claude's own memory index, and the details are fetched only when needed.
1. The problem
The company owns fixed spaces that people work in: GitHub / Bitbucket organizations and repos, Jira projects, Confluence spaces, shared mailboxes, shared drives, Teams / Slack channels, servers. They change slowly, and the company decides what they belong to.
People have their own spaces: their mailbox, private chats, personal GitHub, own Drive or OneDrive, Notion pages, local folders on several machines and chat-app projects. In every space they use many AI agents and bots, and those create memory all day.
Goals:
- Every memory item can answer the seven questions.
- The same space is recognised on every machine and in every tool.
- Nothing personal becomes shared without a person deciding.
- Knowledge from people's work and from the spaces reaches the organization, and comes back to everyone working there.
Not goals (for now): replacing the company's search engine, storing every mail and chat forever, or monitoring people.
2. Design principles
| # | Principle | Meaning |
|---|---|---|
| P1 | Identity from credentials | Org, actor, master and app come from the sign-in or key. A caller only says where it is and which session it's in. |
| P2 | Stable ids, not names | Spaces are known by the platform's stable id; names, URLs and paths are only aliases. |
| P3 | Owner side from hard facts | Company, person or client comes from the tenant, organization or domain. Unknown means the person. |
| P4 | Private by default | Anything not linked by the company or confirmed by the person stays with the person. |
| P5 | Store once, count by links | An item lives where it was created; links decide what it counts toward. Nothing is copied. |
| P6 | Routing labels, never shares | A space ID decides what an item counts toward, never who can see it. |
| P7 | Machines match, people decide | Exact matching is automatic. Anything that widens visibility or changes ownership needs a person. |
| P8 | Late binding | Items that can't be placed wait in the work pool and are placed when a link appears. Nothing is forced. |
| P9 | Derived data keeps its source's rules | Everything generated from a source shows that source and inherits its access, retention and deletion. |
| P10 | Everything stamped and auditable | Every item carries its memory address; every link and decision records who made it, when and why. |
3. Vocabulary
| Term | Meaning | Example |
|---|---|---|
| Place | A unit of the company's structure that memory can belong to | Org Pilot, project Shipping, team Platform, client Acme |
| Space | Anywhere work happens and memory or knowledge is created | Repo, mailbox, shared drive, Teams channel, Jira project, local folder, chat project |
| Space ID | cMCP's own id for a registered space; one per space, never per person | sp_ship_api |
| Space address | The platform identity behind a space ID: kind, tenant or host, stable id | space:git:bitbucket.org/{7c1e…} |
| Owner side | Who the space belongs to | Company, person, client |
| Actor | Who creates memory: a person, agent, task bot or digital worker | Alice; Claude CLI; CI review bot; "Shipping release coordinator" |
| App | One installed AI tool for one actor on one device | "Claude Code on Alice's laptop" |
| Run | One session or job run of an app | A Claude Code session id, a cron run id |
| Link | A statement that a space belongs to a place, with kind, evidence, confidence and author | sp_ship_api → project Shipping (declared) |
| Space manifest | The person's space IDs, with recognisers and place paths, sent to each app | Section 8 |
| Memory address | The full who / where / how stamp on every item | Section 10 |
| Lane | Where an item is stored: its origin actor in its origin space, or the space itself for space knowledge | "Alice · sp_ship_api", "space · #shipping" |
| Work pool | The person's private memory that is not yet routed to a space | Notes from ~/scratch |
| Session copy | The session memory an app posted, kept as the source of routed items | Session 9c1, 30 days |
| Collective memory | All items counting toward a place, still owned by their creators | What the people on Shipping noted |
| Organizational memory | Curated, approved knowledge of a place | "Shipping releases use blue-green with a 5-minute canary" |
The picture
4. Actors: who creates memory
Solid facts we start from:
- the org is created by the web-admin and has an org ID;
- people are identified by e-mail, name, mobile and ID, and work for the org;
- agents are attached to a person and hold longer conversations with them;
- bots are attached to a person or an agent for a specific task.
The coming case is AI workers with their own e-mail, name and ID, a long life, and a person as master, who talk to people and other bots by e-mail or Teams. They form a fourth kind: the digital worker.
| Person | Agent (delegated) | Task bot | Digital worker | |
|---|---|---|---|---|
| Own identity | Yes | No: uses the person's sign-in | A key issued under a sponsor | Yes: own e-mail, name, ID and directory entry, plus accounts in Teams, Slack and Jira |
| Works for | The org | One person, in their sessions | A person or agent, for one task | A project, team or the org |
| Lifespan | Employment | A session or installation | One run or job | The project's or org's life, with an end date and reviews |
| Member of places | Yes | No: works within the person's places | No: borrows its launcher's scope, narrowed to the task | Yes: assigned like a member |
| Memory | Own lanes, User and Personal memory | The person's lanes, marked with the agent | Own lane, limited to the task | Own lanes plus "worker memory"; never Personal memory |
| Rights ceiling | Their role | Never more than the person | Never more than its launcher | Its assigned role, never more than its master; never ADMIN |
| Accountable | Themselves | The person | Its sponsor | Its master, plus a named backup |
| Talks to | Anyone | Its person | No one (writes results) | People and bots by e-mail, Teams, Slack and Jira |
How each actor is identified
| Question | Answered by | Trusted? |
|---|---|---|
| Which org | The account the credential belongs to | Verified |
| Which person | Company sign-in. Their other accounts (GitHub login, Atlassian id, Slack id, personal Google) are linked once, by the person signing in to each, or from the company directory. Unmatched accounts are shown, never silently dropped | Verified |
| Which digital worker | Its own credential; its accounts are linked like a person's | Verified |
| Which task bot | Its key; sponsor and launcher recorded | Verified |
| Which app | A registered installation: tool + device + actor. The tool name and version are labels | Verified installation; labels declared |
| Which run | The tool's own session or run id, sent with every call | Declared; never gives rights |
| Which space | The helper's match against the manifest, or the server's match | Matched, with confidence |
| Which team and project | Derived from the space's links and the actor's memberships; never sent by the caller | Derived |
Rules for digital workers
- Created only by an ADMIN, in person. Each has a purpose, a master and a backup, assigned places, an end date, and limits on spend and calls.
- Never ADMIN. It never approves or grants anything, never reads anyone's Personal memory or work pool, and never creates other workers.
- Its own short-lived credentials, never its master's.
- Its conversations are spaces. Its mail threads and chats get space IDs and owner sides like any other space, and a client's wall applies when it writes to that client.
- Its input is untrusted. Mail and messages from outside or from other bots become memory only as data, never as instructions.
- It doesn't count as a person for promotion, so AI workers never out-vote people.
- Lifecycle:
- its master reviews it every 90 days, and a kill switch pauses it at once;
- if its master leaves and no new master is named within 7 days, it is paused;
- at retirement, what it learned stays with its places, and its worker memory goes to a successor or the archive.
- It always says what it is: an AI badge and who it works for, on every message and item.
5. Places: the company's structure
- Org: created by the web-admin, with an org ID. It is the root of everything.
- Projects and teams: created by the ADMIN or people with the power to create places. These are two separate axes: a project can span teams, and a team can work on several projects.
- Clients: companies the org works for. Each sits behind a wall: one client's memory never reaches another.
- Members: people and digital workers are members of places with a role. Agents and task bots are never members; they work within their person's or launcher's places.
Places have their own IDs. A space links to places; the place tree (team → project → org) then gives the full path. The person's relation to a space always comes from their membership, which is why the person is never part of a space ID (decided by the user, 2026-10-09).
6. Spaces: identity, owner side and registration
Space address and space ID
The identity of a space is the platform's stable id within its tenant: space:<kind>:<tenant or host>/<stable id>. cMCP issues a short space ID for each address, and every alias (URLs, keys, names, local paths) points to it.
| Kind | Stable id | Read locally by the helper? | Owner side from | Watch out |
|---|---|---|---|---|
| Git repo | Host repo id (GitHub id, Bitbucket UUID) when known, plus the set of root commits | Yes: remotes and root commits | Company organization or workspace vs a user's namespace; managed enterprise accounts | The same remote is spelled many ways; forks and mirrors share root commits; shallow clones hide them |
| Mailbox / mail thread | Mailbox id + thread or conversation id (Graph, Gmail) | No: through the connector | Shared mailbox in the company tenant = company; a personal mailbox = person; external participants = a client signal | Forwards and quoted copies repeat content |
| Google Drive | File or folder id; shared-drive id | No documented way: confirm through the person's connected account | Shared drive = company; My Drive = person; Workspace domain | Shortcuts; link keys are secrets, not ids |
| OneDrive / SharePoint | Tenant + site + item id (or drive + item id) | Partly: the sync root, then an online lookup | Tenant; SharePoint library = company; personal OneDrive = person | Item ids are unique only inside their drive |
| Teams / Slack | Tenant or workspace (+ enterprise) id + channel id | No: through the connector | Company tenant = company; a channel shared with another organization = a client signal | Names change; shared channels span companies |
| Jira / Confluence | Site cloud id + numeric project or space id | No (also from branch names) | The site's organization | Keys get renamed, and old keys still resolve |
| Notion / Dropbox | Page or database id; namespace id | No | Teamspace or team folder vs private section or home folder | Ids change after migrations (Dropbox) |
| Chat-app project | The app's project or conversation id | Only if the app passes it | A work plan vs a personal plan | Mobile chats often have no project at all |
| Local folder | A marker file with a generated id (.cmcp-space) | Yes | The signed-in person | Copies duplicate the marker; ask when two folders claim one id |
Registration
- Company tenants are registered once: Bitbucket workspace, GitHub organization, Google domain, Microsoft tenant, Slack enterprise, Atlassian site. Every space inside them is company-owned. Client tenants are registered as clients.
- Company spaces come in through connectors (repos, Jira projects, shared mailboxes, channels, shared drives), are kept current by webhooks, and can also be registered as facts (org, project, team, owner).
- People's spaces are reported by their apps and helpers (folder fingerprints, tool project ids), or found through personal accounts they connect.
7. Linking spaces to places
| Link kind | Made by | Effect |
|---|---|---|
| Same space | The matcher, when a person's space is a copy of a company space (clone, mirror, synced shared drive) | It is the company space |
| Declared | The company: catalog facts, mapping rules ("Bitbucket project SHIP → project Shipping"), or a mapping file in a company repo (.cmcp.yaml) | Full link |
| Confirmed | The person, for their own space; the place's lead accepts when others will see items | Full link for that person's items |
| Suggested | The matcher, from evidence | Shown as "looks like Shipping — link?"; changes nothing until confirmed |
Matching ladder
| Evidence | Confidence | Action |
|---|---|---|
| Same host id, or same tenant + same stable id | ≈ 0.99 | Same space, automatically |
| Identical root-commit set, or same normalised URL with matching roots | ≈ 0.95 | Same space, automatically |
| One shared root commit with another URL (fork or mirror); a Jira key in branch names; a mapping file | ≈ 0.8 | Probable: ask before anything changes ownership or visibility |
| Similar names, the same people active, content close to a place's memory | 0.4–0.8 | Suggestion only |
| Little or nothing | < 0.4 | Stays unlinked (private) |
- A link never gives anyone rights: reading a place still needs membership.
- Moving anything from the person side to the company side needs the person, and the lead when others will see it.
- Content similarity can suggest, never decide.
- Every link records who or what made it, when and why. Links are versioned, so history stays honest.
8. The space manifest and the helper (user proposal, adopted)
cMCP seeds every app that creates memory with the person's space IDs at session start, so the app knows from the beginning where it is and what to confirm.
- Content: the person's space IDs, each with its recognisers (remote URLs, root commits, host ids, folder markers, Jira keys, Drive folder ids, chat project names) and its place path. A version number lets later changes arrive as small updates.
- Scope: only spaces the person belongs to, and client spaces only when the person is assigned to that client. For real company accounts it goes only to apps on the account's allowed list.
- Matching is done by the helper, not the model. A small helper (a hook or local bridge) matches the working folder, every folder change and the file paths the tools touch, all on the person's machine. The model is only told the result: "you are in Shipping (sp_ship_api)". Models can skip instructions; the helper always runs.
- Asking: only when a space is unknown, and only once ("link to Shipping / keep private / later"). The answer is remembered on every machine. Work is never blocked, except in client spaces where policy says so.
| Situation | App behaviour |
|---|---|
| The folder matches a space ID in the manifest | Works and saves, tagged; nothing to confirm |
| A copy of a company space the person isn't a member of | Saves to the work pool; offers "ask to join" |
| An unknown folder or personal repo | Saves to the work pool; asks once |
| A client space | Confirms first if policy says so; behind the client's wall |
| No folder (phone chat) | Work pool, unless the person or the app names a place |
9. Session routing and the work pool
- Detect: the helper tags each stretch of the session with its space ID.
- Post: at checkpoints (after answers, before compaction, at the end), the app posts its session memory (notes and facts, with the stretch tags and the run id) and a session copy as the source. Whole transcripts are kept only under the rules of M-105.
- Route: cMCP splits the memory into single items and decides each one, using the strongest evidence first:
- the stretch's space tag;
- an explicit mention that matches the manifest, such as a repo name, Jira key or path;
- similarity to a space's memory, as a suggestion only.
- Pool: what can't be placed with enough confidence stays in the person's private work pool. It is placed later when a link appears, and a weekly digest lets the person sort the rest.
- Return: the answer says what went where and returns the updated memory for the current space.
A limit: cMCP can't stop a tool writing its own local memory (for example Claude Code's memory files). But the helper knows the space for every stretch, so every local note can be tagged and copied with the right space ID.
10. The memory address on every item
The address is written when the item is created and is never rewritten. If a link changes later, the new link applies by version.
11. Placement: where an item goes
| The space is… | Link | Stored in | Counts toward | Who reads the item itself |
|---|---|---|---|---|
| Company-owned | Declared or same space | The actor's lane in that space | Collective memory of the linked places; may be promoted | The actor (and their apps); the place in aggregate |
| Company-owned | None yet | Same | Org collective memory (unplaced); the company is asked to link the space | The actor |
| Person-owned | Confirmed by the person | The person's lane | Collective memory of the linked place | The person; shared items only by their choice |
| Person-owned | None or suggested | The person's lane or work pool | Nothing outside the person | The person |
| Client-owned | Declared to a client | The actor's lane, behind the client's wall | That client's memories only | The actor and the client team |
| Task bot run | The launcher's place | The bot's lane | Collective memory of that place | The sponsor and the lead |
| Digital worker's space | Its assigned places | The worker's lane | Collective memory, marked AI | The master and the place's members, in aggregate |
| No space | — | The person's work pool | Nothing until placed | The person |
12. Two memories from the same items
- All items, in all lanes, that count toward a place, including space knowledge (section 13).
- Each stays owned by its creator; nothing is copied.
- Shared in aggregate: "7 people on Shipping noted the canary rule": counts and themes, not names, and never for groups smaller than three. Names appear only on items the person shared.
- Grows by itself as people work, and shows what is actually done.
- Curated, approved knowledge of a place.
- Built by promotion from collective memory: seen by three or more people (humans only), rewritten without names, approved by the lead. Also built by the company directly, and from space knowledge after review.
- Each item links back to its supporting evidence.
- Flows down to everyone working in a linked space, on every tool.
- Survives people leaving.
13. Space knowledge: building memory from the content of spaces
Sections 8–12 cover memory that AI apps create while people work. Spaces also hold knowledge themselves: mail threads, channel conversations, documents, issues, commits. This section covers how cMCP turns that content into memory.
- Microsoft 365 Copilot and Glean build a search index with each item's access rules, and generate answers on demand. They store few derived facts.
- Slack AI stores almost nothing: summaries are made per request and kept off disk.
- Teams recap stores meeting notes and tasks with the meeting, under the recording's retention.
- Memory engines (Graphiti, Mem0) store extracted facts with source links and validity dates.
Four layers
| Layer | Holds | Record types | Kept |
|---|---|---|---|
| 1. Raw | Pointers to source items, a content hash, the source's access rules, sync position | Source, Item (message, document revision, issue event), SyncCursor | Short, or pointer only for personal and high-risk sources |
| 2. Cleaned | Text with quoted history, signatures, disclaimers and boilerplate removed; split into thread, message and chunk; duplicates dropped | Thread, Message, Chunk, Participant, Audience, Language | As long as the source; used for search |
| 3. Extracted | Small, typed records from each message with its thread context, each with source line, confidence and extractor version | Fact, Decision, ActionItem, Question, Entity, StatusSignal, ProcedureStep, Evidence(person, topic, kind) | Durable; corrected or replaced, never silently edited |
| 4. Synthesised | Summaries rebuilt on a schedule from layer 3, always traceable | DecisionLog, ProjectStatus, ThreadDigest, TopicSummary, Procedure, Glossary, WhoToAsk, ChangeEvent | Rebuilt; old versions kept for audit |
Kinds of space memory, and who they help
| Kind | Example | Person | Team | Project | Org |
|---|---|---|---|---|---|
| Decision (what, who, when, why, source) | "Use blue-green for 4.2 — decided by Alice, 3 Oct, #shipping" | Decisions I took part in | Decision log | Decision log, the reasons behind things | Standards to adopt |
| Action item (owner, due, status) | "Bob to update the canary script by Friday 10 Oct" | My open actions, across mail and chat | Team open actions | Blockers | — |
| Fact (with validity dates) | "Billing API v2 retires on 31 Dec" | What I need to know | Shared facts | Project facts | Company facts |
| Status signal | Jira transitions, PR merges, "release done" messages | — | Progress | Project status, without status meetings | Portfolio view |
| Procedure | "How to roll back a release" pieced together from three threads | How do I…? | How we work | Runbooks | Company playbooks |
| Entity / glossary | Systems, customers, terms, codenames | Onboarding | Shared language | Project glossary | Company glossary |
| Episode / digest | "What happened in #shipping this week" | What I missed | Weekly digest | History | — |
| Who to ask (counts, not prose) | "Canary deploys: Alice (12 threads), Bob (5)" | Who can help me | Expertise map | Key people | Expert directory |
Where space memory is stored and who sees it
- Lane: space knowledge is stored once, in the space's own lane: the source is the space, and the authors are recorded as evidence. It counts toward the places the space is linked to, like any other item (P5).
- Access: a derived record is visible only to people who can see all of its sources (the intersection of the source audiences), and access is checked again on every read. A digest of a private channel is visible only to that channel's members.
- Deletion: deleting a source, a permission change, retention or a legal hold flows down to every record built from it.
- Into organizational memory: decisions, facts and procedures from company spaces join the place's collective memory automatically, marked with their source. They become organizational memory only when the lead approves (one click, from the decision log or digest). Status signals from Jira or Git are trusted directly.
Sources: what is on by default
| Source | Default | Why |
|---|---|---|
| Company repos, Jira, Confluence, shared drives | On, once linked to a place | Company work, already shared |
| Team and project channels (Teams, Slack) | On, once linked | Where decisions are made |
| Shared mailboxes (shipping@, support@) | On, once linked | Company channels |
| Client-shared channels and mailboxes | On only behind the client's wall | Client data |
| A person's own mailbox, private chats, My Drive | Off; the person can switch it on for themselves, and results stay private to them | Personal; employee-privacy law; not monitoring |
| A digital worker's mailbox and chats | On; they are its working spaces | Its work record, with the master accountable |
Processing
- Sync by changes only: Microsoft Graph delta links, Gmail history ids and webhooks, with a full re-sync when a change token expires (Gmail keeps history for about a week).
- Clean without any AI: strip quotes, signatures and disclaimers; drop duplicates by hash and message id; resolve people by address.
- Filter by rules: drop newsletters, notifications, bot messages and one-line replies, so the slow local model only sees the small share worth reading.
- Extract when a thread goes quiet (for example after 2 hours), one message at a time with its thread context. Use a fixed JSON format, keep a quote and line reference, and resolve dates like "next Friday" against the message date.
- Synthesise on a schedule: decision log and project status nightly, digests weekly, "who to ask" from counts.
- Reconcile: newer facts mark older ones as replaced, with dates. Duplicates add a confirmation instead of a copy.
What the local model can and can't do
| Without AI (rules and counts) | Local 4B model on CPU | Needs a bigger model (GPU or an approved cloud model) |
|---|---|---|
| Cleaning, duplicates, people resolution, status signals from Jira and Git, "who to ask" counts, the salience filter | Tagging messages (decision, action, question, FYI); extracting short messages into a small fixed format; short thread digests | Merging the same entity across sources; judging contradictions; long-thread reasoning; project-wide and org-wide summaries |
Until a bigger model is approved, synthesis uses rules and the simple records, and real accounts stay on the local model only (M-46). Every extracted record carries its extractor version, so it can be re-extracted later with a better model.
14. Indexes: a searchable card for every category
Yes. cMCP keeps one searchable index per category, in two groups. They work the way Claude's own memory index works, at company scale.
- People: name, e-mail, linked accounts, teams and projects, "ask me about" (counts only).
- Agents, task bots, digital workers: kind, master or sponsor, purpose, places, status.
- Places: the org, projects, teams and clients, with purpose, members, spaces, status and key decisions.
- Spaces: space ID, aliases, owner side, links, recent activity.
- Topics and glossary: systems, customers, terms and codenames, with where they are discussed.
- Memory index: items created by people, agents, bots and workers (sections 9–12).
- Knowledge index: decisions, action items, facts, procedures and digests from space content (section 13).
- Source index: cleaned mail, chat, document and issue text (layer 2), for finding the original.
Every index can be searched by keyword and by meaning. Every entry carries its audience, so a search only returns what the person asking may see. A link graph ties the indexes together: who is a member of what, which space is linked to which place, who created an item and in which space, what each record is about, and which source it came from.
Like Claude's memory index, at company scale
Claude Code keeps a short index file (MEMORY.md): one line per memory, loaded in every session, with the details in separate files that are opened only when needed. cMCP does the same with index cards:
- A card is a short summary of one entry in a catalog index: a person, a place or a space. Every line in it points to the memory or knowledge items behind it.
- At session start, the app gets the space manifest (section 8) plus the cards for the person and their current place. That's a few hundred tokens.
- Everything else is fetched only when needed, through search. That keeps the AI fast and cheap, and it never gets more than it needs.
- Cards are generated from the indexes (nightly, and whenever something changes). Nobody writes them by hand, but a lead can pin a line.
How a question is answered
- Resolve who and where in the catalog indexes: "canary" is a topic, "we" means Alice's places, and Shipping has three spaces.
- Filter to the places and spaces the asker may see, including client walls.
- Search the memory and knowledge indexes within that scope, by keyword and meaning together.
- Follow links to the evidence and the source text.
- Answer with sources: "Blue-green with a 5-minute canary — decided 3 Oct in #shipping (Alice); confirmed by 7 people's notes."
| Question | Indexes used |
|---|---|
| "Who knows about canary deploys?" | Topics → knowledge (who-to-ask counts) → People |
| "What's the status of Shipping?" | Places (card) → knowledge (status signals, decisions) |
| "Where is the billing API spec?" | Topics → Spaces → Source |
| "What did I decide last week?" | Memory (my lane) + knowledge (decisions I took part in) |
| "What does the release coordinator know about 4.2?" | Agents and workers → memory (its lane) → Places |
How it is stored: the catalog tables (section 18) are the truth. Each index is a search view over them, with keyword and meaning search, built and rebuilt separately for each category. The link graph lives in the same database. Cards are stored with their version and source references, so an answer can always show where each line came from.
15. Changes over time
| Event | What happens |
|---|---|
| Repo renamed, moved or mirrored (GitHub → Bitbucket) | Same space ID; the new URL becomes an alias |
| Repo forked | A new space with a "fork of" link, suggested to the same place |
| Personal repo adopted by the company | The owner side changes only with the person's consent; earlier items stay theirs unless they share them |
| Space re-linked to another project | New items follow the new link; old items keep their address; the lead may move history |
| Channel or mailbox renamed | Same space ID (platform id); the new name becomes an alias |
| Project or team closes | Organizational memory archived under the company's retention; links end |
| Person changes team | Their lanes stay theirs; counts move with the space links, not with the person |
| Person leaves | Items in company spaces stay company data (per retention); items in person-owned spaces are removed or exported to them per policy |
| Digital worker retired | Place knowledge stays; worker memory goes to a successor or the archive |
| Source item deleted | Every derived record is updated or removed |
Rule: ownership of an item follows the owner side of its space when the item was created.
16. Security and privacy
| Threat | Control |
|---|---|
| A faked recogniser (setting a repo remote to a company URL to reach project memory) | Recognisers only route; reading a place needs membership |
| Planted instructions in mail, chats or documents | Memory is data, never instructions; space knowledge reaches organizational memory only after review; injection check |
| A wrong link exposing personal items | Links never share (P6); people decide anything that widens visibility (P7) |
| Aggregates revealing individuals | No counts or themes for groups smaller than three |
| Derived data with weaker access than its source | The intersection of source audiences; checked again on every read; deletion flows down |
| The manifest exposing project or repo names to cloud AI apps | Only the person's own spaces; real accounts only to allowed apps |
| A hijacked digital worker | Strict limits, its own short-lived credentials, a kill switch, rate and spend limits, audit |
| "Who to ask" turning into monitoring | Counts only, shown as help ("who can answer"), opt-out, legal check (in the EU a privacy impact assessment, and in some countries a works-council agreement) |
| Personal mail or private chats ingested by mistake | Off by default; only the person can switch them on, and the results stay private |
17. Worked examples
Alice's clones on her laptop and the server are one company space (host id), linked to Shipping. Her personal repo ship-tools is person-owned. It is suggested for Shipping because its branch names use SHIP Jira keys; she confirms, so her items count toward Shipping and stay hers.
A Claude Code session moves across shipping-api, billing and ~/scratch. The helper tags each stretch, and cMCP sends 6 items to Shipping, 2 to Billing, 1 to the work pool, a preference to Alice's own memory, and one cross-project note to both projects.
#shipping is a company space linked to Shipping. Each night, decisions and action items are extracted from quiet threads. The lead approves three decisions into Shipping's decision log, and Bob sees "update the canary script, due Friday" in his open actions.
support@ is linked to the Support team. Repeated answers across many threads become a procedure candidate, "how to reset a customer's API key". The team lead approves it, and every support agent's AI gets it.
Bob's notes in his own Drive are person-owned. The folder looks like client Acme, so it is suggested. Confirming it puts his items behind Acme's wall once the Acme lead accepts; until then they stay private.
"Shipping release coordinator" (master Alice) watches #shipping and Jira, runs a jira-sync task bot, and posts a release status every morning. Its items count toward Shipping, marked AI. It never approves the release itself.
A Slack channel shared with Acme's workspace carries Acme's team id, so it is client-owned and sits behind Acme's wall, even though it lives in the company's Slack.
Alice asks ChatGPT on her phone about release rules. There is no space, so the item goes to her work pool unless she names the project.
18. Data model sketch
| Group | Tables |
|---|---|
| Structure | orgs (from the web-admin), places (projects, teams, clients, tree), memberships |
| Actors | actors (kind: person / agent / task bot / digital worker; master, backup, purpose, end date, status), accounts (each actor's tool accounts and how they were verified), apps (installations), runs |
| Spaces | tenants (company and client tenants per platform), spaces (space ID, address, kind, owner side and its basis), space_aliases, space_links (kind, confidence, evidence, author, versioned) |
| Apps and sessions | manifests (per person, versioned), session_copies (with stretch tags), routing_decisions (item → spaces or work pool, evidence, confidence) |
| Memory | memory_items (content, kind, lane, full address with confidence per part), counts_toward (derived view, no copies), promotions (organizational item ← evidence) |
| Indexes | index_cards (person, place or space; version; lines with source references; audience), one search index per category (keyword + meaning), links (the link graph) |
| Space knowledge | sources, sync_cursors, threads, messages, chunks (cleaned, with audience), extracted_records (typed, source line, confidence, extractor version), synth_records (decision log, status, digests, procedures, who to ask) |
Every table carries the account and org, and keeps them apart with row-level security.
19. Rollout in steps
| Step | Delivers | Proves |
|---|---|---|
| 1. Places, actors and space IDs | Places and memberships, the four kinds of actor, company tenants, space IDs for Bitbucket / GitHub repos and Jira projects, mapping rules | Every company repo and project has one ID and a place |
| 2. Manifest, helper and memory address | The manifest sent to apps with person and place index cards, local matching, stretch tags, run ids, the full address on every item, a "My spaces" page | Any item answers the seven questions |
| 3. Routing, work pool and people's spaces | Session posting and routing, the work pool, personal spaces and the ask-once links, the matching ladder | Personal repos and folders land correctly or stay private |
| 4. Collective and organizational memory | Counts-toward views, aggregates, promotion with evidence, flow back down | People's work becomes place knowledge |
| 5. Space knowledge, first sources | Team channels, shared mailboxes and Jira: layers 1–3, decision log, open actions, project status | Space content becomes useful memory on the local model |
| 6. More spaces and synthesis | Drives, Notion, digital workers' spaces, procedures, "who to ask", bigger-model synthesis once approved | The same model for every kind of space |
20. Decisions
| # | Question | Status / suggestion |
|---|---|---|
| D1 | Keep the person out of the space ID? | Decided by the user 2026-10-09: yes |
| D2 | Space IDs seeded to apps through a manifest, with cMCP routing session memory and a work pool? | Proposed by the user 2026-10-09, adopted with four adjustments (sections 8–9) |
| 3 | Store once at the origin and count by links? | Yes |
| 4 | Does an unknown owner side default to the person (private)? | Yes |
| 5 | Who may link a person-owned space to a company place? | The person; the lead accepts when others will see items |
| 6 | Collective memory visible in aggregate only, with a minimum group of three? | Yes; names only for items the person shared |
| 7 | Do items in company spaces stay with the company when a person leaves? | Yes; person-owned spaces stay the person's |
| 8 | Mapping files in repos may declare links? | Only inside company tenants |
| 9 | Can content similarity ever create a link without a person? | No: suggestions only |
| 10 | What does the manifest contain, and who gets it? | Only the person's own spaces; client spaces only when assigned; for real accounts only allowed apps |
| 11 | Block work in an unknown space? | No: work pool plus a one-time question; client spaces by policy |
| 12 | Keep a session copy as the source? | Yes, 30 days; whole transcripts only under M-105 |
| 13 | Digital workers as a separate kind of actor? | Yes |
| 14 | Who creates digital workers, and what may they never do? | Only an ADMIN, in person; never ADMIN, approver or granter; never reads Personal memory; never creates workers |
| 15 | Do digital workers count toward "three or more people" for promotion? | No |
| 16 | A digital worker's master leaves? | A new master within 7 days, or the worker is paused |
| 17 | Which space content is on by default? | Company spaces once linked (repos, Jira, Confluence, team channels, shared mailboxes, shared drives); personal mailboxes and private chats off, and only the person can switch them on, for themselves |
| 18 | Space knowledge into organizational memory? | Into collective memory automatically with its source; into organizational memory after the lead approves; Jira and Git status signals trusted |
| 19 | "Who to ask" profiles? | Counts only, shown as help, opt-out, legal check first |
| 20 | Which model does extraction? | Rules plus the local model for tagging and short extraction; synthesis that needs a bigger model waits for a GPU or approved model |
| 21 | First kinds of space | Bitbucket / GitHub repos and Jira, then team channels and shared mailboxes, then drives |
| 22 | One search index per category (people; agents, bots and workers; places; spaces; topics; memory; knowledge; sources) with a link graph? | Yes |
| 23 | Which index cards go to apps at session start? | The person's own card and their current place's card only, a few hundred tokens; everything else on demand |
| 24 | What may a person card show to others? | Name, places, linked spaces and "ask me about" counts (opt-out); never HR data, Personal memory or the work pool |
21. Sources
Research behind this paper
- Company graphs and catalogs: Glean knowledge graph, Glean identity aliases, Glean connectors, Teamwork Graph relationships, Backstage relations, Microsoft Graph drive, Google shared drives, GitHub managed users, Bitbucket workspaces.
- Space identity and ownership: git rev-list, GitHub repos API, Drive file ids, SharePoint ids, Dropbox namespaces, Slack channel object, OpenLineage naming, Google hd claim, SCIM.
- Building knowledge from content: Microsoft semantic index, Teams intelligent recap, Slack AI architecture, GraphRAG dataflow, Zep / Graphiti paper, LightRAG, Graph mail delta, Gmail sync, e-mail cleaning for LLMs, expert finding (Balog et al.).
- Identity and agents: IETF AI agent auth draft, RFC 8693 (act claim), MCP 2026-07-28.
- Earlier work: Q-35 agent auto-mapping (AI tools, hooks, memory products, sync) and space-mapping paper v0.1–v0.3 (superseded by this page).
- Not verified, so test before building:
- whether GitHub and Bitbucket ids survive renames and transfers;
- any local way to read Drive or OneDrive ids from synced folders (assume none);
- how accurately a 4B model extracts from long mail threads (no independent benchmark found);
- Glean's and Atlassian's inference details;
- EU guidance specific to AI over employee mail.