Persona Schema v.01.
The first public schema for gosum personas, including the autobiographical memory layer: the persona that remembers you.
§ 01What v.01 contains
Included in v.01
memoryblock at the top level of the persona document.memoryPolicyblock defining retention, decay, redaction, and privacy semantics.- Memory atom type with structured representation (gist, details, salience, valence, privacy class).
- Two validation passes: structural (JSON Schema) and policy-coherence (SHACL).
- Redaction semantics: how individual memories can be removed without breaking persona coherence.
- Memory rendering rules: how memory atoms are surfaced to the LLM at inference time.
Held outside the baseline
- Unbounded drift in trait, style, or affect atoms. v.01 baselines remain governed and explicit.
- Automatic affect decay outside the declared memory policy.
- Composition operators that override consent, provenance, or signing rules.
- Automatic defining-event detection without editorial review.
- Cross-deployment memory transfer. (Out of scope. Possibly never.)
The discipline of v.01 is to ship one thing well: memory that accumulates, decays, brightens, and respects privacy.
§ 02The memory atom
A single memory atom captures one episode, fact, or skill remembered by the persona. The structure is designed for asymmetric salience and partial reconstruction at recall.
Schema definition
{ "id": "mem:7f3a8b2c0d3e", "kind": "episodic", "createdAt": "2026-04-22T14:18:42Z", "lastRehearsedAt": "2026-04-29T10:02:11Z", "rehearsalCount": 3, "gist": "A returning guest recognized me by name and thanked me for last week's restaurant suggestion.", "details": [ { "content": "she was wearing a blue scarf", "brightness": 0.40 }, { "content": "it was raining outside", "brightness": 0.20 }, { "content": "she said the seafood was excellent", "brightness": 0.85 } ], "salience": 0.74, "emotionalValence": 0.62, "decayProfile": { "function": "ebbinghaus", "halfLifeDays": 14, "rehearsalBoost": 1.4, "valenceProtection": 0.3 }, "privacyClass": "guest-pii", "consentBasis": "service-delivery", "redactionStatus": "active", "provenance": { "sessionId": "sess:bonvoy-2026-04-22-uuid", "turnIndex": 7, "deploymentDid": "did:gosum:marriott:property-cluj-001" }, "tags": ["returning-guest", "positive-feedback", "restaurant-recommendation"] }
Field specification
| field | type | required | validation |
|---|---|---|---|
| id | string | yes | Format: mem: followed by 12 hex chars. Globally unique within the deployment. |
| kind | enum | yes | episodic (a remembered event) | semantic (a derived fact) | procedural (a learned how-to). |
| createdAt | ISO 8601 | yes | When the memory was first formed. |
| lastRehearsedAt | ISO 8601 | yes | Last time the memory was retrieved or re-encoded. Initialised equal to createdAt. |
| rehearsalCount | int ≥ 0 | yes | Number of times rehearsed. Each rehearsal updates lastRehearsedAt and may boost salience. |
| gist | string | yes | The single-sentence summary. The "always retrievable" core. Max 280 chars. |
| details | array | yes | Zero or more details with independent brightness. May be empty for highly compressed memories. |
| details[].content | string | yes | The detail itself. Max 200 chars. |
| details[].brightness | float [0,1] | yes | How vivid the detail currently is. Decays independently of gist. Below 0.1, detail is not rendered. |
| salience | float [0,1] | yes | How important this memory is. Drives retrieval ranking. |
| emotionalValence | float [-1,1] | yes | Negative = aversive, zero = neutral, positive = cherished. Affects decay (cherished memories fade slower). |
| decayProfile | object | yes | How this memory ages. See § 03. |
| privacyClass | enum | yes | See § 04. |
| consentBasis | string | yes | The legal basis under which this memory is retained. GDPR-aligned. |
| redactionStatus | enum | yes | active | redacted | pending-deletion. See § 05. |
| provenance | object | yes | Where this memory came from. Required for audit. |
| tags | array<string> | optional | Free-form labels for retrieval. Indexed but not validated. |
§ 03The decay profile
Memory atoms are not static. They decay, brighten, and reconstruct. The decayProfile block specifies how.
Schema
{ "function": "ebbinghaus", "halfLifeDays": 14, "rehearsalBoost": 1.4, "valenceProtection": 0.3, "minimumSalience": 0.05, "detailDecayRate": 1.5 }
Decay function
The default decay function follows the Ebbinghaus forgetting curve, modulated by rehearsal:
salience(t) = baseline_salience
* (rehearsalBoost ^ rehearsalCount)
* exp(-decayRate * t / halfLife)
+ valenceProtection * |emotionalValence|
Where:
baseline_salienceis the salience at the time of last rehearsal.rehearsalBooststrengthens memories that are recalled (testing effect, cognitive psychology).decayRate = ln(2)for half-life semantics.valenceProtection * |emotionalValence|is a floor: emotionally charged memories don't decay past this threshold.
If salience falls below minimumSalience, the memory is eligible for archival (moved out of active retrieval but retained for audit, or, after retention period, deleted).
Detail decay
Details decay faster than gist. A memory's gist persists; its details fade. This is empirically how human memory works (Conway, 2009).
detail.brightness(t) = detail.brightness_initial
* exp(-detailDecayRate * decayRate * t / halfLife)
When a detail's brightness falls below 0.1, the runtime does not include it in the rendered memory at inference time. The detail remains in the memory atom for audit purposes but is functionally invisible.
Rehearsal
A rehearsal event occurs when:
- The runtime retrieves this memory to inject into a conversation.
- The user explicitly references content matching this memory's gist or tags.
- A scheduled review (cognitive analogue: spaced repetition) brings the memory forward.
On rehearsal:
rehearsalCountincrements.lastRehearsedAtupdates to now.salienceis boosted per therehearsalBoostparameter.- Brightness of referenced details may rise; brightness of unreferenced details continues to decay.
This produces a realistic effect: well-rehearsed memories stay vivid; details that are never spoken of fade even within otherwise-strong memories.
§ 04Privacy class and consent basis
Memory atoms carry privacy classification as a first-class field. This is what makes the memory layer GDPR-safe by construction.
Privacy classes
| class | description | default retention |
|---|---|---|
| non-pii | No personally identifying information. E.g. "the property has a strong coffee program." | Indefinite |
| aggregate | Derived from many interactions, no individual traceable. E.g. "guests often ask about parking." | Indefinite |
| guest-pii | Identifiable to a specific user. Names, preferences, recognisable details. | Per consent basis |
| staff-pii | Identifiable to a staff member. | Per HR policy |
| sensitive-pii | Health, religious, sexual, political, biometric. Article 9 GDPR. | Strictly per consent, often forbidden |
| commercial-confidential | Pricing, contract terms, internal procedures. | Per commercial agreement |
Consent basis
For any class containing PII, a consentBasis string is required. Valid bases include:
service-delivery— necessary to provide the service the user requested (Art. 6(1)(b) GDPR).legitimate-interest— operator has documented a legitimate interest balancing assessment.explicit-consent— the user has affirmatively consented.legal-obligation— required by applicable law (e.g. fraud prevention).not-applicable— for non-pii memories.
The runtime must refuse to create a memory with a privacy class implying PII but consentBasis: not-applicable.
Sensitive-PII handling
sensitive-pii requires strict treatment. Default policy is to not create such memories at all. If the persona's safetyTier and complianceProfiles permit, only explicit-consent is a valid basis. All sensitive-pii memories are flagged for retention review at half their nominal half-life. Brand legal can audit sensitive-pii counts at any time.
§ 05Redaction semantics
The persona's memory must be redactable without breaking the persona's coherence. This is the hardest engineering problem in the v.01 schema and the most important one for legal compliance.
Redaction modes
| mode | what happens | when used |
|---|---|---|
| soft-redact | Memory atom remains; redactionStatus: redacted; runtime skips it during retrieval. | User asks for a specific topic to be forgotten. Reversible. |
| hard-redact | Memory atom is replaced with a tombstone (id, timestamp, redaction reason). Original content destroyed. | User invokes right to be forgotten. Irreversible. |
| archive | Memory atom is moved to cold storage with full content; not retrievable for inference; retained for legal audit only. | Memory aged below minimumSalience. |
| delete | Memory atom is permanently destroyed, no tombstone. | Retention period elapsed and no audit obligation. |
The coherence problem
When a memory is redacted, two coherence risks arise:
Risk A — Aggregate disposition derived from the redacted memory remains. If the persona has, over many interactions with one guest, adapted to handle a particular kind of request more efficiently, redacting the underlying memories must also remove any derived disposition unless it can be justified independently.
Risk B — Other memories reference the redacted one. "The guest who returned last week" loses meaning if the original encounter is hard-redacted. The runtime must handle this gracefully.
Coherence handling rules in v.01
For v.01, the coherence rule is conservative:
- When a memory is hard-redacted, all other memories that reference it (by
tagsmatching, byprovenance.sessionIdmatching, or by gist textual similarity above threshold) are flagged for review. - Reviewed memories are either re-anonymised (specific references replaced with generic "a guest") or also redacted.
- The runtime must never surface a memory that contains a dangling reference to a hard-redacted one.
The right-to-be-forgotten flow
When a user invokes their GDPR right to be forgotten:
- Receipt is logged in the audit stream.
- All memory atoms with
provenance.sessionIdmatching the user's known sessions, or with content textually matching the user's identifiers, are gathered. - A redaction batch is created and signed by an authorised operator.
- Memories are hard-redacted (content destroyed, tombstones retained).
- Aggregate or semantic memories that may have been derived from the redacted episodics are flagged for review.
- Confirmation is returned to the user with a list of redaction event IDs.
- Tombstones are retained for the period required by audit law (typically 6 years in EU), then permanently deleted.
This flow must be testable. Validation includes a synthetic right-to-be-forgotten test: insert known PII, request deletion, verify no surface to inference, verify audit trail.
§ 06Memory rendering at inference time
At each conversation turn, the runtime selects a subset of memory atoms to inject into the LLM context. This selection is governed by a renderer.
The renderer pipeline
1. CANDIDATE SELECTION Filter memory atoms where: redactionStatus == "active" AND salience >= minimumSalience AND decay(memory, now) >= retrievalThreshold 2. RANKING Score candidates by: score = w1 * salience(now) + w2 * relevance(memory, current_conversation) + w3 * recency(memory, now) + w4 * topical_match(memory.tags, current_topic) 3. BUDGETING Take top-K candidates where K is determined by: - persona.bindings.runtimeConfig.contextWindowTokens - max-memories-per-turn from memoryPolicy - rehearsal cooldown (don't render the same memory twice in a session) 4. RECONSTRUCTION For each selected memory: - Always include gist - Include details where details[].brightness >= 0.1 - Mark memory with confidence indicator if salience < 0.4 5. RENDERING TO PROMPT Inject selected memories into the system prompt under a clearly delimited "What you remember" section. 6. REHEARSAL UPDATE Each rendered memory has its rehearsalCount incremented and lastRehearsedAt updated.
Rendering format
The injected memory section in the system prompt:
## What you remember (about this guest, this property, your work) You may reference these memories naturally in conversation. Some are vivid; others are fragmentary. Where a memory is uncertain, hedge accordingly. [mem:7f3a8b...] (vivid) A returning guest recognised me by name and thanked me for last week's restaurant suggestion. She said the seafood was excellent. [mem:c20a91...] (faint) A guest mentioned needing a quiet workspace, but I don't recall the details. [mem:b41e08...] (recent, vivid) A child asked me what my favourite colour was. I told them it was the colour of the lobby's morning light.
The "vivid / faint / recent" markers help the LLM hedge appropriately. A faint memory recalled with overconfidence breaks the illusion.
Confabulation policy
The persona may, when asked about something at the edge of its memory, partially confabulate — but only with explicit hedging. The schema's memoryPolicy.confabulationPolicy governs this:
strict: never confabulate. If memory is faint, say "I don't quite remember."moderate: confabulate plausible details from gist with hedging ("I think it was raining, but I might be misremembering").permissive: not allowed in v.01. Reserved for future entertainment-context personas.
For brand-deployed personas, strict is the default. moderate is allowed for hospitality and entertainment, never for healthcare or financial services.
§ 07The memoryPolicy block
A new top-level block in the persona document that governs memory behaviour.
{ "memoryPolicy": { "enabled": true, "scope": "deployment", "maxAtoms": 50000, "maxMemoriesPerTurn": 5, "rehearsalCooldownTurns": 4, "retrievalThreshold": 0.15, "confabulationPolicy": "strict", "creationPolicy": { "minSalienceForCreation": 0.25, "salienceClassifier": "gosum-default-v.01", "salienceClassifierVersion": "v.01" }, "retentionPolicy": { "defaultRetentionDays": 365, "perPrivacyClass": { "non-pii": null, "aggregate": null, "guest-pii": 90, "staff-pii": 365, "sensitive-pii": 30, "commercial-confidential": 1095 } }, "rightToBeForgottenSla": { "acknowledgmentHours": 24, "completionHours": 720, "tombstoneRetentionDays": 2190 }, "auditPolicy": { "logCreation": true, "logRetrieval": "sampled", "logRedaction": "always", "logRehearsal": "sampled" } } }
Field notes
scope: deployment— memories are scoped to a single deployment instance, not shared across deployments. Cross-deployment memory is out of scope for v.01.maxAtoms— hard ceiling to prevent unbounded growth. When approached, archival of low-salience memories is triggered.confabulationPolicy: strictis the safe default; pilots may negotiatemoderateper vertical.
§ 08Validation
v.01 defines the validation passes needed for a memory-aware persona.
Memory schema coherence
Every memory atom must validate against the structural JSON schema. Specifically:
idformat check.salience,emotionalValence, allbrightnessvalues in correct ranges.detailsarray structurally valid.provenancecomplete.
Memory policy coherence
Memory atoms must satisfy the persona's memoryPolicy:
- No memory exists without a valid
consentBasismatching itsprivacyClass. - No
sensitive-piimemories exist withconsentBasis ≠ explicit-consent. - No memory exceeds the per-class retention period.
- Total memory count ≤
maxAtoms.
Reference integrity
Memory atoms must not reference redacted memories. Tags and gists are scanned for orphan references (memories pointing to ids of hard-redacted memories). Failure surfaces as a fixable warning, not a blocker.
§ 09CLI extensions
The gosum CLI grows three commands.
gosum memory list [--privacy-class CLASS] [--min-salience N] # List memories in the persona's deployment. gosum memory inspect MEM_ID # Show full content, decay status, rehearsal history. gosum memory redact MEM_ID --reason TEXT [--mode soft|hard|archive] # Redact a specific memory. Logged as a signed event. gosum memory redact-user USER_ID --reason "right-to-be-forgotten" # Bulk redaction for GDPR right to be forgotten flow. gosum memory audit [--from DATE] [--to DATE] # Generate a memory audit report for the period.
§ 10Adoption notes
Deployments can adopt v.01 gradually:
- Add an empty
memory: []array at the top level. - Add a
memoryPolicyblock. For backward-compatible behaviour, setmemoryPolicy.enabled: false. - Set the persona's
identity.versiontov.01. - Re-sign.
When ready to enable memory, set memoryPolicy.enabled: true, configure retention and creation policies, re-sign. Memory begins accumulating from that signing event forward.
https://gosum.eu/Schema