feat(memory): publish personal memories - #1234
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
54aa81a to
88a3014
Compare
88a3014 to
bc1f55c
Compare
bc1f55c to
889155c
Compare
889155c to
8b7a841
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 8b7a841. Configure here.
| scope.scope === targetScope.scope && | ||
| scope.scopeKey === targetScope.scopeKey, | ||
| ), | ||
| ); |
There was a problem hiding this comment.
Publishable ignores missing owner label
Medium Severity
publishable only checks workspace audience, while publish also requires a non-empty owner label from ownerLabels. When an identity has no displayName, handle, or user displayName, the dashboard still offers Make Public, then the publish API fails with a 400.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 8b7a841. Configure here.
| const renderedCandidates = candidates.flatMap((memory) => { | ||
| const renderedContent = presentedMemoryContent(memory); | ||
| return renderedContent ? [{ ...memory, renderedContent }] : []; | ||
| }); |
There was a problem hiding this comment.
Name-first recall never sees labels
Medium Severity
Published memories keep canonical content without the person name, and presentedMemoryContent only adds About {label} after vector/lexical candidate retrieval. Name-first asks such as remembering someone by name therefore often never retrieve those workspace user memories, so the new subject label never reaches relevance selection.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 8b7a841. Configure here.


Users can now publish one of their personal memories from the Memories dashboard when that memory belongs to an identity with a provider workspace. The owner can still forget the published memory, while shared workspace knowledge remains view-only.
Memory model
A memory has two separate concerns:
subjectTypeandsubjectKeydescribe who or what it is about.scopeandscopeKeydescribe who may recall it.Explicit memory review now returns both
kindandtarget, which allows an expiring availability fact to beknowledgeabout the current actor. Runtime keeps preferences actor-scoped and procedures conversation-scoped even if model review returns a conflicting target, so the model never controls identity keys or bypasses those ownership rules.Publishing changes only the audience. Canonical content, provenance, and embeddings remain unchanged while the personal scope moves to the provider workspace scope.
Subject label snapshot
Publishing stores a nullable
subject_labelbeside the structured user subject. This is presentation metadata, not authority and not embedding input. Memory-owned surfaces render canonical content such asOut of office August 10–14asAbout Morgan: Out of office August 10–14when model-visible self-contained text is required.The same snapshot is used by automatic recall, list/search tools, REST responses, and dashboard records. REST preserves canonical
contentand adds a structured usersubject. A public user memory without a label is omitted from model-visible recall and tool output rather than risk misattribution.The tradeoff is deliberate: a later display-name change does not rewrite an existing memory. Expiring status memories make that acceptable for this MVP, and label refresh can be added later if proven necessary.
Ownership and actions
The memory page adds Make Public for publishable personal memories and retains owner-only Forget after publication. Owned public memories continue to say “You asked Junior”; shared public memories retain generic workspace language.
Ownership is also enforced in the low-level archive path. A public user-subject memory can be removed through the chat
removeMemorytool only when its subject matches the current actor. Conversation-subject memory keeps the existing shared-memory behavior.The shared plugin user-page action contract supports POST as well as DELETE, and memory exposes
POST /api/plugins/memory/memories/:id/publish.MVP boundary
subject_labelcolumn requires the included memory migration.Review should start with
personal-store.tsfor publication and dashboard ownership,store.tsfor the low-level archive guard, andsubjects.tsfor the small presentation rule.Coverage includes canonical-content publication, the stored subject label, identity-aware recall/tools/REST/dashboard output, owner and non-owner chat removal, out-of-office agent interpretation, migration metadata, and the Chromium dashboard publish flow. Focused tests, builds, typechecks, formatting, package lint, commit hooks, and the full pre-push suite pass.