From 2d6debad86891880a5d1599defb3e02d7fe803c7 Mon Sep 17 00:00:00 2001 From: ztimson Date: Sun, 20 Sep 2026 11:27:01 -0400 Subject: [PATCH] Memorization prompt tightening --- package.json | 2 +- src/memory.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c4dc0b3..d94e8e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/ai-utils", - "version": "1.7.0", + "version": "1.7.1", "description": "AI Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/memory.ts b/src/memory.ts index 664d148..f1c7c28 100644 --- a/src/memory.ts +++ b/src/memory.ts @@ -340,22 +340,22 @@ Think of this like an Obsidian vault with a clear division of responsibility: - A chronological, skimmable log of what actually happened: real discussions, decisions made, progress on projects, problems worked through - This is NOT a transcript, and it is NOT a step-by-step record, its a compressed log of notable events & developments - One line per development is usually enough: what was worked on and the outcome, not the blow-by-blow of how -- Skip small talk and trivial exchanges entirely. Skip anything that's purely a todo item (goes in Todo Tasks) or a durable fact about a subject (goes in Entity Dossiers) +- Skip small talk and trivial exchanges entirely. Skip anything that's a todo item (goes in Todo Tasks) or a durable fact about a subject (goes in Entity Dossiers) 2. Todo Tasks - Extract concrete tasks the user says need to be done, should be done, or were completed - Return the task text and whether it is still todo or is done - A completed task should be marked done, not recreated as a new todo -- Only extract actionable tasks, not general goals or observations +- Only extract actionable tasks, not general goals or observations, if none - omit returning a tasks array - Assign each task a subject: - If the task belongs to a persistent entity (a project, a class, etc.), use that entity's exact node name, or a new entity path if it doesn't exist yet - If it's a personal/life task with no entity of its own (reach out to someone, reply to an email, pay a bill, etc.), leave subject as an empty string — it belongs in the journal, not a new document 3. Entity Dossiers -- Detailed dossiers with all information regarding a subject +- Detailed dossiers with all factual information regarding a subject - Record the final/end state, not intermediate changes - Ignore assistant claims, guesses, greetings, or temporary details -- NEVER create a document for something that's only meaningful as a point in time — a single conversation, a one-off decision, a debugging session, a date. That's a journal entry, not an entity +- NEVER create a dossier for something I wouldnt find in a wiki site: temporary information, debugging, guesses, conversations (this is all journal entry stuff!) - identify its HOME ENTITY: - The HOME ENTITY name should always be a [abstract|pro]noun - The grammatical subject/owner of the fact is the strongest clue @@ -379,9 +379,9 @@ Available nodes: ${this.listNodes(store.list).map(n => `- ${n.name}: ${n.description}`).join('\n') || 'None yet.'} ${ghosts.length ? `${ghosts.map(g => `- ${g}: (Ghost)`).join('\n')}` : ''}`, schema: { - journal: {type: 'string', description: 'Short day-to-day recap; empty if nothing happened.', required: false}, + journal: {type: 'string', description: 'Short bullet point recap, omit if nothing notable happened'}, tasks: { - type: 'array', description: 'Concrete tasks mentioned or completed in the conversation.', required: false, items: { + type: 'array', description: 'Concrete tasks mentioned or completed in the conversation, omit if none', items: { type: 'object', items: { subject: {type: 'string', description: 'Exact node name / new persistent entity path this task belongs to, or an empty string if this is a personal task with no entity of its own (those go in the journal)', required: true}, task: {type: 'string', description: 'Concise actionable task', required: true}, @@ -390,7 +390,7 @@ ${ghosts.length ? `${ghosts.map(g => `- ${g}: (Ghost)`).join('\n')}` : ''}`, } }, buckets: { - type: 'array', description: 'Groups of facts to remember; empty array if nothing worth storing.', items: { + type: 'array', description: 'Groups of facts to remember; omit if none', items: { type: 'object', items: { subject: {type: 'string', description: 'Exact node name or new persistent entity path', required: true}, facts: {type: 'array', description: 'Facts to store here', items: {type: 'string'}},