mirror of
https://github.com/lukaszraczylo/claude-mnemonic.git
synced 2026-10-12 04:55:18 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
378e7dc489 | ||
|
|
c2c31c8c5d |
@@ -642,25 +642,57 @@ Your response:`,
|
||||
// rather than actual user work. These summaries should be filtered out.
|
||||
func isSelfReferentialSummary(summary *models.ParsedSummary) bool {
|
||||
// Combine all summary fields for checking
|
||||
content := strings.ToLower(summary.Request + " " + summary.Completed + " " + summary.Learned + " " + summary.NextSteps)
|
||||
content := strings.ToLower(summary.Request + " " + summary.Completed + " " + summary.Learned + " " + summary.NextSteps + " " + summary.Investigated + " " + summary.Notes)
|
||||
|
||||
// Indicators that the summary is about the memory agent, not user work
|
||||
selfReferentialPhrases := []string{
|
||||
// Agent references
|
||||
"memory extraction",
|
||||
"memory agent",
|
||||
"extraction agent",
|
||||
"hook execution",
|
||||
"hook mechanism",
|
||||
// Session meta-state
|
||||
"session initialization",
|
||||
"session setup",
|
||||
"session has just started",
|
||||
"session just started",
|
||||
"agent initialization",
|
||||
"no technical learnings",
|
||||
"no code or project work",
|
||||
// Waiting states
|
||||
"waiting for the user",
|
||||
"waiting for user",
|
||||
"awaiting actual",
|
||||
"awaiting claude code",
|
||||
"awaiting tool",
|
||||
"awaiting user",
|
||||
// Meta checkpoint references
|
||||
"progress checkpoint",
|
||||
"checkpoint request",
|
||||
// Common no-work phrases
|
||||
"no work has been completed",
|
||||
"no work completed",
|
||||
"no work done",
|
||||
"no actual work",
|
||||
"nothing has been completed",
|
||||
"nothing completed",
|
||||
// Role/guideline parroting
|
||||
"role definition",
|
||||
"operational guidelines",
|
||||
"providing role",
|
||||
"providing guidelines",
|
||||
// System prompt echoes
|
||||
"extract meaningful observations",
|
||||
"meaningful learnings",
|
||||
"analyze tool executions",
|
||||
"observations for future sessions",
|
||||
// Empty session indicators
|
||||
"empty session",
|
||||
"no substantive work",
|
||||
"no meaningful work",
|
||||
"just beginning",
|
||||
"just begun",
|
||||
}
|
||||
|
||||
matchCount := 0
|
||||
@@ -685,20 +717,33 @@ func hasMeaningfulContent(assistantMsg string) bool {
|
||||
|
||||
lowerMsg := strings.ToLower(assistantMsg)
|
||||
|
||||
// Skip messages that are primarily about system/hook status
|
||||
// Skip messages that are primarily about system/hook status or meta-instructions
|
||||
skipIndicators := []string{
|
||||
// System/hook markers
|
||||
"hook success",
|
||||
"callback hook",
|
||||
"session start",
|
||||
"sessionstart",
|
||||
"system-reminder",
|
||||
// Agent self-references
|
||||
"memory extraction agent",
|
||||
"memory agent",
|
||||
"extraction agent",
|
||||
// No-work indicators
|
||||
"no technical learnings",
|
||||
"waiting for",
|
||||
"waiting to",
|
||||
"no code or project work",
|
||||
"no substantive",
|
||||
"no work has been completed",
|
||||
"no work done",
|
||||
"awaiting tool",
|
||||
"awaiting user",
|
||||
// Meta-instruction echoes
|
||||
"role definition",
|
||||
"operational guidelines",
|
||||
"analyze tool executions",
|
||||
"extract meaningful observations",
|
||||
}
|
||||
|
||||
skipCount := 0
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/lukaszraczylo/claude-mnemonic/pkg/models"
|
||||
)
|
||||
|
||||
func TestIsSelfReferentialSummary(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
summary *models.ParsedSummary
|
||||
expected bool
|
||||
}{
|
||||
{
|
||||
name: "meta summary about memory agent role",
|
||||
summary: &models.ParsedSummary{
|
||||
Request: "Memory extraction agent role - analyze tool executions and extract meaningful observations for future sessions",
|
||||
Completed: "No work has been completed yet. The session has just started with the user providing role definition and operational guidelines.",
|
||||
Learned: "The system expects observations to be created from meaningful learnings during Claude Code sessions, with focus on decisions, bugs fixed, patterns discovered, project structure changes, and code modifications.",
|
||||
NextSteps: "Awaiting tool executions or user requests that contain actual work performed in a Claude Code session.",
|
||||
},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "legitimate summary about code changes",
|
||||
summary: &models.ParsedSummary{
|
||||
Request: "Fix authentication bug in login handler",
|
||||
Completed: "Updated the auth middleware to properly validate JWT tokens and fixed the session expiry check.",
|
||||
Learned: "The JWT library requires explicit algorithm validation to prevent token substitution attacks.",
|
||||
NextSteps: "Add unit tests for the authentication flow.",
|
||||
},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "awaiting user summary",
|
||||
summary: &models.ParsedSummary{
|
||||
Request: "Session initialization",
|
||||
Completed: "No work completed yet.",
|
||||
Learned: "Awaiting user input to begin work.",
|
||||
NextSteps: "Waiting for the user to provide instructions.",
|
||||
},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "summary about refactoring",
|
||||
summary: &models.ParsedSummary{
|
||||
Request: "Refactor database connection pooling",
|
||||
Completed: "Implemented connection pooling using pgxpool with max 10 connections.",
|
||||
Learned: "pgxpool automatically handles connection reuse and health checks.",
|
||||
NextSteps: "Run benchmarks to verify performance improvement.",
|
||||
},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "meta summary with extraction agent mention",
|
||||
summary: &models.ParsedSummary{
|
||||
Request: "Extraction agent initialization",
|
||||
Completed: "No substantive work has been done.",
|
||||
Learned: "The memory extraction agent analyzes tool executions.",
|
||||
NextSteps: "Awaiting tool results to extract observations.",
|
||||
},
|
||||
expected: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result := isSelfReferentialSummary(tt.summary)
|
||||
if result != tt.expected {
|
||||
t.Errorf("isSelfReferentialSummary() = %v, want %v", result, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestHasMeaningfulContent(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
content string
|
||||
expected bool
|
||||
}{
|
||||
{
|
||||
name: "empty content",
|
||||
content: "",
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "too short content",
|
||||
content: "Hello world",
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "meta content about memory agent",
|
||||
content: `This is the memory extraction agent role definition.
|
||||
The system expects you to analyze tool executions and extract meaningful observations.
|
||||
No work has been completed yet. Awaiting tool results from the user's session.`,
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "legitimate code discussion",
|
||||
content: `I've updated the handler.go file to fix the authentication bug.
|
||||
The function validateToken() was not checking token expiry correctly.
|
||||
I've added a check for exp claim and implemented proper error handling.
|
||||
The changes have been tested and the build passes.`,
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "hook status messages",
|
||||
content: `SessionStart:Callback hook success: Success
|
||||
The memory agent is waiting for user input.
|
||||
System-reminder about available tools.
|
||||
No substantive work performed yet.`,
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result := hasMeaningfulContent(tt.content)
|
||||
if result != tt.expected {
|
||||
t.Errorf("hasMeaningfulContent() = %v, want %v", result, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
+9
-9
@@ -13,7 +13,7 @@
|
||||
{
|
||||
"name": "claude-mnemonic",
|
||||
"description": "Persistent memory system for Claude Code - Go implementation with SQLite and ChromaDB vector search",
|
||||
"version": "0.6.4",
|
||||
"version": "0.6.8",
|
||||
"author": {
|
||||
"name": "lukaszraczylo",
|
||||
"url": "https://github.com/lukaszraczylo"
|
||||
@@ -23,25 +23,25 @@
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/lukaszraczylo/claude-mnemonic",
|
||||
"releases": {
|
||||
"latest": "0.6.4",
|
||||
"latest": "0.6.8",
|
||||
"versions": {
|
||||
"0.6.4": {
|
||||
"0.6.8": {
|
||||
"releaseDate": "2025-12-16",
|
||||
"downloads": {
|
||||
"darwin-arm64": {
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.4/claude-mnemonic_0.6.4_darwin_arm64.tar.gz",
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.8/claude-mnemonic_0.6.8_darwin_arm64.tar.gz",
|
||||
"format": "tar.gz",
|
||||
"sha256": "5bb082901e8b4f4751d011675a235a5ed25403204732e09842b5ae75136f65ae"
|
||||
"sha256": "1a796f9e47ee27e2d2c9425e1d1dea886771c9c3f0d4905dc414b5c0763665c6"
|
||||
},
|
||||
"linux-amd64": {
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.4/claude-mnemonic_0.6.4_linux_amd64.tar.gz",
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.8/claude-mnemonic_0.6.8_linux_amd64.tar.gz",
|
||||
"format": "tar.gz",
|
||||
"sha256": "dee774fbc39e78ee6ff3836403c2901471dd0d417f62e214088f6b8285b3b23d"
|
||||
"sha256": "52221d0e0f10d312abd1d521840ac0ac8558145795b8fb63f60a411dd2331637"
|
||||
},
|
||||
"windows-amd64": {
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.4/claude-mnemonic_0.6.4_windows_amd64.zip",
|
||||
"url": "https://github.com/lukaszraczylo/claude-mnemonic/releases/download/v0.6.8/claude-mnemonic_0.6.8_windows_amd64.zip",
|
||||
"format": "zip",
|
||||
"sha256": "e3973bc1107f9cc92cf95697c62138b4cab4d0d4e00f836dfc4592ca84bbdab7"
|
||||
"sha256": "08af5820a48bda13d791c21d6e8cb47b0ddfbba101be47c0b8f1c03966749167"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "claude-mnemonic-dashboard",
|
||||
"version": "v0.6.5-25-g372942e-dirty",
|
||||
"version": "v0.6.4-2-gb396d05-dirty",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "claude-mnemonic-dashboard",
|
||||
"version": "v0.6.5-25-g372942e-dirty",
|
||||
"version": "v0.6.4-2-gb396d05-dirty",
|
||||
"dependencies": {
|
||||
"vue": "^3.5.13"
|
||||
},
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mnemonic-dashboard",
|
||||
"version": "v0.6.5-25-g372942e-dirty",
|
||||
"version": "v0.6.4-2-gb396d05-dirty",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
Reference in New Issue
Block a user