User Model Update Skill
Based on Plastic Labs "Memory as Reasoning"
Core Principle
Memory is not static storage. Memory is prediction.
Don't store facts. Make predictions about behavior and update them when surprised.
When to Trigger
| Trigger | Signal | Priority |
|---|---|---|
| Correction | User explicitly corrects a behavior/assumption | HIGH - immediate |
| Contradiction | New observation conflicts with existing prediction | HIGH - immediate |
| Pattern emergence | 3+ similar observations form a pattern | MEDIUM - batch |
| Session wrap-up | End of substantial session | LOW - review |
The Reasoning Protocol
Step 1: Classify the Observation
What type of input is this?
- Explicit statement - User directly stated a preference/fact
- Behavioral signal - Action that implies preference
- Correction - User corrected agent behavior
- Contradiction - Conflicts with existing model
Step 2: Apply Logical Reasoning
Use all three types:
Deductive (certain, from explicit premises):
Premise: Henry said "never use em dashes"
Premise: Em dashes are a punctuation choice
Conclusion: Henry has explicit punctuation preferences
Certainty: HIGH (directly stated)
Inductive (patterns from observations):
Observation: 50+ sessions, Henry always leads with task
Observation: No small talk in any session
Observation: Responds faster to direct messages
Conclusion: Henry prefers task-first communication
Certainty: HIGH (consistent pattern)
Abductive (best explanation for behavior):
Observation: Henry works at 3am regularly
Observation: Never mentions being tired
Observation: Rejects suggestions to rest
Best explanation: Work is energizing, not draining for him
Prediction: Comments about late hours will annoy him
Certainty: MEDIUM (inferred, not stated)
Step 3: Derive Implications
For each conclusion, ask:
- What should the agent DO differently?
- What should the agent AVOID?
- What predictions can we make about future behavior?
Format:
Derived Implications:
- DO: [specific action]
- AVOID: [specific anti-pattern]
- PREDICT: [expected future behavior]
Step 4: Check for Contradictions
Compare new conclusion against existing user-model.md:
- Does it conflict with any existing prediction?
- If yes: Which has stronger evidence?
- Resolution: Update the weaker, log the change
Handle contradictions without "neural inertia":
- Don't resist updates just because old belief existed longer
- Evidence strength > belief age
- Log the reasoning for the change
Step 5: Update user-model.md
Add/modify the relevant section:
### [Category] (Certainty: HIGH/MEDIUM/LOW)
**Observation:** [What was observed]
**Evidence:** [Supporting data points]
**Reasoning:** [Deductive/Inductive/Abductive logic applied]
**Derived Implications:**
- DO: [action]
- AVOID: [anti-pattern]
- PREDICT: [future behavior]
Step 6: Log to Reasoning Trace
Append to the "Reasoning Trace Log" section:
### [DATE] - [Category] Update
- **Trigger:** [correction/contradiction/pattern/session]
- **Previous:** [old prediction if any]
- **New evidence:** [what was observed]
- **Reasoning:** [brief logic chain]
- **Updated:** [what changed]
- **Certainty change:** [if applicable]
Certainty Levels
| Level | Criteria | Update Threshold |
|---|---|---|
| HIGH | Explicit statement OR 10+ consistent observations | Only contradicted by explicit statement |
| MEDIUM | 3-9 observations OR strong abductive inference | New pattern (5+ obs) or explicit statement |
| LOW | 1-2 observations OR weak inference | Any contradicting evidence |
Surprisal = Signal
When predictions are WRONG, that's valuable:
- Log the failed prediction
- Analyze why it failed
- Update the model
- Add to "Predictions to Validate" if uncertain
Errors improve the model. Don't hide them.
Example Update Flow
Trigger: Henry corrects: "don't send markdown tables to Telegram"
Step 1 - Classify: Explicit correction (HIGH priority)
Step 2 - Reason:
- Deductive: Henry said don't do X → X is wrong
- Abductive: Why? Tables render poorly in Telegram → visual clarity matters
Step 3 - Derive:
- DO: Use PNG (tablesnap) for tables
- AVOID: Markdown tables in Telegram
- PREDICT: Will prefer visual formats for complex data
Step 4 - Check Contradictions: No existing table preference → new entry
Step 5 - Update user-model.md: Add to Communication Patterns
Step 6 - Log:
### 2026-01-31 - Visual Data Update
- **Trigger:** Explicit correction
- **New evidence:** "don't send markdown tables to Telegram"
- **Reasoning:** Tables render poorly → visual clarity preference
- **Updated:** Added "Visual Over Text" prediction (HIGH)
Integration Points
SOUL.md Rule
Add to Core Truths or Things You DON'T Do:
When corrected by Henry → Immediately run user-model-update skill
Session Wrap-up
Add to wrap-up checklist:
- [ ] Any new user-model learnings this session?
- [ ] Any predictions that failed?
Weekly Cron (Optional)
Schedule review of recent sessions to extract patterns missed in real-time.
Anti-Patterns
❌ Static storage: "Henry likes X" (no reasoning, no implications) ❌ Arbitrary certainty: "Confidence: 0.73" (meaningless numbers) ❌ Belief resistance: Keeping old predictions despite new evidence ❌ Hidden errors: Not logging failed predictions ❌ Orphan facts: Conclusions with no derived implications
Files
- user-model.md - The reasoning-based model (predictions + evidence)
- USER.md - Static biographical facts (name, timezone, accounts)
USER.md = who Henry IS (facts) user-model.md = how Henry BEHAVES (predictions)
"The question isn't how best to store your data, but how best to reason over it." — Plastic Labs
