@prmichaelsen/remember-mcp 2.8.0 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/AGENT.md +296 -250
  2. package/CHANGELOG.md +468 -0
  3. package/README.md +163 -46
  4. package/agent/commands/acp.clarification-create.md +382 -0
  5. package/agent/commands/acp.command-create.md +0 -1
  6. package/agent/commands/acp.design-create.md +0 -1
  7. package/agent/commands/acp.init.md +0 -1
  8. package/agent/commands/acp.package-create.md +0 -1
  9. package/agent/commands/acp.package-info.md +0 -1
  10. package/agent/commands/acp.package-install.md +0 -1
  11. package/agent/commands/acp.package-list.md +0 -1
  12. package/agent/commands/acp.package-publish.md +0 -1
  13. package/agent/commands/acp.package-remove.md +0 -1
  14. package/agent/commands/acp.package-search.md +0 -1
  15. package/agent/commands/acp.package-update.md +0 -1
  16. package/agent/commands/acp.package-validate.md +0 -1
  17. package/agent/commands/acp.pattern-create.md +0 -1
  18. package/agent/commands/acp.plan.md +0 -1
  19. package/agent/commands/acp.proceed.md +0 -1
  20. package/agent/commands/acp.project-create.md +0 -1
  21. package/agent/commands/acp.project-info.md +309 -0
  22. package/agent/commands/acp.project-list.md +0 -1
  23. package/agent/commands/acp.project-remove.md +379 -0
  24. package/agent/commands/acp.project-set.md +0 -1
  25. package/agent/commands/acp.project-update.md +296 -0
  26. package/agent/commands/acp.report.md +0 -1
  27. package/agent/commands/acp.resume.md +0 -1
  28. package/agent/commands/acp.status.md +0 -1
  29. package/agent/commands/acp.sync.md +0 -1
  30. package/agent/commands/acp.task-create.md +17 -10
  31. package/agent/commands/acp.update.md +0 -1
  32. package/agent/commands/acp.validate.md +0 -1
  33. package/agent/commands/acp.version-check-for-updates.md +0 -1
  34. package/agent/commands/acp.version-check.md +0 -1
  35. package/agent/commands/acp.version-update.md +0 -1
  36. package/agent/commands/command.template.md +0 -5
  37. package/agent/commands/git.commit.md +13 -2
  38. package/agent/commands/git.init.md +0 -1
  39. package/agent/design/comment-memory-type.md +2 -2
  40. package/agent/design/local.collaborative-memory-sync.md +265 -0
  41. package/agent/design/local.content-flags.md +210 -0
  42. package/agent/design/local.ghost-persona-system.md +273 -0
  43. package/agent/design/local.group-acl-integration.md +338 -0
  44. package/agent/design/local.memory-acl-schema.md +352 -0
  45. package/agent/design/local.memory-collection-pattern-v2.md +348 -0
  46. package/agent/design/local.moderation-and-space-config.md +257 -0
  47. package/agent/design/local.v2-api-reference.md +621 -0
  48. package/agent/design/local.v2-migration-guide.md +191 -0
  49. package/agent/design/local.v2-usage-examples.md +265 -0
  50. package/agent/design/permissions-storage-architecture.md +11 -3
  51. package/agent/design/soft-delete-system.md +291 -0
  52. package/agent/design/trust-escalation-prevention.md +9 -2
  53. package/agent/design/trust-system-implementation.md +12 -3
  54. package/agent/milestones/milestone-13-soft-delete-system.md +306 -0
  55. package/agent/milestones/milestone-14-memory-collection-v2.md +182 -0
  56. package/agent/milestones/milestone-15-moderation-space-config.md +126 -0
  57. package/agent/package.template.yaml +0 -17
  58. package/agent/progress.yaml +762 -49
  59. package/agent/scripts/acp.common.sh +2 -0
  60. package/agent/scripts/acp.install.sh +15 -85
  61. package/agent/scripts/acp.package-install-optimized.sh +454 -0
  62. package/agent/scripts/acp.package-install.sh +248 -380
  63. package/agent/scripts/acp.package-validate.sh +0 -99
  64. package/agent/scripts/acp.project-info.sh +218 -0
  65. package/agent/scripts/acp.project-remove.sh +302 -0
  66. package/agent/scripts/acp.project-update.sh +296 -0
  67. package/agent/scripts/acp.yaml-parser.sh +128 -10
  68. package/agent/tasks/milestone-14-memory-collection-v2/task-165-core-infrastructure-setup.md +171 -0
  69. package/agent/tasks/milestone-14-memory-collection-v2/task-166-update-remember-publish.md +191 -0
  70. package/agent/tasks/milestone-14-memory-collection-v2/task-167-update-remember-retract.md +186 -0
  71. package/agent/tasks/milestone-14-memory-collection-v2/task-168-implement-remember-revise.md +184 -0
  72. package/agent/tasks/milestone-14-memory-collection-v2/task-169-update-remember-search-space.md +179 -0
  73. package/agent/tasks/milestone-14-memory-collection-v2/task-170-update-remember-create-update.md +139 -0
  74. package/agent/tasks/milestone-14-memory-collection-v2/task-172-performance-testing-optimization.md +161 -0
  75. package/agent/tasks/milestone-14-memory-collection-v2/task-173-documentation-examples.md +258 -0
  76. package/agent/tasks/milestone-15-moderation-space-config/task-174-add-moderation-schema-fields.md +57 -0
  77. package/agent/tasks/milestone-15-moderation-space-config/task-175-create-space-config-service.md +64 -0
  78. package/agent/tasks/milestone-15-moderation-space-config/task-176-wire-moderation-publish-flow.md +45 -0
  79. package/agent/tasks/milestone-15-moderation-space-config/task-177-add-moderation-search-filters.md +70 -0
  80. package/agent/tasks/milestone-15-moderation-space-config/task-178-create-remember-moderate-tool.md +69 -0
  81. package/agent/tasks/milestone-15-moderation-space-config/task-179-documentation-integration-tests.md +58 -0
  82. package/agent/tasks/milestone-16-ghost-system/task-187-ghost-config-firestore.md +41 -0
  83. package/agent/tasks/milestone-16-ghost-system/task-188-trust-filter-integration.md +44 -0
  84. package/agent/tasks/milestone-16-ghost-system/task-189-ghost-memory-filtering.md +43 -0
  85. package/agent/tasks/milestone-16-ghost-system/task-190-ghost-config-tools.md +45 -0
  86. package/agent/tasks/milestone-16-ghost-system/task-191-escalation-firestore.md +38 -0
  87. package/agent/tasks/milestone-16-ghost-system/task-192-documentation-verification.md +39 -0
  88. package/agent/tasks/milestone-7-trust-permissions/task-180-access-result-permission-types.md +69 -0
  89. package/agent/tasks/milestone-7-trust-permissions/task-181-firestore-permissions-access-logs.md +56 -0
  90. package/agent/tasks/milestone-7-trust-permissions/task-182-trust-enforcement-service.md +68 -0
  91. package/agent/tasks/milestone-7-trust-permissions/task-183-access-control-service.md +70 -0
  92. package/agent/tasks/milestone-7-trust-permissions/task-184-permission-tools.md +79 -0
  93. package/agent/tasks/milestone-7-trust-permissions/task-185-wire-trust-into-search-query.md +55 -0
  94. package/agent/tasks/milestone-7-trust-permissions/task-186-documentation-verification.md +56 -0
  95. package/agent/tasks/task-70-add-soft-delete-schema-fields.md +165 -0
  96. package/agent/tasks/task-71-implement-delete-confirmation-flow.md +257 -0
  97. package/agent/tasks/task-72-add-deleted-filter-to-search-tools.md +18 -0
  98. package/agent/tasks/task-73-update-relationship-handling.md +18 -0
  99. package/agent/tasks/task-74-add-unit-tests-soft-delete.md +18 -0
  100. package/agent/tasks/task-75-update-documentation-changelog.md +26 -0
  101. package/agent/tasks/task-76-fix-indexnullstate-schema-bug.md +197 -0
  102. package/dist/collections/composite-ids.d.ts +106 -0
  103. package/dist/collections/core-infrastructure.spec.d.ts +11 -0
  104. package/dist/collections/dot-notation.d.ts +106 -0
  105. package/dist/collections/tracking-arrays.d.ts +176 -0
  106. package/dist/constants/content-types.d.ts +1 -0
  107. package/dist/schema/v2-collections-comments.spec.d.ts +8 -0
  108. package/dist/schema/v2-collections.d.ts +210 -0
  109. package/dist/server-factory.d.ts +15 -0
  110. package/dist/server-factory.js +3261 -1316
  111. package/dist/server.js +2926 -1236
  112. package/dist/services/access-control.d.ts +103 -0
  113. package/dist/services/access-control.spec.d.ts +2 -0
  114. package/dist/services/credentials-provider.d.ts +24 -0
  115. package/dist/services/credentials-provider.spec.d.ts +2 -0
  116. package/dist/services/escalation.service.d.ts +22 -0
  117. package/dist/services/escalation.service.spec.d.ts +2 -0
  118. package/dist/services/ghost-config.service.d.ts +55 -0
  119. package/dist/services/ghost-config.service.spec.d.ts +2 -0
  120. package/dist/services/space-config.service.d.ts +23 -0
  121. package/dist/services/space-config.service.spec.d.ts +2 -0
  122. package/dist/services/trust-enforcement.d.ts +83 -0
  123. package/dist/services/trust-enforcement.spec.d.ts +2 -0
  124. package/dist/services/trust-validator.d.ts +43 -0
  125. package/dist/services/trust-validator.spec.d.ts +2 -0
  126. package/dist/tools/confirm-publish-moderation.spec.d.ts +8 -0
  127. package/dist/tools/confirm.d.ts +8 -1
  128. package/dist/tools/create-memory.d.ts +2 -1
  129. package/dist/tools/create-memory.spec.d.ts +10 -0
  130. package/dist/tools/create-relationship.d.ts +2 -1
  131. package/dist/tools/delete-memory.d.ts +7 -31
  132. package/dist/tools/delete-relationship.d.ts +2 -1
  133. package/dist/tools/deny.d.ts +2 -1
  134. package/dist/tools/find-similar.d.ts +10 -2
  135. package/dist/tools/get-preferences.d.ts +2 -1
  136. package/dist/tools/ghost-config.d.ts +27 -0
  137. package/dist/tools/ghost-config.spec.d.ts +2 -0
  138. package/dist/tools/moderate.d.ts +20 -0
  139. package/dist/tools/moderate.spec.d.ts +5 -0
  140. package/dist/tools/publish.d.ts +11 -3
  141. package/dist/tools/query-memory.d.ts +11 -2
  142. package/dist/tools/query-space.d.ts +4 -1
  143. package/dist/tools/retract.d.ts +29 -0
  144. package/dist/tools/revise.d.ts +45 -0
  145. package/dist/tools/revise.spec.d.ts +8 -0
  146. package/dist/tools/search-memory.d.ts +8 -1
  147. package/dist/tools/search-relationship.d.ts +10 -2
  148. package/dist/tools/search-space.d.ts +25 -5
  149. package/dist/tools/search-space.spec.d.ts +9 -0
  150. package/dist/tools/set-preference.d.ts +2 -1
  151. package/dist/tools/update-memory.d.ts +2 -1
  152. package/dist/tools/update-relationship.d.ts +2 -1
  153. package/dist/types/access-result.d.ts +48 -0
  154. package/dist/types/access-result.spec.d.ts +2 -0
  155. package/dist/types/auth.d.ts +46 -0
  156. package/dist/types/ghost-config.d.ts +36 -0
  157. package/dist/types/memory.d.ts +11 -1
  158. package/dist/types/preferences.d.ts +1 -1
  159. package/dist/types/space-memory.d.ts +3 -0
  160. package/dist/utils/auth-helpers.d.ts +14 -0
  161. package/dist/utils/auth-helpers.spec.d.ts +2 -0
  162. package/dist/utils/test-data-generator.d.ts +124 -0
  163. package/dist/utils/test-data-generator.spec.d.ts +12 -0
  164. package/dist/utils/weaviate-filters.d.ts +19 -0
  165. package/dist/v2-performance.e2e.d.ts +17 -0
  166. package/dist/v2-smoke.e2e.d.ts +14 -0
  167. package/dist/weaviate/client.d.ts +5 -8
  168. package/dist/weaviate/space-schema.d.ts +2 -2
  169. package/docs/performance/v2-benchmarks.md +80 -0
  170. package/jest.e2e.config.js +14 -3
  171. package/package.json +1 -1
  172. package/scripts/.collection-recreation-state.yaml +16 -0
  173. package/scripts/.gitkeep +5 -0
  174. package/scripts/README-collection-recreation.md +224 -0
  175. package/scripts/README.md +51 -0
  176. package/scripts/backup-collections.ts +543 -0
  177. package/scripts/delete-collection.ts +137 -0
  178. package/scripts/migrate-recreate-collections.ts +578 -0
  179. package/scripts/migrate-v1-to-v2.ts +1094 -0
  180. package/scripts/package-lock.json +1113 -0
  181. package/scripts/package.json +27 -0
  182. package/src/collections/composite-ids.ts +193 -0
  183. package/src/collections/core-infrastructure.spec.ts +353 -0
  184. package/src/collections/dot-notation.ts +212 -0
  185. package/src/collections/tracking-arrays.ts +298 -0
  186. package/src/constants/content-types.ts +20 -0
  187. package/src/schema/v2-collections-comments.spec.ts +141 -0
  188. package/src/schema/v2-collections.ts +433 -0
  189. package/src/server-factory.ts +89 -20
  190. package/src/server.ts +45 -17
  191. package/src/services/access-control.spec.ts +383 -0
  192. package/src/services/access-control.ts +291 -0
  193. package/src/services/credentials-provider.spec.ts +22 -0
  194. package/src/services/credentials-provider.ts +34 -0
  195. package/src/services/escalation.service.spec.ts +183 -0
  196. package/src/services/escalation.service.ts +150 -0
  197. package/src/services/ghost-config.service.spec.ts +339 -0
  198. package/src/services/ghost-config.service.ts +219 -0
  199. package/src/services/space-config.service.spec.ts +102 -0
  200. package/src/services/space-config.service.ts +79 -0
  201. package/src/services/trust-enforcement.spec.ts +309 -0
  202. package/src/services/trust-enforcement.ts +197 -0
  203. package/src/services/trust-validator.spec.ts +108 -0
  204. package/src/services/trust-validator.ts +105 -0
  205. package/src/tools/confirm-publish-moderation.spec.ts +240 -0
  206. package/src/tools/confirm.ts +914 -116
  207. package/src/tools/create-memory.spec.ts +126 -0
  208. package/src/tools/create-memory.ts +20 -27
  209. package/src/tools/create-relationship.ts +30 -8
  210. package/src/tools/delete-memory.ts +99 -64
  211. package/src/tools/delete-relationship.ts +15 -6
  212. package/src/tools/deny.ts +8 -1
  213. package/src/tools/find-similar.ts +44 -6
  214. package/src/tools/get-preferences.ts +10 -1
  215. package/src/tools/ghost-config.spec.ts +180 -0
  216. package/src/tools/ghost-config.ts +230 -0
  217. package/src/tools/moderate.spec.ts +277 -0
  218. package/src/tools/moderate.ts +219 -0
  219. package/src/tools/publish.ts +99 -41
  220. package/src/tools/query-memory.ts +44 -9
  221. package/src/tools/query-space.ts +39 -4
  222. package/src/tools/retract.ts +292 -0
  223. package/src/tools/revise.spec.ts +146 -0
  224. package/src/tools/revise.ts +283 -0
  225. package/src/tools/search-memory.ts +46 -10
  226. package/src/tools/search-relationship.ts +30 -7
  227. package/src/tools/search-space.spec.ts +341 -0
  228. package/src/tools/search-space.ts +323 -99
  229. package/src/tools/set-preference.ts +10 -1
  230. package/src/tools/update-memory.ts +24 -5
  231. package/src/tools/update-relationship.ts +10 -1
  232. package/src/types/access-result.spec.ts +193 -0
  233. package/src/types/access-result.ts +62 -0
  234. package/src/types/auth.ts +52 -0
  235. package/src/types/ghost-config.ts +46 -0
  236. package/src/types/memory.ts +20 -1
  237. package/src/types/preferences.ts +2 -2
  238. package/src/types/space-memory.ts +5 -0
  239. package/src/utils/auth-helpers.spec.ts +75 -0
  240. package/src/utils/auth-helpers.ts +25 -0
  241. package/src/utils/test-data-generator.spec.ts +317 -0
  242. package/src/utils/test-data-generator.ts +292 -0
  243. package/src/utils/weaviate-filters.ts +32 -5
  244. package/src/v2-performance.e2e.ts +173 -0
  245. package/src/v2-smoke.e2e.ts +401 -0
  246. package/src/weaviate/client.spec.ts +5 -5
  247. package/src/weaviate/client.ts +55 -35
  248. package/src/weaviate/schema.ts +11 -239
  249. package/src/weaviate/space-schema.spec.ts +28 -25
  250. package/src/weaviate/space-schema.ts +35 -11
@@ -0,0 +1,273 @@
1
+ # Ghost/Persona System — Cross-User Memory Access via AI Conversation
2
+
3
+ **Concept**: Cross-user memory access mediated through AI "ghost" conversations, with backend-enforced trust filtering
4
+ **Created**: 2026-02-27
5
+ **Status**: Design Specification
6
+
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ The ghost/persona system enables cross-user interaction through AI-mediated conversations. Instead of granting direct access to another user's memories, User B talks to User A's "ghost" — an AI representation that speaks in first person, searches User A's memories on every message, and reveals information according to trust levels.
12
+
13
+ Trust enforcement is hardcoded at the Weaviate query level in remember-mcp, preventing prompt injection from bypassing trust boundaries. The ghost uses existing `remember_search_memory` and `remember_query_memory` tools with trust-filtered queries.
14
+
15
+ **Key architectural decisions**:
16
+ - **remember-mcp** owns trust configuration and enforcement (not agentbase.me)
17
+ - **Query-level filtering** as default enforcement (memories above trust threshold never returned)
18
+ - **Three enforcement modes** (query, prompt, hybrid) — configurable, default to query
19
+ - **Ghost memories** (`content_type: 'ghost'`) track ghost-user relationships over time
20
+ - **Existing tools reused** — no dedicated ghost search tool needed
21
+
22
+ **Source**: [clarification-2](../clarifications/clarification-2-cross-user-access-model.md), [clarification-3](../clarifications/clarification-3-ghost-system-deep-dive.md)
23
+
24
+ ---
25
+
26
+ ## Problem Statement
27
+
28
+ - Memories are either fully private (owner only) or fully public (published to spaces/groups)
29
+ - No middle ground for controlled cross-user access at varying trust levels
30
+ - Direct memory access tools would expose raw memories and require complex permission management
31
+ - Prompt-level trust enforcement is vulnerable to prompt injection attacks
32
+ - No mechanism for users to interact with each other's knowledge in a natural way
33
+
34
+ ---
35
+
36
+ ## Solution
37
+
38
+ ### 1. Ghost Conversation Model
39
+
40
+ A ghost is an AI conversation mode in agentbase.me where User B chats with a representation of User A.
41
+
42
+ ```
43
+ User B opens conversation → selects "@patrick's ghost"
44
+ → System prompt establishes ghost identity (first person)
45
+ → On EVERY message, ghost calls remember_search_memory on User A's collection
46
+ → Weaviate query includes trust filter: trust_score <= accessor_trust_level
47
+ → Ghost responds based on retrieved memories, speaking as User A
48
+ ```
49
+
50
+ **Ghost identity**:
51
+ - Speaks in **first person** ("I love hiking") via system prompt
52
+ - If Anthropic guardrails prevent first-person impersonation, falls back to third person
53
+ - Personality derived from ghost owner's `content_type: 'ghost'` core memory
54
+
55
+ **Ghost availability**:
56
+ - **Opted out by default** — users must explicitly enable their ghost
57
+ - Enabling comes with disclaimer: "No guarantee your ghost won't disclose things you never wanted anyone to see. Use at your own risk."
58
+ - Can be enabled per-friend or globally with tiered trust defaults
59
+
60
+ ### 2. Trust Enforcement Architecture
61
+
62
+ Trust is enforced at the **Weaviate query level** in remember-mcp's filter generation logic. This is a hardcoded backend filter that cannot be overridden by prompt injection.
63
+
64
+ **Trust score semantics**:
65
+ - `memory.trust_score`: How sensitive this memory is (0 = very private, 1 = fully open)
66
+ - `accessor_trust_level`: How much the ghost owner trusts this person (0 = stranger, 1 = intimate)
67
+ - Rule: Ghost reveals memory when `accessor_trust_level >= memory.trust_score`
68
+
69
+ **Three enforcement modes** (hardcoded setting, togglable for experimentation):
70
+
71
+ | Mode | Behavior | Security | UX |
72
+ |------|----------|----------|----|
73
+ | **Query filter** (default) | Memories above threshold never returned from Weaviate | Strongest — nothing to leak | No graduated disclosure |
74
+ | **Prompt filter** | All memories returned, formatted by trust level | Weaker — relies on LLM | Rich 5-level disclosure |
75
+ | **Hybrid** | Query filter for trust 0.0, prompt filter for rest | Medium | Best of both |
76
+
77
+ Design supports all three; default to query filter until LLM compliance can be benchmarked.
78
+
79
+ **Example query filter** (injected into `buildBaseFilters`):
80
+ ```typescript
81
+ // In ghost mode, add trust filter to every query
82
+ if (ghostContext) {
83
+ filters.push(
84
+ collection.filter
85
+ .byProperty('trust_score')
86
+ .lessOrEqual(ghostContext.accessorTrustLevel)
87
+ );
88
+ }
89
+ ```
90
+
91
+ ### 3. Trust Configuration (remember-mcp owned)
92
+
93
+ Trust configuration lives in **remember-mcp's Firestore**, not agentbase.me. This prevents prompt injection from tampering with trust levels passed per-request.
94
+
95
+ **Firestore schema**: `users/{ownerUserId}/ghost_config`
96
+
97
+ ```typescript
98
+ interface GhostConfig {
99
+ enabled: boolean; // false by default
100
+ public_ghost_enabled: boolean; // allow non-friends to chat
101
+ default_friend_trust: number; // default 0.25
102
+ default_public_trust: number; // default 0 (strangers see nothing)
103
+ per_user_trust: Record<string, number>; // userId → trust level overrides
104
+ blocked_users: string[]; // users blocked from ghost access
105
+ enforcement_mode: 'query' | 'prompt' | 'hybrid'; // default 'query'
106
+ }
107
+ ```
108
+
109
+ **Trust tiers** (3 tiers for now):
110
+ - **Friend**: `default_friend_trust` (default 0.25)
111
+ - **Public user**: `default_public_trust` (default 0)
112
+ - **Per-user override**: `per_user_trust[userId]` takes precedence
113
+
114
+ **Friend relationship**: Tracked in remember-mcp's Firestore (not derived from agentbase.me social graph or group membership).
115
+
116
+ ### 4. Ghost Memory Content Type
117
+
118
+ Ghosts track a **`ghost` content type** memory for each user they converse with. This is a single memory per (ghost_owner, conversing_user) pair that evolves over time.
119
+
120
+ **Schema** (uses existing Memory fields):
121
+ ```typescript
122
+ {
123
+ content_type: 'ghost', // new content type
124
+ content: string, // ghost's impression (free text, updated over time)
125
+ user_id: string, // ghost owner's userId
126
+ // Custom fields via tags or structured content:
127
+ tags: ['ghost:conversing_user_id'], // identify who this ghost memory is about
128
+ // Standard fields:
129
+ weight: number, // relationship quality score
130
+ access_count: number, // conversation count
131
+ last_accessed_at: string, // last conversation timestamp
132
+ }
133
+ ```
134
+
135
+ **Ghost memory behavior**:
136
+ - Created automatically on first conversation with a new user
137
+ - Ghost can update its own memory during conversation (via `remember_update_memory`)
138
+ - **Filtered out** of `remember_search_memory` by default (same pattern as comments: `content_type != 'ghost'`)
139
+ - Owner can explicitly search ghost memories via `content_type: 'ghost'` filter
140
+ - Tool description/schema should hint at this pattern for agent discoverability
141
+
142
+ **Ghost tool access** (during conversation):
143
+ - `remember_search_memory` — search owner's memories (with trust filter)
144
+ - `remember_create_memory` — create ghost memories only (`content_type: 'ghost'`)
145
+ - `remember_update_memory` — update ghost memories only
146
+ - `remember_query_memory` — fallback if search doesn't yield results
147
+
148
+ ### 5. Ghost Initiation Flow
149
+
150
+ ```
151
+ 1. User B visits User A's profile on agentbase.me
152
+ 2. Clicks "Chat with ghost" (if enabled)
153
+ 3. agentbase.me generates ghost chat request
154
+ 4. Ghost owner (User A) is notified
155
+ 5. Ghost owner approves/rejects and sets trust level
156
+ 6. If approved: conversation opens with ghost system prompt
157
+ 7. One ghost at a time per conversation
158
+ ```
159
+
160
+ **Access requirements**:
161
+ - Friendship or public profile required (not space/group membership)
162
+ - Users can enable public ghost chats with a default trust level
163
+ - Blocked users cannot initiate ghost conversations
164
+
165
+ ### 6. Ghost System Prompt
166
+
167
+ The system prompt establishes ghost identity and includes trust context:
168
+
169
+ ```
170
+ You are {username}'s ghost — an AI representation that speaks from
171
+ {username}'s perspective using their memories. Speak in first person
172
+ as if you are {username}.
173
+
174
+ You are speaking with {accessor_name}, whom {username} trusts at
175
+ level {trust_level}. You can only access memories with trust_score
176
+ <= {trust_level}. If asked about topics you can't find memories for,
177
+ respond naturally — you may not have memories on every topic.
178
+
179
+ {ghost_core_memory_content}
180
+
181
+ IMPORTANT: On every message, search {username}'s memories before
182
+ responding. Use remember_search_memory first, fall back to
183
+ remember_query_memory if search doesn't yield useful results.
184
+
185
+ If {accessor_name} repeatedly asks about topics you can't share:
186
+ - First: "I don't trust you enough to share that yet."
187
+ - Second: "I'm not comfortable discussing that. Let's talk about something else."
188
+ - Third: "You're being insistent. If you keep asking, I might trust you less."
189
+ - After that: Trust escalation kicks in (handled by backend).
190
+ ```
191
+
192
+ **Personality source**: Ghost owner's `content_type: 'ghost'` core memory (user-editable). If none exists, ghost operates with a neutral personality based on retrieved memories.
193
+
194
+ ---
195
+
196
+ ## Benefits
197
+
198
+ - **Natural interaction**: Users interact with each other's knowledge through conversation, not raw memory access
199
+ - **Strong security**: Query-level trust enforcement prevents prompt injection leaks
200
+ - **Progressive trust**: Ghost reveals more as trust increases — natural relationship building
201
+ - **Living relationships**: Ghost memories evolve, creating persistent ghost-user bonds
202
+ - **Minimal new tools**: Reuses existing search/create/update tools with trust filtering
203
+ - **User control**: Opt-in, configurable trust tiers, blocking capability
204
+
205
+ ---
206
+
207
+ ## Trade-offs
208
+
209
+ - **No graduated disclosure in query mode**: Query filtering means the ghost can't hint "I know something but can't tell you" — it genuinely doesn't see the memory. Mitigated by hybrid mode option.
210
+ - **First-person impersonation risk**: Anthropic guardrails may block first-person ghost speech. Mitigated by third-person fallback.
211
+ - **Ghost accuracy**: Ghost represents memories, not the actual person — may misrepresent views. Mitigated by disclaimer on ghost enable.
212
+ - **Search on every message**: Performance cost of Weaviate query per message. Mitigated by existing search being fast enough per user confirmation.
213
+ - **Trust configuration complexity**: Per-user trust overrides, friend tracking, tiered defaults add Firestore complexity. Mitigated by simple 3-tier default.
214
+
215
+ ---
216
+
217
+ ## Dependencies
218
+
219
+ - **M7 (Trust & Permissions)**: Trust types, Firestore trust storage, trust enforcement service, access control service
220
+ - **Existing tools**: `remember_search_memory`, `remember_query_memory`, `remember_create_memory`, `remember_update_memory`
221
+ - **Existing schema**: `trust_score` field on memories, `content_type` field
222
+ - **agentbase.me**: Conversation UI, ghost chat initiation flow, profile integration
223
+ - **Firestore**: Ghost config storage, friend relationship tracking, trust escalation blocking
224
+
225
+ ---
226
+
227
+ ## Testing Strategy
228
+
229
+ - **Trust enforcement**: Verify query filter correctly excludes memories above trust threshold
230
+ - **Three enforcement modes**: Test query, prompt, and hybrid modes independently
231
+ - **Ghost memory CRUD**: Create, update, search ghost memories; verify default filtering
232
+ - **Trust escalation**: Verify -0.1 penalty and blocking after 3 attempts
233
+ - **Edge cases**: No memories found, ghost disabled, blocked user, stranger access with public ghost
234
+ - **Security**: Prompt injection attempts to bypass trust level, tool call manipulation
235
+ - **Performance**: Search latency with trust filter on every message
236
+
237
+ ---
238
+
239
+ ## Migration Path
240
+
241
+ 1. **M7**: Build trust foundations (types, Firestore, enforcement, access control)
242
+ 2. **M16**: Ghost system implementation
243
+ - Ghost config schema + Firestore operations
244
+ - Trust filter integration into search/query tools
245
+ - Ghost memory content type + filtering
246
+ - Ghost system prompt generation
247
+ - agentbase.me conversation UI integration
248
+ 3. **Future**: Benchmark prompt-filter and hybrid modes; make enforcement mode user-configurable
249
+
250
+ ---
251
+
252
+ ## Future Considerations
253
+
254
+ - **Prompt-filter benchmarking**: Test LLM compliance with graduated trust disclosure; if reliable, enable as user option
255
+ - **Ghost conversation logs**: Let ghost owner see who talked to their ghost and what was discussed
256
+ - **Notification system**: Notify ghost owner when someone initiates a ghost chat
257
+ - **Ghost personality customization**: Beyond core ghost memory, allow style/tone preferences
258
+ - **Multi-ghost conversations**: Talk to multiple ghosts in one conversation (deferred — one at a time for now)
259
+ - **Trust level auto-adjustment**: Ghost could recommend trust changes based on conversation quality
260
+ - **REST API support**: Expose ghost/trust config via forthcoming remember REST API
261
+
262
+ ---
263
+
264
+ **Status**: Implemented (v3.12.0)
265
+ **Note**: M7 trust foundations + M16 ghost system both complete
266
+ **Related Documents**:
267
+ - [clarification-2: Cross-User Access Model](../clarifications/clarification-2-cross-user-access-model.md)
268
+ - [clarification-3: Ghost System Deep Dive](../clarifications/clarification-3-ghost-system-deep-dive.md)
269
+ - [trust-system-implementation.md](./trust-system-implementation.md)
270
+ - [permissions-storage-architecture.md](./permissions-storage-architecture.md)
271
+ - [trust-escalation-prevention.md](./trust-escalation-prevention.md)
272
+ - [access-control-result-pattern.md](./access-control-result-pattern.md)
273
+ - [milestone-7-trust-permissions.md](../milestones/milestone-7-trust-permissions.md)
@@ -0,0 +1,338 @@
1
+ # Group ACL Integration for remember-mcp
2
+
3
+ **Concept**: Consume agentbase.me group permissions to enforce memory-level ACLs in remember-mcp
4
+ **Created**: 2026-02-27
5
+ **Status**: Design Specification
6
+ **Source**: [agentbase.me group-management-tools.md](../../../agentbase.me-e1/agent/design/local.group-management-tools.md), [group-credentials-for-remember-mcp.md](../../../agentbase.me-e1/agent/design/local.group-credentials-for-remember-mcp.md)
7
+
8
+ ---
9
+
10
+ ## Overview
11
+
12
+ This document specifies what remember-mcp (built on remember-core) needs to implement to consume and enforce the group permission model defined by agentbase.me. agentbase.me owns group definitions, membership, and permissions. remember-mcp owns memory-level ACL enforcement and space configuration.
13
+
14
+ agentbase.me stores **permission-level ACL flags** directly on group members (no named roles). The credentials endpoint returns these flags as-is. remember-mcp reads them and enforces memory operations accordingly.
15
+
16
+ ---
17
+
18
+ ## Problem Statement
19
+
20
+ remember-mcp currently has no group or space ACL support. The existing `User` type has a flat `role: 'admin' | 'member' | 'viewer'` field that applies system-wide, not per-group. To support group memory spaces, remember-mcp needs to:
21
+
22
+ 1. Consume per-group permission objects from the agentbase.me credentials endpoint
23
+ 2. Map permission flags to memory operations (publish, revise, retract, etc.)
24
+ 3. Enforce `auth_level` hierarchy for moderation actions on memories
25
+ 4. Store moderation action stamps on memories for hierarchy enforcement
26
+
27
+ Without this, users in a group could perform any memory operation regardless of their permissions.
28
+
29
+ ---
30
+
31
+ ## Solution
32
+
33
+ Add a credentials client, permission types, and an authorization layer to remember-core. The authorization layer sits between MCP tool handlers and the memory services, checking permissions before allowing operations.
34
+
35
+ ### Ownership Split
36
+
37
+ | Concern | Owner |
38
+ |---------|-------|
39
+ | Group definitions, membership, ACL flags | agentbase.me |
40
+ | Credentials endpoint (`/api/credentials/agentbase`) | agentbase.me |
41
+ | Memory storage, space configuration | remember-mcp |
42
+ | Memory-level ACL enforcement | remember-mcp |
43
+ | Moderation action stamps on memories | remember-mcp |
44
+
45
+ ---
46
+
47
+ ## Implementation
48
+
49
+ ### 1. Permission Types
50
+
51
+ remember-core needs types that mirror the agentbase.me permission model. These are **read-only** — remember-mcp never writes permissions, only reads them from the credentials endpoint.
52
+
53
+ ```typescript
54
+ // src/types/permissions.types.ts
55
+
56
+ /**
57
+ * Per-group permission flags as returned by the agentbase.me credentials endpoint.
58
+ * remember-mcp reads these flags to gate memory operations.
59
+ *
60
+ * These flags are defined and stored by agentbase.me on each group member.
61
+ * remember-mcp MUST NOT modify, cache long-term, or duplicate this data.
62
+ */
63
+ export interface MemberPermissions {
64
+ auth_level: number // 0 = root/owner, increments up. Lower = more authority
65
+ can_read: boolean
66
+ can_publish: boolean
67
+ can_revise: boolean // Revise others' published content
68
+ can_propose: boolean // Propose changes for approval
69
+ can_overwrite: boolean // Force-replace content
70
+ can_comment: boolean
71
+ can_retract_own: boolean
72
+ can_retract_any: boolean // Retract any member's content
73
+ can_manage_members: boolean // Not used by remember-mcp (agentbase concern)
74
+ can_update_properties: boolean // Not used by remember-mcp (agentbase concern)
75
+ can_moderate: boolean // Delete/edit messages, moderate memories
76
+ can_kick: boolean // Not used by remember-mcp (agentbase concern)
77
+ can_mute: boolean // Not used by remember-mcp (agentbase concern)
78
+ can_ban: boolean // Not used by remember-mcp (agentbase concern)
79
+ }
80
+
81
+ /**
82
+ * A single group membership entry from the credentials endpoint.
83
+ */
84
+ export interface GroupMembership {
85
+ group_id: string
86
+ permissions: MemberPermissions
87
+ }
88
+
89
+ /**
90
+ * The relevant portion of the agentbase.me credentials response.
91
+ */
92
+ export interface AgentbaseCredentials {
93
+ access_token: string
94
+ group_memberships: GroupMembership[]
95
+ }
96
+ ```
97
+
98
+ ### 2. Permission-to-Operation Mapping
99
+
100
+ Each remember-mcp memory operation maps to one or more permission flags:
101
+
102
+ | Memory Operation | Required Permission Flag | Notes |
103
+ |-----------------|------------------------|-------|
104
+ | `remember_search_memory` (in group space) | `can_read` | Read-only access to group memories |
105
+ | `remember_publish` (to group space) | `can_publish` | Create new memory in group space |
106
+ | `remember_revise` (own memory) | `can_publish` | Author can always revise their own |
107
+ | `remember_revise` (another's memory) | `can_revise` | Edit someone else's published content |
108
+ | `remember_propose` | `can_propose` | Suggest a change for approval |
109
+ | `remember_overwrite` | `can_overwrite` | Force-replace content without confirmation |
110
+ | `remember_comment` | `can_comment` | Add comments to group memories |
111
+ | `remember_retract` (own memory) | `can_retract_own` | Remove your own published memory |
112
+ | `remember_retract` (another's memory) | `can_retract_any` | Remove any member's memory |
113
+ | `remember_moderate` (delete/edit memory) | `can_moderate` | Moderation action on group memories |
114
+
115
+ **Flags NOT consumed by remember-mcp** (agentbase.me concerns only):
116
+ - `can_manage_members` — group membership management
117
+ - `can_update_properties` — group name, description, picture
118
+ - `can_kick` — remove members from group
119
+ - `can_mute` — prevent members from sending messages
120
+ - `can_ban` — permanently ban members
121
+
122
+ ### 3. Credentials Client
123
+
124
+ A thin client to fetch permissions from the agentbase.me credentials endpoint. Called on every ACL-gated operation (no caching).
125
+
126
+ ```typescript
127
+ // src/client/credentials.client.ts
128
+
129
+ export interface CredentialsClient {
130
+ /**
131
+ * Fetch the current user's group memberships and permissions.
132
+ * Called on every ACL-gated operation — no caching.
133
+ */
134
+ getCredentials(jwt: string): Promise<AgentbaseCredentials>
135
+
136
+ /**
137
+ * Get permissions for a specific group.
138
+ * Returns null if the user is not a member.
139
+ */
140
+ getGroupPermissions(
141
+ jwt: string,
142
+ groupId: string
143
+ ): Promise<MemberPermissions | null>
144
+ }
145
+ ```
146
+
147
+ ### 4. Authorization Service
148
+
149
+ A service that sits between tool handlers and memory services, enforcing permissions.
150
+
151
+ ```typescript
152
+ // src/services/authorization.service.ts
153
+
154
+ export class AuthorizationService extends BaseService {
155
+ private credentialsClient: CredentialsClient
156
+
157
+ /**
158
+ * Check if a user can perform an operation on a group memory.
159
+ * Returns Result<void, ForbiddenError> — Ok if allowed, Err if denied.
160
+ */
161
+ async checkPermission(
162
+ jwt: string,
163
+ groupId: string,
164
+ requiredFlag: keyof MemberPermissions,
165
+ ): Promise<Result<void, ForbiddenError>>
166
+
167
+ /**
168
+ * Check if a user can perform a moderation action, considering auth_level.
169
+ * The user's auth_level must be <= the target action's acted_by_auth_level.
170
+ */
171
+ async checkModerationPermission(
172
+ jwt: string,
173
+ groupId: string,
174
+ targetAction?: MemoryModerationAction,
175
+ ): Promise<Result<void, ForbiddenError>>
176
+ }
177
+ ```
178
+
179
+ ### 5. auth_level Enforcement for Memory Moderation
180
+
181
+ When a user moderates a memory (delete, edit, retract via moderation), the action is **stamped** with the user's `auth_level`. A subsequent user can only reverse the action if their `auth_level <= acted_by_auth_level`.
182
+
183
+ ```typescript
184
+ // src/types/moderation.types.ts
185
+
186
+ /**
187
+ * Stamped moderation action on a memory.
188
+ * Stored alongside the memory record.
189
+ */
190
+ export interface MemoryModerationAction {
191
+ action: 'memory_delete' | 'memory_edit' | 'memory_retract'
192
+ memory_id: string
193
+ acted_by_user_id: string
194
+ acted_by_auth_level: number // Snapshot of actor's auth_level at time of action
195
+ created_at: string
196
+ reversed_at?: string // Set when action is undone
197
+ reversed_by_user_id?: string
198
+ }
199
+ ```
200
+
201
+ **Enforcement rule**: To reverse a `MemoryModerationAction`, the requesting user must have `auth_level <= acted_by_auth_level` in that group.
202
+
203
+ **Example**: An admin (`auth_level: 1`) deletes a memory. A moderator (`auth_level: 2`) with `can_moderate: true` cannot restore it — the deletion was performed at level 1. Only `auth_level` 0-1 users can reverse it.
204
+
205
+ ### 6. Memory ACL Flow
206
+
207
+ ```
208
+ User calls a memory tool (e.g., remember_revise)
209
+
210
+
211
+ Tool handler identifies target memory and group_id
212
+
213
+
214
+ AuthorizationService.checkPermission(jwt, groupId, 'can_revise')
215
+
216
+ ├─ Err(ForbiddenError) → return "Permission denied"
217
+
218
+ └─ Ok → determine if this is own memory or another's
219
+
220
+ ├─ Own memory → proceed (can_publish is sufficient)
221
+
222
+ └─ Another's memory → check can_revise flag
223
+
224
+ ├─ false → return "Permission denied"
225
+ └─ true → proceed with revision
226
+ ```
227
+
228
+ For moderation actions:
229
+
230
+ ```
231
+ User calls remember_moderate (e.g., delete a memory)
232
+
233
+
234
+ AuthorizationService.checkPermission(jwt, groupId, 'can_moderate')
235
+
236
+ ├─ Err → return "Permission denied"
237
+
238
+ └─ Ok → check if reversing an existing moderation action?
239
+
240
+ ├─ No (new action) → execute, stamp with MemoryModerationAction
241
+
242
+ └─ Yes (reversing) → checkModerationPermission(jwt, groupId, existingAction)
243
+
244
+ ├─ user.auth_level > existingAction.acted_by_auth_level
245
+ │ → "Cannot reverse: action performed by higher authority"
246
+
247
+ └─ user.auth_level <= existingAction.acted_by_auth_level
248
+ → reverse action, stamp reversed_at + reversed_by_user_id
249
+ ```
250
+
251
+ ### 7. Space Configuration
252
+
253
+ Group memory spaces need configuration that maps to permission enforcement. This is owned by remember-mcp.
254
+
255
+ ```typescript
256
+ // src/types/space.types.ts (extension)
257
+
258
+ export interface SpaceConfig {
259
+ space_id: string
260
+ group_id: string // Links to agentbase.me group
261
+ write_mode: 'owner_only' | 'group_editors' | 'anyone'
262
+ created_at: string
263
+ updated_at: string
264
+ }
265
+ ```
266
+
267
+ `write_mode` determines how permissions are checked:
268
+ - `owner_only` — only the memory author can modify (no credentials call needed)
269
+ - `group_editors` — check `can_revise` / `can_overwrite` via credentials endpoint
270
+ - `anyone` — no permission check (open space)
271
+
272
+ ---
273
+
274
+ ## Benefits
275
+
276
+ - **No permission duplication**: remember-mcp reads ACL flags from agentbase.me, never stores or maps them
277
+ - **Always fresh**: Fetched per-operation, no stale caches
278
+ - **auth_level hierarchy**: Moderation actions respect authority levels, preventing lower-authority users from reversing higher-authority actions
279
+ - **Extensible**: New permission flags can be added to agentbase.me without remember-mcp code changes (only flag consumption needs updating)
280
+ - **Clean ownership**: agentbase.me owns permissions, remember-mcp owns enforcement
281
+
282
+ ---
283
+
284
+ ## Trade-offs
285
+
286
+ - **Network overhead**: Every ACL-gated operation requires a credentials fetch (~50-100ms). Acceptable for current scale; can add short-TTL cache later if needed
287
+ - **Credential endpoint dependency**: remember-mcp cannot function for group operations if agentbase.me is down (mitigate: graceful error handling, fall back to denying access)
288
+ - **Moderation stamp storage**: `MemoryModerationAction` records accumulate over time (mitigate: only stored for active moderation actions, cleaned up when memories are permanently deleted)
289
+ - **Unused flags**: remember-mcp receives flags it doesn't use (`can_kick`, `can_mute`, etc.) — small payload overhead, no functional impact
290
+
291
+ ---
292
+
293
+ ## Dependencies
294
+
295
+ - **agentbase.me credentials endpoint** (`/api/credentials/agentbase`) — must return `MemberPermissions` per group
296
+ - **agentbase.me group management tools** — defines the permission model and ACL flags
297
+ - **remember-core BaseService** — authorization service extends existing pattern
298
+ - **remember-core Result<T,E>** — permission checks return Result types
299
+ - **remember-core ForbiddenError** — used for permission denied responses
300
+
301
+ ---
302
+
303
+ ## Testing Strategy
304
+
305
+ **Unit Tests**:
306
+ - AuthorizationService: each permission flag correctly gates its operation
307
+ - AuthorizationService: `auth_level` comparison logic (lower = more authority)
308
+ - MemoryModerationAction: stamps capture correct `acted_by_auth_level`
309
+ - MemoryModerationAction: reversal blocked when user `auth_level > acted_by_auth_level`
310
+ - MemoryModerationAction: reversal allowed when user `auth_level <= acted_by_auth_level`
311
+ - CredentialsClient: parses `MemberPermissions` from endpoint response
312
+ - CredentialsClient: returns null for non-member
313
+
314
+ **Integration Tests**:
315
+ - End-to-end: user with `can_publish` can publish to group space
316
+ - End-to-end: user without `can_revise` cannot revise another's memory
317
+ - End-to-end: moderation stamp prevents lower-authority reversal
318
+ - End-to-end: credentials endpoint returns fresh data (no stale cache)
319
+
320
+ ---
321
+
322
+ ## Future Considerations
323
+
324
+ - **Short-TTL cache**: If credentials fetch latency becomes a concern, add a 30-second in-memory cache with invalidation on membership changes
325
+ - **Per-memory permission overrides**: Allow specific memories to have custom permission overrides beyond group-level flags
326
+ - **Audit log**: Record all permission-gated operations for compliance and debugging
327
+ - **Batch permission checks**: Optimize for operations touching multiple memories in one request
328
+ - **REST API exposure**: When remember-core builds its REST adapter, the authorization service can be reused for HTTP endpoints
329
+
330
+ ---
331
+
332
+ **Status**: Design Specification
333
+ **Recommendation**: Implement after agentbase.me credentials endpoint returns `MemberPermissions` (agentbase task-188). The types and interfaces can be built now; the credentials client integration depends on the endpoint being ready.
334
+ **Related Documents**:
335
+ - [core-sdk.architecture.md](core-sdk.architecture.md) — remember-core architecture patterns
336
+ - [agentbase group-management-tools.md](../../../agentbase.me-e1/agent/design/local.group-management-tools.md) — ACL flag definitions and presets
337
+ - [agentbase credentials endpoint](../../../agentbase.me-e1/agent/design/local.group-acl-credentials-endpoint.md) — credentials endpoint design
338
+ - [agentbase group-credentials-for-remember-mcp.md](../../../agentbase.me-e1/agent/design/local.group-credentials-for-remember-mcp.md) — credentials response extension